diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock
index 4c6206dd0..12b523e37 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: db032b8ea274c4705542ebb675dded9e
+ docChecksum: 36da9727d500b45bfb90060e8d4b1b88
docVersion: 1.0.0
speakeasyVersion: 1.803.2
generationVersion: 2.950.13
- releaseVersion: 1.3.129
- configChecksum: 6eacd486505b1d1218fd70daf545e658
+ releaseVersion: 1.3.130
+ configChecksum: 3742c213ba91be3c474a2d54b3dbb36b
repoURL: https://github.com/OpenRouterTeam/python-sdk.git
installationURL: https://github.com/OpenRouterTeam/python-sdk.git
published: true
persistentEdits:
- generation_id: cf643e99-16f3-419e-93e6-7ffdb023654b
- pristine_commit_hash: c0f6b92e248a160e41bc2c86794ea7d7993d7186
- pristine_tree_hash: 3067f598d7a55537b1b6e018dc5cd96182ebe945
+ generation_id: f436448f-07a6-4cee-ba19-2a4318107d8d
+ pristine_commit_hash: 9b4fdd4385c6fc9b296765f5a2e75e83a7578377
+ pristine_tree_hash: 463d84dd062651512429d9b88a98462978cc4edc
features:
python:
acceptHeaders: 3.0.0
@@ -128,8 +128,8 @@ trackedFiles:
pristine_git_object: bdaff581135b54aed7401439fcf1bdb70adb60d7
docs/components/additionaltoolsitemtoolunion.mdx:
id: b3e8598b1887
- last_write_checksum: sha1:c20e105aabc3f29abd791bbd7ef68fac0797acb4
- pristine_git_object: e3a111fa7ce46da62cfe98deda6050b3e9abfabc
+ last_write_checksum: sha1:f7229e458a2be280052ede18c6e65fa4f7b60994
+ pristine_git_object: f96cb36418ebea4589f6fcdfc4a5b550dfaf3710
docs/components/additionaltoolsitemtypefunction.mdx:
id: bf179b4008af
last_write_checksum: sha1:c0d4fee7d39fbd3d08c44bbe0e7b929350c5d7e8
@@ -264,8 +264,8 @@ trackedFiles:
pristine_git_object: 28ee7a5691f7254183a33644a1d72cdc4202e23b
docs/components/alignmentresponsesrejected.mdx:
id: eea4008474f0
- last_write_checksum: sha1:7ef08997d1c2e41d524a4dfbe7c788d1f8fe2e9f
- pristine_git_object: 3db6e441df47e7e4be0381fe1329d541fffd5275
+ last_write_checksum: sha1:44453b64e436f4e6771dbcae670a4eb7cafb65d3
+ pristine_git_object: b0c408ff3e7f8ed385ff29d1cae8803e4ab7e1a8
docs/components/alignmentrule.mdx:
id: ce3e91b088a0
last_write_checksum: sha1:86898783d585075925509829c460b5547271af9a
@@ -290,18 +290,6 @@ trackedFiles:
id: f0240e4c81df
last_write_checksum: sha1:c456f41de971d64e3bd7bad4aa3fc5f698944cc8
pristine_git_object: 9e51317c7ac0c2e04b03bb0c1aa30eec06d854b3
- docs/components/allowedtools.mdx:
- id: bc9b06183311
- last_write_checksum: sha1:cba7b035d216f1bb46dec159fae9e783ad4f9f3b
- pristine_git_object: fa714f9e6312b5a78830144742af1299fcc0622a
- docs/components/allowedtoolsunion.mdx:
- id: 6fbdaf871602
- last_write_checksum: sha1:5e543643f09cac14ae063be8eb46edf0b55de379
- pristine_git_object: 4e6d37a0b4d8eae7d3ad32bb5b268ec5274ecf9f
- docs/components/always.mdx:
- id: 349d3a763e1d
- last_write_checksum: sha1:47cfe6b2de086b455bd54fcd488b803690b7b774
- pristine_git_object: 7be3d5420361991bf9991a8e2a5fbe67d213a54a
docs/components/annotation.mdx:
id: e494ef314124
last_write_checksum: sha1:c2d1aa4a57a1c0a83fbe18d7355d8d7d68a16b8b
@@ -1804,8 +1792,8 @@ trackedFiles:
pristine_git_object: a00676abb210aeb3747aa6d6a0dfbe3e3ad42f76
docs/components/byokproviderslug.mdx:
id: 6ea70819f6d8
- last_write_checksum: sha1:0a3990a2b43748a10ab598e28dd5c69801d3b6ca
- pristine_git_object: 5af0c44dad9920f68d6f09ee5bd3c3ea92a103d4
+ last_write_checksum: sha1:dd2870ff2a751f829c75e123c58343117fc9db1c
+ pristine_git_object: 02af1d81e63eb68d8fbaab8d38a03a82a6973d9b
docs/components/capabilitydescriptor.mdx:
id: 34ac0e581d79
last_write_checksum: sha1:62ee9ccab6cec4572383cef654997ab4106d4676
@@ -2406,10 +2394,6 @@ trackedFiles:
id: 2d7c53cec517
last_write_checksum: sha1:2b961f0110f39a76101d77f46f092a58df7381c9
pristine_git_object: a8b713117bfc591504bd19493e262e494a12a60d
- docs/components/connectorid.mdx:
- id: e2bb5ba7cffa
- last_write_checksum: sha1:38d7e2bf323f4e87c0f8283a0a998698a605380d
- pristine_git_object: 783b14bf824bbea150ee4aec34250a08b47a0d10
docs/components/container.mdx:
id: da487bbb3fca
last_write_checksum: sha1:001edbff08751a63d05df57795c796ae2a39c3ab
@@ -2748,8 +2732,8 @@ trackedFiles:
pristine_git_object: a31679a43de9312cae538062519c8d1eab25dde0
docs/components/createworkspacerequestdisabledservertool.mdx:
id: 19a533b200f9
- last_write_checksum: sha1:88082fd2da7f18d74d3d66c57fca6afb7e5f104a
- pristine_git_object: 8156c97be549e8be20442a45b8fc32fa5718f086
+ last_write_checksum: sha1:0480179ef9ed1e1a8a3cfe744d479129be225e50
+ pristine_git_object: dfcb100dc30d70c5c64fd44612b76d739697144a
docs/components/createworkspaceresponse.mdx:
id: ee0c0ca3257e
last_write_checksum: sha1:1acb9763bc3b8a97f694659561d0663b6f30cabf
@@ -2912,8 +2896,8 @@ trackedFiles:
pristine_git_object: 9b5c4119852b57aa78d4f570a6ed811414ce4d76
docs/components/decisionschoicequestion.mdx:
id: 3c9e4dec24ec
- last_write_checksum: sha1:f9df200c214041372347e9d9bb641ab4c0e9712d
- pristine_git_object: 587a9787c997054a50846933ae55128e79074bf7
+ last_write_checksum: sha1:73014f2d412644d5da57e089a079790b68f34582
+ pristine_git_object: 3e16570e9fa577699a97c24fa4a26db600b8c24c
docs/components/decisionschoicequestioninstructions.mdx:
id: 4de2c92d0d81
last_write_checksum: sha1:2e0a53b30d4579104bafd428dff117d1b48ee422
@@ -2944,12 +2928,12 @@ trackedFiles:
pristine_git_object: 4fdb8532804113ec7dcc22a1571e250881d1e04a
docs/components/decisionsnoulquestion.mdx:
id: 02d50e93bd1d
- last_write_checksum: sha1:6ea1aed72fc2c8cab05c8e9916bfed6f497ffe08
- pristine_git_object: f4b55ec9c90b07868de7f8f9c0dfcacf5bd8850a
+ last_write_checksum: sha1:555fb1f29c10c7ba657e19491917a98a4e2ecf0e
+ pristine_git_object: 2cc5d5154d344a7cd1e0645ad77cae94cb1fbdda
docs/components/decisionsnoulquestioncriteria.mdx:
id: 6a86326b185c
- last_write_checksum: sha1:6046d987f6029814574ee3d6b3e922e057f0f835
- pristine_git_object: 8ee6c01910aeaa576a2bfbf1736f6ae850d31a85
+ last_write_checksum: sha1:460c38b0cae152efad4dddac2c2096d03539d439
+ pristine_git_object: bc7b3945f61f4c76171b2a92301f2cd4807b6a76
docs/components/decisionsnoulquestioninstructions.mdx:
id: 4d75a913d6d6
last_write_checksum: sha1:b9f0fad006e80a18d9810f13855faced17c9e084
@@ -2992,8 +2976,8 @@ trackedFiles:
pristine_git_object: f3a1fc443664a853afe55af45af7e3bf32800fa8
docs/components/decisionsscorequestion.mdx:
id: c3dc8f0d869a
- last_write_checksum: sha1:7cac30b8993dc01071ff60b2d8d62ad18fe1e44c
- pristine_git_object: 6075af23f442a0eafdd148fd5c56c983397ee4bd
+ last_write_checksum: sha1:2d7e9cfb41ea06d6661720f45dbd22f02658e859
+ pristine_git_object: 7f124137183160b437c002b1622ed3eb2e708b15
docs/components/decisionsscorequestioninstructions.mdx:
id: fc0693e34588
last_write_checksum: sha1:db808e76929596a3b8db43eddb744de7f492ad2a
@@ -3218,6 +3202,10 @@ trackedFiles:
id: e44bc88cd4bf
last_write_checksum: sha1:59c04fb0870d900edd85bd5cda125aa048b4e288
pristine_git_object: f92ca831fd7184761b14c663c3b88643ba20e99b
+ docs/components/error.mdx:
+ id: b201fa9d4e60
+ last_write_checksum: sha1:e17c47b04fde40a83a967473c4a647613f2b7eee
+ pristine_git_object: 029044c024bd1e1119768663a3ab2c28952efca4
docs/components/errorenum.mdx:
id: 722594694be3
last_write_checksum: sha1:2049d2c991cd1fc6b678b44cba040d382eb3b133
@@ -3230,6 +3218,30 @@ trackedFiles:
id: b365b7815bf8
last_write_checksum: sha1:65fe2b66aeb7f8e46a4c1a1e6ee826495fc86b71
pristine_git_object: ffc147c8c082c000a355063292275d381b130b42
+ docs/components/errorhttperror.mdx:
+ id: f6526a8d58ae
+ last_write_checksum: sha1:e04d201b360f980363c4d08556288c26161ffaf6
+ pristine_git_object: 0530bbf23290e6e7126bc91b0afdd8e2d4bf598a
+ docs/components/errormcpprotocolerror.mdx:
+ id: 89ac05737990
+ last_write_checksum: sha1:17ced793a3764787723eae885052201b3fabeaf2
+ pristine_git_object: bf20bf1863771dad7759dcd86c0f675b8391a9d4
+ docs/components/errormcptoolexecutionerror.mdx:
+ id: 7998a3ab304a
+ last_write_checksum: sha1:13c514a654b00b1e37b37c9132feaa457f8055b3
+ pristine_git_object: 69555454de2390d33223307821d5be683ee5a945
+ docs/components/errortypehttperror.mdx:
+ id: d852986b6fc9
+ last_write_checksum: sha1:9a3086787aedc2adae7029a06af1771b18475c69
+ pristine_git_object: e4a218e1dd18515948a65b40a8c1745ae7a23ef4
+ docs/components/errortypemcpprotocolerror.mdx:
+ id: c38c85e08827
+ last_write_checksum: sha1:22aca8a1869298b7ce7f8743725019c3659e56ca
+ pristine_git_object: 3db06ca2bbe1a2bfafd7b8886b4612c3e5b40148
+ docs/components/errortypemcptoolexecutionerror.mdx:
+ id: c88d7d2ee926
+ last_write_checksum: sha1:2a0a510f30de769428866419370714fde8eb9d4b
+ pristine_git_object: 29d30d239eda60cffcc45f295e35a16c1279d09a
docs/components/externaluser.mdx:
id: 7a1a923e3215
last_write_checksum: sha1:971b1cbcfc942f9b528ba8658b1fa89cc5c38479
@@ -4128,8 +4140,8 @@ trackedFiles:
pristine_git_object: 11f1471c8b6c04f52af89d74d6dec2e9d12c2d82
docs/components/imagegenerationproviderpreferencesoptions.mdx:
id: 32d5c4b3e06b
- last_write_checksum: sha1:c8c83162bc08be1dbed20c6697417cac13e302f0
- pristine_git_object: d4259dfa60c933dc2f1e3c19e782b0a3d3532d7e
+ last_write_checksum: sha1:7a7280aa88ccd66e7ecc0fbda0e0bd6cc91ef776
+ pristine_git_object: 467d2922f71cfbec0f76a92f02a4722d5eae0117
docs/components/imagegenerationproviderpreferencesorder.mdx:
id: 0547877073f3
last_write_checksum: sha1:3e890c691097373cc9a2d7e47c3594f56b57809c
@@ -4140,8 +4152,8 @@ trackedFiles:
pristine_git_object: bccd158982dba4b4ed810b98b5f7d4a6c04afaa7
docs/components/imagegenerationrequest.mdx:
id: b093cb0f5e81
- last_write_checksum: sha1:27c16608a25d9c01367944ae327f2d4f6d341526
- pristine_git_object: 39e8743149fc8e55e859a5ca14bba651bc1ea621
+ last_write_checksum: sha1:8caaa86fe03a06cb7d2c457a21bbd0b9ef382fa1
+ pristine_git_object: 2800926d2b35fff6f1285b32d5f40a7da3fbf141
docs/components/imagegenerationrequestaspectratio.mdx:
id: bda89377f32d
last_write_checksum: sha1:58af560f1182c30c06f8d9413e9e7073038cdc99
@@ -4804,8 +4816,12 @@ trackedFiles:
pristine_git_object: 2fe550a4cda295139b08434f60c8f3fc04bbd4e8
docs/components/mcpcallitem.mdx:
id: 6b694279da31
- last_write_checksum: sha1:c242b263896268f54a4bf4420359e7b7fc2d8417
- pristine_git_object: 5dd0d3596ac6d42d6e78841b3b68b3116156f7ce
+ last_write_checksum: sha1:312f47a911865791a20af2e4a0e36244998b0504
+ pristine_git_object: e0e8711b24d8ab3b8351cc2786d8b83cddede872
+ docs/components/mcpcallitemstatus.mdx:
+ id: 59d18b61acb0
+ last_write_checksum: sha1:d3bc2e8ecc6578596d08c6d5a5deb6d037db303e
+ pristine_git_object: aa46c1cd171c9b232fafab2d78859c865b76ce8d
docs/components/mcpcallitemtype.mdx:
id: ac24e6fa49a8
last_write_checksum: sha1:c66cd7093df7ec0deac9c479b14cd3dadac11d47
@@ -4876,8 +4892,84 @@ trackedFiles:
pristine_git_object: 3611f578de715b5a6def9d3ddc22bb2f328b11fd
docs/components/mcpservertool.mdx:
id: af4fb76dbf07
- last_write_checksum: sha1:a2a0ab2c8e4a874aa411cef24b3a5f6c929ac1b9
- pristine_git_object: d3113d69f1f1b301bba08ecc0df3e43cc1116046
+ last_write_checksum: sha1:184f70ece5172f3e3229456ce2a7ff8bc18b3b6b
+ pristine_git_object: 75f8ede09f5f0d348dd4a2663575f343b81f0114
+ docs/components/mcpservertoolallowedtools.mdx:
+ id: 223f3af1adee
+ last_write_checksum: sha1:43e2da2c42511599005f74b22d416902b4ddf768
+ pristine_git_object: 7affd762585eb80636866ffb74ff2d998054ab2f
+ docs/components/mcpservertoolallowedtoolsunion.mdx:
+ id: 8f213f347bde
+ last_write_checksum: sha1:5a2520d12d5ab76965b96cff1094106228681ae4
+ pristine_git_object: 9dc3c5cbd29dd1f1938a43553e433b40ad33d10e
+ docs/components/mcpservertoolalways.mdx:
+ id: a3daa94747c8
+ last_write_checksum: sha1:12ae9c2864482556ddee958c16e43f7c751b709c
+ pristine_git_object: aca487315aa1d1dafa8ec75aab079e44d48602c2
+ docs/components/mcpservertoolnever.mdx:
+ id: c1a102353a31
+ last_write_checksum: sha1:9d37e19b0a87896214d24802d49cec5e1b310a1a
+ pristine_git_object: 777915677b80992ac3e445a5ff3531c7cc201142
+ docs/components/mcpservertoolopenrouter.mdx:
+ id: 28e40ece7a4e
+ last_write_checksum: sha1:e275056a8aeda1e4a66a4398a949d83d9d971c6a
+ pristine_git_object: ce7b77bc116701e90c5a98430dc40591bec48d16
+ docs/components/mcpservertoolopenroutertype.mdx:
+ id: 45118fc16ab2
+ last_write_checksum: sha1:9fbf471fdb3de1891bfe03ac2b9592e66a4bbdd2
+ pristine_git_object: f656dfe85cc81cbe7d0996193aa82a081da7d928
+ docs/components/mcpservertoolparameters.mdx:
+ id: d4cc208045e5
+ last_write_checksum: sha1:da552ee51231869fd0df51a620e9b807b5244844
+ pristine_git_object: e484a9c074182911c383772d4b6d3bbbbb90c9a0
+ docs/components/mcpservertoolparametersallowedtools.mdx:
+ id: 9dcf9cafbb38
+ last_write_checksum: sha1:61e818c07eefd31fe3bd2e4af8db90db7b5d5700
+ pristine_git_object: b2ea1a8f246b162de71e0ce71ac5ceeefb6da0ed
+ docs/components/mcpservertoolparametersallowedtoolsunion.mdx:
+ id: 95f5ef8f3647
+ last_write_checksum: sha1:f33447bcf529539273d996297fa1df93e06a887e
+ pristine_git_object: 674215e1ccaf09062571fa8716b8ef7b16154649
+ docs/components/mcpservertoolparametersalways.mdx:
+ id: 2359427eda5f
+ last_write_checksum: sha1:e94d00c833bd392b46bb1719fcfe4048aef05acf
+ pristine_git_object: 5459a41c2cd11a819fe8d5d47521f6f048d8bf33
+ docs/components/mcpservertoolparametersnever.mdx:
+ id: 6cf0478b1253
+ last_write_checksum: sha1:eba4c2707bf672a2e3f31e9ee80f823f98594c6a
+ pristine_git_object: 6085502b9847c45120074956222204a13bde25be
+ docs/components/mcpservertoolparametersrequireapproval.mdx:
+ id: 7a495fd91141
+ last_write_checksum: sha1:46e0202897094a8c403c6941e8fbdf3f7ad9237d
+ pristine_git_object: 3015d27bb5ac9dd82a32e78381e1b8f82b76f9d1
+ docs/components/mcpservertoolparametersrequireapprovalalways.mdx:
+ id: ba8f5027b991
+ last_write_checksum: sha1:a92c0558377927e6622351681f9c805987704ff0
+ pristine_git_object: 01145255a42f7a69c5abac55959b4d7cb8fbe2e4
+ docs/components/mcpservertoolparametersrequireapprovalnever.mdx:
+ id: 7904f7fb3470
+ last_write_checksum: sha1:afba1b2a59ab4f465b1067b8d775bf7462e8dedc
+ pristine_git_object: d73202ad89438901e4d3925857c80e86683909bc
+ docs/components/mcpservertoolparametersrequireapprovalunion.mdx:
+ id: 754446fbc62d
+ last_write_checksum: sha1:d989fd85ff79541f09979420092ef443dfabaff9
+ pristine_git_object: 27181c10ee47a42540de60b62a84d728e6da2901
+ docs/components/mcpservertoolrequireapproval.mdx:
+ id: a6b3d89bbafc
+ last_write_checksum: sha1:bf47362e1f5f6f83413d0c0a30a7b036a71db7bd
+ pristine_git_object: 5b5b193f1d4c607ebc7d2bfb28c95a997f149b6a
+ docs/components/mcpservertoolrequireapprovalalways.mdx:
+ id: ba8792e9a682
+ last_write_checksum: sha1:ba3f6682ffdd20d909711a5dde595a82a31f205f
+ pristine_git_object: bdb891eb8c6e84c2364675ebe989cc2250fce89a
+ docs/components/mcpservertoolrequireapprovalnever.mdx:
+ id: c86bea5be089
+ last_write_checksum: sha1:50fed446faf01ce6cdfb18df55f3640080dafded
+ pristine_git_object: 33daff15a0379d93e867bb4144de53bc726f5848
+ docs/components/mcpservertoolrequireapprovalunion.mdx:
+ id: ba9cb966f259
+ last_write_checksum: sha1:eb5a138da0dae8b59d2b6b88c56f1707e91ff553
+ pristine_git_object: f0b645fe3effcbf9867e1d4ca75a9a48208dfcac
docs/components/mcpservertooltype.mdx:
id: a3ffc7c06762
last_write_checksum: sha1:66ee790a2feff588d942a104eaccd58ef4b79259
@@ -5266,10 +5358,6 @@ trackedFiles:
id: 15bb54542fc2
last_write_checksum: sha1:3aa1f62726105c06add25b64b71b4fb1b301a1a5
pristine_git_object: 891624af7260075b5be54fb8c509c1db2d7bcb63
- docs/components/never.mdx:
- id: 7c0a5248748d
- last_write_checksum: sha1:296206c7c487e0c1009415569b58cc3522657f76
- pristine_git_object: 41a96792cb9424711eadc770999a1740f26a04e6
docs/components/notfoundresponseerrordata.mdx:
id: 7c59a9c21347
last_write_checksum: sha1:df09d08706a34e1671f07a81cf26f52d6f23a367
@@ -5708,8 +5796,8 @@ trackedFiles:
pristine_git_object: c23dcea302163ffa59370b90019d208072d619f5
docs/components/openairesponsestoolchoiceunion.mdx:
id: 830a36f3265c
- last_write_checksum: sha1:a3fcdfc71e4ae46473d290ed6ad09f540ffdac79
- pristine_git_object: d44bdba389cd431c9407de6ad9cb1fe5776b8601
+ last_write_checksum: sha1:e606887f6a2fe07a6554f91cc17d21fa0528dfaa
+ pristine_git_object: d5c7e669c9bccedf88d15cd0b19f3a2d01ebb8c7
docs/components/openairesponsestruncation.mdx:
id: 2d9d105e2a92
last_write_checksum: sha1:cfa41ac9ec20131a32ebcc5bf1831fc1173eec09
@@ -6214,6 +6302,38 @@ trackedFiles:
id: ecd36a8eb320
last_write_checksum: sha1:f24559d5f041bbad338effc43db33d69e0f02336
pristine_git_object: 7e12c2ee3da68966a14d19207b95699c7b57d1e5
+ docs/components/outputitemmcpapprovalrequest.mdx:
+ id: d026c87302e1
+ last_write_checksum: sha1:72c10a2773cc022d20e4bfa1f84f2fa8f4d25f41
+ pristine_git_object: d42e8d9d1d4feec63cb84ab80bb9416402da76be
+ docs/components/outputitemmcpapprovalrequesttype.mdx:
+ id: a07ec50bb27a
+ last_write_checksum: sha1:966f5937ae9b74e71502fcc315f2a9522ad5e18a
+ pristine_git_object: 22bc74a7030ebc2b7a0501afe4fbd969a71c4ff7
+ docs/components/outputitemmcpcall.mdx:
+ id: 813fc1771524
+ last_write_checksum: sha1:678682bfd39c83ef7fee494680ff92848976b537
+ pristine_git_object: c8c01c1594927959e7c6346c0f2f564347456c37
+ docs/components/outputitemmcpcallstatus.mdx:
+ id: 5ae0df1d4406
+ last_write_checksum: sha1:8e1518cbaed8189c83056fb6ed9ad50daf066abe
+ pristine_git_object: 569bafafb09a2d56f45f0dc63be0b4ae49e95d05
+ docs/components/outputitemmcpcalltypemcpcall.mdx:
+ id: 7d4ac6b75676
+ last_write_checksum: sha1:6a216e6ae42f1e7ae8cb5ca931271b3ab158ae4d
+ pristine_git_object: 79216e1ec3ab81bbbfad289b530dc6f1ccab5f45
+ docs/components/outputitemmcplisttools.mdx:
+ id: d6c631fa4ae8
+ last_write_checksum: sha1:602997c9e2480ae50b7616205e8d7e070e759c7d
+ pristine_git_object: 577bc2910759b2c60b2ce2697686f6fc5dc18a11
+ docs/components/outputitemmcplisttoolstool.mdx:
+ id: b830d22bc1f1
+ last_write_checksum: sha1:cb5a694eef816a067ecf0fe8f016fb6339ce50dd
+ pristine_git_object: 0e22d1768f8af2ed73ff2ab48c851088f3bab387
+ docs/components/outputitemmcplisttoolstype.mdx:
+ id: 3b1f991bf0fa
+ last_write_checksum: sha1:2ef5ae83f7ce611d418e975bb6277976f0122c48
+ pristine_git_object: ae34b6e890e1fa842052e945ad1edb7636970351
docs/components/outputitemreasoning.mdx:
id: e7ec6a711ef3
last_write_checksum: sha1:8418c9d1778b7528ed7a5cb13f303682ec5d82cf
@@ -6240,8 +6360,8 @@ trackedFiles:
pristine_git_object: 510bb66605a709aea0c2025829cd1b1d1a46e673
docs/components/outputitems.mdx:
id: 876e956be23e
- last_write_checksum: sha1:f07118635ddb738c3c31664a2feac591493c83d0
- pristine_git_object: f68ca9d3a8cb5d6c6ef918e1e2b6830116b43a10
+ last_write_checksum: sha1:709e4571a6dcef4b6bf5fd577674c8ef1c5f7bc5
+ pristine_git_object: 7b09b45f7e7f7637df45e795529e28ab73c3cc21
docs/components/outputitemwebsearchcall.mdx:
id: 5a7fc683da6e
last_write_checksum: sha1:147e2d8107125a6eeddd5b81e4a80fae22030cb3
@@ -6888,12 +7008,12 @@ trackedFiles:
pristine_git_object: 70dcf1b583a3d202157814d8bd4f3c8f7811d0d9
docs/components/providername.mdx:
id: aa3a4904b228
- last_write_checksum: sha1:7c82a73c20b461fab05b24b899caf9f281a86f81
- pristine_git_object: c79e63882a9e185ff2c6667971b98a5216df6aba
+ last_write_checksum: sha1:a83762dd6f1343d4dd13e834167f58a2711027e0
+ pristine_git_object: 1b0d1e25cb8fff80879f5c1b33f94b1ffd0e8772
docs/components/provideroptions.mdx:
id: 2697807524fe
- last_write_checksum: sha1:15311ce495d53957ee034e091233e88d3f848a0b
- pristine_git_object: a346d1ba6ed3daa91c697a20db8cf91ef2bb0cb3
+ last_write_checksum: sha1:54ad9527e03653e25c9781a7f07c392a4575d004
+ pristine_git_object: 1816a81845f87a370fbf354a7922e0707db9347a
docs/components/provideroverloadedresponseerrordata.mdx:
id: dc500cd14889
last_write_checksum: sha1:335ee4c9c2421a71205eb08871f1041cbe0c1fa7
@@ -6924,8 +7044,8 @@ trackedFiles:
pristine_git_object: 15c816ec62505e984cc75801bdb88cf4271ab934
docs/components/providerresponseprovidername.mdx:
id: 2fc17b61e546
- last_write_checksum: sha1:7787db8ec0056c1c7369c972f7ed291d021262f1
- pristine_git_object: 0f0fe16af11e4fad8b5ad45ffa89f0b5f3a1c0e7
+ last_write_checksum: sha1:52bc94e5704f1037add4f280e3e7ddaa59f14f35
+ pristine_git_object: 8b4322d8b4e600d2497e71252cf510435ff6c0d5
docs/components/providersort.mdx:
id: d73fa13eeb95
last_write_checksum: sha1:b7e9e6842741e3433d705bd576f2ac5383f00134
@@ -7186,22 +7306,6 @@ trackedFiles:
id: 6f984fda78d6
last_write_checksum: sha1:8b8357a28eefbb4dc7bff6c26d2cf0613258a810
pristine_git_object: eb93f09244d86768fe1394938f4befdcfd2414a6
- docs/components/requireapproval.mdx:
- id: a207e0b4b049
- last_write_checksum: sha1:23570bd92ecfe77a293b5760a475d64b1799d88a
- pristine_git_object: 24f6adc5c47a50342f44bcc7ba91e0c212a84d71
- docs/components/requireapprovalalways.mdx:
- id: d1a6759638cb
- last_write_checksum: sha1:2fc22645172025eb9a591ea117922730649d1fd9
- pristine_git_object: 520f072ac3cb27bc17febba34ff704d16133f8b3
- docs/components/requireapprovalnever.mdx:
- id: 6dd7ca812306
- last_write_checksum: sha1:3ec72ee929c0d529ccbcebb22d52da5097f415d6
- pristine_git_object: 0e65abee2cd9ce152b68dbe3180739ea36b949e6
- docs/components/requireapprovalunion.mdx:
- id: fd80c94f61ca
- last_write_checksum: sha1:9df63b87a79a3ccb889870640b0d658ea57436fe
- pristine_git_object: 01acc3f8d0a451cf6ca5d1c0da90995c79f8f727
docs/components/rerank.mdx:
id: b011fb4a30ac
last_write_checksum: sha1:c04836cd04951c2d9dbd99636d2e04f21ff2e8e2
@@ -7268,8 +7372,8 @@ trackedFiles:
pristine_git_object: c0da234d5bf7f1231246c2e3619a355cca8ce264
docs/components/responsesrequesttoolunion.mdx:
id: 96bafa5d19b1
- last_write_checksum: sha1:da69027ea97d06a56a22e1a6746bb5768895e5f5
- pristine_git_object: e9024a4e9c6c343d7a04be37afbb959e73a943dc
+ last_write_checksum: sha1:e6b9851b8eeea3e29a9cdb754d62891f59d6a0aa
+ pristine_git_object: 1eefc25c291fc76dfd2936347df067ed514c2490
docs/components/responsesrequesttype.mdx:
id: b2720876d384
last_write_checksum: sha1:9ed21e9f3c79e3936a4f6bc9df24eea499cc1e56
@@ -8034,6 +8138,14 @@ trackedFiles:
id: dfdf03af8bec
last_write_checksum: sha1:24ffd0586af2f7e1da81937afe129d03cc3f273b
pristine_git_object: da1f201269ab4a8cc29cca24bff9ceab099af181
+ docs/components/toolchoicemcp.mdx:
+ id: 959b865da33f
+ last_write_checksum: sha1:6691c0426dbe86870563de8cda316aee6d81a68b
+ pristine_git_object: d55d8987de8e9692daba9031b2c30bff74b0e94f
+ docs/components/toolchoicemcptype.mdx:
+ id: 51dc5aae50d5
+ last_write_checksum: sha1:7bfddaa2afb63cd32f37496488bd2577a9fee196
+ pristine_git_object: 0b927c376d9d3f3ac3a4e74922295d781b5dce58
docs/components/toolchoicenone.mdx:
id: a65f80fb91da
last_write_checksum: sha1:7737ccf7989e9463bd75bec84c3b5aa16da3eda7
@@ -8096,8 +8208,8 @@ trackedFiles:
pristine_git_object: 0af01dab5a2b7149d36595b1241d210bff24b7a0
docs/components/toolsearchoutputitemtoolunion.mdx:
id: b0ea571f5d27
- last_write_checksum: sha1:d6add493f38d0fdce75a3c2ad33f390881358ce9
- pristine_git_object: fc1479a10a0f3c164384ee353388bb85bb3bc615
+ last_write_checksum: sha1:c0cb71d0926f0394cc8fb749d27160d21ef4884b
+ pristine_git_object: 56268e759c2730bfe45448ed1aef62f1a80ba036
docs/components/toolsearchoutputitemtypefunction.mdx:
id: 6a6efebc029a
last_write_checksum: sha1:059e58a497256a4cb22de1ab332b6961a85192da
@@ -8520,8 +8632,8 @@ trackedFiles:
pristine_git_object: d7ddcb804b52e47950730ce94e7202336bfe8b64
docs/components/updateworkspacerequestdisabledservertool.mdx:
id: 47cabb4adf1a
- last_write_checksum: sha1:9a2e914479d5924d4fd303f87c93a601615f0745
- pristine_git_object: 0ac89d206b33a5466cb729ba1a6c2cc3841229d9
+ last_write_checksum: sha1:6e1590e629a17f91e9a91844a8e54ea5deec5da1
+ pristine_git_object: b92957594ce518192f52de0c6dfe089ecbbc652b
docs/components/updateworkspaceresponse.mdx:
id: b9779063a1b3
last_write_checksum: sha1:cb114ceaa31803c0d8432cfaf8c136a17840a3aa
@@ -8656,8 +8768,8 @@ trackedFiles:
pristine_git_object: d8c6c0f20ce631b8daf4ba53a722b532f75b139f
docs/components/videogenerationrequestoptions.mdx:
id: 1d67160e7e7a
- last_write_checksum: sha1:5178bb73428dee91884ac13b67fa33a0903059e3
- pristine_git_object: bd8ddff7424b260e2f9cef4327d86055992736c4
+ last_write_checksum: sha1:96b4a939488710458a6aed08460b2738675e682e
+ pristine_git_object: aaa3eacf60068aadf0c138588b8ba37ba1d65c22
docs/components/videogenerationrequestorder.mdx:
id: 4daf6f446396
last_write_checksum: sha1:e991c58b11c19acbd8a2d0416564380cedb42b94
@@ -10472,8 +10584,8 @@ trackedFiles:
pristine_git_object: edbbce3632fff19ba4cbd2677b6766805eaca140
docs/operations/provider.mdx:
id: c75b3bbeeaa0
- last_write_checksum: sha1:23c74f451a5803e8c29725a6bc8f8b4f60801d72
- pristine_git_object: 17ead5cd65fa9481f3ebc79f5ee3318cb8807237
+ last_write_checksum: sha1:45a1ce481f90f57e2970a7b67909a199c36fb2c2
+ pristine_git_object: eb21dcbb14e2f87a8f2d19d7e72d4d8f80c1ab7e
docs/operations/queryanalyticsdata1.mdx:
id: 0e41beea77d0
last_write_checksum: sha1:f9a349b4fee07f786180e94b45f92002bfae0e56
@@ -10816,8 +10928,8 @@ trackedFiles:
pristine_git_object: 5549912bda5e7b96a81658a996a60715573f0603
docs/sdks/images/README.mdx:
id: 534a6c102c4f
- last_write_checksum: sha1:e6afcda11b6fa507787f0260e872e51e2a5b5f9d
- pristine_git_object: aa2008a0118c07ef31fd62ce81d12053dc1fc2aa
+ last_write_checksum: sha1:079630beece943bdc653184e6d6448df72a62bd5
+ pristine_git_object: d45846d4514d25a84fbd8cd439a6bd5c37e75946
docs/sdks/models/README.mdx:
id: 58f1ca464e0b
last_write_checksum: sha1:2d106e4557b3c7602c77b7b7f237867a8736bb6c
@@ -10896,8 +11008,8 @@ trackedFiles:
pristine_git_object: 3e38f1a929f7d6b1d6de74604aa87e3d8f010544
pyproject.toml:
id: 5d07e7d72637
- last_write_checksum: sha1:9597962d069c1ddd38642e3959f8d5443aa5a1d5
- pristine_git_object: fae1ed2a79e407c0c4dbc3c3801c690fd45f43ca
+ last_write_checksum: sha1:a07bb90cba858b3f588c91b5a0ee0fd927ef4ba9
+ pristine_git_object: 030ebeef911ea99d97a6e8c698089bd7369e8899
scripts/prepare_readme.py:
id: e0c5957a6035
last_write_checksum: sha1:77f44b60b98bc126557ec27391f91dfba764bb54
@@ -10924,8 +11036,8 @@ trackedFiles:
pristine_git_object: 86713cfea633e09d33b3d4e65281071fe20e6137
src/openrouter/_version.py:
id: d8d15ad6c586
- last_write_checksum: sha1:99d4294a7d1a4d5677d38c6cc105e24cb90f65b2
- pristine_git_object: 8b271b6250204d1d142d92e51550e2de2beda088
+ last_write_checksum: sha1:e5cb07ec383980634203c69f5b5bcc3c2d05cab8
+ pristine_git_object: c3dbcae7d7635f76346f9c2ec30ea9113725bae0
src/openrouter/alpha.py:
id: 306c4d93308d
last_write_checksum: sha1:80cc0f39649445431cc2247ed0e0765438467766
@@ -10972,8 +11084,8 @@ trackedFiles:
pristine_git_object: ad3d247954547814054c01989a2dff3d12b3e4e1
src/openrouter/components/__init__.py:
id: 81754e97b3f4
- last_write_checksum: sha1:85310c54aa421d6aeec2cbb5728b6d09268f66bb
- pristine_git_object: b0363175cb1e9ea0bb0697b89e04155e7c3d2dd0
+ last_write_checksum: sha1:55d085d620a8c153c5f4312243dde6a849e1bc21
+ pristine_git_object: 8cc06bc4ade52a6aaa22ba0f768eb9d2bf4dbabb
src/openrouter/components/aabenchmarkentry.py:
id: e2e0f0b48c82
last_write_checksum: sha1:fab4d9a24d2cea937bb749d46c5f83941e99d65c
@@ -10988,8 +11100,8 @@ trackedFiles:
pristine_git_object: 1138e6f6bc025546a86877749ce83aca4c46499a
src/openrouter/components/additionaltoolsitem.py:
id: 2761ab789f41
- last_write_checksum: sha1:f436ebb34ea283810b12ec4ac4af4d4562cf95a0
- pristine_git_object: ff1837113203f2d3e11d1be331075560b1410683
+ last_write_checksum: sha1:bc93acf9d329eb47765f21dc93a373df26f87a38
+ pristine_git_object: 3d5379b367b4ab862a94e8f0ec34c6386d702c99
src/openrouter/components/advisorreasoning.py:
id: d5af5c19fc73
last_write_checksum: sha1:0fd32e4ff2d89f7cea861d6e691e82a7e1ff62f2
@@ -11048,8 +11160,8 @@ trackedFiles:
pristine_git_object: b2fa33dbe51cef3ebba3298492fea70c1112dc95
src/openrouter/components/alignmentresponsesrejected.py:
id: f95a8a915824
- last_write_checksum: sha1:3c8b322c7ba35e72763d9af6911fa06960b17b5a
- pristine_git_object: e95541f48454d045dcef96ffb134206f0f6a7a93
+ last_write_checksum: sha1:a6f46460e89e377f9392dac7a0874617ce2e25a7
+ pristine_git_object: 870d6f53572b156f99769818a5637b6c6b655c78
src/openrouter/components/alignmentrule.py:
id: 54982e2c3889
last_write_checksum: sha1:b244b847343e4f1e3c1c3c458e6cf44a5e8a6c34
@@ -11704,8 +11816,8 @@ trackedFiles:
pristine_git_object: 1b3f14e8e93ced25f87ee3ca73c01e2f32f42988
src/openrouter/components/byokproviderslug.py:
id: 6738a8516caf
- last_write_checksum: sha1:dfc921a293020695b4f34809074110377e7f4223
- pristine_git_object: 719477b8c8cdfd1e516886458e7011a84d04d3ed
+ last_write_checksum: sha1:b6a56410cf946c0463a322b231167ef173008d67
+ pristine_git_object: 5a5ac4a0d42f62cb299f2b099a00bbc0fc013441
src/openrouter/components/capabilitydescriptor.py:
id: 368790a86f10
last_write_checksum: sha1:a167551924ee82b4b5876a0ab698a45fe8c87a95
@@ -12136,8 +12248,8 @@ trackedFiles:
pristine_git_object: 3a03248b4aa36f469420c5602df4f5d21a36dd68
src/openrouter/components/createworkspacerequest.py:
id: 3785d9b207c2
- last_write_checksum: sha1:2ba69c97be9ccf15539646697dd4c427c02a0b42
- pristine_git_object: 70e1a4066d721ac607b1f06d6d448d07473d52c1
+ last_write_checksum: sha1:b6e2f73b6c68abf33128bb583f4187832467d192
+ pristine_git_object: c4493d9edb70d200ab16c489ddcf9fb27f2e120d
src/openrouter/components/createworkspaceresponse.py:
id: 986d9ff993c1
last_write_checksum: sha1:7e9028b437a9e33a7541ba222cf01e6629f5c74d
@@ -12196,8 +12308,8 @@ trackedFiles:
pristine_git_object: 8ace039989a6bdec7da3542d094e6a27fe12bdfb
src/openrouter/components/decisionschoicequestion.py:
id: 3e2db807f2d4
- last_write_checksum: sha1:9f7f323f555c3d0285924e7671e2a555b293dfd5
- pristine_git_object: 2bc00e588439e2d0254689bef6f69aae32f9ce1d
+ last_write_checksum: sha1:cfaeea78e8c894d5bc6786b54d1239a0bd9cf66f
+ pristine_git_object: 4038e5f94b02c19ac9f6d15b2ff747243cc93b0c
src/openrouter/components/decisionsimageasset.py:
id: 9c3b310f6df9
last_write_checksum: sha1:27c17513166a41d1a52cada4fbf496002d62ed5d
@@ -12208,8 +12320,8 @@ trackedFiles:
pristine_git_object: 144095e118b62c54d8e6e0abdc7a29a69634c82c
src/openrouter/components/decisionsnoulquestion.py:
id: a04589349064
- last_write_checksum: sha1:3434eb7616fe1df0479dfa0e89ba55a0f3874759
- pristine_git_object: d6b2551a31bc9c7d8e2ed96913c097dc127c8311
+ last_write_checksum: sha1:0bbb911853969cfe003ded8e16880c90ced1cf06
+ pristine_git_object: e467f51ad3115c471140c29558ce02c28221fbef
src/openrouter/components/decisionsrefusalanswer.py:
id: cbd72b2ed78b
last_write_checksum: sha1:f05e3d738d7cd4b10506c7132e70861d1e53c2b3
@@ -12228,8 +12340,8 @@ trackedFiles:
pristine_git_object: e06b49a8d96c88e79da123a1229b2dc4a1694210
src/openrouter/components/decisionsscorequestion.py:
id: 2c10723569c6
- last_write_checksum: sha1:eb600123dc7156e5e5f2bf9a06ed022746ba680b
- pristine_git_object: a5abe8e608aaaa6c4dc2a55e38bd6d6b23b8f970
+ last_write_checksum: sha1:d6ab387e6d897ef2c0a0a005913fef90a98b2fd3
+ pristine_git_object: a3ca9d0b2e930b2c49df1ede95780568c4bd406f
src/openrouter/components/decisionsurlcitationannotation.py:
id: 3cb7751301d1
last_write_checksum: sha1:bde39324eafb1d87fbea5936a4eb24415a939337
@@ -12696,12 +12808,12 @@ trackedFiles:
pristine_git_object: fe042dd889e2f17d642f19b0d596cb3e53a7fce2
src/openrouter/components/imagegenerationproviderpreferences.py:
id: 100a82a54e2d
- last_write_checksum: sha1:74c5a591b2124b340e74628a5a0e59da20cdb459
- pristine_git_object: 010c0fa0e5022ab360e6b824d26e2c044682fd5c
+ last_write_checksum: sha1:6944924737bc128f49ae146da8f07d980c4a596f
+ pristine_git_object: 56f3812900c476eef91476176214642d1cf1f0f7
src/openrouter/components/imagegenerationrequest.py:
id: f8291a7be9a0
- last_write_checksum: sha1:31c65099ab7cd41604f121de7abad17cf3863978
- pristine_git_object: ca824f4abeb7b1babb86010a4de0c57c153a5c43
+ last_write_checksum: sha1:733b706f543a0acdccdd6bff9a3febc1e03b79a3
+ pristine_git_object: 9dc394a50f01a4c8b94e872cff0def4a8c7ea74f
src/openrouter/components/imagegenerationresponse.py:
id: 53354cd0cbfc
last_write_checksum: sha1:53f1cde7b8bfe4f9e786a76f6e57b0a1f76aced2
@@ -12804,8 +12916,8 @@ trackedFiles:
pristine_git_object: f499cbbb546232f5cfbfe2c44fb41aefb306c87f
src/openrouter/components/inputs_union.py:
id: 17d6239cb6a7
- last_write_checksum: sha1:3957ec94f01bb9a31f293f8ae2505d8ac04c88cf
- pristine_git_object: 398c4ae99e49fee455c7b6fe262840e8714f217a
+ last_write_checksum: sha1:4bc1d972ad7487d88145caf30f8e712fc8adbb7d
+ pristine_git_object: b5b2ac90b2d7fd66a06259ff5ada7f4122492dbf
src/openrouter/components/inputtext.py:
id: a995ae96be99
last_write_checksum: sha1:94c720a449e0d5a3f23ee7195f648422f61ac114
@@ -12960,8 +13072,8 @@ trackedFiles:
pristine_git_object: 16f4b5bce74438805eb145c9726f12383b833273
src/openrouter/components/mcpcallitem.py:
id: e56a30943ca4
- last_write_checksum: sha1:456d85e5e2816b7523758572e5e6b079025ef72a
- pristine_git_object: ff9945ec2d6ad3f27a790ca83bbf172fec6c3ee2
+ last_write_checksum: sha1:60e08f77e6f6b02107f6a091715cd6df6e5be0ba
+ pristine_git_object: cd6e6061e765366679b50c6dfdc519cb6fba1795
src/openrouter/components/mcphttperror.py:
id: 1b3869159863
last_write_checksum: sha1:f4048532d0cb6e05bc70ac2c55d9fee41ea83bf9
@@ -12988,8 +13100,16 @@ trackedFiles:
pristine_git_object: 2c724d72cb52bfbffd2b820db729775231c0bb68
src/openrouter/components/mcpservertool.py:
id: bb8aeb03a111
- last_write_checksum: sha1:1b1cbfbaba61da9c7a1b6121c6cd635f588dac47
- pristine_git_object: 93c62f100e86405ef60aecf04882bf9a5def7ede
+ last_write_checksum: sha1:a988bf77aa890d5995ec504d37feca8f42230b68
+ pristine_git_object: c083a0beebd5f7a25f4f3af00937fb21afaa72cf
+ src/openrouter/components/mcpservertool_openrouter.py:
+ id: 42f1a542a4a2
+ last_write_checksum: sha1:72073cbee4a98c8ef20be374258f1a9edec51808
+ pristine_git_object: 015c1055aab12645f6d3bbb5ec7755cc841f22de
+ src/openrouter/components/mcpservertoolparameters.py:
+ id: 14824489c9b0
+ last_write_checksum: sha1:4c275e40cbd8e66f1b0cd214cac7da96b5b16a5c
+ pristine_git_object: 273827b651fd719efdfba95b9bb9425526a68e54
src/openrouter/components/mcptoolcallerror.py:
id: d86b6e0b2ae1
last_write_checksum: sha1:86166c50bb48d01201a7a5f19e7290fa08c86af3
@@ -13256,8 +13376,8 @@ trackedFiles:
pristine_git_object: cd39badb7af07d0bb5390e687427aebd6230ea76
src/openrouter/components/openairesponsestoolchoice_union.py:
id: 1a0b229049a2
- last_write_checksum: sha1:d80c2658f7dc564795cabb57f3970c4a3af38689
- pristine_git_object: edcd5ae548f85ba1be805bf6a6fb798baeb0dd29
+ last_write_checksum: sha1:3281c3c759ba840acaa338050a8e9e473fb8cb82
+ pristine_git_object: 4b4a35a19d55be109b3b35943d11ecbbe38b03cf
src/openrouter/components/openairesponsestruncation.py:
id: 0c92464e7292
last_write_checksum: sha1:5df4098cf0472d2df40fdcc1350f81d6059a9ab7
@@ -13280,8 +13400,8 @@ trackedFiles:
pristine_git_object: 08d990d8cc07b7928158fc55784cd9d613f4c58b
src/openrouter/components/openresponsesresult.py:
id: 78f7e33b19e6
- last_write_checksum: sha1:4b96f26ba96c33ae35aaa48a0c74616d93dd8d1f
- pristine_git_object: d5ffb60091faae032e6d20c5696c4f57314590e0
+ last_write_checksum: sha1:725f1decb21e0584c6e6153d8f95d3190bbfe8e3
+ pristine_git_object: 005d00f5257edadb3a8eb8f784d090aa46790f86
src/openrouter/components/openrouterfile.py:
id: df1961bcb130
last_write_checksum: sha1:1a9a1b1e640f4d0ef78ce0caa160b5ab342f02cc
@@ -13446,14 +13566,26 @@ trackedFiles:
id: 0b4cbdbd733f
last_write_checksum: sha1:0ecc5cc9dad95b19cb6d4d7bb1dcdc8f2074b703
pristine_git_object: 94af810bbdb87fb8c6800645354f7ec4dd067e7f
+ src/openrouter/components/outputitemmcpapprovalrequest.py:
+ id: 295ae93a2706
+ last_write_checksum: sha1:3d030f74a471e191681742feb68ab892951c8753
+ pristine_git_object: d0e8a74cb7955a50f9696e5baf3ebb6ebb7652ac
+ src/openrouter/components/outputitemmcpcall.py:
+ id: f0caa12bbb23
+ last_write_checksum: sha1:f178b282209565d7ecc2a9348d162398f674a633
+ pristine_git_object: 45cba55c96172e8c16e516435fc65c8259f439bc
+ src/openrouter/components/outputitemmcplisttools.py:
+ id: 09167bc01055
+ last_write_checksum: sha1:38e3671c31d1f45d17581fadd37355207dd3a903
+ pristine_git_object: 40b0d968e3e55f9fdd03f634ed76692fea07fa33
src/openrouter/components/outputitemreasoning.py:
id: a00fce62cd6b
last_write_checksum: sha1:c25af3dd914e6ec3d2479d01cf3ac224c17f4612
pristine_git_object: 616b0f5112e106777b4c096aeea6fef58ff32020
src/openrouter/components/outputitems.py:
id: 90f107de3116
- last_write_checksum: sha1:375c8632b321362d5e189a743c012cd4be655c92
- pristine_git_object: 9cadc1da1a6023b0f6dc93b9863641c741bcae94
+ last_write_checksum: sha1:9503275f7e69cf4cee8af2060e917268a7e8f2e9
+ pristine_git_object: f4c0864d6648b885b2ee2afe5fd7ab80009b10c7
src/openrouter/components/outputitemwebsearchcall.py:
id: bac8732aecb9
last_write_checksum: sha1:00d5b67226d6ff2c6a5497e6e01c764aeede496e
@@ -13716,12 +13848,12 @@ trackedFiles:
pristine_git_object: 170ae25c582bb8decd74e1c69bfa8353bd44e86d
src/openrouter/components/providername.py:
id: fcc722fa2fce
- last_write_checksum: sha1:a1690b4504574c699c746530fc9fdbb1cc56c34b
- pristine_git_object: 482a05a9d5f5bc0b35f92139a202f4c7d111a777
+ last_write_checksum: sha1:5f696ff5c2e49039fa2d621312f78cf06ad67228
+ pristine_git_object: afa50f9d86c419b58e98a79470638be648288459
src/openrouter/components/provideroptions.py:
id: 73dde6c8f359
- last_write_checksum: sha1:29d6d2e590590df264d996e071c885d58995a779
- pristine_git_object: 9c779f42a98c48575d64f94241dd250f48fd3b1c
+ last_write_checksum: sha1:ae3f320a227005b7dae5129ee986e2e8f680bfd4
+ pristine_git_object: bd1541270192f68e2ce06b2de10fc09b9cc8e568
src/openrouter/components/provideroverloadedresponseerrordata.py:
id: 5b693682570e
last_write_checksum: sha1:b54682560ff95dad18d26f9aaf887f8f6e0e1f71
@@ -13732,8 +13864,8 @@ trackedFiles:
pristine_git_object: 3ca57868fa02b7f5e4cd2c0fb0fbf0c6a92a8bee
src/openrouter/components/providerresponse.py:
id: ad3887be54c5
- last_write_checksum: sha1:4f00257bb8266b0b20bdf8294542646a2ddf15f2
- pristine_git_object: 9937130cf7d39a873eb17a311d33c01bafac4856
+ last_write_checksum: sha1:17f6e1849de2e1c7d22a8697d01402e5aebe4414
+ pristine_git_object: 3356276ed00185d4a3a9f43672275de17c6e974e
src/openrouter/components/providersort.py:
id: 348e382bf494
last_write_checksum: sha1:57551507f95cd2e16ef995e1c13f859fd0726152
@@ -13884,8 +14016,8 @@ trackedFiles:
pristine_git_object: 900bf08ec940565a8cbf55712a437775db00ca46
src/openrouter/components/responsesrequest.py:
id: 8c850080ec5d
- last_write_checksum: sha1:a63d2e86e801fa49295f6df110cc52acf0b5db67
- pristine_git_object: b49331a97779198d07fae43c41b2b9c774b17274
+ last_write_checksum: sha1:f228055a425937773b78b4b443f7d49670153b2f
+ pristine_git_object: 1b82a39295323fed14c12d89f39040578ea06de5
src/openrouter/components/responsesstreamingresponse.py:
id: 142379f3bd90
last_write_checksum: sha1:a48d6f3610f5d15248ef4d25a0d88a0a4a1a9db7
@@ -14258,6 +14390,10 @@ trackedFiles:
id: 9e2a14e87eac
last_write_checksum: sha1:b969135c75e9671fbbb6bc7a325968acacec07c7
pristine_git_object: 4ad8b7e6ed164dbe62f17aabed7352319c8bbe26
+ src/openrouter/components/toolchoicemcp.py:
+ id: "518122642230"
+ last_write_checksum: sha1:eaa61211b3a62dc9bbe16f9259aac5de9098c1f0
+ pristine_git_object: 15884f9c0c0f8b12e1af17c672571ad21da34fcb
src/openrouter/components/toolchoicesupport.py:
id: a46dc874f6c8
last_write_checksum: sha1:b7d04d0b4d2ed2c052007e4d00e7857a9f70f5c7
@@ -14268,8 +14404,8 @@ trackedFiles:
pristine_git_object: 61f716e4713759aff37d73562aa55ab335b3a178
src/openrouter/components/toolsearchoutputitem.py:
id: 8d1db20e5746
- last_write_checksum: sha1:e18964a8c447a87e95a2f04c46ed2e660caa1123
- pristine_git_object: 7308337956bd523d3cae8dedd7f7a495d7150bc3
+ last_write_checksum: sha1:cdf225c1606fe9e69547e0762febcc77729acb83
+ pristine_git_object: b56ef2bfe3d5407101522b0b7380c3d41c1b90c0
src/openrouter/components/toolsearchservertool.py:
id: 3aa6de41ca07
last_write_checksum: sha1:21dc898a1519400cbfbda4aa35eda60a9dcbf668
@@ -14396,8 +14532,8 @@ trackedFiles:
pristine_git_object: 2f110211bb0a6889bb6455a7a3901e0be260b170
src/openrouter/components/updateworkspacerequest.py:
id: 78d86b3b0a63
- last_write_checksum: sha1:4e8da8b27b81f6cd72483fc807dfff2413ae2ab3
- pristine_git_object: 48897956756399c6dfe7684094e4d28e2648e754
+ last_write_checksum: sha1:1e8315238c5f37db8142479e832d782b969ec767
+ pristine_git_object: 5049dc7ec907a7948b75c9141d3351608753e4b3
src/openrouter/components/updateworkspaceresponse.py:
id: 46253fa9690a
last_write_checksum: sha1:4708e7e4cbfddc34ffc9ed4808a88bb5b4a61ebf
@@ -14460,8 +14596,8 @@ trackedFiles:
pristine_git_object: c2f15eb53f14024dfd1e620c52a564bf4682854f
src/openrouter/components/videogenerationrequest.py:
id: 70e3c9ff288c
- last_write_checksum: sha1:ee8762a092b920500475a0dd8949e33c6d615f53
- pristine_git_object: ef6e96c11e7d76a6bed8c09d5cd75179afa397d7
+ last_write_checksum: sha1:f0118bb3a22377e850d9201d308108cdafa976f8
+ pristine_git_object: da4c61d085a48c2df2e7814980420ab7a3f3d0ec
src/openrouter/components/videogenerationresponse.py:
id: 541f1321b072
last_write_checksum: sha1:6ba68c4551af144f37be940f0222f434d156e275
@@ -14740,8 +14876,8 @@ trackedFiles:
pristine_git_object: 89560b566073785535643e694c112bedbd3db13d
src/openrouter/images.py:
id: c4d7adf63ae0
- last_write_checksum: sha1:9eab422c5ae39039b24468a49c5b436956455df7
- pristine_git_object: 24e5d4cf2a091d39674763afe417c12bdb3b7518
+ last_write_checksum: sha1:8a6318b7628bcb6e6cc7791b34c2b538906ab5d3
+ pristine_git_object: 2edc66d821a3220612311e6fe920521da26400db
src/openrouter/models/__init__.py:
id: ed73b93abb3f
last_write_checksum: sha1:932a790ae66ccd7d7022b39c659bcf72a664ebea
@@ -15120,8 +15256,8 @@ trackedFiles:
pristine_git_object: 1dfdcafa35e010924f76a24ed007796e8ad40254
src/openrouter/operations/listbyokkeys.py:
id: b6dd42b3e05f
- last_write_checksum: sha1:e94980f4b9e3d114e8c21360232f23b0cd50e662
- pristine_git_object: 1f66e34523d69609a858a6e2acb6307f30de8846
+ last_write_checksum: sha1:a92b0a231dfc90d6a20198819bb6af38e06dd03c
+ pristine_git_object: 583673b233fef0d5178ba7c31d159c60f4afbb46
src/openrouter/operations/listcontainerfiles.py:
id: 7a30b9291c76
last_write_checksum: sha1:937c9fb30fd651d28793340285b3389518b26d96
@@ -20068,3 +20204,4 @@ examples:
"500":
application/json: {"error": {"code": 500, "message": "Internal Server Error"}}
examplesVersion: 1.0.2
+releaseNotes: "## Python SDK Changes:\n* `open_router.batch.create_batches()`: \n * `request.provider.only[].union(ProviderName).enum(river)` **Added**\n * `response.results[].response.body.union(OpenResponsesResult)` **Changed** (Breaking ⚠️)\n* `open_router.presets.create_presets_responses()`: `request` **Changed** (Breaking ⚠️)\n* `open_router.batch.get_batches()`: `response.results[].response.body.union(OpenResponsesResult)` **Changed** (Breaking ⚠️)\n* `open_router.embeddings.generate()`: `request.provider` **Changed**\n* `open_router.endpoints.list()`: `response.data.endpoints[].provider_name.enum(river)` **Added**\n* `open_router.tts.create_speech()`: `request.provider` **Changed**\n* `open_router.byok.list()`: \n * `request.provider` **Changed**\n * `response.data[].provider.enum(river)` **Added**\n* `open_router.byok.create()`: \n * `request.provider.enum(river)` **Added**\n * `response.data.provider.enum(river)` **Added**\n* `open_router.byok.get()`: `response.data.provider.enum(river)` **Added**\n* `open_router.byok.update()`: `response.data.provider.enum(river)` **Added**\n* `open_router.alpha.decisions.create()`: `request` **Changed**\n* `open_router.endpoints.list_zdr_endpoints()`: `response.data[].provider_name.enum(river)` **Added**\n* `open_router.stt.create_transcription()`: `request.provider` **Changed**\n* `open_router.generations.get_generation()`: `response.data.provider_responses[].provider_name.enum(river)` **Added**\n* `open_router.presets.create_presets_chat_completions()`: `request.provider` **Changed**\n* `open_router.presets.create_presets_messages()`: `request.provider` **Changed**\n* `open_router.alpha.extractions.create()`: `request.provider` **Changed**\n* `open_router.rerank.rerank()`: `request.provider` **Changed**\n* `open_router.system_one.create()`: `request` **Changed**\n* `open_router.video_generation.generate()`: `request.provider` **Changed**\n* `open_router.workspaces.create()`: \n * `request.disabled_server_tools[].enum(openrouter:mcp)` **Added**\n* `open_router.workspaces.update()`: \n * `request.disabled_server_tools[].enum(openrouter:mcp)` **Added**\n"
diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml
index ae72f9a97..a6582b491 100644
--- a/.speakeasy/gen.yaml
+++ b/.speakeasy/gen.yaml
@@ -37,7 +37,7 @@ generation:
documentation: mintlify
preApplyUnionDiscriminators: true
python:
- version: 1.3.129
+ version: 1.3.130
additionalDependencies:
dev:
pytest: '>=8.3'
diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml
index b4d40e6c3..778e279a1 100644
--- a/.speakeasy/out.openapi.yaml
+++ b/.speakeasy/out.openapi.yaml
@@ -276,6 +276,7 @@ components:
required:
- 'type'
type: 'object'
+ - $ref: '#/components/schemas/McpServerTool_OpenRouter'
type: 'array'
type:
enum:
@@ -677,6 +678,9 @@ components:
file_search_call: '#/components/schemas/OutputItemFileSearchCall'
function_call: '#/components/schemas/OutputItemFunctionCall'
image_generation_call: '#/components/schemas/OutputItemImageGenerationCall'
+ mcp_approval_request: '#/components/schemas/OutputItemMcpApprovalRequest'
+ mcp_call: '#/components/schemas/OutputItemMcpCall'
+ mcp_list_tools: '#/components/schemas/OutputItemMcpListTools'
message: '#/components/schemas/OutputMessage'
reasoning: '#/components/schemas/OutputItemReasoning'
web_search_call: '#/components/schemas/OutputItemWebSearchCall'
@@ -692,6 +696,9 @@ components:
- $ref: '#/components/schemas/OutputItemApplyPatchCall'
- $ref: '#/components/schemas/OutputItemCodeInterpreterCall'
- $ref: '#/components/schemas/OutputItemCompaction'
+ - $ref: '#/components/schemas/OutputItemMcpListTools'
+ - $ref: '#/components/schemas/OutputItemMcpCall'
+ - $ref: '#/components/schemas/OutputItemMcpApprovalRequest'
type: 'array'
AlignmentRule:
additionalProperties: false
@@ -4876,6 +4883,9 @@ components:
file_search_call: '#/components/schemas/OutputItemFileSearchCall'
function_call: '#/components/schemas/OutputItemFunctionCall'
image_generation_call: '#/components/schemas/OutputItemImageGenerationCall'
+ mcp_approval_request: '#/components/schemas/OutputItemMcpApprovalRequest'
+ mcp_call: '#/components/schemas/OutputItemMcpCall'
+ mcp_list_tools: '#/components/schemas/OutputItemMcpListTools'
message: '#/components/schemas/OutputMessage'
reasoning: '#/components/schemas/OutputItemReasoning'
web_search_call: '#/components/schemas/OutputItemWebSearchCall'
@@ -4891,6 +4901,9 @@ components:
- $ref: '#/components/schemas/OutputItemApplyPatchCall'
- $ref: '#/components/schemas/OutputItemCodeInterpreterCall'
- $ref: '#/components/schemas/OutputItemCompaction'
+ - $ref: '#/components/schemas/OutputItemMcpListTools'
+ - $ref: '#/components/schemas/OutputItemMcpCall'
+ - $ref: '#/components/schemas/OutputItemMcpApprovalRequest'
type: 'array'
output_text:
type: 'string'
@@ -7130,6 +7143,7 @@ components:
- 'reka'
- 'relace'
- 'respan'
+ - 'river'
- 'runway'
- 'sail-research'
- 'sakana'
@@ -10681,6 +10695,7 @@ components:
- 'openrouter:datetime'
- 'openrouter:fusion'
- 'openrouter:image_generation'
+ - 'openrouter:mcp'
- 'openrouter:experimental__search_models'
- 'openrouter:shell'
- 'openrouter:subagent'
@@ -11133,6 +11148,7 @@ components:
type: 'object'
- items: {}
type: 'array'
+ - type: 'null'
description: 'A plain string, or a JSON object or array of structured guidance.'
type:
enum:
@@ -11140,7 +11156,6 @@ components:
type: 'string'
required:
- 'type'
- - 'instructions'
- 'criteria'
type: 'object'
DecisionsImageAsset:
@@ -11190,6 +11205,7 @@ components:
type: 'object'
- items: {}
type: 'array'
+ - type: 'null'
description: 'A plain string, or a JSON object or array of structured guidance.'
'true':
anyOf:
@@ -11198,10 +11214,8 @@ components:
type: 'object'
- items: {}
type: 'array'
+ - type: 'null'
description: 'A plain string, or a JSON object or array of structured guidance.'
- required:
- - 'true'
- - 'false'
type: 'object'
instructions:
anyOf:
@@ -11210,6 +11224,7 @@ components:
type: 'object'
- items: {}
type: 'array'
+ - type: 'null'
description: 'A plain string, or a JSON object or array of structured guidance.'
type:
enum:
@@ -11217,7 +11232,6 @@ components:
type: 'string'
required:
- 'type'
- - 'instructions'
type: 'object'
DecisionsRefusalAnswer:
description: 'The provider declined to answer this question; no value or probabilities are returned. Other questions in the same request can still have answers.'
@@ -11383,6 +11397,7 @@ components:
type: 'object'
- items: {}
type: 'array'
+ - type: 'null'
description: 'A plain string, or a JSON object or array of structured guidance.'
type:
enum:
@@ -11390,7 +11405,6 @@ components:
type: 'string'
required:
- 'type'
- - 'instructions'
- 'criteria'
type: 'object'
DecisionsUrlCitationAnnotation:
@@ -15473,7 +15487,7 @@ components:
type: 'string'
x-speakeasy-unknown-values: allow
frame_count:
- description: 'Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations (OpenAI gpt-image-2.6, generations only); ignored otherwise.'
+ description: 'Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations; each accepts its own range and rejects values outside it. Ignored otherwise.'
example: 8
type: 'integer'
frame_duration_ms:
@@ -17724,6 +17738,10 @@ components:
server_label: 'database-server'
type: 'mcp_call'
properties:
+ approval_request_id:
+ type:
+ - 'string'
+ - 'null'
arguments:
type: 'string'
error:
@@ -17738,6 +17756,15 @@ components:
- 'null'
server_label:
type: 'string'
+ status:
+ enum:
+ - 'in_progress'
+ - 'completed'
+ - 'incomplete'
+ - 'calling'
+ - 'failed'
+ type: 'string'
+ x-speakeasy-unknown-values: allow
type:
enum:
- 'mcp_call'
@@ -17913,6 +17940,7 @@ components:
- 'message'
type: 'object'
McpServerTool:
+ additionalProperties: {}
description: 'MCP (Model Context Protocol) tool configuration'
example:
server_label: 'my-server'
@@ -17924,7 +17952,8 @@ components:
- items:
type: 'string'
type: 'array'
- - properties:
+ - additionalProperties: {}
+ properties:
read_only:
type: 'boolean'
tool_names:
@@ -17936,17 +17965,7 @@ components:
authorization:
type: 'string'
connector_id:
- enum:
- - 'connector_dropbox'
- - 'connector_gmail'
- - 'connector_googlecalendar'
- - 'connector_googledrive'
- - 'connector_microsoftteams'
- - 'connector_outlookcalendar'
- - 'connector_outlookemail'
- - 'connector_sharepoint'
type: 'string'
- x-speakeasy-unknown-values: allow
headers:
additionalProperties:
type: 'string'
@@ -17955,16 +17974,23 @@ components:
- 'null'
require_approval:
anyOf:
- - properties:
+ - additionalProperties: {}
+ properties:
always:
+ additionalProperties: {}
properties:
+ read_only:
+ type: 'boolean'
tool_names:
items:
type: 'string'
type: 'array'
type: 'object'
never:
+ additionalProperties: {}
properties:
+ read_only:
+ type: 'boolean'
tool_names:
items:
type: 'string'
@@ -17992,6 +18018,106 @@ components:
- 'type'
- 'server_label'
type: 'object'
+ McpServerTool_OpenRouter:
+ description: 'OpenRouter built-in server tool: connects the model to a remote MCP server and runs its tools during the response'
+ example:
+ parameters:
+ server_label: 'huggingface'
+ server_url: 'https://huggingface.co/mcp'
+ type: 'openrouter:mcp'
+ properties:
+ parameters:
+ $ref: '#/components/schemas/McpServerToolParameters'
+ type:
+ enum:
+ - 'openrouter:mcp'
+ type: 'string'
+ required:
+ - 'type'
+ - 'parameters'
+ type: 'object'
+ McpServerToolParameters:
+ description: 'Configuration for a remote MCP server tool.'
+ example:
+ server_label: 'huggingface'
+ server_url: 'https://huggingface.co/mcp'
+ properties:
+ allowed_tools:
+ anyOf:
+ - items:
+ type: 'string'
+ type: 'array'
+ - additionalProperties: {}
+ properties:
+ read_only:
+ type: 'boolean'
+ tool_names:
+ items:
+ type: 'string'
+ type: 'array'
+ type: 'object'
+ - type: 'null'
+ description: 'Restrict the tools exposed to the model to this list or filter.'
+ authorization:
+ description: 'OAuth access token sent as the Authorization bearer to the server.'
+ type: 'string'
+ connector_id:
+ description: 'Provider-defined connector identifier, forwarded as written to providers that run MCP themselves.'
+ type: 'string'
+ headers:
+ additionalProperties:
+ type: 'string'
+ description: 'Extra headers sent on every request to the server.'
+ type:
+ - 'object'
+ - 'null'
+ require_approval:
+ anyOf:
+ - additionalProperties: {}
+ properties:
+ always:
+ additionalProperties: {}
+ properties:
+ read_only:
+ type: 'boolean'
+ tool_names:
+ items:
+ type: 'string'
+ type: 'array'
+ type: 'object'
+ never:
+ additionalProperties: {}
+ properties:
+ read_only:
+ type: 'boolean'
+ tool_names:
+ items:
+ type: 'string'
+ type: 'array'
+ type: 'object'
+ type: 'object'
+ - enum:
+ - 'always'
+ type: 'string'
+ - enum:
+ - 'never'
+ type: 'string'
+ - type: 'null'
+ description: 'Approval policy for tool calls. Defaults to always: a call that needs approval ends the response with an mcp_approval_request item, answered with an mcp_approval_response on the next request.'
+ server_description:
+ description: 'Extra context about the server, shown to the model.'
+ type: 'string'
+ server_label:
+ description: 'Label for this MCP server, used in mcp_list_tools and mcp_call items.'
+ example: 'huggingface'
+ type: 'string'
+ server_url:
+ description: 'URL of the remote MCP server (streamable HTTP).'
+ example: 'https://huggingface.co/mcp'
+ type: 'string'
+ required:
+ - 'server_label'
+ type: 'object'
McpToolCallError:
anyOf:
- type: 'string'
@@ -19557,6 +19683,7 @@ components:
- 'Reka'
- 'Relace'
- 'Respan'
+ - 'River'
- 'Sail Research'
- 'Sakana AI'
- 'SambaNova'
@@ -23831,6 +23958,7 @@ components:
required:
- 'type'
type: 'object'
+ - $ref: '#/components/schemas/ToolChoiceMcp'
example: 'auto'
OpenAIResponsesTruncation:
enum:
@@ -25374,6 +25502,9 @@ components:
file_search_call: '#/components/schemas/OutputItemFileSearchCall'
function_call: '#/components/schemas/OutputItemFunctionCall'
image_generation_call: '#/components/schemas/OutputItemImageGenerationCall'
+ mcp_approval_request: '#/components/schemas/OutputItemMcpApprovalRequest'
+ mcp_call: '#/components/schemas/OutputItemMcpCall'
+ mcp_list_tools: '#/components/schemas/OutputItemMcpListTools'
message: '#/components/schemas/OutputMessage'
reasoning: '#/components/schemas/OutputItemReasoning'
web_search_call: '#/components/schemas/OutputItemWebSearchCall'
@@ -25389,6 +25520,9 @@ components:
- $ref: '#/components/schemas/OutputItemApplyPatchCall'
- $ref: '#/components/schemas/OutputItemCodeInterpreterCall'
- $ref: '#/components/schemas/OutputItemCompaction'
+ - $ref: '#/components/schemas/OutputItemMcpListTools'
+ - $ref: '#/components/schemas/OutputItemMcpCall'
+ - $ref: '#/components/schemas/OutputItemMcpApprovalRequest'
output_index:
type: 'integer'
sequence_number:
@@ -25588,6 +25722,9 @@ components:
file_search_call: '#/components/schemas/OutputItemFileSearchCall'
function_call: '#/components/schemas/OutputItemFunctionCall'
image_generation_call: '#/components/schemas/OutputItemImageGenerationCall'
+ mcp_approval_request: '#/components/schemas/OutputItemMcpApprovalRequest'
+ mcp_call: '#/components/schemas/OutputItemMcpCall'
+ mcp_list_tools: '#/components/schemas/OutputItemMcpListTools'
message: '#/components/schemas/OutputMessage'
reasoning: '#/components/schemas/OutputItemReasoning'
web_search_call: '#/components/schemas/OutputItemWebSearchCall'
@@ -25603,6 +25740,9 @@ components:
- $ref: '#/components/schemas/OutputItemApplyPatchCall'
- $ref: '#/components/schemas/OutputItemCodeInterpreterCall'
- $ref: '#/components/schemas/OutputItemCompaction'
+ - $ref: '#/components/schemas/OutputItemMcpListTools'
+ - $ref: '#/components/schemas/OutputItemMcpCall'
+ - $ref: '#/components/schemas/OutputItemMcpApprovalRequest'
output_index:
type: 'integer'
sequence_number:
@@ -25713,6 +25853,144 @@ components:
- 'id'
- 'status'
type: 'object'
+ OutputItemMcpApprovalRequest:
+ properties:
+ arguments:
+ type: 'string'
+ id:
+ type: 'string'
+ name:
+ type: 'string'
+ server_label:
+ type: 'string'
+ type:
+ enum:
+ - 'mcp_approval_request'
+ type: 'string'
+ required:
+ - 'type'
+ - 'id'
+ - 'server_label'
+ - 'name'
+ - 'arguments'
+ type: 'object'
+ OutputItemMcpCall:
+ properties:
+ approval_request_id:
+ type:
+ - 'string'
+ - 'null'
+ arguments:
+ type: 'string'
+ error:
+ anyOf:
+ - type: 'string'
+ - properties:
+ code:
+ type: 'integer'
+ message:
+ type: 'string'
+ type:
+ enum:
+ - 'mcp_protocol_error'
+ type: 'string'
+ required:
+ - 'type'
+ - 'code'
+ - 'message'
+ type: 'object'
+ - properties:
+ content: {}
+ type:
+ enum:
+ - 'mcp_tool_execution_error'
+ type: 'string'
+ required:
+ - 'type'
+ type: 'object'
+ - properties:
+ code:
+ type: 'integer'
+ message:
+ type: 'string'
+ type:
+ enum:
+ - 'http_error'
+ type: 'string'
+ required:
+ - 'type'
+ - 'code'
+ - 'message'
+ type: 'object'
+ - type: 'null'
+ id:
+ type: 'string'
+ name:
+ type: 'string'
+ output:
+ type:
+ - 'string'
+ - 'null'
+ server_label:
+ type: 'string'
+ status:
+ enum:
+ - 'in_progress'
+ - 'completed'
+ - 'incomplete'
+ - 'calling'
+ - 'failed'
+ type: 'string'
+ x-speakeasy-unknown-values: allow
+ type:
+ enum:
+ - 'mcp_call'
+ type: 'string'
+ required:
+ - 'type'
+ - 'id'
+ - 'server_label'
+ - 'name'
+ - 'arguments'
+ type: 'object'
+ OutputItemMcpListTools:
+ properties:
+ error:
+ type:
+ - 'string'
+ - 'null'
+ id:
+ type: 'string'
+ server_label:
+ type: 'string'
+ tools:
+ items:
+ properties:
+ annotations: {}
+ description:
+ type:
+ - 'string'
+ - 'null'
+ input_schema:
+ additionalProperties: {}
+ type: 'object'
+ name:
+ type: 'string'
+ required:
+ - 'name'
+ - 'input_schema'
+ type: 'object'
+ type: 'array'
+ type:
+ enum:
+ - 'mcp_list_tools'
+ type: 'string'
+ required:
+ - 'type'
+ - 'id'
+ - 'server_label'
+ - 'tools'
+ type: 'object'
OutputItemReasoning:
example:
id: 'reasoning-abc123'
@@ -25767,6 +26045,7 @@ components:
file_search_call: '#/components/schemas/OutputFileSearchCallItem'
function_call: '#/components/schemas/OutputFunctionCallItem'
image_generation_call: '#/components/schemas/OutputImageGenerationCallItem'
+ mcp_approval_request: '#/components/schemas/McpApprovalRequestItem'
mcp_call: '#/components/schemas/McpCallItem'
mcp_list_tools: '#/components/schemas/McpListToolsItem'
message: '#/components/schemas/OutputMessageItem'
@@ -25831,6 +26110,7 @@ components:
- $ref: '#/components/schemas/OutputMemoryServerToolItem'
- $ref: '#/components/schemas/McpListToolsItem'
- $ref: '#/components/schemas/McpCallItem'
+ - $ref: '#/components/schemas/McpApprovalRequestItem'
- $ref: '#/components/schemas/OutputSearchModelsServerToolItem'
- $ref: '#/components/schemas/OutputFusionServerToolItem'
- $ref: '#/components/schemas/OutputAdvisorServerToolItem'
@@ -28154,6 +28434,7 @@ components:
- 'Reka'
- 'Relace'
- 'Respan'
+ - 'River'
- 'Sail Research'
- 'Sakana AI'
- 'SambaNova'
@@ -28553,6 +28834,9 @@ components:
respan:
additionalProperties: {}
type: 'object'
+ river:
+ additionalProperties: {}
+ type: 'object'
runway:
additionalProperties: {}
type: 'object'
@@ -28968,6 +29252,7 @@ components:
- 'Reka'
- 'Relace'
- 'Respan'
+ - 'River'
- 'Sail Research'
- 'Sakana AI'
- 'SambaNova'
@@ -30335,6 +30620,7 @@ components:
- $ref: '#/components/schemas/BashServerTool'
- $ref: '#/components/schemas/ShellServerTool_OpenRouter'
- $ref: '#/components/schemas/ToolSearchServerTool'
+ - $ref: '#/components/schemas/McpServerTool_OpenRouter'
type: 'array'
top_k:
type: 'integer'
@@ -33113,6 +33399,26 @@ components:
- 'mode'
- 'tools'
type: 'object'
+ ToolChoiceMcp:
+ description: 'Forces a call to the named MCP server; `name` narrows it to one of its tools'
+ example:
+ server_label: 'huggingface'
+ type: 'mcp'
+ properties:
+ name:
+ type:
+ - 'string'
+ - 'null'
+ server_label:
+ type: 'string'
+ type:
+ enum:
+ - 'mcp'
+ type: 'string'
+ required:
+ - 'type'
+ - 'server_label'
+ type: 'object'
ToolChoiceSupport:
description: 'Per-variant `tool_choice` support. `tool_choice` in `supported_parameters` only says the parameter is accepted; these flags say which of its values passed testing.'
example:
@@ -33302,6 +33608,7 @@ components:
required:
- 'type'
type: 'object'
+ - $ref: '#/components/schemas/McpServerTool_OpenRouter'
type: 'array'
type:
enum:
@@ -34727,6 +35034,7 @@ components:
- 'openrouter:datetime'
- 'openrouter:fusion'
- 'openrouter:image_generation'
+ - 'openrouter:mcp'
- 'openrouter:experimental__search_models'
- 'openrouter:shell'
- 'openrouter:subagent'
@@ -38305,18 +38613,6 @@ paths:
example: 100
format: 'double'
type: 'number'
- spawn_agent:
- description: 'Agent identifier for spawn telemetry'
- example: 'my-agent'
- type: 'string'
- x-fern-ignore: true
- x-speakeasy-ignore: true
- spawn_cloud:
- description: 'Cloud identifier for spawn telemetry'
- example: 'aws-us-east-1'
- type: 'string'
- x-fern-ignore: true
- x-speakeasy-ignore: true
usage_limit_type:
description: 'Optional credit limit reset interval. When set, the credit limit resets on this interval.'
enum:
@@ -39248,6 +39544,7 @@ paths:
- 'reka'
- 'relace'
- 'respan'
+ - 'river'
- 'runway'
- 'sail-research'
- 'sakana'
diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock
index 70cf4c254..d23cbb708 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:947a564a5e27eb4a3871e6358c714e9b8d1993f06f4c1019df56bf8851c2bd12
- sourceBlobDigest: sha256:f9eb30c1bd3667d87534aa6a661f7de3783298d340c6b631a959df9608245ce4
+ sourceRevisionDigest: sha256:b8a6513ddeed98e514428333774cd0a270d2bc0c1d8dec60630570f3b6d63e60
+ sourceBlobDigest: sha256:eb1b8ad92e68ea4281816bf53c517d6e04a715ce1cb369c7ddb98797443ad17c
tags:
- latest
- 1.0.0
@@ -11,10 +11,10 @@ targets:
open-router:
source: OpenRouter API
sourceNamespace: open-router-chat-completions-api
- sourceRevisionDigest: sha256:947a564a5e27eb4a3871e6358c714e9b8d1993f06f4c1019df56bf8851c2bd12
- sourceBlobDigest: sha256:f9eb30c1bd3667d87534aa6a661f7de3783298d340c6b631a959df9608245ce4
+ sourceRevisionDigest: sha256:b8a6513ddeed98e514428333774cd0a270d2bc0c1d8dec60630570f3b6d63e60
+ sourceBlobDigest: sha256:eb1b8ad92e68ea4281816bf53c517d6e04a715ce1cb369c7ddb98797443ad17c
codeSamplesNamespace: open-router-python-code-samples
- codeSamplesRevisionDigest: sha256:c4751683719fdbf1c7f6c08ea2cf2262525bc995be3f20cab7cdb7aa161c0065
+ codeSamplesRevisionDigest: sha256:517cbd26ae43cf9bdfcfd6328d3e4ecff384909acdc01250440cbfb0b237851e
workflow:
workflowVersion: 1.0.0
speakeasyVersion: 1.803.2
diff --git a/RELEASES.md b/RELEASES.md
index 3770cef28..91beeec41 100644
--- a/RELEASES.md
+++ b/RELEASES.md
@@ -4059,4 +4059,14 @@ Based on:
### Generated
- [python v1.3.129] .
### Releases
-- [PyPI v1.3.129] https://pypi.org/project/openrouter/1.3.129 - .
\ No newline at end of file
+- [PyPI v1.3.129] https://pypi.org/project/openrouter/1.3.129 - .
+
+## 2026-11-05 18:58:25
+### Changes
+Based on:
+- OpenAPI Doc
+- Speakeasy CLI 1.803.2 (2.950.13) https://github.com/speakeasy-api/speakeasy
+### Generated
+- [python v1.3.130] .
+### Releases
+- [PyPI v1.3.130] https://pypi.org/project/openrouter/1.3.130 - .
\ No newline at end of file
diff --git a/docs/components/additionaltoolsitemtoolunion.mdx b/docs/components/additionaltoolsitemtoolunion.mdx
index e3a111fa7..f96cb3641 100644
--- a/docs/components/additionaltoolsitemtoolunion.mdx
+++ b/docs/components/additionaltoolsitemtoolunion.mdx
@@ -178,3 +178,9 @@ value: components.ToolSearchServerTool = /* values here */
value: components.AdditionalToolsItemTool = /* values here */
```
+### `components.McpServerToolOpenRouter`
+
+```python
+value: components.McpServerToolOpenRouter = /* values here */
+```
+
diff --git a/docs/components/alignmentresponsesrejected.mdx b/docs/components/alignmentresponsesrejected.mdx
index 3db6e441d..b0c408ff3 100644
--- a/docs/components/alignmentresponsesrejected.mdx
+++ b/docs/components/alignmentresponsesrejected.mdx
@@ -46,6 +46,24 @@ value: components.OutputItemFunctionCall = /* values here */
value: components.OutputItemImageGenerationCall = /* values here */
```
+### `components.OutputItemMcpApprovalRequest`
+
+```python
+value: components.OutputItemMcpApprovalRequest = /* values here */
+```
+
+### `components.OutputItemMcpCall`
+
+```python
+value: components.OutputItemMcpCall = /* values here */
+```
+
+### `components.OutputItemMcpListTools`
+
+```python
+value: components.OutputItemMcpListTools = /* values here */
+```
+
### `components.OutputMessage`
```python
diff --git a/docs/components/allowedtools.mdx b/docs/components/allowedtools.mdx
deleted file mode 100644
index fa714f9e6..000000000
--- a/docs/components/allowedtools.mdx
+++ /dev/null
@@ -1,10 +0,0 @@
----
-title: "AllowedTools"
----
-
-## Fields
-
-| Field | Type | Required | Description |
-| ------------------ | ------------------ | ------------------ | ------------------ |
-| `read_only` | *Optional[bool]* | ➖ | N/A |
-| `tool_names` | List[*str*] | ➖ | N/A |
\ No newline at end of file
diff --git a/docs/components/allowedtoolsunion.mdx b/docs/components/allowedtoolsunion.mdx
deleted file mode 100644
index 4e6d37a0b..000000000
--- a/docs/components/allowedtoolsunion.mdx
+++ /dev/null
@@ -1,18 +0,0 @@
----
-title: "AllowedToolsUnion"
----
-
-## Supported Types
-
-### `List[str]`
-
-```python
-value: List[str] = /* values here */
-```
-
-### `components.AllowedTools`
-
-```python
-value: components.AllowedTools = /* values here */
-```
-
diff --git a/docs/components/always.mdx b/docs/components/always.mdx
deleted file mode 100644
index 7be3d5420..000000000
--- a/docs/components/always.mdx
+++ /dev/null
@@ -1,9 +0,0 @@
----
-title: "Always"
----
-
-## Fields
-
-| Field | Type | Required | Description |
-| ------------------ | ------------------ | ------------------ | ------------------ |
-| `tool_names` | List[*str*] | ➖ | N/A |
\ No newline at end of file
diff --git a/docs/components/byokproviderslug.mdx b/docs/components/byokproviderslug.mdx
index 5af0c44da..02af1d81e 100644
--- a/docs/components/byokproviderslug.mdx
+++ b/docs/components/byokproviderslug.mdx
@@ -114,6 +114,7 @@ This is an open enum. Unrecognized values will not fail type checks.
- `"reka"`
- `"relace"`
- `"respan"`
+- `"river"`
- `"runway"`
- `"sail-research"`
- `"sakana"`
diff --git a/docs/components/connectorid.mdx b/docs/components/connectorid.mdx
deleted file mode 100644
index 783b14bf8..000000000
--- a/docs/components/connectorid.mdx
+++ /dev/null
@@ -1,26 +0,0 @@
----
-title: "ConnectorID"
----
-
-## Example Usage
-
-```python
-from openrouter.components import ConnectorID
-
-# Open enum: unrecognized values are captured as UnrecognizedStr
-value: ConnectorID = "connector_dropbox"
-```
-
-
-## Values
-
-This is an open enum. Unrecognized values will not fail type checks.
-
-- `"connector_dropbox"`
-- `"connector_gmail"`
-- `"connector_googlecalendar"`
-- `"connector_googledrive"`
-- `"connector_microsoftteams"`
-- `"connector_outlookcalendar"`
-- `"connector_outlookemail"`
-- `"connector_sharepoint"`
diff --git a/docs/components/createworkspacerequestdisabledservertool.mdx b/docs/components/createworkspacerequestdisabledservertool.mdx
index 8156c97be..dfcb100dc 100644
--- a/docs/components/createworkspacerequestdisabledservertool.mdx
+++ b/docs/components/createworkspacerequestdisabledservertool.mdx
@@ -22,6 +22,7 @@ This is an open enum. Unrecognized values will not fail type checks.
- `"openrouter:datetime"`
- `"openrouter:fusion"`
- `"openrouter:image_generation"`
+- `"openrouter:mcp"`
- `"openrouter:experimental__search_models"`
- `"openrouter:shell"`
- `"openrouter:subagent"`
diff --git a/docs/components/decisionschoicequestion.mdx b/docs/components/decisionschoicequestion.mdx
index 587a9787c..3e16570e9 100644
--- a/docs/components/decisionschoicequestion.mdx
+++ b/docs/components/decisionschoicequestion.mdx
@@ -4,8 +4,8 @@ title: "DecisionsChoiceQuestion"
## Fields
-| Field | Type | Required | Description |
-| ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ |
-| `criteria` | Dict[str, [Nullable[components.Criteria]](../components/criteria.mdx)] | ✔️ | N/A |
-| `instructions` | [components.DecisionsChoiceQuestionInstructions](../components/decisionschoicequestioninstructions.mdx) | ✔️ | A plain string, or a JSON object or array of structured guidance. |
-| `type` | [components.DecisionsChoiceQuestionType](../components/decisionschoicequestiontype.mdx) | ✔️ | N/A |
\ No newline at end of file
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ |
+| `criteria` | Dict[str, [Nullable[components.Criteria]](../components/criteria.mdx)] | ✔️ | N/A |
+| `instructions` | [OptionalNullable[components.DecisionsChoiceQuestionInstructions]](../components/decisionschoicequestioninstructions.mdx) | ➖ | A plain string, or a JSON object or array of structured guidance. |
+| `type` | [components.DecisionsChoiceQuestionType](../components/decisionschoicequestiontype.mdx) | ✔️ | N/A |
\ No newline at end of file
diff --git a/docs/components/decisionsnoulquestion.mdx b/docs/components/decisionsnoulquestion.mdx
index f4b55ec9c..2cc5d5154 100644
--- a/docs/components/decisionsnoulquestion.mdx
+++ b/docs/components/decisionsnoulquestion.mdx
@@ -4,8 +4,8 @@ title: "DecisionsNoulQuestion"
## Fields
-| Field | Type | Required | Description |
-| ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
-| `criteria` | [Optional[components.DecisionsNoulQuestionCriteria]](../components/decisionsnoulquestioncriteria.mdx) | ➖ | N/A |
-| `instructions` | [components.DecisionsNoulQuestionInstructions](../components/decisionsnoulquestioninstructions.mdx) | ✔️ | A plain string, or a JSON object or array of structured guidance. |
-| `type` | [components.DecisionsNoulQuestionType](../components/decisionsnoulquestiontype.mdx) | ✔️ | N/A |
\ No newline at end of file
+| Field | Type | Required | Description |
+| -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
+| `criteria` | [Optional[components.DecisionsNoulQuestionCriteria]](../components/decisionsnoulquestioncriteria.mdx) | ➖ | N/A |
+| `instructions` | [OptionalNullable[components.DecisionsNoulQuestionInstructions]](../components/decisionsnoulquestioninstructions.mdx) | ➖ | A plain string, or a JSON object or array of structured guidance. |
+| `type` | [components.DecisionsNoulQuestionType](../components/decisionsnoulquestiontype.mdx) | ✔️ | N/A |
\ No newline at end of file
diff --git a/docs/components/decisionsnoulquestioncriteria.mdx b/docs/components/decisionsnoulquestioncriteria.mdx
index 8ee6c0191..bc7b3945f 100644
--- a/docs/components/decisionsnoulquestioncriteria.mdx
+++ b/docs/components/decisionsnoulquestioncriteria.mdx
@@ -6,5 +6,5 @@ title: "DecisionsNoulQuestionCriteria"
| Field | Type | Required | Description |
| ----------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- |
-| `false` | [components.FalseT](../components/falset.mdx) | ✔️ | A plain string, or a JSON object or array of structured guidance. |
-| `true` | [components.TrueT](../components/truet.mdx) | ✔️ | A plain string, or a JSON object or array of structured guidance. |
\ No newline at end of file
+| `false` | [OptionalNullable[components.FalseT]](../components/falset.mdx) | ➖ | A plain string, or a JSON object or array of structured guidance. |
+| `true` | [OptionalNullable[components.TrueT]](../components/truet.mdx) | ➖ | A plain string, or a JSON object or array of structured guidance. |
\ No newline at end of file
diff --git a/docs/components/decisionsscorequestion.mdx b/docs/components/decisionsscorequestion.mdx
index 6075af23f..7f1241371 100644
--- a/docs/components/decisionsscorequestion.mdx
+++ b/docs/components/decisionsscorequestion.mdx
@@ -4,8 +4,8 @@ title: "DecisionsScoreQuestion"
## Fields
-| Field | Type | Required | Description |
-| ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
-| `criteria` | List[[components.Criterion](../components/criterion.mdx)] | ✔️ | N/A |
-| `instructions` | [components.DecisionsScoreQuestionInstructions](../components/decisionsscorequestioninstructions.mdx) | ✔️ | A plain string, or a JSON object or array of structured guidance. |
-| `type` | [components.DecisionsScoreQuestionType](../components/decisionsscorequestiontype.mdx) | ✔️ | N/A |
\ No newline at end of file
+| Field | Type | Required | Description |
+| ---------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
+| `criteria` | List[[components.Criterion](../components/criterion.mdx)] | ✔️ | N/A |
+| `instructions` | [OptionalNullable[components.DecisionsScoreQuestionInstructions]](../components/decisionsscorequestioninstructions.mdx) | ➖ | A plain string, or a JSON object or array of structured guidance. |
+| `type` | [components.DecisionsScoreQuestionType](../components/decisionsscorequestiontype.mdx) | ✔️ | N/A |
\ No newline at end of file
diff --git a/docs/components/error.mdx b/docs/components/error.mdx
new file mode 100644
index 000000000..029044c02
--- /dev/null
+++ b/docs/components/error.mdx
@@ -0,0 +1,30 @@
+---
+title: "Error"
+---
+
+## Supported Types
+
+### `str`
+
+```python
+value: str = /* values here */
+```
+
+### `components.ErrorMcpProtocolError`
+
+```python
+value: components.ErrorMcpProtocolError = /* values here */
+```
+
+### `components.ErrorMcpToolExecutionError`
+
+```python
+value: components.ErrorMcpToolExecutionError = /* values here */
+```
+
+### `components.ErrorHTTPError`
+
+```python
+value: components.ErrorHTTPError = /* values here */
+```
+
diff --git a/docs/components/errorhttperror.mdx b/docs/components/errorhttperror.mdx
new file mode 100644
index 000000000..0530bbf23
--- /dev/null
+++ b/docs/components/errorhttperror.mdx
@@ -0,0 +1,11 @@
+---
+title: "ErrorHTTPError"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- |
+| `code` | *int* | ✔️ | N/A |
+| `message` | *str* | ✔️ | N/A |
+| `type` | [components.ErrorTypeHTTPError](../components/errortypehttperror.mdx) | ✔️ | N/A |
\ No newline at end of file
diff --git a/docs/components/errormcpprotocolerror.mdx b/docs/components/errormcpprotocolerror.mdx
new file mode 100644
index 000000000..bf20bf186
--- /dev/null
+++ b/docs/components/errormcpprotocolerror.mdx
@@ -0,0 +1,11 @@
+---
+title: "ErrorMcpProtocolError"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
+| `code` | *int* | ✔️ | N/A |
+| `message` | *str* | ✔️ | N/A |
+| `type` | [components.ErrorTypeMcpProtocolError](../components/errortypemcpprotocolerror.mdx) | ✔️ | N/A |
\ No newline at end of file
diff --git a/docs/components/errormcptoolexecutionerror.mdx b/docs/components/errormcptoolexecutionerror.mdx
new file mode 100644
index 000000000..69555454d
--- /dev/null
+++ b/docs/components/errormcptoolexecutionerror.mdx
@@ -0,0 +1,10 @@
+---
+title: "ErrorMcpToolExecutionError"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
+| `content` | *Optional[Any]* | ➖ | N/A |
+| `type` | [components.ErrorTypeMcpToolExecutionError](../components/errortypemcptoolexecutionerror.mdx) | ✔️ | N/A |
\ No newline at end of file
diff --git a/docs/components/errortypehttperror.mdx b/docs/components/errortypehttperror.mdx
new file mode 100644
index 000000000..e4a218e1d
--- /dev/null
+++ b/docs/components/errortypehttperror.mdx
@@ -0,0 +1,15 @@
+---
+title: "ErrorTypeHTTPError"
+---
+
+## Example Usage
+
+```python
+from openrouter.components import ErrorTypeHTTPError
+value: ErrorTypeHTTPError = "http_error"
+```
+
+
+## Values
+
+- `"http_error"`
diff --git a/docs/components/errortypemcpprotocolerror.mdx b/docs/components/errortypemcpprotocolerror.mdx
new file mode 100644
index 000000000..3db06ca2b
--- /dev/null
+++ b/docs/components/errortypemcpprotocolerror.mdx
@@ -0,0 +1,15 @@
+---
+title: "ErrorTypeMcpProtocolError"
+---
+
+## Example Usage
+
+```python
+from openrouter.components import ErrorTypeMcpProtocolError
+value: ErrorTypeMcpProtocolError = "mcp_protocol_error"
+```
+
+
+## Values
+
+- `"mcp_protocol_error"`
diff --git a/docs/components/errortypemcptoolexecutionerror.mdx b/docs/components/errortypemcptoolexecutionerror.mdx
new file mode 100644
index 000000000..29d30d239
--- /dev/null
+++ b/docs/components/errortypemcptoolexecutionerror.mdx
@@ -0,0 +1,15 @@
+---
+title: "ErrorTypeMcpToolExecutionError"
+---
+
+## Example Usage
+
+```python
+from openrouter.components import ErrorTypeMcpToolExecutionError
+value: ErrorTypeMcpToolExecutionError = "mcp_tool_execution_error"
+```
+
+
+## Values
+
+- `"mcp_tool_execution_error"`
diff --git a/docs/components/imagegenerationproviderpreferencesoptions.mdx b/docs/components/imagegenerationproviderpreferencesoptions.mdx
index d4259dfa6..467d2922f 100644
--- a/docs/components/imagegenerationproviderpreferencesoptions.mdx
+++ b/docs/components/imagegenerationproviderpreferencesoptions.mdx
@@ -130,6 +130,7 @@ Provider-specific options keyed by provider slug. The provider segment is case-i
| `relace` | Dict[str, *Any*] | ➖ | N/A |
| `replicate` | Dict[str, *Any*] | ➖ | N/A |
| `respan` | Dict[str, *Any*] | ➖ | N/A |
+| `river` | Dict[str, *Any*] | ➖ | N/A |
| `runway` | Dict[str, *Any*] | ➖ | N/A |
| `sail_research` | Dict[str, *Any*] | ➖ | N/A |
| `sakana` | Dict[str, *Any*] | ➖ | N/A |
diff --git a/docs/components/imagegenerationrequest.mdx b/docs/components/imagegenerationrequest.mdx
index 39e874314..2800926d2 100644
--- a/docs/components/imagegenerationrequest.mdx
+++ b/docs/components/imagegenerationrequest.mdx
@@ -11,7 +11,7 @@ Image generation request input
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `aspect_ratio` | [Optional[components.ImageGenerationRequestAspectRatio]](../components/imagegenerationrequestaspectratio.mdx) | ➖ | Normalized aspect ratio of the generated image. Providers clamp to their supported subset. | 16:9 |
| `background` | [Optional[components.ImageGenerationRequestBackground]](../components/imagegenerationrequestbackground.mdx) | ➖ | Background treatment. `transparent` requires an output_format that supports alpha (png or webp). | auto |
-| `frame_count` | *Optional[int]* | ➖ | Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations (OpenAI gpt-image-2.6, generations only); ignored otherwise. | 8 |
+| `frame_count` | *Optional[int]* | ➖ | Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations; each accepts its own range and rejects values outside it. Ignored otherwise. | 8 |
| `frame_duration_ms` | *Optional[int]* | ➖ | Display time of each animation frame in milliseconds (20-2000) when `output_format` is `gif`. Ignored by models that do not produce animations. | 100 |
| `input_references` | List[[components.ContentPartImage](../components/contentpartimage.mdx)] | ➖ | Reference images to guide image-to-image generation, as base64 data URLs or HTTP(S) URLs. | |
| `markup` | [Optional[components.Markup]](../components/markup.mdx) | ➖ | A transparent PNG overlay (arrows, circles, annotations) with the same dimensions as the first reference image, as a base64 data URL or HTTP(S) URL, guiding where an edit applies. Image-to-image requests only; honored by models with markup-guided editing (OpenAI gpt-image-2.6) and ignored otherwise. | \{
"image_url": \{
"url": "https://example.com/image.png"
},
"type": "image_url"
} |
diff --git a/docs/components/mcpcallitem.mdx b/docs/components/mcpcallitem.mdx
index 5dd0d3596..e0e8711b2 100644
--- a/docs/components/mcpcallitem.mdx
+++ b/docs/components/mcpcallitem.mdx
@@ -9,10 +9,12 @@ An MCP tool call with its output or error
| Field | Type | Required | Description | Example |
| ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
+| `approval_request_id` | *OptionalNullable[str]* | ➖ | N/A | |
| `arguments` | *str* | ✔️ | N/A | |
| `error` | [OptionalNullable[components.McpToolCallError]](../components/mcptoolcallerror.mdx) | ➖ | Error from an MCP tool call, either a plain message or a structured error | \{
"code": 503,
"message": "Service Unavailable",
"type": "http_error"
} |
| `id` | *str* | ✔️ | N/A | |
| `name` | *str* | ✔️ | N/A | |
| `output` | *OptionalNullable[str]* | ➖ | N/A | |
| `server_label` | *str* | ✔️ | N/A | |
+| `status` | [Optional[components.McpCallItemStatus]](../components/mcpcallitemstatus.mdx) | ➖ | N/A | |
| `type` | [components.McpCallItemType](../components/mcpcallitemtype.mdx) | ✔️ | N/A | |
\ No newline at end of file
diff --git a/docs/components/mcpcallitemstatus.mdx b/docs/components/mcpcallitemstatus.mdx
new file mode 100644
index 000000000..aa46c1cd1
--- /dev/null
+++ b/docs/components/mcpcallitemstatus.mdx
@@ -0,0 +1,23 @@
+---
+title: "McpCallItemStatus"
+---
+
+## Example Usage
+
+```python
+from openrouter.components import McpCallItemStatus
+
+# Open enum: unrecognized values are captured as UnrecognizedStr
+value: McpCallItemStatus = "in_progress"
+```
+
+
+## Values
+
+This is an open enum. Unrecognized values will not fail type checks.
+
+- `"in_progress"`
+- `"completed"`
+- `"incomplete"`
+- `"calling"`
+- `"failed"`
diff --git a/docs/components/mcpservertool.mdx b/docs/components/mcpservertool.mdx
index d3113d69f..75f8ede09 100644
--- a/docs/components/mcpservertool.mdx
+++ b/docs/components/mcpservertool.mdx
@@ -7,14 +7,15 @@ MCP (Model Context Protocol) tool configuration
## Fields
-| Field | Type | Required | Description |
-| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ |
-| `allowed_tools` | [OptionalNullable[components.AllowedToolsUnion]](../components/allowedtoolsunion.mdx) | ➖ | N/A |
-| `authorization` | *Optional[str]* | ➖ | N/A |
-| `connector_id` | [Optional[components.ConnectorID]](../components/connectorid.mdx) | ➖ | N/A |
-| `headers` | Dict[str, *str*] | ➖ | N/A |
-| `require_approval` | [OptionalNullable[components.RequireApprovalUnion]](../components/requireapprovalunion.mdx) | ➖ | N/A |
-| `server_description` | *Optional[str]* | ➖ | N/A |
-| `server_label` | *str* | ✔️ | N/A |
-| `server_url` | *Optional[str]* | ➖ | N/A |
-| `type` | [components.McpServerToolType](../components/mcpservertooltype.mdx) | ✔️ | N/A |
\ No newline at end of file
+| Field | Type | Required | Description | Example |
+| -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
+| `allowed_tools` | [OptionalNullable[components.McpServerToolAllowedToolsUnion]](../components/mcpservertoolallowedtoolsunion.mdx) | ➖ | N/A | |
+| `authorization` | *Optional[str]* | ➖ | N/A | |
+| `connector_id` | *Optional[str]* | ➖ | N/A | |
+| `headers` | Dict[str, *str*] | ➖ | N/A | |
+| `require_approval` | [OptionalNullable[components.McpServerToolRequireApprovalUnion]](../components/mcpservertoolrequireapprovalunion.mdx) | ➖ | N/A | |
+| `server_description` | *Optional[str]* | ➖ | N/A | |
+| `server_label` | *str* | ✔️ | N/A | |
+| `server_url` | *Optional[str]* | ➖ | N/A | |
+| `type` | [components.McpServerToolType](../components/mcpservertooltype.mdx) | ✔️ | N/A | |
+| `__pydantic_extra__` | Dict[str, *Any*] | ➖ | N/A | \{
"server_label": "my-server",
"server_url": "https://example.com/mcp",
"type": "mcp"
} |
\ No newline at end of file
diff --git a/docs/components/mcpservertoolallowedtools.mdx b/docs/components/mcpservertoolallowedtools.mdx
new file mode 100644
index 000000000..7affd7625
--- /dev/null
+++ b/docs/components/mcpservertoolallowedtools.mdx
@@ -0,0 +1,11 @@
+---
+title: "McpServerToolAllowedTools"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| -------------------- | -------------------- | -------------------- | -------------------- |
+| `read_only` | *Optional[bool]* | ➖ | N/A |
+| `tool_names` | List[*str*] | ➖ | N/A |
+| `__pydantic_extra__` | Dict[str, *Any*] | ➖ | N/A |
\ No newline at end of file
diff --git a/docs/components/mcpservertoolallowedtoolsunion.mdx b/docs/components/mcpservertoolallowedtoolsunion.mdx
new file mode 100644
index 000000000..9dc3c5cbd
--- /dev/null
+++ b/docs/components/mcpservertoolallowedtoolsunion.mdx
@@ -0,0 +1,18 @@
+---
+title: "McpServerToolAllowedToolsUnion"
+---
+
+## Supported Types
+
+### `List[str]`
+
+```python
+value: List[str] = /* values here */
+```
+
+### `components.McpServerToolAllowedTools`
+
+```python
+value: components.McpServerToolAllowedTools = /* values here */
+```
+
diff --git a/docs/components/mcpservertoolalways.mdx b/docs/components/mcpservertoolalways.mdx
new file mode 100644
index 000000000..aca487315
--- /dev/null
+++ b/docs/components/mcpservertoolalways.mdx
@@ -0,0 +1,11 @@
+---
+title: "McpServerToolAlways"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| -------------------- | -------------------- | -------------------- | -------------------- |
+| `read_only` | *Optional[bool]* | ➖ | N/A |
+| `tool_names` | List[*str*] | ➖ | N/A |
+| `__pydantic_extra__` | Dict[str, *Any*] | ➖ | N/A |
\ No newline at end of file
diff --git a/docs/components/mcpservertoolnever.mdx b/docs/components/mcpservertoolnever.mdx
new file mode 100644
index 000000000..777915677
--- /dev/null
+++ b/docs/components/mcpservertoolnever.mdx
@@ -0,0 +1,11 @@
+---
+title: "McpServerToolNever"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| -------------------- | -------------------- | -------------------- | -------------------- |
+| `read_only` | *Optional[bool]* | ➖ | N/A |
+| `tool_names` | List[*str*] | ➖ | N/A |
+| `__pydantic_extra__` | Dict[str, *Any*] | ➖ | N/A |
\ No newline at end of file
diff --git a/docs/components/mcpservertoolopenrouter.mdx b/docs/components/mcpservertoolopenrouter.mdx
new file mode 100644
index 000000000..ce7b77bc1
--- /dev/null
+++ b/docs/components/mcpservertoolopenrouter.mdx
@@ -0,0 +1,13 @@
+---
+title: "McpServerToolOpenRouter"
+---
+
+OpenRouter built-in server tool: connects the model to a remote MCP server and runs its tools during the response
+
+
+## Fields
+
+| Field | Type | Required | Description | Example |
+| -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
+| `parameters` | [components.McpServerToolParameters](../components/mcpservertoolparameters.mdx) | ✔️ | Configuration for a remote MCP server tool. | \{
"server_label": "huggingface",
"server_url": "https://huggingface.co/mcp"
} |
+| `type` | [components.McpServerToolOpenRouterType](../components/mcpservertoolopenroutertype.mdx) | ✔️ | N/A | |
\ No newline at end of file
diff --git a/docs/components/mcpservertoolopenroutertype.mdx b/docs/components/mcpservertoolopenroutertype.mdx
new file mode 100644
index 000000000..f656dfe85
--- /dev/null
+++ b/docs/components/mcpservertoolopenroutertype.mdx
@@ -0,0 +1,15 @@
+---
+title: "McpServerToolOpenRouterType"
+---
+
+## Example Usage
+
+```python
+from openrouter.components import McpServerToolOpenRouterType
+value: McpServerToolOpenRouterType = "openrouter:mcp"
+```
+
+
+## Values
+
+- `"openrouter:mcp"`
diff --git a/docs/components/mcpservertoolparameters.mdx b/docs/components/mcpservertoolparameters.mdx
new file mode 100644
index 000000000..e484a9c07
--- /dev/null
+++ b/docs/components/mcpservertoolparameters.mdx
@@ -0,0 +1,19 @@
+---
+title: "McpServerToolParameters"
+---
+
+Configuration for a remote MCP server tool.
+
+
+## Fields
+
+| Field | Type | Required | Description | Example |
+| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `allowed_tools` | [OptionalNullable[components.McpServerToolParametersAllowedToolsUnion]](../components/mcpservertoolparametersallowedtoolsunion.mdx) | ➖ | Restrict the tools exposed to the model to this list or filter. | |
+| `authorization` | *Optional[str]* | ➖ | OAuth access token sent as the Authorization bearer to the server. | |
+| `connector_id` | *Optional[str]* | ➖ | Provider-defined connector identifier, forwarded as written to providers that run MCP themselves. | |
+| `headers` | Dict[str, *str*] | ➖ | Extra headers sent on every request to the server. | |
+| `require_approval` | [OptionalNullable[components.McpServerToolParametersRequireApprovalUnion]](../components/mcpservertoolparametersrequireapprovalunion.mdx) | ➖ | Approval policy for tool calls. Defaults to always: a call that needs approval ends the response with an mcp_approval_request item, answered with an mcp_approval_response on the next request. | |
+| `server_description` | *Optional[str]* | ➖ | Extra context about the server, shown to the model. | |
+| `server_label` | *str* | ✔️ | Label for this MCP server, used in mcp_list_tools and mcp_call items. | huggingface |
+| `server_url` | *Optional[str]* | ➖ | URL of the remote MCP server (streamable HTTP). | https://huggingface.co/mcp |
\ No newline at end of file
diff --git a/docs/components/mcpservertoolparametersallowedtools.mdx b/docs/components/mcpservertoolparametersallowedtools.mdx
new file mode 100644
index 000000000..b2ea1a8f2
--- /dev/null
+++ b/docs/components/mcpservertoolparametersallowedtools.mdx
@@ -0,0 +1,11 @@
+---
+title: "McpServerToolParametersAllowedTools"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| -------------------- | -------------------- | -------------------- | -------------------- |
+| `read_only` | *Optional[bool]* | ➖ | N/A |
+| `tool_names` | List[*str*] | ➖ | N/A |
+| `__pydantic_extra__` | Dict[str, *Any*] | ➖ | N/A |
\ No newline at end of file
diff --git a/docs/components/mcpservertoolparametersallowedtoolsunion.mdx b/docs/components/mcpservertoolparametersallowedtoolsunion.mdx
new file mode 100644
index 000000000..674215e1c
--- /dev/null
+++ b/docs/components/mcpservertoolparametersallowedtoolsunion.mdx
@@ -0,0 +1,21 @@
+---
+title: "McpServerToolParametersAllowedToolsUnion"
+---
+
+Restrict the tools exposed to the model to this list or filter.
+
+
+## Supported Types
+
+### `List[str]`
+
+```python
+value: List[str] = /* values here */
+```
+
+### `components.McpServerToolParametersAllowedTools`
+
+```python
+value: components.McpServerToolParametersAllowedTools = /* values here */
+```
+
diff --git a/docs/components/mcpservertoolparametersalways.mdx b/docs/components/mcpservertoolparametersalways.mdx
new file mode 100644
index 000000000..5459a41c2
--- /dev/null
+++ b/docs/components/mcpservertoolparametersalways.mdx
@@ -0,0 +1,11 @@
+---
+title: "McpServerToolParametersAlways"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| -------------------- | -------------------- | -------------------- | -------------------- |
+| `read_only` | *Optional[bool]* | ➖ | N/A |
+| `tool_names` | List[*str*] | ➖ | N/A |
+| `__pydantic_extra__` | Dict[str, *Any*] | ➖ | N/A |
\ No newline at end of file
diff --git a/docs/components/mcpservertoolparametersnever.mdx b/docs/components/mcpservertoolparametersnever.mdx
new file mode 100644
index 000000000..6085502b9
--- /dev/null
+++ b/docs/components/mcpservertoolparametersnever.mdx
@@ -0,0 +1,11 @@
+---
+title: "McpServerToolParametersNever"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| -------------------- | -------------------- | -------------------- | -------------------- |
+| `read_only` | *Optional[bool]* | ➖ | N/A |
+| `tool_names` | List[*str*] | ➖ | N/A |
+| `__pydantic_extra__` | Dict[str, *Any*] | ➖ | N/A |
\ No newline at end of file
diff --git a/docs/components/mcpservertoolparametersrequireapproval.mdx b/docs/components/mcpservertoolparametersrequireapproval.mdx
new file mode 100644
index 000000000..3015d27bb
--- /dev/null
+++ b/docs/components/mcpservertoolparametersrequireapproval.mdx
@@ -0,0 +1,11 @@
+---
+title: "McpServerToolParametersRequireApproval"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
+| `always` | [Optional[components.McpServerToolParametersAlways]](../components/mcpservertoolparametersalways.mdx) | ➖ | N/A |
+| `never` | [Optional[components.McpServerToolParametersNever]](../components/mcpservertoolparametersnever.mdx) | ➖ | N/A |
+| `__pydantic_extra__` | Dict[str, *Any*] | ➖ | N/A |
\ No newline at end of file
diff --git a/docs/components/mcpservertoolparametersrequireapprovalalways.mdx b/docs/components/mcpservertoolparametersrequireapprovalalways.mdx
new file mode 100644
index 000000000..01145255a
--- /dev/null
+++ b/docs/components/mcpservertoolparametersrequireapprovalalways.mdx
@@ -0,0 +1,15 @@
+---
+title: "McpServerToolParametersRequireApprovalAlways"
+---
+
+## Example Usage
+
+```python
+from openrouter.components import McpServerToolParametersRequireApprovalAlways
+value: McpServerToolParametersRequireApprovalAlways = "always"
+```
+
+
+## Values
+
+- `"always"`
diff --git a/docs/components/mcpservertoolparametersrequireapprovalnever.mdx b/docs/components/mcpservertoolparametersrequireapprovalnever.mdx
new file mode 100644
index 000000000..d73202ad8
--- /dev/null
+++ b/docs/components/mcpservertoolparametersrequireapprovalnever.mdx
@@ -0,0 +1,15 @@
+---
+title: "McpServerToolParametersRequireApprovalNever"
+---
+
+## Example Usage
+
+```python
+from openrouter.components import McpServerToolParametersRequireApprovalNever
+value: McpServerToolParametersRequireApprovalNever = "never"
+```
+
+
+## Values
+
+- `"never"`
diff --git a/docs/components/mcpservertoolparametersrequireapprovalunion.mdx b/docs/components/mcpservertoolparametersrequireapprovalunion.mdx
new file mode 100644
index 000000000..27181c10e
--- /dev/null
+++ b/docs/components/mcpservertoolparametersrequireapprovalunion.mdx
@@ -0,0 +1,27 @@
+---
+title: "McpServerToolParametersRequireApprovalUnion"
+---
+
+Approval policy for tool calls. Defaults to always: a call that needs approval ends the response with an mcp_approval_request item, answered with an mcp_approval_response on the next request.
+
+
+## Supported Types
+
+### `components.McpServerToolParametersRequireApproval`
+
+```python
+value: components.McpServerToolParametersRequireApproval = /* values here */
+```
+
+### `components.McpServerToolParametersRequireApprovalAlways`
+
+```python
+value: components.McpServerToolParametersRequireApprovalAlways = /* values here */
+```
+
+### `components.McpServerToolParametersRequireApprovalNever`
+
+```python
+value: components.McpServerToolParametersRequireApprovalNever = /* values here */
+```
+
diff --git a/docs/components/mcpservertoolrequireapproval.mdx b/docs/components/mcpservertoolrequireapproval.mdx
new file mode 100644
index 000000000..5b5b193f1
--- /dev/null
+++ b/docs/components/mcpservertoolrequireapproval.mdx
@@ -0,0 +1,11 @@
+---
+title: "McpServerToolRequireApproval"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
+| `always` | [Optional[components.McpServerToolAlways]](../components/mcpservertoolalways.mdx) | ➖ | N/A |
+| `never` | [Optional[components.McpServerToolNever]](../components/mcpservertoolnever.mdx) | ➖ | N/A |
+| `__pydantic_extra__` | Dict[str, *Any*] | ➖ | N/A |
\ No newline at end of file
diff --git a/docs/components/mcpservertoolrequireapprovalalways.mdx b/docs/components/mcpservertoolrequireapprovalalways.mdx
new file mode 100644
index 000000000..bdb891eb8
--- /dev/null
+++ b/docs/components/mcpservertoolrequireapprovalalways.mdx
@@ -0,0 +1,15 @@
+---
+title: "McpServerToolRequireApprovalAlways"
+---
+
+## Example Usage
+
+```python
+from openrouter.components import McpServerToolRequireApprovalAlways
+value: McpServerToolRequireApprovalAlways = "always"
+```
+
+
+## Values
+
+- `"always"`
diff --git a/docs/components/mcpservertoolrequireapprovalnever.mdx b/docs/components/mcpservertoolrequireapprovalnever.mdx
new file mode 100644
index 000000000..33daff15a
--- /dev/null
+++ b/docs/components/mcpservertoolrequireapprovalnever.mdx
@@ -0,0 +1,15 @@
+---
+title: "McpServerToolRequireApprovalNever"
+---
+
+## Example Usage
+
+```python
+from openrouter.components import McpServerToolRequireApprovalNever
+value: McpServerToolRequireApprovalNever = "never"
+```
+
+
+## Values
+
+- `"never"`
diff --git a/docs/components/mcpservertoolrequireapprovalunion.mdx b/docs/components/mcpservertoolrequireapprovalunion.mdx
new file mode 100644
index 000000000..f0b645fe3
--- /dev/null
+++ b/docs/components/mcpservertoolrequireapprovalunion.mdx
@@ -0,0 +1,24 @@
+---
+title: "McpServerToolRequireApprovalUnion"
+---
+
+## Supported Types
+
+### `components.McpServerToolRequireApproval`
+
+```python
+value: components.McpServerToolRequireApproval = /* values here */
+```
+
+### `components.McpServerToolRequireApprovalAlways`
+
+```python
+value: components.McpServerToolRequireApprovalAlways = /* values here */
+```
+
+### `components.McpServerToolRequireApprovalNever`
+
+```python
+value: components.McpServerToolRequireApprovalNever = /* values here */
+```
+
diff --git a/docs/components/never.mdx b/docs/components/never.mdx
deleted file mode 100644
index 41a96792c..000000000
--- a/docs/components/never.mdx
+++ /dev/null
@@ -1,9 +0,0 @@
----
-title: "Never"
----
-
-## Fields
-
-| Field | Type | Required | Description |
-| ------------------ | ------------------ | ------------------ | ------------------ |
-| `tool_names` | List[*str*] | ➖ | N/A |
\ No newline at end of file
diff --git a/docs/components/openairesponsestoolchoiceunion.mdx b/docs/components/openairesponsestoolchoiceunion.mdx
index d44bdba38..d5c7e669c 100644
--- a/docs/components/openairesponsestoolchoiceunion.mdx
+++ b/docs/components/openairesponsestoolchoiceunion.mdx
@@ -52,3 +52,9 @@ value: components.OpenAIResponsesToolChoiceApplyPatch = /* values here */
value: components.OpenAIResponsesToolChoiceShell = /* values here */
```
+### `components.ToolChoiceMcp`
+
+```python
+value: components.ToolChoiceMcp = /* values here */
+```
+
diff --git a/docs/components/outputitemmcpapprovalrequest.mdx b/docs/components/outputitemmcpapprovalrequest.mdx
new file mode 100644
index 000000000..d42e8d9d1
--- /dev/null
+++ b/docs/components/outputitemmcpapprovalrequest.mdx
@@ -0,0 +1,13 @@
+---
+title: "OutputItemMcpApprovalRequest"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ |
+| `arguments` | *str* | ✔️ | N/A |
+| `id` | *str* | ✔️ | N/A |
+| `name` | *str* | ✔️ | N/A |
+| `server_label` | *str* | ✔️ | N/A |
+| `type` | [components.OutputItemMcpApprovalRequestType](../components/outputitemmcpapprovalrequesttype.mdx) | ✔️ | N/A |
\ No newline at end of file
diff --git a/docs/components/outputitemmcpapprovalrequesttype.mdx b/docs/components/outputitemmcpapprovalrequesttype.mdx
new file mode 100644
index 000000000..22bc74a70
--- /dev/null
+++ b/docs/components/outputitemmcpapprovalrequesttype.mdx
@@ -0,0 +1,15 @@
+---
+title: "OutputItemMcpApprovalRequestType"
+---
+
+## Example Usage
+
+```python
+from openrouter.components import OutputItemMcpApprovalRequestType
+value: OutputItemMcpApprovalRequestType = "mcp_approval_request"
+```
+
+
+## Values
+
+- `"mcp_approval_request"`
diff --git a/docs/components/outputitemmcpcall.mdx b/docs/components/outputitemmcpcall.mdx
new file mode 100644
index 000000000..c8c01c159
--- /dev/null
+++ b/docs/components/outputitemmcpcall.mdx
@@ -0,0 +1,17 @@
+---
+title: "OutputItemMcpCall"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
+| `approval_request_id` | *OptionalNullable[str]* | ➖ | N/A |
+| `arguments` | *str* | ✔️ | N/A |
+| `error` | [OptionalNullable[components.Error]](../components/error.mdx) | ➖ | N/A |
+| `id` | *str* | ✔️ | N/A |
+| `name` | *str* | ✔️ | N/A |
+| `output` | *OptionalNullable[str]* | ➖ | N/A |
+| `server_label` | *str* | ✔️ | N/A |
+| `status` | [Optional[components.OutputItemMcpCallStatus]](../components/outputitemmcpcallstatus.mdx) | ➖ | N/A |
+| `type` | [components.OutputItemMcpCallTypeMcpCall](../components/outputitemmcpcalltypemcpcall.mdx) | ✔️ | N/A |
\ No newline at end of file
diff --git a/docs/components/outputitemmcpcallstatus.mdx b/docs/components/outputitemmcpcallstatus.mdx
new file mode 100644
index 000000000..569bafafb
--- /dev/null
+++ b/docs/components/outputitemmcpcallstatus.mdx
@@ -0,0 +1,23 @@
+---
+title: "OutputItemMcpCallStatus"
+---
+
+## Example Usage
+
+```python
+from openrouter.components import OutputItemMcpCallStatus
+
+# Open enum: unrecognized values are captured as UnrecognizedStr
+value: OutputItemMcpCallStatus = "in_progress"
+```
+
+
+## Values
+
+This is an open enum. Unrecognized values will not fail type checks.
+
+- `"in_progress"`
+- `"completed"`
+- `"incomplete"`
+- `"calling"`
+- `"failed"`
diff --git a/docs/components/outputitemmcpcalltypemcpcall.mdx b/docs/components/outputitemmcpcalltypemcpcall.mdx
new file mode 100644
index 000000000..79216e1ec
--- /dev/null
+++ b/docs/components/outputitemmcpcalltypemcpcall.mdx
@@ -0,0 +1,15 @@
+---
+title: "OutputItemMcpCallTypeMcpCall"
+---
+
+## Example Usage
+
+```python
+from openrouter.components import OutputItemMcpCallTypeMcpCall
+value: OutputItemMcpCallTypeMcpCall = "mcp_call"
+```
+
+
+## Values
+
+- `"mcp_call"`
diff --git a/docs/components/outputitemmcplisttools.mdx b/docs/components/outputitemmcplisttools.mdx
new file mode 100644
index 000000000..577bc2910
--- /dev/null
+++ b/docs/components/outputitemmcplisttools.mdx
@@ -0,0 +1,13 @@
+---
+title: "OutputItemMcpListTools"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ |
+| `error` | *OptionalNullable[str]* | ➖ | N/A |
+| `id` | *str* | ✔️ | N/A |
+| `server_label` | *str* | ✔️ | N/A |
+| `tools` | List[[components.OutputItemMcpListToolsTool](../components/outputitemmcplisttoolstool.mdx)] | ✔️ | N/A |
+| `type` | [components.OutputItemMcpListToolsType](../components/outputitemmcplisttoolstype.mdx) | ✔️ | N/A |
\ No newline at end of file
diff --git a/docs/components/outputitemmcplisttoolstool.mdx b/docs/components/outputitemmcplisttoolstool.mdx
new file mode 100644
index 000000000..0e22d1768
--- /dev/null
+++ b/docs/components/outputitemmcplisttoolstool.mdx
@@ -0,0 +1,12 @@
+---
+title: "OutputItemMcpListToolsTool"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ----------------------- | ----------------------- | ----------------------- | ----------------------- |
+| `annotations` | *Optional[Any]* | ➖ | N/A |
+| `description` | *OptionalNullable[str]* | ➖ | N/A |
+| `input_schema` | Dict[str, *Any*] | ✔️ | N/A |
+| `name` | *str* | ✔️ | N/A |
\ No newline at end of file
diff --git a/docs/components/outputitemmcplisttoolstype.mdx b/docs/components/outputitemmcplisttoolstype.mdx
new file mode 100644
index 000000000..ae34b6e89
--- /dev/null
+++ b/docs/components/outputitemmcplisttoolstype.mdx
@@ -0,0 +1,15 @@
+---
+title: "OutputItemMcpListToolsType"
+---
+
+## Example Usage
+
+```python
+from openrouter.components import OutputItemMcpListToolsType
+value: OutputItemMcpListToolsType = "mcp_list_tools"
+```
+
+
+## Values
+
+- `"mcp_list_tools"`
diff --git a/docs/components/outputitems.mdx b/docs/components/outputitems.mdx
index f68ca9d3a..7b09b45f7 100644
--- a/docs/components/outputitems.mdx
+++ b/docs/components/outputitems.mdx
@@ -55,6 +55,12 @@ value: components.OutputFunctionCallItem = /* values here */
value: components.OutputImageGenerationCallItem = /* values here */
```
+### `components.McpApprovalRequestItem`
+
+```python
+value: components.McpApprovalRequestItem = /* values here */
+```
+
### `components.McpCallItem`
```python
diff --git a/docs/components/providername.mdx b/docs/components/providername.mdx
index c79e63882..1b0d1e25c 100644
--- a/docs/components/providername.mdx
+++ b/docs/components/providername.mdx
@@ -111,6 +111,7 @@ This is an open enum. Unrecognized values will not fail type checks.
- `"Reka"`
- `"Relace"`
- `"Respan"`
+- `"River"`
- `"Sail Research"`
- `"Sakana AI"`
- `"SambaNova"`
diff --git a/docs/components/provideroptions.mdx b/docs/components/provideroptions.mdx
index a346d1ba6..1816a8184 100644
--- a/docs/components/provideroptions.mdx
+++ b/docs/components/provideroptions.mdx
@@ -130,6 +130,7 @@ Provider-specific options keyed by provider slug. The provider segment is case-i
| `relace` | Dict[str, *Any*] | ➖ | N/A |
| `replicate` | Dict[str, *Any*] | ➖ | N/A |
| `respan` | Dict[str, *Any*] | ➖ | N/A |
+| `river` | Dict[str, *Any*] | ➖ | N/A |
| `runway` | Dict[str, *Any*] | ➖ | N/A |
| `sail_research` | Dict[str, *Any*] | ➖ | N/A |
| `sakana` | Dict[str, *Any*] | ➖ | N/A |
diff --git a/docs/components/providerresponseprovidername.mdx b/docs/components/providerresponseprovidername.mdx
index 0f0fe16af..8b4322d8b 100644
--- a/docs/components/providerresponseprovidername.mdx
+++ b/docs/components/providerresponseprovidername.mdx
@@ -141,6 +141,7 @@ This is an open enum. Unrecognized values will not fail type checks.
- `"Reka"`
- `"Relace"`
- `"Respan"`
+- `"River"`
- `"Sail Research"`
- `"Sakana AI"`
- `"SambaNova"`
diff --git a/docs/components/requireapproval.mdx b/docs/components/requireapproval.mdx
deleted file mode 100644
index 24f6adc5c..000000000
--- a/docs/components/requireapproval.mdx
+++ /dev/null
@@ -1,10 +0,0 @@
----
-title: "RequireApproval"
----
-
-## Fields
-
-| Field | Type | Required | Description |
-| ------------------------------------------------------ | ------------------------------------------------------ | ------------------------------------------------------ | ------------------------------------------------------ |
-| `always` | [Optional[components.Always]](../components/always.mdx) | ➖ | N/A |
-| `never` | [Optional[components.Never]](../components/never.mdx) | ➖ | N/A |
\ No newline at end of file
diff --git a/docs/components/requireapprovalalways.mdx b/docs/components/requireapprovalalways.mdx
deleted file mode 100644
index 520f072ac..000000000
--- a/docs/components/requireapprovalalways.mdx
+++ /dev/null
@@ -1,15 +0,0 @@
----
-title: "RequireApprovalAlways"
----
-
-## Example Usage
-
-```python
-from openrouter.components import RequireApprovalAlways
-value: RequireApprovalAlways = "always"
-```
-
-
-## Values
-
-- `"always"`
diff --git a/docs/components/requireapprovalnever.mdx b/docs/components/requireapprovalnever.mdx
deleted file mode 100644
index 0e65abee2..000000000
--- a/docs/components/requireapprovalnever.mdx
+++ /dev/null
@@ -1,15 +0,0 @@
----
-title: "RequireApprovalNever"
----
-
-## Example Usage
-
-```python
-from openrouter.components import RequireApprovalNever
-value: RequireApprovalNever = "never"
-```
-
-
-## Values
-
-- `"never"`
diff --git a/docs/components/requireapprovalunion.mdx b/docs/components/requireapprovalunion.mdx
deleted file mode 100644
index 01acc3f8d..000000000
--- a/docs/components/requireapprovalunion.mdx
+++ /dev/null
@@ -1,24 +0,0 @@
----
-title: "RequireApprovalUnion"
----
-
-## Supported Types
-
-### `components.RequireApproval`
-
-```python
-value: components.RequireApproval = /* values here */
-```
-
-### `components.RequireApprovalAlways`
-
-```python
-value: components.RequireApprovalAlways = /* values here */
-```
-
-### `components.RequireApprovalNever`
-
-```python
-value: components.RequireApprovalNever = /* values here */
-```
-
diff --git a/docs/components/responsesrequesttoolunion.mdx b/docs/components/responsesrequesttoolunion.mdx
index e9024a4e9..1eefc25c2 100644
--- a/docs/components/responsesrequesttoolunion.mdx
+++ b/docs/components/responsesrequesttoolunion.mdx
@@ -172,3 +172,9 @@ value: components.ShellServerToolOpenRouter = /* values here */
value: components.ToolSearchServerTool = /* values here */
```
+### `components.McpServerToolOpenRouter`
+
+```python
+value: components.McpServerToolOpenRouter = /* values here */
+```
+
diff --git a/docs/components/toolchoicemcp.mdx b/docs/components/toolchoicemcp.mdx
new file mode 100644
index 000000000..d55d8987d
--- /dev/null
+++ b/docs/components/toolchoicemcp.mdx
@@ -0,0 +1,14 @@
+---
+title: "ToolChoiceMcp"
+---
+
+Forces a call to the named MCP server; `name` narrows it to one of its tools
+
+
+## Fields
+
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ |
+| `name` | *OptionalNullable[str]* | ➖ | N/A |
+| `server_label` | *str* | ✔️ | N/A |
+| `type` | [components.ToolChoiceMcpType](../components/toolchoicemcptype.mdx) | ✔️ | N/A |
\ No newline at end of file
diff --git a/docs/components/toolchoicemcptype.mdx b/docs/components/toolchoicemcptype.mdx
new file mode 100644
index 000000000..0b927c376
--- /dev/null
+++ b/docs/components/toolchoicemcptype.mdx
@@ -0,0 +1,15 @@
+---
+title: "ToolChoiceMcpType"
+---
+
+## Example Usage
+
+```python
+from openrouter.components import ToolChoiceMcpType
+value: ToolChoiceMcpType = "mcp"
+```
+
+
+## Values
+
+- `"mcp"`
diff --git a/docs/components/toolsearchoutputitemtoolunion.mdx b/docs/components/toolsearchoutputitemtoolunion.mdx
index fc1479a10..56268e759 100644
--- a/docs/components/toolsearchoutputitemtoolunion.mdx
+++ b/docs/components/toolsearchoutputitemtoolunion.mdx
@@ -178,3 +178,9 @@ value: components.ToolSearchServerTool = /* values here */
value: components.ToolSearchOutputItemTool = /* values here */
```
+### `components.McpServerToolOpenRouter`
+
+```python
+value: components.McpServerToolOpenRouter = /* values here */
+```
+
diff --git a/docs/components/updateworkspacerequestdisabledservertool.mdx b/docs/components/updateworkspacerequestdisabledservertool.mdx
index 0ac89d206..b92957594 100644
--- a/docs/components/updateworkspacerequestdisabledservertool.mdx
+++ b/docs/components/updateworkspacerequestdisabledservertool.mdx
@@ -22,6 +22,7 @@ This is an open enum. Unrecognized values will not fail type checks.
- `"openrouter:datetime"`
- `"openrouter:fusion"`
- `"openrouter:image_generation"`
+- `"openrouter:mcp"`
- `"openrouter:experimental__search_models"`
- `"openrouter:shell"`
- `"openrouter:subagent"`
diff --git a/docs/components/videogenerationrequestoptions.mdx b/docs/components/videogenerationrequestoptions.mdx
index bd8ddff74..aaa3eacf6 100644
--- a/docs/components/videogenerationrequestoptions.mdx
+++ b/docs/components/videogenerationrequestoptions.mdx
@@ -130,6 +130,7 @@ Provider-specific options keyed by provider slug. The provider segment is case-i
| `relace` | Dict[str, *Any*] | ➖ | N/A |
| `replicate` | Dict[str, *Any*] | ➖ | N/A |
| `respan` | Dict[str, *Any*] | ➖ | N/A |
+| `river` | Dict[str, *Any*] | ➖ | N/A |
| `runway` | Dict[str, *Any*] | ➖ | N/A |
| `sail_research` | Dict[str, *Any*] | ➖ | N/A |
| `sakana` | Dict[str, *Any*] | ➖ | N/A |
diff --git a/docs/operations/provider.mdx b/docs/operations/provider.mdx
index 17ead5cd6..eb21dcbb1 100644
--- a/docs/operations/provider.mdx
+++ b/docs/operations/provider.mdx
@@ -114,6 +114,7 @@ This is an open enum. Unrecognized values will not fail type checks.
- `"reka"`
- `"relace"`
- `"respan"`
+- `"river"`
- `"runway"`
- `"sail-research"`
- `"sakana"`
diff --git a/docs/sdks/images/README.mdx b/docs/sdks/images/README.mdx
index aa2008a01..d45846d45 100644
--- a/docs/sdks/images/README.mdx
+++ b/docs/sdks/images/README.mdx
@@ -51,7 +51,7 @@ with OpenRouter(
| `x_open_router_categories` | *Optional[str]* | ➖ | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
| |
| `aspect_ratio` | [Optional[components.ImageGenerationRequestAspectRatio]](../../components/imagegenerationrequestaspectratio.mdx) | ➖ | Normalized aspect ratio of the generated image. Providers clamp to their supported subset. | 16:9 |
| `background` | [Optional[components.ImageGenerationRequestBackground]](../../components/imagegenerationrequestbackground.mdx) | ➖ | Background treatment. `transparent` requires an output_format that supports alpha (png or webp). | auto |
-| `frame_count` | *Optional[int]* | ➖ | Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations (OpenAI gpt-image-2.6, generations only); ignored otherwise. | 8 |
+| `frame_count` | *Optional[int]* | ➖ | Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations; each accepts its own range and rejects values outside it. Ignored otherwise. | 8 |
| `frame_duration_ms` | *Optional[int]* | ➖ | Display time of each animation frame in milliseconds (20-2000) when `output_format` is `gif`. Ignored by models that do not produce animations. | 100 |
| `input_references` | List[[components.ContentPartImage](../../components/contentpartimage.mdx)] | ➖ | Reference images to guide image-to-image generation, as base64 data URLs or HTTP(S) URLs. | |
| `markup` | [Optional[components.Markup]](../../components/markup.mdx) | ➖ | A transparent PNG overlay (arrows, circles, annotations) with the same dimensions as the first reference image, as a base64 data URL or HTTP(S) URL, guiding where an edit applies. Image-to-image requests only; honored by models with markup-guided editing (OpenAI gpt-image-2.6) and ignored otherwise. | \{
"image_url": \{
"url": "https://example.com/image.png"
},
"type": "image_url"
} |
diff --git a/pyproject.toml b/pyproject.toml
index fae1ed2a7..030ebeef9 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "openrouter"
-version = "1.3.129"
+version = "1.3.130"
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 8b271b625..c3dbcae7d 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.129"
+__version__: str = "1.3.130"
__openapi_doc_version__: str = "1.0.0"
__gen_version__: str = "2.950.13"
-__user_agent__: str = "speakeasy-sdk/python 1.3.129 2.950.13 1.0.0 openrouter"
+__user_agent__: str = "speakeasy-sdk/python 1.3.130 2.950.13 1.0.0 openrouter"
try:
if __package__ is not None:
diff --git a/src/openrouter/components/__init__.py b/src/openrouter/components/__init__.py
index b0363175c..8cc06bc4a 100644
--- a/src/openrouter/components/__init__.py
+++ b/src/openrouter/components/__init__.py
@@ -2669,7 +2669,12 @@
McpCallInProgressEventType,
McpCallInProgressEventTypedDict,
)
- from .mcpcallitem import McpCallItem, McpCallItemType, McpCallItemTypedDict
+ from .mcpcallitem import (
+ McpCallItem,
+ McpCallItemStatus,
+ McpCallItemType,
+ McpCallItemTypedDict,
+ )
from .mcphttperror import McpHTTPError, McpHTTPErrorType, McpHTTPErrorTypedDict
from .mcplisttoolscompletedevent import (
McpListToolsCompletedEvent,
@@ -2699,24 +2704,46 @@
McpProtocolErrorTypedDict,
)
from .mcpservertool import (
- AllowedTools,
- AllowedToolsTypedDict,
- AllowedToolsUnion,
- AllowedToolsUnionTypedDict,
- Always,
- AlwaysTypedDict,
- ConnectorID,
McpServerTool,
+ McpServerToolAllowedTools,
+ McpServerToolAllowedToolsTypedDict,
+ McpServerToolAllowedToolsUnion,
+ McpServerToolAllowedToolsUnionTypedDict,
+ McpServerToolAlways,
+ McpServerToolAlwaysTypedDict,
+ McpServerToolNever,
+ McpServerToolNeverTypedDict,
+ McpServerToolRequireApproval,
+ McpServerToolRequireApprovalAlways,
+ McpServerToolRequireApprovalNever,
+ McpServerToolRequireApprovalTypedDict,
+ McpServerToolRequireApprovalUnion,
+ McpServerToolRequireApprovalUnionTypedDict,
McpServerToolType,
McpServerToolTypedDict,
- Never,
- NeverTypedDict,
- RequireApproval,
- RequireApprovalAlways,
- RequireApprovalNever,
- RequireApprovalTypedDict,
- RequireApprovalUnion,
- RequireApprovalUnionTypedDict,
+ )
+ from .mcpservertool_openrouter import (
+ McpServerToolOpenRouter,
+ McpServerToolOpenRouterType,
+ McpServerToolOpenRouterTypedDict,
+ )
+ from .mcpservertoolparameters import (
+ McpServerToolParameters,
+ McpServerToolParametersAllowedTools,
+ McpServerToolParametersAllowedToolsTypedDict,
+ McpServerToolParametersAllowedToolsUnion,
+ McpServerToolParametersAllowedToolsUnionTypedDict,
+ McpServerToolParametersAlways,
+ McpServerToolParametersAlwaysTypedDict,
+ McpServerToolParametersNever,
+ McpServerToolParametersNeverTypedDict,
+ McpServerToolParametersRequireApproval,
+ McpServerToolParametersRequireApprovalAlways,
+ McpServerToolParametersRequireApprovalNever,
+ McpServerToolParametersRequireApprovalTypedDict,
+ McpServerToolParametersRequireApprovalUnion,
+ McpServerToolParametersRequireApprovalUnionTypedDict,
+ McpServerToolParametersTypedDict,
)
from .mcptoolcallerror import McpToolCallError, McpToolCallErrorTypedDict
from .mcptoolexecutionerror import (
@@ -3524,6 +3551,35 @@
OutputItemImageGenerationCallType,
OutputItemImageGenerationCallTypedDict,
)
+ from .outputitemmcpapprovalrequest import (
+ OutputItemMcpApprovalRequest,
+ OutputItemMcpApprovalRequestType,
+ OutputItemMcpApprovalRequestTypedDict,
+ )
+ from .outputitemmcpcall import (
+ Error,
+ ErrorHTTPError,
+ ErrorHTTPErrorTypedDict,
+ ErrorMcpProtocolError,
+ ErrorMcpProtocolErrorTypedDict,
+ ErrorMcpToolExecutionError,
+ ErrorMcpToolExecutionErrorTypedDict,
+ ErrorTypeHTTPError,
+ ErrorTypeMcpProtocolError,
+ ErrorTypeMcpToolExecutionError,
+ ErrorTypedDict,
+ OutputItemMcpCall,
+ OutputItemMcpCallStatus,
+ OutputItemMcpCallTypeMcpCall,
+ OutputItemMcpCallTypedDict,
+ )
+ from .outputitemmcplisttools import (
+ OutputItemMcpListTools,
+ OutputItemMcpListToolsTool,
+ OutputItemMcpListToolsToolTypedDict,
+ OutputItemMcpListToolsType,
+ OutputItemMcpListToolsTypedDict,
+ )
from .outputitemreasoning import (
OutputItemReasoning,
OutputItemReasoningStatusCompleted,
@@ -4393,6 +4449,7 @@
ToolChoiceAllowedType,
ToolChoiceAllowedTypedDict,
)
+ from .toolchoicemcp import ToolChoiceMcp, ToolChoiceMcpType, ToolChoiceMcpTypedDict
from .toolchoicesupport import ToolChoiceSupport, ToolChoiceSupportTypedDict
from .toolsearchcallitem import (
ToolSearchCallItem,
@@ -4867,12 +4924,6 @@
"AlignmentUnavailableCallRecordTypedDict",
"Allow",
"AllowTypedDict",
- "AllowedTools",
- "AllowedToolsTypedDict",
- "AllowedToolsUnion",
- "AllowedToolsUnionTypedDict",
- "Always",
- "AlwaysTypedDict",
"Annotation",
"AnnotationAddedEvent",
"AnnotationAddedEventType",
@@ -5704,7 +5755,6 @@
"ConfigurationUpdateTypedDict",
"ConflictResponseErrorData",
"ConflictResponseErrorDataTypedDict",
- "ConnectorID",
"Container",
"ContainerAuto",
"ContainerAutoEnvironment",
@@ -6040,10 +6090,21 @@
"Environment",
"EnvironmentEnum",
"EnvironmentTypedDict",
+ "Error",
"ErrorEnum",
"ErrorEvent",
"ErrorEventType",
"ErrorEventTypedDict",
+ "ErrorHTTPError",
+ "ErrorHTTPErrorTypedDict",
+ "ErrorMcpProtocolError",
+ "ErrorMcpProtocolErrorTypedDict",
+ "ErrorMcpToolExecutionError",
+ "ErrorMcpToolExecutionErrorTypedDict",
+ "ErrorTypeHTTPError",
+ "ErrorTypeMcpProtocolError",
+ "ErrorTypeMcpToolExecutionError",
+ "ErrorTypedDict",
"ExternalUser",
"ExternalUserResponse",
"ExternalUserResponseTypedDict",
@@ -6681,6 +6742,7 @@
"McpCallInProgressEventType",
"McpCallInProgressEventTypedDict",
"McpCallItem",
+ "McpCallItemStatus",
"McpCallItemType",
"McpCallItemTypedDict",
"McpHTTPError",
@@ -6709,6 +6771,39 @@
"McpProtocolErrorType",
"McpProtocolErrorTypedDict",
"McpServerTool",
+ "McpServerToolAllowedTools",
+ "McpServerToolAllowedToolsTypedDict",
+ "McpServerToolAllowedToolsUnion",
+ "McpServerToolAllowedToolsUnionTypedDict",
+ "McpServerToolAlways",
+ "McpServerToolAlwaysTypedDict",
+ "McpServerToolNever",
+ "McpServerToolNeverTypedDict",
+ "McpServerToolOpenRouter",
+ "McpServerToolOpenRouterType",
+ "McpServerToolOpenRouterTypedDict",
+ "McpServerToolParameters",
+ "McpServerToolParametersAllowedTools",
+ "McpServerToolParametersAllowedToolsTypedDict",
+ "McpServerToolParametersAllowedToolsUnion",
+ "McpServerToolParametersAllowedToolsUnionTypedDict",
+ "McpServerToolParametersAlways",
+ "McpServerToolParametersAlwaysTypedDict",
+ "McpServerToolParametersNever",
+ "McpServerToolParametersNeverTypedDict",
+ "McpServerToolParametersRequireApproval",
+ "McpServerToolParametersRequireApprovalAlways",
+ "McpServerToolParametersRequireApprovalNever",
+ "McpServerToolParametersRequireApprovalTypedDict",
+ "McpServerToolParametersRequireApprovalUnion",
+ "McpServerToolParametersRequireApprovalUnionTypedDict",
+ "McpServerToolParametersTypedDict",
+ "McpServerToolRequireApproval",
+ "McpServerToolRequireApprovalAlways",
+ "McpServerToolRequireApprovalNever",
+ "McpServerToolRequireApprovalTypedDict",
+ "McpServerToolRequireApprovalUnion",
+ "McpServerToolRequireApprovalUnionTypedDict",
"McpServerToolType",
"McpServerToolTypedDict",
"McpToolCallError",
@@ -6861,8 +6956,6 @@
"NativeSupportTypedDict",
"NativeTools",
"NativeToolsTypedDict",
- "Never",
- "NeverTypedDict",
"NotFoundResponseErrorData",
"NotFoundResponseErrorDataTypedDict",
"OAuthJwks",
@@ -7224,6 +7317,18 @@
"OutputItemImageGenerationCall",
"OutputItemImageGenerationCallType",
"OutputItemImageGenerationCallTypedDict",
+ "OutputItemMcpApprovalRequest",
+ "OutputItemMcpApprovalRequestType",
+ "OutputItemMcpApprovalRequestTypedDict",
+ "OutputItemMcpCall",
+ "OutputItemMcpCallStatus",
+ "OutputItemMcpCallTypeMcpCall",
+ "OutputItemMcpCallTypedDict",
+ "OutputItemMcpListTools",
+ "OutputItemMcpListToolsTool",
+ "OutputItemMcpListToolsToolTypedDict",
+ "OutputItemMcpListToolsType",
+ "OutputItemMcpListToolsTypedDict",
"OutputItemReasoning",
"OutputItemReasoningStatusCompleted",
"OutputItemReasoningStatusInProgress",
@@ -7596,12 +7701,6 @@
"RequestTimeoutResponseErrorDataTypedDict",
"RequestTypedDict",
"RequestedTokenType",
- "RequireApproval",
- "RequireApprovalAlways",
- "RequireApprovalNever",
- "RequireApprovalTypedDict",
- "RequireApprovalUnion",
- "RequireApprovalUnionTypedDict",
"Rerank",
"RerankTypedDict",
"ResponseFormat",
@@ -7946,6 +8045,9 @@
"ToolChoiceAnyTypedDict",
"ToolChoiceAuto",
"ToolChoiceAutoTypedDict",
+ "ToolChoiceMcp",
+ "ToolChoiceMcpType",
+ "ToolChoiceMcpTypedDict",
"ToolChoiceNone",
"ToolChoiceNoneTypedDict",
"ToolChoiceSupport",
@@ -10232,6 +10334,7 @@
"McpCallInProgressEventType": ".mcpcallinprogressevent",
"McpCallInProgressEventTypedDict": ".mcpcallinprogressevent",
"McpCallItem": ".mcpcallitem",
+ "McpCallItemStatus": ".mcpcallitem",
"McpCallItemType": ".mcpcallitem",
"McpCallItemTypedDict": ".mcpcallitem",
"McpHTTPError": ".mcphttperror",
@@ -10254,24 +10357,42 @@
"McpProtocolError": ".mcpprotocolerror",
"McpProtocolErrorType": ".mcpprotocolerror",
"McpProtocolErrorTypedDict": ".mcpprotocolerror",
- "AllowedTools": ".mcpservertool",
- "AllowedToolsTypedDict": ".mcpservertool",
- "AllowedToolsUnion": ".mcpservertool",
- "AllowedToolsUnionTypedDict": ".mcpservertool",
- "Always": ".mcpservertool",
- "AlwaysTypedDict": ".mcpservertool",
- "ConnectorID": ".mcpservertool",
"McpServerTool": ".mcpservertool",
+ "McpServerToolAllowedTools": ".mcpservertool",
+ "McpServerToolAllowedToolsTypedDict": ".mcpservertool",
+ "McpServerToolAllowedToolsUnion": ".mcpservertool",
+ "McpServerToolAllowedToolsUnionTypedDict": ".mcpservertool",
+ "McpServerToolAlways": ".mcpservertool",
+ "McpServerToolAlwaysTypedDict": ".mcpservertool",
+ "McpServerToolNever": ".mcpservertool",
+ "McpServerToolNeverTypedDict": ".mcpservertool",
+ "McpServerToolRequireApproval": ".mcpservertool",
+ "McpServerToolRequireApprovalAlways": ".mcpservertool",
+ "McpServerToolRequireApprovalNever": ".mcpservertool",
+ "McpServerToolRequireApprovalTypedDict": ".mcpservertool",
+ "McpServerToolRequireApprovalUnion": ".mcpservertool",
+ "McpServerToolRequireApprovalUnionTypedDict": ".mcpservertool",
"McpServerToolType": ".mcpservertool",
"McpServerToolTypedDict": ".mcpservertool",
- "Never": ".mcpservertool",
- "NeverTypedDict": ".mcpservertool",
- "RequireApproval": ".mcpservertool",
- "RequireApprovalAlways": ".mcpservertool",
- "RequireApprovalNever": ".mcpservertool",
- "RequireApprovalTypedDict": ".mcpservertool",
- "RequireApprovalUnion": ".mcpservertool",
- "RequireApprovalUnionTypedDict": ".mcpservertool",
+ "McpServerToolOpenRouter": ".mcpservertool_openrouter",
+ "McpServerToolOpenRouterType": ".mcpservertool_openrouter",
+ "McpServerToolOpenRouterTypedDict": ".mcpservertool_openrouter",
+ "McpServerToolParameters": ".mcpservertoolparameters",
+ "McpServerToolParametersAllowedTools": ".mcpservertoolparameters",
+ "McpServerToolParametersAllowedToolsTypedDict": ".mcpservertoolparameters",
+ "McpServerToolParametersAllowedToolsUnion": ".mcpservertoolparameters",
+ "McpServerToolParametersAllowedToolsUnionTypedDict": ".mcpservertoolparameters",
+ "McpServerToolParametersAlways": ".mcpservertoolparameters",
+ "McpServerToolParametersAlwaysTypedDict": ".mcpservertoolparameters",
+ "McpServerToolParametersNever": ".mcpservertoolparameters",
+ "McpServerToolParametersNeverTypedDict": ".mcpservertoolparameters",
+ "McpServerToolParametersRequireApproval": ".mcpservertoolparameters",
+ "McpServerToolParametersRequireApprovalAlways": ".mcpservertoolparameters",
+ "McpServerToolParametersRequireApprovalNever": ".mcpservertoolparameters",
+ "McpServerToolParametersRequireApprovalTypedDict": ".mcpservertoolparameters",
+ "McpServerToolParametersRequireApprovalUnion": ".mcpservertoolparameters",
+ "McpServerToolParametersRequireApprovalUnionTypedDict": ".mcpservertoolparameters",
+ "McpServerToolParametersTypedDict": ".mcpservertoolparameters",
"McpToolCallError": ".mcptoolcallerror",
"McpToolCallErrorTypedDict": ".mcptoolcallerror",
"McpToolExecutionError": ".mcptoolexecutionerror",
@@ -10908,6 +11029,29 @@
"OutputItemImageGenerationCall": ".outputitemimagegenerationcall",
"OutputItemImageGenerationCallType": ".outputitemimagegenerationcall",
"OutputItemImageGenerationCallTypedDict": ".outputitemimagegenerationcall",
+ "OutputItemMcpApprovalRequest": ".outputitemmcpapprovalrequest",
+ "OutputItemMcpApprovalRequestType": ".outputitemmcpapprovalrequest",
+ "OutputItemMcpApprovalRequestTypedDict": ".outputitemmcpapprovalrequest",
+ "Error": ".outputitemmcpcall",
+ "ErrorHTTPError": ".outputitemmcpcall",
+ "ErrorHTTPErrorTypedDict": ".outputitemmcpcall",
+ "ErrorMcpProtocolError": ".outputitemmcpcall",
+ "ErrorMcpProtocolErrorTypedDict": ".outputitemmcpcall",
+ "ErrorMcpToolExecutionError": ".outputitemmcpcall",
+ "ErrorMcpToolExecutionErrorTypedDict": ".outputitemmcpcall",
+ "ErrorTypeHTTPError": ".outputitemmcpcall",
+ "ErrorTypeMcpProtocolError": ".outputitemmcpcall",
+ "ErrorTypeMcpToolExecutionError": ".outputitemmcpcall",
+ "ErrorTypedDict": ".outputitemmcpcall",
+ "OutputItemMcpCall": ".outputitemmcpcall",
+ "OutputItemMcpCallStatus": ".outputitemmcpcall",
+ "OutputItemMcpCallTypeMcpCall": ".outputitemmcpcall",
+ "OutputItemMcpCallTypedDict": ".outputitemmcpcall",
+ "OutputItemMcpListTools": ".outputitemmcplisttools",
+ "OutputItemMcpListToolsTool": ".outputitemmcplisttools",
+ "OutputItemMcpListToolsToolTypedDict": ".outputitemmcplisttools",
+ "OutputItemMcpListToolsType": ".outputitemmcplisttools",
+ "OutputItemMcpListToolsTypedDict": ".outputitemmcplisttools",
"OutputItemReasoning": ".outputitemreasoning",
"OutputItemReasoningStatusCompleted": ".outputitemreasoning",
"OutputItemReasoningStatusInProgress": ".outputitemreasoning",
@@ -11563,6 +11707,9 @@
"ToolChoiceAllowed": ".toolchoiceallowed",
"ToolChoiceAllowedType": ".toolchoiceallowed",
"ToolChoiceAllowedTypedDict": ".toolchoiceallowed",
+ "ToolChoiceMcp": ".toolchoicemcp",
+ "ToolChoiceMcpType": ".toolchoicemcp",
+ "ToolChoiceMcpTypedDict": ".toolchoicemcp",
"ToolChoiceSupport": ".toolchoicesupport",
"ToolChoiceSupportTypedDict": ".toolchoicesupport",
"ToolSearchCallItem": ".toolsearchcallitem",
diff --git a/src/openrouter/components/additionaltoolsitem.py b/src/openrouter/components/additionaltoolsitem.py
index ff1837113..3d5379b36 100644
--- a/src/openrouter/components/additionaltoolsitem.py
+++ b/src/openrouter/components/additionaltoolsitem.py
@@ -38,6 +38,10 @@
LegacyWebSearchServerToolTypedDict,
)
from .mcpservertool import McpServerTool, McpServerToolTypedDict
+from .mcpservertool_openrouter import (
+ McpServerToolOpenRouter,
+ McpServerToolOpenRouterTypedDict,
+)
from .namespacetool import NamespaceTool, NamespaceToolTypedDict
from .preview_20250311_websearchservertool import (
Preview20250311WebSearchServerTool,
@@ -213,26 +217,27 @@ def serialize_model(self, handler):
ShellServerToolTypedDict,
SearchModelsServerToolOpenRouterTypedDict,
WebFetchServerToolTypedDict,
+ McpServerToolOpenRouterTypedDict,
AdditionalToolsItemToolTypedDict,
- ToolSearchServerToolTypedDict,
CodeInterpreterServerToolTypedDict,
+ ToolSearchServerToolTypedDict,
ShellServerToolOpenRouterTypedDict,
BashServerToolTypedDict,
ApplyPatchServerToolOpenRouterTypedDict,
WebSearchServerToolOpenRouterTypedDict,
ImageGenerationServerToolOpenRouterTypedDict,
FusionServerToolOpenRouterTypedDict,
- FilesServerToolTypedDict,
AdvisorServerToolOpenRouterTypedDict,
SubagentServerToolOpenRouterTypedDict,
DatetimeServerToolTypedDict,
+ FilesServerToolTypedDict,
NamespaceToolTypedDict,
ComputerUseServerToolTypedDict,
FileSearchServerToolTypedDict,
CustomToolTypedDict,
- PreviewWebSearchServerToolTypedDict,
AdditionalToolsItemToolFunctionTypedDict,
WebSearchServerToolTypedDict,
+ PreviewWebSearchServerToolTypedDict,
Preview20250311WebSearchServerToolTypedDict,
LegacyWebSearchServerToolTypedDict,
McpServerToolTypedDict,
@@ -249,26 +254,27 @@ def serialize_model(self, handler):
ShellServerTool,
SearchModelsServerToolOpenRouter,
WebFetchServerTool,
+ McpServerToolOpenRouter,
AdditionalToolsItemTool,
- ToolSearchServerTool,
CodeInterpreterServerTool,
+ ToolSearchServerTool,
ShellServerToolOpenRouter,
BashServerTool,
ApplyPatchServerToolOpenRouter,
WebSearchServerToolOpenRouter,
ImageGenerationServerToolOpenRouter,
FusionServerToolOpenRouter,
- FilesServerTool,
AdvisorServerToolOpenRouter,
SubagentServerToolOpenRouter,
DatetimeServerTool,
+ FilesServerTool,
NamespaceTool,
ComputerUseServerTool,
FileSearchServerTool,
CustomTool,
- PreviewWebSearchServerTool,
AdditionalToolsItemToolFunction,
WebSearchServerTool,
+ PreviewWebSearchServerTool,
Preview20250311WebSearchServerTool,
LegacyWebSearchServerTool,
McpServerTool,
diff --git a/src/openrouter/components/alignmentresponsesrejected.py b/src/openrouter/components/alignmentresponsesrejected.py
index e95541f48..870d6f535 100644
--- a/src/openrouter/components/alignmentresponsesrejected.py
+++ b/src/openrouter/components/alignmentresponsesrejected.py
@@ -26,6 +26,15 @@
OutputItemImageGenerationCall,
OutputItemImageGenerationCallTypedDict,
)
+from .outputitemmcpapprovalrequest import (
+ OutputItemMcpApprovalRequest,
+ OutputItemMcpApprovalRequestTypedDict,
+)
+from .outputitemmcpcall import OutputItemMcpCall, OutputItemMcpCallTypedDict
+from .outputitemmcplisttools import (
+ OutputItemMcpListTools,
+ OutputItemMcpListToolsTypedDict,
+)
from .outputitemreasoning import OutputItemReasoning, OutputItemReasoningTypedDict
from .outputitemwebsearchcall import (
OutputItemWebSearchCall,
@@ -44,16 +53,19 @@
AlignmentResponsesRejectedTypedDict = TypeAliasType(
"AlignmentResponsesRejectedTypedDict",
Union[
+ OutputItemCompactionTypedDict,
OutputItemFileSearchCallTypedDict,
OutputItemImageGenerationCallTypedDict,
- OutputItemCompactionTypedDict,
OutputItemWebSearchCallTypedDict,
- OutputMessageTypedDict,
+ OutputItemMcpListToolsTypedDict,
+ OutputItemMcpApprovalRequestTypedDict,
OutputItemReasoningTypedDict,
OutputItemApplyPatchCallTypedDict,
+ OutputMessageTypedDict,
OutputItemCodeInterpreterCallTypedDict,
OutputItemFunctionCallTypedDict,
OutputItemCustomToolCallTypedDict,
+ OutputItemMcpCallTypedDict,
],
)
@@ -76,6 +88,9 @@ class UnknownAlignmentResponsesRejected(BaseModel):
"file_search_call": OutputItemFileSearchCall,
"function_call": OutputItemFunctionCall,
"image_generation_call": OutputItemImageGenerationCall,
+ "mcp_approval_request": OutputItemMcpApprovalRequest,
+ "mcp_call": OutputItemMcpCall,
+ "mcp_list_tools": OutputItemMcpListTools,
"message": OutputMessage,
"reasoning": OutputItemReasoning,
"web_search_call": OutputItemWebSearchCall,
@@ -91,6 +106,9 @@ class UnknownAlignmentResponsesRejected(BaseModel):
OutputItemFileSearchCall,
OutputItemFunctionCall,
OutputItemImageGenerationCall,
+ OutputItemMcpApprovalRequest,
+ OutputItemMcpCall,
+ OutputItemMcpListTools,
OutputMessage,
OutputItemReasoning,
OutputItemWebSearchCall,
diff --git a/src/openrouter/components/byokproviderslug.py b/src/openrouter/components/byokproviderslug.py
index 719477b8c..5a5ac4a0d 100644
--- a/src/openrouter/components/byokproviderslug.py
+++ b/src/openrouter/components/byokproviderslug.py
@@ -103,6 +103,7 @@
"reka",
"relace",
"respan",
+ "river",
"runway",
"sail-research",
"sakana",
diff --git a/src/openrouter/components/createworkspacerequest.py b/src/openrouter/components/createworkspacerequest.py
index 70e1a4066..c4493d9ed 100644
--- a/src/openrouter/components/createworkspacerequest.py
+++ b/src/openrouter/components/createworkspacerequest.py
@@ -22,6 +22,7 @@
"openrouter:datetime",
"openrouter:fusion",
"openrouter:image_generation",
+ "openrouter:mcp",
"openrouter:experimental__search_models",
"openrouter:shell",
"openrouter:subagent",
diff --git a/src/openrouter/components/decisionschoicequestion.py b/src/openrouter/components/decisionschoicequestion.py
index 2bc00e588..4038e5f94 100644
--- a/src/openrouter/components/decisionschoicequestion.py
+++ b/src/openrouter/components/decisionschoicequestion.py
@@ -1,9 +1,16 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
-from openrouter.types import BaseModel, Nullable
+from openrouter.types import (
+ BaseModel,
+ Nullable,
+ OptionalNullable,
+ UNSET,
+ UNSET_SENTINEL,
+)
+from pydantic import model_serializer
from typing import Any, Dict, List, Literal, Union
-from typing_extensions import TypeAliasType, TypedDict
+from typing_extensions import NotRequired, TypeAliasType, TypedDict
CriteriaTypedDict = TypeAliasType(
@@ -34,15 +41,40 @@
class DecisionsChoiceQuestionTypedDict(TypedDict):
criteria: Dict[str, Nullable[CriteriaTypedDict]]
- instructions: DecisionsChoiceQuestionInstructionsTypedDict
- r"""A plain string, or a JSON object or array of structured guidance."""
type: DecisionsChoiceQuestionType
+ instructions: NotRequired[Nullable[DecisionsChoiceQuestionInstructionsTypedDict]]
+ r"""A plain string, or a JSON object or array of structured guidance."""
class DecisionsChoiceQuestion(BaseModel):
criteria: Dict[str, Nullable[Criteria]]
- instructions: DecisionsChoiceQuestionInstructions
+ type: DecisionsChoiceQuestionType
+
+ instructions: OptionalNullable[DecisionsChoiceQuestionInstructions] = UNSET
r"""A plain string, or a JSON object or array of structured guidance."""
- type: DecisionsChoiceQuestionType
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(["instructions"])
+ nullable_fields = set(["instructions"])
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+ is_nullable_and_explicitly_set = (
+ k in nullable_fields
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
+ )
+
+ if val != UNSET_SENTINEL:
+ if (
+ val is not None
+ or k not in optional_fields
+ or is_nullable_and_explicitly_set
+ ):
+ m[k] = val
+
+ return m
diff --git a/src/openrouter/components/decisionsnoulquestion.py b/src/openrouter/components/decisionsnoulquestion.py
index d6b2551a3..e467f51ad 100644
--- a/src/openrouter/components/decisionsnoulquestion.py
+++ b/src/openrouter/components/decisionsnoulquestion.py
@@ -1,7 +1,13 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
-from openrouter.types import BaseModel, UNSET_SENTINEL
+from openrouter.types import (
+ BaseModel,
+ Nullable,
+ OptionalNullable,
+ UNSET,
+ UNSET_SENTINEL,
+)
from pydantic import model_serializer
from typing import Any, Dict, List, Literal, Optional, Union
from typing_extensions import NotRequired, TypeAliasType, TypedDict
@@ -26,19 +32,44 @@
class DecisionsNoulQuestionCriteriaTypedDict(TypedDict):
- false: FalseTTypedDict
+ false: NotRequired[Nullable[FalseTTypedDict]]
r"""A plain string, or a JSON object or array of structured guidance."""
- true: TrueTTypedDict
+ true: NotRequired[Nullable[TrueTTypedDict]]
r"""A plain string, or a JSON object or array of structured guidance."""
class DecisionsNoulQuestionCriteria(BaseModel):
- false: FalseT
+ false: OptionalNullable[FalseT] = UNSET
r"""A plain string, or a JSON object or array of structured guidance."""
- true: TrueT
+ true: OptionalNullable[TrueT] = UNSET
r"""A plain string, or a JSON object or array of structured guidance."""
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(["false", "true"])
+ nullable_fields = set(["false", "true"])
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+ is_nullable_and_explicitly_set = (
+ k in nullable_fields
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
+ )
+
+ if val != UNSET_SENTINEL:
+ if (
+ val is not None
+ or k not in optional_fields
+ or is_nullable_and_explicitly_set
+ ):
+ m[k] = val
+
+ return m
+
DecisionsNoulQuestionInstructionsTypedDict = TypeAliasType(
"DecisionsNoulQuestionInstructionsTypedDict", Union[str, Dict[str, Any], List[Any]]
@@ -56,32 +87,41 @@ class DecisionsNoulQuestionCriteria(BaseModel):
class DecisionsNoulQuestionTypedDict(TypedDict):
- instructions: DecisionsNoulQuestionInstructionsTypedDict
- r"""A plain string, or a JSON object or array of structured guidance."""
type: DecisionsNoulQuestionType
criteria: NotRequired[DecisionsNoulQuestionCriteriaTypedDict]
+ instructions: NotRequired[Nullable[DecisionsNoulQuestionInstructionsTypedDict]]
+ r"""A plain string, or a JSON object or array of structured guidance."""
class DecisionsNoulQuestion(BaseModel):
- instructions: DecisionsNoulQuestionInstructions
- r"""A plain string, or a JSON object or array of structured guidance."""
-
type: DecisionsNoulQuestionType
criteria: Optional[DecisionsNoulQuestionCriteria] = None
+ instructions: OptionalNullable[DecisionsNoulQuestionInstructions] = UNSET
+ r"""A plain string, or a JSON object or array of structured guidance."""
+
@model_serializer(mode="wrap")
def serialize_model(self, handler):
- optional_fields = set(["criteria"])
+ optional_fields = set(["criteria", "instructions"])
+ nullable_fields = set(["instructions"])
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k, serialized.get(n))
+ is_nullable_and_explicitly_set = (
+ k in nullable_fields
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
+ )
if val != UNSET_SENTINEL:
- if val is not None or k not in optional_fields:
+ if (
+ val is not None
+ or k not in optional_fields
+ or is_nullable_and_explicitly_set
+ ):
m[k] = val
return m
diff --git a/src/openrouter/components/decisionsscorequestion.py b/src/openrouter/components/decisionsscorequestion.py
index a5abe8e60..a3ca9d0b2 100644
--- a/src/openrouter/components/decisionsscorequestion.py
+++ b/src/openrouter/components/decisionsscorequestion.py
@@ -1,9 +1,16 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
-from openrouter.types import BaseModel
+from openrouter.types import (
+ BaseModel,
+ Nullable,
+ OptionalNullable,
+ UNSET,
+ UNSET_SENTINEL,
+)
+from pydantic import model_serializer
from typing import Any, Dict, List, Literal, Union
-from typing_extensions import TypeAliasType, TypedDict
+from typing_extensions import NotRequired, TypeAliasType, TypedDict
CriterionTypedDict = TypeAliasType(
@@ -33,15 +40,40 @@
class DecisionsScoreQuestionTypedDict(TypedDict):
criteria: List[CriterionTypedDict]
- instructions: DecisionsScoreQuestionInstructionsTypedDict
- r"""A plain string, or a JSON object or array of structured guidance."""
type: DecisionsScoreQuestionType
+ instructions: NotRequired[Nullable[DecisionsScoreQuestionInstructionsTypedDict]]
+ r"""A plain string, or a JSON object or array of structured guidance."""
class DecisionsScoreQuestion(BaseModel):
criteria: List[Criterion]
- instructions: DecisionsScoreQuestionInstructions
+ type: DecisionsScoreQuestionType
+
+ instructions: OptionalNullable[DecisionsScoreQuestionInstructions] = UNSET
r"""A plain string, or a JSON object or array of structured guidance."""
- type: DecisionsScoreQuestionType
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(["instructions"])
+ nullable_fields = set(["instructions"])
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+ is_nullable_and_explicitly_set = (
+ k in nullable_fields
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
+ )
+
+ if val != UNSET_SENTINEL:
+ if (
+ val is not None
+ or k not in optional_fields
+ or is_nullable_and_explicitly_set
+ ):
+ m[k] = val
+
+ return m
diff --git a/src/openrouter/components/imagegenerationproviderpreferences.py b/src/openrouter/components/imagegenerationproviderpreferences.py
index 010c0fa0e..56f381290 100644
--- a/src/openrouter/components/imagegenerationproviderpreferences.py
+++ b/src/openrouter/components/imagegenerationproviderpreferences.py
@@ -161,6 +161,7 @@ class ImageGenerationProviderPreferencesOptionsTypedDict(TypedDict):
relace: NotRequired[Dict[str, Any]]
replicate: NotRequired[Dict[str, Any]]
respan: NotRequired[Dict[str, Any]]
+ river: NotRequired[Dict[str, Any]]
runway: NotRequired[Dict[str, Any]]
sail_research: NotRequired[Dict[str, Any]]
sakana: NotRequired[Dict[str, Any]]
@@ -485,6 +486,8 @@ class ImageGenerationProviderPreferencesOptions(BaseModel):
respan: Optional[Dict[str, Any]] = None
+ river: Optional[Dict[str, Any]] = None
+
runway: Optional[Dict[str, Any]] = None
sail_research: Annotated[
@@ -688,6 +691,7 @@ def serialize_model(self, handler):
"relace",
"replicate",
"respan",
+ "river",
"runway",
"sail-research",
"sakana",
diff --git a/src/openrouter/components/imagegenerationrequest.py b/src/openrouter/components/imagegenerationrequest.py
index ca824f4ab..9dc394a50 100644
--- a/src/openrouter/components/imagegenerationrequest.py
+++ b/src/openrouter/components/imagegenerationrequest.py
@@ -137,7 +137,7 @@ class ImageGenerationRequestTypedDict(TypedDict):
background: NotRequired[ImageGenerationRequestBackground]
r"""Background treatment. `transparent` requires an output_format that supports alpha (png or webp)."""
frame_count: NotRequired[int]
- r"""Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations (OpenAI gpt-image-2.6, generations only); ignored otherwise."""
+ r"""Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations; each accepts its own range and rejects values outside it. Ignored otherwise."""
frame_duration_ms: NotRequired[int]
r"""Display time of each animation frame in milliseconds (20-2000) when `output_format` is `gif`. Ignored by models that do not produce animations."""
input_references: NotRequired[List[ContentPartImageTypedDict]]
@@ -186,7 +186,7 @@ class ImageGenerationRequest(BaseModel):
r"""Background treatment. `transparent` requires an output_format that supports alpha (png or webp)."""
frame_count: Optional[int] = None
- r"""Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations (OpenAI gpt-image-2.6, generations only); ignored otherwise."""
+ r"""Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations; each accepts its own range and rejects values outside it. Ignored otherwise."""
frame_duration_ms: Optional[int] = None
r"""Display time of each animation frame in milliseconds (20-2000) when `output_format` is `gif`. Ignored by models that do not produce animations."""
diff --git a/src/openrouter/components/inputs_union.py b/src/openrouter/components/inputs_union.py
index 398c4ae99..b5b2ac90b 100644
--- a/src/openrouter/components/inputs_union.py
+++ b/src/openrouter/components/inputs_union.py
@@ -403,25 +403,25 @@ def serialize_model(self, handler):
McpListToolsItemTypedDict,
FunctionCallOutputItemTypedDict,
OutputDatetimeItemTypedDict,
- OutputApplyPatchServerToolItemTypedDict,
ToolSearchOutputItemTypedDict,
OutputSearchModelsServerToolItemTypedDict,
ToolSearchCallItemTypedDict,
InputsMessageTypedDict,
OutputComputerCallItemTypedDict,
OutputMemoryServerToolItemTypedDict,
+ OutputApplyPatchServerToolItemTypedDict,
+ ShellCallItemTypedDict,
AgentMessageItemTypedDict,
OutputCodeInterpreterCallItemTypedDict,
- McpCallItemTypedDict,
- ShellCallItemTypedDict,
ReasoningItemTypedDict,
- InputsReasoningTypedDict,
+ CustomToolCallItemTypedDict,
+ OutputWebFetchServerToolItemTypedDict,
OutputAdvisorServerToolItemTypedDict,
+ InputsReasoningTypedDict,
OutputCodeInterpreterServerToolItemTypedDict,
- OutputWebFetchServerToolItemTypedDict,
- CustomToolCallItemTypedDict,
- OutputImageGenerationServerToolItemTypedDict,
+ McpCallItemTypedDict,
ShellCallOutputItemTypedDict,
+ OutputImageGenerationServerToolItemTypedDict,
OutputFusionServerToolItemTypedDict,
OutputArmorBlockedItemTypedDict,
OutputShellServerToolItemTypedDict,
@@ -462,25 +462,25 @@ def serialize_model(self, handler):
McpListToolsItem,
FunctionCallOutputItem,
OutputDatetimeItem,
- OutputApplyPatchServerToolItem,
ToolSearchOutputItem,
OutputSearchModelsServerToolItem,
ToolSearchCallItem,
InputsMessage,
OutputComputerCallItem,
OutputMemoryServerToolItem,
+ OutputApplyPatchServerToolItem,
+ ShellCallItem,
AgentMessageItem,
OutputCodeInterpreterCallItem,
- McpCallItem,
- ShellCallItem,
ReasoningItem,
- InputsReasoning,
+ CustomToolCallItem,
+ OutputWebFetchServerToolItem,
OutputAdvisorServerToolItem,
+ InputsReasoning,
OutputCodeInterpreterServerToolItem,
- OutputWebFetchServerToolItem,
- CustomToolCallItem,
- OutputImageGenerationServerToolItem,
+ McpCallItem,
ShellCallOutputItem,
+ OutputImageGenerationServerToolItem,
OutputFusionServerToolItem,
OutputArmorBlockedItem,
OutputShellServerToolItem,
diff --git a/src/openrouter/components/mcpcallitem.py b/src/openrouter/components/mcpcallitem.py
index ff9945ec2..cd6e6061e 100644
--- a/src/openrouter/components/mcpcallitem.py
+++ b/src/openrouter/components/mcpcallitem.py
@@ -8,12 +8,25 @@
OptionalNullable,
UNSET,
UNSET_SENTINEL,
+ UnrecognizedStr,
)
from pydantic import model_serializer
-from typing import Literal
+from typing import Literal, Optional, Union
from typing_extensions import NotRequired, TypedDict
+McpCallItemStatus = Union[
+ Literal[
+ "in_progress",
+ "completed",
+ "incomplete",
+ "calling",
+ "failed",
+ ],
+ UnrecognizedStr,
+]
+
+
McpCallItemType = Literal["mcp_call",]
@@ -25,9 +38,11 @@ class McpCallItemTypedDict(TypedDict):
name: str
server_label: str
type: McpCallItemType
+ approval_request_id: NotRequired[Nullable[str]]
error: NotRequired[Nullable[McpToolCallErrorTypedDict]]
r"""Error from an MCP tool call, either a plain message or a structured error"""
output: NotRequired[Nullable[str]]
+ status: NotRequired[McpCallItemStatus]
class McpCallItem(BaseModel):
@@ -43,15 +58,19 @@ class McpCallItem(BaseModel):
type: McpCallItemType
+ approval_request_id: OptionalNullable[str] = UNSET
+
error: OptionalNullable[McpToolCallError] = UNSET
r"""Error from an MCP tool call, either a plain message or a structured error"""
output: OptionalNullable[str] = UNSET
+ status: Optional[McpCallItemStatus] = None
+
@model_serializer(mode="wrap")
def serialize_model(self, handler):
- optional_fields = set(["error", "output"])
- nullable_fields = set(["error", "output"])
+ optional_fields = set(["approval_request_id", "error", "output", "status"])
+ nullable_fields = set(["approval_request_id", "error", "output"])
serialized = handler(self)
m = {}
diff --git a/src/openrouter/components/mcpservertool.py b/src/openrouter/components/mcpservertool.py
index 93c62f100..c083a0bee 100644
--- a/src/openrouter/components/mcpservertool.py
+++ b/src/openrouter/components/mcpservertool.py
@@ -7,23 +7,36 @@
OptionalNullable,
UNSET,
UNSET_SENTINEL,
- UnrecognizedStr,
)
-from pydantic import model_serializer
-from typing import Dict, List, Literal, Optional, Union
+import pydantic
+from pydantic import ConfigDict, model_serializer
+from typing import Any, Dict, List, Literal, Optional, Union
from typing_extensions import NotRequired, TypeAliasType, TypedDict
-class AllowedToolsTypedDict(TypedDict):
+class McpServerToolAllowedToolsTypedDict(TypedDict):
read_only: NotRequired[bool]
tool_names: NotRequired[List[str]]
-class AllowedTools(BaseModel):
+class McpServerToolAllowedTools(BaseModel):
+ model_config = ConfigDict(
+ populate_by_name=True, arbitrary_types_allowed=True, extra="allow"
+ )
+ __pydantic_extra__: Dict[str, Any] = pydantic.Field(init=False)
+
read_only: Optional[bool] = None
tool_names: Optional[List[str]] = None
+ @property
+ def additional_properties(self):
+ return self.__pydantic_extra__
+
+ @additional_properties.setter
+ def additional_properties(self, value):
+ self.__pydantic_extra__ = value # pyright: ignore[reportIncompatibleVariableOverride]
+
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = set(["read_only", "tool_names"])
@@ -33,100 +46,142 @@ def serialize_model(self, handler):
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k, serialized.get(n))
+ serialized.pop(k, serialized.pop(n, None))
if val != UNSET_SENTINEL:
if val is not None or k not in optional_fields:
m[k] = val
+ for k, v in serialized.items():
+ m[k] = v
return m
-AllowedToolsUnionTypedDict = TypeAliasType(
- "AllowedToolsUnionTypedDict", Union[AllowedToolsTypedDict, List[str]]
+McpServerToolAllowedToolsUnionTypedDict = TypeAliasType(
+ "McpServerToolAllowedToolsUnionTypedDict",
+ Union[McpServerToolAllowedToolsTypedDict, List[str]],
)
-AllowedToolsUnion = TypeAliasType("AllowedToolsUnion", Union[AllowedTools, List[str]])
+McpServerToolAllowedToolsUnion = TypeAliasType(
+ "McpServerToolAllowedToolsUnion", Union[McpServerToolAllowedTools, List[str]]
+)
-ConnectorID = Union[
- Literal[
- "connector_dropbox",
- "connector_gmail",
- "connector_googlecalendar",
- "connector_googledrive",
- "connector_microsoftteams",
- "connector_outlookcalendar",
- "connector_outlookemail",
- "connector_sharepoint",
- ],
- UnrecognizedStr,
-]
+McpServerToolRequireApprovalNever = Literal["never",]
-RequireApprovalNever = Literal["never",]
+McpServerToolRequireApprovalAlways = Literal["always",]
-RequireApprovalAlways = Literal["always",]
+class McpServerToolAlwaysTypedDict(TypedDict):
+ read_only: NotRequired[bool]
+ tool_names: NotRequired[List[str]]
-class AlwaysTypedDict(TypedDict):
- tool_names: NotRequired[List[str]]
+class McpServerToolAlways(BaseModel):
+ model_config = ConfigDict(
+ populate_by_name=True, arbitrary_types_allowed=True, extra="allow"
+ )
+ __pydantic_extra__: Dict[str, Any] = pydantic.Field(init=False)
+ read_only: Optional[bool] = None
-class Always(BaseModel):
tool_names: Optional[List[str]] = None
+ @property
+ def additional_properties(self):
+ return self.__pydantic_extra__
+
+ @additional_properties.setter
+ def additional_properties(self, value):
+ self.__pydantic_extra__ = value # pyright: ignore[reportIncompatibleVariableOverride]
+
@model_serializer(mode="wrap")
def serialize_model(self, handler):
- optional_fields = set(["tool_names"])
+ optional_fields = set(["read_only", "tool_names"])
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k, serialized.get(n))
+ serialized.pop(k, serialized.pop(n, None))
if val != UNSET_SENTINEL:
if val is not None or k not in optional_fields:
m[k] = val
+ for k, v in serialized.items():
+ m[k] = v
return m
-class NeverTypedDict(TypedDict):
+class McpServerToolNeverTypedDict(TypedDict):
+ read_only: NotRequired[bool]
tool_names: NotRequired[List[str]]
-class Never(BaseModel):
+class McpServerToolNever(BaseModel):
+ model_config = ConfigDict(
+ populate_by_name=True, arbitrary_types_allowed=True, extra="allow"
+ )
+ __pydantic_extra__: Dict[str, Any] = pydantic.Field(init=False)
+
+ read_only: Optional[bool] = None
+
tool_names: Optional[List[str]] = None
+ @property
+ def additional_properties(self):
+ return self.__pydantic_extra__
+
+ @additional_properties.setter
+ def additional_properties(self, value):
+ self.__pydantic_extra__ = value # pyright: ignore[reportIncompatibleVariableOverride]
+
@model_serializer(mode="wrap")
def serialize_model(self, handler):
- optional_fields = set(["tool_names"])
+ optional_fields = set(["read_only", "tool_names"])
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k, serialized.get(n))
+ serialized.pop(k, serialized.pop(n, None))
if val != UNSET_SENTINEL:
if val is not None or k not in optional_fields:
m[k] = val
+ for k, v in serialized.items():
+ m[k] = v
return m
-class RequireApprovalTypedDict(TypedDict):
- always: NotRequired[AlwaysTypedDict]
- never: NotRequired[NeverTypedDict]
+class McpServerToolRequireApprovalTypedDict(TypedDict):
+ always: NotRequired[McpServerToolAlwaysTypedDict]
+ never: NotRequired[McpServerToolNeverTypedDict]
+
+
+class McpServerToolRequireApproval(BaseModel):
+ model_config = ConfigDict(
+ populate_by_name=True, arbitrary_types_allowed=True, extra="allow"
+ )
+ __pydantic_extra__: Dict[str, Any] = pydantic.Field(init=False)
+ always: Optional[McpServerToolAlways] = None
-class RequireApproval(BaseModel):
- always: Optional[Always] = None
+ never: Optional[McpServerToolNever] = None
- never: Optional[Never] = None
+ @property
+ def additional_properties(self):
+ return self.__pydantic_extra__
+
+ @additional_properties.setter
+ def additional_properties(self, value):
+ self.__pydantic_extra__ = value # pyright: ignore[reportIncompatibleVariableOverride]
@model_serializer(mode="wrap")
def serialize_model(self, handler):
@@ -137,23 +192,34 @@ def serialize_model(self, handler):
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k, serialized.get(n))
+ serialized.pop(k, serialized.pop(n, None))
if val != UNSET_SENTINEL:
if val is not None or k not in optional_fields:
m[k] = val
+ for k, v in serialized.items():
+ m[k] = v
return m
-RequireApprovalUnionTypedDict = TypeAliasType(
- "RequireApprovalUnionTypedDict",
- Union[RequireApprovalTypedDict, RequireApprovalAlways, RequireApprovalNever],
+McpServerToolRequireApprovalUnionTypedDict = TypeAliasType(
+ "McpServerToolRequireApprovalUnionTypedDict",
+ Union[
+ McpServerToolRequireApprovalTypedDict,
+ McpServerToolRequireApprovalAlways,
+ McpServerToolRequireApprovalNever,
+ ],
)
-RequireApprovalUnion = TypeAliasType(
- "RequireApprovalUnion",
- Union[RequireApproval, RequireApprovalAlways, RequireApprovalNever],
+McpServerToolRequireApprovalUnion = TypeAliasType(
+ "McpServerToolRequireApprovalUnion",
+ Union[
+ McpServerToolRequireApproval,
+ McpServerToolRequireApprovalAlways,
+ McpServerToolRequireApprovalNever,
+ ],
)
@@ -165,11 +231,11 @@ class McpServerToolTypedDict(TypedDict):
server_label: str
type: McpServerToolType
- allowed_tools: NotRequired[Nullable[AllowedToolsUnionTypedDict]]
+ allowed_tools: NotRequired[Nullable[McpServerToolAllowedToolsUnionTypedDict]]
authorization: NotRequired[str]
- connector_id: NotRequired[ConnectorID]
+ connector_id: NotRequired[str]
headers: NotRequired[Nullable[Dict[str, str]]]
- require_approval: NotRequired[Nullable[RequireApprovalUnionTypedDict]]
+ require_approval: NotRequired[Nullable[McpServerToolRequireApprovalUnionTypedDict]]
server_description: NotRequired[str]
server_url: NotRequired[str]
@@ -177,24 +243,37 @@ class McpServerToolTypedDict(TypedDict):
class McpServerTool(BaseModel):
r"""MCP (Model Context Protocol) tool configuration"""
+ model_config = ConfigDict(
+ populate_by_name=True, arbitrary_types_allowed=True, extra="allow"
+ )
+ __pydantic_extra__: Dict[str, Any] = pydantic.Field(init=False)
+
server_label: str
type: McpServerToolType
- allowed_tools: OptionalNullable[AllowedToolsUnion] = UNSET
+ allowed_tools: OptionalNullable[McpServerToolAllowedToolsUnion] = UNSET
authorization: Optional[str] = None
- connector_id: Optional[ConnectorID] = None
+ connector_id: Optional[str] = None
headers: OptionalNullable[Dict[str, str]] = UNSET
- require_approval: OptionalNullable[RequireApprovalUnion] = UNSET
+ require_approval: OptionalNullable[McpServerToolRequireApprovalUnion] = UNSET
server_description: Optional[str] = None
server_url: Optional[str] = None
+ @property
+ def additional_properties(self):
+ return self.__pydantic_extra__
+
+ @additional_properties.setter
+ def additional_properties(self, value):
+ self.__pydantic_extra__ = value # pyright: ignore[reportIncompatibleVariableOverride]
+
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = set(
@@ -215,6 +294,7 @@ def serialize_model(self, handler):
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k, serialized.get(n))
+ serialized.pop(k, serialized.pop(n, None))
is_nullable_and_explicitly_set = (
k in nullable_fields
and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
@@ -227,5 +307,7 @@ def serialize_model(self, handler):
or is_nullable_and_explicitly_set
):
m[k] = val
+ for k, v in serialized.items():
+ m[k] = v
return m
diff --git a/src/openrouter/components/mcpservertool_openrouter.py b/src/openrouter/components/mcpservertool_openrouter.py
new file mode 100644
index 000000000..015c1055a
--- /dev/null
+++ b/src/openrouter/components/mcpservertool_openrouter.py
@@ -0,0 +1,30 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from .mcpservertoolparameters import (
+ McpServerToolParameters,
+ McpServerToolParametersTypedDict,
+)
+from openrouter.types import BaseModel
+from typing import Literal
+from typing_extensions import TypedDict
+
+
+McpServerToolOpenRouterType = Literal["openrouter:mcp",]
+
+
+class McpServerToolOpenRouterTypedDict(TypedDict):
+ r"""OpenRouter built-in server tool: connects the model to a remote MCP server and runs its tools during the response"""
+
+ parameters: McpServerToolParametersTypedDict
+ r"""Configuration for a remote MCP server tool."""
+ type: McpServerToolOpenRouterType
+
+
+class McpServerToolOpenRouter(BaseModel):
+ r"""OpenRouter built-in server tool: connects the model to a remote MCP server and runs its tools during the response"""
+
+ parameters: McpServerToolParameters
+ r"""Configuration for a remote MCP server tool."""
+
+ type: McpServerToolOpenRouterType
diff --git a/src/openrouter/components/mcpservertoolparameters.py b/src/openrouter/components/mcpservertoolparameters.py
new file mode 100644
index 000000000..273827b65
--- /dev/null
+++ b/src/openrouter/components/mcpservertoolparameters.py
@@ -0,0 +1,318 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from openrouter.types import (
+ BaseModel,
+ Nullable,
+ OptionalNullable,
+ UNSET,
+ UNSET_SENTINEL,
+)
+import pydantic
+from pydantic import ConfigDict, model_serializer
+from typing import Any, Dict, List, Literal, Optional, Union
+from typing_extensions import NotRequired, TypeAliasType, TypedDict
+
+
+class McpServerToolParametersAllowedToolsTypedDict(TypedDict):
+ read_only: NotRequired[bool]
+ tool_names: NotRequired[List[str]]
+
+
+class McpServerToolParametersAllowedTools(BaseModel):
+ model_config = ConfigDict(
+ populate_by_name=True, arbitrary_types_allowed=True, extra="allow"
+ )
+ __pydantic_extra__: Dict[str, Any] = pydantic.Field(init=False)
+
+ read_only: Optional[bool] = None
+
+ tool_names: Optional[List[str]] = None
+
+ @property
+ def additional_properties(self):
+ return self.__pydantic_extra__
+
+ @additional_properties.setter
+ def additional_properties(self, value):
+ self.__pydantic_extra__ = value # pyright: ignore[reportIncompatibleVariableOverride]
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(["read_only", "tool_names"])
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+ serialized.pop(k, serialized.pop(n, None))
+
+ if val != UNSET_SENTINEL:
+ if val is not None or k not in optional_fields:
+ m[k] = val
+ for k, v in serialized.items():
+ m[k] = v
+
+ return m
+
+
+McpServerToolParametersAllowedToolsUnionTypedDict = TypeAliasType(
+ "McpServerToolParametersAllowedToolsUnionTypedDict",
+ Union[McpServerToolParametersAllowedToolsTypedDict, List[str]],
+)
+r"""Restrict the tools exposed to the model to this list or filter."""
+
+
+McpServerToolParametersAllowedToolsUnion = TypeAliasType(
+ "McpServerToolParametersAllowedToolsUnion",
+ Union[McpServerToolParametersAllowedTools, List[str]],
+)
+r"""Restrict the tools exposed to the model to this list or filter."""
+
+
+McpServerToolParametersRequireApprovalNever = Literal["never",]
+
+
+McpServerToolParametersRequireApprovalAlways = Literal["always",]
+
+
+class McpServerToolParametersAlwaysTypedDict(TypedDict):
+ read_only: NotRequired[bool]
+ tool_names: NotRequired[List[str]]
+
+
+class McpServerToolParametersAlways(BaseModel):
+ model_config = ConfigDict(
+ populate_by_name=True, arbitrary_types_allowed=True, extra="allow"
+ )
+ __pydantic_extra__: Dict[str, Any] = pydantic.Field(init=False)
+
+ read_only: Optional[bool] = None
+
+ tool_names: Optional[List[str]] = None
+
+ @property
+ def additional_properties(self):
+ return self.__pydantic_extra__
+
+ @additional_properties.setter
+ def additional_properties(self, value):
+ self.__pydantic_extra__ = value # pyright: ignore[reportIncompatibleVariableOverride]
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(["read_only", "tool_names"])
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+ serialized.pop(k, serialized.pop(n, None))
+
+ if val != UNSET_SENTINEL:
+ if val is not None or k not in optional_fields:
+ m[k] = val
+ for k, v in serialized.items():
+ m[k] = v
+
+ return m
+
+
+class McpServerToolParametersNeverTypedDict(TypedDict):
+ read_only: NotRequired[bool]
+ tool_names: NotRequired[List[str]]
+
+
+class McpServerToolParametersNever(BaseModel):
+ model_config = ConfigDict(
+ populate_by_name=True, arbitrary_types_allowed=True, extra="allow"
+ )
+ __pydantic_extra__: Dict[str, Any] = pydantic.Field(init=False)
+
+ read_only: Optional[bool] = None
+
+ tool_names: Optional[List[str]] = None
+
+ @property
+ def additional_properties(self):
+ return self.__pydantic_extra__
+
+ @additional_properties.setter
+ def additional_properties(self, value):
+ self.__pydantic_extra__ = value # pyright: ignore[reportIncompatibleVariableOverride]
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(["read_only", "tool_names"])
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+ serialized.pop(k, serialized.pop(n, None))
+
+ if val != UNSET_SENTINEL:
+ if val is not None or k not in optional_fields:
+ m[k] = val
+ for k, v in serialized.items():
+ m[k] = v
+
+ return m
+
+
+class McpServerToolParametersRequireApprovalTypedDict(TypedDict):
+ always: NotRequired[McpServerToolParametersAlwaysTypedDict]
+ never: NotRequired[McpServerToolParametersNeverTypedDict]
+
+
+class McpServerToolParametersRequireApproval(BaseModel):
+ model_config = ConfigDict(
+ populate_by_name=True, arbitrary_types_allowed=True, extra="allow"
+ )
+ __pydantic_extra__: Dict[str, Any] = pydantic.Field(init=False)
+
+ always: Optional[McpServerToolParametersAlways] = None
+
+ never: Optional[McpServerToolParametersNever] = None
+
+ @property
+ def additional_properties(self):
+ return self.__pydantic_extra__
+
+ @additional_properties.setter
+ def additional_properties(self, value):
+ self.__pydantic_extra__ = value # pyright: ignore[reportIncompatibleVariableOverride]
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(["always", "never"])
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+ serialized.pop(k, serialized.pop(n, None))
+
+ if val != UNSET_SENTINEL:
+ if val is not None or k not in optional_fields:
+ m[k] = val
+ for k, v in serialized.items():
+ m[k] = v
+
+ return m
+
+
+McpServerToolParametersRequireApprovalUnionTypedDict = TypeAliasType(
+ "McpServerToolParametersRequireApprovalUnionTypedDict",
+ Union[
+ McpServerToolParametersRequireApprovalTypedDict,
+ McpServerToolParametersRequireApprovalAlways,
+ McpServerToolParametersRequireApprovalNever,
+ ],
+)
+r"""Approval policy for tool calls. Defaults to always: a call that needs approval ends the response with an mcp_approval_request item, answered with an mcp_approval_response on the next request."""
+
+
+McpServerToolParametersRequireApprovalUnion = TypeAliasType(
+ "McpServerToolParametersRequireApprovalUnion",
+ Union[
+ McpServerToolParametersRequireApproval,
+ McpServerToolParametersRequireApprovalAlways,
+ McpServerToolParametersRequireApprovalNever,
+ ],
+)
+r"""Approval policy for tool calls. Defaults to always: a call that needs approval ends the response with an mcp_approval_request item, answered with an mcp_approval_response on the next request."""
+
+
+class McpServerToolParametersTypedDict(TypedDict):
+ r"""Configuration for a remote MCP server tool."""
+
+ server_label: str
+ r"""Label for this MCP server, used in mcp_list_tools and mcp_call items."""
+ allowed_tools: NotRequired[
+ Nullable[McpServerToolParametersAllowedToolsUnionTypedDict]
+ ]
+ r"""Restrict the tools exposed to the model to this list or filter."""
+ authorization: NotRequired[str]
+ r"""OAuth access token sent as the Authorization bearer to the server."""
+ connector_id: NotRequired[str]
+ r"""Provider-defined connector identifier, forwarded as written to providers that run MCP themselves."""
+ headers: NotRequired[Nullable[Dict[str, str]]]
+ r"""Extra headers sent on every request to the server."""
+ require_approval: NotRequired[
+ Nullable[McpServerToolParametersRequireApprovalUnionTypedDict]
+ ]
+ r"""Approval policy for tool calls. Defaults to always: a call that needs approval ends the response with an mcp_approval_request item, answered with an mcp_approval_response on the next request."""
+ server_description: NotRequired[str]
+ r"""Extra context about the server, shown to the model."""
+ server_url: NotRequired[str]
+ r"""URL of the remote MCP server (streamable HTTP)."""
+
+
+class McpServerToolParameters(BaseModel):
+ r"""Configuration for a remote MCP server tool."""
+
+ server_label: str
+ r"""Label for this MCP server, used in mcp_list_tools and mcp_call items."""
+
+ allowed_tools: OptionalNullable[McpServerToolParametersAllowedToolsUnion] = UNSET
+ r"""Restrict the tools exposed to the model to this list or filter."""
+
+ authorization: Optional[str] = None
+ r"""OAuth access token sent as the Authorization bearer to the server."""
+
+ connector_id: Optional[str] = None
+ r"""Provider-defined connector identifier, forwarded as written to providers that run MCP themselves."""
+
+ headers: OptionalNullable[Dict[str, str]] = UNSET
+ r"""Extra headers sent on every request to the server."""
+
+ require_approval: OptionalNullable[McpServerToolParametersRequireApprovalUnion] = (
+ UNSET
+ )
+ r"""Approval policy for tool calls. Defaults to always: a call that needs approval ends the response with an mcp_approval_request item, answered with an mcp_approval_response on the next request."""
+
+ server_description: Optional[str] = None
+ r"""Extra context about the server, shown to the model."""
+
+ server_url: Optional[str] = None
+ r"""URL of the remote MCP server (streamable HTTP)."""
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(
+ [
+ "allowed_tools",
+ "authorization",
+ "connector_id",
+ "headers",
+ "require_approval",
+ "server_description",
+ "server_url",
+ ]
+ )
+ nullable_fields = set(["allowed_tools", "headers", "require_approval"])
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+ is_nullable_and_explicitly_set = (
+ k in nullable_fields
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
+ )
+
+ if val != UNSET_SENTINEL:
+ if (
+ val is not None
+ or k not in optional_fields
+ or is_nullable_and_explicitly_set
+ ):
+ m[k] = val
+
+ return m
diff --git a/src/openrouter/components/openairesponsestoolchoice_union.py b/src/openrouter/components/openairesponsestoolchoice_union.py
index edcd5ae54..4b4a35a19 100644
--- a/src/openrouter/components/openairesponsestoolchoice_union.py
+++ b/src/openrouter/components/openairesponsestoolchoice_union.py
@@ -2,6 +2,7 @@
from __future__ import annotations
from .toolchoiceallowed import ToolChoiceAllowed, ToolChoiceAllowedTypedDict
+from .toolchoicemcp import ToolChoiceMcp, ToolChoiceMcpTypedDict
from openrouter.types import BaseModel
from typing import Literal, Union
from typing_extensions import TypeAliasType, TypedDict
@@ -94,6 +95,7 @@ class OpenAIResponsesToolChoiceFunction(BaseModel):
OpenAIResponsesToolChoiceShellTypedDict,
OpenAIResponsesToolChoiceFunctionTypedDict,
ToolChoiceAllowedTypedDict,
+ ToolChoiceMcpTypedDict,
OpenAIResponsesToolChoiceAuto,
OpenAIResponsesToolChoiceNone,
OpenAIResponsesToolChoiceRequired,
@@ -109,6 +111,7 @@ class OpenAIResponsesToolChoiceFunction(BaseModel):
OpenAIResponsesToolChoiceShell,
OpenAIResponsesToolChoiceFunction,
ToolChoiceAllowed,
+ ToolChoiceMcp,
OpenAIResponsesToolChoiceAuto,
OpenAIResponsesToolChoiceNone,
OpenAIResponsesToolChoiceRequired,
diff --git a/src/openrouter/components/openresponsesresult.py b/src/openrouter/components/openresponsesresult.py
index d5ffb6009..005d00f52 100644
--- a/src/openrouter/components/openresponsesresult.py
+++ b/src/openrouter/components/openresponsesresult.py
@@ -173,11 +173,11 @@ def serialize_model(self, handler):
FileSearchServerToolTypedDict,
CustomToolTypedDict,
LegacyWebSearchServerToolTypedDict,
- McpServerToolTypedDict,
WebSearchServerToolTypedDict,
OpenResponsesResultToolFunctionTypedDict,
Preview20250311WebSearchServerToolTypedDict,
PreviewWebSearchServerToolTypedDict,
+ McpServerToolTypedDict,
ImageGenerationServerToolTypedDict,
],
)
diff --git a/src/openrouter/components/outputitemmcpapprovalrequest.py b/src/openrouter/components/outputitemmcpapprovalrequest.py
new file mode 100644
index 000000000..d0e8a74cb
--- /dev/null
+++ b/src/openrouter/components/outputitemmcpapprovalrequest.py
@@ -0,0 +1,29 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from openrouter.types import BaseModel
+from typing import Literal
+from typing_extensions import TypedDict
+
+
+OutputItemMcpApprovalRequestType = Literal["mcp_approval_request",]
+
+
+class OutputItemMcpApprovalRequestTypedDict(TypedDict):
+ arguments: str
+ id: str
+ name: str
+ server_label: str
+ type: OutputItemMcpApprovalRequestType
+
+
+class OutputItemMcpApprovalRequest(BaseModel):
+ arguments: str
+
+ id: str
+
+ name: str
+
+ server_label: str
+
+ type: OutputItemMcpApprovalRequestType
diff --git a/src/openrouter/components/outputitemmcpcall.py b/src/openrouter/components/outputitemmcpcall.py
new file mode 100644
index 000000000..45cba55c9
--- /dev/null
+++ b/src/openrouter/components/outputitemmcpcall.py
@@ -0,0 +1,167 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from openrouter.types import (
+ BaseModel,
+ Nullable,
+ OptionalNullable,
+ UNSET,
+ UNSET_SENTINEL,
+ UnrecognizedStr,
+)
+from pydantic import model_serializer
+from typing import Any, Literal, Optional, Union
+from typing_extensions import NotRequired, TypeAliasType, TypedDict
+
+
+ErrorTypeHTTPError = Literal["http_error",]
+
+
+class ErrorHTTPErrorTypedDict(TypedDict):
+ code: int
+ message: str
+ type: ErrorTypeHTTPError
+
+
+class ErrorHTTPError(BaseModel):
+ code: int
+
+ message: str
+
+ type: ErrorTypeHTTPError
+
+
+ErrorTypeMcpToolExecutionError = Literal["mcp_tool_execution_error",]
+
+
+class ErrorMcpToolExecutionErrorTypedDict(TypedDict):
+ type: ErrorTypeMcpToolExecutionError
+ content: NotRequired[Any]
+
+
+class ErrorMcpToolExecutionError(BaseModel):
+ type: ErrorTypeMcpToolExecutionError
+
+ content: Optional[Any] = None
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(["content"])
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+
+ if val != UNSET_SENTINEL:
+ if val is not None or k not in optional_fields:
+ m[k] = val
+
+ return m
+
+
+ErrorTypeMcpProtocolError = Literal["mcp_protocol_error",]
+
+
+class ErrorMcpProtocolErrorTypedDict(TypedDict):
+ code: int
+ message: str
+ type: ErrorTypeMcpProtocolError
+
+
+class ErrorMcpProtocolError(BaseModel):
+ code: int
+
+ message: str
+
+ type: ErrorTypeMcpProtocolError
+
+
+ErrorTypedDict = TypeAliasType(
+ "ErrorTypedDict",
+ Union[
+ ErrorMcpToolExecutionErrorTypedDict,
+ ErrorMcpProtocolErrorTypedDict,
+ ErrorHTTPErrorTypedDict,
+ str,
+ ],
+)
+
+
+Error = TypeAliasType(
+ "Error",
+ Union[ErrorMcpToolExecutionError, ErrorMcpProtocolError, ErrorHTTPError, str],
+)
+
+
+OutputItemMcpCallStatus = Union[
+ Literal[
+ "in_progress",
+ "completed",
+ "incomplete",
+ "calling",
+ "failed",
+ ],
+ UnrecognizedStr,
+]
+
+
+OutputItemMcpCallTypeMcpCall = Literal["mcp_call",]
+
+
+class OutputItemMcpCallTypedDict(TypedDict):
+ arguments: str
+ id: str
+ name: str
+ server_label: str
+ type: OutputItemMcpCallTypeMcpCall
+ approval_request_id: NotRequired[Nullable[str]]
+ error: NotRequired[Nullable[ErrorTypedDict]]
+ output: NotRequired[Nullable[str]]
+ status: NotRequired[OutputItemMcpCallStatus]
+
+
+class OutputItemMcpCall(BaseModel):
+ arguments: str
+
+ id: str
+
+ name: str
+
+ server_label: str
+
+ type: OutputItemMcpCallTypeMcpCall
+
+ approval_request_id: OptionalNullable[str] = UNSET
+
+ error: OptionalNullable[Error] = UNSET
+
+ output: OptionalNullable[str] = UNSET
+
+ status: Optional[OutputItemMcpCallStatus] = None
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(["approval_request_id", "error", "output", "status"])
+ nullable_fields = set(["approval_request_id", "error", "output"])
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+ is_nullable_and_explicitly_set = (
+ k in nullable_fields
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
+ )
+
+ if val != UNSET_SENTINEL:
+ if (
+ val is not None
+ or k not in optional_fields
+ or is_nullable_and_explicitly_set
+ ):
+ m[k] = val
+
+ return m
diff --git a/src/openrouter/components/outputitemmcplisttools.py b/src/openrouter/components/outputitemmcplisttools.py
new file mode 100644
index 000000000..40b0d968e
--- /dev/null
+++ b/src/openrouter/components/outputitemmcplisttools.py
@@ -0,0 +1,103 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from openrouter.types import (
+ BaseModel,
+ Nullable,
+ OptionalNullable,
+ UNSET,
+ UNSET_SENTINEL,
+)
+from pydantic import model_serializer
+from typing import Any, Dict, List, Literal, Optional
+from typing_extensions import NotRequired, TypedDict
+
+
+class OutputItemMcpListToolsToolTypedDict(TypedDict):
+ input_schema: Dict[str, Any]
+ name: str
+ annotations: NotRequired[Any]
+ description: NotRequired[Nullable[str]]
+
+
+class OutputItemMcpListToolsTool(BaseModel):
+ input_schema: Dict[str, Any]
+
+ name: str
+
+ annotations: Optional[Any] = None
+
+ description: OptionalNullable[str] = UNSET
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(["annotations", "description"])
+ nullable_fields = set(["description"])
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+ is_nullable_and_explicitly_set = (
+ k in nullable_fields
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
+ )
+
+ if val != UNSET_SENTINEL:
+ if (
+ val is not None
+ or k not in optional_fields
+ or is_nullable_and_explicitly_set
+ ):
+ m[k] = val
+
+ return m
+
+
+OutputItemMcpListToolsType = Literal["mcp_list_tools",]
+
+
+class OutputItemMcpListToolsTypedDict(TypedDict):
+ id: str
+ server_label: str
+ tools: List[OutputItemMcpListToolsToolTypedDict]
+ type: OutputItemMcpListToolsType
+ error: NotRequired[Nullable[str]]
+
+
+class OutputItemMcpListTools(BaseModel):
+ id: str
+
+ server_label: str
+
+ tools: List[OutputItemMcpListToolsTool]
+
+ type: OutputItemMcpListToolsType
+
+ error: OptionalNullable[str] = UNSET
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(["error"])
+ nullable_fields = set(["error"])
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+ is_nullable_and_explicitly_set = (
+ k in nullable_fields
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
+ )
+
+ if val != UNSET_SENTINEL:
+ if (
+ val is not None
+ or k not in optional_fields
+ or is_nullable_and_explicitly_set
+ ):
+ m[k] = val
+
+ return m
diff --git a/src/openrouter/components/outputitems.py b/src/openrouter/components/outputitems.py
index 9cadc1da1..f4c0864d6 100644
--- a/src/openrouter/components/outputitems.py
+++ b/src/openrouter/components/outputitems.py
@@ -1,6 +1,10 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
+from .mcpapprovalrequestitem import (
+ McpApprovalRequestItem,
+ McpApprovalRequestItemTypedDict,
+)
from .mcpcallitem import McpCallItem, McpCallItemTypedDict
from .mcplisttoolsitem import McpListToolsItem, McpListToolsItemTypedDict
from .outputadvisorservertoolitem import (
@@ -132,41 +136,42 @@
OutputItemsTypedDict = TypeAliasType(
"OutputItemsTypedDict",
Union[
- OutputFileSearchServerToolItemTypedDict,
- OutputCompactionItemTypedDict,
OutputFileSearchCallItemTypedDict,
- McpListToolsItemTypedDict,
- OutputWebSearchCallItemTypedDict,
+ OutputCompactionItemTypedDict,
+ OutputFileSearchServerToolItemTypedDict,
+ OutputWebSearchServerToolItemTypedDict,
+ OutputBrowserUseServerToolItemTypedDict,
OutputImageGenerationCallItemTypedDict,
+ McpApprovalRequestItemTypedDict,
+ OutputWebSearchCallItemTypedDict,
OutputApplyPatchCallItemTypedDict,
+ McpListToolsItemTypedDict,
OutputTextEditorServerToolItemTypedDict,
- OutputBrowserUseServerToolItemTypedDict,
- OutputWebSearchServerToolItemTypedDict,
- OutputApplyPatchServerToolItemTypedDict,
- OutputMemoryServerToolItemTypedDict,
+ OutputMessageItemTypedDict,
+ OutputSearchModelsServerToolItemTypedDict,
OutputToolSearchCallItemTypedDict,
+ OutputMemoryServerToolItemTypedDict,
+ OutputApplyPatchServerToolItemTypedDict,
OutputDatetimeItemTypedDict,
- OutputSearchModelsServerToolItemTypedDict,
- OutputComputerCallItemTypedDict,
- OutputMessageItemTypedDict,
OutputShellCallItemTypedDict,
+ OutputComputerCallItemTypedDict,
OutputCodeInterpreterCallItemTypedDict,
- McpCallItemTypedDict,
- OutputAdvisorServerToolItemTypedDict,
- OutputCustomToolCallItemTypedDict,
- OutputWebFetchServerToolItemTypedDict,
- OutputReasoningItemTypedDict,
OutputCodeInterpreterServerToolItemTypedDict,
- OutputArmorBlockedItemTypedDict,
- OutputShellCallOutputItemTypedDict,
+ OutputReasoningItemTypedDict,
+ OutputWebFetchServerToolItemTypedDict,
+ OutputCustomToolCallItemTypedDict,
+ OutputAdvisorServerToolItemTypedDict,
OutputImageGenerationServerToolItemTypedDict,
+ McpCallItemTypedDict,
+ OutputShellCallOutputItemTypedDict,
OutputFusionServerToolItemTypedDict,
- OutputFunctionCallItemTypedDict,
- OutputShellServerToolItemTypedDict,
+ OutputArmorBlockedItemTypedDict,
OutputFilesServerToolItemTypedDict,
+ OutputShellServerToolItemTypedDict,
+ OutputFunctionCallItemTypedDict,
OutputSubagentServerToolItemTypedDict,
- OutputBashServerToolItemTypedDict,
OutputToolSearchServerToolItemTypedDict,
+ OutputBashServerToolItemTypedDict,
],
)
r"""An output item from the response"""
@@ -191,6 +196,7 @@ class UnknownOutputItems(BaseModel):
"file_search_call": OutputFileSearchCallItem,
"function_call": OutputFunctionCallItem,
"image_generation_call": OutputImageGenerationCallItem,
+ "mcp_approval_request": McpApprovalRequestItem,
"mcp_call": McpCallItem,
"mcp_list_tools": McpListToolsItem,
"message": OutputMessageItem,
@@ -231,6 +237,7 @@ class UnknownOutputItems(BaseModel):
OutputFileSearchCallItem,
OutputFunctionCallItem,
OutputImageGenerationCallItem,
+ McpApprovalRequestItem,
McpCallItem,
McpListToolsItem,
OutputMessageItem,
diff --git a/src/openrouter/components/providername.py b/src/openrouter/components/providername.py
index 482a05a9d..afa50f9d8 100644
--- a/src/openrouter/components/providername.py
+++ b/src/openrouter/components/providername.py
@@ -102,6 +102,7 @@
"Reka",
"Relace",
"Respan",
+ "River",
"Sail Research",
"Sakana AI",
"SambaNova",
diff --git a/src/openrouter/components/provideroptions.py b/src/openrouter/components/provideroptions.py
index 9c779f42a..bd1541270 100644
--- a/src/openrouter/components/provideroptions.py
+++ b/src/openrouter/components/provideroptions.py
@@ -132,6 +132,7 @@ class ProviderOptionsTypedDict(TypedDict):
relace: NotRequired[Dict[str, Any]]
replicate: NotRequired[Dict[str, Any]]
respan: NotRequired[Dict[str, Any]]
+ river: NotRequired[Dict[str, Any]]
runway: NotRequired[Dict[str, Any]]
sail_research: NotRequired[Dict[str, Any]]
sakana: NotRequired[Dict[str, Any]]
@@ -456,6 +457,8 @@ class ProviderOptions(BaseModel):
respan: Optional[Dict[str, Any]] = None
+ river: Optional[Dict[str, Any]] = None
+
runway: Optional[Dict[str, Any]] = None
sail_research: Annotated[
@@ -659,6 +662,7 @@ def serialize_model(self, handler):
"relace",
"replicate",
"respan",
+ "river",
"runway",
"sail-research",
"sakana",
diff --git a/src/openrouter/components/providerresponse.py b/src/openrouter/components/providerresponse.py
index 9937130cf..3356276ed 100644
--- a/src/openrouter/components/providerresponse.py
+++ b/src/openrouter/components/providerresponse.py
@@ -132,6 +132,7 @@
"Reka",
"Relace",
"Respan",
+ "River",
"Sail Research",
"Sakana AI",
"SambaNova",
diff --git a/src/openrouter/components/responsesrequest.py b/src/openrouter/components/responsesrequest.py
index b49331a97..1b82a3929 100644
--- a/src/openrouter/components/responsesrequest.py
+++ b/src/openrouter/components/responsesrequest.py
@@ -57,6 +57,10 @@
LegacyWebSearchServerToolTypedDict,
)
from .mcpservertool import McpServerTool, McpServerToolTypedDict
+from .mcpservertool_openrouter import (
+ McpServerToolOpenRouter,
+ McpServerToolOpenRouterTypedDict,
+)
from .moderationplugin import ModerationPlugin, ModerationPluginTypedDict
from .namespacetool import NamespaceTool, NamespaceToolTypedDict
from .openairesponsestoolchoice_union import (
@@ -388,26 +392,27 @@ def serialize_model(self, handler):
ShellServerToolTypedDict,
SearchModelsServerToolOpenRouterTypedDict,
WebFetchServerToolTypedDict,
+ McpServerToolOpenRouterTypedDict,
ToolSearchServerToolTypedDict,
- ShellServerToolOpenRouterTypedDict,
CodeInterpreterServerToolTypedDict,
+ ShellServerToolOpenRouterTypedDict,
BashServerToolTypedDict,
ApplyPatchServerToolOpenRouterTypedDict,
WebSearchServerToolOpenRouterTypedDict,
ImageGenerationServerToolOpenRouterTypedDict,
FusionServerToolOpenRouterTypedDict,
FilesServerToolTypedDict,
- DatetimeServerToolTypedDict,
AdvisorServerToolOpenRouterTypedDict,
SubagentServerToolOpenRouterTypedDict,
+ DatetimeServerToolTypedDict,
NamespaceToolTypedDict,
ComputerUseServerToolTypedDict,
FileSearchServerToolTypedDict,
CustomToolTypedDict,
PreviewWebSearchServerToolTypedDict,
- Preview20250311WebSearchServerToolTypedDict,
ResponsesRequestToolFunctionTypedDict,
WebSearchServerToolTypedDict,
+ Preview20250311WebSearchServerToolTypedDict,
LegacyWebSearchServerToolTypedDict,
McpServerToolTypedDict,
ImageGenerationServerToolTypedDict,
@@ -452,6 +457,7 @@ def serialize_model(self, handler):
Annotated[BashServerTool, Tag("openrouter:bash")],
Annotated[ShellServerToolOpenRouter, Tag("openrouter:shell")],
Annotated[ToolSearchServerTool, Tag("openrouter:tool_search")],
+ Annotated[McpServerToolOpenRouter, Tag("openrouter:mcp")],
],
Discriminator(lambda m: get_discriminator(m, "type", "type")),
]
diff --git a/src/openrouter/components/toolchoicemcp.py b/src/openrouter/components/toolchoicemcp.py
new file mode 100644
index 000000000..15884f9c0
--- /dev/null
+++ b/src/openrouter/components/toolchoicemcp.py
@@ -0,0 +1,59 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from openrouter.types import (
+ BaseModel,
+ Nullable,
+ OptionalNullable,
+ UNSET,
+ UNSET_SENTINEL,
+)
+from pydantic import model_serializer
+from typing import Literal
+from typing_extensions import NotRequired, TypedDict
+
+
+ToolChoiceMcpType = Literal["mcp",]
+
+
+class ToolChoiceMcpTypedDict(TypedDict):
+ r"""Forces a call to the named MCP server; `name` narrows it to one of its tools"""
+
+ server_label: str
+ type: ToolChoiceMcpType
+ name: NotRequired[Nullable[str]]
+
+
+class ToolChoiceMcp(BaseModel):
+ r"""Forces a call to the named MCP server; `name` narrows it to one of its tools"""
+
+ server_label: str
+
+ type: ToolChoiceMcpType
+
+ name: OptionalNullable[str] = UNSET
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(["name"])
+ nullable_fields = set(["name"])
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+ is_nullable_and_explicitly_set = (
+ k in nullable_fields
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
+ )
+
+ if val != UNSET_SENTINEL:
+ if (
+ val is not None
+ or k not in optional_fields
+ or is_nullable_and_explicitly_set
+ ):
+ m[k] = val
+
+ return m
diff --git a/src/openrouter/components/toolsearchoutputitem.py b/src/openrouter/components/toolsearchoutputitem.py
index 730833795..b56ef2bfe 100644
--- a/src/openrouter/components/toolsearchoutputitem.py
+++ b/src/openrouter/components/toolsearchoutputitem.py
@@ -38,6 +38,10 @@
LegacyWebSearchServerToolTypedDict,
)
from .mcpservertool import McpServerTool, McpServerToolTypedDict
+from .mcpservertool_openrouter import (
+ McpServerToolOpenRouter,
+ McpServerToolOpenRouterTypedDict,
+)
from .namespacetool import NamespaceTool, NamespaceToolTypedDict
from .preview_20250311_websearchservertool import (
Preview20250311WebSearchServerTool,
@@ -217,26 +221,27 @@ def serialize_model(self, handler):
ShellServerToolTypedDict,
SearchModelsServerToolOpenRouterTypedDict,
WebFetchServerToolTypedDict,
+ McpServerToolOpenRouterTypedDict,
ToolSearchOutputItemToolTypedDict,
- ToolSearchServerToolTypedDict,
CodeInterpreterServerToolTypedDict,
+ ToolSearchServerToolTypedDict,
ShellServerToolOpenRouterTypedDict,
BashServerToolTypedDict,
ApplyPatchServerToolOpenRouterTypedDict,
WebSearchServerToolOpenRouterTypedDict,
ImageGenerationServerToolOpenRouterTypedDict,
FusionServerToolOpenRouterTypedDict,
- FilesServerToolTypedDict,
AdvisorServerToolOpenRouterTypedDict,
SubagentServerToolOpenRouterTypedDict,
DatetimeServerToolTypedDict,
+ FilesServerToolTypedDict,
NamespaceToolTypedDict,
ComputerUseServerToolTypedDict,
FileSearchServerToolTypedDict,
CustomToolTypedDict,
- PreviewWebSearchServerToolTypedDict,
ToolSearchOutputItemToolFunctionTypedDict,
WebSearchServerToolTypedDict,
+ PreviewWebSearchServerToolTypedDict,
Preview20250311WebSearchServerToolTypedDict,
LegacyWebSearchServerToolTypedDict,
McpServerToolTypedDict,
@@ -253,26 +258,27 @@ def serialize_model(self, handler):
ShellServerTool,
SearchModelsServerToolOpenRouter,
WebFetchServerTool,
+ McpServerToolOpenRouter,
ToolSearchOutputItemTool,
- ToolSearchServerTool,
CodeInterpreterServerTool,
+ ToolSearchServerTool,
ShellServerToolOpenRouter,
BashServerTool,
ApplyPatchServerToolOpenRouter,
WebSearchServerToolOpenRouter,
ImageGenerationServerToolOpenRouter,
FusionServerToolOpenRouter,
- FilesServerTool,
AdvisorServerToolOpenRouter,
SubagentServerToolOpenRouter,
DatetimeServerTool,
+ FilesServerTool,
NamespaceTool,
ComputerUseServerTool,
FileSearchServerTool,
CustomTool,
- PreviewWebSearchServerTool,
ToolSearchOutputItemToolFunction,
WebSearchServerTool,
+ PreviewWebSearchServerTool,
Preview20250311WebSearchServerTool,
LegacyWebSearchServerTool,
McpServerTool,
diff --git a/src/openrouter/components/updateworkspacerequest.py b/src/openrouter/components/updateworkspacerequest.py
index 488979567..5049dc7ec 100644
--- a/src/openrouter/components/updateworkspacerequest.py
+++ b/src/openrouter/components/updateworkspacerequest.py
@@ -22,6 +22,7 @@
"openrouter:datetime",
"openrouter:fusion",
"openrouter:image_generation",
+ "openrouter:mcp",
"openrouter:experimental__search_models",
"openrouter:shell",
"openrouter:subagent",
diff --git a/src/openrouter/components/videogenerationrequest.py b/src/openrouter/components/videogenerationrequest.py
index ef6e96c11..da4c61d08 100644
--- a/src/openrouter/components/videogenerationrequest.py
+++ b/src/openrouter/components/videogenerationrequest.py
@@ -180,6 +180,7 @@ class VideoGenerationRequestOptionsTypedDict(TypedDict):
relace: NotRequired[Dict[str, Any]]
replicate: NotRequired[Dict[str, Any]]
respan: NotRequired[Dict[str, Any]]
+ river: NotRequired[Dict[str, Any]]
runway: NotRequired[Dict[str, Any]]
sail_research: NotRequired[Dict[str, Any]]
sakana: NotRequired[Dict[str, Any]]
@@ -504,6 +505,8 @@ class VideoGenerationRequestOptions(BaseModel):
respan: Optional[Dict[str, Any]] = None
+ river: Optional[Dict[str, Any]] = None
+
runway: Optional[Dict[str, Any]] = None
sail_research: Annotated[
@@ -707,6 +710,7 @@ def serialize_model(self, handler):
"relace",
"replicate",
"respan",
+ "river",
"runway",
"sail-research",
"sakana",
diff --git a/src/openrouter/images.py b/src/openrouter/images.py
index 24e5d4cf2..2edc66d82 100644
--- a/src/openrouter/images.py
+++ b/src/openrouter/images.py
@@ -71,7 +71,7 @@ def generate(
:param aspect_ratio: Normalized aspect ratio of the generated image. Providers clamp to their supported subset.
:param background: Background treatment. `transparent` requires an output_format that supports alpha (png or webp).
- :param frame_count: Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations (OpenAI gpt-image-2.6, generations only); ignored otherwise.
+ :param frame_count: Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations; each accepts its own range and rejects values outside it. Ignored otherwise.
:param frame_duration_ms: Display time of each animation frame in milliseconds (20-2000) when `output_format` is `gif`. Ignored by models that do not produce animations.
:param input_references: Reference images to guide image-to-image generation, as base64 data URLs or HTTP(S) URLs.
:param markup: A transparent PNG overlay (arrows, circles, annotations) with the same dimensions as the first reference image, as a base64 data URL or HTTP(S) URL, guiding where an edit applies. Image-to-image requests only; honored by models with markup-guided editing (OpenAI gpt-image-2.6) and ignored otherwise.
@@ -152,7 +152,7 @@ def generate(
:param aspect_ratio: Normalized aspect ratio of the generated image. Providers clamp to their supported subset.
:param background: Background treatment. `transparent` requires an output_format that supports alpha (png or webp).
- :param frame_count: Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations (OpenAI gpt-image-2.6, generations only); ignored otherwise.
+ :param frame_count: Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations; each accepts its own range and rejects values outside it. Ignored otherwise.
:param frame_duration_ms: Display time of each animation frame in milliseconds (20-2000) when `output_format` is `gif`. Ignored by models that do not produce animations.
:param input_references: Reference images to guide image-to-image generation, as base64 data URLs or HTTP(S) URLs.
:param markup: A transparent PNG overlay (arrows, circles, annotations) with the same dimensions as the first reference image, as a base64 data URL or HTTP(S) URL, guiding where an edit applies. Image-to-image requests only; honored by models with markup-guided editing (OpenAI gpt-image-2.6) and ignored otherwise.
@@ -236,7 +236,7 @@ def generate(
:param aspect_ratio: Normalized aspect ratio of the generated image. Providers clamp to their supported subset.
:param background: Background treatment. `transparent` requires an output_format that supports alpha (png or webp).
- :param frame_count: Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations (OpenAI gpt-image-2.6, generations only); ignored otherwise.
+ :param frame_count: Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations; each accepts its own range and rejects values outside it. Ignored otherwise.
:param frame_duration_ms: Display time of each animation frame in milliseconds (20-2000) when `output_format` is `gif`. Ignored by models that do not produce animations.
:param input_references: Reference images to guide image-to-image generation, as base64 data URLs or HTTP(S) URLs.
:param markup: A transparent PNG overlay (arrows, circles, annotations) with the same dimensions as the first reference image, as a base64 data URL or HTTP(S) URL, guiding where an edit applies. Image-to-image requests only; honored by models with markup-guided editing (OpenAI gpt-image-2.6) and ignored otherwise.
@@ -319,7 +319,7 @@ def generate(
:param aspect_ratio: Normalized aspect ratio of the generated image. Providers clamp to their supported subset.
:param background: Background treatment. `transparent` requires an output_format that supports alpha (png or webp).
- :param frame_count: Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations (OpenAI gpt-image-2.6, generations only); ignored otherwise.
+ :param frame_count: Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations; each accepts its own range and rejects values outside it. Ignored otherwise.
:param frame_duration_ms: Display time of each animation frame in milliseconds (20-2000) when `output_format` is `gif`. Ignored by models that do not produce animations.
:param input_references: Reference images to guide image-to-image generation, as base64 data URLs or HTTP(S) URLs.
:param markup: A transparent PNG overlay (arrows, circles, annotations) with the same dimensions as the first reference image, as a base64 data URL or HTTP(S) URL, guiding where an edit applies. Image-to-image requests only; honored by models with markup-guided editing (OpenAI gpt-image-2.6) and ignored otherwise.
@@ -613,7 +613,7 @@ async def generate_async(
:param aspect_ratio: Normalized aspect ratio of the generated image. Providers clamp to their supported subset.
:param background: Background treatment. `transparent` requires an output_format that supports alpha (png or webp).
- :param frame_count: Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations (OpenAI gpt-image-2.6, generations only); ignored otherwise.
+ :param frame_count: Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations; each accepts its own range and rejects values outside it. Ignored otherwise.
:param frame_duration_ms: Display time of each animation frame in milliseconds (20-2000) when `output_format` is `gif`. Ignored by models that do not produce animations.
:param input_references: Reference images to guide image-to-image generation, as base64 data URLs or HTTP(S) URLs.
:param markup: A transparent PNG overlay (arrows, circles, annotations) with the same dimensions as the first reference image, as a base64 data URL or HTTP(S) URL, guiding where an edit applies. Image-to-image requests only; honored by models with markup-guided editing (OpenAI gpt-image-2.6) and ignored otherwise.
@@ -694,7 +694,7 @@ async def generate_async(
:param aspect_ratio: Normalized aspect ratio of the generated image. Providers clamp to their supported subset.
:param background: Background treatment. `transparent` requires an output_format that supports alpha (png or webp).
- :param frame_count: Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations (OpenAI gpt-image-2.6, generations only); ignored otherwise.
+ :param frame_count: Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations; each accepts its own range and rejects values outside it. Ignored otherwise.
:param frame_duration_ms: Display time of each animation frame in milliseconds (20-2000) when `output_format` is `gif`. Ignored by models that do not produce animations.
:param input_references: Reference images to guide image-to-image generation, as base64 data URLs or HTTP(S) URLs.
:param markup: A transparent PNG overlay (arrows, circles, annotations) with the same dimensions as the first reference image, as a base64 data URL or HTTP(S) URL, guiding where an edit applies. Image-to-image requests only; honored by models with markup-guided editing (OpenAI gpt-image-2.6) and ignored otherwise.
@@ -778,7 +778,7 @@ async def generate_async(
:param aspect_ratio: Normalized aspect ratio of the generated image. Providers clamp to their supported subset.
:param background: Background treatment. `transparent` requires an output_format that supports alpha (png or webp).
- :param frame_count: Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations (OpenAI gpt-image-2.6, generations only); ignored otherwise.
+ :param frame_count: Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations; each accepts its own range and rejects values outside it. Ignored otherwise.
:param frame_duration_ms: Display time of each animation frame in milliseconds (20-2000) when `output_format` is `gif`. Ignored by models that do not produce animations.
:param input_references: Reference images to guide image-to-image generation, as base64 data URLs or HTTP(S) URLs.
:param markup: A transparent PNG overlay (arrows, circles, annotations) with the same dimensions as the first reference image, as a base64 data URL or HTTP(S) URL, guiding where an edit applies. Image-to-image requests only; honored by models with markup-guided editing (OpenAI gpt-image-2.6) and ignored otherwise.
@@ -861,7 +861,7 @@ async def generate_async(
:param aspect_ratio: Normalized aspect ratio of the generated image. Providers clamp to their supported subset.
:param background: Background treatment. `transparent` requires an output_format that supports alpha (png or webp).
- :param frame_count: Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations (OpenAI gpt-image-2.6, generations only); ignored otherwise.
+ :param frame_count: Number of animation frames (2-64) when `output_format` is `gif`. Only honored by models that produce animations; each accepts its own range and rejects values outside it. Ignored otherwise.
:param frame_duration_ms: Display time of each animation frame in milliseconds (20-2000) when `output_format` is `gif`. Ignored by models that do not produce animations.
:param input_references: Reference images to guide image-to-image generation, as base64 data URLs or HTTP(S) URLs.
:param markup: A transparent PNG overlay (arrows, circles, annotations) with the same dimensions as the first reference image, as a base64 data URL or HTTP(S) URL, guiding where an edit applies. Image-to-image requests only; honored by models with markup-guided editing (OpenAI gpt-image-2.6) and ignored otherwise.
diff --git a/src/openrouter/operations/listbyokkeys.py b/src/openrouter/operations/listbyokkeys.py
index 1f66e3452..583673b23 100644
--- a/src/openrouter/operations/listbyokkeys.py
+++ b/src/openrouter/operations/listbyokkeys.py
@@ -180,6 +180,7 @@ def serialize_model(self, handler):
"reka",
"relace",
"respan",
+ "river",
"runway",
"sail-research",
"sakana",
diff --git a/uv.lock b/uv.lock
index 1a6a74366..153481578 100644
--- a/uv.lock
+++ b/uv.lock
@@ -231,7 +231,7 @@ wheels = [
[[package]]
name = "openrouter"
-version = "1.3.129"
+version = "1.3.130"
source = { editable = "." }
dependencies = [
{ name = "httpcore" },