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" },