diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock
index 56ca0e282..5afc20c5d 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: 027e403236028f961e921f46bd90bbcc
+ docChecksum: ad64df57db005388ef0180bca93a668e
docVersion: 1.0.0
speakeasyVersion: 1.803.2
generationVersion: 2.950.13
- releaseVersion: 1.3.154
- configChecksum: ae17741e99ae9e0ce507f21ecfb67f93
+ releaseVersion: 1.3.155
+ configChecksum: 12b89731a35d72ec3993c48a1808819e
repoURL: https://github.com/OpenRouterTeam/python-sdk.git
installationURL: https://github.com/OpenRouterTeam/python-sdk.git
published: true
persistentEdits:
- generation_id: 097f8be6-fa34-49e0-98a9-e7db41b3fa50
- pristine_commit_hash: 7fc03154d584f1cd5a67e38b20d0295fbcb70b57
- pristine_tree_hash: 41f477d037cf8c6299a2fdfc91df102670c11f43
+ generation_id: fb165d8b-fb53-448d-b9db-ba3ddfb6b41f
+ pristine_commit_hash: a50bc4edb56663b4d33d4cdf881d4e9112e15819
+ pristine_tree_hash: 5ff35757e33bc4e72b878aa7ebf5215959e05247
features:
python:
acceptHeaders: 3.0.0
@@ -2796,8 +2796,8 @@ trackedFiles:
pristine_git_object: c95bbced65547cea7697bf83f58cd006e31bd23f
docs/components/createobservabilitydestinationrequest.mdx:
id: 8d942a601a6e
- last_write_checksum: sha1:da999e345eb20237469002897cb38783b7e90c79
- pristine_git_object: 7a438dc6de2d3ed28c11db43c1937149508892fc
+ last_write_checksum: sha1:873ee33ab76629a9cb7fad40fb6d1d3a756f5ab1
+ pristine_git_object: 05f742367fb620747fe6c6afcbf4951d999300ab
docs/components/createobservabilitydestinationrequesttype.mdx:
id: 0cb269425077
last_write_checksum: sha1:f8608dbed4fcc4407be03f34d5a5ab50c5cd085e
@@ -3380,20 +3380,20 @@ trackedFiles:
pristine_git_object: 06652bc3b30c292ff98d6a2e8008c995ec6f20ff
docs/components/extractionasset.mdx:
id: 0f75e8e96ebc
- last_write_checksum: sha1:9895c6624be471a8ed5ab1be8053a91453ed79ea
- pristine_git_object: 6fdc05859adf905c404f1330c3ffcb39c3ab5269
+ last_write_checksum: sha1:577ba36b0cca609cf198bd40978d082cfd8be7a2
+ pristine_git_object: ee730bf092c072f71c4129729f0274702119631d
docs/components/extractionassetformat.mdx:
id: de1e9040bc98
- last_write_checksum: sha1:8ce44e4dd8f76ade3083788f3a4e98b3278f6e0e
- pristine_git_object: 3e27b886cd9e854d30172169535674269358ad73
+ last_write_checksum: sha1:35856f6f06ae7778ce09d6b10e1a3ca0b6f0ed3b
+ pristine_git_object: 3e899e5786de95655fab3ad401ba3f838edcffff
docs/components/extractionassettype.mdx:
id: 9ee9569937e8
last_write_checksum: sha1:1caac4b91bd1baa4d9abb4d6030b0c72a0b67a7d
pristine_git_object: db830fbf992780c2425c4673540a3b63a822a249
docs/components/extractiondateanswer.mdx:
id: 7976b6922576
- last_write_checksum: sha1:0c156be0de9fabe757021716db295b53ccd7dea6
- pristine_git_object: dfbba98df6f9b767f1cec96adf0d10b754fe1e32
+ last_write_checksum: sha1:5edbff44011ddacc41e3bfeb8f4a9bfa392ca882
+ pristine_git_object: acbc1ba368c892bc03393d77296205fb62418b9d
docs/components/extractiondateanswersource.mdx:
id: f2dc9a38b450
last_write_checksum: sha1:4eed847bc485fb73c700db3940cb9838e47434a3
@@ -3404,16 +3404,16 @@ trackedFiles:
pristine_git_object: a369fe5e74cf3bc602de52bc19303571c0cbb5ed
docs/components/extractiondatefield.mdx:
id: 50f934145dab
- last_write_checksum: sha1:ad409200bf0d85825ef97b78f29ceb9d07586d09
- pristine_git_object: ecceaea22da768adf5d954e1306950977cf7ca9e
+ last_write_checksum: sha1:e868a315a1d046c666761caf77e0db5152070019
+ pristine_git_object: 5fdd8dc70e52a9917f7f50363192b4e39cad2317
docs/components/extractiondatefieldtype.mdx:
id: 976a6667e313
last_write_checksum: sha1:194899ea1ae103de16de3c73b54bd39c075c4ff6
pristine_git_object: 93062f3dbe496a05750406736b128b2024805d40
docs/components/extractiondatetimeanswer.mdx:
id: 2559fb1d6b75
- last_write_checksum: sha1:1c6006ab05929914f599705db4b667690a4f569b
- pristine_git_object: fcd2722f68d689418a7b25059a3da486c75f18a9
+ last_write_checksum: sha1:e60b557062cdd976e9308af914032c9f876888fb
+ pristine_git_object: 74b9deb2233e980d12e9d7b6bdcb84d6ccf9ae73
docs/components/extractiondatetimeanswersource.mdx:
id: f99304f92143
last_write_checksum: sha1:2619f10aab9dd809212a0b01ddad0bfa133cddcf
@@ -3424,16 +3424,16 @@ trackedFiles:
pristine_git_object: 73da000cf03250c3cd6ba9234592528a92c7d3a0
docs/components/extractiondatetimefield.mdx:
id: 557a13f5ece9
- last_write_checksum: sha1:8bff6c0c698352a62efc0816ffcd9920eb94bf40
- pristine_git_object: 1c6a9f4efad49dc74d8fe2ceb939fac6fa888723
+ last_write_checksum: sha1:99c2962904922a2c5a3be4815533e3ef37074cc6
+ pristine_git_object: 56724af58b335cdf2cbc8e1952e569c46199d37b
docs/components/extractiondatetimefieldtype.mdx:
id: 7b4c8da8a8fc
last_write_checksum: sha1:ab28a072b87f84a504c3eb2c1d6975df1a25c6c3
pristine_git_object: a8fb1fa450654191a98d7520a41ae6c9a8ef83cf
docs/components/extractiondurationanswer.mdx:
id: 87764531da90
- last_write_checksum: sha1:5a1102f56642726658c5e6724cbc5facfc36d486
- pristine_git_object: acc4cdcf864b6d92fe13b6c2657ddcc42c1b0089
+ last_write_checksum: sha1:a837b9cae60c1ecb66277847c2a71ad2ba6226a6
+ pristine_git_object: 0045e3f3f1b898ef55c1a58761df5a356806a305
docs/components/extractiondurationanswersource.mdx:
id: 7129cb29eb99
last_write_checksum: sha1:af2cea96865caefe0758a72835ffbe19295eb487
@@ -3444,8 +3444,8 @@ trackedFiles:
pristine_git_object: 66980844e78972960fe82a9c6ad833d425b466b9
docs/components/extractiondurationfield.mdx:
id: e2926531241a
- last_write_checksum: sha1:b5da3d9d924b1e6690a9eda93e441c1ce44f11c5
- pristine_git_object: 1bcc7faa0507c576c046199ab2a82d8753fd75f7
+ last_write_checksum: sha1:58051f46c6d5284052689be8af9aec8f7a48124b
+ pristine_git_object: ff69b93d0617a4a69986331b46bf7d55d17ab1a1
docs/components/extractiondurationfieldtype.mdx:
id: 5deb436240f3
last_write_checksum: sha1:1b44d15a33912cbc98c81081ed60a10be140428d
@@ -3492,8 +3492,8 @@ trackedFiles:
pristine_git_object: 768b5466ce39074982b45dc41af427734b9d7df9
docs/components/extractionestimatefield.mdx:
id: c3e4f8aec39b
- last_write_checksum: sha1:7b7ee8f23d27c28e17ac68f3938a6ef3bba45297
- pristine_git_object: 7f18a341b46300d447ccb89b40284e74383de5e1
+ last_write_checksum: sha1:53697eb4358e2ca89e140ca7559338941859f4db
+ pristine_git_object: 31eb753a66c219b293bf29954fe114a17b4129f7
docs/components/extractionestimatefieldmax.mdx:
id: d21954e95f10
last_write_checksum: sha1:88246885ef65033e22e4580db6f96a2314b38499
@@ -3560,8 +3560,8 @@ trackedFiles:
pristine_git_object: e5996b4fd39061c9145b9bb051c024144baf8703
docs/components/extractionforecastfield.mdx:
id: 77bac4df4bbf
- last_write_checksum: sha1:5066ff0d09fe43af57b78b5e7d9064db86ec2d2d
- pristine_git_object: db299598c34efcdf97c6b43f2701b35dbf6fd9d2
+ last_write_checksum: sha1:5c438865d12a50658cd2c46636e535ccf4150f92
+ pristine_git_object: 862eefcd9238ce83564cb457048fb12a21c6dd04
docs/components/extractionforecastfieldmax.mdx:
id: ca5002f79a98
last_write_checksum: sha1:05f9be530fb544e95465070b856a7a55a8c402a7
@@ -3620,8 +3620,8 @@ trackedFiles:
pristine_git_object: e971ec1fa26c3043eeef4862f105546922e4a7bd
docs/components/extractionlistanswer.mdx:
id: a2388a5a8321
- last_write_checksum: sha1:c6ddd57bbe65fd30c77cd2229819f1181eb07189
- pristine_git_object: 6c314960c85f4fe8840994bf22546a8b945fc245
+ last_write_checksum: sha1:8f3519d787af1a474998af9e5165a69f4632389e
+ pristine_git_object: 556dae9ef9aaf129aff205d8a65a13f4a07fea9c
docs/components/extractionlistanswerguess.mdx:
id: 3a1738d5a4b3
last_write_checksum: sha1:67f869f2bdbc3fe19e4c5ba0c48e0f7b0d1b3f91
@@ -3640,16 +3640,16 @@ trackedFiles:
pristine_git_object: cd38d0f80e1308bbe350d994ac95d7d7480d8d5e
docs/components/extractionlistfield.mdx:
id: 0f37220bbf24
- last_write_checksum: sha1:5a043f2e402e1f70cc88e0404ee7c8cca2390299
- pristine_git_object: 0a3b5068b5927108233e98e3a0032c8f6d1a2ba5
+ last_write_checksum: sha1:324fa2ef57a5db5a4a781e664d22c69018171614
+ pristine_git_object: 4e24f31459cb942924664bf9835e2df68b52cd72
docs/components/extractionlistfieldtype.mdx:
id: e6b5572fc728
last_write_checksum: sha1:9bb887d2a882763a72f908f344f3ebd39acf4d4d
pristine_git_object: 1c3e50bcb691651feb7ba737ce8f9e5625a6b1bc
docs/components/extractionnumberanswer.mdx:
id: 9c9ff12897b6
- last_write_checksum: sha1:da3f58385de439056a1d1e7c7859c456d9e8a735
- pristine_git_object: f87020791f0d7a908c7a3512511940d93f2e4689
+ last_write_checksum: sha1:ad0a6455b2c84c4792cf7395927e886af92eb94d
+ pristine_git_object: 0d80f866e1489a334af1f48e659e398da734fe44
docs/components/extractionnumberanswersource.mdx:
id: b410ee01d94a
last_write_checksum: sha1:c98e6ba67bff15e5fa5fa36a798b0ea0a2473225
@@ -3660,8 +3660,8 @@ trackedFiles:
pristine_git_object: 62e2f6af31134e390cb01ee252ead10a42172054
docs/components/extractionnumberfield.mdx:
id: 75d3b348f9f4
- last_write_checksum: sha1:d3587b55b5d0304f5caef646c9a9b048bf310630
- pristine_git_object: a57a6dc65c9711dfc49ca7838e1a00c7ce5d497d
+ last_write_checksum: sha1:2a43dc631dabd6a3394af4dcffc90675ea5d51cb
+ pristine_git_object: ed93a5551cd8f48da5e14b5ed7cd8eafb014d76c
docs/components/extractionnumberfieldtype.mdx:
id: e108f7192502
last_write_checksum: sha1:f829893f702262b25e8599c2f5d36387f9b9e564
@@ -3672,8 +3672,8 @@ trackedFiles:
pristine_git_object: 23fc9184e94b5aa836b93bbc192dad8e0b9e11cb
docs/components/extractionsrequest.mdx:
id: 8e3359e7a4eb
- last_write_checksum: sha1:8987945528de0f54ad1733f7017579bd36973ab3
- pristine_git_object: 875659a62760a2e72fabd3ed9aab0743cda726ea
+ last_write_checksum: sha1:a22286180e603194b414aae53411943b479aa89a
+ pristine_git_object: ba054578fb789c07ecc2bd90311f02caddd04e85
docs/components/extractionsresponse.mdx:
id: 9b1ac791359b
last_write_checksum: sha1:680a79be2427f7e882cd973188c50d1f8fef56c1
@@ -3688,8 +3688,8 @@ trackedFiles:
pristine_git_object: 7d335f16309b405175e5225f2b9b8cd66f63fc31
docs/components/extractiontextanswer.mdx:
id: 7f03372c93b9
- last_write_checksum: sha1:39092fead11de7076fcb10bb68af1b1f741de6e6
- pristine_git_object: 2e4bf9d37983a68870aa3d6465a13b06a7e44ce7
+ last_write_checksum: sha1:69895db853893460256abb861708c181e8a01376
+ pristine_git_object: bd56365a4268016f9654c1a321f9ca51a4e28a37
docs/components/extractiontextanswersource.mdx:
id: 769d49d5b121
last_write_checksum: sha1:1c476a0083edf8ac04e164da0a8463997e653de1
@@ -3700,16 +3700,16 @@ trackedFiles:
pristine_git_object: 190c505afbcf5eebaac432affd94c520705f8e7a
docs/components/extractiontextfield.mdx:
id: 3ff89fcc9280
- last_write_checksum: sha1:2047717efa86fba3edb806525a5ffb2a58b33fa7
- pristine_git_object: 7f4c2d28f3555e93830a4683ae0778aaeeeee317
+ last_write_checksum: sha1:f78a678d23fb00d42eb2f8924e1f355d84c5ceae
+ pristine_git_object: c99bd903ebb776f3b7624b4bd2adf692f858b873
docs/components/extractiontextfieldtype.mdx:
id: 5feaf7058394
last_write_checksum: sha1:521db15d7e9819c8b6ee8d33bd0d515c2bdedb33
pristine_git_object: d8d4a00ca072f643c2fad4a13ce37e9032e5c0ff
docs/components/extractiontimeanswer.mdx:
id: 518a28381666
- last_write_checksum: sha1:65234fbb6d40106454484612f257187ed1e59cf9
- pristine_git_object: 025bdf948ecb0a590f38ecc18a83b4b3b2577016
+ last_write_checksum: sha1:861a4faf8b2ab2b2240e3a1b9da4bfd5c30f5942
+ pristine_git_object: b67d655bb746f3748013f74b763461bc917f56df
docs/components/extractiontimeanswersource.mdx:
id: ed64b325414c
last_write_checksum: sha1:f8aeea532db0599f7e3659fedea8fd2057f5cb85
@@ -3720,8 +3720,8 @@ trackedFiles:
pristine_git_object: 9fd70049e82c9cdd684cce5a3efe2b5e8f01de79
docs/components/extractiontimefield.mdx:
id: f492f70dc285
- last_write_checksum: sha1:bdd61c12fe3b3fe4f5c7be4c6530b70ac212021f
- pristine_git_object: 3d48fdab6594c98f73706dd606d8362f71a09c80
+ last_write_checksum: sha1:54733f2a7e80cbce219920a7e1f9b055db79ab44
+ pristine_git_object: 34a6debce1ab54d229cdf06455ace20d80e0698f
docs/components/extractiontimefieldtype.mdx:
id: 6f8903f71ef7
last_write_checksum: sha1:f70cf2a555bd4253079e23f641d9b765fcf5c348
@@ -8916,8 +8916,8 @@ trackedFiles:
pristine_git_object: c39a57e70ffce0421a35733713ccc1b682eb77fa
docs/components/updateobservabilitydestinationrequest.mdx:
id: b54091567003
- last_write_checksum: sha1:f5457a557dc48d54008d811fa2c47f3e8633272d
- pristine_git_object: 2ea89116ac5b4eb2e3a29a9ce85856bc6d497a5c
+ last_write_checksum: sha1:4a9c4dd11807734487e23f088c5aa6150114b73f
+ pristine_git_object: 2f9670f03461794c36378933056816fdabbede97
docs/components/updateobservabilitydestinationresponse.mdx:
id: be9661c3676e
last_write_checksum: sha1:b7504a75a09ae5b3277ab9912bf02db2dcbdc101
@@ -10880,8 +10880,8 @@ trackedFiles:
pristine_git_object: 17f003ef87abd15eba15809d49add6c7d25d5110
docs/operations/listobservabilitydestinationsrequest.mdx:
id: 0ab2d0dfb05b
- last_write_checksum: sha1:6ecfc0400fe52747afcce8cb4a53c0b71be08e4e
- pristine_git_object: c1922a71e590a8be2241a3ff390d3489f09056fb
+ last_write_checksum: sha1:79d433b84b8c9394b48dd25d6da0a1f55a536b0a
+ pristine_git_object: 9770f4fb2c323e56e8672195429107eb241877db
docs/operations/listobservabilitydestinationsresponse.mdx:
id: 7da9d153805e
last_write_checksum: sha1:07b3cc07d798eee1f945807ebdfd7dd24a4f0ba0
@@ -11488,8 +11488,8 @@ trackedFiles:
pristine_git_object: 895dba6170d02cbf49dd87e817d260574e17841a
docs/sdks/extractions/README.mdx:
id: 7b1a30cfc1d9
- last_write_checksum: sha1:d884272149886b686beb590a6b0b791b38f7a024
- pristine_git_object: 8db370b97559a7249d33fa06f0c8ebafe4145707
+ last_write_checksum: sha1:5e3e0b220903476494396cb77ea04bdee62c63f2
+ pristine_git_object: 7d33becd0f0ea3919e51efd1fec27060f3b5940e
docs/sdks/files/README.mdx:
id: 1a0c257e330c
last_write_checksum: sha1:853537439b97cd6606f2d9f12de4b00deda6f912
@@ -11520,8 +11520,8 @@ trackedFiles:
pristine_git_object: ccd01ea3052fba9ab4f07c91b0fc20fe96687715
docs/sdks/observability/README.mdx:
id: 75811527e651
- last_write_checksum: sha1:2eaa330485331f17aea43c0841e7c712ee7b6d1c
- pristine_git_object: 8e494374d15e4211ffcfae747f63b0ddb69718cc
+ last_write_checksum: sha1:3856f7d60b1f301f4c3cadd3c8a474907ea1b2f0
+ pristine_git_object: 9680c97efa801154001c6705b86e313f0e6cff6a
docs/sdks/organization/README.mdx:
id: f41b85542db0
last_write_checksum: sha1:d725f284dbc94679015993513869cee9b25fc379
@@ -11588,8 +11588,8 @@ trackedFiles:
pristine_git_object: 3e38f1a929f7d6b1d6de74604aa87e3d8f010544
pyproject.toml:
id: 5d07e7d72637
- last_write_checksum: sha1:c77f305aed276bcfa29c1b7f8450f1ff5a66ccf1
- pristine_git_object: dfc2e5deed08449f1a0490114120a7adbf8a1c01
+ last_write_checksum: sha1:c46534dc22df5c939427a873c12bf226d7d6d0b8
+ pristine_git_object: 4367c4942dd87c77df9868c905e95f3a55f7e326
scripts/prepare_readme.py:
id: e0c5957a6035
last_write_checksum: sha1:77f44b60b98bc126557ec27391f91dfba764bb54
@@ -11616,8 +11616,8 @@ trackedFiles:
pristine_git_object: 86713cfea633e09d33b3d4e65281071fe20e6137
src/openrouter/_version.py:
id: d8d15ad6c586
- last_write_checksum: sha1:bfc01f9185df178f388851445e0a2205dc5d69ee
- pristine_git_object: 94ecda04c4208be7a2ef82de9213e26724ecfe02
+ last_write_checksum: sha1:c539afb9331dafccfb71a9221c154ee1b5e7b014
+ pristine_git_object: b2b5c94c838e7f3165dca7a520a1082a5d007b73
src/openrouter/alpha.py:
id: 306c4d93308d
last_write_checksum: sha1:80cc0f39649445431cc2247ed0e0765438467766
@@ -12852,8 +12852,8 @@ trackedFiles:
pristine_git_object: 0266b86d75b79dca3c8d55889824ad60b277834d
src/openrouter/components/createobservabilitydestinationrequest.py:
id: 58587fb98a32
- last_write_checksum: sha1:f956b75a335301856e16a244d7bd463397688057
- pristine_git_object: e408e1ffbf74b8d3a630dccdd669d4037180de04
+ last_write_checksum: sha1:e82a9713a3c5ac67dbbb4fcb29f8237d973c3e65
+ pristine_git_object: aa510e4cd9c328c6eda5b75154b110b666505e17
src/openrouter/components/createobservabilitydestinationresponse.py:
id: 9a8561661e52
last_write_checksum: sha1:730054c12ad209d5f83b88825c946fd6f322e6e9
@@ -13092,76 +13092,76 @@ trackedFiles:
pristine_git_object: cb4e716656633b8d070646198b4fe0f560ee94d0
src/openrouter/components/extractionasset.py:
id: 577b5551ee92
- last_write_checksum: sha1:cecf7cbe4f636f2a01a9f749440afd86a475448e
- pristine_git_object: 89359890b9167c8e24d5ee5dd86b572d303a3146
+ last_write_checksum: sha1:f6142fa0e52924042d6f730c9cf432e075c46a1a
+ pristine_git_object: 6cf6b687adc89d9048d8583a28474dcae5d5009f
src/openrouter/components/extractiondateanswer.py:
id: 2606de693996
- last_write_checksum: sha1:cf68c795269284afe00c7d12e5f930e30ab2ec27
- pristine_git_object: 5978ebb15e5c7324f34389991236a66e423ff294
+ last_write_checksum: sha1:86d0edead91854ef159ea61614674790a748c2a8
+ pristine_git_object: 9d6aa2863d25d369c4d0fea5f31064e59f4c2a26
src/openrouter/components/extractiondatefield.py:
id: d61917ea9968
- last_write_checksum: sha1:c288f7fdb316615c0105f3ed0b44d55d9b2514ab
- pristine_git_object: ecb2d421f5fe3688e40a23add97613488a9f9cfe
+ last_write_checksum: sha1:13e208629ad16aba820ea0bc9bea876b7d5a506f
+ pristine_git_object: 87e4c9d61c7415aa492c7fa639b3e45bf8e70680
src/openrouter/components/extractiondatetimeanswer.py:
id: 81153f9833e4
- last_write_checksum: sha1:18ef9569eeb886d5f5d1fb19a8604170e9d44513
- pristine_git_object: 6a6340b742253131e8877c38043f79850682434f
+ last_write_checksum: sha1:e0f4cf87cebab36193c8d424518af6a4febdb0d9
+ pristine_git_object: b8a7553be90f5e80891b125d68c4fef1493d816e
src/openrouter/components/extractiondatetimefield.py:
id: c19ff7161d38
- last_write_checksum: sha1:a1ddc34fbdbd254e443f163bd68e92dbec938d2b
- pristine_git_object: 7bd5a82d649b994453bb1bcdc9ea31fc88cc5c4f
+ last_write_checksum: sha1:c38a697390b9be1d2bd51af0fb985a1c3bb08552
+ pristine_git_object: 658187d2b37bbbaabe71b28582fc20160b25a14d
src/openrouter/components/extractiondurationanswer.py:
id: 9dee37484997
- last_write_checksum: sha1:387bf7ca11245565e61dbb312c76cab8e4d7a7f9
- pristine_git_object: c8a27f37a330e48618148cb445df1418831f10ad
+ last_write_checksum: sha1:7bd7201a9b347a43abdf3026a3e0cb54cafcfdd2
+ pristine_git_object: 3142bb79be1d219e1f4a1c84b5684cc26f649bcb
src/openrouter/components/extractiondurationfield.py:
id: af1aa9d859dd
- last_write_checksum: sha1:cffdbb364074d650fe2c46e4b0a2f35375c0c2b3
- pristine_git_object: 9909d58fb25d505c57dcbbbbb7fd4d1f8f13caf3
+ last_write_checksum: sha1:bbe1e2b34d691ed3ceb05e385f5355a16494d4b6
+ pristine_git_object: 1b62bb47a471827e12a196d119925ff766a8fe0a
src/openrouter/components/extractionestimateanswer.py:
id: d224919feae7
last_write_checksum: sha1:d5e1baa8ea62e54a6f936a848d755c7e1310fd8a
pristine_git_object: 04e92295f91bebb08084e8e542e5949767100338
src/openrouter/components/extractionestimatefield.py:
id: c3eda81242f7
- last_write_checksum: sha1:2cb350e3a451d63a3157a27018b0de2c08deb5e5
- pristine_git_object: 27a5f24e392ea0da8187188bd3c2ef9d72b9285c
+ last_write_checksum: sha1:43d02b517f87db22852269d8d20d00331623d7b2
+ pristine_git_object: b6fb443ac6f113839e65d3f8e6fcb46c7564d6fb
src/openrouter/components/extractionforecastanswer.py:
id: eb06525c8e62
last_write_checksum: sha1:be057c958b0b5df013bebb19993db1d447d2bdcc
pristine_git_object: e156568a03c3beed23f4985e91e571091153bca5
src/openrouter/components/extractionforecastfield.py:
id: 6cc5b70bbdaa
- last_write_checksum: sha1:b1e7a06ae90aea89f42a176e6b431c7690bf9f95
- pristine_git_object: 7b2bf5d0be73d231121130ff9b06ce51877978c8
+ last_write_checksum: sha1:d659087f551b9e30c51f484459e5b4923f79aba6
+ pristine_git_object: 6599debd86a5933de68c421e23191a27b10b76b8
src/openrouter/components/extractionforecaststep.py:
id: a8c0caf63050
last_write_checksum: sha1:fc813d24d026f1ce37427f8ab111961c5ada2598
pristine_git_object: 47809e77d553ffe84129e51a757ba394c662929b
src/openrouter/components/extractionlistanswer.py:
id: c7aaa4f5afb4
- last_write_checksum: sha1:abc9d5e9dce331fe65ab706d126b09de2dd91286
- pristine_git_object: ad234958c150abb0c3df9b1201d677beb315e93a
+ last_write_checksum: sha1:3487e62354a2efa81dd87c0cddce29ff24f4e20f
+ pristine_git_object: 0581a7aecd4fd0254ff362269c32ccf7af637631
src/openrouter/components/extractionlistfield.py:
id: dab2a75a880d
- last_write_checksum: sha1:7c25db467c8f01cba924c3885ca3236e0e5cb358
- pristine_git_object: 282b863b6a9cc1a53fdb78a36ae6dbec73876784
+ last_write_checksum: sha1:f825e58a9cbe394ca4fa3161e54e74094fc1ef2f
+ pristine_git_object: f181c23708b9a51601773d374596b62340eafdaa
src/openrouter/components/extractionnumberanswer.py:
id: 9a87b682eef5
- last_write_checksum: sha1:255ed6948850311f243a1396727e2705c20f9d4f
- pristine_git_object: f5efee6748b67fa686624b33f57918811c0f29d6
+ last_write_checksum: sha1:b357549214fce1e76e76743ae185200b2a9931ee
+ pristine_git_object: ad25ae2de95af6ff41008c008e70ab25d71b3887
src/openrouter/components/extractionnumberfield.py:
id: 1529d36e4196
- last_write_checksum: sha1:0c2cde20943acaa47d3a6aef845cff1c1d6dfeb1
- pristine_git_object: 1823b0109214ebfbe1fa1a29581594beb30c4280
+ last_write_checksum: sha1:cfbdd3f750e91b427c02712506b951cbf51b9c60
+ pristine_git_object: f345e2d752b7e3879b4614d2d14d60aa0a2f3270
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
- pristine_git_object: fa92eb67cb40a0da458ae73543131c13e03b1bfc
+ last_write_checksum: sha1:d570033dd556af0bd8230693fd5d68548217063d
+ pristine_git_object: 54f542845cc3a635a43a94c994e26a3ad3244cfb
src/openrouter/components/extractionsresponse.py:
id: c453ec16798e
last_write_checksum: sha1:038d4b3aab4fbf90d91c5db26d9c9a36dfe0ea30
@@ -13172,20 +13172,20 @@ trackedFiles:
pristine_git_object: e42e2df4a4829e4e41fdbc9f12f30697babb0ad4
src/openrouter/components/extractiontextanswer.py:
id: 2d6f419e73eb
- last_write_checksum: sha1:3a56c075e221cc24daf66bdebbda5e5f0071f860
- pristine_git_object: 7063d27d7ed2a2e051debd7c3be2482be5498179
+ last_write_checksum: sha1:c179eba203f16790b1b6ab2c8902b1174624248e
+ pristine_git_object: 1af5e904b161aadf7bcb8fd469d173ddf18a7711
src/openrouter/components/extractiontextfield.py:
id: 5d0da20614ae
- last_write_checksum: sha1:1754a6adb25664515628f5ad636d52d91d578fd4
- pristine_git_object: 4624afa9f690195186ee91309c4c7dad5225eb06
+ last_write_checksum: sha1:4fff055920b7b1f8687be38f97d067cfe32c61ab
+ pristine_git_object: 20f732f361ee12b3231639f8b53faf3b20443527
src/openrouter/components/extractiontimeanswer.py:
id: d6e27db7d4ad
- last_write_checksum: sha1:f70f641ea1d2d45222a361c6aa5eee4a7010b351
- pristine_git_object: de7a992464bb07771e6029afa677325278da665c
+ last_write_checksum: sha1:defa8773d9a34ed504b0c710feb72d17d94d4c5f
+ pristine_git_object: 03fe797150dc8902d3aaf6c82b6847d9016ff9cb
src/openrouter/components/extractiontimefield.py:
id: bb90e69521cd
- last_write_checksum: sha1:e2ee89e44d983012bfbea96449a2e1d44e6a1eb0
- pristine_git_object: 8007f9e5a21b679b4bce52854359c928cd829bb2
+ last_write_checksum: sha1:00fc395deab3f0e46e68a5377ca0ba315b0e848d
+ pristine_git_object: a1fd2c4b09b6df1b9ae27e7dc9c7a721e0aae03a
src/openrouter/components/failabletoolcallstatus.py:
id: 9d8a9ed81db6
last_write_checksum: sha1:8b044a17497f3674f16642f17634e633f5d95df2
@@ -15256,8 +15256,8 @@ trackedFiles:
pristine_git_object: ddfa0c4e3bf239603859762fe59a9b52d0b356ad
src/openrouter/components/updateobservabilitydestinationrequest.py:
id: d7a39fe04386
- last_write_checksum: sha1:15ddb24dc0d5ed9b9757eb767426c0cc5a263f7e
- pristine_git_object: 3617e77aa921ac9f259b3cdd71099ce4d3d4fb70
+ last_write_checksum: sha1:24d9caae99e5030d7c1156d42b672e2187db86bf
+ pristine_git_object: 139c81904ff11505e2a3a145758d0a58784f3c1b
src/openrouter/components/updateobservabilitydestinationresponse.py:
id: 187c51d2b3a4
last_write_checksum: sha1:cadc62b37feddb4281e471d15627a9a1bef32cb1
@@ -15612,8 +15612,8 @@ trackedFiles:
pristine_git_object: 2b03ccea82b6bb60876b63ef75445a9e2a3760bd
src/openrouter/extractions.py:
id: 27f1e1fb0fc0
- last_write_checksum: sha1:d921a2597320915fed9a8f9d66f7ef292e16a956
- pristine_git_object: 7cef3d56705c7a4d8a264b43f722ac1f162888d6
+ last_write_checksum: sha1:fdf09b66225922ab56de1d648c976cf62d51b4c2
+ pristine_git_object: 44a56fafb1aea5074fafffd5c020dfe402893817
src/openrouter/files.py:
id: 7baf7ee1f5b3
last_write_checksum: sha1:a780217e0d86c5893c5df4877b5451385144e876
@@ -15660,8 +15660,8 @@ trackedFiles:
pristine_git_object: 6f9385e6aa6f990eaad1ec72e4d8ddc793c1f42e
src/openrouter/observability.py:
id: 6a17f32d3f33
- last_write_checksum: sha1:a602b94936d973cb63a158dc94014889342a5ae5
- pristine_git_object: 4a35ede011d09dddab042e2c00413ce4f6be655e
+ last_write_checksum: sha1:7b82abd5032fa87dd0e323b22b13d93ec2b6e6f2
+ pristine_git_object: a77a677d433275c4f5e957b22cbc68ddd96a042e
src/openrouter/operations/__init__.py:
id: 9afcea1e7161
last_write_checksum: sha1:698becc71b7c317e30a1849cd5ecd6b4fba66051
@@ -16180,8 +16180,8 @@ trackedFiles:
pristine_git_object: f79a46a1130d3dec736b61fcc995776941b6d918
src/openrouter/operations/listobservabilitydestinations.py:
id: 40d2ffa975ee
- last_write_checksum: sha1:81c37a18a7326ddbe95a22d2f43a178cd6a58a93
- pristine_git_object: 6912194b6639fd1fbcd56b359c52f78857955954
+ last_write_checksum: sha1:2f78605aa1ddac57102c65adfb6a95b9b729cc81
+ pristine_git_object: 8efdffe07537894b87e3f0e2b54c53825dfd7b31
src/openrouter/operations/listorganizationmembers.py:
id: d40a3e0e2b38
last_write_checksum: sha1:f00056f68a32cdd602e362e4180c8344daa4bb41
@@ -21017,7 +21017,7 @@ examples:
createApiAlphaExtractions:
speakeasy-default-create-api-alpha-extractions:
requestBody:
- application/json: {"fields": {}, "model": "Grand Cherokee", "state": "Massachusetts"}
+ application/json: {"fields": {}, "model": "Grand Cherokee", "state": ""}
responses:
"200":
application/json: {"answers": {}, "model": "Malibu", "usage": {"input_tokens": 125155, "output_tokens": 101104}}
@@ -21573,3 +21573,6 @@ examples:
"500":
application/json: {"error": {"code": 500, "message": "Internal Server Error"}}
examplesVersion: 1.0.2
+releaseNotes: |
+ ## Python SDK Changes:
+ * `open_router.alpha.extractions.create()`: `request` **Changed**
diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml
index 9c874c2a8..8a649dbe6 100644
--- a/.speakeasy/gen.yaml
+++ b/.speakeasy/gen.yaml
@@ -37,7 +37,7 @@ generation:
documentation: mintlify
preApplyUnionDiscriminators: true
python:
- version: 1.3.154
+ version: 1.3.155
additionalDependencies:
dev:
pytest: '>=8.3'
diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml
index 7557ddc4d..8804f6df7 100644
--- a/.speakeasy/out.openapi.yaml
+++ b/.speakeasy/out.openapi.yaml
@@ -10951,7 +10951,7 @@ components:
type: 'langfuse'
properties:
api_key_hashes:
- description: 'Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. `null` or omitted means all keys. Must contain at least one hash if provided.'
+ description: 'Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. `null` or omitted means all keys. Must contain at least one hash if provided. A workspace-scoped management key can only name API keys in its own workspace; any other hash returns 400.'
example: null
items:
type: 'string'
@@ -11042,7 +11042,7 @@ components:
type: 'string'
x-speakeasy-unknown-values: allow
workspace_id:
- description: 'Optional workspace ID. Defaults to the authenticated entity''s default workspace.'
+ description: 'Optional workspace ID. Defaults to the authenticated entity''s default workspace, or a workspace-scoped management key''s own workspace.'
example: '550e8400-e29b-41d4-a716-446655440000'
format: 'uuid'
type: 'string'
@@ -12713,7 +12713,7 @@ components:
type: 'object'
ExtractionAsset:
additionalProperties: false
- description: 'An image or PDF sent once and referenced by its key in the `assets` map. `data_base64` is the file in standard base64 with no `data:` prefix. PDF is read by document models only.'
+ description: 'An image or PDF sent once and referenced by its key in the `assets` map. `data_base64` is the file in standard base64 with no `data:` prefix. Which formats are read is model-specific: a format the model cannot read fails with a 400.'
properties:
data_base64:
minLength: 1
@@ -12724,6 +12724,7 @@ components:
- 'png'
- 'jpg'
- 'jpeg'
+ - 'webp'
- 'pdf'
type: 'string'
x-speakeasy-unknown-values: allow
@@ -12758,7 +12759,7 @@ components:
type: 'string'
x-speakeasy-unknown-values: allow
span:
- description: 'Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once.'
+ description: 'Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it.'
items:
type: 'integer'
maxItems: 2
@@ -12796,6 +12797,9 @@ components:
enum:
- 'date'
type: 'string'
+ unit:
+ description: 'Unit label for the value.'
+ type: 'string'
required:
- 'type'
type: 'object'
@@ -12820,7 +12824,7 @@ components:
type: 'string'
x-speakeasy-unknown-values: allow
span:
- description: 'Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once.'
+ description: 'Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it.'
items:
type: 'integer'
maxItems: 2
@@ -12858,6 +12862,9 @@ components:
enum:
- 'datetime'
type: 'string'
+ unit:
+ description: 'Unit label for the value.'
+ type: 'string'
required:
- 'type'
type: 'object'
@@ -12883,7 +12890,7 @@ components:
type: 'string'
x-speakeasy-unknown-values: allow
span:
- description: 'Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once.'
+ description: 'Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it.'
items:
type: 'integer'
maxItems: 2
@@ -12921,6 +12928,7 @@ components:
description: 'What the field should contain.'
type: 'string'
integer:
+ description: 'Whole numbers only.'
type: 'boolean'
null_threshold:
description: 'Probability of null above which `value` is null. Default 0.5.'
@@ -13032,7 +13040,7 @@ components:
type: 'number'
- type: 'string'
null_threshold:
- description: 'Probability of null above which `value` is null. Default 0.5.'
+ description: 'Not read on this field type: no model takes a null threshold here, and a request that sets it fails with a 400.'
format: 'double'
maximum: 1
minimum: 0
@@ -13059,6 +13067,7 @@ components:
- 'estimate'
type: 'string'
unit:
+ description: 'Unit label for the value.'
type: 'string'
required:
- 'type'
@@ -13177,7 +13186,7 @@ components:
type: 'number'
- type: 'string'
null_threshold:
- description: 'Probability of null above which `value` is null. Default 0.5.'
+ description: 'Not read on this field type: no model takes a null threshold here, and a request that sets it fails with a 400.'
format: 'double'
maximum: 1
minimum: 0
@@ -13204,6 +13213,7 @@ components:
- 'forecast'
type: 'string'
unit:
+ description: 'Unit label for the value.'
type: 'string'
required:
- 'type'
@@ -13291,7 +13301,7 @@ components:
type: 'string'
x-speakeasy-unknown-values: allow
spans:
- description: 'One span per item of `value`, in the same order; null for an item that has no offsets in the state text (read from an image or a document).'
+ description: 'One span per item of `value`, in the same order; null for an item that has no offsets in the state text: one read from an image or a document, or one the provider returned without offsets that delimit it.'
items:
description: 'Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once.'
items:
@@ -13334,6 +13344,9 @@ components:
instructions:
description: 'What the field should contain.'
type: 'string'
+ integer:
+ description: 'Whole numbers only. Lists of numbers only.'
+ type: 'boolean'
items:
enum:
- 'text'
@@ -13351,6 +13364,9 @@ components:
enum:
- 'list'
type: 'string'
+ unit:
+ description: 'Unit label for the value.'
+ type: 'string'
required:
- 'type'
- 'items'
@@ -13377,7 +13393,7 @@ components:
type: 'string'
x-speakeasy-unknown-values: allow
span:
- description: 'Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once.'
+ description: 'Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it.'
items:
type: 'integer'
maxItems: 2
@@ -13412,6 +13428,7 @@ components:
description: 'What the field should contain.'
type: 'string'
integer:
+ description: 'Whole numbers only.'
type: 'boolean'
null_threshold:
description: 'Probability of null above which `value` is null. Default 0.5.'
@@ -13424,6 +13441,7 @@ components:
- 'number'
type: 'string'
unit:
+ description: 'Unit label for the value.'
type: 'string'
required:
- 'type'
@@ -13454,7 +13472,7 @@ components:
assets:
additionalProperties:
$ref: '#/components/schemas/ExtractionAsset'
- description: 'Assets keyed by reference string. Write a reference wherever the asset belongs in `state` or a field `instructions`; every asset must be referenced at least once. A `state` that is exactly the sole asset''s key carries no text of its own and is read as file-only. A model that reads either text or a document per request, not both (ScaleDown Extract with a PDF), needs that form: any other text around the key is state text and is rejected with 400.'
+ description: 'Assets keyed by reference string. Write a reference wherever the asset belongs in `state` or a field `instructions`; every asset must be referenced at least once, unless `state` is empty or omitted, in which case the assets are read without a reference. A `state` that is exactly the sole asset''s key carries no text of its own and is read as file-only. A model that reads either text or a document per request, not both (ScaleDown Extract with a PDF), takes that form or an empty or omitted `state`: any other text around the key is state text and is rejected with 400.'
type: 'object'
fields:
additionalProperties:
@@ -13499,7 +13517,8 @@ components:
maxLength: 256
type: 'string'
state:
- description: 'The text to read from. May be empty only when the request carries image assets.'
+ default: ''
+ description: 'The text to read from. May be empty or omitted only when the request carries assets, which are then read without being referenced by key.'
type: 'string'
trace:
$ref: '#/components/schemas/TraceConfig'
@@ -13508,7 +13527,6 @@ components:
type: 'string'
required:
- 'model'
- - 'state'
- 'fields'
type: 'object'
ExtractionsResponse:
@@ -13603,7 +13621,7 @@ components:
type: 'string'
x-speakeasy-unknown-values: allow
span:
- description: 'Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once.'
+ description: 'Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it.'
items:
type: 'integer'
maxItems: 2
@@ -13641,6 +13659,9 @@ components:
enum:
- 'text'
type: 'string'
+ unit:
+ description: 'Unit label for the value.'
+ type: 'string'
required:
- 'type'
type: 'object'
@@ -13665,7 +13686,7 @@ components:
type: 'string'
x-speakeasy-unknown-values: allow
span:
- description: 'Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once.'
+ description: 'Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it.'
items:
type: 'integer'
maxItems: 2
@@ -13703,6 +13724,9 @@ components:
enum:
- 'time'
type: 'string'
+ unit:
+ description: 'Unit label for the value.'
+ type: 'string'
required:
- 'type'
type: 'object'
@@ -36863,7 +36887,7 @@ components:
name: 'Updated Langfuse'
properties:
api_key_hashes:
- description: 'Optional allowlist of OpenRouter API key hashes. `null` clears the filter (all keys). Omitting leaves the current value. Must contain at least one hash if provided.'
+ description: 'Optional allowlist of OpenRouter API key hashes. `null` clears the filter (all keys). Omitting leaves the current value, including any API key from another workspace that an organization-scoped key attached. Must contain at least one hash if provided. A workspace-scoped management key can only name API keys in its own workspace; any other hash returns 400.'
example: null
items:
type: 'string'
@@ -53013,7 +53037,7 @@ paths:
- $ref: "#/components/parameters/AppCategories"
/observability/destinations:
get:
- description: 'List the observability destinations configured for the authenticated entity''s default workspace. Use the `workspace_id` query parameter to scope the result to a different workspace. Only destinations with stable release status are surfaced — destinations of other types are excluded. [Management key](/docs/guides/overview/auth/management-api-keys) required.'
+ description: 'List the observability destinations configured for the authenticated entity''s default workspace, or a workspace-scoped management key''s own workspace. Use the `workspace_id` query parameter to scope the result to a different workspace. A workspace-scoped management key can only list its own workspace; any other `workspace_id` returns 403. Only destinations with stable release status are surfaced — destinations of other types are excluded. [Management key](/docs/guides/overview/auth/management-api-keys) required.'
operationId: 'listObservabilityDestinations'
parameters:
- description: 'Number of records to skip for pagination'
@@ -53040,12 +53064,12 @@ paths:
maximum: 100
minimum: 1
type: 'integer'
- - description: 'Optional workspace ID to filter by. Defaults to the authenticated entity''s default workspace.'
+ - description: 'Optional workspace ID to filter by. Defaults to the authenticated entity''s default workspace, or a workspace-scoped management key''s own workspace.'
in: 'query'
name: 'workspace_id'
required: false
schema:
- description: 'Optional workspace ID to filter by. Defaults to the authenticated entity''s default workspace.'
+ description: 'Optional workspace ID to filter by. Defaults to the authenticated entity''s default workspace, or a workspace-scoped management key''s own workspace.'
example: '550e8400-e29b-41d4-a716-446655440000'
format: 'uuid'
type: 'string'
@@ -53136,7 +53160,7 @@ paths:
results: '$.data'
type: 'offsetLimit'
post:
- description: 'Create a new observability destination. A maximum of 5 destinations per type is allowed. Defaults to the authenticated entity''s default workspace; use the `workspace_id` body field to scope to a different workspace. [Management key](/docs/guides/overview/auth/management-api-keys) required.'
+ description: 'Create a new observability destination. A maximum of 5 destinations per type is allowed. Defaults to the authenticated entity''s default workspace, or a workspace-scoped management key''s own workspace; use the `workspace_id` body field to scope to a different workspace. A workspace-scoped management key can only create in its own workspace; any other `workspace_id` returns 403. [Management key](/docs/guides/overview/auth/management-api-keys) required.'
operationId: 'createObservabilityDestination'
requestBody:
content:
@@ -53241,7 +53265,7 @@ paths:
- $ref: "#/components/parameters/AppCategories"
/observability/destinations/{id}:
delete:
- description: 'Delete an existing observability destination. This performs a soft delete. [Management key](/docs/guides/overview/auth/management-api-keys) required.'
+ description: 'Delete an existing observability destination. This performs a soft delete. A workspace-scoped management key only reaches destinations in its own workspace; any other `id` returns 404. [Management key](/docs/guides/overview/auth/management-api-keys) required.'
operationId: 'deleteObservabilityDestination'
parameters:
- description: 'The destination ID (UUID).'
@@ -53307,7 +53331,7 @@ paths:
- 'Observability'
x-speakeasy-name-override: 'delete'
get:
- description: 'Fetch a single observability destination by its UUID. [Management key](/docs/guides/overview/auth/management-api-keys) required.'
+ description: 'Fetch a single observability destination by its UUID. A workspace-scoped management key only reaches destinations in its own workspace; any other `id` returns 404. [Management key](/docs/guides/overview/auth/management-api-keys) required.'
operationId: 'getObservabilityDestination'
parameters:
- description: 'The destination ID (UUID).'
@@ -53394,7 +53418,7 @@ paths:
- 'Observability'
x-speakeasy-name-override: 'get'
patch:
- description: 'Update an existing observability destination. Only the fields provided in the request body are updated. [Management key](/docs/guides/overview/auth/management-api-keys) required.'
+ description: 'Update an existing observability destination. Only the fields provided in the request body are updated. A workspace-scoped management key only reaches destinations in its own workspace; any other `id` returns 404. [Management key](/docs/guides/overview/auth/management-api-keys) required.'
operationId: 'updateObservabilityDestination'
parameters:
- description: 'The destination ID (UUID).'
diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock
index 900071f70..b2c0a3d4b 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:1de9f848396cbae86294b2063975cf380ddb57dbcfbf2494731c9e7074559d1d
- sourceBlobDigest: sha256:f3feb22229a9ad0712298febda7746fa201156c86b3af674e56f82222a354010
+ sourceRevisionDigest: sha256:fb94baaeefa14fb3a3a76c9a64af47b66f5a397007cc017402da38c7f2266f39
+ sourceBlobDigest: sha256:407df421edf7def991e54abf751267bc381d40169785d7e14d1032f060573c51
tags:
- latest
- 1.0.0
@@ -11,10 +11,10 @@ targets:
open-router:
source: OpenRouter API
sourceNamespace: open-router-chat-completions-api
- sourceRevisionDigest: sha256:1de9f848396cbae86294b2063975cf380ddb57dbcfbf2494731c9e7074559d1d
- sourceBlobDigest: sha256:f3feb22229a9ad0712298febda7746fa201156c86b3af674e56f82222a354010
+ sourceRevisionDigest: sha256:fb94baaeefa14fb3a3a76c9a64af47b66f5a397007cc017402da38c7f2266f39
+ sourceBlobDigest: sha256:407df421edf7def991e54abf751267bc381d40169785d7e14d1032f060573c51
codeSamplesNamespace: open-router-python-code-samples
- codeSamplesRevisionDigest: sha256:63a335702137bcd547403f0e67cd33a2f44e5d14ca2090d76d0f50c1a70ebc73
+ codeSamplesRevisionDigest: sha256:34c88e518712fbec70cf76a0352e4dae4404622b6b23529e3550d8dca29d9d3f
workflow:
workflowVersion: 1.0.0
speakeasyVersion: 1.803.2
diff --git a/RELEASES.md b/RELEASES.md
index 5302c3dc5..073bae86b 100644
--- a/RELEASES.md
+++ b/RELEASES.md
@@ -4309,4 +4309,14 @@ Based on:
### Generated
- [python v1.3.154] .
### Releases
-- [PyPI v1.3.154] https://pypi.org/project/openrouter/1.3.154 - .
\ No newline at end of file
+- [PyPI v1.3.154] https://pypi.org/project/openrouter/1.3.154 - .
+
+## 2026-11-11 00:04:36
+### Changes
+Based on:
+- OpenAPI Doc
+- Speakeasy CLI 1.803.2 (2.950.13) https://github.com/speakeasy-api/speakeasy
+### Generated
+- [python v1.3.155] .
+### Releases
+- [PyPI v1.3.155] https://pypi.org/project/openrouter/1.3.155 - .
\ No newline at end of file
diff --git a/docs/components/createobservabilitydestinationrequest.mdx b/docs/components/createobservabilitydestinationrequest.mdx
index 7a438dc6d..05f742367 100644
--- a/docs/components/createobservabilitydestinationrequest.mdx
+++ b/docs/components/createobservabilitydestinationrequest.mdx
@@ -4,19 +4,19 @@ title: "CreateObservabilityDestinationRequest"
## Fields
-| Field | Type | Required | Description | Example |
-| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `api_key_hashes` | List[*str*] | ➖ | Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. `null` or omitted means all keys. Must contain at least one hash if provided. | null |
-| `broadcast_generation_cost` | *Optional[bool]* | ➖ | When true, include cost and billing generation metadata. | false |
-| `broadcast_generation_cost_allocation` | *Optional[bool]* | ➖ | Beta. When true, include openrouter_cost_allocation: per-token-kind usage and cost, sent only when they reconcile with the billed cost. | false |
-| `broadcast_generation_identity` | *Optional[bool]* | ➖ | When true, include identity generation metadata. | false |
-| `broadcast_generation_request_context` | *Optional[bool]* | ➖ | When true, include request-context generation metadata. | false |
-| `config` | Dict[str, *Any*] | ✔️ | Provider-specific configuration. The shape depends on `type` and is validated server-side. | \{
"baseUrl": "https://us.cloud.langfuse.com",
"publicKey": "pk-l...EfGh",
"secretKey": "sk-l...AbCd"
} |
-| `enabled` | *Optional[bool]* | ➖ | Whether this destination should be enabled immediately. | true |
-| `filter_rules` | [OptionalNullable[components.ObservabilityFilterRulesConfigNullable]](../components/observabilityfilterrulesconfignullable.mdx) | ➖ | Optional structured filter rules controlling which events are forwarded. | null |
-| `name` | *str* | ✔️ | Human-readable name for the destination. | Production Langfuse |
-| `privacy_mode` | *Optional[bool]* | ➖ | When true, request/response bodies are not forwarded — only metadata. | false |
-| `regions` | List[[components.ObservabilityDataRegionInput](../components/observabilitydataregioninput.mdx)] | ➖ | Data regions this destination applies to. `eu` is accepted as an alias for `europe` and normalizes to `europe`. Omitting this field defaults to ['global']; the array must be non-empty. | [
"global"
] |
-| `sampling_rate` | *Optional[float]* | ➖ | Sampling rate between 0.0001 and 1 (1 = 100%). | 1 |
-| `type` | [components.CreateObservabilityDestinationRequestType](../components/createobservabilitydestinationrequesttype.mdx) | ✔️ | The destination type. Only stable destination types are accepted. | langfuse |
-| `workspace_id` | *Optional[str]* | ➖ | Optional workspace ID. Defaults to the authenticated entity's default workspace. | 550e8400-e29b-41d4-a716-446655440000 |
\ No newline at end of file
+| Field | Type | Required | Description | Example |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `api_key_hashes` | List[*str*] | ➖ | Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. `null` or omitted means all keys. Must contain at least one hash if provided. A workspace-scoped management key can only name API keys in its own workspace; any other hash returns 400. | null |
+| `broadcast_generation_cost` | *Optional[bool]* | ➖ | When true, include cost and billing generation metadata. | false |
+| `broadcast_generation_cost_allocation` | *Optional[bool]* | ➖ | Beta. When true, include openrouter_cost_allocation: per-token-kind usage and cost, sent only when they reconcile with the billed cost. | false |
+| `broadcast_generation_identity` | *Optional[bool]* | ➖ | When true, include identity generation metadata. | false |
+| `broadcast_generation_request_context` | *Optional[bool]* | ➖ | When true, include request-context generation metadata. | false |
+| `config` | Dict[str, *Any*] | ✔️ | Provider-specific configuration. The shape depends on `type` and is validated server-side. | \{
"baseUrl": "https://us.cloud.langfuse.com",
"publicKey": "pk-l...EfGh",
"secretKey": "sk-l...AbCd"
} |
+| `enabled` | *Optional[bool]* | ➖ | Whether this destination should be enabled immediately. | true |
+| `filter_rules` | [OptionalNullable[components.ObservabilityFilterRulesConfigNullable]](../components/observabilityfilterrulesconfignullable.mdx) | ➖ | Optional structured filter rules controlling which events are forwarded. | null |
+| `name` | *str* | ✔️ | Human-readable name for the destination. | Production Langfuse |
+| `privacy_mode` | *Optional[bool]* | ➖ | When true, request/response bodies are not forwarded — only metadata. | false |
+| `regions` | List[[components.ObservabilityDataRegionInput](../components/observabilitydataregioninput.mdx)] | ➖ | Data regions this destination applies to. `eu` is accepted as an alias for `europe` and normalizes to `europe`. Omitting this field defaults to ['global']; the array must be non-empty. | [
"global"
] |
+| `sampling_rate` | *Optional[float]* | ➖ | Sampling rate between 0.0001 and 1 (1 = 100%). | 1 |
+| `type` | [components.CreateObservabilityDestinationRequestType](../components/createobservabilitydestinationrequesttype.mdx) | ✔️ | The destination type. Only stable destination types are accepted. | langfuse |
+| `workspace_id` | *Optional[str]* | ➖ | Optional workspace ID. Defaults to the authenticated entity's default workspace, or a workspace-scoped management key's own workspace. | 550e8400-e29b-41d4-a716-446655440000 |
\ No newline at end of file
diff --git a/docs/components/extractionasset.mdx b/docs/components/extractionasset.mdx
index 6fdc05859..ee730bf09 100644
--- a/docs/components/extractionasset.mdx
+++ b/docs/components/extractionasset.mdx
@@ -2,7 +2,7 @@
title: "ExtractionAsset"
---
-An image or PDF sent once and referenced by its key in the `assets` map. `data_base64` is the file in standard base64 with no `data:` prefix. PDF is read by document models only.
+An image or PDF sent once and referenced by its key in the `assets` map. `data_base64` is the file in standard base64 with no `data:` prefix. Which formats are read is model-specific: a format the model cannot read fails with a 400.
## Fields
diff --git a/docs/components/extractionassetformat.mdx b/docs/components/extractionassetformat.mdx
index 3e27b886c..3e899e578 100644
--- a/docs/components/extractionassetformat.mdx
+++ b/docs/components/extractionassetformat.mdx
@@ -19,4 +19,5 @@ This is an open enum. Unrecognized values will not fail type checks.
- `"png"`
- `"jpg"`
- `"jpeg"`
+- `"webp"`
- `"pdf"`
diff --git a/docs/components/extractiondateanswer.mdx b/docs/components/extractiondateanswer.mdx
index dfbba98df..acbc1ba36 100644
--- a/docs/components/extractiondateanswer.mdx
+++ b/docs/components/extractiondateanswer.mdx
@@ -4,13 +4,13 @@ title: "ExtractionDateAnswer"
## Fields
-| Field | Type | Required | Description |
-| ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| `confidence` | *Optional[float]* | ➖ | N/A |
-| `guess` | *Optional[str]* | ➖ | The most likely value even when `value` is null because `p_null` crossed the threshold. |
-| `p_null` | *Optional[float]* | ➖ | Probability that the state contains nothing for this field. |
-| `source` | [Optional[components.ExtractionDateAnswerSource]](../components/extractiondateanswersource.mdx) | ➖ | Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text. |
-| `span` | List[*int*] | ➖ | Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. |
-| `spell_confidence` | *Optional[float]* | ➖ | Confidence in the spelling of text read from an image. |
-| `type` | [components.ExtractionDateAnswerType](../components/extractiondateanswertype.mdx) | ✔️ | N/A |
-| `value` | *Nullable[str]* | ✔️ | N/A |
\ No newline at end of file
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `confidence` | *Optional[float]* | ➖ | N/A |
+| `guess` | *Optional[str]* | ➖ | The most likely value even when `value` is null because `p_null` crossed the threshold. |
+| `p_null` | *Optional[float]* | ➖ | Probability that the state contains nothing for this field. |
+| `source` | [Optional[components.ExtractionDateAnswerSource]](../components/extractiondateanswersource.mdx) | ➖ | Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text. |
+| `span` | List[*int*] | ➖ | Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it. |
+| `spell_confidence` | *Optional[float]* | ➖ | Confidence in the spelling of text read from an image. |
+| `type` | [components.ExtractionDateAnswerType](../components/extractiondateanswertype.mdx) | ✔️ | N/A |
+| `value` | *Nullable[str]* | ✔️ | N/A |
\ No newline at end of file
diff --git a/docs/components/extractiondatefield.mdx b/docs/components/extractiondatefield.mdx
index ecceaea22..5fdd8dc70 100644
--- a/docs/components/extractiondatefield.mdx
+++ b/docs/components/extractiondatefield.mdx
@@ -8,4 +8,5 @@ title: "ExtractionDateField"
| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ |
| `instructions` | *Optional[str]* | ➖ | What the field should contain. |
| `null_threshold` | *Optional[float]* | ➖ | Probability of null above which `value` is null. Default 0.5. |
-| `type` | [components.ExtractionDateFieldType](../components/extractiondatefieldtype.mdx) | ✔️ | N/A |
\ No newline at end of file
+| `type` | [components.ExtractionDateFieldType](../components/extractiondatefieldtype.mdx) | ✔️ | N/A |
+| `unit` | *Optional[str]* | ➖ | Unit label for the value. |
\ No newline at end of file
diff --git a/docs/components/extractiondatetimeanswer.mdx b/docs/components/extractiondatetimeanswer.mdx
index fcd2722f6..74b9deb22 100644
--- a/docs/components/extractiondatetimeanswer.mdx
+++ b/docs/components/extractiondatetimeanswer.mdx
@@ -4,13 +4,13 @@ title: "ExtractionDatetimeAnswer"
## Fields
-| Field | Type | Required | Description |
-| ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| `confidence` | *Optional[float]* | ➖ | N/A |
-| `guess` | *Optional[str]* | ➖ | The most likely value even when `value` is null because `p_null` crossed the threshold. |
-| `p_null` | *Optional[float]* | ➖ | Probability that the state contains nothing for this field. |
-| `source` | [Optional[components.ExtractionDatetimeAnswerSource]](../components/extractiondatetimeanswersource.mdx) | ➖ | Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text. |
-| `span` | List[*int*] | ➖ | Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. |
-| `spell_confidence` | *Optional[float]* | ➖ | Confidence in the spelling of text read from an image. |
-| `type` | [components.ExtractionDatetimeAnswerType](../components/extractiondatetimeanswertype.mdx) | ✔️ | N/A |
-| `value` | *Nullable[str]* | ✔️ | N/A |
\ No newline at end of file
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `confidence` | *Optional[float]* | ➖ | N/A |
+| `guess` | *Optional[str]* | ➖ | The most likely value even when `value` is null because `p_null` crossed the threshold. |
+| `p_null` | *Optional[float]* | ➖ | Probability that the state contains nothing for this field. |
+| `source` | [Optional[components.ExtractionDatetimeAnswerSource]](../components/extractiondatetimeanswersource.mdx) | ➖ | Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text. |
+| `span` | List[*int*] | ➖ | Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it. |
+| `spell_confidence` | *Optional[float]* | ➖ | Confidence in the spelling of text read from an image. |
+| `type` | [components.ExtractionDatetimeAnswerType](../components/extractiondatetimeanswertype.mdx) | ✔️ | N/A |
+| `value` | *Nullable[str]* | ✔️ | N/A |
\ No newline at end of file
diff --git a/docs/components/extractiondatetimefield.mdx b/docs/components/extractiondatetimefield.mdx
index 1c6a9f4ef..56724af58 100644
--- a/docs/components/extractiondatetimefield.mdx
+++ b/docs/components/extractiondatetimefield.mdx
@@ -8,4 +8,5 @@ title: "ExtractionDatetimeField"
| -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
| `instructions` | *Optional[str]* | ➖ | What the field should contain. |
| `null_threshold` | *Optional[float]* | ➖ | Probability of null above which `value` is null. Default 0.5. |
-| `type` | [components.ExtractionDatetimeFieldType](../components/extractiondatetimefieldtype.mdx) | ✔️ | N/A |
\ No newline at end of file
+| `type` | [components.ExtractionDatetimeFieldType](../components/extractiondatetimefieldtype.mdx) | ✔️ | N/A |
+| `unit` | *Optional[str]* | ➖ | Unit label for the value. |
\ No newline at end of file
diff --git a/docs/components/extractiondurationanswer.mdx b/docs/components/extractiondurationanswer.mdx
index acc4cdcf8..0045e3f3f 100644
--- a/docs/components/extractiondurationanswer.mdx
+++ b/docs/components/extractiondurationanswer.mdx
@@ -4,14 +4,14 @@ title: "ExtractionDurationAnswer"
## Fields
-| Field | Type | Required | Description |
-| ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| `confidence` | *Optional[float]* | ➖ | N/A |
-| `guess` | *Optional[float]* | ➖ | The most likely value even when `value` is null because `p_null` crossed the threshold. |
-| `p_null` | *Optional[float]* | ➖ | Probability that the state contains nothing for this field. |
-| `source` | [Optional[components.ExtractionDurationAnswerSource]](../components/extractiondurationanswersource.mdx) | ➖ | Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text. |
-| `span` | List[*int*] | ➖ | Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. |
-| `spell_confidence` | *Optional[float]* | ➖ | Confidence in the spelling of text read from an image. |
-| `type` | [components.ExtractionDurationAnswerType](../components/extractiondurationanswertype.mdx) | ✔️ | N/A |
-| `unit` | *Optional[str]* | ➖ | The unit `value` is expressed in. |
-| `value` | *Nullable[float]* | ✔️ | N/A |
\ No newline at end of file
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `confidence` | *Optional[float]* | ➖ | N/A |
+| `guess` | *Optional[float]* | ➖ | The most likely value even when `value` is null because `p_null` crossed the threshold. |
+| `p_null` | *Optional[float]* | ➖ | Probability that the state contains nothing for this field. |
+| `source` | [Optional[components.ExtractionDurationAnswerSource]](../components/extractiondurationanswersource.mdx) | ➖ | Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text. |
+| `span` | List[*int*] | ➖ | Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it. |
+| `spell_confidence` | *Optional[float]* | ➖ | Confidence in the spelling of text read from an image. |
+| `type` | [components.ExtractionDurationAnswerType](../components/extractiondurationanswertype.mdx) | ✔️ | N/A |
+| `unit` | *Optional[str]* | ➖ | The unit `value` is expressed in. |
+| `value` | *Nullable[float]* | ✔️ | N/A |
\ No newline at end of file
diff --git a/docs/components/extractiondurationfield.mdx b/docs/components/extractiondurationfield.mdx
index 1bcc7faa0..ff69b93d0 100644
--- a/docs/components/extractiondurationfield.mdx
+++ b/docs/components/extractiondurationfield.mdx
@@ -8,7 +8,7 @@ title: "ExtractionDurationField"
| -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
| `decimals` | *Optional[int]* | ➖ | Decimal places kept in `value`. |
| `instructions` | *Optional[str]* | ➖ | What the field should contain. |
-| `integer` | *Optional[bool]* | ➖ | N/A |
+| `integer` | *Optional[bool]* | ➖ | Whole numbers only. |
| `null_threshold` | *Optional[float]* | ➖ | Probability of null above which `value` is null. Default 0.5. |
| `type` | [components.ExtractionDurationFieldType](../components/extractiondurationfieldtype.mdx) | ✔️ | N/A |
| `unit` | *Optional[str]* | ➖ | seconds, minutes, hours, days, weeks, months or years. |
\ No newline at end of file
diff --git a/docs/components/extractionestimatefield.mdx b/docs/components/extractionestimatefield.mdx
index 7f18a341b..31eb753a6 100644
--- a/docs/components/extractionestimatefield.mdx
+++ b/docs/components/extractionestimatefield.mdx
@@ -4,13 +4,13 @@ title: "ExtractionEstimateField"
## Fields
-| Field | Type | Required | Description |
-| ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
-| `instructions` | *Optional[str]* | ➖ | What the field should contain. |
-| `max` | [components.ExtractionEstimateFieldMax](../components/extractionestimatefieldmax.mdx) | ✔️ | N/A |
-| `min` | [components.ExtractionEstimateFieldMin](../components/extractionestimatefieldmin.mdx) | ✔️ | N/A |
-| `null_threshold` | *Optional[float]* | ➖ | Probability of null above which `value` is null. Default 0.5. |
-| `scale` | [Optional[components.ExtractionEstimateFieldScale]](../components/extractionestimatefieldscale.mdx) | ➖ | N/A |
-| `step` | [Optional[components.ExtractionEstimateFieldStepUnion]](../components/extractionestimatefieldstepunion.mdx) | ➖ | N/A |
-| `type` | [components.ExtractionEstimateFieldType](../components/extractionestimatefieldtype.mdx) | ✔️ | N/A |
-| `unit` | *Optional[str]* | ➖ | N/A |
\ No newline at end of file
+| Field | Type | Required | Description |
+| --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
+| `instructions` | *Optional[str]* | ➖ | What the field should contain. |
+| `max` | [components.ExtractionEstimateFieldMax](../components/extractionestimatefieldmax.mdx) | ✔️ | N/A |
+| `min` | [components.ExtractionEstimateFieldMin](../components/extractionestimatefieldmin.mdx) | ✔️ | N/A |
+| `null_threshold` | *Optional[float]* | ➖ | Not read on this field type: no model takes a null threshold here, and a request that sets it fails with a 400. |
+| `scale` | [Optional[components.ExtractionEstimateFieldScale]](../components/extractionestimatefieldscale.mdx) | ➖ | N/A |
+| `step` | [Optional[components.ExtractionEstimateFieldStepUnion]](../components/extractionestimatefieldstepunion.mdx) | ➖ | N/A |
+| `type` | [components.ExtractionEstimateFieldType](../components/extractionestimatefieldtype.mdx) | ✔️ | N/A |
+| `unit` | *Optional[str]* | ➖ | Unit label for the value. |
\ No newline at end of file
diff --git a/docs/components/extractionforecastfield.mdx b/docs/components/extractionforecastfield.mdx
index db299598c..862eefcd9 100644
--- a/docs/components/extractionforecastfield.mdx
+++ b/docs/components/extractionforecastfield.mdx
@@ -4,15 +4,15 @@ title: "ExtractionForecastField"
## Fields
-| Field | Type | Required | Description |
-| ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
-| `horizon` | *int* | ✔️ | Number of forecast steps. |
-| `instructions` | *Optional[str]* | ➖ | What the field should contain. |
-| `interval` | [components.Interval](../components/interval.mdx) | ✔️ | N/A |
-| `max` | [components.ExtractionForecastFieldMax](../components/extractionforecastfieldmax.mdx) | ✔️ | N/A |
-| `min` | [components.ExtractionForecastFieldMin](../components/extractionforecastfieldmin.mdx) | ✔️ | N/A |
-| `null_threshold` | *Optional[float]* | ➖ | Probability of null above which `value` is null. Default 0.5. |
-| `scale` | [Optional[components.ExtractionForecastFieldScale]](../components/extractionforecastfieldscale.mdx) | ➖ | N/A |
-| `step` | [Optional[components.ExtractionForecastFieldStepUnion]](../components/extractionforecastfieldstepunion.mdx) | ➖ | N/A |
-| `type` | [components.ExtractionForecastFieldType](../components/extractionforecastfieldtype.mdx) | ✔️ | N/A |
-| `unit` | *Optional[str]* | ➖ | N/A |
\ No newline at end of file
+| Field | Type | Required | Description |
+| --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
+| `horizon` | *int* | ✔️ | Number of forecast steps. |
+| `instructions` | *Optional[str]* | ➖ | What the field should contain. |
+| `interval` | [components.Interval](../components/interval.mdx) | ✔️ | N/A |
+| `max` | [components.ExtractionForecastFieldMax](../components/extractionforecastfieldmax.mdx) | ✔️ | N/A |
+| `min` | [components.ExtractionForecastFieldMin](../components/extractionforecastfieldmin.mdx) | ✔️ | N/A |
+| `null_threshold` | *Optional[float]* | ➖ | Not read on this field type: no model takes a null threshold here, and a request that sets it fails with a 400. |
+| `scale` | [Optional[components.ExtractionForecastFieldScale]](../components/extractionforecastfieldscale.mdx) | ➖ | N/A |
+| `step` | [Optional[components.ExtractionForecastFieldStepUnion]](../components/extractionforecastfieldstepunion.mdx) | ➖ | N/A |
+| `type` | [components.ExtractionForecastFieldType](../components/extractionforecastfieldtype.mdx) | ✔️ | N/A |
+| `unit` | *Optional[str]* | ➖ | Unit label for the value. |
\ No newline at end of file
diff --git a/docs/components/extractionlistanswer.mdx b/docs/components/extractionlistanswer.mdx
index 6c314960c..556dae9ef 100644
--- a/docs/components/extractionlistanswer.mdx
+++ b/docs/components/extractionlistanswer.mdx
@@ -4,14 +4,14 @@ title: "ExtractionListAnswer"
## Fields
-| Field | Type | Required | Description |
-| ------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
-| `confidence` | *Optional[float]* | ➖ | N/A |
-| `confidences` | List[*float*] | ➖ | One confidence per item of `value`, in the same order. |
-| `guess` | List[[components.ExtractionListAnswerGuess](../components/extractionlistanswerguess.mdx)] | ➖ | The most likely value even when `value` is null because `p_null` crossed the threshold. |
-| `p_null` | *Optional[float]* | ➖ | Probability that the state contains nothing for this field. |
-| `source` | [Optional[components.ExtractionListAnswerSource]](../components/extractionlistanswersource.mdx) | ➖ | Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text. |
-| `spans` | List[List[*int*]] | ➖ | One span per item of `value`, in the same order; null for an item that has no offsets in the state text (read from an image or a document). |
-| `spell_confidence` | *Optional[float]* | ➖ | Confidence in the spelling of text read from an image. |
-| `type` | [components.ExtractionListAnswerType](../components/extractionlistanswertype.mdx) | ✔️ | N/A |
-| `value` | List[[components.ExtractionListAnswerValue](../components/extractionlistanswervalue.mdx)] | ✔️ | N/A |
\ No newline at end of file
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `confidence` | *Optional[float]* | ➖ | N/A |
+| `confidences` | List[*float*] | ➖ | One confidence per item of `value`, in the same order. |
+| `guess` | List[[components.ExtractionListAnswerGuess](../components/extractionlistanswerguess.mdx)] | ➖ | The most likely value even when `value` is null because `p_null` crossed the threshold. |
+| `p_null` | *Optional[float]* | ➖ | Probability that the state contains nothing for this field. |
+| `source` | [Optional[components.ExtractionListAnswerSource]](../components/extractionlistanswersource.mdx) | ➖ | Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text. |
+| `spans` | List[List[*int*]] | ➖ | One span per item of `value`, in the same order; null for an item that has no offsets in the state text: one read from an image or a document, or one the provider returned without offsets that delimit it. |
+| `spell_confidence` | *Optional[float]* | ➖ | Confidence in the spelling of text read from an image. |
+| `type` | [components.ExtractionListAnswerType](../components/extractionlistanswertype.mdx) | ✔️ | N/A |
+| `value` | List[[components.ExtractionListAnswerValue](../components/extractionlistanswervalue.mdx)] | ✔️ | N/A |
\ No newline at end of file
diff --git a/docs/components/extractionlistfield.mdx b/docs/components/extractionlistfield.mdx
index 0a3b5068b..4e24f3145 100644
--- a/docs/components/extractionlistfield.mdx
+++ b/docs/components/extractionlistfield.mdx
@@ -8,6 +8,8 @@ title: "ExtractionListField"
| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ |
| `decimals` | *Optional[int]* | ➖ | Decimal places kept in `value`. |
| `instructions` | *Optional[str]* | ➖ | What the field should contain. |
+| `integer` | *Optional[bool]* | ➖ | Whole numbers only. Lists of numbers only. |
| `items` | [components.Items](../components/items.mdx) | ✔️ | N/A |
| `null_threshold` | *Optional[float]* | ➖ | Probability of null above which `value` is null. Default 0.5. |
-| `type` | [components.ExtractionListFieldType](../components/extractionlistfieldtype.mdx) | ✔️ | N/A |
\ No newline at end of file
+| `type` | [components.ExtractionListFieldType](../components/extractionlistfieldtype.mdx) | ✔️ | N/A |
+| `unit` | *Optional[str]* | ➖ | Unit label for the value. |
\ No newline at end of file
diff --git a/docs/components/extractionnumberanswer.mdx b/docs/components/extractionnumberanswer.mdx
index f87020791..0d80f866e 100644
--- a/docs/components/extractionnumberanswer.mdx
+++ b/docs/components/extractionnumberanswer.mdx
@@ -4,13 +4,13 @@ title: "ExtractionNumberAnswer"
## Fields
-| Field | Type | Required | Description |
-| ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| `confidence` | *Optional[float]* | ➖ | N/A |
-| `guess` | *Optional[float]* | ➖ | The most likely value even when `value` is null because `p_null` crossed the threshold. |
-| `p_null` | *Optional[float]* | ➖ | Probability that the state contains nothing for this field. |
-| `source` | [Optional[components.ExtractionNumberAnswerSource]](../components/extractionnumberanswersource.mdx) | ➖ | Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text. |
-| `span` | List[*int*] | ➖ | Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. |
-| `spell_confidence` | *Optional[float]* | ➖ | Confidence in the spelling of text read from an image. |
-| `type` | [components.ExtractionNumberAnswerType](../components/extractionnumberanswertype.mdx) | ✔️ | N/A |
-| `value` | *Nullable[float]* | ✔️ | N/A |
\ No newline at end of file
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `confidence` | *Optional[float]* | ➖ | N/A |
+| `guess` | *Optional[float]* | ➖ | The most likely value even when `value` is null because `p_null` crossed the threshold. |
+| `p_null` | *Optional[float]* | ➖ | Probability that the state contains nothing for this field. |
+| `source` | [Optional[components.ExtractionNumberAnswerSource]](../components/extractionnumberanswersource.mdx) | ➖ | Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text. |
+| `span` | List[*int*] | ➖ | Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it. |
+| `spell_confidence` | *Optional[float]* | ➖ | Confidence in the spelling of text read from an image. |
+| `type` | [components.ExtractionNumberAnswerType](../components/extractionnumberanswertype.mdx) | ✔️ | N/A |
+| `value` | *Nullable[float]* | ✔️ | N/A |
\ No newline at end of file
diff --git a/docs/components/extractionnumberfield.mdx b/docs/components/extractionnumberfield.mdx
index a57a6dc65..ed93a5551 100644
--- a/docs/components/extractionnumberfield.mdx
+++ b/docs/components/extractionnumberfield.mdx
@@ -8,7 +8,7 @@ title: "ExtractionNumberField"
| ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
| `decimals` | *Optional[int]* | ➖ | Decimal places kept in `value`. |
| `instructions` | *Optional[str]* | ➖ | What the field should contain. |
-| `integer` | *Optional[bool]* | ➖ | N/A |
+| `integer` | *Optional[bool]* | ➖ | Whole numbers only. |
| `null_threshold` | *Optional[float]* | ➖ | Probability of null above which `value` is null. Default 0.5. |
| `type` | [components.ExtractionNumberFieldType](../components/extractionnumberfieldtype.mdx) | ✔️ | N/A |
-| `unit` | *Optional[str]* | ➖ | N/A |
\ No newline at end of file
+| `unit` | *Optional[str]* | ➖ | Unit label for the value. |
\ No newline at end of file
diff --git a/docs/components/extractionsrequest.mdx b/docs/components/extractionsrequest.mdx
index 875659a62..ba054578f 100644
--- a/docs/components/extractionsrequest.mdx
+++ b/docs/components/extractionsrequest.mdx
@@ -4,14 +4,14 @@ title: "ExtractionsRequest"
## Fields
-| Field | Type | Required | Description | Example |
-| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `assets` | Dict[str, [components.ExtractionAsset](../components/extractionasset.mdx)] | ➖ | Assets keyed by reference string. Write a reference wherever the asset belongs in `state` or a field `instructions`; every asset must be referenced at least once. A `state` that is exactly the sole asset's key carries no text of its own and is read as file-only. A model that reads either text or a document per request, not both (ScaleDown Extract with a PDF), needs that form: any other text around the key is state text and is rejected with 400. | |
-| `fields` | Dict[str, [components.Fields](../components/fields.mdx)] | ✔️ | Map of field name to typed field spec. | |
-| `model` | *str* | ✔️ | N/A | |
-| `provider` | [OptionalNullable[components.ProviderPreferences]](../components/providerpreferences.mdx) | ➖ | N/A | \{
"allow_fallbacks": true
} |
-| `reference_date` | *Optional[str]* | ➖ | ISO date that anchors dates written without a year. | |
-| `session_id` | *Optional[str]* | ➖ | A unique identifier for grouping related requests (e.g., a conversation or agent workflow). Used for observability grouping in Broadcast and private logging; never sent to the provider. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 256 characters. | session-1234 |
-| `state` | *str* | ✔️ | The text to read from. May be empty only when the request carries image assets. | |
-| `trace` | [Optional[components.TraceConfig]](../components/traceconfig.mdx) | ➖ | Metadata for observability and tracing. Known keys (trace_id, trace_name, span_name, generation_name, parent_span_id) have special handling. Additional keys are passed through as custom metadata to configured broadcast destinations. | \{
"trace_id": "trace-abc123",
"trace_name": "my-app-trace"
} |
-| `user` | *Optional[str]* | ➖ | N/A | |
\ No newline at end of file
+| Field | Type | Required | Description | Example |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `assets` | Dict[str, [components.ExtractionAsset](../components/extractionasset.mdx)] | ➖ | Assets keyed by reference string. Write a reference wherever the asset belongs in `state` or a field `instructions`; every asset must be referenced at least once, unless `state` is empty or omitted, in which case the assets are read without a reference. A `state` that is exactly the sole asset's key carries no text of its own and is read as file-only. A model that reads either text or a document per request, not both (ScaleDown Extract with a PDF), takes that form or an empty or omitted `state`: any other text around the key is state text and is rejected with 400. | |
+| `fields` | Dict[str, [components.Fields](../components/fields.mdx)] | ✔️ | Map of field name to typed field spec. | |
+| `model` | *str* | ✔️ | N/A | |
+| `provider` | [OptionalNullable[components.ProviderPreferences]](../components/providerpreferences.mdx) | ➖ | N/A | \{
"allow_fallbacks": true
} |
+| `reference_date` | *Optional[str]* | ➖ | ISO date that anchors dates written without a year. | |
+| `session_id` | *Optional[str]* | ➖ | A unique identifier for grouping related requests (e.g., a conversation or agent workflow). Used for observability grouping in Broadcast and private logging; never sent to the provider. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 256 characters. | session-1234 |
+| `state` | *Optional[str]* | ➖ | The text to read from. May be empty or omitted only when the request carries assets, which are then read without being referenced by key. | |
+| `trace` | [Optional[components.TraceConfig]](../components/traceconfig.mdx) | ➖ | Metadata for observability and tracing. Known keys (trace_id, trace_name, span_name, generation_name, parent_span_id) have special handling. Additional keys are passed through as custom metadata to configured broadcast destinations. | \{
"trace_id": "trace-abc123",
"trace_name": "my-app-trace"
} |
+| `user` | *Optional[str]* | ➖ | N/A | |
\ No newline at end of file
diff --git a/docs/components/extractiontextanswer.mdx b/docs/components/extractiontextanswer.mdx
index 2e4bf9d37..bd56365a4 100644
--- a/docs/components/extractiontextanswer.mdx
+++ b/docs/components/extractiontextanswer.mdx
@@ -4,13 +4,13 @@ title: "ExtractionTextAnswer"
## Fields
-| Field | Type | Required | Description |
-| ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| `confidence` | *Optional[float]* | ➖ | N/A |
-| `guess` | *Optional[str]* | ➖ | The most likely value even when `value` is null because `p_null` crossed the threshold. |
-| `p_null` | *Optional[float]* | ➖ | Probability that the state contains nothing for this field. |
-| `source` | [Optional[components.ExtractionTextAnswerSource]](../components/extractiontextanswersource.mdx) | ➖ | Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text. |
-| `span` | List[*int*] | ➖ | Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. |
-| `spell_confidence` | *Optional[float]* | ➖ | Confidence in the spelling of text read from an image. |
-| `type` | [components.ExtractionTextAnswerType](../components/extractiontextanswertype.mdx) | ✔️ | N/A |
-| `value` | *Nullable[str]* | ✔️ | N/A |
\ No newline at end of file
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `confidence` | *Optional[float]* | ➖ | N/A |
+| `guess` | *Optional[str]* | ➖ | The most likely value even when `value` is null because `p_null` crossed the threshold. |
+| `p_null` | *Optional[float]* | ➖ | Probability that the state contains nothing for this field. |
+| `source` | [Optional[components.ExtractionTextAnswerSource]](../components/extractiontextanswersource.mdx) | ➖ | Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text. |
+| `span` | List[*int*] | ➖ | Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it. |
+| `spell_confidence` | *Optional[float]* | ➖ | Confidence in the spelling of text read from an image. |
+| `type` | [components.ExtractionTextAnswerType](../components/extractiontextanswertype.mdx) | ✔️ | N/A |
+| `value` | *Nullable[str]* | ✔️ | N/A |
\ No newline at end of file
diff --git a/docs/components/extractiontextfield.mdx b/docs/components/extractiontextfield.mdx
index 7f4c2d28f..c99bd903e 100644
--- a/docs/components/extractiontextfield.mdx
+++ b/docs/components/extractiontextfield.mdx
@@ -8,4 +8,5 @@ title: "ExtractionTextField"
| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ |
| `instructions` | *Optional[str]* | ➖ | What the field should contain. |
| `null_threshold` | *Optional[float]* | ➖ | Probability of null above which `value` is null. Default 0.5. |
-| `type` | [components.ExtractionTextFieldType](../components/extractiontextfieldtype.mdx) | ✔️ | N/A |
\ No newline at end of file
+| `type` | [components.ExtractionTextFieldType](../components/extractiontextfieldtype.mdx) | ✔️ | N/A |
+| `unit` | *Optional[str]* | ➖ | Unit label for the value. |
\ No newline at end of file
diff --git a/docs/components/extractiontimeanswer.mdx b/docs/components/extractiontimeanswer.mdx
index 025bdf948..b67d655bb 100644
--- a/docs/components/extractiontimeanswer.mdx
+++ b/docs/components/extractiontimeanswer.mdx
@@ -4,13 +4,13 @@ title: "ExtractionTimeAnswer"
## Fields
-| Field | Type | Required | Description |
-| ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| `confidence` | *Optional[float]* | ➖ | N/A |
-| `guess` | *Optional[str]* | ➖ | The most likely value even when `value` is null because `p_null` crossed the threshold. |
-| `p_null` | *Optional[float]* | ➖ | Probability that the state contains nothing for this field. |
-| `source` | [Optional[components.ExtractionTimeAnswerSource]](../components/extractiontimeanswersource.mdx) | ➖ | Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text. |
-| `span` | List[*int*] | ➖ | Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. |
-| `spell_confidence` | *Optional[float]* | ➖ | Confidence in the spelling of text read from an image. |
-| `type` | [components.ExtractionTimeAnswerType](../components/extractiontimeanswertype.mdx) | ✔️ | N/A |
-| `value` | *Nullable[str]* | ✔️ | N/A |
\ No newline at end of file
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `confidence` | *Optional[float]* | ➖ | N/A |
+| `guess` | *Optional[str]* | ➖ | The most likely value even when `value` is null because `p_null` crossed the threshold. |
+| `p_null` | *Optional[float]* | ➖ | Probability that the state contains nothing for this field. |
+| `source` | [Optional[components.ExtractionTimeAnswerSource]](../components/extractiontimeanswersource.mdx) | ➖ | Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text. |
+| `span` | List[*int*] | ➖ | Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it. |
+| `spell_confidence` | *Optional[float]* | ➖ | Confidence in the spelling of text read from an image. |
+| `type` | [components.ExtractionTimeAnswerType](../components/extractiontimeanswertype.mdx) | ✔️ | N/A |
+| `value` | *Nullable[str]* | ✔️ | N/A |
\ No newline at end of file
diff --git a/docs/components/extractiontimefield.mdx b/docs/components/extractiontimefield.mdx
index 3d48fdab6..34a6debce 100644
--- a/docs/components/extractiontimefield.mdx
+++ b/docs/components/extractiontimefield.mdx
@@ -8,4 +8,5 @@ title: "ExtractionTimeField"
| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ |
| `instructions` | *Optional[str]* | ➖ | What the field should contain. |
| `null_threshold` | *Optional[float]* | ➖ | Probability of null above which `value` is null. Default 0.5. |
-| `type` | [components.ExtractionTimeFieldType](../components/extractiontimefieldtype.mdx) | ✔️ | N/A |
\ No newline at end of file
+| `type` | [components.ExtractionTimeFieldType](../components/extractiontimefieldtype.mdx) | ✔️ | N/A |
+| `unit` | *Optional[str]* | ➖ | Unit label for the value. |
\ No newline at end of file
diff --git a/docs/components/updateobservabilitydestinationrequest.mdx b/docs/components/updateobservabilitydestinationrequest.mdx
index 2ea89116a..2f9670f03 100644
--- a/docs/components/updateobservabilitydestinationrequest.mdx
+++ b/docs/components/updateobservabilitydestinationrequest.mdx
@@ -4,17 +4,17 @@ title: "UpdateObservabilityDestinationRequest"
## Fields
-| Field | Type | Required | Description | Example |
-| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `api_key_hashes` | List[*str*] | ➖ | Optional allowlist of OpenRouter API key hashes. `null` clears the filter (all keys). Omitting leaves the current value. Must contain at least one hash if provided. | null |
-| `broadcast_generation_cost` | *Optional[bool]* | ➖ | Whether to include cost and billing generation metadata. | false |
-| `broadcast_generation_cost_allocation` | *Optional[bool]* | ➖ | Beta. When true, include openrouter_cost_allocation: per-token-kind usage and cost, sent only when they reconcile with the billed cost. | false |
-| `broadcast_generation_identity` | *Optional[bool]* | ➖ | Whether to include identity generation metadata. | false |
-| `broadcast_generation_request_context` | *Optional[bool]* | ➖ | Whether to include request-context generation metadata. | false |
-| `config` | Dict[str, *Any*] | ➖ | Provider-specific configuration fields to update. Masked values are ignored; unset fields keep their current value. | \{
"baseUrl": "https://us.cloud.langfuse.com",
"publicKey": "pk-l...EfGh",
"secretKey": "sk-l...AbCd"
} |
-| `enabled` | *Optional[bool]* | ➖ | Whether the destination is enabled. | true |
-| `filter_rules` | [OptionalNullable[components.ObservabilityFilterRulesConfigNullable]](../components/observabilityfilterrulesconfignullable.mdx) | ➖ | N/A | null |
-| `name` | *Optional[str]* | ➖ | Human-readable name for the destination. | Production Langfuse |
-| `privacy_mode` | *Optional[bool]* | ➖ | When true, request/response bodies are not forwarded — only metadata. | false |
-| `regions` | List[[components.ObservabilityDataRegionInput](../components/observabilitydataregioninput.mdx)] | ➖ | Data regions this destination applies to. `eu` is accepted as an alias for `europe` and normalizes to `europe`. Omitting this field keeps the current value; it cannot be cleared. | [
"global"
] |
-| `sampling_rate` | *Optional[float]* | ➖ | Sampling rate between 0.0001 and 1 (1 = 100%). | 1 |
\ No newline at end of file
+| Field | Type | Required | Description | Example |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `api_key_hashes` | List[*str*] | ➖ | Optional allowlist of OpenRouter API key hashes. `null` clears the filter (all keys). Omitting leaves the current value, including any API key from another workspace that an organization-scoped key attached. Must contain at least one hash if provided. A workspace-scoped management key can only name API keys in its own workspace; any other hash returns 400. | null |
+| `broadcast_generation_cost` | *Optional[bool]* | ➖ | Whether to include cost and billing generation metadata. | false |
+| `broadcast_generation_cost_allocation` | *Optional[bool]* | ➖ | Beta. When true, include openrouter_cost_allocation: per-token-kind usage and cost, sent only when they reconcile with the billed cost. | false |
+| `broadcast_generation_identity` | *Optional[bool]* | ➖ | Whether to include identity generation metadata. | false |
+| `broadcast_generation_request_context` | *Optional[bool]* | ➖ | Whether to include request-context generation metadata. | false |
+| `config` | Dict[str, *Any*] | ➖ | Provider-specific configuration fields to update. Masked values are ignored; unset fields keep their current value. | \{
"baseUrl": "https://us.cloud.langfuse.com",
"publicKey": "pk-l...EfGh",
"secretKey": "sk-l...AbCd"
} |
+| `enabled` | *Optional[bool]* | ➖ | Whether the destination is enabled. | true |
+| `filter_rules` | [OptionalNullable[components.ObservabilityFilterRulesConfigNullable]](../components/observabilityfilterrulesconfignullable.mdx) | ➖ | N/A | null |
+| `name` | *Optional[str]* | ➖ | Human-readable name for the destination. | Production Langfuse |
+| `privacy_mode` | *Optional[bool]* | ➖ | When true, request/response bodies are not forwarded — only metadata. | false |
+| `regions` | List[[components.ObservabilityDataRegionInput](../components/observabilitydataregioninput.mdx)] | ➖ | Data regions this destination applies to. `eu` is accepted as an alias for `europe` and normalizes to `europe`. Omitting this field keeps the current value; it cannot be cleared. | [
"global"
] |
+| `sampling_rate` | *Optional[float]* | ➖ | Sampling rate between 0.0001 and 1 (1 = 100%). | 1 |
\ No newline at end of file
diff --git a/docs/operations/listobservabilitydestinationsrequest.mdx b/docs/operations/listobservabilitydestinationsrequest.mdx
index c1922a71e..9770f4fb2 100644
--- a/docs/operations/listobservabilitydestinationsrequest.mdx
+++ b/docs/operations/listobservabilitydestinationsrequest.mdx
@@ -4,11 +4,11 @@ title: "ListObservabilityDestinationsRequest"
## Fields
-| Field | Type | Required | Description | Example |
-| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `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.
| |
-| `offset` | *OptionalNullable[int]* | ➖ | Number of records to skip for pagination | 0 |
-| `limit` | *Optional[int]* | ➖ | Maximum number of records to return (max 100) | 50 |
-| `workspace_id` | *Optional[str]* | ➖ | Optional workspace ID to filter by. Defaults to the authenticated entity's default workspace. | 550e8400-e29b-41d4-a716-446655440000 |
\ No newline at end of file
+| Field | Type | Required | Description | Example |
+| --------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `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.
| |
+| `offset` | *OptionalNullable[int]* | ➖ | Number of records to skip for pagination | 0 |
+| `limit` | *Optional[int]* | ➖ | Maximum number of records to return (max 100) | 50 |
+| `workspace_id` | *Optional[str]* | ➖ | Optional workspace ID to filter by. Defaults to the authenticated entity's default workspace, or a workspace-scoped management key's own workspace. | 550e8400-e29b-41d4-a716-446655440000 |
\ No newline at end of file
diff --git a/docs/sdks/extractions/README.mdx b/docs/sdks/extractions/README.mdx
index 8db370b97..7d33becd0 100644
--- a/docs/sdks/extractions/README.mdx
+++ b/docs/sdks/extractions/README.mdx
@@ -52,7 +52,7 @@ with OpenRouter(
"type": "number",
"unit": "USD",
},
- }, model="cloudflare/clairic", state="Invoice INV-2291 issued 2026-09-02, net 30. Contacts: Dana Ruiz, Priya Shah. Total $1080.", reference_date="2026-10-28")
+ }, model="cloudflare/clairic", reference_date="2026-10-28", state="Invoice INV-2291 issued 2026-09-02, net 30. Contacts: Dana Ruiz, Priya Shah. Total $1080.")
# Handle response
print(res)
@@ -61,22 +61,22 @@ with OpenRouter(
### Parameters
-| Parameter | Type | Required | Description | Example |
-| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `fields` | Dict[str, [components.Fields](../../components/fields.mdx)] | ✔️ | Map of field name to typed field spec. | |
-| `model` | *str* | ✔️ | N/A | |
-| `state` | *str* | ✔️ | The text to read from. May be empty only when the request carries image assets. | |
-| `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.
| |
-| `assets` | Dict[str, [components.ExtractionAsset](../../components/extractionasset.mdx)] | ➖ | Assets keyed by reference string. Write a reference wherever the asset belongs in `state` or a field `instructions`; every asset must be referenced at least once. A `state` that is exactly the sole asset's key carries no text of its own and is read as file-only. A model that reads either text or a document per request, not both (ScaleDown Extract with a PDF), needs that form: any other text around the key is state text and is rejected with 400. | |
-| `provider` | [OptionalNullable[components.ProviderPreferences]](../../components/providerpreferences.mdx) | ➖ | N/A | \{
"allow_fallbacks": true
} |
-| `reference_date` | *Optional[str]* | ➖ | ISO date that anchors dates written without a year. | |
-| `session_id` | *Optional[str]* | ➖ | A unique identifier for grouping related requests (e.g., a conversation or agent workflow). Used for observability grouping in Broadcast and private logging; never sent to the provider. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 256 characters. | session-1234 |
-| `trace` | [Optional[components.TraceConfig]](../../components/traceconfig.mdx) | ➖ | Metadata for observability and tracing. Known keys (trace_id, trace_name, span_name, generation_name, parent_span_id) have special handling. Additional keys are passed through as custom metadata to configured broadcast destinations. | \{
"trace_id": "trace-abc123",
"trace_name": "my-app-trace"
} |
-| `user` | *Optional[str]* | ➖ | N/A | |
-| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.mdx) | ➖ | Configuration to override the default retry behavior of the client. | |
-| `server_url` | *Optional[str]* | ➖ | An optional server URL to use. | http://localhost:8080 |
+| Parameter | Type | Required | Description | Example |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `fields` | Dict[str, [components.Fields](../../components/fields.mdx)] | ✔️ | Map of field name to typed field spec. | |
+| `model` | *str* | ✔️ | N/A | |
+| `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.
| |
+| `assets` | Dict[str, [components.ExtractionAsset](../../components/extractionasset.mdx)] | ➖ | Assets keyed by reference string. Write a reference wherever the asset belongs in `state` or a field `instructions`; every asset must be referenced at least once, unless `state` is empty or omitted, in which case the assets are read without a reference. A `state` that is exactly the sole asset's key carries no text of its own and is read as file-only. A model that reads either text or a document per request, not both (ScaleDown Extract with a PDF), takes that form or an empty or omitted `state`: any other text around the key is state text and is rejected with 400. | |
+| `provider` | [OptionalNullable[components.ProviderPreferences]](../../components/providerpreferences.mdx) | ➖ | N/A | \{
"allow_fallbacks": true
} |
+| `reference_date` | *Optional[str]* | ➖ | ISO date that anchors dates written without a year. | |
+| `session_id` | *Optional[str]* | ➖ | A unique identifier for grouping related requests (e.g., a conversation or agent workflow). Used for observability grouping in Broadcast and private logging; never sent to the provider. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 256 characters. | session-1234 |
+| `state` | *Optional[str]* | ➖ | The text to read from. May be empty or omitted only when the request carries assets, which are then read without being referenced by key. | |
+| `trace` | [Optional[components.TraceConfig]](../../components/traceconfig.mdx) | ➖ | Metadata for observability and tracing. Known keys (trace_id, trace_name, span_name, generation_name, parent_span_id) have special handling. Additional keys are passed through as custom metadata to configured broadcast destinations. | \{
"trace_id": "trace-abc123",
"trace_name": "my-app-trace"
} |
+| `user` | *Optional[str]* | ➖ | N/A | |
+| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.mdx) | ➖ | Configuration to override the default retry behavior of the client. | |
+| `server_url` | *Optional[str]* | ➖ | An optional server URL to use. | http://localhost:8080 |
### Response
diff --git a/docs/sdks/observability/README.mdx b/docs/sdks/observability/README.mdx
index 8e494374d..9680c97ef 100644
--- a/docs/sdks/observability/README.mdx
+++ b/docs/sdks/observability/README.mdx
@@ -17,7 +17,7 @@ Observability endpoints
## list
-List the observability destinations configured for the authenticated entity's default workspace. Use the `workspace_id` query parameter to scope the result to a different workspace. Only destinations with stable release status are surfaced — destinations of other types are excluded. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+List the observability destinations configured for the authenticated entity's default workspace, or a workspace-scoped management key's own workspace. Use the `workspace_id` query parameter to scope the result to a different workspace. A workspace-scoped management key can only list its own workspace; any other `workspace_id` returns 403. Only destinations with stable release status are surfaced — destinations of other types are excluded. [Management key](/docs/guides/overview/auth/management-api-keys) required.
### Example Usage
@@ -44,15 +44,15 @@ with OpenRouter(
### Parameters
-| Parameter | Type | Required | Description | Example |
-| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `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.
| |
-| `offset` | *OptionalNullable[int]* | ➖ | Number of records to skip for pagination | 0 |
-| `limit` | *Optional[int]* | ➖ | Maximum number of records to return (max 100) | 50 |
-| `workspace_id` | *Optional[str]* | ➖ | Optional workspace ID to filter by. Defaults to the authenticated entity's default workspace. | 550e8400-e29b-41d4-a716-446655440000 |
-| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.mdx) | ➖ | Configuration to override the default retry behavior of the client. | |
+| Parameter | Type | Required | Description | Example |
+| --------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `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.
| |
+| `offset` | *OptionalNullable[int]* | ➖ | Number of records to skip for pagination | 0 |
+| `limit` | *Optional[int]* | ➖ | Maximum number of records to return (max 100) | 50 |
+| `workspace_id` | *Optional[str]* | ➖ | Optional workspace ID to filter by. Defaults to the authenticated entity's default workspace, or a workspace-scoped management key's own workspace. | 550e8400-e29b-41d4-a716-446655440000 |
+| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.mdx) | ➖ | Configuration to override the default retry behavior of the client. | |
### Response
@@ -70,7 +70,7 @@ with OpenRouter(
## create
-Create a new observability destination. A maximum of 5 destinations per type is allowed. Defaults to the authenticated entity's default workspace; use the `workspace_id` body field to scope to a different workspace. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+Create a new observability destination. A maximum of 5 destinations per type is allowed. Defaults to the authenticated entity's default workspace, or a workspace-scoped management key's own workspace; use the `workspace_id` body field to scope to a different workspace. A workspace-scoped management key can only create in its own workspace; any other `workspace_id` returns 403. [Management key](/docs/guides/overview/auth/management-api-keys) required.
### Example Usage
@@ -99,26 +99,26 @@ with OpenRouter(
### Parameters
-| Parameter | Type | Required | Description | Example |
-| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `config` | Dict[str, *Any*] | ✔️ | Provider-specific configuration. The shape depends on `type` and is validated server-side. | \{
"baseUrl": "https://us.cloud.langfuse.com",
"publicKey": "pk-l...EfGh",
"secretKey": "sk-l...AbCd"
} |
-| `name` | *str* | ✔️ | Human-readable name for the destination. | Production Langfuse |
-| `type` | [components.CreateObservabilityDestinationRequestType](../../components/createobservabilitydestinationrequesttype.mdx) | ✔️ | The destination type. Only stable destination types are accepted. | langfuse |
-| `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.
| |
-| `api_key_hashes` | List[*str*] | ➖ | Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. `null` or omitted means all keys. Must contain at least one hash if provided. | null |
-| `broadcast_generation_cost` | *Optional[bool]* | ➖ | When true, include cost and billing generation metadata. | false |
-| `broadcast_generation_cost_allocation` | *Optional[bool]* | ➖ | Beta. When true, include openrouter_cost_allocation: per-token-kind usage and cost, sent only when they reconcile with the billed cost. | false |
-| `broadcast_generation_identity` | *Optional[bool]* | ➖ | When true, include identity generation metadata. | false |
-| `broadcast_generation_request_context` | *Optional[bool]* | ➖ | When true, include request-context generation metadata. | false |
-| `enabled` | *Optional[bool]* | ➖ | Whether this destination should be enabled immediately. | true |
-| `filter_rules` | [OptionalNullable[components.ObservabilityFilterRulesConfigNullable]](../../components/observabilityfilterrulesconfignullable.mdx) | ➖ | Optional structured filter rules controlling which events are forwarded. | null |
-| `privacy_mode` | *Optional[bool]* | ➖ | When true, request/response bodies are not forwarded — only metadata. | false |
-| `regions` | List[[components.ObservabilityDataRegionInput](../../components/observabilitydataregioninput.mdx)] | ➖ | Data regions this destination applies to. `eu` is accepted as an alias for `europe` and normalizes to `europe`. Omitting this field defaults to ['global']; the array must be non-empty. | [
"global"
] |
-| `sampling_rate` | *Optional[float]* | ➖ | Sampling rate between 0.0001 and 1 (1 = 100%). | 1 |
-| `workspace_id` | *Optional[str]* | ➖ | Optional workspace ID. Defaults to the authenticated entity's default workspace. | 550e8400-e29b-41d4-a716-446655440000 |
-| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.mdx) | ➖ | Configuration to override the default retry behavior of the client. | |
+| Parameter | Type | Required | Description | Example |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `config` | Dict[str, *Any*] | ✔️ | Provider-specific configuration. The shape depends on `type` and is validated server-side. | \{
"baseUrl": "https://us.cloud.langfuse.com",
"publicKey": "pk-l...EfGh",
"secretKey": "sk-l...AbCd"
} |
+| `name` | *str* | ✔️ | Human-readable name for the destination. | Production Langfuse |
+| `type` | [components.CreateObservabilityDestinationRequestType](../../components/createobservabilitydestinationrequesttype.mdx) | ✔️ | The destination type. Only stable destination types are accepted. | langfuse |
+| `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.
| |
+| `api_key_hashes` | List[*str*] | ➖ | Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. `null` or omitted means all keys. Must contain at least one hash if provided. A workspace-scoped management key can only name API keys in its own workspace; any other hash returns 400. | null |
+| `broadcast_generation_cost` | *Optional[bool]* | ➖ | When true, include cost and billing generation metadata. | false |
+| `broadcast_generation_cost_allocation` | *Optional[bool]* | ➖ | Beta. When true, include openrouter_cost_allocation: per-token-kind usage and cost, sent only when they reconcile with the billed cost. | false |
+| `broadcast_generation_identity` | *Optional[bool]* | ➖ | When true, include identity generation metadata. | false |
+| `broadcast_generation_request_context` | *Optional[bool]* | ➖ | When true, include request-context generation metadata. | false |
+| `enabled` | *Optional[bool]* | ➖ | Whether this destination should be enabled immediately. | true |
+| `filter_rules` | [OptionalNullable[components.ObservabilityFilterRulesConfigNullable]](../../components/observabilityfilterrulesconfignullable.mdx) | ➖ | Optional structured filter rules controlling which events are forwarded. | null |
+| `privacy_mode` | *Optional[bool]* | ➖ | When true, request/response bodies are not forwarded — only metadata. | false |
+| `regions` | List[[components.ObservabilityDataRegionInput](../../components/observabilitydataregioninput.mdx)] | ➖ | Data regions this destination applies to. `eu` is accepted as an alias for `europe` and normalizes to `europe`. Omitting this field defaults to ['global']; the array must be non-empty. | [
"global"
] |
+| `sampling_rate` | *Optional[float]* | ➖ | Sampling rate between 0.0001 and 1 (1 = 100%). | 1 |
+| `workspace_id` | *Optional[str]* | ➖ | Optional workspace ID. Defaults to the authenticated entity's default workspace, or a workspace-scoped management key's own workspace. | 550e8400-e29b-41d4-a716-446655440000 |
+| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.mdx) | ➖ | Configuration to override the default retry behavior of the client. | |
### Response
@@ -137,7 +137,7 @@ with OpenRouter(
## delete
-Delete an existing observability destination. This performs a soft delete. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+Delete an existing observability destination. This performs a soft delete. A workspace-scoped management key only reaches destinations in its own workspace; any other `id` returns 404. [Management key](/docs/guides/overview/auth/management-api-keys) required.
### Example Usage
@@ -186,7 +186,7 @@ with OpenRouter(
## get
-Fetch a single observability destination by its UUID. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+Fetch a single observability destination by its UUID. A workspace-scoped management key only reaches destinations in its own workspace; any other `id` returns 404. [Management key](/docs/guides/overview/auth/management-api-keys) required.
### Example Usage
@@ -235,7 +235,7 @@ with OpenRouter(
## update
-Update an existing observability destination. Only the fields provided in the request body are updated. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+Update an existing observability destination. Only the fields provided in the request body are updated. A workspace-scoped management key only reaches destinations in its own workspace; any other `id` returns 404. [Management key](/docs/guides/overview/auth/management-api-keys) required.
### Example Usage
@@ -260,25 +260,25 @@ with OpenRouter(
### Parameters
-| Parameter | Type | Required | Description | Example |
-| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `id` | *str* | ✔️ | The destination ID (UUID). | 99999999-aaaa-bbbb-cccc-dddddddddddd |
-| `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.
| |
-| `api_key_hashes` | List[*str*] | ➖ | Optional allowlist of OpenRouter API key hashes. `null` clears the filter (all keys). Omitting leaves the current value. Must contain at least one hash if provided. | null |
-| `broadcast_generation_cost` | *Optional[bool]* | ➖ | Whether to include cost and billing generation metadata. | false |
-| `broadcast_generation_cost_allocation` | *Optional[bool]* | ➖ | Beta. When true, include openrouter_cost_allocation: per-token-kind usage and cost, sent only when they reconcile with the billed cost. | false |
-| `broadcast_generation_identity` | *Optional[bool]* | ➖ | Whether to include identity generation metadata. | false |
-| `broadcast_generation_request_context` | *Optional[bool]* | ➖ | Whether to include request-context generation metadata. | false |
-| `config` | Dict[str, *Any*] | ➖ | Provider-specific configuration fields to update. Masked values are ignored; unset fields keep their current value. | \{
"baseUrl": "https://us.cloud.langfuse.com",
"publicKey": "pk-l...EfGh",
"secretKey": "sk-l...AbCd"
} |
-| `enabled` | *Optional[bool]* | ➖ | Whether the destination is enabled. | true |
-| `filter_rules` | [OptionalNullable[components.ObservabilityFilterRulesConfigNullable]](../../components/observabilityfilterrulesconfignullable.mdx) | ➖ | N/A | null |
-| `name` | *Optional[str]* | ➖ | Human-readable name for the destination. | Production Langfuse |
-| `privacy_mode` | *Optional[bool]* | ➖ | When true, request/response bodies are not forwarded — only metadata. | false |
-| `regions` | List[[components.ObservabilityDataRegionInput](../../components/observabilitydataregioninput.mdx)] | ➖ | Data regions this destination applies to. `eu` is accepted as an alias for `europe` and normalizes to `europe`. Omitting this field keeps the current value; it cannot be cleared. | [
"global"
] |
-| `sampling_rate` | *Optional[float]* | ➖ | Sampling rate between 0.0001 and 1 (1 = 100%). | 1 |
-| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.mdx) | ➖ | Configuration to override the default retry behavior of the client. | |
+| Parameter | Type | Required | Description | Example |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `id` | *str* | ✔️ | The destination ID (UUID). | 99999999-aaaa-bbbb-cccc-dddddddddddd |
+| `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.
| |
+| `api_key_hashes` | List[*str*] | ➖ | Optional allowlist of OpenRouter API key hashes. `null` clears the filter (all keys). Omitting leaves the current value, including any API key from another workspace that an organization-scoped key attached. Must contain at least one hash if provided. A workspace-scoped management key can only name API keys in its own workspace; any other hash returns 400. | null |
+| `broadcast_generation_cost` | *Optional[bool]* | ➖ | Whether to include cost and billing generation metadata. | false |
+| `broadcast_generation_cost_allocation` | *Optional[bool]* | ➖ | Beta. When true, include openrouter_cost_allocation: per-token-kind usage and cost, sent only when they reconcile with the billed cost. | false |
+| `broadcast_generation_identity` | *Optional[bool]* | ➖ | Whether to include identity generation metadata. | false |
+| `broadcast_generation_request_context` | *Optional[bool]* | ➖ | Whether to include request-context generation metadata. | false |
+| `config` | Dict[str, *Any*] | ➖ | Provider-specific configuration fields to update. Masked values are ignored; unset fields keep their current value. | \{
"baseUrl": "https://us.cloud.langfuse.com",
"publicKey": "pk-l...EfGh",
"secretKey": "sk-l...AbCd"
} |
+| `enabled` | *Optional[bool]* | ➖ | Whether the destination is enabled. | true |
+| `filter_rules` | [OptionalNullable[components.ObservabilityFilterRulesConfigNullable]](../../components/observabilityfilterrulesconfignullable.mdx) | ➖ | N/A | null |
+| `name` | *Optional[str]* | ➖ | Human-readable name for the destination. | Production Langfuse |
+| `privacy_mode` | *Optional[bool]* | ➖ | When true, request/response bodies are not forwarded — only metadata. | false |
+| `regions` | List[[components.ObservabilityDataRegionInput](../../components/observabilitydataregioninput.mdx)] | ➖ | Data regions this destination applies to. `eu` is accepted as an alias for `europe` and normalizes to `europe`. Omitting this field keeps the current value; it cannot be cleared. | [
"global"
] |
+| `sampling_rate` | *Optional[float]* | ➖ | Sampling rate between 0.0001 and 1 (1 = 100%). | 1 |
+| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.mdx) | ➖ | Configuration to override the default retry behavior of the client. | |
### Response
diff --git a/pyproject.toml b/pyproject.toml
index dfc2e5dee..4367c4942 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "openrouter"
-version = "1.3.154"
+version = "1.3.155"
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 94ecda04c..b2b5c94c8 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.154"
+__version__: str = "1.3.155"
__openapi_doc_version__: str = "1.0.0"
__gen_version__: str = "2.950.13"
-__user_agent__: str = "speakeasy-sdk/python 1.3.154 2.950.13 1.0.0 openrouter"
+__user_agent__: str = "speakeasy-sdk/python 1.3.155 2.950.13 1.0.0 openrouter"
try:
if __package__ is not None:
diff --git a/src/openrouter/components/createobservabilitydestinationrequest.py b/src/openrouter/components/createobservabilitydestinationrequest.py
index e408e1ffb..aa510e4cd 100644
--- a/src/openrouter/components/createobservabilitydestinationrequest.py
+++ b/src/openrouter/components/createobservabilitydestinationrequest.py
@@ -52,7 +52,7 @@ class CreateObservabilityDestinationRequestTypedDict(TypedDict):
type: CreateObservabilityDestinationRequestType
r"""The destination type. Only stable destination types are accepted."""
api_key_hashes: NotRequired[Nullable[List[str]]]
- r"""Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. `null` or omitted means all keys. Must contain at least one hash if provided."""
+ r"""Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. `null` or omitted means all keys. Must contain at least one hash if provided. A workspace-scoped management key can only name API keys in its own workspace; any other hash returns 400."""
broadcast_generation_cost: NotRequired[bool]
r"""When true, include cost and billing generation metadata."""
broadcast_generation_cost_allocation: NotRequired[bool]
@@ -72,7 +72,7 @@ class CreateObservabilityDestinationRequestTypedDict(TypedDict):
sampling_rate: NotRequired[float]
r"""Sampling rate between 0.0001 and 1 (1 = 100%)."""
workspace_id: NotRequired[str]
- r"""Optional workspace ID. Defaults to the authenticated entity's default workspace."""
+ r"""Optional workspace ID. Defaults to the authenticated entity's default workspace, or a workspace-scoped management key's own workspace."""
class CreateObservabilityDestinationRequest(BaseModel):
@@ -86,7 +86,7 @@ class CreateObservabilityDestinationRequest(BaseModel):
r"""The destination type. Only stable destination types are accepted."""
api_key_hashes: OptionalNullable[List[str]] = UNSET
- r"""Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. `null` or omitted means all keys. Must contain at least one hash if provided."""
+ r"""Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. `null` or omitted means all keys. Must contain at least one hash if provided. A workspace-scoped management key can only name API keys in its own workspace; any other hash returns 400."""
broadcast_generation_cost: Optional[bool] = False
r"""When true, include cost and billing generation metadata."""
@@ -116,7 +116,7 @@ class CreateObservabilityDestinationRequest(BaseModel):
r"""Sampling rate between 0.0001 and 1 (1 = 100%)."""
workspace_id: Optional[str] = None
- r"""Optional workspace ID. Defaults to the authenticated entity's default workspace."""
+ r"""Optional workspace ID. Defaults to the authenticated entity's default workspace, or a workspace-scoped management key's own workspace."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
diff --git a/src/openrouter/components/extractionasset.py b/src/openrouter/components/extractionasset.py
index 89359890b..6cf6b687a 100644
--- a/src/openrouter/components/extractionasset.py
+++ b/src/openrouter/components/extractionasset.py
@@ -13,6 +13,7 @@
"png",
"jpg",
"jpeg",
+ "webp",
"pdf",
],
UnrecognizedStr,
@@ -29,7 +30,7 @@
class ExtractionAssetTypedDict(TypedDict):
- r"""An image or PDF sent once and referenced by its key in the `assets` map. `data_base64` is the file in standard base64 with no `data:` prefix. PDF is read by document models only."""
+ r"""An image or PDF sent once and referenced by its key in the `assets` map. `data_base64` is the file in standard base64 with no `data:` prefix. Which formats are read is model-specific: a format the model cannot read fails with a 400."""
data_base64: str
format_: ExtractionAssetFormat
@@ -37,7 +38,7 @@ class ExtractionAssetTypedDict(TypedDict):
class ExtractionAsset(BaseModel):
- r"""An image or PDF sent once and referenced by its key in the `assets` map. `data_base64` is the file in standard base64 with no `data:` prefix. PDF is read by document models only."""
+ r"""An image or PDF sent once and referenced by its key in the `assets` map. `data_base64` is the file in standard base64 with no `data:` prefix. Which formats are read is model-specific: a format the model cannot read fails with a 400."""
data_base64: str
diff --git a/src/openrouter/components/extractiondateanswer.py b/src/openrouter/components/extractiondateanswer.py
index 5978ebb15..9d6aa2863 100644
--- a/src/openrouter/components/extractiondateanswer.py
+++ b/src/openrouter/components/extractiondateanswer.py
@@ -32,7 +32,7 @@ class ExtractionDateAnswerTypedDict(TypedDict):
source: NotRequired[ExtractionDateAnswerSource]
r"""Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text."""
span: NotRequired[List[int]]
- r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once."""
+ r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it."""
spell_confidence: NotRequired[float]
r"""Confidence in the spelling of text read from an image."""
@@ -54,7 +54,7 @@ class ExtractionDateAnswer(BaseModel):
r"""Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text."""
span: Optional[List[int]] = None
- r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once."""
+ r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it."""
spell_confidence: Optional[float] = None
r"""Confidence in the spelling of text read from an image."""
diff --git a/src/openrouter/components/extractiondatefield.py b/src/openrouter/components/extractiondatefield.py
index ecb2d421f..87e4c9d61 100644
--- a/src/openrouter/components/extractiondatefield.py
+++ b/src/openrouter/components/extractiondatefield.py
@@ -16,6 +16,8 @@ class ExtractionDateFieldTypedDict(TypedDict):
r"""What the field should contain."""
null_threshold: NotRequired[float]
r"""Probability of null above which `value` is null. Default 0.5."""
+ unit: NotRequired[str]
+ r"""Unit label for the value."""
class ExtractionDateField(BaseModel):
@@ -27,9 +29,12 @@ class ExtractionDateField(BaseModel):
null_threshold: Optional[float] = None
r"""Probability of null above which `value` is null. Default 0.5."""
+ unit: Optional[str] = None
+ r"""Unit label for the value."""
+
@model_serializer(mode="wrap")
def serialize_model(self, handler):
- optional_fields = set(["instructions", "null_threshold"])
+ optional_fields = set(["instructions", "null_threshold", "unit"])
serialized = handler(self)
m = {}
diff --git a/src/openrouter/components/extractiondatetimeanswer.py b/src/openrouter/components/extractiondatetimeanswer.py
index 6a6340b74..b8a7553be 100644
--- a/src/openrouter/components/extractiondatetimeanswer.py
+++ b/src/openrouter/components/extractiondatetimeanswer.py
@@ -32,7 +32,7 @@ class ExtractionDatetimeAnswerTypedDict(TypedDict):
source: NotRequired[ExtractionDatetimeAnswerSource]
r"""Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text."""
span: NotRequired[List[int]]
- r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once."""
+ r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it."""
spell_confidence: NotRequired[float]
r"""Confidence in the spelling of text read from an image."""
@@ -54,7 +54,7 @@ class ExtractionDatetimeAnswer(BaseModel):
r"""Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text."""
span: Optional[List[int]] = None
- r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once."""
+ r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it."""
spell_confidence: Optional[float] = None
r"""Confidence in the spelling of text read from an image."""
diff --git a/src/openrouter/components/extractiondatetimefield.py b/src/openrouter/components/extractiondatetimefield.py
index 7bd5a82d6..658187d2b 100644
--- a/src/openrouter/components/extractiondatetimefield.py
+++ b/src/openrouter/components/extractiondatetimefield.py
@@ -16,6 +16,8 @@ class ExtractionDatetimeFieldTypedDict(TypedDict):
r"""What the field should contain."""
null_threshold: NotRequired[float]
r"""Probability of null above which `value` is null. Default 0.5."""
+ unit: NotRequired[str]
+ r"""Unit label for the value."""
class ExtractionDatetimeField(BaseModel):
@@ -27,9 +29,12 @@ class ExtractionDatetimeField(BaseModel):
null_threshold: Optional[float] = None
r"""Probability of null above which `value` is null. Default 0.5."""
+ unit: Optional[str] = None
+ r"""Unit label for the value."""
+
@model_serializer(mode="wrap")
def serialize_model(self, handler):
- optional_fields = set(["instructions", "null_threshold"])
+ optional_fields = set(["instructions", "null_threshold", "unit"])
serialized = handler(self)
m = {}
diff --git a/src/openrouter/components/extractiondurationanswer.py b/src/openrouter/components/extractiondurationanswer.py
index c8a27f37a..3142bb79b 100644
--- a/src/openrouter/components/extractiondurationanswer.py
+++ b/src/openrouter/components/extractiondurationanswer.py
@@ -32,7 +32,7 @@ class ExtractionDurationAnswerTypedDict(TypedDict):
source: NotRequired[ExtractionDurationAnswerSource]
r"""Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text."""
span: NotRequired[List[int]]
- r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once."""
+ r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it."""
spell_confidence: NotRequired[float]
r"""Confidence in the spelling of text read from an image."""
unit: NotRequired[str]
@@ -56,7 +56,7 @@ class ExtractionDurationAnswer(BaseModel):
r"""Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text."""
span: Optional[List[int]] = None
- r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once."""
+ r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it."""
spell_confidence: Optional[float] = None
r"""Confidence in the spelling of text read from an image."""
diff --git a/src/openrouter/components/extractiondurationfield.py b/src/openrouter/components/extractiondurationfield.py
index 9909d58fb..1b62bb47a 100644
--- a/src/openrouter/components/extractiondurationfield.py
+++ b/src/openrouter/components/extractiondurationfield.py
@@ -17,6 +17,7 @@ class ExtractionDurationFieldTypedDict(TypedDict):
instructions: NotRequired[str]
r"""What the field should contain."""
integer: NotRequired[bool]
+ r"""Whole numbers only."""
null_threshold: NotRequired[float]
r"""Probability of null above which `value` is null. Default 0.5."""
unit: NotRequired[str]
@@ -33,6 +34,7 @@ class ExtractionDurationField(BaseModel):
r"""What the field should contain."""
integer: Optional[bool] = None
+ r"""Whole numbers only."""
null_threshold: Optional[float] = None
r"""Probability of null above which `value` is null. Default 0.5."""
diff --git a/src/openrouter/components/extractionestimatefield.py b/src/openrouter/components/extractionestimatefield.py
index 27a5f24e3..b6fb443ac 100644
--- a/src/openrouter/components/extractionestimatefield.py
+++ b/src/openrouter/components/extractionestimatefield.py
@@ -64,10 +64,11 @@ class ExtractionEstimateFieldTypedDict(TypedDict):
instructions: NotRequired[str]
r"""What the field should contain."""
null_threshold: NotRequired[float]
- r"""Probability of null above which `value` is null. Default 0.5."""
+ r"""Not read on this field type: no model takes a null threshold here, and a request that sets it fails with a 400."""
scale: NotRequired[ExtractionEstimateFieldScale]
step: NotRequired[ExtractionEstimateFieldStepUnionTypedDict]
unit: NotRequired[str]
+ r"""Unit label for the value."""
class ExtractionEstimateField(BaseModel):
@@ -81,13 +82,14 @@ class ExtractionEstimateField(BaseModel):
r"""What the field should contain."""
null_threshold: Optional[float] = None
- r"""Probability of null above which `value` is null. Default 0.5."""
+ r"""Not read on this field type: no model takes a null threshold here, and a request that sets it fails with a 400."""
scale: Optional[ExtractionEstimateFieldScale] = None
step: Optional[ExtractionEstimateFieldStepUnion] = None
unit: Optional[str] = None
+ r"""Unit label for the value."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
diff --git a/src/openrouter/components/extractionforecastfield.py b/src/openrouter/components/extractionforecastfield.py
index 7b2bf5d0b..6599debd8 100644
--- a/src/openrouter/components/extractionforecastfield.py
+++ b/src/openrouter/components/extractionforecastfield.py
@@ -82,10 +82,11 @@ class ExtractionForecastFieldTypedDict(TypedDict):
instructions: NotRequired[str]
r"""What the field should contain."""
null_threshold: NotRequired[float]
- r"""Probability of null above which `value` is null. Default 0.5."""
+ r"""Not read on this field type: no model takes a null threshold here, and a request that sets it fails with a 400."""
scale: NotRequired[ExtractionForecastFieldScale]
step: NotRequired[ExtractionForecastFieldStepUnionTypedDict]
unit: NotRequired[str]
+ r"""Unit label for the value."""
class ExtractionForecastField(BaseModel):
@@ -104,13 +105,14 @@ class ExtractionForecastField(BaseModel):
r"""What the field should contain."""
null_threshold: Optional[float] = None
- r"""Probability of null above which `value` is null. Default 0.5."""
+ r"""Not read on this field type: no model takes a null threshold here, and a request that sets it fails with a 400."""
scale: Optional[ExtractionForecastFieldScale] = None
step: Optional[ExtractionForecastFieldStepUnion] = None
unit: Optional[str] = None
+ r"""Unit label for the value."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
diff --git a/src/openrouter/components/extractionlistanswer.py b/src/openrouter/components/extractionlistanswer.py
index ad234958c..0581a7aec 100644
--- a/src/openrouter/components/extractionlistanswer.py
+++ b/src/openrouter/components/extractionlistanswer.py
@@ -54,7 +54,7 @@ class ExtractionListAnswerTypedDict(TypedDict):
source: NotRequired[ExtractionListAnswerSource]
r"""Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text."""
spans: NotRequired[List[Nullable[List[int]]]]
- r"""One span per item of `value`, in the same order; null for an item that has no offsets in the state text (read from an image or a document)."""
+ r"""One span per item of `value`, in the same order; null for an item that has no offsets in the state text: one read from an image or a document, or one the provider returned without offsets that delimit it."""
spell_confidence: NotRequired[float]
r"""Confidence in the spelling of text read from an image."""
@@ -79,7 +79,7 @@ class ExtractionListAnswer(BaseModel):
r"""Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text."""
spans: Optional[List[Nullable[List[int]]]] = None
- r"""One span per item of `value`, in the same order; null for an item that has no offsets in the state text (read from an image or a document)."""
+ r"""One span per item of `value`, in the same order; null for an item that has no offsets in the state text: one read from an image or a document, or one the provider returned without offsets that delimit it."""
spell_confidence: Optional[float] = None
r"""Confidence in the spelling of text read from an image."""
diff --git a/src/openrouter/components/extractionlistfield.py b/src/openrouter/components/extractionlistfield.py
index 282b863b6..f181c2370 100644
--- a/src/openrouter/components/extractionlistfield.py
+++ b/src/openrouter/components/extractionlistfield.py
@@ -27,8 +27,12 @@ class ExtractionListFieldTypedDict(TypedDict):
r"""Decimal places kept in `value`."""
instructions: NotRequired[str]
r"""What the field should contain."""
+ integer: NotRequired[bool]
+ r"""Whole numbers only. Lists of numbers only."""
null_threshold: NotRequired[float]
r"""Probability of null above which `value` is null. Default 0.5."""
+ unit: NotRequired[str]
+ r"""Unit label for the value."""
class ExtractionListField(BaseModel):
@@ -42,12 +46,20 @@ class ExtractionListField(BaseModel):
instructions: Optional[str] = None
r"""What the field should contain."""
+ integer: Optional[bool] = None
+ r"""Whole numbers only. Lists of numbers only."""
+
null_threshold: Optional[float] = None
r"""Probability of null above which `value` is null. Default 0.5."""
+ unit: Optional[str] = None
+ r"""Unit label for the value."""
+
@model_serializer(mode="wrap")
def serialize_model(self, handler):
- optional_fields = set(["decimals", "instructions", "null_threshold"])
+ optional_fields = set(
+ ["decimals", "instructions", "integer", "null_threshold", "unit"]
+ )
serialized = handler(self)
m = {}
diff --git a/src/openrouter/components/extractionnumberanswer.py b/src/openrouter/components/extractionnumberanswer.py
index f5efee674..ad25ae2de 100644
--- a/src/openrouter/components/extractionnumberanswer.py
+++ b/src/openrouter/components/extractionnumberanswer.py
@@ -32,7 +32,7 @@ class ExtractionNumberAnswerTypedDict(TypedDict):
source: NotRequired[ExtractionNumberAnswerSource]
r"""Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text."""
span: NotRequired[List[int]]
- r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once."""
+ r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it."""
spell_confidence: NotRequired[float]
r"""Confidence in the spelling of text read from an image."""
@@ -54,7 +54,7 @@ class ExtractionNumberAnswer(BaseModel):
r"""Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text."""
span: Optional[List[int]] = None
- r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once."""
+ r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it."""
spell_confidence: Optional[float] = None
r"""Confidence in the spelling of text read from an image."""
diff --git a/src/openrouter/components/extractionnumberfield.py b/src/openrouter/components/extractionnumberfield.py
index 1823b0109..f345e2d75 100644
--- a/src/openrouter/components/extractionnumberfield.py
+++ b/src/openrouter/components/extractionnumberfield.py
@@ -17,9 +17,11 @@ class ExtractionNumberFieldTypedDict(TypedDict):
instructions: NotRequired[str]
r"""What the field should contain."""
integer: NotRequired[bool]
+ r"""Whole numbers only."""
null_threshold: NotRequired[float]
r"""Probability of null above which `value` is null. Default 0.5."""
unit: NotRequired[str]
+ r"""Unit label for the value."""
class ExtractionNumberField(BaseModel):
@@ -32,11 +34,13 @@ class ExtractionNumberField(BaseModel):
r"""What the field should contain."""
integer: Optional[bool] = None
+ r"""Whole numbers only."""
null_threshold: Optional[float] = None
r"""Probability of null above which `value` is null. Default 0.5."""
unit: Optional[str] = None
+ r"""Unit label for the value."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
diff --git a/src/openrouter/components/extractionsrequest.py b/src/openrouter/components/extractionsrequest.py
index fa92eb67c..54f542845 100644
--- a/src/openrouter/components/extractionsrequest.py
+++ b/src/openrouter/components/extractionsrequest.py
@@ -45,9 +45,9 @@
ExtractionDateFieldTypedDict,
ExtractionTimeFieldTypedDict,
ExtractionDatetimeFieldTypedDict,
- ExtractionListFieldTypedDict,
ExtractionNumberFieldTypedDict,
ExtractionDurationFieldTypedDict,
+ ExtractionListFieldTypedDict,
ExtractionEstimateFieldTypedDict,
ExtractionForecastFieldTypedDict,
],
@@ -76,15 +76,15 @@ class ExtractionsRequestTypedDict(TypedDict):
fields: Dict[str, FieldsTypedDict]
r"""Map of field name to typed field spec."""
model: str
- state: str
- r"""The text to read from. May be empty only when the request carries image assets."""
assets: NotRequired[Dict[str, ExtractionAssetTypedDict]]
- r"""Assets keyed by reference string. Write a reference wherever the asset belongs in `state` or a field `instructions`; every asset must be referenced at least once. A `state` that is exactly the sole asset's key carries no text of its own and is read as file-only. A model that reads either text or a document per request, not both (ScaleDown Extract with a PDF), needs that form: any other text around the key is state text and is rejected with 400."""
+ r"""Assets keyed by reference string. Write a reference wherever the asset belongs in `state` or a field `instructions`; every asset must be referenced at least once, unless `state` is empty or omitted, in which case the assets are read without a reference. A `state` that is exactly the sole asset's key carries no text of its own and is read as file-only. A model that reads either text or a document per request, not both (ScaleDown Extract with a PDF), takes that form or an empty or omitted `state`: any other text around the key is state text and is rejected with 400."""
provider: NotRequired[Nullable[ProviderPreferencesTypedDict]]
reference_date: NotRequired[str]
r"""ISO date that anchors dates written without a year."""
session_id: NotRequired[str]
r"""A unique identifier for grouping related requests (e.g., a conversation or agent workflow). Used for observability grouping in Broadcast and private logging; never sent to the provider. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 256 characters."""
+ state: NotRequired[str]
+ r"""The text to read from. May be empty or omitted only when the request carries assets, which are then read without being referenced by key."""
trace: NotRequired[TraceConfigTypedDict]
r"""Metadata for observability and tracing. Known keys (trace_id, trace_name, span_name, generation_name, parent_span_id) have special handling. Additional keys are passed through as custom metadata to configured broadcast destinations."""
user: NotRequired[str]
@@ -96,11 +96,8 @@ class ExtractionsRequest(BaseModel):
model: str
- state: str
- r"""The text to read from. May be empty only when the request carries image assets."""
-
assets: Optional[Dict[str, ExtractionAsset]] = None
- r"""Assets keyed by reference string. Write a reference wherever the asset belongs in `state` or a field `instructions`; every asset must be referenced at least once. A `state` that is exactly the sole asset's key carries no text of its own and is read as file-only. A model that reads either text or a document per request, not both (ScaleDown Extract with a PDF), needs that form: any other text around the key is state text and is rejected with 400."""
+ r"""Assets keyed by reference string. Write a reference wherever the asset belongs in `state` or a field `instructions`; every asset must be referenced at least once, unless `state` is empty or omitted, in which case the assets are read without a reference. A `state` that is exactly the sole asset's key carries no text of its own and is read as file-only. A model that reads either text or a document per request, not both (ScaleDown Extract with a PDF), takes that form or an empty or omitted `state`: any other text around the key is state text and is rejected with 400."""
provider: OptionalNullable[ProviderPreferences] = UNSET
@@ -110,6 +107,9 @@ class ExtractionsRequest(BaseModel):
session_id: Optional[str] = None
r"""A unique identifier for grouping related requests (e.g., a conversation or agent workflow). Used for observability grouping in Broadcast and private logging; never sent to the provider. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 256 characters."""
+ state: Optional[str] = ""
+ r"""The text to read from. May be empty or omitted only when the request carries assets, which are then read without being referenced by key."""
+
trace: Optional[TraceConfig] = None
r"""Metadata for observability and tracing. Known keys (trace_id, trace_name, span_name, generation_name, parent_span_id) have special handling. Additional keys are passed through as custom metadata to configured broadcast destinations."""
@@ -118,7 +118,15 @@ class ExtractionsRequest(BaseModel):
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = set(
- ["assets", "provider", "reference_date", "session_id", "trace", "user"]
+ [
+ "assets",
+ "provider",
+ "reference_date",
+ "session_id",
+ "state",
+ "trace",
+ "user",
+ ]
)
nullable_fields = set(["provider"])
serialized = handler(self)
diff --git a/src/openrouter/components/extractiontextanswer.py b/src/openrouter/components/extractiontextanswer.py
index 7063d27d7..1af5e904b 100644
--- a/src/openrouter/components/extractiontextanswer.py
+++ b/src/openrouter/components/extractiontextanswer.py
@@ -32,7 +32,7 @@ class ExtractionTextAnswerTypedDict(TypedDict):
source: NotRequired[ExtractionTextAnswerSource]
r"""Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text."""
span: NotRequired[List[int]]
- r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once."""
+ r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it."""
spell_confidence: NotRequired[float]
r"""Confidence in the spelling of text read from an image."""
@@ -54,7 +54,7 @@ class ExtractionTextAnswer(BaseModel):
r"""Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text."""
span: Optional[List[int]] = None
- r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once."""
+ r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it."""
spell_confidence: Optional[float] = None
r"""Confidence in the spelling of text read from an image."""
diff --git a/src/openrouter/components/extractiontextfield.py b/src/openrouter/components/extractiontextfield.py
index 4624afa9f..20f732f36 100644
--- a/src/openrouter/components/extractiontextfield.py
+++ b/src/openrouter/components/extractiontextfield.py
@@ -16,6 +16,8 @@ class ExtractionTextFieldTypedDict(TypedDict):
r"""What the field should contain."""
null_threshold: NotRequired[float]
r"""Probability of null above which `value` is null. Default 0.5."""
+ unit: NotRequired[str]
+ r"""Unit label for the value."""
class ExtractionTextField(BaseModel):
@@ -27,9 +29,12 @@ class ExtractionTextField(BaseModel):
null_threshold: Optional[float] = None
r"""Probability of null above which `value` is null. Default 0.5."""
+ unit: Optional[str] = None
+ r"""Unit label for the value."""
+
@model_serializer(mode="wrap")
def serialize_model(self, handler):
- optional_fields = set(["instructions", "null_threshold"])
+ optional_fields = set(["instructions", "null_threshold", "unit"])
serialized = handler(self)
m = {}
diff --git a/src/openrouter/components/extractiontimeanswer.py b/src/openrouter/components/extractiontimeanswer.py
index de7a99246..03fe79715 100644
--- a/src/openrouter/components/extractiontimeanswer.py
+++ b/src/openrouter/components/extractiontimeanswer.py
@@ -32,7 +32,7 @@ class ExtractionTimeAnswerTypedDict(TypedDict):
source: NotRequired[ExtractionTimeAnswerSource]
r"""Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text."""
span: NotRequired[List[int]]
- r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once."""
+ r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it."""
spell_confidence: NotRequired[float]
r"""Confidence in the spelling of text read from an image."""
@@ -54,7 +54,7 @@ class ExtractionTimeAnswer(BaseModel):
r"""Set to `image` or `document` when the answer was read from an image or a PDF rather than the state text."""
span: Optional[List[int]] = None
- r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once."""
+ r"""Unicode code point offsets [start, end) into the state text: index code points (not UTF-16 code units or UTF-8 bytes), so an emoji or accented letter counts once. Absent for an answer that has no offsets in the state text, for example a null answer, one read from an image or a document, or one the provider returned without offsets that delimit it."""
spell_confidence: Optional[float] = None
r"""Confidence in the spelling of text read from an image."""
diff --git a/src/openrouter/components/extractiontimefield.py b/src/openrouter/components/extractiontimefield.py
index 8007f9e5a..a1fd2c4b0 100644
--- a/src/openrouter/components/extractiontimefield.py
+++ b/src/openrouter/components/extractiontimefield.py
@@ -16,6 +16,8 @@ class ExtractionTimeFieldTypedDict(TypedDict):
r"""What the field should contain."""
null_threshold: NotRequired[float]
r"""Probability of null above which `value` is null. Default 0.5."""
+ unit: NotRequired[str]
+ r"""Unit label for the value."""
class ExtractionTimeField(BaseModel):
@@ -27,9 +29,12 @@ class ExtractionTimeField(BaseModel):
null_threshold: Optional[float] = None
r"""Probability of null above which `value` is null. Default 0.5."""
+ unit: Optional[str] = None
+ r"""Unit label for the value."""
+
@model_serializer(mode="wrap")
def serialize_model(self, handler):
- optional_fields = set(["instructions", "null_threshold"])
+ optional_fields = set(["instructions", "null_threshold", "unit"])
serialized = handler(self)
m = {}
diff --git a/src/openrouter/components/updateobservabilitydestinationrequest.py b/src/openrouter/components/updateobservabilitydestinationrequest.py
index 3617e77aa..139c81904 100644
--- a/src/openrouter/components/updateobservabilitydestinationrequest.py
+++ b/src/openrouter/components/updateobservabilitydestinationrequest.py
@@ -20,7 +20,7 @@
class UpdateObservabilityDestinationRequestTypedDict(TypedDict):
api_key_hashes: NotRequired[Nullable[List[str]]]
- r"""Optional allowlist of OpenRouter API key hashes. `null` clears the filter (all keys). Omitting leaves the current value. Must contain at least one hash if provided."""
+ r"""Optional allowlist of OpenRouter API key hashes. `null` clears the filter (all keys). Omitting leaves the current value, including any API key from another workspace that an organization-scoped key attached. Must contain at least one hash if provided. A workspace-scoped management key can only name API keys in its own workspace; any other hash returns 400."""
broadcast_generation_cost: NotRequired[bool]
r"""Whether to include cost and billing generation metadata."""
broadcast_generation_cost_allocation: NotRequired[bool]
@@ -46,7 +46,7 @@ class UpdateObservabilityDestinationRequestTypedDict(TypedDict):
class UpdateObservabilityDestinationRequest(BaseModel):
api_key_hashes: OptionalNullable[List[str]] = UNSET
- r"""Optional allowlist of OpenRouter API key hashes. `null` clears the filter (all keys). Omitting leaves the current value. Must contain at least one hash if provided."""
+ r"""Optional allowlist of OpenRouter API key hashes. `null` clears the filter (all keys). Omitting leaves the current value, including any API key from another workspace that an organization-scoped key attached. Must contain at least one hash if provided. A workspace-scoped management key can only name API keys in its own workspace; any other hash returns 400."""
broadcast_generation_cost: Optional[bool] = None
r"""Whether to include cost and billing generation metadata."""
diff --git a/src/openrouter/extractions.py b/src/openrouter/extractions.py
index 7cef3d567..44a56fafb 100644
--- a/src/openrouter/extractions.py
+++ b/src/openrouter/extractions.py
@@ -19,7 +19,6 @@ def create(
Mapping[str, components.Fields], Mapping[str, components.FieldsTypedDict]
],
model: str,
- state: str,
http_referer: Optional[str] = None,
x_open_router_title: Optional[str] = None,
x_open_router_categories: Optional[str] = None,
@@ -36,6 +35,7 @@ def create(
] = UNSET,
reference_date: Optional[str] = None,
session_id: Optional[str] = None,
+ state: Optional[str] = "",
trace: Optional[
Union[components.TraceConfig, components.TraceConfigTypedDict]
] = None,
@@ -51,7 +51,6 @@ def create(
:param fields: Map of field name to typed field spec.
:param model:
- :param state: The text to read from. May be empty only when the request carries image assets.
:param http_referer: 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.
@@ -59,10 +58,11 @@ def create(
:param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
- :param assets: Assets keyed by reference string. Write a reference wherever the asset belongs in `state` or a field `instructions`; every asset must be referenced at least once. A `state` that is exactly the sole asset's key carries no text of its own and is read as file-only. A model that reads either text or a document per request, not both (ScaleDown Extract with a PDF), needs that form: any other text around the key is state text and is rejected with 400.
+ :param assets: Assets keyed by reference string. Write a reference wherever the asset belongs in `state` or a field `instructions`; every asset must be referenced at least once, unless `state` is empty or omitted, in which case the assets are read without a reference. A `state` that is exactly the sole asset's key carries no text of its own and is read as file-only. A model that reads either text or a document per request, not both (ScaleDown Extract with a PDF), takes that form or an empty or omitted `state`: any other text around the key is state text and is rejected with 400.
:param provider:
:param reference_date: ISO date that anchors dates written without a year.
:param session_id: A unique identifier for grouping related requests (e.g., a conversation or agent workflow). Used for observability grouping in Broadcast and private logging; never sent to the provider. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 256 characters.
+ :param state: The text to read from. May be empty or omitted only when the request carries assets, which are then read without being referenced by key.
:param trace: Metadata for observability and tracing. Known keys (trace_id, trace_name, span_name, generation_name, parent_span_id) have special handling. Additional keys are passed through as custom metadata to configured broadcast destinations.
:param user:
:param retries: Override the default retry configuration for this method
@@ -242,7 +242,6 @@ async def create_async(
Mapping[str, components.Fields], Mapping[str, components.FieldsTypedDict]
],
model: str,
- state: str,
http_referer: Optional[str] = None,
x_open_router_title: Optional[str] = None,
x_open_router_categories: Optional[str] = None,
@@ -259,6 +258,7 @@ async def create_async(
] = UNSET,
reference_date: Optional[str] = None,
session_id: Optional[str] = None,
+ state: Optional[str] = "",
trace: Optional[
Union[components.TraceConfig, components.TraceConfigTypedDict]
] = None,
@@ -274,7 +274,6 @@ async def create_async(
:param fields: Map of field name to typed field spec.
:param model:
- :param state: The text to read from. May be empty only when the request carries image assets.
:param http_referer: 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.
@@ -282,10 +281,11 @@ async def create_async(
:param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
- :param assets: Assets keyed by reference string. Write a reference wherever the asset belongs in `state` or a field `instructions`; every asset must be referenced at least once. A `state` that is exactly the sole asset's key carries no text of its own and is read as file-only. A model that reads either text or a document per request, not both (ScaleDown Extract with a PDF), needs that form: any other text around the key is state text and is rejected with 400.
+ :param assets: Assets keyed by reference string. Write a reference wherever the asset belongs in `state` or a field `instructions`; every asset must be referenced at least once, unless `state` is empty or omitted, in which case the assets are read without a reference. A `state` that is exactly the sole asset's key carries no text of its own and is read as file-only. A model that reads either text or a document per request, not both (ScaleDown Extract with a PDF), takes that form or an empty or omitted `state`: any other text around the key is state text and is rejected with 400.
:param provider:
:param reference_date: ISO date that anchors dates written without a year.
:param session_id: A unique identifier for grouping related requests (e.g., a conversation or agent workflow). Used for observability grouping in Broadcast and private logging; never sent to the provider. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 256 characters.
+ :param state: The text to read from. May be empty or omitted only when the request carries assets, which are then read without being referenced by key.
:param trace: Metadata for observability and tracing. Known keys (trace_id, trace_name, span_name, generation_name, parent_span_id) have special handling. Additional keys are passed through as custom metadata to configured broadcast destinations.
:param user:
:param retries: Override the default retry configuration for this method
diff --git a/src/openrouter/observability.py b/src/openrouter/observability.py
index 4a35ede01..a77a677d4 100644
--- a/src/openrouter/observability.py
+++ b/src/openrouter/observability.py
@@ -29,7 +29,7 @@ def list(
) -> Optional[operations.ListObservabilityDestinationsResponse]:
r"""List observability destinations
- List the observability destinations configured for the authenticated entity's default workspace. Use the `workspace_id` query parameter to scope the result to a different workspace. Only destinations with stable release status are surfaced — destinations of other types are excluded. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+ List the observability destinations configured for the authenticated entity's default workspace, or a workspace-scoped management key's own workspace. Use the `workspace_id` query parameter to scope the result to a different workspace. A workspace-scoped management key can only list its own workspace; any other `workspace_id` returns 403. Only destinations with stable release status are surfaced — destinations of other types are excluded. [Management key](/docs/guides/overview/auth/management-api-keys) required.
:param http_referer: 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.
@@ -40,7 +40,7 @@ def list(
:param offset: Number of records to skip for pagination
:param limit: Maximum number of records to return (max 100)
- :param workspace_id: Optional workspace ID to filter by. Defaults to the authenticated entity's default workspace.
+ :param workspace_id: Optional workspace ID to filter by. Defaults to the authenticated entity's default workspace, or a workspace-scoped management key's own workspace.
:param retries: Override the default retry configuration for this method
:param server_url: Override the default server URL for this method
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
@@ -201,7 +201,7 @@ async def list_async(
) -> Optional[operations.ListObservabilityDestinationsResponse]:
r"""List observability destinations
- List the observability destinations configured for the authenticated entity's default workspace. Use the `workspace_id` query parameter to scope the result to a different workspace. Only destinations with stable release status are surfaced — destinations of other types are excluded. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+ List the observability destinations configured for the authenticated entity's default workspace, or a workspace-scoped management key's own workspace. Use the `workspace_id` query parameter to scope the result to a different workspace. A workspace-scoped management key can only list its own workspace; any other `workspace_id` returns 403. Only destinations with stable release status are surfaced — destinations of other types are excluded. [Management key](/docs/guides/overview/auth/management-api-keys) required.
:param http_referer: 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.
@@ -212,7 +212,7 @@ async def list_async(
:param offset: Number of records to skip for pagination
:param limit: Maximum number of records to return (max 100)
- :param workspace_id: Optional workspace ID to filter by. Defaults to the authenticated entity's default workspace.
+ :param workspace_id: Optional workspace ID to filter by. Defaults to the authenticated entity's default workspace, or a workspace-scoped management key's own workspace.
:param retries: Override the default retry configuration for this method
:param server_url: Override the default server URL for this method
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
@@ -394,7 +394,7 @@ def create(
) -> components.CreateObservabilityDestinationResponse:
r"""Create an observability destination
- Create a new observability destination. A maximum of 5 destinations per type is allowed. Defaults to the authenticated entity's default workspace; use the `workspace_id` body field to scope to a different workspace. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+ Create a new observability destination. A maximum of 5 destinations per type is allowed. Defaults to the authenticated entity's default workspace, or a workspace-scoped management key's own workspace; use the `workspace_id` body field to scope to a different workspace. A workspace-scoped management key can only create in its own workspace; any other `workspace_id` returns 403. [Management key](/docs/guides/overview/auth/management-api-keys) required.
:param config: Provider-specific configuration. The shape depends on `type` and is validated server-side.
:param name: Human-readable name for the destination.
@@ -406,7 +406,7 @@ def create(
:param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
- :param api_key_hashes: Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. `null` or omitted means all keys. Must contain at least one hash if provided.
+ :param api_key_hashes: Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. `null` or omitted means all keys. Must contain at least one hash if provided. A workspace-scoped management key can only name API keys in its own workspace; any other hash returns 400.
:param broadcast_generation_cost: When true, include cost and billing generation metadata.
:param broadcast_generation_cost_allocation: Beta. When true, include openrouter_cost_allocation: per-token-kind usage and cost, sent only when they reconcile with the billed cost.
:param broadcast_generation_identity: When true, include identity generation metadata.
@@ -416,7 +416,7 @@ def create(
:param privacy_mode: When true, request/response bodies are not forwarded — only metadata.
:param regions: Data regions this destination applies to. `eu` is accepted as an alias for `europe` and normalizes to `europe`. Omitting this field defaults to ['global']; the array must be non-empty.
:param sampling_rate: Sampling rate between 0.0001 and 1 (1 = 100%).
- :param workspace_id: Optional workspace ID. Defaults to the authenticated entity's default workspace.
+ :param workspace_id: Optional workspace ID. Defaults to the authenticated entity's default workspace, or a workspace-scoped management key's own workspace.
:param retries: Override the default retry configuration for this method
:param server_url: Override the default server URL for this method
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
@@ -594,7 +594,7 @@ async def create_async(
) -> components.CreateObservabilityDestinationResponse:
r"""Create an observability destination
- Create a new observability destination. A maximum of 5 destinations per type is allowed. Defaults to the authenticated entity's default workspace; use the `workspace_id` body field to scope to a different workspace. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+ Create a new observability destination. A maximum of 5 destinations per type is allowed. Defaults to the authenticated entity's default workspace, or a workspace-scoped management key's own workspace; use the `workspace_id` body field to scope to a different workspace. A workspace-scoped management key can only create in its own workspace; any other `workspace_id` returns 403. [Management key](/docs/guides/overview/auth/management-api-keys) required.
:param config: Provider-specific configuration. The shape depends on `type` and is validated server-side.
:param name: Human-readable name for the destination.
@@ -606,7 +606,7 @@ async def create_async(
:param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
- :param api_key_hashes: Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. `null` or omitted means all keys. Must contain at least one hash if provided.
+ :param api_key_hashes: Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. `null` or omitted means all keys. Must contain at least one hash if provided. A workspace-scoped management key can only name API keys in its own workspace; any other hash returns 400.
:param broadcast_generation_cost: When true, include cost and billing generation metadata.
:param broadcast_generation_cost_allocation: Beta. When true, include openrouter_cost_allocation: per-token-kind usage and cost, sent only when they reconcile with the billed cost.
:param broadcast_generation_identity: When true, include identity generation metadata.
@@ -616,7 +616,7 @@ async def create_async(
:param privacy_mode: When true, request/response bodies are not forwarded — only metadata.
:param regions: Data regions this destination applies to. `eu` is accepted as an alias for `europe` and normalizes to `europe`. Omitting this field defaults to ['global']; the array must be non-empty.
:param sampling_rate: Sampling rate between 0.0001 and 1 (1 = 100%).
- :param workspace_id: Optional workspace ID. Defaults to the authenticated entity's default workspace.
+ :param workspace_id: Optional workspace ID. Defaults to the authenticated entity's default workspace, or a workspace-scoped management key's own workspace.
:param retries: Override the default retry configuration for this method
:param server_url: Override the default server URL for this method
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
@@ -776,7 +776,7 @@ def delete(
) -> components.DeleteObservabilityDestinationResponse:
r"""Delete an observability destination
- Delete an existing observability destination. This performs a soft delete. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+ Delete an existing observability destination. This performs a soft delete. A workspace-scoped management key only reaches destinations in its own workspace; any other `id` returns 404. [Management key](/docs/guides/overview/auth/management-api-keys) required.
:param id: The destination ID (UUID).
:param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
@@ -911,7 +911,7 @@ async def delete_async(
) -> components.DeleteObservabilityDestinationResponse:
r"""Delete an observability destination
- Delete an existing observability destination. This performs a soft delete. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+ Delete an existing observability destination. This performs a soft delete. A workspace-scoped management key only reaches destinations in its own workspace; any other `id` returns 404. [Management key](/docs/guides/overview/auth/management-api-keys) required.
:param id: The destination ID (UUID).
:param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
@@ -1046,7 +1046,7 @@ def get(
) -> components.GetObservabilityDestinationResponse:
r"""Get an observability destination
- Fetch a single observability destination by its UUID. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+ Fetch a single observability destination by its UUID. A workspace-scoped management key only reaches destinations in its own workspace; any other `id` returns 404. [Management key](/docs/guides/overview/auth/management-api-keys) required.
:param id: The destination ID (UUID).
:param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
@@ -1181,7 +1181,7 @@ async def get_async(
) -> components.GetObservabilityDestinationResponse:
r"""Get an observability destination
- Fetch a single observability destination by its UUID. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+ Fetch a single observability destination by its UUID. A workspace-scoped management key only reaches destinations in its own workspace; any other `id` returns 404. [Management key](/docs/guides/overview/auth/management-api-keys) required.
:param id: The destination ID (UUID).
:param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
@@ -1333,7 +1333,7 @@ def update(
) -> components.UpdateObservabilityDestinationResponse:
r"""Update an observability destination
- Update an existing observability destination. Only the fields provided in the request body are updated. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+ Update an existing observability destination. Only the fields provided in the request body are updated. A workspace-scoped management key only reaches destinations in its own workspace; any other `id` returns 404. [Management key](/docs/guides/overview/auth/management-api-keys) required.
:param id: The destination ID (UUID).
:param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
@@ -1343,7 +1343,7 @@ def update(
:param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
- :param api_key_hashes: Optional allowlist of OpenRouter API key hashes. `null` clears the filter (all keys). Omitting leaves the current value. Must contain at least one hash if provided.
+ :param api_key_hashes: Optional allowlist of OpenRouter API key hashes. `null` clears the filter (all keys). Omitting leaves the current value, including any API key from another workspace that an organization-scoped key attached. Must contain at least one hash if provided. A workspace-scoped management key can only name API keys in its own workspace; any other hash returns 400.
:param broadcast_generation_cost: Whether to include cost and billing generation metadata.
:param broadcast_generation_cost_allocation: Beta. When true, include openrouter_cost_allocation: per-token-kind usage and cost, sent only when they reconcile with the billed cost.
:param broadcast_generation_identity: Whether to include identity generation metadata.
@@ -1535,7 +1535,7 @@ async def update_async(
) -> components.UpdateObservabilityDestinationResponse:
r"""Update an observability destination
- Update an existing observability destination. Only the fields provided in the request body are updated. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+ Update an existing observability destination. Only the fields provided in the request body are updated. A workspace-scoped management key only reaches destinations in its own workspace; any other `id` returns 404. [Management key](/docs/guides/overview/auth/management-api-keys) required.
:param id: The destination ID (UUID).
:param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
@@ -1545,7 +1545,7 @@ async def update_async(
:param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
- :param api_key_hashes: Optional allowlist of OpenRouter API key hashes. `null` clears the filter (all keys). Omitting leaves the current value. Must contain at least one hash if provided.
+ :param api_key_hashes: Optional allowlist of OpenRouter API key hashes. `null` clears the filter (all keys). Omitting leaves the current value, including any API key from another workspace that an organization-scoped key attached. Must contain at least one hash if provided. A workspace-scoped management key can only name API keys in its own workspace; any other hash returns 400.
:param broadcast_generation_cost: Whether to include cost and billing generation metadata.
:param broadcast_generation_cost_allocation: Beta. When true, include openrouter_cost_allocation: per-token-kind usage and cost, sent only when they reconcile with the billed cost.
:param broadcast_generation_identity: Whether to include identity generation metadata.
diff --git a/src/openrouter/operations/listobservabilitydestinations.py b/src/openrouter/operations/listobservabilitydestinations.py
index 6912194b6..8efdffe07 100644
--- a/src/openrouter/operations/listobservabilitydestinations.py
+++ b/src/openrouter/operations/listobservabilitydestinations.py
@@ -95,7 +95,7 @@ class ListObservabilityDestinationsRequestTypedDict(TypedDict):
limit: NotRequired[int]
r"""Maximum number of records to return (max 100)"""
workspace_id: NotRequired[str]
- r"""Optional workspace ID to filter by. Defaults to the authenticated entity's default workspace."""
+ r"""Optional workspace ID to filter by. Defaults to the authenticated entity's default workspace, or a workspace-scoped management key's own workspace."""
class ListObservabilityDestinationsRequest(BaseModel):
@@ -143,7 +143,7 @@ class ListObservabilityDestinationsRequest(BaseModel):
Optional[str],
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
] = None
- r"""Optional workspace ID to filter by. Defaults to the authenticated entity's default workspace."""
+ r"""Optional workspace ID to filter by. Defaults to the authenticated entity's default workspace, or a workspace-scoped management key's own workspace."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
diff --git a/uv.lock b/uv.lock
index 57482a82e..ef7137431 100644
--- a/uv.lock
+++ b/uv.lock
@@ -231,7 +231,7 @@ wheels = [
[[package]]
name = "openrouter"
-version = "1.3.154"
+version = "1.3.155"
source = { editable = "." }
dependencies = [
{ name = "httpcore" },