diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock
index 62ff1ed62..86db60b2c 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: 5079eb00ca1eb970dce6128009b273f3
+ docChecksum: 391e357ac47938ae90fb7ff4e0655266
docVersion: 1.0.0
speakeasyVersion: 1.787.0
generationVersion: 2.914.0
- releaseVersion: 1.3.72
- configChecksum: f694de07da25d85e9c11f82d0da9ebb1
+ releaseVersion: 1.3.73
+ configChecksum: c5ff2d4796113096907206c7b9a46d4d
repoURL: https://github.com/OpenRouterTeam/python-sdk.git
installationURL: https://github.com/OpenRouterTeam/python-sdk.git
published: true
persistentEdits:
- generation_id: ca012085-b807-4a32-a8a8-eb55fa87fab8
- pristine_commit_hash: 652242151c5b6f4c3dc2e34094c689d7c597c83b
- pristine_tree_hash: efdfda9840130060732935490643c1c027b0fea5
+ generation_id: c273b2f0-c648-43f2-be40-19fdc9034d09
+ pristine_commit_hash: 7a5479dd501a6ddd669e52ed1871bd4ae6593d59
+ pristine_tree_hash: 0ec6d64749a5220d249d9cfdd2def366fd55e8d4
features:
python:
acceptHeaders: 3.0.0
@@ -1724,8 +1724,8 @@ trackedFiles:
pristine_git_object: a00676abb210aeb3747aa6d6a0dfbe3e3ad42f76
docs/components/byokproviderslug.mdx:
id: 6ea70819f6d8
- last_write_checksum: sha1:0047976f8856a3ede87d3493e696c0593b715ca1
- pristine_git_object: 5b1b92ee45ab0cb582189f6883926fa238393ff4
+ last_write_checksum: sha1:319780ed215f586ccc1f06a8883aa0dac3cdd7ca
+ pristine_git_object: 5ad5ae6527b06c9e3d0630e2a062d85a1402037f
docs/components/capabilitydescriptor.mdx:
id: 34ac0e581d79
last_write_checksum: sha1:62ee9ccab6cec4572383cef654997ab4106d4676
@@ -2600,8 +2600,8 @@ trackedFiles:
pristine_git_object: c31f263d23205ebfa16eb7e4ae5f33a11fb19764
docs/components/createprivateendpointrequest.mdx:
id: 14dbb5bba6c1
- last_write_checksum: sha1:383b1208492f41531e7b5b74bbe5d8fa6e728246
- pristine_git_object: 6c0147e3adf05e7caf81c42f677ebcc69951ad07
+ last_write_checksum: sha1:ddea9a5d58465fbfb47a927c848a11b359673187
+ pristine_git_object: e9a0f79d968084059dcea0599f73de594800b089
docs/components/createprivateendpointrequestdeclaredregion.mdx:
id: 58cea9c8b74d
last_write_checksum: sha1:7b835ef8af060b80af19bbbb1eae9ec24eabf747
@@ -3604,8 +3604,8 @@ trackedFiles:
pristine_git_object: 11f1471c8b6c04f52af89d74d6dec2e9d12c2d82
docs/components/imagegenerationproviderpreferencesoptions.mdx:
id: 32d5c4b3e06b
- last_write_checksum: sha1:8e5bdcdecddcc2a5b652b88e8c7c7887a8787c89
- pristine_git_object: 90a02df2aacfc5d7e322333e4f89dfdf59faba1a
+ last_write_checksum: sha1:0f7c5c7b04bdec80ac8049b7ca803f8afcf6dd16
+ pristine_git_object: 3826b9dfb2cc549bbe1752b7cac5334f87bae1e5
docs/components/imagegenerationproviderpreferencesorder.mdx:
id: 0547877073f3
last_write_checksum: sha1:3e890c691097373cc9a2d7e47c3594f56b57809c
@@ -6316,8 +6316,8 @@ trackedFiles:
pristine_git_object: 6a99a2737d18a3c227bf7fcabf58b481d3c7d94b
docs/components/privateendpoint.mdx:
id: 139c5b16dd66
- last_write_checksum: sha1:0b78a7ad4a5508cd530d6b121d5b171d56b00d8d
- pristine_git_object: 89ec31591eb14ddf3e17ba0ff01dd1079314832a
+ last_write_checksum: sha1:9a7d6ec85eba27f801982e6d6c1312856c58e539
+ pristine_git_object: c877a16f69c1952f0e3a5e0f4e55217ffe5ebed9
docs/components/privateendpointactivation.mdx:
id: c5cea1d4e39d
last_write_checksum: sha1:832ee01779e755b70618c0fb80ac937ba70b15cb
@@ -6336,12 +6336,12 @@ trackedFiles:
pristine_git_object: d82f235f03d49c49a8051659a00a64753630d9b8
docs/components/privateendpointpricing.mdx:
id: 16264ba816a0
- last_write_checksum: sha1:437150761f58fdec4106968311845cb1c59da33a
- pristine_git_object: 15a8329bc1c3462e0fe11c21be108b3bb7a91b3b
+ last_write_checksum: sha1:18134f67a96280dbf944223036f9f473221eb342
+ pristine_git_object: 3004d03302ab6b06f44c41c8fad4eead79aac399
docs/components/privateendpointresponse.mdx:
id: 5844d85b61d8
- last_write_checksum: sha1:4393e19b080374b66726b448399f9465ed2d2028
- pristine_git_object: ebc7588e01d90f525cd143acf20968af466f9cbe
+ last_write_checksum: sha1:e303f61ad992a12c3f9e1008beba2b3b277c9157
+ pristine_git_object: 7d641919aded35cecc7b9ca046af4af368b2be0d
docs/components/privateendpointstatus.mdx:
id: 170564aaaa0f
last_write_checksum: sha1:3cdf3d3142af4ece802933887e1659bca0ea26be
@@ -6396,12 +6396,12 @@ trackedFiles:
pristine_git_object: e4103b29b85cafaf653bf8f71bd8e12278a16fa8
docs/components/providername.mdx:
id: aa3a4904b228
- last_write_checksum: sha1:3f95c98dc224726e833a2a18e22852f497dea373
- pristine_git_object: fd35d33a28b43d601181a689df1a77b1d4ca4cd8
+ last_write_checksum: sha1:e2a84dbc4284448764b55b2ed907ea0a48a09bd5
+ pristine_git_object: 6dc6d4c77b976166b211575dd17345b8d8a68008
docs/components/provideroptions.mdx:
id: 2697807524fe
- last_write_checksum: sha1:8e9f66fcc428c0ee40189ac533ad2cc5117b43b7
- pristine_git_object: ab51902b4acda8d89ac2e454e15bf4005fb5ad9c
+ last_write_checksum: sha1:17aca86741539c2a9a89c0e7c5ecb2d3d2c528c7
+ pristine_git_object: a9cc73b56bc4ce4231b0230e2846b1c83090e54e
docs/components/provideroverloadedresponseerrordata.mdx:
id: dc500cd14889
last_write_checksum: sha1:8326118941c8899a398931c8c7871af21b716b00
@@ -6432,8 +6432,8 @@ trackedFiles:
pristine_git_object: dd376f0952fa0517dd83b06ed7afc2c856123dbc
docs/components/providerresponseprovidername.mdx:
id: 2fc17b61e546
- last_write_checksum: sha1:37d89625d75fcc06f931a14b52421ab46f5eaebc
- pristine_git_object: 0ebaa1032d87ed5999d6f61c47b97ac1bd9957f1
+ last_write_checksum: sha1:38a91e5f91b41427c2893be3291e267e279c89cd
+ pristine_git_object: 3675176b9ee5e8fae22de06637b6c5db03801991
docs/components/providersort.mdx:
id: d73fa13eeb95
last_write_checksum: sha1:b7e9e6842741e3433d705bd576f2ac5383f00134
@@ -7904,8 +7904,8 @@ trackedFiles:
pristine_git_object: d46fb370c21fa0d04b29ece85364a693737dfe79
docs/components/updateprivateendpointpricingrequest.mdx:
id: 1ed6ca2fbacb
- last_write_checksum: sha1:5fd60dc4e75d09ceb512ab85008836d78969983c
- pristine_git_object: 96fbfd32997780ac55660c2f202da78d780676dc
+ last_write_checksum: sha1:328f4f68996672e5a5b31ada9b80cae99233348a
+ pristine_git_object: a757848b1ec13e2ac94ff49d0754d422962cf7c9
docs/components/updateprivateendpointrequest.mdx:
id: 8a1aa4763af9
last_write_checksum: sha1:a7e5f59788d831200451567601a9ad91959edbb5
@@ -8048,8 +8048,8 @@ trackedFiles:
pristine_git_object: 67f56887bb4758559189e3e9e6123dff9a38df81
docs/components/videogenerationrequestoptions.mdx:
id: 1d67160e7e7a
- last_write_checksum: sha1:3d53daa52396eb195e4e7dccd2271d20f828dbc9
- pristine_git_object: bda3194c1e15e444262fc9f4484f24800a502586
+ last_write_checksum: sha1:76b1e402149e4bfb2a9424874df6368650de06de
+ pristine_git_object: 8fc76e5da7205a35d72ff5ea7f47f3fa719ffdbf
docs/components/videogenerationrequestprovider.mdx:
id: d6424dd5de9d
last_write_checksum: sha1:72aa46a3335220b579db56574ea179d150dbe2b6
@@ -9916,8 +9916,8 @@ trackedFiles:
pristine_git_object: 0f0b54e43577a8a835cd971f82e48c3921e3d88e
docs/operations/provider.mdx:
id: c75b3bbeeaa0
- last_write_checksum: sha1:6c73a0fe64424258b8260f1f2d5aee64f37c895f
- pristine_git_object: ee07ed6dc04b71765eb494c4807f22971350d285
+ last_write_checksum: sha1:ce3f3fa5d69d80a788a934d48fcaa6bbb17260ed
+ pristine_git_object: 0a8cad96cd904712da6f4e77f5889cf32203f8c3
docs/operations/provisioninternglobals.mdx:
id: 5e34eb9c579a
last_write_checksum: sha1:e5ddc9680dd8f7c0bbec6bb900f0754c8d8da955
@@ -10348,8 +10348,8 @@ trackedFiles:
pristine_git_object: 28d3f17d25e50a97e4c195ea46a15ee6ab431902
docs/sdks/privateendpoints/README.mdx:
id: 54dee70b8cc7
- last_write_checksum: sha1:3ee195b23b8124d351823bb7ef8fb956ef281c3c
- pristine_git_object: a0cd92faace314f7f90e259eb6926517c7e78335
+ last_write_checksum: sha1:2f58390d196d1c08a304b9d3c2f495281fe0c8db
+ pristine_git_object: 8996a61b1f8f3270f905963de0dee573427b4d86
docs/sdks/providers/README.mdx:
id: 5ea9af111324
last_write_checksum: sha1:570b55655ee7602d3807c3218e450741f634eed6
@@ -10400,8 +10400,8 @@ trackedFiles:
pristine_git_object: 3e38f1a929f7d6b1d6de74604aa87e3d8f010544
pyproject.toml:
id: 5d07e7d72637
- last_write_checksum: sha1:b12bd325c9d171cffb89638fe400fec91337f464
- pristine_git_object: 93cb885778a1728106f84669753cfecd37002996
+ last_write_checksum: sha1:601a53e7a7df73c85ee31b075aed86e5a9e8e4a3
+ pristine_git_object: be6cea480dd5fc0c1260fa0fca6ad9f991a2b413
scripts/prepare_readme.py:
id: e0c5957a6035
last_write_checksum: sha1:77f44b60b98bc126557ec27391f91dfba764bb54
@@ -10428,8 +10428,8 @@ trackedFiles:
pristine_git_object: 86713cfea633e09d33b3d4e65281071fe20e6137
src/openrouter/_version.py:
id: d8d15ad6c586
- last_write_checksum: sha1:731a83cb71c84efb1628f7fdc686e220673b8e0b
- pristine_git_object: a966ba4b6e32b2639d42909101205276a1fe9574
+ last_write_checksum: sha1:07efa5800140346aac74f5b66d5f7a6aa2f78b6b
+ pristine_git_object: 3a87fcf4b0d22084670a1b08654a1ce936fedcbb
src/openrouter/alpha.py:
id: 306c4d93308d
last_write_checksum: sha1:30f55a360f41376ab194b9ea725fe4e001a5ae1a
@@ -11208,8 +11208,8 @@ trackedFiles:
pristine_git_object: 1b3f14e8e93ced25f87ee3ca73c01e2f32f42988
src/openrouter/components/byokproviderslug.py:
id: 6738a8516caf
- last_write_checksum: sha1:fa105c6ada88a04de912f585282997ea69c3a9d7
- pristine_git_object: 66f4760c7f12258d679ecfad73cc320d601c41ad
+ last_write_checksum: sha1:4286355bb7991b1bb3187266e20473fea8c9e3ff
+ pristine_git_object: 495fe846d7295d6f89ab82fc99be2ea3afd003e1
src/openrouter/components/capabilitydescriptor.py:
id: 368790a86f10
last_write_checksum: sha1:a167551924ee82b4b5876a0ab698a45fe8c87a95
@@ -12048,8 +12048,8 @@ trackedFiles:
pristine_git_object: 6b9a8990973466285f9b49b366bbc5fc1ae42e41
src/openrouter/components/imagegenerationproviderpreferences.py:
id: 100a82a54e2d
- last_write_checksum: sha1:d6eb77c7c2c7eab46d9b445f77e551505fec758c
- pristine_git_object: 30efd67803874ac0d6f7f77d6e8567e4073ed2bc
+ last_write_checksum: sha1:5ee96d059fa96f28780ba7c95d52e99f20536e3a
+ pristine_git_object: 791eb94001bb3fb6789db1744bddddafea8353cf
src/openrouter/components/imagegenerationrequest.py:
id: f8291a7be9a0
last_write_checksum: sha1:5594779ac114f113c508b0eb75ad355a50a3d76e
@@ -13080,8 +13080,8 @@ trackedFiles:
pristine_git_object: 6a8d44a0b8ed4313318a9ebc0220de6b098cd01a
src/openrouter/components/privateendpointpricing.py:
id: 2d8979e18f5b
- last_write_checksum: sha1:7542707a55468cf3356b599d5455637981e41b73
- pristine_git_object: aae91e5c9665b3104b90d055c8f2aadcdf574614
+ last_write_checksum: sha1:7e95e077f70d016fdaa0256ac622d19e91e0d7cb
+ pristine_git_object: 861d9bf7b206b4da322b7facdcafd43e7805a1ec
src/openrouter/components/privateendpointresponse.py:
id: 38a49c864b72
last_write_checksum: sha1:e9cbd209c0e4128c69645f4b4fb59508b40bb6eb
@@ -13120,12 +13120,12 @@ trackedFiles:
pristine_git_object: 170ae25c582bb8decd74e1c69bfa8353bd44e86d
src/openrouter/components/providername.py:
id: fcc722fa2fce
- last_write_checksum: sha1:69e6c0e392cc7cb962ef4ebd9a2657ba43903df3
- pristine_git_object: 943635547cc66baee2b23c54147b3561d0736bc7
+ last_write_checksum: sha1:1a4ed56d5fb7b53c174a877892e39e7c37d17ddf
+ pristine_git_object: e30339f8a06f9986225d7c208620a7173c55dfca
src/openrouter/components/provideroptions.py:
id: 73dde6c8f359
- last_write_checksum: sha1:6faf10e9dfae0a48f948dc216a32b5a5b5c672b7
- pristine_git_object: 8c24186ffe46e9b1d996c88defa42a86c0da5aa8
+ last_write_checksum: sha1:ad5aa56d30c0f16fc2ac862be06d275c6e70f3df
+ pristine_git_object: a8abf2047bec5dca52556bce8bdad1314686be9a
src/openrouter/components/provideroverloadedresponseerrordata.py:
id: 5b693682570e
last_write_checksum: sha1:b54682560ff95dad18d26f9aaf887f8f6e0e1f71
@@ -13136,8 +13136,8 @@ trackedFiles:
pristine_git_object: 6cf5d428899c8722a49aa4ed5918ffe95b793549
src/openrouter/components/providerresponse.py:
id: ad3887be54c5
- last_write_checksum: sha1:e72d715a5e2008206fd047f352b9ad121a1adb67
- pristine_git_object: 08957bde360335933be5733214077ff82eeb21f7
+ last_write_checksum: sha1:4b6331be21b8e180dd9fafe4abbfcb29b7f194d3
+ pristine_git_object: 4f09c78bba4b9fe73f4a7fcc30e5b647330eaaf0
src/openrouter/components/providersort.py:
id: 348e382bf494
last_write_checksum: sha1:57551507f95cd2e16ef995e1c13f859fd0726152
@@ -13832,8 +13832,8 @@ trackedFiles:
pristine_git_object: b4a3db2fc4c7edf92a475be2952f01b5e2070205
src/openrouter/components/videogenerationrequest.py:
id: 70e3c9ff288c
- last_write_checksum: sha1:a8eef2d679f7afb4d5f9b6f79e6539fc151fbb2a
- pristine_git_object: 9da5001f8bd7c28601452286b5b8935e3ad6771d
+ last_write_checksum: sha1:184edd3c9af56c96b7a03a6ccb5305244bd07628
+ pristine_git_object: 96e0013aa28c702f8147d616c7b7cd355873b20a
src/openrouter/components/videogenerationresponse.py:
id: 541f1321b072
last_write_checksum: sha1:6ba68c4551af144f37be940f0222f434d156e275
@@ -14520,8 +14520,8 @@ trackedFiles:
pristine_git_object: 6f60496e1a42385ab2253a36dfcd7f3698d5ae7a
src/openrouter/operations/listbyokkeys.py:
id: b6dd42b3e05f
- last_write_checksum: sha1:ca22f9b331c15f871b42bf0521260b6c17768612
- pristine_git_object: 9bb008183ec04f35b43ced6ee61fcceb012386ab
+ last_write_checksum: sha1:c19b4eed29d55b38a7c14322e5a039a1d36ab8cc
+ pristine_git_object: ce40e5ff7f35b31fe99fee8934987db52d09eb58
src/openrouter/operations/listcontainerfiles.py:
id: 7a30b9291c76
last_write_checksum: sha1:937c9fb30fd651d28793340285b3389518b26d96
@@ -14772,8 +14772,8 @@ trackedFiles:
pristine_git_object: 559ca6ad194bd4f66bc3777d7edc040ccb041a7c
src/openrouter/private_endpoints.py:
id: fdbce8846ed0
- last_write_checksum: sha1:f24e5496b1b57429d578c6422aef9ecb3b204760
- pristine_git_object: a6e38e8ee4ad2b23724bc542f651ea1b0a2f5053
+ last_write_checksum: sha1:6b011534aab484c622e489b9abfb1545b1a77416
+ pristine_git_object: d0c3002830ff39926729be91f7dd122d394f58ff
src/openrouter/providers.py:
id: debc4c48f149
last_write_checksum: sha1:11dbc607825edee8dcc84b39ee8171e097c47acf
@@ -19167,3 +19167,4 @@ examples:
"500":
application/json: {"error": {"code": 404, "message": "Intern not found"}}
examplesVersion: 1.0.2
+releaseNotes: "## Python SDK Changes:\n* `open_router.alpha.decisions.create()`: `request.provider` **Changed**\n* `open_router.tts.create_speech()`: \n * `request.provider.options.recursive` **Added**\n* `open_router.stt.create_transcription()`: \n * `request.provider.options.recursive` **Added**\n* `open_router.batch.create_batches()`: \n * `request.provider.only[].union(ProviderName).enum(recursive)` **Added**\n* `open_router.byok.list()`: \n * `request.provider` **Changed**\n * `response.data[].provider.enum(recursive)` **Added**\n* `open_router.byok.create()`: \n * `request.provider.enum(recursive)` **Added**\n * `response.data.provider.enum(recursive)` **Added**\n* `open_router.byok.get()`: `response.data.provider.enum(recursive)` **Added**\n* `open_router.byok.update()`: `response.data.provider.enum(recursive)` **Added**\n* `open_router.chat.send()`: `request.provider` **Changed**\n* `open_router.embeddings.generate()`: `request.provider` **Changed**\n* `open_router.endpoints.list_zdr_endpoints()`: `response.data[].provider_name.enum(recursive)` **Added**\n* `open_router.endpoints.list()`: `response.data.endpoints[].provider_name.enum(recursive)` **Added**\n* `open_router.generations.get_generation()`: `response.data.provider_responses[].provider_name.enum(recursive)` **Added**\n* `open_router.images.generate()`: `request.provider` **Changed**\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.provider` **Changed**\n* `open_router.private_endpoints.create()`: `request.pricing` **Changed**\n* `open_router.private_endpoints.get()`: `response.data.pricing` **Changed**\n* `open_router.private_endpoints.update()`: `response.data.pricing` **Changed**\n* `open_router.private_endpoints.update_pricing()`: \n * `request.pricing` **Changed**\n * `response.data.pricing` **Changed**\n* `open_router.rerank.rerank()`: `request.provider` **Changed**\n* `open_router.responses.send()`: `request.provider` **Changed**\n* `open_router.beta.responses.send()`: `request.provider` **Changed**\n* `open_router.system_one.create()`: `request.provider` **Changed**\n* `open_router.video_generation.generate()`: \n * `request.provider.options.recursive` **Added**\n"
diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml
index 6e7ef90ed..f50e81b2d 100644
--- a/.speakeasy/gen.yaml
+++ b/.speakeasy/gen.yaml
@@ -36,7 +36,7 @@ generation:
documentation: mintlify
preApplyUnionDiscriminators: true
python:
- version: 1.3.72
+ version: 1.3.73
additionalDependencies:
dev:
pytest: '>=8.3'
diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml
index 16a8c2bd7..e6232e988 100644
--- a/.speakeasy/out.openapi.yaml
+++ b/.speakeasy/out.openapi.yaml
@@ -6969,6 +6969,7 @@ components:
- 'primeintellect'
- 'quiver'
- 'recraft'
+ - 'recursive'
- 'reka'
- 'relace'
- 'respan'
@@ -18818,6 +18819,7 @@ components:
- 'Perplexity'
- 'Phala'
- 'Recraft'
+ - 'Recursive'
- 'Reka'
- 'Relace'
- 'Respan'
@@ -26340,6 +26342,8 @@ components:
model_permaslug: 'openai/gpt-4o-2024-08-06'
model_slug: 'openai/gpt-4o'
pricing:
+ cache_read: '0.00000025'
+ cache_write: '0.000003125'
completion: '0.00001'
prompt: '0.0000025'
provider_name: 'Azure'
@@ -26496,9 +26500,21 @@ components:
PrivateEndpointPricing:
description: 'Negotiated per-token rates reported for requests routed to this endpoint.'
example:
+ cache_read: '0.00000025'
+ cache_write: '0.000003125'
completion: '0.00001'
prompt: '0.0000025'
properties:
+ cache_read:
+ description: 'USD per cache-read prompt token, as a decimal string. Omit it to bill cache reads at the provider pricing strategy''s default, which for most strategies is the prompt rate.'
+ example: '0.00000025'
+ pattern: '^\d+(\.\d+)?$'
+ type: 'string'
+ cache_write:
+ description: 'USD per cache-write prompt token, as a decimal string. Omit it to bill cache writes at the provider pricing strategy''s default.'
+ example: '0.000003125'
+ pattern: '^\d+(\.\d+)?$'
+ type: 'string'
completion:
description: 'USD per completion token, as a decimal string.'
example: '0.00001'
@@ -26741,6 +26757,7 @@ components:
- 'Perplexity'
- 'Phala'
- 'Recraft'
+ - 'Recursive'
- 'Reka'
- 'Relace'
- 'Respan'
@@ -27107,6 +27124,9 @@ components:
recursal:
additionalProperties: {}
type: 'object'
+ recursive:
+ additionalProperties: {}
+ type: 'object'
reflection:
additionalProperties: {}
type: 'object'
@@ -27527,6 +27547,7 @@ components:
- 'Perplexity'
- 'Phala'
- 'Recraft'
+ - 'Recursive'
- 'Reka'
- 'Relace'
- 'Respan'
@@ -37081,6 +37102,7 @@ paths:
- 'primeintellect'
- 'quiver'
- 'recraft'
+ - 'recursive'
- 'reka'
- 'relace'
- 'respan'
@@ -50230,7 +50252,7 @@ paths:
- $ref: "#/components/parameters/AppCategories"
/private-endpoints/{id}/pricing:
put:
- description: 'Set the negotiated per-token rates reported for requests routed to this endpoint. Applies to drafts and active endpoints; new rates take effect for subsequent requests. [Management key](/docs/guides/overview/auth/management-api-keys) required.'
+ description: 'Set the negotiated per-token rates reported for requests routed to this endpoint. Applies to drafts and active endpoints; new rates take effect for subsequent requests. The body replaces the whole pricing object: omitting `cache_read` or `cache_write` reverts that rate to the provider pricing strategy''s default, even if it was set before. [Management key](/docs/guides/overview/auth/management-api-keys) required.'
operationId: 'updatePrivateEndpointPricing'
parameters:
- description: 'Stable identifier of the private endpoint.'
diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock
index 7573f0f27..80a34c544 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:a74d093cb783cef559f268a64fd24e6abaf5af0fc2f47f34fdbff5160ff4621f
- sourceBlobDigest: sha256:3ae8ecf6f055b72ac8eb8b5d1d52913ddef2fa1f7f5388da571886f08fbcd88b
+ sourceRevisionDigest: sha256:02b248752304d3dd5799839e4e77e5ef0d805a84b4dd5be0b07e01a7e06d1270
+ sourceBlobDigest: sha256:627acb063a2687b443c1daef8c7aff53e2dc10707eaaa92fa633bd6715a1affa
tags:
- latest
- 1.0.0
@@ -11,10 +11,10 @@ targets:
open-router:
source: OpenRouter API
sourceNamespace: open-router-chat-completions-api
- sourceRevisionDigest: sha256:a74d093cb783cef559f268a64fd24e6abaf5af0fc2f47f34fdbff5160ff4621f
- sourceBlobDigest: sha256:3ae8ecf6f055b72ac8eb8b5d1d52913ddef2fa1f7f5388da571886f08fbcd88b
+ sourceRevisionDigest: sha256:02b248752304d3dd5799839e4e77e5ef0d805a84b4dd5be0b07e01a7e06d1270
+ sourceBlobDigest: sha256:627acb063a2687b443c1daef8c7aff53e2dc10707eaaa92fa633bd6715a1affa
codeSamplesNamespace: open-router-python-code-samples
- codeSamplesRevisionDigest: sha256:e390166b4fdc2149e0d9ea9ae4a0590d0465f083ae025c5efc4379430a6966b2
+ codeSamplesRevisionDigest: sha256:f8a5f47700a61a9f86ac423c08d7f759f7a051b114f31d0d702adf9c4008eebd
workflow:
workflowVersion: 1.0.0
speakeasyVersion: 1.787.0
diff --git a/RELEASES.md b/RELEASES.md
index 347eb216d..98f519403 100644
--- a/RELEASES.md
+++ b/RELEASES.md
@@ -3489,4 +3489,14 @@ Based on:
### Generated
- [python v1.3.72] .
### Releases
-- [PyPI v1.3.72] https://pypi.org/project/openrouter/1.3.72 - .
\ No newline at end of file
+- [PyPI v1.3.72] https://pypi.org/project/openrouter/1.3.72 - .
+
+## 2026-10-21 18:19:40
+### Changes
+Based on:
+- OpenAPI Doc
+- Speakeasy CLI 1.787.0 (2.914.0) https://github.com/speakeasy-api/speakeasy
+### Generated
+- [python v1.3.73] .
+### Releases
+- [PyPI v1.3.73] https://pypi.org/project/openrouter/1.3.73 - .
\ No newline at end of file
diff --git a/docs/components/byokproviderslug.mdx b/docs/components/byokproviderslug.mdx
index 5b1b92ee4..5ad5ae652 100644
--- a/docs/components/byokproviderslug.mdx
+++ b/docs/components/byokproviderslug.mdx
@@ -104,6 +104,7 @@ This is an open enum. Unrecognized values will not fail type checks.
- `"primeintellect"`
- `"quiver"`
- `"recraft"`
+- `"recursive"`
- `"reka"`
- `"relace"`
- `"respan"`
diff --git a/docs/components/createprivateendpointrequest.mdx b/docs/components/createprivateendpointrequest.mdx
index 8cd673de2..1a71ebbb2 100644
--- a/docs/components/createprivateendpointrequest.mdx
+++ b/docs/components/createprivateendpointrequest.mdx
@@ -11,6 +11,6 @@ title: "CreatePrivateEndpointRequest"
| `declared_region` | [OptionalNullable[components.CreatePrivateEndpointRequestDeclaredRegion]](../components/createprivateendpointrequestdeclaredregion.mdx) | ➖ | Attest where this deployment processes data. | us |
| `declared_zdr` | *OptionalNullable[bool]* | ➖ | Attest that this deployment retains no prompt or completion data. | |
| `model_permaslug` | *str* | ✅ | Permanent slug of the model this endpoint serves. | openai/gpt-4o-2024-08-06 |
-| `pricing` | [Optional[components.PrivateEndpointPricing]](../components/privateendpointpricing.mdx) | ➖ | Negotiated per-token rates reported for requests routed to this endpoint. | \{
"completion": "0.00001",
"prompt": "0.0000025"
} |
+| `pricing` | [Optional[components.PrivateEndpointPricing]](../components/privateendpointpricing.mdx) | ➖ | Negotiated per-token rates reported for requests routed to this endpoint. | \{
"cache_read": "0.00000025",
"cache_write": "0.000003125",
"completion": "0.00001",
"prompt": "0.0000025"
} |
| `provider_slug` | *str* | ✅ | Slug of the upstream provider. | azure |
| `upstream_model_id` | *str* | ✅ | Model or deployment identifier sent to the upstream provider. | gpt-4o-prod |
\ No newline at end of file
diff --git a/docs/components/imagegenerationproviderpreferencesoptions.mdx b/docs/components/imagegenerationproviderpreferencesoptions.mdx
index bc821a8a5..e1a528a02 100644
--- a/docs/components/imagegenerationproviderpreferencesoptions.mdx
+++ b/docs/components/imagegenerationproviderpreferencesoptions.mdx
@@ -118,6 +118,7 @@ Provider-specific options keyed by provider slug. Only options for the matched p
| `quiver` | Dict[str, *Any*] | ➖ | N/A |
| `recraft` | Dict[str, *Any*] | ➖ | N/A |
| `recursal` | Dict[str, *Any*] | ➖ | N/A |
+| `recursive` | Dict[str, *Any*] | ➖ | N/A |
| `reflection` | Dict[str, *Any*] | ➖ | N/A |
| `reka` | Dict[str, *Any*] | ➖ | N/A |
| `relace` | Dict[str, *Any*] | ➖ | N/A |
diff --git a/docs/components/privateendpoint.mdx b/docs/components/privateendpoint.mdx
index 926be8291..2e9974f41 100644
--- a/docs/components/privateendpoint.mdx
+++ b/docs/components/privateendpoint.mdx
@@ -13,7 +13,7 @@ title: "PrivateEndpoint"
| `model_name` | *Nullable[str]* | ✅ | Display name of the model, or `null` when the model is no longer listed. | OpenAI: GPT-4o |
| `model_permaslug` | *str* | ✅ | Permanent slug of the model this endpoint serves. | openai/gpt-4o-2024-08-06 |
| `model_slug` | *Nullable[str]* | ✅ | Public model slug, or `null` when the model is no longer listed. | openai/gpt-4o |
-| `pricing` | [components.PrivateEndpointPricing](../components/privateendpointpricing.mdx) | ✅ | Negotiated per-token rates reported for requests routed to this endpoint. | \{
"completion": "0.00001",
"prompt": "0.0000025"
} |
+| `pricing` | [components.PrivateEndpointPricing](../components/privateendpointpricing.mdx) | ✅ | Negotiated per-token rates reported for requests routed to this endpoint. | \{
"cache_read": "0.00000025",
"cache_write": "0.000003125",
"completion": "0.00001",
"prompt": "0.0000025"
} |
| `provider_name` | *str* | ✅ | Display name of the upstream provider. | Azure |
| `provider_slug` | *Nullable[str]* | ✅ | Slug of the upstream provider, or `null` when the provider is no longer listed. | azure |
| `status` | [components.PrivateEndpointStatus](../components/privateendpointstatus.mdx) | ✅ | Lifecycle state. `draft` endpoints are not routable until validated and activated; `disabled` endpoints are activated but temporarily not routable. | active |
diff --git a/docs/components/privateendpointpricing.mdx b/docs/components/privateendpointpricing.mdx
index 479c40072..84c4f25d2 100644
--- a/docs/components/privateendpointpricing.mdx
+++ b/docs/components/privateendpointpricing.mdx
@@ -7,7 +7,9 @@ Negotiated per-token rates reported for requests routed to this endpoint.
## Fields
-| Field | Type | Required | Description | Example |
-| ---------------------------------------------- | ---------------------------------------------- | ---------------------------------------------- | ---------------------------------------------- | ---------------------------------------------- |
-| `completion` | *str* | ✅ | USD per completion token, as a decimal string. | 0.00001 |
-| `prompt` | *str* | ✅ | USD per prompt token, as a decimal string. | 0.0000025 |
\ No newline at end of file
+| Field | Type | Required | Description | Example |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `cache_read` | *Optional[str]* | ➖ | USD per cache-read prompt token, as a decimal string. Omit it to bill cache reads at the provider pricing strategy's default, which for most strategies is the prompt rate. | 0.00000025 |
+| `cache_write` | *Optional[str]* | ➖ | USD per cache-write prompt token, as a decimal string. Omit it to bill cache writes at the provider pricing strategy's default. | 0.000003125 |
+| `completion` | *str* | ✅ | USD per completion token, as a decimal string. | 0.00001 |
+| `prompt` | *str* | ✅ | USD per prompt token, as a decimal string. | 0.0000025 |
\ No newline at end of file
diff --git a/docs/components/privateendpointresponse.mdx b/docs/components/privateendpointresponse.mdx
index f40498bbd..0f64d6f31 100644
--- a/docs/components/privateendpointresponse.mdx
+++ b/docs/components/privateendpointresponse.mdx
@@ -4,6 +4,6 @@ title: "PrivateEndpointResponse"
## Fields
-| Field | Type | Required | Description | Example |
-| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `data` | [components.PrivateEndpoint](../components/privateendpoint.mdx) | ✅ | N/A | \{
"base_url": "https://contoso.openai.azure.com",
"declared_region": "us",
"declared_zdr": true,
"id": "5b1c4c4e-7d0a-4a8e-9f3a-2d6c1b0e8a11",
"model_name": "OpenAI: GPT-4o",
"model_permaslug": "openai/gpt-4o-2024-08-06",
"model_slug": "openai/gpt-4o",
"pricing": \{
"completion": "0.00001",
"prompt": "0.0000025"
},
"provider_name": "Azure",
"provider_slug": "azure",
"status": "active",
"upstream_model_id": "gpt-4o-prod"
} |
\ No newline at end of file
+| Field | Type | Required | Description | Example |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data` | [components.PrivateEndpoint](../components/privateendpoint.mdx) | ✅ | N/A | \{
"base_url": "https://contoso.openai.azure.com",
"declared_region": "us",
"declared_zdr": true,
"id": "5b1c4c4e-7d0a-4a8e-9f3a-2d6c1b0e8a11",
"model_name": "OpenAI: GPT-4o",
"model_permaslug": "openai/gpt-4o-2024-08-06",
"model_slug": "openai/gpt-4o",
"pricing": \{
"cache_read": "0.00000025",
"cache_write": "0.000003125",
"completion": "0.00001",
"prompt": "0.0000025"
},
"provider_name": "Azure",
"provider_slug": "azure",
"status": "active",
"upstream_model_id": "gpt-4o-prod"
} |
\ No newline at end of file
diff --git a/docs/components/providername.mdx b/docs/components/providername.mdx
index fd35d33a2..6dc6d4c77 100644
--- a/docs/components/providername.mdx
+++ b/docs/components/providername.mdx
@@ -101,6 +101,7 @@ This is an open enum. Unrecognized values will not fail type checks.
- `"Perplexity"`
- `"Phala"`
- `"Recraft"`
+- `"Recursive"`
- `"Reka"`
- `"Relace"`
- `"Respan"`
diff --git a/docs/components/provideroptions.mdx b/docs/components/provideroptions.mdx
index c268e347c..31aede1b6 100644
--- a/docs/components/provideroptions.mdx
+++ b/docs/components/provideroptions.mdx
@@ -118,6 +118,7 @@ Provider-specific options keyed by provider slug. Only options for the matched p
| `quiver` | Dict[str, *Any*] | ➖ | N/A |
| `recraft` | Dict[str, *Any*] | ➖ | N/A |
| `recursal` | Dict[str, *Any*] | ➖ | N/A |
+| `recursive` | Dict[str, *Any*] | ➖ | N/A |
| `reflection` | Dict[str, *Any*] | ➖ | N/A |
| `reka` | Dict[str, *Any*] | ➖ | N/A |
| `relace` | Dict[str, *Any*] | ➖ | N/A |
diff --git a/docs/components/providerresponseprovidername.mdx b/docs/components/providerresponseprovidername.mdx
index 0ebaa1032..3675176b9 100644
--- a/docs/components/providerresponseprovidername.mdx
+++ b/docs/components/providerresponseprovidername.mdx
@@ -131,6 +131,7 @@ This is an open enum. Unrecognized values will not fail type checks.
- `"Perplexity"`
- `"Phala"`
- `"Recraft"`
+- `"Recursive"`
- `"Reka"`
- `"Relace"`
- `"Respan"`
diff --git a/docs/components/updateprivateendpointpricingrequest.mdx b/docs/components/updateprivateendpointpricingrequest.mdx
index 1f7652eaa..242da8f19 100644
--- a/docs/components/updateprivateendpointpricingrequest.mdx
+++ b/docs/components/updateprivateendpointpricingrequest.mdx
@@ -4,6 +4,6 @@ title: "UpdatePrivateEndpointPricingRequest"
## Fields
-| Field | Type | Required | Description | Example |
-| ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
-| `pricing` | [components.PrivateEndpointPricing](../components/privateendpointpricing.mdx) | ✅ | Negotiated per-token rates reported for requests routed to this endpoint. | \{
"completion": "0.00001",
"prompt": "0.0000025"
} |
\ No newline at end of file
+| Field | Type | Required | Description | Example |
+| ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ |
+| `pricing` | [components.PrivateEndpointPricing](../components/privateendpointpricing.mdx) | ✅ | Negotiated per-token rates reported for requests routed to this endpoint. | \{
"cache_read": "0.00000025",
"cache_write": "0.000003125",
"completion": "0.00001",
"prompt": "0.0000025"
} |
\ No newline at end of file
diff --git a/docs/components/videogenerationrequestoptions.mdx b/docs/components/videogenerationrequestoptions.mdx
index 03806935c..5bd82d369 100644
--- a/docs/components/videogenerationrequestoptions.mdx
+++ b/docs/components/videogenerationrequestoptions.mdx
@@ -118,6 +118,7 @@ Provider-specific options keyed by provider slug. Only options for the matched p
| `quiver` | Dict[str, *Any*] | ➖ | N/A |
| `recraft` | Dict[str, *Any*] | ➖ | N/A |
| `recursal` | Dict[str, *Any*] | ➖ | N/A |
+| `recursive` | Dict[str, *Any*] | ➖ | N/A |
| `reflection` | Dict[str, *Any*] | ➖ | N/A |
| `reka` | Dict[str, *Any*] | ➖ | N/A |
| `relace` | Dict[str, *Any*] | ➖ | N/A |
diff --git a/docs/operations/provider.mdx b/docs/operations/provider.mdx
index ee07ed6dc..0a8cad96c 100644
--- a/docs/operations/provider.mdx
+++ b/docs/operations/provider.mdx
@@ -104,6 +104,7 @@ This is an open enum. Unrecognized values will not fail type checks.
- `"primeintellect"`
- `"quiver"`
- `"recraft"`
+- `"recursive"`
- `"reka"`
- `"relace"`
- `"respan"`
diff --git a/docs/sdks/privateendpoints/README.mdx b/docs/sdks/privateendpoints/README.mdx
index c36065eb1..abee0df37 100644
--- a/docs/sdks/privateendpoints/README.mdx
+++ b/docs/sdks/privateendpoints/README.mdx
@@ -108,7 +108,7 @@ with OpenRouter(
| `base_url` | *Optional[str]* | ➖ | HTTPS base URL of your deployment. Required unless the provider derives its URL from the BYOK credential (Azure, Amazon Bedrock, Google Vertex). | https://contoso.openai.azure.com |
| `declared_region` | [OptionalNullable[components.CreatePrivateEndpointRequestDeclaredRegion]](../../components/createprivateendpointrequestdeclaredregion.mdx) | ➖ | Attest where this deployment processes data. | us |
| `declared_zdr` | *OptionalNullable[bool]* | ➖ | Attest that this deployment retains no prompt or completion data. | |
-| `pricing` | [Optional[components.PrivateEndpointPricing]](../../components/privateendpointpricing.mdx) | ➖ | Negotiated per-token rates reported for requests routed to this endpoint. | \{
"completion": "0.00001",
"prompt": "0.0000025"
} |
+| `pricing` | [Optional[components.PrivateEndpointPricing]](../../components/privateendpointpricing.mdx) | ➖ | Negotiated per-token rates reported for requests routed to this endpoint. | \{
"cache_read": "0.00000025",
"cache_write": "0.000003125",
"completion": "0.00001",
"prompt": "0.0000025"
} |
| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.mdx) | ➖ | Configuration to override the default retry behavior of the client. | |
### Response
@@ -462,7 +462,7 @@ with OpenRouter(
## update_pricing
-Set the negotiated per-token rates reported for requests routed to this endpoint. Applies to drafts and active endpoints; new rates take effect for subsequent requests. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+Set the negotiated per-token rates reported for requests routed to this endpoint. Applies to drafts and active endpoints; new rates take effect for subsequent requests. The body replaces the whole pricing object: omitting `cache_read` or `cache_write` reverts that rate to the provider pricing strategy's default, even if it was set before. [Management key](/docs/guides/overview/auth/management-api-keys) required.
### Example Usage
@@ -493,7 +493,7 @@ with OpenRouter(
| Parameter | Type | Required | Description | Example |
| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id` | *str* | ✅ | Stable identifier of the private endpoint. | 5b1c4c4e-7d0a-4a8e-9f3a-2d6c1b0e8a11 |
-| `pricing` | [components.PrivateEndpointPricing](../../components/privateendpointpricing.mdx) | ✅ | Negotiated per-token rates reported for requests routed to this endpoint. | \{
"completion": "0.00001",
"prompt": "0.0000025"
} |
+| `pricing` | [components.PrivateEndpointPricing](../../components/privateendpointpricing.mdx) | ✅ | Negotiated per-token rates reported for requests routed to this endpoint. | \{
"cache_read": "0.00000025",
"cache_write": "0.000003125",
"completion": "0.00001",
"prompt": "0.0000025"
} |
| `http_referer` | *Optional[str]* | ➖ | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
| |
| `x_open_router_title` | *Optional[str]* | ➖ | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
| |
| `x_open_router_categories` | *Optional[str]* | ➖ | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
| |
diff --git a/pyproject.toml b/pyproject.toml
index 7f0246bd4..be6cea480 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "openrouter"
-version = "1.3.72"
+version = "1.3.73"
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 a966ba4b6..3a87fcf4b 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.72"
+__version__: str = "1.3.73"
__openapi_doc_version__: str = "1.0.0"
__gen_version__: str = "2.914.0"
-__user_agent__: str = "speakeasy-sdk/python 1.3.72 2.914.0 1.0.0 openrouter"
+__user_agent__: str = "speakeasy-sdk/python 1.3.73 2.914.0 1.0.0 openrouter"
try:
if __package__ is not None:
diff --git a/src/openrouter/components/byokproviderslug.py b/src/openrouter/components/byokproviderslug.py
index 66f4760c7..495fe846d 100644
--- a/src/openrouter/components/byokproviderslug.py
+++ b/src/openrouter/components/byokproviderslug.py
@@ -93,6 +93,7 @@
"primeintellect",
"quiver",
"recraft",
+ "recursive",
"reka",
"relace",
"respan",
diff --git a/src/openrouter/components/imagegenerationproviderpreferences.py b/src/openrouter/components/imagegenerationproviderpreferences.py
index 30efd6780..791eb9400 100644
--- a/src/openrouter/components/imagegenerationproviderpreferences.py
+++ b/src/openrouter/components/imagegenerationproviderpreferences.py
@@ -149,6 +149,7 @@ class ImageGenerationProviderPreferencesOptionsTypedDict(TypedDict):
quiver: NotRequired[Dict[str, Any]]
recraft: NotRequired[Dict[str, Any]]
recursal: NotRequired[Dict[str, Any]]
+ recursive: NotRequired[Dict[str, Any]]
reflection: NotRequired[Dict[str, Any]]
reka: NotRequired[Dict[str, Any]]
relace: NotRequired[Dict[str, Any]]
@@ -450,6 +451,8 @@ class ImageGenerationProviderPreferencesOptions(BaseModel):
recursal: Optional[Dict[str, Any]] = None
+ recursive: Optional[Dict[str, Any]] = None
+
reflection: Optional[Dict[str, Any]] = None
reka: Optional[Dict[str, Any]] = None
@@ -651,6 +654,7 @@ def serialize_model(self, handler):
"quiver",
"recraft",
"recursal",
+ "recursive",
"reflection",
"reka",
"relace",
diff --git a/src/openrouter/components/privateendpointpricing.py b/src/openrouter/components/privateendpointpricing.py
index aae91e5c9..861d9bf7b 100644
--- a/src/openrouter/components/privateendpointpricing.py
+++ b/src/openrouter/components/privateendpointpricing.py
@@ -1,8 +1,10 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
-from openrouter.types import BaseModel
-from typing_extensions import TypedDict
+from openrouter.types import BaseModel, UNSET_SENTINEL
+from pydantic import model_serializer
+from typing import Optional
+from typing_extensions import NotRequired, TypedDict
class PrivateEndpointPricingTypedDict(TypedDict):
@@ -12,6 +14,10 @@ class PrivateEndpointPricingTypedDict(TypedDict):
r"""USD per completion token, as a decimal string."""
prompt: str
r"""USD per prompt token, as a decimal string."""
+ cache_read: NotRequired[str]
+ r"""USD per cache-read prompt token, as a decimal string. Omit it to bill cache reads at the provider pricing strategy's default, which for most strategies is the prompt rate."""
+ cache_write: NotRequired[str]
+ r"""USD per cache-write prompt token, as a decimal string. Omit it to bill cache writes at the provider pricing strategy's default."""
class PrivateEndpointPricing(BaseModel):
@@ -22,3 +28,25 @@ class PrivateEndpointPricing(BaseModel):
prompt: str
r"""USD per prompt token, as a decimal string."""
+
+ cache_read: Optional[str] = None
+ r"""USD per cache-read prompt token, as a decimal string. Omit it to bill cache reads at the provider pricing strategy's default, which for most strategies is the prompt rate."""
+
+ cache_write: Optional[str] = None
+ r"""USD per cache-write prompt token, as a decimal string. Omit it to bill cache writes at the provider pricing strategy's default."""
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(["cache_read", "cache_write"])
+ 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:
+ if val is not None or k not in optional_fields:
+ m[k] = val
+
+ return m
diff --git a/src/openrouter/components/providername.py b/src/openrouter/components/providername.py
index 943635547..e30339f8a 100644
--- a/src/openrouter/components/providername.py
+++ b/src/openrouter/components/providername.py
@@ -92,6 +92,7 @@
"Perplexity",
"Phala",
"Recraft",
+ "Recursive",
"Reka",
"Relace",
"Respan",
diff --git a/src/openrouter/components/provideroptions.py b/src/openrouter/components/provideroptions.py
index 8c24186ff..a8abf2047 100644
--- a/src/openrouter/components/provideroptions.py
+++ b/src/openrouter/components/provideroptions.py
@@ -120,6 +120,7 @@ class ProviderOptionsTypedDict(TypedDict):
quiver: NotRequired[Dict[str, Any]]
recraft: NotRequired[Dict[str, Any]]
recursal: NotRequired[Dict[str, Any]]
+ recursive: NotRequired[Dict[str, Any]]
reflection: NotRequired[Dict[str, Any]]
reka: NotRequired[Dict[str, Any]]
relace: NotRequired[Dict[str, Any]]
@@ -421,6 +422,8 @@ class ProviderOptions(BaseModel):
recursal: Optional[Dict[str, Any]] = None
+ recursive: Optional[Dict[str, Any]] = None
+
reflection: Optional[Dict[str, Any]] = None
reka: Optional[Dict[str, Any]] = None
@@ -622,6 +625,7 @@ def serialize_model(self, handler):
"quiver",
"recraft",
"recursal",
+ "recursive",
"reflection",
"reka",
"relace",
diff --git a/src/openrouter/components/providerresponse.py b/src/openrouter/components/providerresponse.py
index 08957bde3..4f09c78bb 100644
--- a/src/openrouter/components/providerresponse.py
+++ b/src/openrouter/components/providerresponse.py
@@ -122,6 +122,7 @@
"Perplexity",
"Phala",
"Recraft",
+ "Recursive",
"Reka",
"Relace",
"Respan",
diff --git a/src/openrouter/components/videogenerationrequest.py b/src/openrouter/components/videogenerationrequest.py
index 9da5001f8..96e0013aa 100644
--- a/src/openrouter/components/videogenerationrequest.py
+++ b/src/openrouter/components/videogenerationrequest.py
@@ -140,6 +140,7 @@ class VideoGenerationRequestOptionsTypedDict(TypedDict):
quiver: NotRequired[Dict[str, Any]]
recraft: NotRequired[Dict[str, Any]]
recursal: NotRequired[Dict[str, Any]]
+ recursive: NotRequired[Dict[str, Any]]
reflection: NotRequired[Dict[str, Any]]
reka: NotRequired[Dict[str, Any]]
relace: NotRequired[Dict[str, Any]]
@@ -441,6 +442,8 @@ class VideoGenerationRequestOptions(BaseModel):
recursal: Optional[Dict[str, Any]] = None
+ recursive: Optional[Dict[str, Any]] = None
+
reflection: Optional[Dict[str, Any]] = None
reka: Optional[Dict[str, Any]] = None
@@ -642,6 +645,7 @@ def serialize_model(self, handler):
"quiver",
"recraft",
"recursal",
+ "recursive",
"reflection",
"reka",
"relace",
diff --git a/src/openrouter/operations/listbyokkeys.py b/src/openrouter/operations/listbyokkeys.py
index 9bb008183..ce40e5ff7 100644
--- a/src/openrouter/operations/listbyokkeys.py
+++ b/src/openrouter/operations/listbyokkeys.py
@@ -170,6 +170,7 @@ def serialize_model(self, handler):
"primeintellect",
"quiver",
"recraft",
+ "recursive",
"reka",
"relace",
"respan",
diff --git a/src/openrouter/private_endpoints.py b/src/openrouter/private_endpoints.py
index a6e38e8ee..d0c300283 100644
--- a/src/openrouter/private_endpoints.py
+++ b/src/openrouter/private_endpoints.py
@@ -2624,7 +2624,7 @@ def update_pricing(
) -> components.PrivateEndpointResponse:
r"""Set private endpoint pricing
- Set the negotiated per-token rates reported for requests routed to this endpoint. Applies to drafts and active endpoints; new rates take effect for subsequent requests. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+ Set the negotiated per-token rates reported for requests routed to this endpoint. Applies to drafts and active endpoints; new rates take effect for subsequent requests. The body replaces the whole pricing object: omitting `cache_read` or `cache_write` reverts that rate to the provider pricing strategy's default, even if it was set before. [Management key](/docs/guides/overview/auth/management-api-keys) required.
:param id: Stable identifier of the private endpoint.
:param pricing: Negotiated per-token rates reported for requests routed to this endpoint.
@@ -2799,7 +2799,7 @@ async def update_pricing_async(
) -> components.PrivateEndpointResponse:
r"""Set private endpoint pricing
- Set the negotiated per-token rates reported for requests routed to this endpoint. Applies to drafts and active endpoints; new rates take effect for subsequent requests. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+ Set the negotiated per-token rates reported for requests routed to this endpoint. Applies to drafts and active endpoints; new rates take effect for subsequent requests. The body replaces the whole pricing object: omitting `cache_read` or `cache_write` reverts that rate to the provider pricing strategy's default, even if it was set before. [Management key](/docs/guides/overview/auth/management-api-keys) required.
:param id: Stable identifier of the private endpoint.
:param pricing: Negotiated per-token rates reported for requests routed to this endpoint.
diff --git a/uv.lock b/uv.lock
index 6dfbaad80..3d7ae047f 100644
--- a/uv.lock
+++ b/uv.lock
@@ -1,5 +1,5 @@
version = 1
-revision = 3
+revision = 5
requires-python = ">=3.10"
resolution-markers = [
"python_full_version >= '3.12'",
@@ -84,7 +84,7 @@ name = "exceptiongroup"
version = "1.3.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "typing-extensions", marker = "python_full_version < '3.11'" },
+ { name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" }
wheels = [
@@ -231,7 +231,7 @@ wheels = [
[[package]]
name = "openrouter"
-version = "1.3.72"
+version = "1.3.73"
source = { editable = "." }
dependencies = [
{ name = "httpcore" },