From 5c1e170415748f85130c183d0959aec3490b54ea Mon Sep 17 00:00:00 2001 From: speakeasybot Date: Thu, 5 Nov 2026 20:40:48 +0000 Subject: [PATCH 1/2] ## Python SDK Changes: * `open_router.alpha.decisions.create()`: `response.usage` **Changed** * `open_router.system_one.create()`: `response.usage` **Changed** --- .speakeasy/gen.lock | 33 +++++++++-------- .speakeasy/gen.yaml | 2 +- .speakeasy/out.openapi.yaml | 6 ++++ .speakeasy/workflow.lock | 10 +++--- RELEASES.md | 12 ++++++- docs/components/decisionsresponseusage.mdx | 14 ++++---- pyproject.toml | 2 +- src/openrouter/_version.py | 4 +-- .../components/decisionsresponse.py | 36 +++++++++++++++++-- uv.lock | 2 +- 10 files changed, 86 insertions(+), 35 deletions(-) diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 12b523e3..28e97ad4 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: 36da9727d500b45bfb90060e8d4b1b88 + docChecksum: a103037538d332613316e13a17300983 docVersion: 1.0.0 speakeasyVersion: 1.803.2 generationVersion: 2.950.13 - releaseVersion: 1.3.130 - configChecksum: 3742c213ba91be3c474a2d54b3dbb36b + releaseVersion: 1.3.131 + configChecksum: adc032422d0efdef82e0f3fb3c072d6f repoURL: https://github.com/OpenRouterTeam/python-sdk.git installationURL: https://github.com/OpenRouterTeam/python-sdk.git published: true persistentEdits: - generation_id: f436448f-07a6-4cee-ba19-2a4318107d8d - pristine_commit_hash: 9b4fdd4385c6fc9b296765f5a2e75e83a7578377 - pristine_tree_hash: 463d84dd062651512429d9b88a98462978cc4edc + generation_id: 00299001-7278-4525-85df-299f2c3aa458 + pristine_commit_hash: b4d0a6a296b91d7f678af19ecde12c49c08a9f3c + pristine_tree_hash: 758afb314231c4d0aad04d3f5bb0203ebf49e93b features: python: acceptHeaders: 3.0.0 @@ -2964,8 +2964,8 @@ trackedFiles: pristine_git_object: 48ba476c6d114d79e5d5f7bd90db06c60a90239e docs/components/decisionsresponseusage.mdx: id: ab10cb1b5675 - last_write_checksum: sha1:2697cbd759d71c445358dd1bdf1edc1d1c278ecd - pristine_git_object: f651a8f487bd68c8e80d2e59655b9e61a0d5fc0a + last_write_checksum: sha1:f8c2a0574d91aa3ae2ad1aa42ad7a37b87b62d94 + pristine_git_object: bd8a252e63cd38c3bd6b7719f320e9f67bcfc489 docs/components/decisionsscoreanswer.mdx: id: ed8cc3ae16c6 last_write_checksum: sha1:b65aa6adeedd6836b086d27a0a0e750838f7ab81 @@ -11008,8 +11008,8 @@ trackedFiles: pristine_git_object: 3e38f1a929f7d6b1d6de74604aa87e3d8f010544 pyproject.toml: id: 5d07e7d72637 - last_write_checksum: sha1:a07bb90cba858b3f588c91b5a0ee0fd927ef4ba9 - pristine_git_object: 030ebeef911ea99d97a6e8c698089bd7369e8899 + last_write_checksum: sha1:ec5bd30f505e4052b284661c9a29ff2fac35647c + pristine_git_object: e0c226a4f028f7fc0bd43c0c16ccf7997cf300ae scripts/prepare_readme.py: id: e0c5957a6035 last_write_checksum: sha1:77f44b60b98bc126557ec27391f91dfba764bb54 @@ -11036,8 +11036,8 @@ trackedFiles: pristine_git_object: 86713cfea633e09d33b3d4e65281071fe20e6137 src/openrouter/_version.py: id: d8d15ad6c586 - last_write_checksum: sha1:e5cb07ec383980634203c69f5b5bcc3c2d05cab8 - pristine_git_object: c3dbcae7d7635f76346f9c2ec30ea9113725bae0 + last_write_checksum: sha1:a6b9ba70c16d696c1b6b2786b6bc21465a2da557 + pristine_git_object: 26e24a92c8db5c8328a8fb4655c0c4abc9c72a49 src/openrouter/alpha.py: id: 306c4d93308d last_write_checksum: sha1:80cc0f39649445431cc2247ed0e0765438467766 @@ -12332,8 +12332,8 @@ trackedFiles: pristine_git_object: c3f32b631b40f5eca0a0b3c71c2fd543058cf52a src/openrouter/components/decisionsresponse.py: id: b91b81c2cf95 - last_write_checksum: sha1:d127c853bcff3272489b94131f7e09209e708faf - pristine_git_object: 49dfac713420e388ff707bbe6cd8973bbba2e69f + last_write_checksum: sha1:c3270d7d1a547369b778c79ac7dfea7f02f56d51 + pristine_git_object: 69684bc7085a4f956056c2032523c13923a432b1 src/openrouter/components/decisionsscoreanswer.py: id: af8597465725 last_write_checksum: sha1:e12a52051ccd6f841e0238d789b816a05156d299 @@ -20204,4 +20204,7 @@ examples: "500": application/json: {"error": {"code": 500, "message": "Internal Server Error"}} examplesVersion: 1.0.2 -releaseNotes: "## Python SDK Changes:\n* `open_router.batch.create_batches()`: \n * `request.provider.only[].union(ProviderName).enum(river)` **Added**\n * `response.results[].response.body.union(OpenResponsesResult)` **Changed** (Breaking ⚠️)\n* `open_router.presets.create_presets_responses()`: `request` **Changed** (Breaking ⚠️)\n* `open_router.batch.get_batches()`: `response.results[].response.body.union(OpenResponsesResult)` **Changed** (Breaking ⚠️)\n* `open_router.embeddings.generate()`: `request.provider` **Changed**\n* `open_router.endpoints.list()`: `response.data.endpoints[].provider_name.enum(river)` **Added**\n* `open_router.tts.create_speech()`: `request.provider` **Changed**\n* `open_router.byok.list()`: \n * `request.provider` **Changed**\n * `response.data[].provider.enum(river)` **Added**\n* `open_router.byok.create()`: \n * `request.provider.enum(river)` **Added**\n * `response.data.provider.enum(river)` **Added**\n* `open_router.byok.get()`: `response.data.provider.enum(river)` **Added**\n* `open_router.byok.update()`: `response.data.provider.enum(river)` **Added**\n* `open_router.alpha.decisions.create()`: `request` **Changed**\n* `open_router.endpoints.list_zdr_endpoints()`: `response.data[].provider_name.enum(river)` **Added**\n* `open_router.stt.create_transcription()`: `request.provider` **Changed**\n* `open_router.generations.get_generation()`: `response.data.provider_responses[].provider_name.enum(river)` **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.alpha.extractions.create()`: `request.provider` **Changed**\n* `open_router.rerank.rerank()`: `request.provider` **Changed**\n* `open_router.system_one.create()`: `request` **Changed**\n* `open_router.video_generation.generate()`: `request.provider` **Changed**\n* `open_router.workspaces.create()`: \n * `request.disabled_server_tools[].enum(openrouter:mcp)` **Added**\n* `open_router.workspaces.update()`: \n * `request.disabled_server_tools[].enum(openrouter:mcp)` **Added**\n" +releaseNotes: | + ## Python SDK Changes: + * `open_router.alpha.decisions.create()`: `response.usage` **Changed** + * `open_router.system_one.create()`: `response.usage` **Changed** diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index a6582b49..46a7cb80 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -37,7 +37,7 @@ generation: documentation: mintlify preApplyUnionDiscriminators: true python: - version: 1.3.130 + version: 1.3.131 additionalDependencies: dev: pytest: '>=8.3' diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml index 778e279a..c517e7f6 100644 --- a/.speakeasy/out.openapi.yaml +++ b/.speakeasy/out.openapi.yaml @@ -11329,12 +11329,18 @@ components: usage: properties: cost: + description: 'What OpenRouter charges for the request, in credits. On a BYOK request this is the OpenRouter fee only.' format: 'double' type: 'number' + cost_details: + $ref: '#/components/schemas/CostDetails' input_tokens: type: 'integer' input_tokens_details: $ref: '#/components/schemas/DecisionsUsageInputTokensDetails' + is_byok: + description: 'Whether a request was made using a Bring Your Own Key configuration' + type: 'boolean' output_tokens: type: 'integer' required: diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index d23cbb70..ed015a05 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:b8a6513ddeed98e514428333774cd0a270d2bc0c1d8dec60630570f3b6d63e60 - sourceBlobDigest: sha256:eb1b8ad92e68ea4281816bf53c517d6e04a715ce1cb369c7ddb98797443ad17c + sourceRevisionDigest: sha256:1fbf0ee26aa1ab7658acda2193df1c36156f4f7b68ccdc009f23357819e34c9c + sourceBlobDigest: sha256:877af691c84d4fdbe8207d6f21a620711e2b9ad0b87868945f9082d1e7d90178 tags: - latest - 1.0.0 @@ -11,10 +11,10 @@ targets: open-router: source: OpenRouter API sourceNamespace: open-router-chat-completions-api - sourceRevisionDigest: sha256:b8a6513ddeed98e514428333774cd0a270d2bc0c1d8dec60630570f3b6d63e60 - sourceBlobDigest: sha256:eb1b8ad92e68ea4281816bf53c517d6e04a715ce1cb369c7ddb98797443ad17c + sourceRevisionDigest: sha256:1fbf0ee26aa1ab7658acda2193df1c36156f4f7b68ccdc009f23357819e34c9c + sourceBlobDigest: sha256:877af691c84d4fdbe8207d6f21a620711e2b9ad0b87868945f9082d1e7d90178 codeSamplesNamespace: open-router-python-code-samples - codeSamplesRevisionDigest: sha256:517cbd26ae43cf9bdfcfd6328d3e4ecff384909acdc01250440cbfb0b237851e + codeSamplesRevisionDigest: sha256:15a9b9c933c6560ccfe4b3e78bbf894bb543e3cbdfd67777926d3dccd206fca3 workflow: workflowVersion: 1.0.0 speakeasyVersion: 1.803.2 diff --git a/RELEASES.md b/RELEASES.md index 91beeec4..4e7fa953 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -4069,4 +4069,14 @@ Based on: ### Generated - [python v1.3.130] . ### Releases -- [PyPI v1.3.130] https://pypi.org/project/openrouter/1.3.130 - . \ No newline at end of file +- [PyPI v1.3.130] https://pypi.org/project/openrouter/1.3.130 - . + +## 2026-11-05 20:38:11 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.803.2 (2.950.13) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.3.131] . +### Releases +- [PyPI v1.3.131] https://pypi.org/project/openrouter/1.3.131 - . \ No newline at end of file diff --git a/docs/components/decisionsresponseusage.mdx b/docs/components/decisionsresponseusage.mdx index f651a8f4..bd8a252e 100644 --- a/docs/components/decisionsresponseusage.mdx +++ b/docs/components/decisionsresponseusage.mdx @@ -4,9 +4,11 @@ title: "DecisionsResponseUsage" ## Fields -| Field | Type | Required | Description | -| ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | -| `cost` | *Optional[float]* | ➖ | N/A | -| `input_tokens` | *int* | ✔️ | N/A | -| `input_tokens_details` | [Optional[components.DecisionsUsageInputTokensDetails]](../components/decisionsusageinputtokensdetails.mdx) | ➖ | Of `input_tokens`, those the provider served from its prompt cache. | -| `output_tokens` | *int* | ✔️ | N/A | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | +| `cost` | *Optional[float]* | ➖ | What OpenRouter charges for the request, in credits. On a BYOK request this is the OpenRouter fee only. | | +| `cost_details` | [OptionalNullable[components.CostDetails]](../components/costdetails.mdx) | ➖ | Breakdown of upstream inference costs | \{
"upstream_inference_completions_cost": 0.0004,
"upstream_inference_cost": null,
"upstream_inference_prompt_cost": 0.0008
} | +| `input_tokens` | *int* | ✔️ | N/A | | +| `input_tokens_details` | [Optional[components.DecisionsUsageInputTokensDetails]](../components/decisionsusageinputtokensdetails.mdx) | ➖ | Of `input_tokens`, those the provider served from its prompt cache. | | +| `is_byok` | *Optional[bool]* | ➖ | Whether a request was made using a Bring Your Own Key configuration | | +| `output_tokens` | *int* | ✔️ | N/A | | \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 030ebeef..e0c226a4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "openrouter" -version = "1.3.130" +version = "1.3.131" 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 c3dbcae7..26e24a92 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.130" +__version__: str = "1.3.131" __openapi_doc_version__: str = "1.0.0" __gen_version__: str = "2.950.13" -__user_agent__: str = "speakeasy-sdk/python 1.3.130 2.950.13 1.0.0 openrouter" +__user_agent__: str = "speakeasy-sdk/python 1.3.131 2.950.13 1.0.0 openrouter" try: if __package__ is not None: diff --git a/src/openrouter/components/decisionsresponse.py b/src/openrouter/components/decisionsresponse.py index 49dfac71..69684bc7 100644 --- a/src/openrouter/components/decisionsresponse.py +++ b/src/openrouter/components/decisionsresponse.py @@ -1,6 +1,7 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations +from .costdetails import CostDetails, CostDetailsTypedDict from .decisionsboxanswer import DecisionsBoxAnswer, DecisionsBoxAnswerTypedDict from .decisionschoiceanswer import DecisionsChoiceAnswer, DecisionsChoiceAnswerTypedDict from .decisionsnoulanswer import DecisionsNoulAnswer, DecisionsNoulAnswerTypedDict @@ -18,7 +19,13 @@ DecisionsUsageInputTokensDetailsTypedDict, ) from functools import partial -from openrouter.types import BaseModel, UNSET_SENTINEL +from openrouter.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) from openrouter.utils.unions import parse_open_union from pydantic import ConfigDict, model_serializer from pydantic.functional_validators import BeforeValidator @@ -84,8 +91,13 @@ class DecisionsResponseUsageTypedDict(TypedDict): input_tokens: int output_tokens: int cost: NotRequired[float] + r"""What OpenRouter charges for the request, in credits. On a BYOK request this is the OpenRouter fee only.""" + cost_details: NotRequired[Nullable[CostDetailsTypedDict]] + r"""Breakdown of upstream inference costs""" input_tokens_details: NotRequired[DecisionsUsageInputTokensDetailsTypedDict] r"""Of `input_tokens`, those the provider served from its prompt cache.""" + is_byok: NotRequired[bool] + r"""Whether a request was made using a Bring Your Own Key configuration""" class DecisionsResponseUsage(BaseModel): @@ -94,22 +106,40 @@ class DecisionsResponseUsage(BaseModel): output_tokens: int cost: Optional[float] = None + r"""What OpenRouter charges for the request, in credits. On a BYOK request this is the OpenRouter fee only.""" + + cost_details: OptionalNullable[CostDetails] = UNSET + r"""Breakdown of upstream inference costs""" input_tokens_details: Optional[DecisionsUsageInputTokensDetails] = None r"""Of `input_tokens`, those the provider served from its prompt cache.""" + is_byok: Optional[bool] = None + r"""Whether a request was made using a Bring Your Own Key configuration""" + @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = set(["cost", "input_tokens_details"]) + optional_fields = set( + ["cost", "cost_details", "input_tokens_details", "is_byok"] + ) + nullable_fields = set(["cost_details"]) serialized = handler(self) m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k, serialized.get(n)) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) if val != UNSET_SENTINEL: - if val is not None or k not in optional_fields: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): m[k] = val return m diff --git a/uv.lock b/uv.lock index 15348157..d9c9720e 100644 --- a/uv.lock +++ b/uv.lock @@ -231,7 +231,7 @@ wheels = [ [[package]] name = "openrouter" -version = "1.3.130" +version = "1.3.131" source = { editable = "." } dependencies = [ { name = "httpcore" }, From 18b2829308aeaa8f4c8db89193568cbd9962cf64 Mon Sep 17 00:00:00 2001 From: "speakeasy-github[bot]" <128539517+speakeasy-github[bot]@users.noreply.github.com> Date: Thu, 5 Nov 2026 20:40:57 +0000 Subject: [PATCH 2/2] empty commit to trigger [run-tests] workflow