## Python SDK Changes:

* `open_router.embeddings.list_models()`:  `response.data.[].reasoning` **Added**
* `open_router.models.get()`:  `response.data.reasoning` **Added**
* `open_router.models.list()`:  `response.data.[].reasoning` **Added**
* `open_router.models.list_for_user()`:  `response.data.[].reasoning` **Added**
This commit is contained in:
speakeasybot
2026-06-18 01:00:24 +00:00
parent b0eda78d3f
commit 15ce4685f3
12 changed files with 228 additions and 32 deletions
+2 -2
View File
@@ -3,10 +3,10 @@
import importlib.metadata
__title__: str = "openrouter"
__version__: str = "0.10.0"
__version__: str = "0.10.1"
__openapi_doc_version__: str = "1.0.0"
__gen_version__: str = "2.788.4"
__user_agent__: str = "speakeasy-sdk/python 0.10.0 2.788.4 1.0.0 openrouter"
__user_agent__: str = "speakeasy-sdk/python 0.10.1 2.788.4 1.0.0 openrouter"
try:
if __package__ is not None:
+7
View File
@@ -1436,6 +1436,7 @@ if TYPE_CHECKING:
from .modelbenchmarks import ModelBenchmarks, ModelBenchmarksTypedDict
from .modelgroup import ModelGroup
from .modellinks import ModelLinks, ModelLinksTypedDict
from .modelreasoning import DefaultEffort, ModelReasoning, ModelReasoningTypedDict
from .modelresponse import ModelResponse, ModelResponseTypedDict
from .modelscountresponse import (
ModelsCountResponse,
@@ -3076,6 +3077,7 @@ __all__ = [
"DatetimeServerToolConfigTypedDict",
"DatetimeServerToolType",
"DatetimeServerToolTypedDict",
"DefaultEffort",
"DefaultParameters",
"DefaultParametersTypedDict",
"DeleteBYOKKeyResponse",
@@ -3518,6 +3520,8 @@ __all__ = [
"ModelGroup",
"ModelLinks",
"ModelLinksTypedDict",
"ModelReasoning",
"ModelReasoningTypedDict",
"ModelResponse",
"ModelResponseTypedDict",
"ModelTypedDict",
@@ -5459,6 +5463,9 @@ _dynamic_imports: dict[str, str] = {
"ModelGroup": ".modelgroup",
"ModelLinks": ".modellinks",
"ModelLinksTypedDict": ".modellinks",
"DefaultEffort": ".modelreasoning",
"ModelReasoning": ".modelreasoning",
"ModelReasoningTypedDict": ".modelreasoning",
"ModelResponse": ".modelresponse",
"ModelResponseTypedDict": ".modelresponse",
"ModelsCountResponse": ".modelscountresponse",
+7
View File
@@ -5,6 +5,7 @@ from .defaultparameters import DefaultParameters, DefaultParametersTypedDict
from .modelarchitecture import ModelArchitecture, ModelArchitectureTypedDict
from .modelbenchmarks import ModelBenchmarks, ModelBenchmarksTypedDict
from .modellinks import ModelLinks, ModelLinksTypedDict
from .modelreasoning import ModelReasoning, ModelReasoningTypedDict
from .parameter import Parameter
from .perrequestlimits import PerRequestLimits, PerRequestLimitsTypedDict
from .publicpricing import PublicPricing, PublicPricingTypedDict
@@ -62,6 +63,8 @@ class ModelTypedDict(TypedDict):
r"""Hugging Face model identifier, if applicable"""
knowledge_cutoff: NotRequired[Nullable[str]]
r"""The date up to which the model was trained on data. ISO 8601 date string (YYYY-MM-DD) or null if unknown."""
reasoning: NotRequired[ModelReasoningTypedDict]
r"""Reasoning effort configuration. Omitted for non-reasoning models and dynamic router models."""
class Model(BaseModel):
@@ -123,6 +126,9 @@ class Model(BaseModel):
knowledge_cutoff: OptionalNullable[str] = UNSET
r"""The date up to which the model was trained on data. ISO 8601 date string (YYYY-MM-DD) or null if unknown."""
reasoning: Optional[ModelReasoning] = None
r"""Reasoning effort configuration. Omitted for non-reasoning models and dynamic router models."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = [
@@ -131,6 +137,7 @@ class Model(BaseModel):
"expiration_date",
"hugging_face_id",
"knowledge_cutoff",
"reasoning",
]
nullable_fields = [
"context_length",
+106
View File
@@ -0,0 +1,106 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .reasoningeffort import ReasoningEffort
from openrouter.types import (
BaseModel,
Nullable,
OptionalNullable,
UNSET,
UNSET_SENTINEL,
UnrecognizedStr,
)
from openrouter.utils import validate_open_enum
from pydantic import model_serializer
from pydantic.functional_validators import PlainValidator
from typing import List, Literal, Optional, Union
from typing_extensions import Annotated, NotRequired, TypedDict
DefaultEffort = Union[
Literal[
"xhigh",
"high",
"medium",
"low",
"minimal",
"none",
],
UnrecognizedStr,
]
r"""Default reasoning effort when the client enables reasoning without specifying effort. Maps to `reasoning.effort` in chat requests. When `\"none\"`, prefer omitting effort unless the user explicitly disables reasoning."""
class ModelReasoningTypedDict(TypedDict):
r"""Reasoning effort configuration. Omitted for non-reasoning models and dynamic router models."""
mandatory: bool
r"""When true, reasoning cannot be disabled and effort \"none\" is rejected."""
default_effort: NotRequired[Nullable[DefaultEffort]]
default_enabled: NotRequired[bool]
r"""Default reasoning enabled state when the client does not set `reasoning.enabled`."""
supported_efforts: NotRequired[Nullable[List[Nullable[ReasoningEffort]]]]
r"""Allowed reasoning effort values for this model, in descending effort order (highest first). Null means no allowlist — all gateway effort values are accepted."""
supports_max_tokens: NotRequired[bool]
r"""Present and `true` when the model accepts `reasoning.max_tokens` in requests (Anthropic-style) instead of or in addition to `reasoning.effort`. Omitted otherwise."""
class ModelReasoning(BaseModel):
r"""Reasoning effort configuration. Omitted for non-reasoning models and dynamic router models."""
mandatory: bool
r"""When true, reasoning cannot be disabled and effort \"none\" is rejected."""
default_effort: Annotated[
OptionalNullable[DefaultEffort], PlainValidator(validate_open_enum(False))
] = UNSET
default_enabled: Optional[bool] = None
r"""Default reasoning enabled state when the client does not set `reasoning.enabled`."""
supported_efforts: OptionalNullable[
List[
Annotated[
Nullable[ReasoningEffort], PlainValidator(validate_open_enum(False))
]
]
] = UNSET
r"""Allowed reasoning effort values for this model, in descending effort order (highest first). Null means no allowlist — all gateway effort values are accepted."""
supports_max_tokens: Optional[bool] = None
r"""Present and `true` when the model accepts `reasoning.max_tokens` in requests (Anthropic-style) instead of or in addition to `reasoning.effort`. Omitted otherwise."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = [
"default_effort",
"default_enabled",
"supported_efforts",
"supports_max_tokens",
]
nullable_fields = ["default_effort", "supported_efforts"]
null_default_fields = []
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k)
serialized.pop(k, None)
optional_nullable = k in optional_fields and k in nullable_fields
is_set = (
self.__pydantic_fields_set__.intersection({n})
or k in null_default_fields
) # pylint: disable=no-member
if val is not None and val != UNSET_SENTINEL:
m[k] = val
elif val != UNSET_SENTINEL and (
not k in optional_fields or (optional_nullable and is_set)
):
m[k] = val
return m