diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock
index 4e2dd7c8..d041f3fe 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: 452e1055556eec501195014bd75a3c22
+ docChecksum: 95383b0ddad197d268ba1153f2f2e4ac
docVersion: 1.0.0
speakeasyVersion: 1.803.2
generationVersion: 2.950.13
- releaseVersion: 1.3.116
- configChecksum: 12d0806258f97aa170fa86a6cf41b413
+ releaseVersion: 1.3.117
+ configChecksum: 96082336ac2d9236df4af3f864ee5811
repoURL: https://github.com/OpenRouterTeam/python-sdk.git
installationURL: https://github.com/OpenRouterTeam/python-sdk.git
published: true
persistentEdits:
- generation_id: 7ac9f659-1030-4ae5-ab75-15cc79b6e4be
- pristine_commit_hash: 24349cc48be19d86d7793f2f6c5b72b7152238d9
- pristine_tree_hash: 448cfc8643e40fcd5971acf58edb5ea8bbcefe2c
+ generation_id: dace6193-591e-4ce2-bd40-68df98115bc6
+ pristine_commit_hash: 22eea323a506c5839fad8f72ab27cc0acb0e5a9e
+ pristine_tree_hash: 02806f8bbb737175a05153a48a16ecdc60603bff
features:
python:
acceptHeaders: 3.0.0
@@ -3494,6 +3494,10 @@ trackedFiles:
id: e108f7192502
last_write_checksum: sha1:f829893f702262b25e8599c2f5d36387f9b9e564
pristine_git_object: 0f381107c5f4271335895826cb89b0791a0b80c1
+ docs/components/extractions.mdx:
+ id: da236ceb149f
+ last_write_checksum: sha1:2846e1227ba92e5057bf790c0991f97d87b88b8f
+ pristine_git_object: 23fc9184e94b5aa836b93bbc192dad8e0b9e11cb
docs/components/extractionsrequest.mdx:
id: 8e3359e7a4eb
last_write_checksum: sha1:8987945528de0f54ad1733f7017579bd36973ab3
@@ -6528,8 +6532,8 @@ trackedFiles:
pristine_git_object: fac1d15bc23e564fcd59b68b219d529aa7c73754
docs/components/perflast30mbyworkload.mdx:
id: bdcf1999b086
- last_write_checksum: sha1:3cdfcfd44c741caecd8b019b69c722657f6d2357
- pristine_git_object: fcb436a59cdf2141af66cd93d61523ca60f8aaa5
+ last_write_checksum: sha1:d1956f61e410baccf86d1c75d58f87924921b0f5
+ pristine_git_object: c982aa4d83a2a70e3be3b760ec020c872e6c84e8
docs/components/perrequestlimits.mdx:
id: a503880c4645
last_write_checksum: sha1:f038145f0a077c2365411be7f10e24ef5d01dbf3
@@ -10736,8 +10740,8 @@ trackedFiles:
pristine_git_object: 3e38f1a929f7d6b1d6de74604aa87e3d8f010544
pyproject.toml:
id: 5d07e7d72637
- last_write_checksum: sha1:c51519f1a187953b954442b1da79c68bb6f1c608
- pristine_git_object: c34d41ff23c1dc2226feb30589a4f74edef99be4
+ last_write_checksum: sha1:946021496d5727019dc93e7907e337238722e41f
+ pristine_git_object: 4b565ff4bb5387f97f90d3378968ac132e503362
scripts/prepare_readme.py:
id: e0c5957a6035
last_write_checksum: sha1:77f44b60b98bc126557ec27391f91dfba764bb54
@@ -10764,8 +10768,8 @@ trackedFiles:
pristine_git_object: 86713cfea633e09d33b3d4e65281071fe20e6137
src/openrouter/_version.py:
id: d8d15ad6c586
- last_write_checksum: sha1:ac351c964be59b264a12e7359dd722c0f6cb2b99
- pristine_git_object: 181da576a78c74b7b9f53e80ff5009d6d9fe9016
+ last_write_checksum: sha1:ab6e636715011ab95364bc38d10a0c7fbea83f4f
+ pristine_git_object: e7ab1c303f4e344fb9f4e9e75ccb0377fdff7aed
src/openrouter/alpha.py:
id: 306c4d93308d
last_write_checksum: sha1:80cc0f39649445431cc2247ed0e0765438467766
@@ -10812,8 +10816,8 @@ trackedFiles:
pristine_git_object: ad3d247954547814054c01989a2dff3d12b3e4e1
src/openrouter/components/__init__.py:
id: 81754e97b3f4
- last_write_checksum: sha1:c407570957aec483d10f0ce582a20266ef185e84
- pristine_git_object: 152d21f436d992456f943776b75fcfa1ace12b24
+ last_write_checksum: sha1:826a7a0748e402467b31cfa1ac634c41e46675b1
+ pristine_git_object: 921a7b3387d1f787124a1f2b373a1d82409ad6d3
src/openrouter/components/aabenchmarkentry.py:
id: e2e0f0b48c82
last_write_checksum: sha1:fab4d9a24d2cea937bb749d46c5f83941e99d65c
@@ -12222,6 +12226,10 @@ trackedFiles:
id: 1529d36e4196
last_write_checksum: sha1:0c2cde20943acaa47d3a6aef845cff1c1d6dfeb1
pristine_git_object: 1823b0109214ebfbe1fa1a29581594beb30c4280
+ src/openrouter/components/extractions.py:
+ id: bac1d32b9a35
+ last_write_checksum: sha1:9f64b52acfa4ee9d47f34c7a4d9a602b56176a33
+ pristine_git_object: fbca5fed6e794e9694c201eab04a5bd8887d620a
src/openrouter/components/extractionsrequest.py:
id: afe9f8e432cb
last_write_checksum: sha1:7ecc86ff4567e55b10a36d9e098147628f126d26
@@ -13348,8 +13356,8 @@ trackedFiles:
pristine_git_object: d4fad42e2a9de3a69093e54375086c2e23854ee0
src/openrouter/components/perflast30mbyworkload.py:
id: c577beb06381
- last_write_checksum: sha1:b5d22f0aae68222d51270213f2726083be515ede
- pristine_git_object: 98d5725c977ffb944f7f649e61ab86c3e96bbcf8
+ last_write_checksum: sha1:d5f71819308c82ca08c98ef34189b6e1584c761a
+ pristine_git_object: 2ec669dd657b2f79ed46e97d19c7ce631d2c1815
src/openrouter/components/perrequestlimits.py:
id: 5a170d7d1f2e
last_write_checksum: sha1:9b269bd87a1f704a0f0fa731da57cb35bc960674
@@ -19832,4 +19840,5 @@ examples:
examplesVersion: 1.0.2
releaseNotes: |
## Python SDK Changes:
- * `open_router.generations.get_generation()`: `response.data.api_type.enum(tools_invoke)` **Added**
+ * `open_router.endpoints.list_zdr_endpoints()`: `response.data[].perf_last_30m_by_workload.extractions` **Added**
+ * `open_router.endpoints.list()`: `response.data.endpoints[].perf_last_30m_by_workload.extractions` **Added**
diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml
index 59562514..98940ed0 100644
--- a/.speakeasy/gen.yaml
+++ b/.speakeasy/gen.yaml
@@ -37,7 +37,7 @@ generation:
documentation: mintlify
preApplyUnionDiscriminators: true
python:
- version: 1.3.116
+ version: 1.3.117
additionalDependencies:
dev:
pytest: '>=8.3'
diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml
index 2187e75a..577696e8 100644
--- a/.speakeasy/out.openapi.yaml
+++ b/.speakeasy/out.openapi.yaml
@@ -12565,6 +12565,26 @@ components:
required:
- 'type'
type: 'object'
+ Extractions:
+ properties:
+ latency:
+ allOf:
+ - $ref: '#/components/schemas/PercentileStats'
+ - description: 'Latency percentiles in milliseconds for this workload. Image and video generation report full end-to-end generation time, because their raw latency only measures request acknowledgement; every other workload reports time to first token or result.'
+ request_count:
+ description: 'Total requests admitted for this workload in the window.'
+ type:
+ - 'integer'
+ - 'null'
+ throughput:
+ allOf:
+ - $ref: '#/components/schemas/PercentileStats'
+ - description: 'Throughput percentiles in tokens per second; pN is the speed that N% of requests reached or exceeded, so p90 is lower than p50. Only meaningful for text generation; null for workloads without token throughput.'
+ required:
+ - 'latency'
+ - 'throughput'
+ - 'request_count'
+ type: 'object'
ExtractionsRequest:
additionalProperties: false
properties:
@@ -26458,6 +26478,8 @@ components:
$ref: '#/components/schemas/Decisions'
embeddings:
$ref: '#/components/schemas/Embeddings'
+ extractions:
+ $ref: '#/components/schemas/Extractions'
image_generation:
$ref: '#/components/schemas/ImageGeneration'
rerank:
diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock
index a2175bc7..2a155243 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:0e16f10900f4e9cc6a15ff0e95d2fca5e9f196a756c287fc89ad67c60819fe0d
- sourceBlobDigest: sha256:b041922228f44003c8df41e05c55f893a3b0906e27b140b67ed703c67469efc8
+ sourceRevisionDigest: sha256:0aaafeea58daa417ec936f5d70e15b85e4c403eb26936157963615c4c068e5cd
+ sourceBlobDigest: sha256:6e78f4335a4d0eb14a07db01a557dbaed1607d4c8064042d59cfbb69c946f473
tags:
- latest
- 1.0.0
@@ -11,10 +11,10 @@ targets:
open-router:
source: OpenRouter API
sourceNamespace: open-router-chat-completions-api
- sourceRevisionDigest: sha256:0e16f10900f4e9cc6a15ff0e95d2fca5e9f196a756c287fc89ad67c60819fe0d
- sourceBlobDigest: sha256:b041922228f44003c8df41e05c55f893a3b0906e27b140b67ed703c67469efc8
+ sourceRevisionDigest: sha256:0aaafeea58daa417ec936f5d70e15b85e4c403eb26936157963615c4c068e5cd
+ sourceBlobDigest: sha256:6e78f4335a4d0eb14a07db01a557dbaed1607d4c8064042d59cfbb69c946f473
codeSamplesNamespace: open-router-python-code-samples
- codeSamplesRevisionDigest: sha256:99a7834dc58f7178de521ea682f89ed6afa32e2512c33246d1f881e1b122d419
+ codeSamplesRevisionDigest: sha256:f4815fcf5eeb79c459b750a886819c3be6e417740a06c690e948ba0ed9652415
workflow:
workflowVersion: 1.0.0
speakeasyVersion: 1.803.2
diff --git a/RELEASES.md b/RELEASES.md
index b4851eeb..c54d5be4 100644
--- a/RELEASES.md
+++ b/RELEASES.md
@@ -3929,4 +3929,14 @@ Based on:
### Generated
- [python v1.3.116] .
### Releases
-- [PyPI v1.3.116] https://pypi.org/project/openrouter/1.3.116 - .
\ No newline at end of file
+- [PyPI v1.3.116] https://pypi.org/project/openrouter/1.3.116 - .
+
+## 2026-11-04 16:38:32
+### Changes
+Based on:
+- OpenAPI Doc
+- Speakeasy CLI 1.803.2 (2.950.13) https://github.com/speakeasy-api/speakeasy
+### Generated
+- [python v1.3.117] .
+### Releases
+- [PyPI v1.3.117] https://pypi.org/project/openrouter/1.3.117 - .
\ No newline at end of file
diff --git a/docs/components/extractions.mdx b/docs/components/extractions.mdx
new file mode 100644
index 00000000..23fc9184
--- /dev/null
+++ b/docs/components/extractions.mdx
@@ -0,0 +1,11 @@
+---
+title: "Extractions"
+---
+
+## Fields
+
+| Field | Type | Required | Description | Example |
+| ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ |
+| `latency` | [Nullable[components.PercentileStats]](../components/percentilestats.mdx) | ✔️ | N/A | \{
"p50": 25.5,
"p75": 35.2,
"p90": 48.7,
"p99": 85.3
} |
+| `request_count` | *Nullable[int]* | ✔️ | Total requests admitted for this workload in the window. | |
+| `throughput` | [Nullable[components.PercentileStats]](../components/percentilestats.mdx) | ✔️ | N/A | \{
"p50": 25.5,
"p75": 35.2,
"p90": 48.7,
"p99": 85.3
} |
\ No newline at end of file
diff --git a/docs/components/perflast30mbyworkload.mdx b/docs/components/perflast30mbyworkload.mdx
index fcb436a5..c982aa4d 100644
--- a/docs/components/perflast30mbyworkload.mdx
+++ b/docs/components/perflast30mbyworkload.mdx
@@ -11,6 +11,7 @@ Endpoint performance over the last 30 minutes, keyed by the kind of request serv
| ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ |
| `decisions` | [Optional[components.Decisions]](../components/decisions.mdx) | ➖ | N/A |
| `embeddings` | [Optional[components.Embeddings]](../components/embeddings.mdx) | ➖ | N/A |
+| `extractions` | [Optional[components.Extractions]](../components/extractions.mdx) | ➖ | N/A |
| `image_generation` | [Optional[components.ImageGeneration]](../components/imagegeneration.mdx) | ➖ | N/A |
| `rerank` | [Optional[components.Rerank]](../components/rerank.mdx) | ➖ | N/A |
| `stt` | [Optional[components.STT]](../components/stt.mdx) | ➖ | N/A |
diff --git a/pyproject.toml b/pyproject.toml
index c34d41ff..4b565ff4 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "openrouter"
-version = "1.3.116"
+version = "1.3.117"
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 181da576..e7ab1c30 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.116"
+__version__: str = "1.3.117"
__openapi_doc_version__: str = "1.0.0"
__gen_version__: str = "2.950.13"
-__user_agent__: str = "speakeasy-sdk/python 1.3.116 2.950.13 1.0.0 openrouter"
+__user_agent__: str = "speakeasy-sdk/python 1.3.117 2.950.13 1.0.0 openrouter"
try:
if __package__ is not None:
diff --git a/src/openrouter/components/__init__.py b/src/openrouter/components/__init__.py
index 152d21f4..921a7b33 100644
--- a/src/openrouter/components/__init__.py
+++ b/src/openrouter/components/__init__.py
@@ -1963,6 +1963,7 @@
ExtractionNumberFieldType,
ExtractionNumberFieldTypedDict,
)
+ from .extractions import Extractions, ExtractionsTypedDict
from .extractionsrequest import (
ExtractionsRequest,
ExtractionsRequestTypedDict,
@@ -6073,12 +6074,14 @@
"ExtractionTimeField",
"ExtractionTimeFieldType",
"ExtractionTimeFieldTypedDict",
+ "Extractions",
"ExtractionsRequest",
"ExtractionsRequestTypedDict",
"ExtractionsResponse",
"ExtractionsResponseAnswers",
"ExtractionsResponseAnswersTypedDict",
"ExtractionsResponseTypedDict",
+ "ExtractionsTypedDict",
"ExtractionsUsage",
"ExtractionsUsageTypedDict",
"FailableToolCallStatus",
@@ -9567,6 +9570,8 @@
"ExtractionNumberField": ".extractionnumberfield",
"ExtractionNumberFieldType": ".extractionnumberfield",
"ExtractionNumberFieldTypedDict": ".extractionnumberfield",
+ "Extractions": ".extractions",
+ "ExtractionsTypedDict": ".extractions",
"ExtractionsRequest": ".extractionsrequest",
"ExtractionsRequestTypedDict": ".extractionsrequest",
"Fields": ".extractionsrequest",
diff --git a/src/openrouter/components/extractions.py b/src/openrouter/components/extractions.py
new file mode 100644
index 00000000..fbca5fed
--- /dev/null
+++ b/src/openrouter/components/extractions.py
@@ -0,0 +1,37 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from .percentilestats import PercentileStats, PercentileStatsTypedDict
+from openrouter.types import BaseModel, Nullable, UNSET_SENTINEL
+from pydantic import model_serializer
+from typing_extensions import TypedDict
+
+
+class ExtractionsTypedDict(TypedDict):
+ latency: Nullable[PercentileStatsTypedDict]
+ request_count: Nullable[int]
+ r"""Total requests admitted for this workload in the window."""
+ throughput: Nullable[PercentileStatsTypedDict]
+
+
+class Extractions(BaseModel):
+ latency: Nullable[PercentileStats]
+
+ request_count: Nullable[int]
+ r"""Total requests admitted for this workload in the window."""
+
+ throughput: Nullable[PercentileStats]
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ 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))
+
+ if val != UNSET_SENTINEL:
+ m[k] = val
+
+ return m
diff --git a/src/openrouter/components/perflast30mbyworkload.py b/src/openrouter/components/perflast30mbyworkload.py
index 98d5725c..2ec669dd 100644
--- a/src/openrouter/components/perflast30mbyworkload.py
+++ b/src/openrouter/components/perflast30mbyworkload.py
@@ -3,6 +3,7 @@
from __future__ import annotations
from .decisions import Decisions, DecisionsTypedDict
from .embeddings import Embeddings, EmbeddingsTypedDict
+from .extractions import Extractions, ExtractionsTypedDict
from .imagegeneration import ImageGeneration, ImageGenerationTypedDict
from .rerank import Rerank, RerankTypedDict
from .stt import STT, STTTypedDict
@@ -21,6 +22,7 @@ class PerfLast30mByWorkloadTypedDict(TypedDict):
decisions: NotRequired[DecisionsTypedDict]
embeddings: NotRequired[EmbeddingsTypedDict]
+ extractions: NotRequired[ExtractionsTypedDict]
image_generation: NotRequired[ImageGenerationTypedDict]
rerank: NotRequired[RerankTypedDict]
stt: NotRequired[STTTypedDict]
@@ -37,6 +39,8 @@ class PerfLast30mByWorkload(BaseModel):
embeddings: Optional[Embeddings] = None
+ extractions: Optional[Extractions] = None
+
image_generation: Optional[ImageGeneration] = None
rerank: Optional[Rerank] = None
@@ -57,6 +61,7 @@ def serialize_model(self, handler):
[
"decisions",
"embeddings",
+ "extractions",
"image_generation",
"rerank",
"stt",
diff --git a/uv.lock b/uv.lock
index ccb122fe..dd0c0f03 100644
--- a/uv.lock
+++ b/uv.lock
@@ -231,7 +231,7 @@ wheels = [
[[package]]
name = "openrouter"
-version = "1.3.116"
+version = "1.3.117"
source = { editable = "." }
dependencies = [
{ name = "httpcore" },