From 71b99d57147b07f4cdb5ff58ab5f37a51f641ba5 Mon Sep 17 00:00:00 2001 From: speakeasybot Date: Wed, 11 Nov 2026 18:22:15 +0000 Subject: [PATCH 1/2] ## Python SDK Changes: * `open_router.presets.create_presets_chat_completions()`: `request.reasoning` **Changed** --- .speakeasy/gen.lock | 32 +++++++++++++----------- .speakeasy/gen.yaml | 2 +- .speakeasy/out.openapi.yaml | 12 +++++++++ .speakeasy/workflow.lock | 10 ++++---- RELEASES.md | 12 ++++++++- docs/components/chatrequestreasoning.mdx | 4 +++ pyproject.toml | 2 +- src/openrouter/_version.py | 4 +-- src/openrouter/components/chatrequest.py | 28 +++++++++++++++++++-- uv.lock | 2 +- 10 files changed, 80 insertions(+), 28 deletions(-) diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index d2cc2b025..00ac125b8 100644 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,19 +1,19 @@ lockVersion: 2.0.0 id: c48cf606-fb42-4a45-9c23-8f0555307828 management: - docChecksum: 86ff3e3a3ffed902316bd51cc4a16dc5 + docChecksum: a54a9cf16e856c21ea05fd775e19d3b1 docVersion: 1.0.0 speakeasyVersion: 1.803.2 generationVersion: 2.950.13 - releaseVersion: 1.3.159 - configChecksum: 199be605866033ff7c31d297412221c8 + releaseVersion: 1.3.160 + configChecksum: eadfe268c501a725f58717b7e39fd719 repoURL: https://github.com/OpenRouterTeam/python-sdk.git installationURL: https://github.com/OpenRouterTeam/python-sdk.git published: true persistentEdits: - generation_id: 7ac579b8-3140-4d65-a023-7d0b55a886e6 - pristine_commit_hash: ca02163d73657364cbfd5f778cab2823dd187fa3 - pristine_tree_hash: 74f3f7866a8748037a631981b1eb50929cf60d23 + generation_id: 9f94eb68-cf50-44c3-bc20-c7e7456b3d0b + pristine_commit_hash: 21c5277bf41b91518ee56fd59635a344a0906710 + pristine_tree_hash: 87fe8df3a640f253b7102895aaed1ec62813cf97 features: python: acceptHeaders: 3.0.0 @@ -2108,8 +2108,8 @@ trackedFiles: pristine_git_object: e2ecd460775d54a5b43c5bc597f8027424462b8d docs/components/chatrequestreasoning.mdx: id: 8f0176992b3e - last_write_checksum: sha1:3247d0ea825f01d20bea2ecee221e3e6b33cf035 - pristine_git_object: 057e91d78f416d541dd4c3ce4d07125fd06aa8e0 + last_write_checksum: sha1:696e7a5bfc2a59b55fab92f4eebaa48b3d003b88 + pristine_git_object: fe84e8e3bb76ef962484498831090cda17035a20 docs/components/chatrequestreasoningeffort.mdx: id: a8ac4d0f36fd last_write_checksum: sha1:7cf50deaeb4a20ca64352b8713479059834e5f78 @@ -11588,8 +11588,8 @@ trackedFiles: pristine_git_object: 3e38f1a929f7d6b1d6de74604aa87e3d8f010544 pyproject.toml: id: 5d07e7d72637 - last_write_checksum: sha1:506c3b4d6142a13e70804a3ff8580b6bad0dcd0d - pristine_git_object: 2ca34ec6701a99aad53fb7336a3d13f21e1b6b59 + last_write_checksum: sha1:c6561f7cdcd94562e0ad654eea881ea67ca05817 + pristine_git_object: 83dded9bdf63c85bddedd51068f16973d015bb52 scripts/prepare_readme.py: id: e0c5957a6035 last_write_checksum: sha1:77f44b60b98bc126557ec27391f91dfba764bb54 @@ -11616,8 +11616,8 @@ trackedFiles: pristine_git_object: 86713cfea633e09d33b3d4e65281071fe20e6137 src/openrouter/_version.py: id: d8d15ad6c586 - last_write_checksum: sha1:afc4eb5bc1b7a15439ac1d237f84268ae365fa3e - pristine_git_object: 97b884a6aa98a0d6b8599449062eaafdd7d88d67 + last_write_checksum: sha1:864f761d40190f3a37d49aa8e479c93e410fd701 + pristine_git_object: fb55d7245a63d6bae0abd8e856f8d895d0147347 src/openrouter/alpha.py: id: 306c4d93308d last_write_checksum: sha1:80cc0f39649445431cc2247ed0e0765438467766 @@ -12556,8 +12556,8 @@ trackedFiles: pristine_git_object: 8bbde153b53887e426989fd5b0486b6dc1122810 src/openrouter/components/chatrequest.py: id: 5e39eaefa9cf - last_write_checksum: sha1:d087f398d2b3641d52f2225132a1ab1003664633 - pristine_git_object: dc645769129a449efe0390796569f2f5b0140985 + last_write_checksum: sha1:c0190406c6d95f31079e0865aa77a5e42be15c57 + pristine_git_object: 97e9374b3b5e5af361d50aa0c7d1cb44b0be4f51 src/openrouter/components/chatresult.py: id: 9062fe2935fe last_write_checksum: sha1:832ad4df3f9f92818e36e9d26a73da3bcff3eb7a @@ -21577,4 +21577,6 @@ examples: "500": application/json: {"error": {"code": 500, "message": "Internal Server Error"}} examplesVersion: 1.0.2 -releaseNotes: "## Python SDK Changes:\n* `open_router.alpha.decisions.create()`: `request.provider` **Changed**\n* `open_router.alpha.extractions.create()`: `request.provider` **Changed**\n* `open_router.tts.create_speech()`: `request.provider` **Changed**\n* `open_router.stt.create_transcription()`: `request.provider` **Changed**\n* `open_router.batch.create_batches()`: \n * `request.provider.only[].union(ProviderName).enum(speechify)` **Added**\n* `open_router.byok.list()`: \n * `request.provider` **Changed**\n * `response.data[].provider.enum(speechify)` **Added**\n* `open_router.byok.create()`: \n * `request.provider.enum(speechify)` **Added**\n * `response.data.provider.enum(speechify)` **Added**\n* `open_router.byok.get()`: `response.data.provider.enum(speechify)` **Added**\n* `open_router.byok.update()`: `response.data.provider.enum(speechify)` **Added**\n* `open_router.embeddings.generate()`: `request.provider` **Changed**\n* `open_router.endpoints.list_zdr_endpoints()`: `response.data[].provider_name.enum(speechify)` **Added**\n* `open_router.endpoints.list()`: `response.data.endpoints[].provider_name.enum(speechify)` **Added**\n* `open_router.generations.get_generation()`: `response.data.provider_responses[].provider_name.enum(speechify)` **Added**\n* `open_router.presets.create_presets_chat_completions()`: `request.provider` **Changed**\n* `open_router.presets.create_presets_messages()`: `request.provider` **Changed**\n* `open_router.presets.create_presets_responses()`: `request.provider` **Changed**\n* `open_router.rerank.rerank()`: `request.provider` **Changed**\n* `open_router.system_one.create()`: `request.provider` **Changed**\n* `open_router.video_generation.generate()`: `request.provider` **Changed**\n" +releaseNotes: | + ## Python SDK Changes: + * `open_router.presets.create_presets_chat_completions()`: `request.reasoning` **Changed** diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index 665a2330e..090d4a959 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -37,7 +37,7 @@ generation: documentation: mintlify preApplyUnionDiscriminators: true python: - version: 1.3.159 + version: 1.3.160 additionalDependencies: dev: pytest: '>=8.3' diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml index 55522edd9..bf66450c1 100644 --- a/.speakeasy/out.openapi.yaml +++ b/.speakeasy/out.openapi.yaml @@ -8416,6 +8416,8 @@ components: effort: 'medium' summary: 'concise' properties: + context: + $ref: '#/components/schemas/ReasoningContext' effort: description: 'Constrains effort on reasoning for reasoning models' enum: @@ -8432,12 +8434,22 @@ components: - 'string' - 'null' x-speakeasy-unknown-values: allow + enabled: + description: 'Enables reasoning with default settings. Defaults to being inferred from `effort` or `max_tokens`.' + example: true + type: 'boolean' + exclude: + description: 'When true, the model still reasons but the reasoning is omitted from the response. Defaults to false.' + example: false + type: 'boolean' max_tokens: description: 'Maximum number of tokens the model may spend on reasoning, for models that take a reasoning token budget instead of an effort level. Cannot be combined with `reasoning.effort` or the top-level `reasoning_effort`: a request that sets both is rejected with "Only one of "reasoning.effort" and "reasoning.max_tokens" can be specified".' example: 2000 type: - 'integer' - 'null' + mode: + $ref: '#/components/schemas/ReasoningMode' summary: $ref: '#/components/schemas/ChatReasoningSummaryVerbosityEnum' type: 'object' diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index 9287eadba..9879bbcfd 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -2,8 +2,8 @@ speakeasyVersion: 1.803.2 sources: OpenRouter API: sourceNamespace: open-router-chat-completions-api - sourceRevisionDigest: sha256:9534956985338f860523efa9fe6c73d8ad1ca917038391f47bcbd1cca4f994a0 - sourceBlobDigest: sha256:7379752148325782543b8b777626a2cfe6eee9d0280ed693adab74090fd094eb + sourceRevisionDigest: sha256:065d13d8834eab43892196c2ddd12a2be62721b8db973e8e979dd95e0ae0041b + sourceBlobDigest: sha256:3d450bed4d2afe95015cf2cc9ab685242e127d758e339399c791b19badc51954 tags: - latest - 1.0.0 @@ -11,10 +11,10 @@ targets: open-router: source: OpenRouter API sourceNamespace: open-router-chat-completions-api - sourceRevisionDigest: sha256:9534956985338f860523efa9fe6c73d8ad1ca917038391f47bcbd1cca4f994a0 - sourceBlobDigest: sha256:7379752148325782543b8b777626a2cfe6eee9d0280ed693adab74090fd094eb + sourceRevisionDigest: sha256:065d13d8834eab43892196c2ddd12a2be62721b8db973e8e979dd95e0ae0041b + sourceBlobDigest: sha256:3d450bed4d2afe95015cf2cc9ab685242e127d758e339399c791b19badc51954 codeSamplesNamespace: open-router-python-code-samples - codeSamplesRevisionDigest: sha256:0e94d28644844e45fabd7986eea0edf7d29c09829a05c292f8156107baa008f2 + codeSamplesRevisionDigest: sha256:a2c6618b6c2021bd41b07cf526fcf35e9551e1d29a929a842c05fd541f9a51b3 workflow: workflowVersion: 1.0.0 speakeasyVersion: 1.803.2 diff --git a/RELEASES.md b/RELEASES.md index 734af5e03..1a69f7d9b 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -4359,4 +4359,14 @@ Based on: ### Generated - [python v1.3.159] . ### Releases -- [PyPI v1.3.159] https://pypi.org/project/openrouter/1.3.159 - . \ No newline at end of file +- [PyPI v1.3.159] https://pypi.org/project/openrouter/1.3.159 - . + +## 2026-11-11 18:19:40 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.803.2 (2.950.13) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.3.160] . +### Releases +- [PyPI v1.3.160] https://pypi.org/project/openrouter/1.3.160 - . \ No newline at end of file diff --git a/docs/components/chatrequestreasoning.mdx b/docs/components/chatrequestreasoning.mdx index 057e91d78..fe84e8e3b 100644 --- a/docs/components/chatrequestreasoning.mdx +++ b/docs/components/chatrequestreasoning.mdx @@ -9,6 +9,10 @@ Configuration options for reasoning models | Field | Type | Required | Description | Example | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `context` | [OptionalNullable[components.ReasoningContext]](../components/reasoningcontext.mdx) | ➖ | Controls which reasoning is available to the model. `auto` uses the model default (same as omitting); `all_turns` includes reasoning from earlier turns passed in input; `current_turn` limits to the current turn only. Only supported by OpenAI GPT-5.6 and newer. | all_turns | | `effort` | [OptionalNullable[components.ChatRequestEffort]](../components/chatrequesteffort.mdx) | ➖ | Constrains effort on reasoning for reasoning models | medium | +| `enabled` | *Optional[bool]* | ➖ | Enables reasoning with default settings. Defaults to being inferred from `effort` or `max_tokens`. | true | +| `exclude` | *Optional[bool]* | ➖ | When true, the model still reasons but the reasoning is omitted from the response. Defaults to false. | false | | `max_tokens` | *OptionalNullable[int]* | ➖ | Maximum number of tokens the model may spend on reasoning, for models that take a reasoning token budget instead of an effort level. Cannot be combined with `reasoning.effort` or the top-level `reasoning_effort`: a request that sets both is rejected with "Only one of "reasoning.effort" and "reasoning.max_tokens" can be specified". | 2000 | +| `mode` | [OptionalNullable[components.ReasoningMode]](../components/reasoningmode.mdx) | ➖ | Selects the reasoning mode. `standard` is the default; `pro` engages deeper reasoning on models that support it, billed at standard token rates. Only supported by OpenAI GPT-5.6 and newer. | standard | | `summary` | [OptionalNullable[components.ChatReasoningSummaryVerbosityEnum]](../components/chatreasoningsummaryverbosityenum.mdx) | ➖ | N/A | concise | \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 2ca34ec67..83dded9bd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "openrouter" -version = "1.3.159" +version = "1.3.160" description = "Official Python Client SDK for OpenRouter." authors = [{ name = "OpenRouter" },] readme = "README-PYPI.md" diff --git a/src/openrouter/_version.py b/src/openrouter/_version.py index 97b884a6a..fb55d7245 100644 --- a/src/openrouter/_version.py +++ b/src/openrouter/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "openrouter" -__version__: str = "1.3.159" +__version__: str = "1.3.160" __openapi_doc_version__: str = "1.0.0" __gen_version__: str = "2.950.13" -__user_agent__: str = "speakeasy-sdk/python 1.3.159 2.950.13 1.0.0 openrouter" +__user_agent__: str = "speakeasy-sdk/python 1.3.160 2.950.13 1.0.0 openrouter" try: if __package__ is not None: diff --git a/src/openrouter/components/chatrequest.py b/src/openrouter/components/chatrequest.py index dc6457691..97e9374b3 100644 --- a/src/openrouter/components/chatrequest.py +++ b/src/openrouter/components/chatrequest.py @@ -46,6 +46,8 @@ from .prediction import Prediction, PredictionTypedDict from .promptcacheoptions import PromptCacheOptions, PromptCacheOptionsTypedDict from .providerpreferences import ProviderPreferences, ProviderPreferencesTypedDict +from .reasoningcontext import ReasoningContext +from .reasoningmode import ReasoningMode from .responsehealingplugin import ResponseHealingPlugin, ResponseHealingPluginTypedDict from .stopservertoolswhencondition import ( StopServerToolsWhenCondition, @@ -142,28 +144,50 @@ class ChatRequestReasoningTypedDict(TypedDict): r"""Configuration options for reasoning models""" + context: NotRequired[Nullable[ReasoningContext]] + r"""Controls which reasoning is available to the model. `auto` uses the model default (same as omitting); `all_turns` includes reasoning from earlier turns passed in input; `current_turn` limits to the current turn only. Only supported by OpenAI GPT-5.6 and newer.""" effort: NotRequired[Nullable[ChatRequestEffort]] r"""Constrains effort on reasoning for reasoning models""" + enabled: NotRequired[bool] + r"""Enables reasoning with default settings. Defaults to being inferred from `effort` or `max_tokens`.""" + exclude: NotRequired[bool] + r"""When true, the model still reasons but the reasoning is omitted from the response. Defaults to false.""" max_tokens: NotRequired[Nullable[int]] r"""Maximum number of tokens the model may spend on reasoning, for models that take a reasoning token budget instead of an effort level. Cannot be combined with `reasoning.effort` or the top-level `reasoning_effort`: a request that sets both is rejected with \"Only one of \"reasoning.effort\" and \"reasoning.max_tokens\" can be specified\".""" + mode: NotRequired[Nullable[ReasoningMode]] + r"""Selects the reasoning mode. `standard` is the default; `pro` engages deeper reasoning on models that support it, billed at standard token rates. Only supported by OpenAI GPT-5.6 and newer.""" summary: NotRequired[Nullable[ChatReasoningSummaryVerbosityEnum]] class ChatRequestReasoning(BaseModel): r"""Configuration options for reasoning models""" + context: OptionalNullable[ReasoningContext] = UNSET + r"""Controls which reasoning is available to the model. `auto` uses the model default (same as omitting); `all_turns` includes reasoning from earlier turns passed in input; `current_turn` limits to the current turn only. Only supported by OpenAI GPT-5.6 and newer.""" + effort: OptionalNullable[ChatRequestEffort] = UNSET r"""Constrains effort on reasoning for reasoning models""" + enabled: Optional[bool] = None + r"""Enables reasoning with default settings. Defaults to being inferred from `effort` or `max_tokens`.""" + + exclude: Optional[bool] = None + r"""When true, the model still reasons but the reasoning is omitted from the response. Defaults to false.""" + max_tokens: OptionalNullable[int] = UNSET r"""Maximum number of tokens the model may spend on reasoning, for models that take a reasoning token budget instead of an effort level. Cannot be combined with `reasoning.effort` or the top-level `reasoning_effort`: a request that sets both is rejected with \"Only one of \"reasoning.effort\" and \"reasoning.max_tokens\" can be specified\".""" + mode: OptionalNullable[ReasoningMode] = UNSET + r"""Selects the reasoning mode. `standard` is the default; `pro` engages deeper reasoning on models that support it, billed at standard token rates. Only supported by OpenAI GPT-5.6 and newer.""" + summary: OptionalNullable[ChatReasoningSummaryVerbosityEnum] = UNSET @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = set(["effort", "max_tokens", "summary"]) - nullable_fields = set(["effort", "max_tokens", "summary"]) + optional_fields = set( + ["context", "effort", "enabled", "exclude", "max_tokens", "mode", "summary"] + ) + nullable_fields = set(["context", "effort", "max_tokens", "mode", "summary"]) serialized = handler(self) m = {} diff --git a/uv.lock b/uv.lock index 11f4956d5..2978b1deb 100644 --- a/uv.lock +++ b/uv.lock @@ -231,7 +231,7 @@ wheels = [ [[package]] name = "openrouter" -version = "1.3.159" +version = "1.3.160" source = { editable = "." } dependencies = [ { name = "httpcore" }, From e3a2d4d596605ced900c6270006506f7a5c813a1 Mon Sep 17 00:00:00 2001 From: "speakeasy-github[bot]" <128539517+speakeasy-github[bot]@users.noreply.github.com> Date: Wed, 11 Nov 2026 18:22:23 +0000 Subject: [PATCH 2/2] empty commit to trigger [run-tests] workflow