From e3f29a566f3478e532860662d6ff65a98b7dd171 Mon Sep 17 00:00:00 2001 From: speakeasybot Date: Wed, 4 Nov 2026 16:41:09 +0000 Subject: [PATCH 1/2] ## Python SDK Changes: * `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** --- .speakeasy/gen.lock | 43 +++++++++++-------- .speakeasy/gen.yaml | 2 +- .speakeasy/out.openapi.yaml | 22 ++++++++++ .speakeasy/workflow.lock | 10 ++--- RELEASES.md | 12 +++++- docs/components/extractions.mdx | 11 +++++ docs/components/perflast30mbyworkload.mdx | 1 + pyproject.toml | 2 +- src/openrouter/_version.py | 4 +- src/openrouter/components/__init__.py | 5 +++ src/openrouter/components/extractions.py | 37 ++++++++++++++++ .../components/perflast30mbyworkload.py | 5 +++ uv.lock | 2 +- 13 files changed, 128 insertions(+), 28 deletions(-) create mode 100644 docs/components/extractions.mdx create mode 100644 src/openrouter/components/extractions.py 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" }, From 8017745f27a8d19924fe60e26c1058298bdc3a31 Mon Sep 17 00:00:00 2001 From: "speakeasy-github[bot]" <128539517+speakeasy-github[bot]@users.noreply.github.com> Date: Wed, 4 Nov 2026 16:41:19 +0000 Subject: [PATCH 2/2] empty commit to trigger [run-tests] workflow