diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock
index 9ccaa224..7ffba279 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: 2fcf515f1f19f0f7aa6ab7b88abbf8b0
+ docChecksum: 758ef63a0a08383540ea8dad373f870a
docVersion: 1.0.0
speakeasyVersion: 1.787.0
generationVersion: 2.914.0
- releaseVersion: 1.1.115
- configChecksum: c4324ed99d6410d284d0ba15b1c8c7b6
+ releaseVersion: 1.1.116
+ configChecksum: 99dc42c14b3050cf1a52fb4239b25558
repoURL: https://github.com/OpenRouterTeam/python-sdk.git
installationURL: https://github.com/OpenRouterTeam/python-sdk.git
published: true
persistentEdits:
- generation_id: 2923c407-46ff-4dbf-90f6-40bf9fc2c6f6
- pristine_commit_hash: f86afabf72b9199414423483da1ed9fe058ec27b
- pristine_tree_hash: ea94eebf655086de397231127ae82622b65b3d30
+ generation_id: 6bfdd5aa-7fe3-49f5-b6e1-be62fb470be6
+ pristine_commit_hash: 7b309bbd8b47f3279f989ee1fc72d4b11f98f6d6
+ pristine_tree_hash: d1ad592a96d37e0a74bfe99f72340279fb64eeb1
features:
python:
acceptHeaders: 3.0.0
@@ -1082,8 +1082,8 @@ trackedFiles:
pristine_git_object: cb8cba525e66e5515ea69a5217d1b20809250003
docs/components/chatresult.mdx:
id: 1d855f0d207b
- last_write_checksum: sha1:1327c59b5dd13f87488f8076e97ca36b2e93c22f
- pristine_git_object: 94e3c0ce6c01fd6b28edcf40097e6f70fa0dfe01
+ last_write_checksum: sha1:70644649b0eef0c4edb2e7dd2d534847530e68c6
+ pristine_git_object: 3f20da6480e9963ad29edc5671fec24a087705e6
docs/components/chatresultobject.mdx:
id: adc07397bfc0
last_write_checksum: sha1:0323dc5815ea2b95d85785afc089cacd90cb13f0
@@ -1106,8 +1106,8 @@ trackedFiles:
pristine_git_object: d6bd70fb2627a85b2db13a1f23c179f2fe3ad194
docs/components/chatstreamchunk.mdx:
id: 90a2741f18cd
- last_write_checksum: sha1:0a60882651fbfdba6ca61aee439ecf7087499188
- pristine_git_object: 3adbd9896f88520ec5a3c54596a8f8ec20e1110b
+ last_write_checksum: sha1:b272780ab0931bb45cbe7f52b274fae437ff4867
+ pristine_git_object: ccddb5a2b4db3ec61ceb0b70443da7cebc00d065
docs/components/chatstreamchunkerror.mdx:
id: 15ce1e8c2a5d
last_write_checksum: sha1:adc488f464df961a969a36414ee90988e2866a6b
@@ -3694,8 +3694,8 @@ trackedFiles:
pristine_git_object: 09effe2d3fe45536c8b0aa0f23c02ce19b15f62c
docs/components/openresponsesresult.mdx:
id: d0fed85674d2
- last_write_checksum: sha1:3bc26b772dfc3397c0da7b769b16d938eede91fb
- pristine_git_object: f5c81b7142316cd4a6ec8a96c192b682a1a34ff8
+ last_write_checksum: sha1:c3fd0f82a3ba0550a6e8cccb7baee5e48cbe6fed
+ pristine_git_object: a967818d30feb09ca0540414e53e17f5983220b3
docs/components/openresponsesresultobject.mdx:
id: 93b1fcc70132
last_write_checksum: sha1:7579ee1bb9e0d20c55cf54a8ca2ccbc950d2921d
@@ -3746,8 +3746,8 @@ trackedFiles:
pristine_git_object: fe4a1888643f81ea25e2271c592f98482ba3b83e
docs/components/openroutermetadata.mdx:
id: 355be2e7788c
- last_write_checksum: sha1:c5ed476aab215597dd1af37fe1fd7e99a0ac6c88
- pristine_git_object: 812ccb2b90388d191c2866eb3c2ed0572d0181e9
+ last_write_checksum: sha1:75037a74e20a9f19c3d61a9ab37cfe0b6bcc7f48
+ pristine_git_object: 4cbe157120f00afebbbac4fe58adc4f4d6123b05
docs/components/openrouterwebsearchservertool.mdx:
id: a553315e2543
last_write_checksum: sha1:9d85c2945ba2713fcbe49bec28307372bb8535e0
@@ -7470,8 +7470,8 @@ trackedFiles:
pristine_git_object: 3e38f1a929f7d6b1d6de74604aa87e3d8f010544
pyproject.toml:
id: 5d07e7d72637
- last_write_checksum: sha1:7a875e84a86961b5c465311684a15b085974f26c
- pristine_git_object: 33b9c0acfac6719dcec24e60957a5a607ea81bda
+ last_write_checksum: sha1:caebdc04bcc0970785075f14c8018496682d6897
+ pristine_git_object: 200d9497c1138fd059d0219059aa3b78bf7d2f7b
scripts/prepare_readme.py:
id: e0c5957a6035
last_write_checksum: sha1:77f44b60b98bc126557ec27391f91dfba764bb54
@@ -7498,8 +7498,8 @@ trackedFiles:
pristine_git_object: 86713cfea633e09d33b3d4e65281071fe20e6137
src/openrouter/_version.py:
id: d8d15ad6c586
- last_write_checksum: sha1:ba87d8a823bde33bf0421825184ef71e2fe09ca9
- pristine_git_object: 12a40c34abc340a2bc3ccf5087ef55d3e03f7e2f
+ last_write_checksum: sha1:f85ecfa87ecdc756830e9f82b5afbf7d3f76da62
+ pristine_git_object: dcb7ae847df12211f68468b2539a966633c180dc
src/openrouter/analytics.py:
id: cb406b5aaabb
last_write_checksum: sha1:1e0004d8d1d5d797e2b54cd1cabeb7f9489d08e9
@@ -9106,8 +9106,8 @@ trackedFiles:
pristine_git_object: f5cf39efc3f9d3de11167f4b5f48124d07d0a588
src/openrouter/components/openroutermetadata.py:
id: 87062f38be59
- last_write_checksum: sha1:65c4b563aea67eb15f1fc6d859856a081a1cc78f
- pristine_git_object: 09b552bda339d8fd4339b5acb5bfed31594a92c9
+ last_write_checksum: sha1:79f3f6b0734f90462895d1ba39149a78e3c6b817
+ pristine_git_object: b30d28a55e4b1190ebfd1a7c3eb0a91d3c7eb74f
src/openrouter/components/openrouterwebsearchservertool.py:
id: f5400a5de3cd
last_write_checksum: sha1:5b8eab2b521a639688131143ee39e513e6da524a
@@ -12577,3 +12577,8 @@ examples:
"503":
application/json: {"error": {"code": 503, "message": "Service temporarily unavailable"}}
examplesVersion: 1.0.2
+releaseNotes: |
+ ## Python SDK Changes:
+ * `open_router.chat.send()`: `response` **Changed**
+ * `open_router.responses.send()`: `response` **Changed**
+ * `open_router.beta.responses.send()`: `response` **Changed**
diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml
index db4e1972..2a9ce9d7 100644
--- a/.speakeasy/gen.yaml
+++ b/.speakeasy/gen.yaml
@@ -36,7 +36,7 @@ generation:
documentation: mintlify
preApplyUnionDiscriminators: true
python:
- version: 1.1.115
+ version: 1.1.116
additionalDependencies:
dev: {}
main: {}
diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml
index ba4138dd..666a0287 100644
--- a/.speakeasy/out.openapi.yaml
+++ b/.speakeasy/out.openapi.yaml
@@ -18321,6 +18321,7 @@ components:
provider: 'OpenAI'
selected: true
total: 1
+ generation_time: 2016
is_byok: false
region: 'iad'
requested: 'openai/gpt-4o'
@@ -18335,6 +18336,10 @@ components:
type: 'array'
endpoints:
$ref: '#/components/schemas/EndpointsMetadata'
+ generation_time:
+ description: 'Milliseconds measured for the generation, from dispatching the upstream request until its response body ended. Divide the completion token count by this for throughput. Absent when no upstream request was dispatched.'
+ example: 2016
+ type: 'integer'
is_byok:
type: 'boolean'
params:
diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock
index 6c254863..35002a06 100644
--- a/.speakeasy/workflow.lock
+++ b/.speakeasy/workflow.lock
@@ -2,8 +2,8 @@ speakeasyVersion: 1.787.0
sources:
OpenRouter API:
sourceNamespace: open-router-chat-completions-api
- sourceRevisionDigest: sha256:a11c09e68a65a47904f0b3b1fa4afc12ce284aa0e878b14b484b2495f6c47ce0
- sourceBlobDigest: sha256:5466f5c7ef7a667e650ac72416db50cd0ec913d304b889c1089524101a7edabc
+ sourceRevisionDigest: sha256:dc2eed6ab6c7c25270db16f8436fb4268867f0933ce5e808a6767e29dd2e2a57
+ sourceBlobDigest: sha256:bf6877bc98c487ec6b18040214be92c5fecf75f0f1c93fe1c5bf29f7066c651d
tags:
- latest
- 1.0.0
@@ -11,10 +11,10 @@ targets:
open-router:
source: OpenRouter API
sourceNamespace: open-router-chat-completions-api
- sourceRevisionDigest: sha256:a11c09e68a65a47904f0b3b1fa4afc12ce284aa0e878b14b484b2495f6c47ce0
- sourceBlobDigest: sha256:5466f5c7ef7a667e650ac72416db50cd0ec913d304b889c1089524101a7edabc
+ sourceRevisionDigest: sha256:dc2eed6ab6c7c25270db16f8436fb4268867f0933ce5e808a6767e29dd2e2a57
+ sourceBlobDigest: sha256:bf6877bc98c487ec6b18040214be92c5fecf75f0f1c93fe1c5bf29f7066c651d
codeSamplesNamespace: open-router-python-code-samples
- codeSamplesRevisionDigest: sha256:a161e51198c23925d81c5b3d91a2d0c08159f55b8641bae3513763d7c4121254
+ codeSamplesRevisionDigest: sha256:4336ef86e6030915d783554b9ad9ff251be907e2d92e00fd621db20131c4da9e
workflow:
workflowVersion: 1.0.0
speakeasyVersion: 1.787.0
diff --git a/RELEASES.md b/RELEASES.md
index 40e4570e..8ecfd6ee 100644
--- a/RELEASES.md
+++ b/RELEASES.md
@@ -1939,4 +1939,14 @@ Based on:
### Generated
- [python v1.1.115] .
### Releases
-- [PyPI v1.1.115] https://pypi.org/project/openrouter/1.1.115 - .
\ No newline at end of file
+- [PyPI v1.1.115] https://pypi.org/project/openrouter/1.1.115 - .
+
+## 2026-09-02 19:27:20
+### Changes
+Based on:
+- OpenAPI Doc
+- Speakeasy CLI 1.787.0 (2.914.0) https://github.com/speakeasy-api/speakeasy
+### Generated
+- [python v1.1.116] .
+### Releases
+- [PyPI v1.1.116] https://pypi.org/project/openrouter/1.1.116 - .
\ No newline at end of file
diff --git a/docs/components/chatresult.mdx b/docs/components/chatresult.mdx
index 94e3c0ce..3f20da64 100644
--- a/docs/components/chatresult.mdx
+++ b/docs/components/chatresult.mdx
@@ -14,7 +14,7 @@ Chat completion response
| `id` | *str* | :heavy_check_mark: | Unique completion identifier | chatcmpl-123 |
| `model` | *str* | :heavy_check_mark: | Model used for completion | openai/gpt-4 |
| `object` | [components.ChatResultObject](../components/chatresultobject.mdx) | :heavy_check_mark: | N/A | |
-| `openrouter_metadata` | [Optional[components.OpenRouterMetadata]](../components/openroutermetadata.mdx) | :heavy_minus_sign: | N/A | \{
"attempt": 1,
"endpoints": \{
"available": [
\{
"model": "openai/gpt-4o",
"provider": "OpenAI",
"selected": true
}
],
"total": 1
},
"is_byok": false,
"region": "iad",
"requested": "openai/gpt-4o",
"strategy": "direct",
"summary": "available=1, selected=OpenAI"
} |
+| `openrouter_metadata` | [Optional[components.OpenRouterMetadata]](../components/openroutermetadata.mdx) | :heavy_minus_sign: | N/A | \{
"attempt": 1,
"endpoints": \{
"available": [
\{
"model": "openai/gpt-4o",
"provider": "OpenAI",
"selected": true
}
],
"total": 1
},
"generation_time": 2016,
"is_byok": false,
"region": "iad",
"requested": "openai/gpt-4o",
"strategy": "direct",
"summary": "available=1, selected=OpenAI"
} |
| `service_tier` | *OptionalNullable[str]* | :heavy_minus_sign: | The service tier used by the upstream provider for this request | default |
| `system_fingerprint` | *Nullable[str]* | :heavy_check_mark: | System fingerprint | fp_44709d6fcb |
| `usage` | [Optional[components.ChatUsage]](../components/chatusage.mdx) | :heavy_minus_sign: | Token usage statistics | \{
"completion_tokens": 15,
"completion_tokens_details": \{
"reasoning_tokens": 5
},
"cost": 0.0012,
"cost_details": \{
"upstream_inference_completions_cost": 0.0004,
"upstream_inference_cost": null,
"upstream_inference_prompt_cost": 0.0008
},
"is_byok": false,
"prompt_tokens": 10,
"prompt_tokens_details": \{
"cached_tokens": 2
},
"server_tool_use_details": \{
"tool_calls_executed": 2,
"tool_calls_requested": 2
},
"total_tokens": 25
} |
\ No newline at end of file
diff --git a/docs/components/chatstreamchunk.mdx b/docs/components/chatstreamchunk.mdx
index 3adbd989..ccddb5a2 100644
--- a/docs/components/chatstreamchunk.mdx
+++ b/docs/components/chatstreamchunk.mdx
@@ -15,7 +15,7 @@ Streaming chat completion chunk
| `id` | *str* | :heavy_check_mark: | Unique chunk identifier | chatcmpl-123 |
| `model` | *str* | :heavy_check_mark: | Model used for completion | openai/gpt-4 |
| `object` | [components.ChatStreamChunkObject](../components/chatstreamchunkobject.mdx) | :heavy_check_mark: | N/A | |
-| `openrouter_metadata` | [Optional[components.OpenRouterMetadata]](../components/openroutermetadata.mdx) | :heavy_minus_sign: | N/A | \{
"attempt": 1,
"endpoints": \{
"available": [
\{
"model": "openai/gpt-4o",
"provider": "OpenAI",
"selected": true
}
],
"total": 1
},
"is_byok": false,
"region": "iad",
"requested": "openai/gpt-4o",
"strategy": "direct",
"summary": "available=1, selected=OpenAI"
} |
+| `openrouter_metadata` | [Optional[components.OpenRouterMetadata]](../components/openroutermetadata.mdx) | :heavy_minus_sign: | N/A | \{
"attempt": 1,
"endpoints": \{
"available": [
\{
"model": "openai/gpt-4o",
"provider": "OpenAI",
"selected": true
}
],
"total": 1
},
"generation_time": 2016,
"is_byok": false,
"region": "iad",
"requested": "openai/gpt-4o",
"strategy": "direct",
"summary": "available=1, selected=OpenAI"
} |
| `service_tier` | *OptionalNullable[str]* | :heavy_minus_sign: | The service tier used by the upstream provider for this request | default |
| `system_fingerprint` | *Optional[str]* | :heavy_minus_sign: | System fingerprint | fp_44709d6fcb |
| `usage` | [Optional[components.ChatUsage]](../components/chatusage.mdx) | :heavy_minus_sign: | Token usage statistics | \{
"completion_tokens": 15,
"completion_tokens_details": \{
"reasoning_tokens": 5
},
"cost": 0.0012,
"cost_details": \{
"upstream_inference_completions_cost": 0.0004,
"upstream_inference_cost": null,
"upstream_inference_prompt_cost": 0.0008
},
"is_byok": false,
"prompt_tokens": 10,
"prompt_tokens_details": \{
"cached_tokens": 2
},
"server_tool_use_details": \{
"tool_calls_executed": 2,
"tool_calls_requested": 2
},
"total_tokens": 25
} |
\ No newline at end of file
diff --git a/docs/components/openresponsesresult.mdx b/docs/components/openresponsesresult.mdx
index f5c81b71..a967818d 100644
--- a/docs/components/openresponsesresult.mdx
+++ b/docs/components/openresponsesresult.mdx
@@ -45,4 +45,4 @@ Complete non-streaming response from the Responses API
| `usage` | [OptionalNullable[components.Usage]](../components/usage.mdx) | :heavy_minus_sign: | Token usage information for the response | \{
"cost": 0.0012,
"cost_details": \{
"upstream_inference_cost": null,
"upstream_inference_input_cost": 0.0008,
"upstream_inference_output_cost": 0.0004
},
"input_tokens": 10,
"input_tokens_details": \{
"cached_tokens": 0
},
"output_tokens": 25,
"output_tokens_details": \{
"reasoning_tokens": 0
},
"total_tokens": 35
} |
| `user` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | |
| `error_type` | [Optional[components.APIErrorType]](../components/apierrortype.mdx) | :heavy_minus_sign: | Canonical OpenRouter error type, stable across all API formats | rate_limit_exceeded |
-| `openrouter_metadata` | [Optional[components.OpenRouterMetadata]](../components/openroutermetadata.mdx) | :heavy_minus_sign: | N/A | \{
"attempt": 1,
"endpoints": \{
"available": [
\{
"model": "openai/gpt-4o",
"provider": "OpenAI",
"selected": true
}
],
"total": 1
},
"is_byok": false,
"region": "iad",
"requested": "openai/gpt-4o",
"strategy": "direct",
"summary": "available=1, selected=OpenAI"
} |
\ No newline at end of file
+| `openrouter_metadata` | [Optional[components.OpenRouterMetadata]](../components/openroutermetadata.mdx) | :heavy_minus_sign: | N/A | \{
"attempt": 1,
"endpoints": \{
"available": [
\{
"model": "openai/gpt-4o",
"provider": "OpenAI",
"selected": true
}
],
"total": 1
},
"generation_time": 2016,
"is_byok": false,
"region": "iad",
"requested": "openai/gpt-4o",
"strategy": "direct",
"summary": "available=1, selected=OpenAI"
} |
\ No newline at end of file
diff --git a/docs/components/openroutermetadata.mdx b/docs/components/openroutermetadata.mdx
index 812ccb2b..4cbe1571 100644
--- a/docs/components/openroutermetadata.mdx
+++ b/docs/components/openroutermetadata.mdx
@@ -4,15 +4,16 @@ title: "OpenRouterMetadata"
## Fields
-| Field | Type | Required | Description | Example |
-| ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
-| `attempt` | *int* | :heavy_check_mark: | N/A | |
-| `attempts` | List[[components.RouterAttempt](../components/routerattempt.mdx)] | :heavy_minus_sign: | N/A | |
-| `endpoints` | [components.EndpointsMetadata](../components/endpointsmetadata.mdx) | :heavy_check_mark: | N/A | \{
"available": [
\{
"model": "openai/gpt-4o",
"provider": "OpenAI",
"selected": true
}
],
"total": 3
} |
-| `is_byok` | *bool* | :heavy_check_mark: | N/A | |
-| `params` | [Optional[components.RouterParams]](../components/routerparams.mdx) | :heavy_minus_sign: | N/A | \{
"version_group": "anthropic/claude-sonnet-4"
} |
-| `pipeline` | List[[components.PipelineStage](../components/pipelinestage.mdx)] | :heavy_minus_sign: | N/A | |
-| `region` | *Nullable[str]* | :heavy_check_mark: | N/A | |
-| `requested` | *str* | :heavy_check_mark: | N/A | |
-| `strategy` | [components.RoutingStrategy](../components/routingstrategy.mdx) | :heavy_check_mark: | N/A | direct |
-| `summary` | *str* | :heavy_check_mark: | N/A | |
\ No newline at end of file
+| Field | Type | Required | Description | Example |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `attempt` | *int* | :heavy_check_mark: | N/A | |
+| `attempts` | List[[components.RouterAttempt](../components/routerattempt.mdx)] | :heavy_minus_sign: | N/A | |
+| `endpoints` | [components.EndpointsMetadata](../components/endpointsmetadata.mdx) | :heavy_check_mark: | N/A | \{
"available": [
\{
"model": "openai/gpt-4o",
"provider": "OpenAI",
"selected": true
}
],
"total": 3
} |
+| `generation_time` | *Optional[int]* | :heavy_minus_sign: | Milliseconds measured for the generation, from dispatching the upstream request until its response body ended. Divide the completion token count by this for throughput. Absent when no upstream request was dispatched. | 2016 |
+| `is_byok` | *bool* | :heavy_check_mark: | N/A | |
+| `params` | [Optional[components.RouterParams]](../components/routerparams.mdx) | :heavy_minus_sign: | N/A | \{
"version_group": "anthropic/claude-sonnet-4"
} |
+| `pipeline` | List[[components.PipelineStage](../components/pipelinestage.mdx)] | :heavy_minus_sign: | N/A | |
+| `region` | *Nullable[str]* | :heavy_check_mark: | N/A | |
+| `requested` | *str* | :heavy_check_mark: | N/A | |
+| `strategy` | [components.RoutingStrategy](../components/routingstrategy.mdx) | :heavy_check_mark: | N/A | direct |
+| `summary` | *str* | :heavy_check_mark: | N/A | |
\ No newline at end of file
diff --git a/pyproject.toml b/pyproject.toml
index 33b9c0ac..200d9497 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "openrouter"
-version = "1.1.115"
+version = "1.1.116"
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 12a40c34..dcb7ae84 100644
--- a/src/openrouter/_version.py
+++ b/src/openrouter/_version.py
@@ -3,10 +3,10 @@
import importlib.metadata
__title__: str = "openrouter"
-__version__: str = "1.1.115"
+__version__: str = "1.1.116"
__openapi_doc_version__: str = "1.0.0"
__gen_version__: str = "2.914.0"
-__user_agent__: str = "speakeasy-sdk/python 1.1.115 2.914.0 1.0.0 openrouter"
+__user_agent__: str = "speakeasy-sdk/python 1.1.116 2.914.0 1.0.0 openrouter"
try:
if __package__ is not None:
diff --git a/src/openrouter/components/openroutermetadata.py b/src/openrouter/components/openroutermetadata.py
index 09b552bd..b30d28a5 100644
--- a/src/openrouter/components/openroutermetadata.py
+++ b/src/openrouter/components/openroutermetadata.py
@@ -21,6 +21,8 @@ class OpenRouterMetadataTypedDict(TypedDict):
strategy: RoutingStrategy
summary: str
attempts: NotRequired[List[RouterAttemptTypedDict]]
+ generation_time: NotRequired[int]
+ r"""Milliseconds measured for the generation, from dispatching the upstream request until its response body ended. Divide the completion token count by this for throughput. Absent when no upstream request was dispatched."""
params: NotRequired[RouterParamsTypedDict]
pipeline: NotRequired[List[PipelineStageTypedDict]]
@@ -42,13 +44,16 @@ class OpenRouterMetadata(BaseModel):
attempts: Optional[List[RouterAttempt]] = None
+ generation_time: Optional[int] = None
+ r"""Milliseconds measured for the generation, from dispatching the upstream request until its response body ended. Divide the completion token count by this for throughput. Absent when no upstream request was dispatched."""
+
params: Optional[RouterParams] = None
pipeline: Optional[List[PipelineStage]] = None
@model_serializer(mode="wrap")
def serialize_model(self, handler):
- optional_fields = set(["attempts", "params", "pipeline"])
+ optional_fields = set(["attempts", "generation_time", "params", "pipeline"])
nullable_fields = set(["region"])
serialized = handler(self)
m = {}
diff --git a/uv.lock b/uv.lock
index 276ecaff..1c4a33e4 100644
--- a/uv.lock
+++ b/uv.lock
@@ -213,7 +213,7 @@ wheels = [
[[package]]
name = "openrouter"
-version = "1.1.115"
+version = "1.1.116"
source = { editable = "." }
dependencies = [
{ name = "httpcore" },