From 90278a045ee9ea9fb4c9085005f33ebb495e4238 Mon Sep 17 00:00:00 2001 From: speakeasybot Date: Fri, 13 Nov 2026 20:57:51 +0000 Subject: [PATCH 1/2] ## Python SDK Changes: * `open_router.alpha.decisions.create()`: `request.provider` **Changed** * `open_router.alpha.extractions.create()`: `request.provider` **Changed** * `open_router.tts.create_speech()`: `request.provider` **Changed** * `open_router.stt.create_transcription()`: `request.provider` **Changed** * `open_router.batch.create_batches()`: * `request.provider.only[].union(ProviderName).enum(doubleword)` **Added** * `response.results[].response.body` **Changed** * `open_router.batch.get_batches()`: `response.results[].response.body` **Changed** * `open_router.byok.list()`: * `request.provider` **Changed** * `response.data[].provider.enum(doubleword)` **Added** * `open_router.byok.create()`: * `request.provider.enum(doubleword)` **Added** * `response.data.provider.enum(doubleword)` **Added** * `open_router.byok.get()`: `response.data.provider.enum(doubleword)` **Added** * `open_router.byok.update()`: `response.data.provider.enum(doubleword)` **Added** * `open_router.embeddings.generate()`: `request.provider` **Changed** * `open_router.endpoints.list_zdr_endpoints()`: `response.data[].provider_name.enum(doubleword)` **Added** * `open_router.endpoints.list()`: `response.data.endpoints[].provider_name.enum(doubleword)` **Added** * `open_router.generations.get_generation()`: `response.data.provider_responses[].provider_name.enum(doubleword)` **Added** * `open_router.presets.create_presets_chat_completions()`: `request.provider` **Changed** * `open_router.presets.create_presets_messages()`: `request.provider` **Changed** * `open_router.presets.create_presets_responses()`: `request` **Changed** * `open_router.rerank.rerank()`: `request.provider` **Changed** * `open_router.system_one.create()`: `request.provider` **Changed** * `open_router.video_generation.generate()`: `request.provider` **Changed** --- .speakeasy/gen.lock | 93 ++++++++++--------- .speakeasy/gen.yaml | 2 +- .speakeasy/out.openapi.yaml | 14 +++ .speakeasy/workflow.lock | 10 +- RELEASES.md | 12 ++- docs/components/batchobjecturlcitation.mdx | 15 +-- docs/components/byokproviderslug.mdx | 1 + ...gegenerationproviderpreferencesoptions.mdx | 1 + docs/components/providername.mdx | 1 + docs/components/provideroptions.mdx | 1 + .../providerresponseprovidername.mdx | 1 + docs/components/urlcitation.mdx | 1 + .../videogenerationrequestoptions.mdx | 1 + docs/operations/provider.mdx | 1 + pyproject.toml | 2 +- src/openrouter/_version.py | 4 +- src/openrouter/components/batchobject.py | 15 ++- src/openrouter/components/byokproviderslug.py | 1 + .../imagegenerationproviderpreferences.py | 4 + src/openrouter/components/providername.py | 1 + src/openrouter/components/provideroptions.py | 4 + src/openrouter/components/providerresponse.py | 1 + src/openrouter/components/urlcitation.py | 19 +++- .../components/videogenerationrequest.py | 4 + src/openrouter/operations/listbyokkeys.py | 1 + uv.lock | 2 +- 26 files changed, 144 insertions(+), 68 deletions(-) diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 14cdb4e1a..a13e69fb2 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: eb8e9f9d157a42d00633fc63deb707ad + docChecksum: 8cf317d71b4a1b0db5e2ec826b2d66c9 docVersion: 1.0.0 speakeasyVersion: 1.803.2 generationVersion: 2.950.13 - releaseVersion: 1.3.176 - configChecksum: 2a524dcaa78f10648130b015209494d6 + releaseVersion: 1.3.177 + configChecksum: 322aaeaf32dbc731ba33698273262c37 repoURL: https://github.com/OpenRouterTeam/python-sdk.git installationURL: https://github.com/OpenRouterTeam/python-sdk.git published: true persistentEdits: - generation_id: 381ec90e-776b-4251-88d6-487f6e9f3f63 - pristine_commit_hash: 7150701a209851d884acc474a657e2149dcc5b0a - pristine_tree_hash: fc6cdede6451388cb578c2612b4d8bb9e6d12942 + generation_id: ab02408d-8eb2-499a-abd6-b5833ab6f5d5 + pristine_commit_hash: cfa96fbf31ab661fcf7f9d577099e9021f5a5f43 + pristine_tree_hash: 9d807a3e3e7c36b3e738e02e1d2f7e46a1498c1b features: python: acceptHeaders: 3.0.0 @@ -1640,8 +1640,8 @@ trackedFiles: pristine_git_object: 25bd6ec281e6dcf5b48689f2100c7f9d4f56d515 docs/components/batchobjecturlcitation.mdx: id: 8caab1acc6ba - last_write_checksum: sha1:c0c7a79f927cc1714d4531f78052025c88bd9e04 - pristine_git_object: 9f1e956bcb8f884ba5a85e79f0c20090452eefc1 + last_write_checksum: sha1:8d048e64999cd5caeb6e02a757ce845be876ab7c + pristine_git_object: 293c96b5e3a21e18d8db1a508ca724659806adf0 docs/components/batchobjectusage.mdx: id: eb710c8f044a last_write_checksum: sha1:ab3efbc4596bc00eac51a627189fa5c58ee87a0c @@ -1900,8 +1900,8 @@ trackedFiles: pristine_git_object: a00676abb210aeb3747aa6d6a0dfbe3e3ad42f76 docs/components/byokproviderslug.mdx: id: 6ea70819f6d8 - last_write_checksum: sha1:635ba53bb204df7fb2bf9b1eca1e271704a28599 - pristine_git_object: 0022fbc19d4450c877ac735b640ea21d2b57f48a + last_write_checksum: sha1:eb605d1f2ef8c5cae38024b67c840fb971b7ebc2 + pristine_git_object: 1e442cf07d47f76db92cf0259d1c5dda913dc560 docs/components/capabilitydescriptor.mdx: id: 34ac0e581d79 last_write_checksum: sha1:62ee9ccab6cec4572383cef654997ab4106d4676 @@ -4380,8 +4380,8 @@ trackedFiles: pristine_git_object: 11f1471c8b6c04f52af89d74d6dec2e9d12c2d82 docs/components/imagegenerationproviderpreferencesoptions.mdx: id: 32d5c4b3e06b - last_write_checksum: sha1:640c2b0ec6dc8fc5aeaa7bf968956414c24550d7 - pristine_git_object: ee4487a0d1dfa4a20f0ba1590ff4797ced591999 + last_write_checksum: sha1:21a79bc26015b055e2d1b608de756af543dfeda5 + pristine_git_object: 926c7ac71588d8ef797df1b3eb0e25cb4a04aea6 docs/components/imagegenerationproviderpreferencesorder.mdx: id: 0547877073f3 last_write_checksum: sha1:3e890c691097373cc9a2d7e47c3594f56b57809c @@ -7408,12 +7408,12 @@ trackedFiles: pristine_git_object: 70dcf1b583a3d202157814d8bd4f3c8f7811d0d9 docs/components/providername.mdx: id: aa3a4904b228 - last_write_checksum: sha1:cbbfc14b2bc16e1987871f1b445095dec5cfb0d1 - pristine_git_object: 81c36a61106666678a00828c1ed2dfcebef72355 + last_write_checksum: sha1:d5c4cada67ee5ba3fcd6f04de81ed6132c08a8d7 + pristine_git_object: ca3deae5f66f2696ebb649c197187ffef23f31c2 docs/components/provideroptions.mdx: id: 2697807524fe - last_write_checksum: sha1:29b4f9476dd82d3dbc66518721e87ec544fb9983 - pristine_git_object: 1e1b0839c0ce9a4ee247e02667cf34192e781ad2 + last_write_checksum: sha1:bb0411a7915023243141f5217e3dc7b181624fd3 + pristine_git_object: 33e1ffc476d7008d4bbba46ae6029d5452a05f9b docs/components/provideroverloadedresponseerrordata.mdx: id: dc500cd14889 last_write_checksum: sha1:335ee4c9c2421a71205eb08871f1041cbe0c1fa7 @@ -7444,8 +7444,8 @@ trackedFiles: pristine_git_object: 15c816ec62505e984cc75801bdb88cf4271ab934 docs/components/providerresponseprovidername.mdx: id: 2fc17b61e546 - last_write_checksum: sha1:226443a4e3632e606752c4177ecb32e26d403eab - pristine_git_object: 247c68279d5b0728439c440a9e196c3290ff5060 + last_write_checksum: sha1:ae9a3bc67f7b85e712f3905f0ffc6e4aac1470d1 + pristine_git_object: 1f46e74794fd091a413d12583b2a4b46627500df docs/components/providersort.mdx: id: d73fa13eeb95 last_write_checksum: sha1:b7e9e6842741e3433d705bd576f2ac5383f00134 @@ -9084,8 +9084,8 @@ trackedFiles: pristine_git_object: c160d44a664da23d464bb6d1a0ad46530bf2688d docs/components/urlcitation.mdx: id: 30f4b4a19fd8 - last_write_checksum: sha1:f528b76162ed13ed25901c9b23933f7aae6e1f58 - pristine_git_object: d791d72f3fe9affad670e76a13b1d42f7bd8949d + last_write_checksum: sha1:d7402b3d2a693d21ea4152fe321b9c8c597c7f35 + pristine_git_object: d24fab7b2928c95b412a90e5cd9307f1186f9bd8 docs/components/urlcitationtype.mdx: id: 65cf0df11d05 last_write_checksum: sha1:e0462d6e3d3b4d7772f765fd19b8c58f16d229b5 @@ -9196,8 +9196,8 @@ trackedFiles: pristine_git_object: d8c6c0f20ce631b8daf4ba53a722b532f75b139f docs/components/videogenerationrequestoptions.mdx: id: 1d67160e7e7a - last_write_checksum: sha1:ce0a8dde2b45a20c86badbcacb57250042710e1f - pristine_git_object: 8fed95aae2f72dac389d6fa6874daccdf6e2556e + last_write_checksum: sha1:3c0550d0983b7febb0ce8d30599c0287d24e4b86 + pristine_git_object: 6c8f8fd97840bcabb6d810ecec0fb17caaf4afb8 docs/components/videogenerationrequestorder.mdx: id: 4daf6f446396 last_write_checksum: sha1:e991c58b11c19acbd8a2d0416564380cedb42b94 @@ -11204,8 +11204,8 @@ trackedFiles: pristine_git_object: edbbce3632fff19ba4cbd2677b6766805eaca140 docs/operations/provider.mdx: id: c75b3bbeeaa0 - last_write_checksum: sha1:7213591ff965703e86229745508ff4830fe10ea8 - pristine_git_object: bdc3629b11922fcd8c12f1db4833645072b433b8 + last_write_checksum: sha1:d95939dd0a1bc8a639c6c169ebd932b9fcbecd2d + pristine_git_object: 6f848f7c92b28f1a8be038f76bb068902eb30080 docs/operations/queryanalyticsdata1.mdx: id: 0e41beea77d0 last_write_checksum: sha1:f9a349b4fee07f786180e94b45f92002bfae0e56 @@ -11672,8 +11672,8 @@ trackedFiles: pristine_git_object: 3e38f1a929f7d6b1d6de74604aa87e3d8f010544 pyproject.toml: id: 5d07e7d72637 - last_write_checksum: sha1:c565d988d5efdfbbb0033c40b6026797f30a7dc0 - pristine_git_object: 429656dd363d9dfb4f2c213ad5906aeeb75587fe + last_write_checksum: sha1:753e5b5f275a13012d1ff86244931029bc14acb9 + pristine_git_object: 6a377642bead046ca9a0f2084a4279cfdd9ace1c scripts/prepare_readme.py: id: e0c5957a6035 last_write_checksum: sha1:77f44b60b98bc126557ec27391f91dfba764bb54 @@ -11700,8 +11700,8 @@ trackedFiles: pristine_git_object: 86713cfea633e09d33b3d4e65281071fe20e6137 src/openrouter/_version.py: id: d8d15ad6c586 - last_write_checksum: sha1:f19bffdd9a421ef005f872f637f38db2a86213cd - pristine_git_object: bc1e5866a1d9cf0d54847db43271eedf5b6409de + last_write_checksum: sha1:562fffcf8f16471e0edab7a593f188b42b38c605 + pristine_git_object: d0b0886a1f7ca70821daf6b653af631849fc126f src/openrouter/alpha.py: id: 306c4d93308d last_write_checksum: sha1:80cc0f39649445431cc2247ed0e0765438467766 @@ -12424,8 +12424,8 @@ trackedFiles: pristine_git_object: 8650957337063ba3aef94341108448ec19bd2945 src/openrouter/components/batchobject.py: id: caf1ef2414a3 - last_write_checksum: sha1:9d357c764f127712625be689a6cd47079e42ca40 - pristine_git_object: 095d7319fae618f2f40281f5449d30df455903f4 + last_write_checksum: sha1:de50b64da94b208a7e672fa2a5c453d8a9da2748 + pristine_git_object: b5b450e1fea6e05672d3f9e945141c8b41307bfb src/openrouter/components/batchoutputreference.py: id: 7790c9506cde last_write_checksum: sha1:977b0911254e1afafbd5b7235fedaefbe7417514 @@ -12528,8 +12528,8 @@ trackedFiles: pristine_git_object: 4ba4656e16f5facd3f4d292615d8afcde5a24e2a src/openrouter/components/byokproviderslug.py: id: 6738a8516caf - last_write_checksum: sha1:29e2c8fcf7a702d61841251d27165a3a54bb6a48 - pristine_git_object: 4467d74f054b7939752e9dfe9a9991d1f5ada7af + last_write_checksum: sha1:df4b33a42c55668a5a597bc7377580c576f55375 + pristine_git_object: a9ec45c5665469eadd80041cbc4a45b9ff63f0e9 src/openrouter/components/capabilitydescriptor.py: id: 368790a86f10 last_write_checksum: sha1:a167551924ee82b4b5876a0ab698a45fe8c87a95 @@ -13592,8 +13592,8 @@ trackedFiles: pristine_git_object: 9cb42cff16d478f29066a6e09d32ea9d7bfe41db src/openrouter/components/imagegenerationproviderpreferences.py: id: 100a82a54e2d - last_write_checksum: sha1:9c14ec41b48270241d5a56433c93aa6da5bcc691 - pristine_git_object: eada8cbd414a2f6a2180405fc5f6af65b8e371a9 + last_write_checksum: sha1:3916197667f06a01db3a0fef7fb5056668a6ed4d + pristine_git_object: 5cb638e837ab1104bcf51868cc99689f80812271 src/openrouter/components/imagegenerationrequest.py: id: f8291a7be9a0 last_write_checksum: sha1:b5a0451d85f0f64de10999d53003ec2ae012311d @@ -14704,12 +14704,12 @@ trackedFiles: pristine_git_object: 170ae25c582bb8decd74e1c69bfa8353bd44e86d src/openrouter/components/providername.py: id: fcc722fa2fce - last_write_checksum: sha1:0711e1f1266d409e88cafd41fee1dab0607bb85a - pristine_git_object: 34c1f41533f43a8b04300a3ddb768aaa98eeffaa + last_write_checksum: sha1:46f5844b46e3f0f6c43e6f18abea1aa9ef004cbb + pristine_git_object: 6d2f79e556af65c6ea36830c02a1ddf04b9c652f src/openrouter/components/provideroptions.py: id: 73dde6c8f359 - last_write_checksum: sha1:85cc5dd044170e1ce67b16a4627d1a0bf2b83bf7 - pristine_git_object: a0aac8bdeec07abd87394f1fb4afd96ffe79aae5 + last_write_checksum: sha1:6924f04341e17695901479e2899bd60a9f498b84 + pristine_git_object: c580deb04f673d4e928baf0d5871e79acae6232b src/openrouter/components/provideroverloadedresponseerrordata.py: id: 5b693682570e last_write_checksum: sha1:b54682560ff95dad18d26f9aaf887f8f6e0e1f71 @@ -14720,8 +14720,8 @@ trackedFiles: pristine_git_object: 3ca57868fa02b7f5e4cd2c0fb0fbf0c6a92a8bee src/openrouter/components/providerresponse.py: id: ad3887be54c5 - last_write_checksum: sha1:aa8d3502d72cd3faa2af440e6b1a033af6751c8c - pristine_git_object: b8f6c6ec9448a3c7e47aa9d7e8210a030b32da70 + last_write_checksum: sha1:9946c8b0406ef83e01ebe425f2b51fe4760b8807 + pristine_git_object: 8cd27810fb8001c4cf058142041a028f01891f61 src/openrouter/components/providersort.py: id: 348e382bf494 last_write_checksum: sha1:57551507f95cd2e16ef995e1c13f859fd0726152 @@ -15420,8 +15420,8 @@ trackedFiles: pristine_git_object: b241c9d925f243e424d51b32caf0871bc8a64b97 src/openrouter/components/urlcitation.py: id: fe4578e64ea3 - last_write_checksum: sha1:6c7d8e616c55f8239c7bf46ebf237fa536b6c462 - pristine_git_object: a0491cc8fd3bd9986146cb1176e27d5b9c9beb60 + last_write_checksum: sha1:35db471bdcacc6cbe774c404cdf9e70eaf55b210 + pristine_git_object: 7161b61827cfd4cce43acabb275070d3045354b0 src/openrouter/components/validateprivateendpointrequest.py: id: 5d2f6ca184f7 last_write_checksum: sha1:c638d9e565e13e3ac2e2e5630aec9e4a4487d303 @@ -15468,8 +15468,8 @@ trackedFiles: pristine_git_object: c2f15eb53f14024dfd1e620c52a564bf4682854f src/openrouter/components/videogenerationrequest.py: id: 70e3c9ff288c - last_write_checksum: sha1:aeb065fbdf51c913165831efcd6db7fa25b9bff7 - pristine_git_object: f5f1d6daab8935e332748014378eb8f11574ecf4 + last_write_checksum: sha1:123b776671c5cec04d0e334859b16c1ee0fd6983 + pristine_git_object: a096e2ea2187b819a61acee3b2fa526478512530 src/openrouter/components/videogenerationresponse.py: id: 541f1321b072 last_write_checksum: sha1:6ba68c4551af144f37be940f0222f434d156e275 @@ -16208,8 +16208,8 @@ trackedFiles: pristine_git_object: 40c8b5cfeb97707548889ada0c049b5d1b739b17 src/openrouter/operations/listbyokkeys.py: id: b6dd42b3e05f - last_write_checksum: sha1:7f9a5cff56c58e33e6767a7e68c153ca5d1dcf15 - pristine_git_object: 5ad79207c444e7dd91611514b541a6243ee9812f + last_write_checksum: sha1:4d04ac1e66047d758cbbff093a6fd4ae4186a9af + pristine_git_object: f60840be0306481202bf77c46c15730f7a7c666c src/openrouter/operations/listcontainerfiles.py: id: 7a30b9291c76 last_write_checksum: sha1:937c9fb30fd651d28793340285b3389518b26d96 @@ -21709,3 +21709,4 @@ examples: "500": application/json: {"error": {"code": 500, "message": "Internal Server Error"}} examplesVersion: 1.0.2 +releaseNotes: "## Python SDK Changes:\n* `open_router.alpha.decisions.create()`: `request.provider` **Changed**\n* `open_router.alpha.extractions.create()`: `request.provider` **Changed**\n* `open_router.tts.create_speech()`: `request.provider` **Changed**\n* `open_router.stt.create_transcription()`: `request.provider` **Changed**\n* `open_router.batch.create_batches()`: \n * `request.provider.only[].union(ProviderName).enum(doubleword)` **Added**\n * `response.results[].response.body` **Changed**\n* `open_router.batch.get_batches()`: `response.results[].response.body` **Changed**\n* `open_router.byok.list()`: \n * `request.provider` **Changed**\n * `response.data[].provider.enum(doubleword)` **Added**\n* `open_router.byok.create()`: \n * `request.provider.enum(doubleword)` **Added**\n * `response.data.provider.enum(doubleword)` **Added**\n* `open_router.byok.get()`: `response.data.provider.enum(doubleword)` **Added**\n* `open_router.byok.update()`: `response.data.provider.enum(doubleword)` **Added**\n* `open_router.embeddings.generate()`: `request.provider` **Changed**\n* `open_router.endpoints.list_zdr_endpoints()`: `response.data[].provider_name.enum(doubleword)` **Added**\n* `open_router.endpoints.list()`: `response.data.endpoints[].provider_name.enum(doubleword)` **Added**\n* `open_router.generations.get_generation()`: `response.data.provider_responses[].provider_name.enum(doubleword)` **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.presets.create_presets_responses()`: `request` **Changed**\n* `open_router.rerank.rerank()`: `request.provider` **Changed**\n* `open_router.system_one.create()`: `request.provider` **Changed**\n* `open_router.video_generation.generate()`: `request.provider` **Changed**\n" diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index e217d6e33..af8080087 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -37,7 +37,7 @@ generation: documentation: mintlify preApplyUnionDiscriminators: true python: - version: 1.3.176 + version: 1.3.177 additionalDependencies: dev: pytest: '>=8.3' diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml index 89111f62a..dd6e1e96a 100644 --- a/.speakeasy/out.openapi.yaml +++ b/.speakeasy/out.openapi.yaml @@ -5817,6 +5817,9 @@ components: type: 'integer' title: type: 'string' + uncited: + const: true + type: 'boolean' url: type: 'string' required: @@ -7582,6 +7585,7 @@ components: - 'deepseek' - 'dekallm' - 'digitalocean' + - 'doubleword' - 'elevenlabs' - 'featherless' - 'fireworks' @@ -21283,6 +21287,7 @@ components: - 'DeepSeek' - 'DekaLLM' - 'DigitalOcean' + - 'Doubleword' - 'ElevenLabs' - 'Featherless' - 'Fireworks' @@ -30752,6 +30757,7 @@ components: - 'DeepSeek' - 'DekaLLM' - 'DigitalOcean' + - 'Doubleword' - 'ElevenLabs' - 'Featherless' - 'Fireworks' @@ -30979,6 +30985,9 @@ components: digitalocean: additionalProperties: {} type: 'object' + doubleword: + additionalProperties: {} + type: 'object' elevenlabs: additionalProperties: {} type: 'object' @@ -31574,6 +31583,7 @@ components: - 'DeepSeek' - 'DekaLLM' - 'DigitalOcean' + - 'Doubleword' - 'ElevenLabs' - 'Featherless' - 'Fireworks' @@ -37787,6 +37797,9 @@ components: enum: - 'url_citation' type: 'string' + uncited: + const: true + type: 'boolean' url: type: 'string' required: @@ -42109,6 +42122,7 @@ paths: - 'deepseek' - 'dekallm' - 'digitalocean' + - 'doubleword' - 'elevenlabs' - 'featherless' - 'fireworks' diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index ec07e0d3e..1e43d3db4 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:a797bb7a158a94032272a96baf722aff118a01d2183d7e2bc2442a71c26cc67b - sourceBlobDigest: sha256:92bb573dd60cf2c61cc1a1ebc2c9fcdcf9a3c85dddc8620f04389c0287f383c4 + sourceRevisionDigest: sha256:d1f8a06e6854c9496473a1cc936d1367d1d0c1a99a6b25b835c2898e71c43a30 + sourceBlobDigest: sha256:bf5bb8bafd84d3d3b49f464c7c24b3de2e263370c59752982dd2ba0c6396c1e8 tags: - latest - 1.0.0 @@ -11,10 +11,10 @@ targets: open-router: source: OpenRouter API sourceNamespace: open-router-chat-completions-api - sourceRevisionDigest: sha256:a797bb7a158a94032272a96baf722aff118a01d2183d7e2bc2442a71c26cc67b - sourceBlobDigest: sha256:92bb573dd60cf2c61cc1a1ebc2c9fcdcf9a3c85dddc8620f04389c0287f383c4 + sourceRevisionDigest: sha256:d1f8a06e6854c9496473a1cc936d1367d1d0c1a99a6b25b835c2898e71c43a30 + sourceBlobDigest: sha256:bf5bb8bafd84d3d3b49f464c7c24b3de2e263370c59752982dd2ba0c6396c1e8 codeSamplesNamespace: open-router-python-code-samples - codeSamplesRevisionDigest: sha256:3c9bbdf03c37560246766db4670bd660c50bf2751b9476250df7d23e317ce216 + codeSamplesRevisionDigest: sha256:8db52585a58ae27624db1eb5b296ae14c6a5ee3bd9a61a0e394f5c11995fc7b1 workflow: workflowVersion: 1.0.0 speakeasyVersion: 1.803.2 diff --git a/RELEASES.md b/RELEASES.md index 0b8f61194..6f4426f00 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -4529,4 +4529,14 @@ Based on: ### Generated - [python v1.3.176] . ### Releases -- [PyPI v1.3.176] https://pypi.org/project/openrouter/1.3.176 - . \ No newline at end of file +- [PyPI v1.3.176] https://pypi.org/project/openrouter/1.3.176 - . + +## 2026-11-13 20:54:39 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.803.2 (2.950.13) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.3.177] . +### Releases +- [PyPI v1.3.177] https://pypi.org/project/openrouter/1.3.177 - . \ No newline at end of file diff --git a/docs/components/batchobjecturlcitation.mdx b/docs/components/batchobjecturlcitation.mdx index 9f1e956bc..293c96b5e 100644 --- a/docs/components/batchobjecturlcitation.mdx +++ b/docs/components/batchobjecturlcitation.mdx @@ -4,10 +4,11 @@ title: "BatchObjectURLCitation" ## Fields -| Field | Type | Required | Description | -| ------------------ | ------------------ | ------------------ | ------------------ | -| `content` | *Optional[str]* | ➖ | N/A | -| `end_index` | *int* | ✔️ | N/A | -| `start_index` | *int* | ✔️ | N/A | -| `title` | *str* | ✔️ | N/A | -| `url` | *str* | ✔️ | N/A | \ No newline at end of file +| Field | Type | Required | Description | +| ------------------------- | ------------------------- | ------------------------- | ------------------------- | +| `content` | *Optional[str]* | ➖ | N/A | +| `end_index` | *int* | ✔️ | N/A | +| `start_index` | *int* | ✔️ | N/A | +| `title` | *str* | ✔️ | N/A | +| `uncited` | *Optional[Literal[True]]* | ➖ | N/A | +| `url` | *str* | ✔️ | N/A | \ No newline at end of file diff --git a/docs/components/byokproviderslug.mdx b/docs/components/byokproviderslug.mdx index 0022fbc19..1e442cf07 100644 --- a/docs/components/byokproviderslug.mdx +++ b/docs/components/byokproviderslug.mdx @@ -56,6 +56,7 @@ This is an open enum. Unrecognized values will not fail type checks. - `"deepseek"` - `"dekallm"` - `"digitalocean"` +- `"doubleword"` - `"elevenlabs"` - `"featherless"` - `"fireworks"` diff --git a/docs/components/imagegenerationproviderpreferencesoptions.mdx b/docs/components/imagegenerationproviderpreferencesoptions.mdx index ee4487a0d..926c7ac71 100644 --- a/docs/components/imagegenerationproviderpreferencesoptions.mdx +++ b/docs/components/imagegenerationproviderpreferencesoptions.mdx @@ -53,6 +53,7 @@ Provider-specific options keyed by provider slug. The provider segment is case-i | `deepseek` | Dict[str, *Any*] | ➖ | N/A | | `dekallm` | Dict[str, *Any*] | ➖ | N/A | | `digitalocean` | Dict[str, *Any*] | ➖ | N/A | +| `doubleword` | Dict[str, *Any*] | ➖ | N/A | | `elevenlabs` | Dict[str, *Any*] | ➖ | N/A | | `enfer` | Dict[str, *Any*] | ➖ | N/A | | `fake_provider` | Dict[str, *Any*] | ➖ | N/A | diff --git a/docs/components/providername.mdx b/docs/components/providername.mdx index 81c36a611..ca3deae5f 100644 --- a/docs/components/providername.mdx +++ b/docs/components/providername.mdx @@ -54,6 +54,7 @@ This is an open enum. Unrecognized values will not fail type checks. - `"DeepSeek"` - `"DekaLLM"` - `"DigitalOcean"` +- `"Doubleword"` - `"ElevenLabs"` - `"Featherless"` - `"Fireworks"` diff --git a/docs/components/provideroptions.mdx b/docs/components/provideroptions.mdx index 1e1b0839c..33e1ffc47 100644 --- a/docs/components/provideroptions.mdx +++ b/docs/components/provideroptions.mdx @@ -53,6 +53,7 @@ Provider-specific options keyed by provider slug. The provider segment is case-i | `deepseek` | Dict[str, *Any*] | ➖ | N/A | | `dekallm` | Dict[str, *Any*] | ➖ | N/A | | `digitalocean` | Dict[str, *Any*] | ➖ | N/A | +| `doubleword` | Dict[str, *Any*] | ➖ | N/A | | `elevenlabs` | Dict[str, *Any*] | ➖ | N/A | | `enfer` | Dict[str, *Any*] | ➖ | N/A | | `fake_provider` | Dict[str, *Any*] | ➖ | N/A | diff --git a/docs/components/providerresponseprovidername.mdx b/docs/components/providerresponseprovidername.mdx index 247c68279..1f46e7479 100644 --- a/docs/components/providerresponseprovidername.mdx +++ b/docs/components/providerresponseprovidername.mdx @@ -84,6 +84,7 @@ This is an open enum. Unrecognized values will not fail type checks. - `"DeepSeek"` - `"DekaLLM"` - `"DigitalOcean"` +- `"Doubleword"` - `"ElevenLabs"` - `"Featherless"` - `"Fireworks"` diff --git a/docs/components/urlcitation.mdx b/docs/components/urlcitation.mdx index d791d72f3..d24fab7b2 100644 --- a/docs/components/urlcitation.mdx +++ b/docs/components/urlcitation.mdx @@ -11,4 +11,5 @@ title: "URLCitation" | `start_index` | *int* | ✔️ | N/A | | `title` | *str* | ✔️ | N/A | | `type` | [components.URLCitationType](../components/urlcitationtype.mdx) | ✔️ | N/A | +| `uncited` | *Optional[Literal[True]]* | ➖ | N/A | | `url` | *str* | ✔️ | N/A | \ No newline at end of file diff --git a/docs/components/videogenerationrequestoptions.mdx b/docs/components/videogenerationrequestoptions.mdx index 8fed95aae..6c8f8fd97 100644 --- a/docs/components/videogenerationrequestoptions.mdx +++ b/docs/components/videogenerationrequestoptions.mdx @@ -53,6 +53,7 @@ Provider-specific options keyed by provider slug. The provider segment is case-i | `deepseek` | Dict[str, *Any*] | ➖ | N/A | | `dekallm` | Dict[str, *Any*] | ➖ | N/A | | `digitalocean` | Dict[str, *Any*] | ➖ | N/A | +| `doubleword` | Dict[str, *Any*] | ➖ | N/A | | `elevenlabs` | Dict[str, *Any*] | ➖ | N/A | | `enfer` | Dict[str, *Any*] | ➖ | N/A | | `fake_provider` | Dict[str, *Any*] | ➖ | N/A | diff --git a/docs/operations/provider.mdx b/docs/operations/provider.mdx index bdc3629b1..6f848f7c9 100644 --- a/docs/operations/provider.mdx +++ b/docs/operations/provider.mdx @@ -56,6 +56,7 @@ This is an open enum. Unrecognized values will not fail type checks. - `"deepseek"` - `"dekallm"` - `"digitalocean"` +- `"doubleword"` - `"elevenlabs"` - `"featherless"` - `"fireworks"` diff --git a/pyproject.toml b/pyproject.toml index 429656dd3..6a377642b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "openrouter" -version = "1.3.176" +version = "1.3.177" 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 bc1e5866a..d0b0886a1 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.176" +__version__: str = "1.3.177" __openapi_doc_version__: str = "1.0.0" __gen_version__: str = "2.950.13" -__user_agent__: str = "speakeasy-sdk/python 1.3.176 2.950.13 1.0.0 openrouter" +__user_agent__: str = "speakeasy-sdk/python 1.3.177 2.950.13 1.0.0 openrouter" try: if __package__ is not None: diff --git a/src/openrouter/components/batchobject.py b/src/openrouter/components/batchobject.py index 095d7319f..b5b450e1f 100644 --- a/src/openrouter/components/batchobject.py +++ b/src/openrouter/components/batchobject.py @@ -63,10 +63,11 @@ UNSET_SENTINEL, UnrecognizedStr, ) +from openrouter.utils import validate_const from openrouter.utils.unions import parse_open_union import pydantic from pydantic import ConfigDict, model_serializer -from pydantic.functional_validators import BeforeValidator +from pydantic.functional_validators import AfterValidator, BeforeValidator from typing import Any, Dict, List, Literal, Optional, Union from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict @@ -839,6 +840,7 @@ class BatchObjectURLCitationTypedDict(TypedDict): title: str url: str content: NotRequired[str] + uncited: Literal[True] class BatchObjectURLCitation(BaseModel): @@ -852,9 +854,14 @@ class BatchObjectURLCitation(BaseModel): content: Optional[str] = None + UNCITED: Annotated[ + Annotated[Optional[Literal[True]], AfterValidator(validate_const(True))], + pydantic.Field(alias="uncited"), + ] = True + @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = set(["content"]) + optional_fields = set(["content", "uncited"]) serialized = handler(self) m = {} @@ -2193,3 +2200,7 @@ def serialize_model(self, handler): Refusal.model_rebuild() except NameError: pass +try: + BatchObjectURLCitation.model_rebuild() +except NameError: + pass diff --git a/src/openrouter/components/byokproviderslug.py b/src/openrouter/components/byokproviderslug.py index 4467d74f0..a9ec45c56 100644 --- a/src/openrouter/components/byokproviderslug.py +++ b/src/openrouter/components/byokproviderslug.py @@ -45,6 +45,7 @@ "deepseek", "dekallm", "digitalocean", + "doubleword", "elevenlabs", "featherless", "fireworks", diff --git a/src/openrouter/components/imagegenerationproviderpreferences.py b/src/openrouter/components/imagegenerationproviderpreferences.py index eada8cbd4..5cb638e83 100644 --- a/src/openrouter/components/imagegenerationproviderpreferences.py +++ b/src/openrouter/components/imagegenerationproviderpreferences.py @@ -84,6 +84,7 @@ class ImageGenerationProviderPreferencesOptionsTypedDict(TypedDict): deepseek: NotRequired[Dict[str, Any]] dekallm: NotRequired[Dict[str, Any]] digitalocean: NotRequired[Dict[str, Any]] + doubleword: NotRequired[Dict[str, Any]] elevenlabs: NotRequired[Dict[str, Any]] enfer: NotRequired[Dict[str, Any]] fake_provider: NotRequired[Dict[str, Any]] @@ -307,6 +308,8 @@ class ImageGenerationProviderPreferencesOptions(BaseModel): digitalocean: Optional[Dict[str, Any]] = None + doubleword: Optional[Dict[str, Any]] = None + elevenlabs: Optional[Dict[str, Any]] = None enfer: Optional[Dict[str, Any]] = None @@ -617,6 +620,7 @@ def serialize_model(self, handler): "deepseek", "dekallm", "digitalocean", + "doubleword", "elevenlabs", "enfer", "fake-provider", diff --git a/src/openrouter/components/providername.py b/src/openrouter/components/providername.py index 34c1f4153..6d2f79e55 100644 --- a/src/openrouter/components/providername.py +++ b/src/openrouter/components/providername.py @@ -45,6 +45,7 @@ "DeepSeek", "DekaLLM", "DigitalOcean", + "Doubleword", "ElevenLabs", "Featherless", "Fireworks", diff --git a/src/openrouter/components/provideroptions.py b/src/openrouter/components/provideroptions.py index a0aac8bde..c580deb04 100644 --- a/src/openrouter/components/provideroptions.py +++ b/src/openrouter/components/provideroptions.py @@ -55,6 +55,7 @@ class ProviderOptionsTypedDict(TypedDict): deepseek: NotRequired[Dict[str, Any]] dekallm: NotRequired[Dict[str, Any]] digitalocean: NotRequired[Dict[str, Any]] + doubleword: NotRequired[Dict[str, Any]] elevenlabs: NotRequired[Dict[str, Any]] enfer: NotRequired[Dict[str, Any]] fake_provider: NotRequired[Dict[str, Any]] @@ -278,6 +279,8 @@ class ProviderOptions(BaseModel): digitalocean: Optional[Dict[str, Any]] = None + doubleword: Optional[Dict[str, Any]] = None + elevenlabs: Optional[Dict[str, Any]] = None enfer: Optional[Dict[str, Any]] = None @@ -588,6 +591,7 @@ def serialize_model(self, handler): "deepseek", "dekallm", "digitalocean", + "doubleword", "elevenlabs", "enfer", "fake-provider", diff --git a/src/openrouter/components/providerresponse.py b/src/openrouter/components/providerresponse.py index b8f6c6ec9..8cd27810f 100644 --- a/src/openrouter/components/providerresponse.py +++ b/src/openrouter/components/providerresponse.py @@ -75,6 +75,7 @@ "DeepSeek", "DekaLLM", "DigitalOcean", + "Doubleword", "ElevenLabs", "Featherless", "Fireworks", diff --git a/src/openrouter/components/urlcitation.py b/src/openrouter/components/urlcitation.py index a0491cc8f..7161b6182 100644 --- a/src/openrouter/components/urlcitation.py +++ b/src/openrouter/components/urlcitation.py @@ -2,9 +2,12 @@ from __future__ import annotations from openrouter.types import BaseModel, UNSET_SENTINEL +from openrouter.utils import validate_const +import pydantic from pydantic import model_serializer +from pydantic.functional_validators import AfterValidator from typing import Literal, Optional -from typing_extensions import NotRequired, TypedDict +from typing_extensions import Annotated, NotRequired, TypedDict URLCitationType = Literal["url_citation",] @@ -17,6 +20,7 @@ class URLCitationTypedDict(TypedDict): type: URLCitationType url: str content: NotRequired[str] + uncited: Literal[True] class URLCitation(BaseModel): @@ -32,9 +36,14 @@ class URLCitation(BaseModel): content: Optional[str] = None + UNCITED: Annotated[ + Annotated[Optional[Literal[True]], AfterValidator(validate_const(True))], + pydantic.Field(alias="uncited"), + ] = True + @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = set(["content"]) + optional_fields = set(["content", "uncited"]) serialized = handler(self) m = {} @@ -47,3 +56,9 @@ def serialize_model(self, handler): m[k] = val return m + + +try: + URLCitation.model_rebuild() +except NameError: + pass diff --git a/src/openrouter/components/videogenerationrequest.py b/src/openrouter/components/videogenerationrequest.py index f5f1d6daa..a096e2ea2 100644 --- a/src/openrouter/components/videogenerationrequest.py +++ b/src/openrouter/components/videogenerationrequest.py @@ -103,6 +103,7 @@ class VideoGenerationRequestOptionsTypedDict(TypedDict): deepseek: NotRequired[Dict[str, Any]] dekallm: NotRequired[Dict[str, Any]] digitalocean: NotRequired[Dict[str, Any]] + doubleword: NotRequired[Dict[str, Any]] elevenlabs: NotRequired[Dict[str, Any]] enfer: NotRequired[Dict[str, Any]] fake_provider: NotRequired[Dict[str, Any]] @@ -326,6 +327,8 @@ class VideoGenerationRequestOptions(BaseModel): digitalocean: Optional[Dict[str, Any]] = None + doubleword: Optional[Dict[str, Any]] = None + elevenlabs: Optional[Dict[str, Any]] = None enfer: Optional[Dict[str, Any]] = None @@ -636,6 +639,7 @@ def serialize_model(self, handler): "deepseek", "dekallm", "digitalocean", + "doubleword", "elevenlabs", "enfer", "fake-provider", diff --git a/src/openrouter/operations/listbyokkeys.py b/src/openrouter/operations/listbyokkeys.py index 5ad79207c..f60840be0 100644 --- a/src/openrouter/operations/listbyokkeys.py +++ b/src/openrouter/operations/listbyokkeys.py @@ -122,6 +122,7 @@ def serialize_model(self, handler): "deepseek", "dekallm", "digitalocean", + "doubleword", "elevenlabs", "featherless", "fireworks", diff --git a/uv.lock b/uv.lock index 905017a8b..282f6cf90 100644 --- a/uv.lock +++ b/uv.lock @@ -231,7 +231,7 @@ wheels = [ [[package]] name = "openrouter" -version = "1.3.176" +version = "1.3.177" source = { editable = "." } dependencies = [ { name = "httpcore" }, From 59a1de1cd62bd15478cf51d05555886781643ada Mon Sep 17 00:00:00 2001 From: "speakeasy-github[bot]" <128539517+speakeasy-github[bot]@users.noreply.github.com> Date: Fri, 13 Nov 2026 20:58:01 +0000 Subject: [PATCH 2/2] empty commit to trigger [run-tests] workflow