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" },