diff --git a/.devcontainer/README.md b/.devcontainer/README.md index 396929a..c7d8d27 100644 --- a/.devcontainer/README.md +++ b/.devcontainer/README.md @@ -1,4 +1,9 @@ +
+ +
+
+ > **Remember to shutdown a GitHub Codespace when it is not in use!** # Dev Containers Quick Start diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 8f932cd..d3381aa 100644 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,17 +1,19 @@ lockVersion: 2.0.0 id: c48cf606-fb42-4a45-9c23-8f0555307828 management: - docChecksum: 59bf622329ff2d6d2a28acceada10a6d + docChecksum: be645f7a4cc8800a8c1fd9da3f8d8e8b docVersion: 1.0.0 speakeasyVersion: 1.680.0 generationVersion: 2.788.4 - releaseVersion: 0.9.1 - configChecksum: 9c8b936b4b1d37d964e844ee1a15cd4b + releaseVersion: 0.9.2 + configChecksum: f906b25652bcc83a52d1c74e5018c02e + repoURL: https://github.com/OpenRouterTeam/python-sdk.git + installationURL: https://github.com/OpenRouterTeam/python-sdk.git published: true persistentEdits: - generation_id: ce3858e4-7fbd-4f52-9d57-24016d5c1504 - pristine_commit_hash: c581f0a6ace9e1c793b0f4d759585b420c157610 - pristine_tree_hash: c5a3bf3d181c5c54d764cdf6372feb79505d5ed7 + generation_id: dc6b2c1e-9ca9-4c4c-a468-140eb4e1ffb7 + pristine_commit_hash: d2e28aa2286c80038ec7459969d8b6f3feb6cd28 + pristine_tree_hash: b7fa6be6a9c98a5f357c3cf3b791c7cbf398ebf7 features: python: acceptHeaders: 3.0.0 @@ -50,8 +52,8 @@ features: trackedFiles: .devcontainer/README.md: id: b170c0f184ac - last_write_checksum: sha1:3c63dfd4dcea8df0d4add09e975a6887e6da4aab - pristine_git_object: 396929ab2e57cf09dd25ec83bd4496f733b95701 + last_write_checksum: sha1:919a25ed5129d316f05a60131c164011763b7c54 + pristine_git_object: c7d8d278438e7906fedb39d99151372b3324ea66 .devcontainer/devcontainer.json: id: b34062a34eb1 last_write_checksum: sha1:94309e8c8eab5ab063986bf625f513a59825e947 @@ -132,6 +134,10 @@ trackedFiles: id: 980004cae93f last_write_checksum: sha1:6f66927f536c351dcfbb940672511bd8a6fdd1a0 pristine_git_object: 32e8fd42002d9379fa207d0867b428c443a63a42 + docs/components/apitype.md: + id: "0e0508573603" + last_write_checksum: sha1:da6482291629866b38facb5b8cb2b65fa42f0246 + pristine_git_object: 2fab7cdc89cd708d30ecf5d3b23f61e115189b71 docs/components/applypatchservertool.md: id: 924a4805520a last_write_checksum: sha1:f87ee16357b393e199bf0a4ba74e02130f1f243b @@ -228,6 +234,14 @@ trackedFiles: id: c161e7a17271 last_write_checksum: sha1:4f3c5e5dda570bb87ec7e2deff31e2372f36b833 pristine_git_object: 031166f6d79ea3ef1781e95468197271da98738f + docs/components/bulkaddworkspacemembersrequest.md: + id: 12cbe93243c4 + last_write_checksum: sha1:5bc0f5067f2fdd1a05409b18ec723b8b2acb4026 + pristine_git_object: 021221840a6dee060a6d38db651561e5cedf5fc5 + docs/components/bulkaddworkspacemembersresponse.md: + id: d3aab5e7eed9 + last_write_checksum: sha1:37171ea7c4582693d05a06f6ebeb19a129cf6a51 + pristine_git_object: 41c1638401d9354a1024e72a47d50110d24b71f5 docs/components/bulkassignkeysrequest.md: id: 66e9231f0c3c last_write_checksum: sha1:7c4564346bbe9f2692053bb1d518972a9db5ad0e @@ -244,6 +258,14 @@ trackedFiles: id: 04b004029650 last_write_checksum: sha1:64d50ed55132163d6d6337f53e7a97f7fbbdacbd pristine_git_object: 2d6897c459041c7d09ec0260ec7fe56efaa4584e + docs/components/bulkremoveworkspacemembersrequest.md: + id: e265be6b6db8 + last_write_checksum: sha1:a72176adae768afd731c2ccbad121c82ea3c163d + pristine_git_object: 370a7447730e57693615aa1dd96d48cef546117a + docs/components/bulkremoveworkspacemembersresponse.md: + id: 36a1e8be9e5c + last_write_checksum: sha1:994efa56174f14f87605bb3e19eefcdad0aea8b7 + pristine_git_object: 3769f7b5f970db9324d32ec681a30dcee2b0a6ad docs/components/bulkunassignkeysrequest.md: id: 6d254be079fd last_write_checksum: sha1:c61da3563e04a493e6b1b72e0f8e5f3f6f6075e8 @@ -414,8 +436,8 @@ trackedFiles: pristine_git_object: f3a972b60a63cdb55670cc56cc92eae40578aa87 docs/components/chatfunctiontool.md: id: 3c79deefdcc0 - last_write_checksum: sha1:b782161259f089ecf304dce269d16c6d4aa3d95d - pristine_git_object: 6a4416a3c9d119186661a8c3987b1bfa63b91882 + last_write_checksum: sha1:b8ef7854c248c31c45327f7ce1fa6ae729d574db + pristine_git_object: 373d51769162ca4c578d67c34a672f9b564d0cd9 docs/components/chatfunctiontoolfunction.md: id: 0de29ccfd817 last_write_checksum: sha1:0a25d1c9b64f1da2513e9153682848cf41f324b2 @@ -458,8 +480,8 @@ trackedFiles: pristine_git_object: 617ce2091e37323ba91ec47c7e1a6ccff420a710 docs/components/chatrequestplugin.md: id: 24a908f99472 - last_write_checksum: sha1:872a0f5dec13b33dac3aba3616a1b45ce5352feb - pristine_git_object: 3fcb3f49302af9c7394c00f4946576c5e3ebdabd + last_write_checksum: sha1:538a99bb1e80b20be3d701a5f93f43d6d393fe63 + pristine_git_object: 9b69aa5af1a7e56c08251d08bc8401f93bf00683 docs/components/chatrequestservicetier.md: id: deaf591bec38 last_write_checksum: sha1:8fa53b0f868c99934b83719b7c0b6b44b1f960eb @@ -598,8 +620,8 @@ trackedFiles: pristine_git_object: 95203396fad26d48c76b23f3481b6167291500e5 docs/components/chatwebsearchshorthand.md: id: 97a5522cf188 - last_write_checksum: sha1:3058010c14073b6e201adb7400622a012abfea4e - pristine_git_object: 638c8a94151ac17091347e705f6eb35399b70d98 + last_write_checksum: sha1:d92fefbf47d16c3b91fc092c2b16f30ed9b3568b + pristine_git_object: 81769e42e56f38354130eaf772b0fa1168f70a14 docs/components/chatwebsearchshorthandtype.md: id: ec8d82e4169d last_write_checksum: sha1:11a35b858e9630405ffdde10c89e60ed33fbed45 @@ -718,20 +740,24 @@ trackedFiles: pristine_git_object: ada009ced29fcaf5d19e81bc67276fe9718ccfaa docs/components/createguardrailrequest.md: id: 5144188aed43 - last_write_checksum: sha1:78119c6dd8cc0b40009afb1da489638ac35f16b6 - pristine_git_object: 77b840640f4d30cf4513745df984d3a950b76c12 + last_write_checksum: sha1:db9d47079aa62c89dc20ab215f5bf22c62c93666 + pristine_git_object: 971a9785fccd13b44b19fe61ce530b544416ffa5 docs/components/createguardrailresponse.md: id: 94a5ed00d7b9 - last_write_checksum: sha1:bad318ece1219797a8db60631961006554b38cda - pristine_git_object: bf3c2f7a4c16ba60ecac1fef7a733cfe6c9efb3b + last_write_checksum: sha1:a6354ced927a1dce6bee519fce24ab1f46eaca54 + pristine_git_object: f8e3aca017593dfa3e941dd7c02b0127916a183b + docs/components/createworkspacerequest.md: + id: c81e27cca23b + last_write_checksum: sha1:9895786b65ad4195a260f2fc7a04090a240463e1 + pristine_git_object: d43defe1fc5d1037b75c60c910cdd6a43e286977 + docs/components/createworkspaceresponse.md: + id: 32307c6ed876 + last_write_checksum: sha1:42397009de7a6e3189fc86ba6b6350f1338b09fe + pristine_git_object: 5f467ec57a3ba214e27340588fee0d303688bd21 docs/components/customtool.md: id: ff0ec1b8ea8b last_write_checksum: sha1:1da938f1452f026020f8f3c617e2ee3fd11b78e5 pristine_git_object: 6cc1ff6a2b47a8fa754fa22f63506126b9b9d0a3 - docs/components/data.md: - id: 097aebaf54b6 - last_write_checksum: sha1:b2407ba7d2f14428d780fc4196d96622d2d4dc07 - pristine_git_object: 386321b1fbeae16dfa3fc07c073b7f1dd8844c1d docs/components/datacollection.md: id: cacd95d2ebf9 last_write_checksum: sha1:1d9eb4c12467860d5ef9edceb6456a4b9d6de643 @@ -756,6 +782,10 @@ trackedFiles: id: 78770374c8ed last_write_checksum: sha1:1ceae5a23d706b158b011b234d968a0fd495d2fc pristine_git_object: 7e0a483e6690842ba12d2a9349a9e2f0c79df8c9 + docs/components/deleteworkspaceresponse.md: + id: df0fb6410027 + last_write_checksum: sha1:e5eebf42ba059f27a266fee18c032e193fa382e6 + pristine_git_object: ba3c2bfda961110864cb08434398c94c698415f5 docs/components/easyinputmessage.md: id: a4927c37a92c last_write_checksum: sha1:9da1d4db9cd27f00a6b95f2bfd770e3e1f3755f0 @@ -1012,14 +1042,38 @@ trackedFiles: id: 88a512c5f9ce last_write_checksum: sha1:611201e2dbd2c8fe1c501b5365bc06367bc5370c pristine_git_object: 2f4629220306ced5674a9ef70dbcbce1f908b93a + docs/components/generationcontentdata.md: + id: 1085c488fd3a + last_write_checksum: sha1:186d3e8118f6d393d524a91e2ac06772a7eaf818 + pristine_git_object: 8bad571af50a9bc78e4ccc4b3f1d1911aac8c3b4 + docs/components/generationcontentdataoutput.md: + id: e4651dfa179c + last_write_checksum: sha1:3cedede3c273cc7bdd2971e7cd252f487729770b + pristine_git_object: 6847cf3f3a47d2911badcc90a5723a96f22f106d + docs/components/generationcontentresponse.md: + id: b2bded35fce6 + last_write_checksum: sha1:4f347840c969a60a734230601882eb01b4d64aaf + pristine_git_object: fb8acc9bc1fcee02384155f50ab24ac160d35af6 + docs/components/generationresponse.md: + id: ba81b6e0c164 + last_write_checksum: sha1:e7362ecc7f743d516fbb13fb0045739cb6e33eec + pristine_git_object: 20c523d806b2dae5c3c425f2020a5e5ab6079774 + docs/components/generationresponsedata.md: + id: 1059d258bbf8 + last_write_checksum: sha1:a46a57764116991a6fb7360e1a04b00ed456134f + pristine_git_object: 0295c9dbc04f8e83e75cd20059cb0a26e668dd72 docs/components/getguardrailresponse.md: id: eac79c96805c - last_write_checksum: sha1:da1d99fad316a21e9db253b30bbf9d590062fc59 - pristine_git_object: d7de0f8ddb4847ec9c60c25f3d46ab408aac707d + last_write_checksum: sha1:800319e81a56baaf0759c26a90e0050b17f5851c + pristine_git_object: 2ce7c298c24262dfe049e0ea2ef387d28f8cba90 + docs/components/getworkspaceresponse.md: + id: b65ac2b42215 + last_write_checksum: sha1:620b73e08c2b9fcd533b9106d392893cf6b16939 + pristine_git_object: b2f30b6a00e10002ae838d96747bc653fc219594 docs/components/guardrail.md: id: ce84902d4cc2 - last_write_checksum: sha1:bf7a0be7e156abadc6adf0d426c40bf7c088bcd0 - pristine_git_object: 994b02604a9be6a0e9705b182621e9a2df085864 + last_write_checksum: sha1:24480751267ac11c267c1b73b839c22f9738827d + pristine_git_object: 1e5405c60ec7f2bce71f43f25786ac18ebc58aac docs/components/guardrailinterval.md: id: 79efeedcb880 last_write_checksum: sha1:3c071c14943c7b26474847eee46925ae884a8a6b @@ -1070,16 +1124,16 @@ trackedFiles: pristine_git_object: e38b5c19b6356f255783dfacea66b45418679e21 docs/components/imagegenerationservertoolconfig.md: id: 4086d42eed1b - last_write_checksum: sha1:9da8f5dbeb8e76419b5ca3041965105934b0ad9b - pristine_git_object: b3fbb8ea61ef0f98681cc1507b2f192556822141 + last_write_checksum: sha1:4be4af2bb484ca26d779f052da6a645dcb4d912c + pristine_git_object: d1bc3aceee221331b9f45bd00bbd8d0ea75a4a73 docs/components/imagegenerationservertoolconfigunion.md: id: 7ba56d56f6bc last_write_checksum: sha1:99eb92cf87c2e68e8db530d3ebdaaff6be117587 pristine_git_object: b9319d587cbf5118b4b12874b67a4a86ec4d1b16 docs/components/imagegenerationservertoolopenrouter.md: id: c5bf0021441a - last_write_checksum: sha1:25069e75ba4a6a6b98bc6c168ef09c2e2960f630 - pristine_git_object: edee38367aaf7511e2a5d3f386d493005ce3c544 + last_write_checksum: sha1:01a0ffcf8d7d3c806c1135e73ed4926ca5d05dc9 + pristine_git_object: dce650cbf584a1798754d1610898a9432b544d28 docs/components/imagegenerationservertoolopenroutertype.md: id: 420c811d4561 last_write_checksum: sha1:6b8ce48b3e662ea3bfd8a9be737e43cd1b051e39 @@ -1096,6 +1150,14 @@ trackedFiles: id: 4ce388faaac0 last_write_checksum: sha1:3aad9a98e1bb15a540b9f8307a1c9524432e7959 pristine_git_object: 1e12f5f39649bbc28907eb579d26b1dedcd634d9 + docs/components/input1.md: + id: 8f1c3029546b + last_write_checksum: sha1:d663edec52736ced26235eef64a7cad9e2d9f321 + pristine_git_object: a6a125b4880fdc36a4a48a71d81d1d85a81390f5 + docs/components/input2.md: + id: 950f7afb714f + last_write_checksum: sha1:0f7308af83357715e138b0027cd723278d28b256 + pristine_git_object: 18930bf394330c4853277ad0d38622adfcef1229 docs/components/inputaudio.md: id: 3bad9d0f3bfb last_write_checksum: sha1:911ae8d63fb5a0fd4b27d922aa2547cc6e973523 @@ -1272,6 +1334,10 @@ trackedFiles: id: 331af539199a last_write_checksum: sha1:136d08c7846075581f141aa89c74743a4684585e pristine_git_object: 7b6d8235fbeb431c27cec3d689c6d5aa558d8d40 + docs/components/inputunion.md: + id: e92a20448613 + last_write_checksum: sha1:6caa00eb5847278d7fa4033f863a9719fece403f + pristine_git_object: 3667170c054053b09d2a34627f2cc1b1ed9cc01f docs/components/inputvideo.md: id: 5775df94513a last_write_checksum: sha1:9096278894b57ece97edefbfcfbbbae5f91fb259 @@ -1324,6 +1390,10 @@ trackedFiles: id: b34008c23794 last_write_checksum: sha1:a80fc686dfb13c7179c1a49808ca9d10fbca0cec pristine_git_object: 16092238affd61950df82d45bc46ae0be98df7b3 + docs/components/listworkspacesresponse.md: + id: 8cc6fbfc9dfb + last_write_checksum: sha1:ad9f94ea6eafd3cbd5d2c2dca61b3ac6f0403a1f + pristine_git_object: c4b9ff0e4cc402706ad28c35f75189aa2478470a docs/components/logprob.md: id: 351b5c050527 last_write_checksum: sha1:fce93846d1c33a013a40764c5e00e6191982bdbf @@ -1386,8 +1456,12 @@ trackedFiles: pristine_git_object: 317190772f743d2aba63c4dad770827b46688f6a docs/components/modelscountresponse.md: id: abdad0c1a02a - last_write_checksum: sha1:6c32f935021d24ff9eeae39f903f71b9ddaedf3d - pristine_git_object: 84bbce80ebf7ce2a93ad853bfe2f2a80a8395077 + last_write_checksum: sha1:50ae205604eddcbdced268b8cd3e1ac06f0dd7c0 + pristine_git_object: 4ad6e6a692b19b29789b7a505fae3df72b3fc19d + docs/components/modelscountresponsedata.md: + id: 98e05b6bdddd + last_write_checksum: sha1:62caa9966f2730ed93eba332041916903d279228 + pristine_git_object: d661997290e487a9d0920293830a81afb8b4a853 docs/components/modelslistresponse.md: id: 37e791d4f265 last_write_checksum: sha1:fb8fe5748b0c7a5e1e515233cad4d9524cd342bd @@ -1550,8 +1624,8 @@ trackedFiles: pristine_git_object: e88886f738fef9ad22e5efc74e3e0ea2cd8ceeb3 docs/components/openresponsesresult.md: id: 9795b7de3f92 - last_write_checksum: sha1:5c1834da4b2297e6cdc0328c8d9c026303f6b9b3 - pristine_git_object: 7980a1a0edea51a2fa9cde48f5f9554029ef827b + last_write_checksum: sha1:616759398ca0662e4e9b6bf424727b8b019cc379 + pristine_git_object: 1dd4efe3b7032b9dc3c86e4202bde0c8dcd97360 docs/components/openresponsesresultobject.md: id: a8c7f7bc0b24 last_write_checksum: sha1:3df49df80dda49ea4cb53f913931fd4754769b66 @@ -1576,10 +1650,6 @@ trackedFiles: id: 16e1e8501319 last_write_checksum: sha1:6d83c960b1b1f5be7be0f0f6f6b71d86fb160cc7 pristine_git_object: 947a0b4decad7398ad4ddd0ff70a3a8cf95c5e87 - docs/components/options.md: - id: d57f3108a48d - last_write_checksum: sha1:33aba904de1c5bbbb772a34eaf56daa859a81143 - pristine_git_object: e695cb694be73ef388c6039ef8803a6ce146e500 docs/components/order.md: id: 16e6ae6962e7 last_write_checksum: sha1:a060705e562a2f3fc024c4fd8aa80604535b0bc1 @@ -1702,8 +1772,8 @@ trackedFiles: pristine_git_object: d7d592b96122136f2e4becd5edc72b95062d6237 docs/components/outputimagegenerationservertoolitem.md: id: 0a39a1c10949 - last_write_checksum: sha1:b7ffc78b0acdbd0c9e5c9b6a777e8e2e39ff16ee - pristine_git_object: 563b9e780a842074f1ea9da0a9b81133833609fc + last_write_checksum: sha1:794cbf0f99dc7ea2739d94d9ab96e2f3f07bb323 + pristine_git_object: ec9409ff0690e6787b0f464c83aa9cf5753fb4f6 docs/components/outputimagegenerationservertoolitemtype.md: id: e8483d8856aa last_write_checksum: sha1:43f034d1b716ef2878be034bb01e836395c7b686 @@ -1722,8 +1792,8 @@ trackedFiles: pristine_git_object: d9e663fcae49dba7885223f4f0848aa9f9a23002 docs/components/outputitems.md: id: 92565743132e - last_write_checksum: sha1:0080f5650ea184795c28fc44983eec2989b58634 - pristine_git_object: aaa3a85a2a72fba77cc2a3e939d8df3a00e1073e + last_write_checksum: sha1:58d753ef954e4e8d45c7d74a14257fac307eaf3d + pristine_git_object: 146c12f4dd9b8583c2a7874d80362b9182b1bb1b docs/components/outputlogs.md: id: 0821eefe9546 last_write_checksum: sha1:1ff4592093bd2fe28038cc8db28bee6a35025c96 @@ -1834,8 +1904,8 @@ trackedFiles: pristine_git_object: acbedfe1aca86bfe4d682abcd075b89d872e9e06 docs/components/outputmodality.md: id: 8e1105f01041 - last_write_checksum: sha1:6fe20f70faa190a188e00961cb8f13edb2dc371c - pristine_git_object: 7b8edcffcb042e3dd1115d6a2f976ac4d5967461 + last_write_checksum: sha1:f9d0e822a4f2da4631f55f01e6a168f0cfaef225 + pristine_git_object: 1644bdacc55db827ad4cb087550ddb8ceae11991 docs/components/outputmodalityenum.md: id: 9e9b5b751962 last_write_checksum: sha1:e445a894b182e6fd805d5b9310d13b8a8520349d @@ -1864,6 +1934,14 @@ trackedFiles: id: 2efd271441f7 last_write_checksum: sha1:36a63bf61d927a595f3e58dd0b607a8937db9ff3 pristine_git_object: 24800454b81c6b2f9a0180f283d793216bd90384 + docs/components/outputsearchmodelsservertoolitem.md: + id: 17da96b2505f + last_write_checksum: sha1:da40a4743d0ae6385588944cac094ce9bd4d14c9 + pristine_git_object: a5e1fb16896dc6841105b7f01e735539b8876a5b + docs/components/outputsearchmodelsservertoolitemtype.md: + id: 37be34b271c8 + last_write_checksum: sha1:237762e35b5cf89509bc3bf8b261f174016d3903 + pristine_git_object: dc9df5ca2122a044efa3d2ab1d13b2f957f67d34 docs/components/outputtexteditorservertoolitem.md: id: 6c114519044a last_write_checksum: sha1:7b90b5ce30ff6df03376e337e266dbdadfa751c0 @@ -1912,6 +1990,14 @@ trackedFiles: id: 74a7ffefc804 last_write_checksum: sha1:a278eb563604b86204eccdf754760624f1dac8af pristine_git_object: 0fc28bfa15cad7eada2db5f199ebb13f32e68d4f + docs/components/paretorouterplugin.md: + id: e4afc1e2a656 + last_write_checksum: sha1:8721ee5f64c6bb07fcbc1e3d40c04d9c3969e182 + pristine_git_object: 10c1195d432607fab7047d13fc5019e9b70bc09f + docs/components/paretorouterpluginid.md: + id: 353199e41ef9 + last_write_checksum: sha1:811dbbce35aa0fa7c3d55727e0061c1a6e6acc62 + pristine_git_object: 08be131910dd1e6bd88a103b022080eafdc54571 docs/components/partition.md: id: cc74439b2251 last_write_checksum: sha1:de88a6dedcd65f73fca2bd1913f7cbfd0d62a4ba @@ -2000,14 +2086,10 @@ trackedFiles: id: 58d2af57c508 last_write_checksum: sha1:900904dec588ecd97ed17fc0d99896082494f729 pristine_git_object: ecc924e0faf698d142621fce07381ec15ce6d725 - docs/components/provider.md: - id: ed488bb1dc3f - last_write_checksum: sha1:06525d0f66030e9d8d4aac140d3ae780c044e7ac - pristine_git_object: 56d2fd0642e93c72502597f761e75cf50ef6a597 docs/components/providername.md: id: fe24a77d9911 - last_write_checksum: sha1:47af6679dbedcf8d8d0ac8995cfc9cd3020a6b7b - pristine_git_object: 22effdd1f55bc9d60648a80e825e17d4b94b01c1 + last_write_checksum: sha1:f824508d7058025fba04264c5086e374c23e0a76 + pristine_git_object: 1136a77ac827853575c6ae83a4efdf0bd097fec0 docs/components/provideroverloadedresponseerrordata.md: id: c2a8cc4ec6df last_write_checksum: sha1:1d206d00dc0d91b5ceec470579c6ce345cc23d29 @@ -2022,8 +2104,8 @@ trackedFiles: pristine_git_object: 9dca4ee9d4a9ec0a46ce21fb3823f05e8e119334 docs/components/providerresponseprovidername.md: id: 800bab487911 - last_write_checksum: sha1:befe2d2077d8abc969729b09ce4aba6a2b14bb37 - pristine_git_object: 73838c84a7682a4b6903b0ab3383b6514ca6951e + last_write_checksum: sha1:2674cebb5d1bb256776d982001c05305c0a0e419 + pristine_git_object: 49b34491b8fc5c7b70462dcdd8d16fe0b0d3c002 docs/components/providersort.md: id: 290449b1880f last_write_checksum: sha1:f15d65e5c226a222c3bfc0b9f55dd9ca0443d415 @@ -2244,6 +2326,10 @@ trackedFiles: id: 21aa2dcdc770 last_write_checksum: sha1:2ea5efe6bbf68d068fdf992ae335cc4fc2fcf7d7 pristine_git_object: 86cd00504691f2fdc33549cb33e9b07d0c31dd3b + docs/components/responseformatenum.md: + id: fef1c313ab3d + last_write_checksum: sha1:935d113cac8fb79702adb5bc30c7540035ebb4a1 + pristine_git_object: 89912bf57d12ca881110486c0ca69342d38accd4 docs/components/responsehealingplugin.md: id: a9a3b6d3e0c1 last_write_checksum: sha1:ba75992bae3382339f5f1e654a91da4cdd1f7eda @@ -2278,8 +2364,8 @@ trackedFiles: pristine_git_object: fa27d12757cb1759f2d445125705def9e13a57b9 docs/components/responsesrequestplugin.md: id: 20da7be12bb9 - last_write_checksum: sha1:14dbd6cd32c51d333548f2c43772c43540dc97fd - pristine_git_object: 39234e56fbc2e0bc654e55a7811fca1169ded5da + last_write_checksum: sha1:a743d9108f994a7ff4c01e96e9048ec4e1d3e99c + pristine_git_object: d7c9512bf08ec8f5e491960fac30866228dc5d69 docs/components/responsesrequestservicetier.md: id: 79d0f5c6bdbe last_write_checksum: sha1:759cbf960f90a2680f905be11049e8f88cf6ecda @@ -2290,8 +2376,8 @@ trackedFiles: pristine_git_object: 98ae0961e2afdbf95cdc71e2eee23c9c06972889 docs/components/responsesrequesttoolunion.md: id: d6a807777d03 - last_write_checksum: sha1:31403e31e2adebdf6ed12d7c2ddc24637826381e - pristine_git_object: 944ee6cc07e0e55107e75679efeaf3fa65e0a1d7 + last_write_checksum: sha1:dc62812bc7609748f804d85e431aebcbf6df700a + pristine_git_object: cd7293375ea730cca4fd28461c2266787f9e2aba docs/components/responsesrequesttype.md: id: 5bd80a5ef99f last_write_checksum: sha1:96aba92528f15b2e26760ec90539b8fd7a0e9cc3 @@ -2306,8 +2392,8 @@ trackedFiles: pristine_git_object: a3dc6194e6abc9a0cc62bd9e20b7131fe106ab36 docs/components/searchqualitylevel.md: id: a4e6b74956c7 - last_write_checksum: sha1:bd89df72f13cb501966c208333fa00f123eff131 - pristine_git_object: 05f28d4664e7c5101ed1629a347dcec7e3c6904a + last_write_checksum: sha1:90dea358785b675667f739970aaf2d4cf1c958bc + pristine_git_object: f9eaa018221809ae46078c14c4ca501f8aa5cdd3 docs/components/security.md: id: beee40001fda last_write_checksum: sha1:45b7b8881a6560a468153662d61b99605a492edf @@ -2332,6 +2418,18 @@ trackedFiles: id: 063e11fe2d35 last_write_checksum: sha1:c8046f6bc1c8c61e823f49c846fe7ee6af3d0cdc pristine_git_object: 4b07bd1be51b737783b69c8b3d71725fd4484a25 + docs/components/speechrequest.md: + id: c5cba48286f8 + last_write_checksum: sha1:956140ea1f1ae63bf64fb9ca7e300c836c2c3eaf + pristine_git_object: cafc4863b5ddb822f56577f9261d8acc3b23803c + docs/components/speechrequestoptions.md: + id: 9c09cb5986a9 + last_write_checksum: sha1:3e8767b2916463f4affb9cad56fe3545d37f998d + pristine_git_object: 1e7a60e31d98591916d7b73b48b65eb2dfc19387 + docs/components/speechrequestprovider.md: + id: ced2f821fced + last_write_checksum: sha1:3505fce9160da45dd28a59e8c5d4b814369499f4 + pristine_git_object: 6cfa9633d218045061d7c529053b6915e39f79b7 docs/components/stop.md: id: 0d74a157c3ba last_write_checksum: sha1:f1b797e3188274e4411a26f0934c1d455bd85bbb @@ -2412,14 +2510,6 @@ trackedFiles: id: 0cf5ab254bc8 last_write_checksum: sha1:632fc2775ec4066a2b1ee403579ff59bdddb4a91 pristine_git_object: 4b82eb64344981f49f6a8fa220eb817427f4de78 - docs/components/textconfig.md: - id: 11301a29023b - last_write_checksum: sha1:62e407146de6b41467b9ec8c630ad8ad8a3f1743 - pristine_git_object: cb4ddd8f20f0302ac0550682d8e75f162c78c0b3 - docs/components/textconfigverbosity.md: - id: d49483ecf413 - last_write_checksum: sha1:a51ce28b6733aa1b579c3f9dacee605e08086497 - pristine_git_object: 0bdb609ebbb664477effde646423a619b74738b9 docs/components/textdeltaevent.md: id: 339fe3591c0d last_write_checksum: sha1:97aed7ba0e23221806738f4ed7819f8aec0db957 @@ -2438,12 +2528,8 @@ trackedFiles: pristine_git_object: 5c73058b054429983632f0542af4fc0fb50300c5 docs/components/textextendedconfig.md: id: 669e1815f825 - last_write_checksum: sha1:a64da07e11d1437c3c7453d7a6c8d3f2757a8af6 - pristine_git_object: cdda558b74a056f33dbc0f2cf63a02265087d7db - docs/components/textextendedconfigverbosity.md: - id: 355071ba1bcf - last_write_checksum: sha1:9457b6011994833a86a2223b544d9d7d1b7189b6 - pristine_git_object: bbb9988342a55552bdd3c0985cd9f6aa9a302bdd + last_write_checksum: sha1:7751fbe499ffee299268428faa3a3c63a5541796 + pristine_git_object: b876df7514e8427c7eb7bacd42461924d5b0796f docs/components/tokenizer.md: id: f1ad3417d8d1 last_write_checksum: sha1:4223f630f7d880b9288fb654f67817560fb2dbd8 @@ -2534,8 +2620,16 @@ trackedFiles: pristine_git_object: 36829dd7af525b1289daa3a84c583689dc5ae125 docs/components/updateguardrailresponse.md: id: 311d3e7a185a - last_write_checksum: sha1:240e2fc38ee1954caf6afb473cd9d85030b28285 - pristine_git_object: d88f7735cfa90be90763bbcfc7cbf1b8e12d7cf4 + last_write_checksum: sha1:30d7c6ef7475a6b09fbf3f3cd67cdc4fb3a4467a + pristine_git_object: 094c4b352de1442c4aac33bf2790f563dec3a20e + docs/components/updateworkspacerequest.md: + id: 0fa61bf22fc1 + last_write_checksum: sha1:5dd78e26e38451ff3dc8fb69a3210a42b7725b94 + pristine_git_object: 67df9c0c21ff7fac081bf9605c6f2b0c9c61e048 + docs/components/updateworkspaceresponse.md: + id: c8e4b8fbf004 + last_write_checksum: sha1:39db19593561aba4e4de2750d9b40a5ed39e7433 + pristine_git_object: dd0c048e521e4f2653a2c97621ba6278374efa97 docs/components/urlcitation.md: id: 02c4f88e5f51 last_write_checksum: sha1:5d5a717a552b86279bfe20c6125cb0561d2052dd @@ -2560,10 +2654,22 @@ trackedFiles: id: ad5d1b284346 last_write_checksum: sha1:30ebb41e8bac9a8d817b2c0ab0a9e9fded4a73ee pristine_git_object: 0698d06289a06a6cfcd35f7069f2ef64a0aa0e25 + docs/components/verbosity.md: + id: 0a9da5ac382d + last_write_checksum: sha1:76ec453c1e767ce0f8c76afc0617cdc7ff29b60c + pristine_git_object: cf10c9e56352e1ef074e794b915639774a0de872 docs/components/videogenerationrequest.md: id: cacead3ac9fe - last_write_checksum: sha1:e9f69f5b244d468fbf3ecdd1872671fca4b4fc9b - pristine_git_object: 437ac8fd1a297aebc6dd9369947b80d85530cb92 + last_write_checksum: sha1:1606e4cb730429c06fefaebe72247c59d665bff5 + pristine_git_object: 206d071cddf0a6b441a7081a2c6de70bb598269f + docs/components/videogenerationrequestoptions.md: + id: 6d200b026e3d + last_write_checksum: sha1:9d64a60836c3960cc3cf45ec64c62a728ef32ac5 + pristine_git_object: 237bc76d8368c196244d1a86d3845982e53e9fd1 + docs/components/videogenerationrequestprovider.md: + id: e2a64e74f555 + last_write_checksum: sha1:0e299c75344f2096b90a1a8a8718de5466ad388e + pristine_git_object: 9817de90866a6f06d9cb104e93d7892a3db29254 docs/components/videogenerationresponse.md: id: adbbd66af4bd last_write_checksum: sha1:52c73fc2047792e3194f316e3182a96f8c7b85f2 @@ -2584,6 +2690,22 @@ trackedFiles: id: 6a46f08aab47 last_write_checksum: sha1:63812cb97f0ba13e4e9e0e524fb82edccecca061 pristine_git_object: 45a68af199ccff5747b446511dd9fc1c550a4d34 + docs/components/webfetchengineenum.md: + id: 7e88b8695736 + last_write_checksum: sha1:aa027062e0dfd9b2e8746f06979394b4f0857ec6 + pristine_git_object: acda6507de669a89a698226275a143c0e6f38776 + docs/components/webfetchservertool.md: + id: 16f65007e382 + last_write_checksum: sha1:377497147ada29f671b0713981227fb8e1dbf7db + pristine_git_object: 2152aba006b34b1d758e75cba8cf141d7af54223 + docs/components/webfetchservertoolconfig.md: + id: 96f1a4842e80 + last_write_checksum: sha1:46e6da0ee904c6ea8e1e96aa95ee30b3024058c8 + pristine_git_object: ad158564b71e6f1e69c77b59ddda078979995b87 + docs/components/webfetchservertooltype.md: + id: 23175d499624 + last_write_checksum: sha1:7072da0ec7dac5426abd235fea4347695ab176ee + pristine_git_object: ea6c00679c7118ddcb43185fc5f34ee01c148be2 docs/components/websearchcallcompletedevent.md: id: 8c338a61bc9d last_write_checksum: sha1:b46bf9e0c87df24c83fba70f4a0ca91648680c22 @@ -2610,8 +2732,8 @@ trackedFiles: pristine_git_object: f1771d0b194da9cadcbe7176c43059189745af44 docs/components/websearchconfig.md: id: 3fcee95e24a6 - last_write_checksum: sha1:f5edbfa631a4a020b7e4d2c4e2abb5e7081681d7 - pristine_git_object: e619e700a585c8daefaba731cb926733cb917f91 + last_write_checksum: sha1:9511c34d7ddffe6f4d171b7235cf29ae46f2c9d6 + pristine_git_object: df8c7c6991ee852ae3c32de95386cc79c32d6ee4 docs/components/websearchdomainfilter.md: id: 47d067b8286d last_write_checksum: sha1:bc0207fdf5478614ee90906ce70c42e57506378d @@ -2676,6 +2798,18 @@ trackedFiles: id: ac432a0db67a last_write_checksum: sha1:6b322242229459f409a83243db53ff8069fe1a3f pristine_git_object: 8213d86aa4dea092924605829dce95a1f31b0897 + docs/components/workspace.md: + id: 0a15ff43e01c + last_write_checksum: sha1:34fabbb9d6362a84aaeef3f8f92ff024097830ed + pristine_git_object: 591977e28a5f319d0722b111d7f8fed7eebf7a77 + docs/components/workspacemember.md: + id: 250baf73019f + last_write_checksum: sha1:d0079b9edc10857c5d2fd55b8122851e235dec21 + pristine_git_object: 31e122462373cfbb603a4e35d88810743e9e585b + docs/components/workspacememberrole.md: + id: b6a965f120c4 + last_write_checksum: sha1:3315f44ee8ccfccabfcf89f32cb7d585864593be + pristine_git_object: 00592d06a5c490ccce759f0b259f756f3f11c104 docs/errors/badgatewayresponseerror.md: id: 32126b40d635 last_write_checksum: sha1:86b3a24f2523bb4df0972bf2fca93dceb7a190a2 @@ -2744,10 +2878,14 @@ trackedFiles: id: 4343ac43161c last_write_checksum: sha1:562c0f21e308ad10c27f85f75704c15592c6929d pristine_git_object: 69dd549ec7f5f885101d08dd502e25748183aebf - docs/operations/apitype.md: - id: e271bff20dc7 - last_write_checksum: sha1:589d9ed0a91014cf2b66f83a118259aafb78983f - pristine_git_object: ffff0b9ea5cb410b51798b848ccf40a763edc216 + docs/operations/bulkaddworkspacemembersglobals.md: + id: 6cff183f93a1 + last_write_checksum: sha1:39941ebc9a51b0189aed03680e2168e25b7c9692 + pristine_git_object: f4a5325dcf71a943b6b1d01679587f2b0b291fd3 + docs/operations/bulkaddworkspacemembersrequest.md: + id: d8246fdf3e0b + last_write_checksum: sha1:156694bd17ba999b2ce0886da7153e7d349beea7 + pristine_git_object: df933fdfe35d136462f083cd40afb3d997171024 docs/operations/bulkassignkeystoguardrailglobals.md: id: 10cab63c9a95 last_write_checksum: sha1:5c7983931ef784a72f7dfec732eb7809d352c313 @@ -2764,6 +2902,14 @@ trackedFiles: id: 6d6c7e9ae12f last_write_checksum: sha1:8aa5702d46c01c87db1df7624b5125ee9bbc8edc pristine_git_object: f15474f24f02a38716f8c83f74a501a3dadef26a + docs/operations/bulkremoveworkspacemembersglobals.md: + id: eca056a05e51 + last_write_checksum: sha1:eb2295ca61d2b6f430119c3e42a3cda4958b2fea + pristine_git_object: e2a1edc52f0035b6d0f55403fc5ead2e351f2499 + docs/operations/bulkremoveworkspacemembersrequest.md: + id: ac8eba8ae2ab + last_write_checksum: sha1:ca7f3d49baa41f7996bff82eb7a6cae01fb3275b + pristine_git_object: ee134f45349379dd00569354b8aaa2a6d1aed373 docs/operations/bulkunassignkeysfromguardrailglobals.md: id: "491635767122" last_write_checksum: sha1:06e7a6b0f052e73e5cacd480e3bff8ab7756d0b0 @@ -2796,6 +2942,14 @@ trackedFiles: id: 01cceb61d42f last_write_checksum: sha1:7e1d73bd30584d55f4b116737c15d7c73cdf6a3a pristine_git_object: 522f4978a3c4e1d1c0d197b541fc57e745b7d4e7 + docs/operations/createaudiospeechglobals.md: + id: c67d64f11ad7 + last_write_checksum: sha1:a0026b1caf2268dd4a79177fa2bb630eca1498b4 + pristine_git_object: 0fbd4f1ad17604e5e31b457c0e3073d5389539c8 + docs/operations/createaudiospeechrequest.md: + id: d3139a0713f5 + last_write_checksum: sha1:dd894ff1ac1021c4202c1e8197f2a7b5d7d856d3 + pristine_git_object: c1ca2b7336e47fe365a59cebb643e9a780d44e7e docs/operations/createauthkeyscodecodechallengemethod.md: id: d598c7da9363 last_write_checksum: sha1:3b81340adcf218991f7829e692e64f484763de2b @@ -2846,8 +3000,8 @@ trackedFiles: pristine_git_object: 1ff75cb8fa59d2b7b756ea07e9f5849995b62435 docs/operations/createembeddingsusage.md: id: 2dc99973f6c7 - last_write_checksum: sha1:a51043a1dcc144a05c76c218c73ff3f413d313ec - pristine_git_object: ef0429e0678238d40901c630b48ab20680eee1f5 + last_write_checksum: sha1:b01ba733f5d1369b21a54b9f3bfb0e4059504b6f + pristine_git_object: 007fb235eef4ebb9b3dda14352e9a252004de4c2 docs/operations/createguardrailglobals.md: id: 34f5b2a17330 last_write_checksum: sha1:a43fb357b9c08974befd14a79da7623e72bc3245 @@ -2858,8 +3012,8 @@ trackedFiles: pristine_git_object: 5a414e26806520a98f50229a063f127f712054b0 docs/operations/createkeysdata.md: id: 903a6d611ab2 - last_write_checksum: sha1:fd7089b7dff765f863b0c02542c9e480656526a8 - pristine_git_object: f51f201d1e8c5c7216a508a652b154ca9fa20543 + last_write_checksum: sha1:78eb64a7cc6deeb3959adeb0ca705826f5f47005 + pristine_git_object: e60eaf9f45abcfdba122a7b04d1c66be31af48fa docs/operations/createkeysglobals.md: id: 15dd52d4443e last_write_checksum: sha1:032800ca0e8b56a1819431b9b27fa09a5b4b09c9 @@ -2874,12 +3028,12 @@ trackedFiles: pristine_git_object: f587de752afc6f5f82d55ba4b80f6d59336db24a docs/operations/createkeysrequestbody.md: id: 9aee51637cee - last_write_checksum: sha1:1d8572e91a7634a55014b51d6eff7be8e8e92690 - pristine_git_object: a384fabe3ae8b6d1fa3ead87957d9552591d7664 + last_write_checksum: sha1:dbd509a932f74e85a237fa1f4a2fab4c78af6c89 + pristine_git_object: e63e997bf3d6eba579db664fba80bd295c145f17 docs/operations/createkeysresponse.md: id: 42bb3427e12b - last_write_checksum: sha1:b3aab1702c99f425a12e00607278808682bcf666 - pristine_git_object: e74907571f4147d457e544df8bcf6e4bb5be38fa + last_write_checksum: sha1:e113e49e9b3aa54f0d8021d13be59fc533830a7e + pristine_git_object: 91744f3dce817f96d0f5bb44af9988f4c54feac2 docs/operations/creatererankglobals.md: id: 46c967a0d2ba last_write_checksum: sha1:9dffe3342695ec66163cb83423f441d527d4e561 @@ -2928,6 +3082,14 @@ trackedFiles: id: b8190b2b48e4 last_write_checksum: sha1:ccf223bd7e2958b01032fffc328ba43f0e6bf260 pristine_git_object: c9ce4f85e23827bdd48ebb8bf00525343eac73ce + docs/operations/createworkspaceglobals.md: + id: bb43600a84d0 + last_write_checksum: sha1:431ed0e1519765d8b94d50ac991a64f6e6241513 + pristine_git_object: 1f46dbb7552fe39db8fdf7209d9d5287f808bfa4 + docs/operations/createworkspacerequest.md: + id: 9aebad99652f + last_write_checksum: sha1:26e3648e75871274c27e60ed42715d7434223819 + pristine_git_object: ac92a748a5524ccb683ffb32dce19de3714a0e37 docs/operations/datacenter.md: id: b08a21cce65c last_write_checksum: sha1:9f399d250c42bff63295881990961f871a36b8a9 @@ -2952,6 +3114,14 @@ trackedFiles: id: 843ae03c4c33 last_write_checksum: sha1:3e34ea65b5397e4d1203306e4a08f12023ebfba2 pristine_git_object: cc7cddbdde6e0f31ddbec25b8a01e7ece0b8e04c + docs/operations/deleteworkspaceglobals.md: + id: c9f40cc89b0e + last_write_checksum: sha1:4131177651ca5ad33b7160b2f4b8ff74e2233152 + pristine_git_object: ef29294eda583f20fa40d5a544537cb72f1e98d8 + docs/operations/deleteworkspacerequest.md: + id: bd62f5b93ebd + last_write_checksum: sha1:8bd64edf9b0684036c34ab258b95914d46cf8520 + pristine_git_object: 980bab8fc4db27e0e7ef13f8799e0abd3ce8054e docs/operations/document.md: id: 640b715eb2a4 last_write_checksum: sha1:18b3bcf786efa0cf41dd10ba4c3a3a58c65cd134 @@ -3016,10 +3186,6 @@ trackedFiles: id: 37af8951de4d last_write_checksum: sha1:1e62836ec19a8aad8b0dcafd7799b71250a5c6f7 pristine_git_object: 2855d5b95d41a494bc7ffa9f85c74ff27a46ca96 - docs/operations/getgenerationdata.md: - id: 89a3aab8da20 - last_write_checksum: sha1:a535e1604ef9524eb8fb752711abd36dbe7219c6 - pristine_git_object: 7be5766a6c6a5f065834bdbbec761795c255689f docs/operations/getgenerationglobals.md: id: 0d6e856c5861 last_write_checksum: sha1:b5236815132dedf2b595fd520f1753d5ec8bb6e0 @@ -3028,10 +3194,6 @@ trackedFiles: id: c830d67c6a95 last_write_checksum: sha1:508adc1d9d3a03a5b6d12515ae9dd8f0b5b1c2e4 pristine_git_object: 8c54a7a47635c68bb980670de08a748d076a401a - docs/operations/getgenerationresponse.md: - id: ab03c2c610cc - last_write_checksum: sha1:419e7fafd845db9c63545b55bf6ab1ecd6a04371 - pristine_git_object: 989c19a3997fe21716eea833ef30eef8a980b733 docs/operations/getguardrailglobals.md: id: 6cf14d555b8f last_write_checksum: sha1:025d0a3b53ce5603d5d262a5db3ac54b5ce981d0 @@ -3042,8 +3204,8 @@ trackedFiles: pristine_git_object: ad49c823ffd11b46d8a8ce2a67eed5bd71d09db8 docs/operations/getkeydata.md: id: 4fba05263947 - last_write_checksum: sha1:15596e6d829847c4916aa0c8cc2d53f47cf43295 - pristine_git_object: 5ba4a1f8bb80defa921093533a2c7e5f1a4c45a2 + last_write_checksum: sha1:914831859afa885b63cf4d8a252ae16997007438 + pristine_git_object: c5a3db6f9a847b1fafaca37b04e58e0f63cf77e0 docs/operations/getkeyglobals.md: id: 7f990e0efc1e last_write_checksum: sha1:12dcc44c433951cdd8c4136ae1a70702e2b3e47d @@ -3054,8 +3216,8 @@ trackedFiles: pristine_git_object: b7b0a302d24d5964ce5a4bd24672d766362564cf docs/operations/getkeyresponse.md: id: c145b1a0dd5f - last_write_checksum: sha1:71d93bb73bc10bb55afe1d816f2c839b43528c96 - pristine_git_object: 7959a400503db3233fc13546d4b63995690d5984 + last_write_checksum: sha1:c315584d278f8f91f4437479ef8e95ce48b3130c + pristine_git_object: 72e8055b7d9b0de224ea423fab24a5614d6e9da3 docs/operations/getmodelsglobals.md: id: 61588f3029c8 last_write_checksum: sha1:f1565d45f3d06f070a8bc5ebe53d6205656b4b3b @@ -3080,6 +3242,14 @@ trackedFiles: id: 2eeac3b6576d last_write_checksum: sha1:9f6eec582ec3a568a6e14f57a687f0d360fc9748 pristine_git_object: db40577d2526f81edbcc38cef6517c598a98bc7b + docs/operations/getworkspaceglobals.md: + id: c0101897f893 + last_write_checksum: sha1:5ac92be2d4cd79c39bad1ed47a4e689ed44f3769 + pristine_git_object: 1bd5e0856557b36ea222bd2b685557bb0c75a7f3 + docs/operations/getworkspacerequest.md: + id: 6443ed4f7ead + last_write_checksum: sha1:c2ada6583e276f2a6c553b24053453853207b302 + pristine_git_object: 8b59d2daf235f8af09bf4664c8080ea7a0e5b3e2 docs/operations/headquarters.md: id: 3ccf7adf2542 last_write_checksum: sha1:24ca86fa6e2ebabf4cb034f6e368901e5041ccc7 @@ -3098,8 +3268,8 @@ trackedFiles: pristine_git_object: 655cca3c9dde2904f47187955063ed1def505e47 docs/operations/listdata.md: id: 3a3029670d40 - last_write_checksum: sha1:3849b8da164914dd9aedabf0982439c1e1bef02e - pristine_git_object: d8fcbe3395bbf9581c75455e3c0c49dae72f73a2 + last_write_checksum: sha1:1384605ff96cc0e7797d7dd2ff42752fe980d91e + pristine_git_object: d2a0b36ca2cbc9e297beba6471f7838b12b0b783 docs/operations/listembeddingsmodelsglobals.md: id: 29c3a9629ff7 last_write_checksum: sha1:a8b2d679ac7a558761e4289233d31084f4f7663e @@ -3132,6 +3302,14 @@ trackedFiles: id: 37a957da8f54 last_write_checksum: sha1:6892fe1fc31da14493b937171caec5f0fabb8daf pristine_git_object: 54cf662af701995f7c04272d932f9a2e2731beeb + docs/operations/listgenerationcontentglobals.md: + id: 86c60d8ee820 + last_write_checksum: sha1:6bb5e89777b8f25572237af5065a15ff5abea244 + pristine_git_object: eb76ee2d7e2516c9942be0fb3a1fe38177741f71 + docs/operations/listgenerationcontentrequest.md: + id: 2fd43266dedb + last_write_checksum: sha1:e9831ae9536176f944df36910bcbcde652545a6d + pristine_git_object: a025996eecd9ddf89a1eb10a5931becdc58983bc docs/operations/listglobals.md: id: 32d30e56f680 last_write_checksum: sha1:6b2661b1a208354794ee9f591c7581526d4641be @@ -3166,12 +3344,12 @@ trackedFiles: pristine_git_object: 4a623f2b7664346b324037e5e099cc19a22e0f99 docs/operations/listguardrailsrequest.md: id: c00416201071 - last_write_checksum: sha1:59f051110dcbb0bff3ef96bb5f098b561a810c43 - pristine_git_object: 65946b14204dcd39c2a43303d56e62439506a07b + last_write_checksum: sha1:e73c3a5dab8af65b85eafbacaa9c3e7bff99ce3d + pristine_git_object: e6f8126048b2344f42c86d1df9e472b9b0618bc7 docs/operations/listguardrailsresponse.md: id: 0e85f301aa5c - last_write_checksum: sha1:ef8d1dd575f41c8fdbefce870526326b9f213912 - pristine_git_object: 3046aeb171cb27a5ce37814a5723e3fae8ef2969 + last_write_checksum: sha1:8d23f9946567190f0e7c5ffede3c7ee23c20dc32 + pristine_git_object: 1bb2d533834b2fb807868313475e316c43499671 docs/operations/listkeyassignmentsglobals.md: id: eb16fba53032 last_write_checksum: sha1:823375a0dc84574748befda39821c790b469a6b4 @@ -3254,8 +3432,8 @@ trackedFiles: pristine_git_object: 922cc65548995e12edbe83abf86732c4190c7a97 docs/operations/listrequest.md: id: 40bb7fe37ce6 - last_write_checksum: sha1:36a84dbd57ce7422a28707449d645c467d77dcb4 - pristine_git_object: 5507b0aa07c0220cfdad1e7ec264f0d74cd2ac94 + last_write_checksum: sha1:dd1cdb3c672fb456b05afa8c838bfca5e7a4f2db + pristine_git_object: a5646bdeb6412940b9f6f2320315d9f1f58788d6 docs/operations/listresponse.md: id: 14450e1d6614 last_write_checksum: sha1:e432e29d3c7de8517cc16b59b958134ec561f09c @@ -3276,6 +3454,18 @@ trackedFiles: id: e0e776f67adb last_write_checksum: sha1:0d590826439a800f340367b6721265535827aede pristine_git_object: cbd65ef6238a8b9bb2c36bc37cbdb5a5e181d3ad + docs/operations/listworkspacesglobals.md: + id: 4ccdc202de01 + last_write_checksum: sha1:3eade1075e3b0f917a9afee3da18cfebbc4ac886 + pristine_git_object: c5967dd23490646d0a10ffa24df8aa0bab712c9f + docs/operations/listworkspacesrequest.md: + id: 93bf2ba40fbd + last_write_checksum: sha1:c0d073a290e63ae12c5099d38abc89f87d6ca525 + pristine_git_object: f46ba571e6e7cefe535e9a429ed811978fe697a8 + docs/operations/listworkspacesresponse.md: + id: 54505a70bba7 + last_write_checksum: sha1:90d3fcda91c48f1d0fdcda4f25854a2cb0957259 + pristine_git_object: 2b69f1d3a2517a84d2b98db1ba9c3224b1e475cf docs/operations/object.md: id: baee3544844d last_write_checksum: sha1:2fba5ecf3f93c90460a972666d6acdfb597cafad @@ -3284,6 +3474,10 @@ trackedFiles: id: 7a144a9c7a29 last_write_checksum: sha1:5f009bd24fd951128cdc546a6a5c937ab0426387 pristine_git_object: 4f8c20dd33dceafda3362119a1cfb1e5133810d1 + docs/operations/prompttokensdetails.md: + id: 4e204e79631e + last_write_checksum: sha1:ef933f99c0536defe9d256dffa169b8752d3acc6 + pristine_git_object: ed43c6c17061267e697480a5276ae5ae5e89145f docs/operations/ratelimit.md: id: 55ccfab9dcb0 last_write_checksum: sha1:ba383320e312bc87bd156a5d338f3d973376ec02 @@ -3330,8 +3524,8 @@ trackedFiles: pristine_git_object: 58ac81b1a12447b17d1da21f1b2275b32e2c2ca7 docs/operations/updatekeysdata.md: id: 989d7ddeeb46 - last_write_checksum: sha1:bf9ed436df63ce56f2b3c570f96bed89ebe42400 - pristine_git_object: 499598c65d3218fac3da20e1f6a42e8f6d691c16 + last_write_checksum: sha1:81679927eccfbb9957d4cc3454668f9cc60458dc + pristine_git_object: f1ef38208b77ffa7eabeb448a4d6b7894315dcb0 docs/operations/updatekeysglobals.md: id: fe06e9820a16 last_write_checksum: sha1:bc44e1936abe8d3ce77e223aacb0326143a4a812 @@ -3350,8 +3544,16 @@ trackedFiles: pristine_git_object: a6130fd788229ee52843ebbb537b1a9ef6601278 docs/operations/updatekeysresponse.md: id: 594f08a35b03 - last_write_checksum: sha1:f4a1479f7df16e20dcc7f9259245163c0550d423 - pristine_git_object: c1dde7cca4a08be11d91f1f97bea5d2a08ab5d6e + last_write_checksum: sha1:4590d0a24f313d60e4e7e18688eac54e755151a1 + pristine_git_object: 8b5ef1fca6768575bb49ed510fd83b27c77db805 + docs/operations/updateworkspaceglobals.md: + id: 1f2cac8a13a4 + last_write_checksum: sha1:aeffb26e2ce0ddfe37f1ccee67035ebe9041c673 + pristine_git_object: 5835a41ee1c7a0e557a7282271e8d31230b54e82 + docs/operations/updateworkspacerequest.md: + id: 719c33978f4d + last_write_checksum: sha1:3ea95e60674f4d0380f532123c75579855ac00fe + pristine_git_object: d5bd345f6faefd5e2448b7e6c6c15ae58df7d0d2 docs/operations/usagelimittype.md: id: f83f3fcb36f8 last_write_checksum: sha1:9c272d9908a57fdbd2b376e13c8fd226e7d4ce65 @@ -3362,8 +3564,8 @@ trackedFiles: pristine_git_object: 44f78122819ded7e472e28ebcf37dd8812707097 docs/sdks/apikeys/README.md: id: e2bd25998427 - last_write_checksum: sha1:59291dbba3de15ee545d124fb51232152b2c7e4a - pristine_git_object: 0e6da8598106dcd4130e57ef747c365915ed0c79 + last_write_checksum: sha1:82bec11fedf21eed760739e1adb08fec06239279 + pristine_git_object: 6e72f51df9e9811cee424032f7dba0887e15afec docs/sdks/chat/README.md: id: 393193527c2c last_write_checksum: sha1:74076b3d74207ac98f47e323bd2badbeeb604e3f @@ -3382,12 +3584,12 @@ trackedFiles: pristine_git_object: 2ce96e9a6eedf3a64256cd848615e9c4fd76c0af docs/sdks/generations/README.md: id: a7d12ae95fb1 - last_write_checksum: sha1:5846217fd9616824edcf5f41d6c54bc727f07195 - pristine_git_object: 332b5683cfe8c07ce4cae93b3247cd56f545f535 + last_write_checksum: sha1:70dbb18cfaff95cf5e398fed34ef969a683964d5 + pristine_git_object: 7fd647d02bfd29a3c7a5da0487761e89f308f224 docs/sdks/guardrails/README.md: id: f72b38a5a2a7 - last_write_checksum: sha1:e55d9d4938da4dd306775c589d48e99e7f169870 - pristine_git_object: 7bcdbb6e6baa29cc411a01eb20c3ee63064dc8ea + last_write_checksum: sha1:add43f6da46b1511a68bdc4bdf6b02cf6d20eaa6 + pristine_git_object: dfb499d3d37d059f1116ab61709e33e8abdb2884 docs/sdks/models/README.md: id: b35bdf4bc7ed last_write_checksum: sha1:ac628dd17b528a4772ef0797c4c47906faf8dc40 @@ -3412,22 +3614,34 @@ trackedFiles: id: e717bad14f63 last_write_checksum: sha1:02f29159f69cbc264437745e1d7cd54ed7e30ced pristine_git_object: a38d2b1b819d977c739f6a7b6f55344514c5447c + docs/sdks/tts/README.md: + id: 0c425074d09f + last_write_checksum: sha1:79fe29f6cb91ba8f06c6f3a8895fcab0cf5130d0 + pristine_git_object: e3a0a805a5697967ec8a2707a87999d5de41c8fb docs/sdks/videogeneration/README.md: id: b6dbf7b0729c - last_write_checksum: sha1:594c4bbe8b2396d28e4a5fe664e21de4d2dc8444 - pristine_git_object: b2f26971f1f28f4614f021ffdb87fe958522d029 + last_write_checksum: sha1:db9ea205685d76f45174013649f25848920b6e57 + pristine_git_object: 774b7f59035d0be7786292e39d2488b170273c41 + docs/sdks/workspaces/README.md: + id: 1f5b051a6380 + last_write_checksum: sha1:5191434ffb3d51b2ae8961b0920952ef08442c88 + pristine_git_object: 8abe8b06bf5f2c7df0e514b7fb2dfeeab8a516b3 py.typed: id: 258c3ed47ae4 last_write_checksum: sha1:8efc425ffe830805ffcc0f3055871bdcdc542c60 pristine_git_object: 3e38f1a929f7d6b1d6de74604aa87e3d8f010544 pyproject.toml: id: 5d07e7d72637 - last_write_checksum: sha1:fe68c7165977ede3cf438be1344f72e54cf67919 - pristine_git_object: c678027236e18070a0081d37fb78bfd44392a8c0 + last_write_checksum: sha1:62d35f2ecbe840540100da937920ee63980a1e12 + pristine_git_object: 9e4606d0c68e092819b9d86eb23859bd85c5ede7 + scripts/prepare_readme.py: + id: e0c5957a6035 + last_write_checksum: sha1:77f44b60b98bc126557ec27391f91dfba764bb54 + pristine_git_object: 03e9f9b59063c73d6f24995a77cdb971f3318d30 scripts/publish.sh: id: fe273b08f514 - last_write_checksum: sha1:adc9b741c12ad1591ab4870eabe20f0d0a86cd1a - pristine_git_object: ef28dc10c60d7d6a4bac0c6a1e9caba36b471861 + last_write_checksum: sha1:b290b25b36dca3d5eb1a2e66a2e1bcf2e7326cf3 + pristine_git_object: c35748f360329c2bc370e9b189f49b1a360b2c48 src/openrouter/__init__.py: id: 4514650f64eb last_write_checksum: sha1:da077c0bdfcef64a4a5aea91a17292f72fa2b088 @@ -3446,16 +3660,16 @@ trackedFiles: pristine_git_object: 07ace03229fd3267623c8f48665d2c3a67c3565d src/openrouter/_version.py: id: d8d15ad6c586 - last_write_checksum: sha1:8283c360656da42036d190270a7ad47551bc4317 - pristine_git_object: 4d43d337f71492564f02b651e5bfc78d27932ac5 + last_write_checksum: sha1:dd226a1c87253767a3a41d735f600db8980faa45 + pristine_git_object: fcebde34f88b9450f406b1563d00942dbd6d7b80 src/openrouter/analytics.py: id: cb406b5aaabb last_write_checksum: sha1:6d47d1ab3da9cb4ac9f0a2bfe442f1a82a614f35 pristine_git_object: ea004eaf47a1a48622d4a4276fba1e329d5559ab src/openrouter/api_keys.py: id: 876fac88fff6 - last_write_checksum: sha1:749055fb2e5719d1cdc72c4391d83cb498e37080 - pristine_git_object: 923a5f8c432f42427caa517e5fb1fab9b10f029e + last_write_checksum: sha1:4c037d1c4fc922061ca968b9cd961b2db69429f6 + pristine_git_object: e4a30e1b293a197994317a1e2169619fcbd0a0c6 src/openrouter/basesdk.py: id: c5733c5a1e12 last_write_checksum: sha1:71f242fd9955e5a17a8d055e2210cc2708bb94fc @@ -3470,8 +3684,8 @@ trackedFiles: pristine_git_object: bfa078ebbbff63f2c80860abf718fc57abcac2bd src/openrouter/components/__init__.py: id: 81754e97b3f4 - last_write_checksum: sha1:fba957e705a1e6222a64cdd71111390c6e14826e - pristine_git_object: e41de295792aaaea529e94d6c70c3ee111266202 + last_write_checksum: sha1:a304e679ec66e07766d3f933b9faa851147deb83 + pristine_git_object: 31559662bf7faae3417bed107d52e9ffdccfd2db src/openrouter/components/activityitem.py: id: 3bbe7d35f459 last_write_checksum: sha1:32b873ba5c0a9dbf5f0cf32c0217ce17395ae69e @@ -3516,6 +3730,14 @@ trackedFiles: id: 8bd09a7e873a last_write_checksum: sha1:c7c812629a7fc46f8064bc874b77424b30df9226 pristine_git_object: 22bd982575db23648faceab9dbedf75fa1f1cb38 + src/openrouter/components/bulkaddworkspacemembersrequest.py: + id: c042d4bce938 + last_write_checksum: sha1:dd5b69cce65985231a77351be04aadeecc85c46c + pristine_git_object: c7927258bba10e237972eb9ba2fdefc51c255c78 + src/openrouter/components/bulkaddworkspacemembersresponse.py: + id: 2b00519587ec + last_write_checksum: sha1:0a06047ed1719ecae11bd563513eb1f4b7527c19 + pristine_git_object: f46030f3a99672a57495047392e286d48cd1d4ad src/openrouter/components/bulkassignkeysrequest.py: id: f801d53f55d5 last_write_checksum: sha1:20f64607c61683eb2438b5b7411643e1340b2db6 @@ -3532,6 +3754,14 @@ trackedFiles: id: 6c7ce2235489 last_write_checksum: sha1:c708637e9d6aaf9eef90747b3da1af97c1b73e92 pristine_git_object: 2435b0dc46cc7e26a961eafde84ca68ad52a0a95 + src/openrouter/components/bulkremoveworkspacemembersrequest.py: + id: b420f0c56b0f + last_write_checksum: sha1:9564d3caa2da67db04624ffa5ada84fcdf31a610 + pristine_git_object: a02c46cd5ea87dc00f6db01f1be72f36b90b05ad + src/openrouter/components/bulkremoveworkspacemembersresponse.py: + id: 5c4c7d603c5a + last_write_checksum: sha1:e64c15f3c75ca08aad6b32a7555ce3812c59a520 + pristine_git_object: 69082ffbbb380c690ca659819bab53869b82f273 src/openrouter/components/bulkunassignkeysrequest.py: id: f7ef88765f9b last_write_checksum: sha1:a46b022e4264377b2d8c137f9d0df34824aa2100 @@ -3626,8 +3856,8 @@ trackedFiles: pristine_git_object: 7a6140f2b8afb0cde9b031322a4284c9cbce7e33 src/openrouter/components/chatfunctiontool.py: id: 1fcf92f8a7da - last_write_checksum: sha1:30bcc6404395f55b361c4e73a9f991f383a9b18b - pristine_git_object: b0c0d436e5389ed1f997414145bb00d605489df0 + last_write_checksum: sha1:1cdb5bb801463ed6c42bc59c91ca288a56061002 + pristine_git_object: 90b069fea5bb0c35c4920e60af9541db9ec57d10 src/openrouter/components/chatjsonschemaconfig.py: id: d2278e414fab last_write_checksum: sha1:69efa91d33e4767058c2d377814b820bb5104ab4 @@ -3646,8 +3876,8 @@ trackedFiles: pristine_git_object: 8bbde153b53887e426989fd5b0486b6dc1122810 src/openrouter/components/chatrequest.py: id: 5e39eaefa9cf - last_write_checksum: sha1:33d4df3eb6abbe51b5f825ad878809ae5eb04686 - pristine_git_object: 7559c771fc127e9e112fbf6fbb80ee6a0e4370ee + last_write_checksum: sha1:df3375b316ed3e5c072a30bc35c6a6e03924aaa3 + pristine_git_object: dc5ca5d5d75954f8ec30e36050f21f2ebf4c5e67 src/openrouter/components/chatresult.py: id: 9062fe2935fe last_write_checksum: sha1:b0a7c4966abc14496a4fbaf9d3cd596c845da797 @@ -3710,8 +3940,8 @@ trackedFiles: pristine_git_object: 9092aa329bdd58891c2c6f92a6d9c4228b37400c src/openrouter/components/chatwebsearchshorthand.py: id: 13091b97a3f6 - last_write_checksum: sha1:0b1c948199169dd81947509f41128c5df6d74e05 - pristine_git_object: 707f0cf6b3b874838ea24df2364ec8cc913df244 + last_write_checksum: sha1:7e2177b54ad09ddac268bd3f96cd953b53fcd5aa + pristine_git_object: a92eed6cd4d21c9e04a4e52aba3d277cc987a315 src/openrouter/components/codeinterpreterservertool.py: id: a72c520afbf9 last_write_checksum: sha1:f6123d9808c530e0b042e0a30fbb1a11a82096e6 @@ -3754,12 +3984,20 @@ trackedFiles: pristine_git_object: 22758a015ceb978263246b58da19d382ae38938e src/openrouter/components/createguardrailrequest.py: id: 34d69149fb33 - last_write_checksum: sha1:8ee78165a84f16ed848fc6ce3ac7898df7d1a60c - pristine_git_object: c6dd6d6088287c6f1cf8adc4841ba5756e59031e + last_write_checksum: sha1:13b1d5f69acc3af92a344d086f85c12652d77d33 + pristine_git_object: 421b13f4c09641965bc4a17a38a5bedb8016460c src/openrouter/components/createguardrailresponse.py: id: b4e1bdf1de5b last_write_checksum: sha1:ae20a5e7425510c240e5697d847b1cae65940bd6 pristine_git_object: d6c4a4dc73222668daddc2a1788d314ff30e8fe6 + src/openrouter/components/createworkspacerequest.py: + id: 3785d9b207c2 + last_write_checksum: sha1:f92859f4b9d641652e8faf004ce78c04bd9a9dfe + pristine_git_object: ff5d50610b7b198a27641fc56f021331d4ab0ec5 + src/openrouter/components/createworkspaceresponse.py: + id: 986d9ff993c1 + last_write_checksum: sha1:7e9028b437a9e33a7541ba222cf01e6629f5c74d + pristine_git_object: 54c7b43902b4c72a43cf4ea1fa965edbdecb5304 src/openrouter/components/customtool.py: id: e83b0c530680 last_write_checksum: sha1:4ac260beeb9cb5b2bd21156d23315263ebe7f891 @@ -3780,6 +4018,10 @@ trackedFiles: id: c3ac908331ef last_write_checksum: sha1:8984f78ae6a2b3ee8b16d7f0018622ba725c1583 pristine_git_object: f31843cfe4e36f3f6371837221b6966fabaa563a + src/openrouter/components/deleteworkspaceresponse.py: + id: 5e45e8064f69 + last_write_checksum: sha1:4e326914693c0d0caf901651cf214f73df624f64 + pristine_git_object: bed459583970617979bb6aec394bfeb161274514 src/openrouter/components/easyinputmessage.py: id: 72619a312585 last_write_checksum: sha1:154ba5f3afee09526acdc5d6291584e01c54f6ed @@ -3852,14 +4094,30 @@ trackedFiles: id: bf659aa04e7d last_write_checksum: sha1:0beae7f5475531ffd58d6b8bcceb5e9ea987387f pristine_git_object: 239f67dc3d0b8bd82e81c1f510afb7df96397401 + src/openrouter/components/generationcontentdata.py: + id: 0140215b5b46 + last_write_checksum: sha1:09e15ae2acc4f44084e2206ea51e6a06f4c5ee11 + pristine_git_object: 065679a3408bbfd07e86646a6b3aa135cd573973 + src/openrouter/components/generationcontentresponse.py: + id: c3f3f745a193 + last_write_checksum: sha1:0a87a329f4b565c773d730ddc74595c6a0d64ddc + pristine_git_object: b762f6507fe7c7456df88a9400f82587fd6d63c9 + src/openrouter/components/generationresponse.py: + id: 84d4e3e7da8b + last_write_checksum: sha1:b1061258a84282ef004fe306a812b931609ea39b + pristine_git_object: 4dedb7aea86c5c4c40b1d8c46ac7c4eb8231409e src/openrouter/components/getguardrailresponse.py: id: 6f9054fab3d9 last_write_checksum: sha1:f20a0be686991d8f7ed0eb884612586052efc5c1 pristine_git_object: 6cdeb99e76ab6ad2e22b13164efbdb68cf8f328d + src/openrouter/components/getworkspaceresponse.py: + id: d993d0c4c3da + last_write_checksum: sha1:918535730d1c352bcc8fd2342e1c4cea89bc357f + pristine_git_object: acda534cb0ced2a391479b720434cf0f57f46276 src/openrouter/components/guardrail.py: id: 67ee78dd06e6 - last_write_checksum: sha1:51ab908cd40c1dad9c499c4dec4ebb29ecd94b87 - pristine_git_object: afc25c729b3d7583ea116b1fbdb0e0e3e06aac3a + last_write_checksum: sha1:b55997d74e312405119e037e70ea847615fe80c5 + pristine_git_object: 64bb092555bc83d71e02d00287e1975251f065c3 src/openrouter/components/guardrailinterval.py: id: 01687fc135ab last_write_checksum: sha1:430f886f371b85777346de663202d62708cd84cf @@ -3894,8 +4152,8 @@ trackedFiles: pristine_git_object: c9609dbda39bbc43666c9625cf58baf469a6160c src/openrouter/components/imagegenerationservertoolconfig.py: id: 76f45207c1be - last_write_checksum: sha1:8d092f865ab995390b0370627657a8689c6a36aa - pristine_git_object: 7b7010abb24612645e134c7052a9475ca327b2d5 + last_write_checksum: sha1:065e1ab5d5e29f01bc86428ecb438ad9f7f9dc7b + pristine_git_object: 0fdc8f67a8af50e789e2ae73d647d9ba43b703b2 src/openrouter/components/imagegenerationservertoolconfig_union.py: id: d1c630a1476a last_write_checksum: sha1:50d45b5a787e8cc9024c05b31e4113993ffe4038 @@ -3976,6 +4234,10 @@ trackedFiles: id: 78ca80afcc6f last_write_checksum: sha1:3edda0c8ff111abaf5332475d89a87e84f4f5d78 pristine_git_object: 1497ba3814f2f058c1332d8bcf92a2e2bbed0fe5 + src/openrouter/components/listworkspacesresponse.py: + id: 0c5f98eddbf5 + last_write_checksum: sha1:53b10630a44ccc43fa86a34e9a3f5a64f08488c4 + pristine_git_object: b70d4bbc7e84bc0f9ae3beedb8784bbc46aae9c0 src/openrouter/components/mcpservertool.py: id: bb8aeb03a111 last_write_checksum: sha1:014b01dd6253437640d2b3fbd084cfddb2399073 @@ -4002,8 +4264,8 @@ trackedFiles: pristine_git_object: c197cb2c527296adff2c3cfd9e49bcbc48087ce7 src/openrouter/components/modelscountresponse.py: id: c08f960ac611 - last_write_checksum: sha1:e53d3191d1edd6e289a90fe22c69ab1f02ec73ed - pristine_git_object: 86bb27c9ce62c148a54ec7a61796154a2ca18c76 + last_write_checksum: sha1:82669f5aa9379f6c90393ea0b78f2bafdce545df + pristine_git_object: 8d68ee4aa093ba2754a65f28e46a23a1848fd99b src/openrouter/components/modelslistresponse.py: id: c2d4bb2cac89 last_write_checksum: sha1:54bc618bea7ddcaa4e49082d601065c634fb2ea1 @@ -4058,8 +4320,8 @@ trackedFiles: pristine_git_object: 08d990d8cc07b7928158fc55784cd9d613f4c58b src/openrouter/components/openresponsesresult.py: id: 78f7e33b19e6 - last_write_checksum: sha1:8dd339b5021699b49dbfcff86e388947f61d5747 - pristine_git_object: fa04955d5675d8aef3ff3deaeb6560c7a0070f4f + last_write_checksum: sha1:4f234023126aad91df715d99450768fc2ed3252b + pristine_git_object: ea63258a915e1cd5663aa9f352f83af40f50e4a2 src/openrouter/components/openrouterwebsearchservertool.py: id: f5400a5de3cd last_write_checksum: sha1:e1cd10158e15f88d5c2903b1508a42d4006f4f3f @@ -4110,16 +4372,16 @@ trackedFiles: pristine_git_object: abaaa53610171f25ed9d814f355f9a600101b254 src/openrouter/components/outputimagegenerationservertoolitem.py: id: cb34639447d7 - last_write_checksum: sha1:2383f1a2904297a4289e0523778bb928f5614d1f - pristine_git_object: e91756b3e8d3e46283706192f9e44d03770d0fb3 + last_write_checksum: sha1:21f58c84bea8a3ace8b91bba914e54cf62dad70e + pristine_git_object: a94bd0964eb714782858820e0db39afc28a0dcc3 src/openrouter/components/outputitemimagegenerationcall.py: id: 0b4cbdbd733f last_write_checksum: sha1:f9ea61a170b8e516108d2d59b0e7df9d264d3aad pristine_git_object: 897c4727eec2497fe15e5603187e24218c08ac87 src/openrouter/components/outputitems.py: id: 90f107de3116 - last_write_checksum: sha1:3e25cbb638d9f753193e6c7882077468032a30f8 - pristine_git_object: 4457f805c46470e36ff5cfd30eebab43e0039a96 + last_write_checksum: sha1:0f241fcf9e8eb3dd8b315c6efee2d4017d0203fb + pristine_git_object: 75ffbc584663c12c8e7629145a76ca8d60b7de75 src/openrouter/components/outputmcpservertoolitem.py: id: bb8c2536a58e last_write_checksum: sha1:6cbe556b2268af0142d982007b273cc43b7605c7 @@ -4138,8 +4400,8 @@ trackedFiles: pristine_git_object: ec59a9d5b4c96843033bd73783a7b923fb741928 src/openrouter/components/outputmodality.py: id: 74c79e4cad45 - last_write_checksum: sha1:76cc17e2a535074d823d7250c3e856d165ceeb70 - pristine_git_object: c926bb65891bd067cfbf45ae48f960a63820aa70 + last_write_checksum: sha1:20b876e2df7a4fa278d413e7fa45e273ec1cfa19 + pristine_git_object: 4d38da683d5e4e37193312e4ec5b2886b65ec0c2 src/openrouter/components/outputmodalityenum.py: id: 82bebf193d55 last_write_checksum: sha1:2983ef9a3c82244eff5f8b1184637a1fef13573c @@ -4148,6 +4410,10 @@ trackedFiles: id: 0bc0568f44f9 last_write_checksum: sha1:3c460a262ff94910ea443fa6ac7d3f6608c3209f pristine_git_object: 50eff94f87fe82aba4fe330ee61e79ab885847fc + src/openrouter/components/outputsearchmodelsservertoolitem.py: + id: ba87dc220c62 + last_write_checksum: sha1:f9682aae6fc8cafa19217af10d745180cacde1e2 + pristine_git_object: f94949d2e5aedf4873295efcdf87f0f5367c1d32 src/openrouter/components/outputtexteditorservertoolitem.py: id: 2a5dc9318fe6 last_write_checksum: sha1:75ce53e78b352b0427acfb5310b2500ee76351dd @@ -4172,6 +4438,10 @@ trackedFiles: id: d76aede00388 last_write_checksum: sha1:bfd3c5f0f386b8c743f724c52ba51d97e49a1757 pristine_git_object: 9aaebc4cb7eefdce97f37e89d6d719e524d148e5 + src/openrouter/components/paretorouterplugin.py: + id: b239c8e11899 + last_write_checksum: sha1:9d070d49f1983cee493ba27cba80c41e6133aaf4 + pristine_git_object: 6b12a70411a04b73112da5192baf0131b7f0ff36 src/openrouter/components/payloadtoolargeresponseerrordata.py: id: 5209b3a61cc9 last_write_checksum: sha1:ba13b793314af45716d3ed5572abaad213d01850 @@ -4226,8 +4496,8 @@ trackedFiles: pristine_git_object: 72dd15242d7d35b2b493f90d0cdebf6f8a51d684 src/openrouter/components/providername.py: id: fcc722fa2fce - last_write_checksum: sha1:5f1b8a8471ab3d11bd0d18927a9cd9c747bababe - pristine_git_object: 7764a12512827640f3c32a22b199b09cd890b57f + last_write_checksum: sha1:be70b906ae9d172c5e5310728d3a4e83cff153ab + pristine_git_object: 109379a879ba8882755e0f069963062e0d792a06 src/openrouter/components/provideroverloadedresponseerrordata.py: id: 5b693682570e last_write_checksum: sha1:41a977452d58b52cb9d4b3a85f4b7970529352d5 @@ -4238,8 +4508,8 @@ trackedFiles: pristine_git_object: 5145815e6196470f3f5f24893afdc4415d27c53e src/openrouter/components/providerresponse.py: id: ad3887be54c5 - last_write_checksum: sha1:d5988a5d8c6174971287275305c6b638b6325940 - pristine_git_object: 4856eee2be0d7aeaadc4cbacd0ba1b08e5886999 + last_write_checksum: sha1:7c354d7847c0714711db5b75350ec406222f443d + pristine_git_object: 14f4f7ed497f6d78c51be562f3b6274c7496ef95 src/openrouter/components/providersort.py: id: 348e382bf494 last_write_checksum: sha1:57551507f95cd2e16ef995e1c13f859fd0726152 @@ -4358,8 +4628,8 @@ trackedFiles: pristine_git_object: d3c77624292ba0985104a6125e462c305a633d84 src/openrouter/components/responsesrequest.py: id: 8c850080ec5d - last_write_checksum: sha1:d3736138872e8a2af2681707dac0d4b08c9f198f - pristine_git_object: 357c19a3c8198fe785cee157960b438f96d84cb0 + last_write_checksum: sha1:1b222de150deb4d821280b05b0519d8fbb2ac7b1 + pristine_git_object: 6b45ef739d27e54e25f348cc15856fdab5c7f6c0 src/openrouter/components/searchcontextsizeenum.py: id: c246413c0bd7 last_write_checksum: sha1:863a664a9f17def86180b0407c8233c263acfae7 @@ -4370,8 +4640,8 @@ trackedFiles: pristine_git_object: 559ecad60dc51d3a30a5b40421fd0e1e5db2aaed src/openrouter/components/searchqualitylevel.py: id: 8fdb148edfb2 - last_write_checksum: sha1:ef6932e03bc19a234c36b511313826048241b56f - pristine_git_object: 36eba036095d6981523ed162e3a9b30188731651 + last_write_checksum: sha1:f5bc828dd145a830760ad6f23bbd9cae18664610 + pristine_git_object: b5ed4f137aee1626a8ddb8c4b5f763d8ba13be21 src/openrouter/components/security.py: id: ae2ca334218a last_write_checksum: sha1:e6bfa94172df4c823ed9dd83b9b2614e6890d462 @@ -4384,6 +4654,10 @@ trackedFiles: id: ac0e4bd3caa3 last_write_checksum: sha1:06f390a37d82c115be033bcfceb3e99b30e1fc92 pristine_git_object: 7e26325a31eb3ed1dbd4323a0e61afc1f6bd885f + src/openrouter/components/speechrequest.py: + id: 2a9400167112 + last_write_checksum: sha1:56d95a93b39471f08d39c8ec2360d9b1e741b438 + pristine_git_object: 50eda11a0635a51d6a317fdc92293b5e1e6c34e4 src/openrouter/components/storedprompttemplate.py: id: 6be99e870ecd last_write_checksum: sha1:6b7d17641d9e2b52010962cb586e32f99254db79 @@ -4420,10 +4694,6 @@ trackedFiles: id: e39bb8998edb last_write_checksum: sha1:cd5570f2a08ea1c0315dfcbc0e4d704610adca41 pristine_git_object: 49f4ae2d09fa5d311465a0a77f7cede0f97f779a - src/openrouter/components/textconfig.py: - id: cbd40c12b745 - last_write_checksum: sha1:737f5adabb641d1d30152cee2f9a8db1e43d697b - pristine_git_object: cf8fa534d38146d0734b6161264406d5d53b7955 src/openrouter/components/textdeltaevent.py: id: 6d1d416a373d last_write_checksum: sha1:9a024e07b3f2d65d5f88e01f0e2035efd956f3fc @@ -4434,8 +4704,8 @@ trackedFiles: pristine_git_object: 9bc3b1fd09ca7d4be981ceb7b10e14fb157dbb5f src/openrouter/components/textextendedconfig.py: id: 150a449e46de - last_write_checksum: sha1:8e6dd8672fcc687c8a930c533d94daac4bb4ce5d - pristine_git_object: ee561b18699c16f952bc036a2d0903e0ea3a8d9b + last_write_checksum: sha1:81f539fffffee92247de216b1ddc9269b02fcd54 + pristine_git_object: 89224c7a342575e694ac269e1773c4c2a0ad5c07 src/openrouter/components/toolcallstatus.py: id: 32339139c3f3 last_write_checksum: sha1:a75631cdb460f190aa10d5557519519d1ef5fbe3 @@ -4476,6 +4746,14 @@ trackedFiles: id: 7b068d26ce31 last_write_checksum: sha1:2b63cbb90747f07f775d9a22e80f74c67221fea8 pristine_git_object: df833960211cc7ed2a2a42fddbeafda0092e1c0c + src/openrouter/components/updateworkspacerequest.py: + id: 78d86b3b0a63 + last_write_checksum: sha1:38588bb58f96787042b61632e385a1caa8284d48 + pristine_git_object: a0ed36488f27be8420843c6fd1b102919dfc629e + src/openrouter/components/updateworkspaceresponse.py: + id: 46253fa9690a + last_write_checksum: sha1:4708e7e4cbfddc34ffc9ed4808a88bb5b4a61ebf + pristine_git_object: 35d7ad3f80af77356a5478b386be29773f31db69 src/openrouter/components/urlcitation.py: id: fe4578e64ea3 last_write_checksum: sha1:c63b25e9b3162a543d7e4a8bb88f8a10b2d8d8d9 @@ -4486,8 +4764,8 @@ trackedFiles: pristine_git_object: 3ff415b693496c00c41261d09e7c0c12d83730fd src/openrouter/components/videogenerationrequest.py: id: 70e3c9ff288c - last_write_checksum: sha1:f892d1c5506561312151604aa837b90546603d7f - pristine_git_object: db54f129779d55863e0ea63affc0600700d2fcaf + last_write_checksum: sha1:24690bf127ca6883286c1de2c4dee772574ddde5 + pristine_git_object: 01faca7bc9f01dcccb9f92079822faa4b354598f src/openrouter/components/videogenerationresponse.py: id: 541f1321b072 last_write_checksum: sha1:051ace67776106616ec4c8e55cf2df9a99855d0f @@ -4504,6 +4782,18 @@ trackedFiles: id: 2e9d1ce2cf19 last_write_checksum: sha1:b94977aa6941f7cf15c889f1b7cc69b50cd35856 pristine_git_object: 796e741c43389a96f2ed44d3b5d862475a8af2cc + src/openrouter/components/webfetchengineenum.py: + id: 47c172c99604 + last_write_checksum: sha1:ae47c404187cb452b589aa72e38460eb115aef65 + pristine_git_object: 7573a926fc6e591bfb9132e47a3a3a777a1c3321 + src/openrouter/components/webfetchservertool.py: + id: f861247ea1e0 + last_write_checksum: sha1:76761dfd639356b765783eb5205226ec317a69c9 + pristine_git_object: cbd34b30aaef5cf4262526df86edc35287b10787 + src/openrouter/components/webfetchservertoolconfig.py: + id: 05cda975d2bd + last_write_checksum: sha1:cfb18dd27b811a4dd1d00d9e1f2ece25bc0f2e39 + pristine_git_object: b65fd215b5910d6227f042faad7516825af3060f src/openrouter/components/websearchcallcompletedevent.py: id: a5818af2b521 last_write_checksum: sha1:538a39bf773415567086a28ff2cde66fd37ea763 @@ -4518,8 +4808,8 @@ trackedFiles: pristine_git_object: adceee794cf8135f5db3b2d741dc6e4de9c4e968 src/openrouter/components/websearchconfig.py: id: 3884d9509e8c - last_write_checksum: sha1:203af5719bc5fb7c66956e4554eba9d3b1a30542 - pristine_git_object: dfe91153bcab48d544ee9a7f4a4d409640e6599a + last_write_checksum: sha1:ef56f68e647c66ea6f0988f6fc8e2795d6876e81 + pristine_git_object: 8188e570757acdbe16bfc936721d0e3a2dc56d97 src/openrouter/components/websearchdomainfilter.py: id: 4a7307ed2ba6 last_write_checksum: sha1:043839dada28f82b33f70534895e98e7ee6ce7f5 @@ -4560,6 +4850,14 @@ trackedFiles: id: 34efd6600d16 last_write_checksum: sha1:cb3ea048d0ba10bb8fe943c8e1330e677f598a2f pristine_git_object: a716b872c7c00c57fc27733362d5e78120c89c3e + src/openrouter/components/workspace.py: + id: 682282304bd8 + last_write_checksum: sha1:517e8b4540a5aea467e7da4f947a3ebb8b6125fd + pristine_git_object: a097f389c54954c983e9dc5f94f1956d95747ef2 + src/openrouter/components/workspacemember.py: + id: b510f727fe9c + last_write_checksum: sha1:63595d8ce7e9df050f1bc97f7cf70b4215da09d0 + pristine_git_object: 9ece87803cfa8b3ab38c0dffdfbd8de176eaaed5 src/openrouter/credits.py: id: cdc961937101 last_write_checksum: sha1:2d49b088f5895c7d1b3167d6d99d304221812fb6 @@ -4654,12 +4952,12 @@ trackedFiles: pristine_git_object: 7304f75b9e8f3bef2d1c918f875420b26a15f8d7 src/openrouter/generations.py: id: 70e1c21042bc - last_write_checksum: sha1:a8dcb94d3809b0b837398caca08dabd3c0481d21 - pristine_git_object: fddcce7468125b281b22f520928ee5d31f027fc5 + last_write_checksum: sha1:f7df8719bf188b05a29b8694e6c2db7adb262bd3 + pristine_git_object: 409e169fc5f43a0eea65b7568588c25c82abb46a src/openrouter/guardrails.py: id: 705839f34e66 - last_write_checksum: sha1:b8b1ea14cd57a7f4100f63efbe76d3baf5e62254 - pristine_git_object: 7d1038da0c7b1e6989aaeb070b1a2081157b53e1 + last_write_checksum: sha1:d6dc827f53d97b7764d5e6f98c53eafb133e3be2 + pristine_git_object: f80ac692626e67574877c5503e1e004461becde1 src/openrouter/httpclient.py: id: e9311185443d last_write_checksum: sha1:5e55338d6ee9f01ab648cad4380201a8a3da7dd7 @@ -4686,8 +4984,12 @@ trackedFiles: pristine_git_object: ef6eb9aa10d9b067d96dad78a1d34f939c1091e8 src/openrouter/operations/__init__.py: id: 9afcea1e7161 - last_write_checksum: sha1:ec3ab8fd0729912259f86a370453dd311f440953 - pristine_git_object: 8c2b3198136aec28d1b51abc1b12386429039561 + last_write_checksum: sha1:a936e6d34ffa0e3c904139e1f981b74b91ab2405 + pristine_git_object: e9eb83eb1978b15a3b5221772d9c6b0dfc68f4d0 + src/openrouter/operations/bulkaddworkspacemembers.py: + id: e0ed56117619 + last_write_checksum: sha1:2b9c73dd8a24d6c479d50118a309e4e0969ca7ea + pristine_git_object: 32dcfea12b195a499c91c55aee78aaa0144e60e0 src/openrouter/operations/bulkassignkeystoguardrail.py: id: 6d8435d51d9d last_write_checksum: sha1:2136b0223191e5d8159c77cff06845958930184e @@ -4696,6 +4998,10 @@ trackedFiles: id: 079706f81038 last_write_checksum: sha1:7c8fb1abae40f33c8d467f73b3779503469cad1c pristine_git_object: 80a1cb770eb34221c7691abb44849bb6db23322d + src/openrouter/operations/bulkremoveworkspacemembers.py: + id: b5f68d465d4d + last_write_checksum: sha1:1fbd3d2660a4261d12c97b464bc445f4dc24c891 + pristine_git_object: fe0ebfd7d6f5e748ba7105c848c94fe3ed6598ea src/openrouter/operations/bulkunassignkeysfromguardrail.py: id: 006249615b0e last_write_checksum: sha1:88df9d073f73c7d1f0fb70e46a109b17f84f04e8 @@ -4704,22 +5010,26 @@ trackedFiles: id: 8127aafae1ef last_write_checksum: sha1:a4c24a2e84c611856ed0ea45168b31cd5b8e1dd0 pristine_git_object: 3613dcf6d85a45e916983f238cd807695433b401 + src/openrouter/operations/createaudiospeech.py: + id: af9df6195878 + last_write_checksum: sha1:a3bd0bd212bfd34631dfd07b265f3be23e0ef458 + pristine_git_object: dae7b28a11b1c100ddf9c66f175d0d583a4506ca src/openrouter/operations/createauthkeyscode.py: id: 4253a437de22 last_write_checksum: sha1:de809cb9a55efb7b22d033bace50344bf53696f4 pristine_git_object: d3ef6c4b8374be3dfa5d807f879a430e50dc444e src/openrouter/operations/createembeddings.py: id: fe1160a960e9 - last_write_checksum: sha1:7c43b2de3e40ec1fcbac46f4bc89ae6fbf5eb95d - pristine_git_object: 3872d32380bd3ae8cb9cdb6d7420a4e32464596f + last_write_checksum: sha1:e152bffcd6eee6a8787f529b2e5b29786e3c7f09 + pristine_git_object: e0efba7b495001313dcc86a7e725269eb636b92a src/openrouter/operations/createguardrail.py: id: 52ed4b2f5903 last_write_checksum: sha1:119141c01d19df6b6d090b67f80145e3bf4d4d60 pristine_git_object: 75b9661b38be99f2a067eda4051592111301bed1 src/openrouter/operations/createkeys.py: id: 64ad31fdaa6c - last_write_checksum: sha1:2d9152fa4d928959e6fa6fd87064a5eff9593f85 - pristine_git_object: 5ed218dc83d851e8ccf7da73203c7677c7ef75c5 + last_write_checksum: sha1:41931fecbca34b228d5fe6230810eb6bf9271250 + pristine_git_object: 6d18cf707841629cc63ed2ed56aacd67f639a717 src/openrouter/operations/creatererank.py: id: 99b5d368a168 last_write_checksum: sha1:86b7c32d7b0bb77f16b9926384c47774e9e25c6a @@ -4732,6 +5042,10 @@ trackedFiles: id: d52f6a4a3fe4 last_write_checksum: sha1:12507b8087961d8efe67590e8c5b93f47a9d1a23 pristine_git_object: 3892fc759bd022cdbbaf830f5f20f655131a6d90 + src/openrouter/operations/createworkspace.py: + id: 690a809c4592 + last_write_checksum: sha1:897268bff3352aff34ba62f6622ee3ba17406752 + pristine_git_object: 1757be8d72bad9c0076d5492babb798eba2b5582 src/openrouter/operations/deleteguardrail.py: id: 1fbdb98bbb85 last_write_checksum: sha1:e245a5061592daf839d38caace9cc38abbce879d @@ -4740,6 +5054,10 @@ trackedFiles: id: 0bd72d53b0a0 last_write_checksum: sha1:de3ec2a557ba007482a9d7ecaecef00cb6ead537 pristine_git_object: 51d48818bce022ab5e9514ea48429e3aca75e997 + src/openrouter/operations/deleteworkspace.py: + id: f92017ce65e8 + last_write_checksum: sha1:ac9aa22002cf938a69643dac44c38ab7d702c31c + pristine_git_object: fbfef8826b9993d95d355ec0335f943e97a75bda src/openrouter/operations/exchangeauthcodeforapikey.py: id: 37bdd1517a07 last_write_checksum: sha1:963c95a165a35ae235d9b03d31c4e029de0246d4 @@ -4754,16 +5072,16 @@ trackedFiles: pristine_git_object: 2d26173fd7e4555e188999eee1e282e85b68c73d src/openrouter/operations/getgeneration.py: id: d7c64961334f - last_write_checksum: sha1:8816e63b89634cc5b5df7ef6119421224965e529 - pristine_git_object: 94dfcb738c716d409f17be7a2e11485531d90a34 + last_write_checksum: sha1:7c919236caf0943f145d584024a85bb663f0e911 + pristine_git_object: bf21d05e955bbfc62ed484b566555bafe0049e10 src/openrouter/operations/getguardrail.py: id: 9b3309b59c64 last_write_checksum: sha1:f83b3d52731324d0bc87c382196b84713e77f6da pristine_git_object: e3a2ca2914e9add5060e7efa73dd268d5e32a9a5 src/openrouter/operations/getkey.py: id: d9769da90865 - last_write_checksum: sha1:3630fb35d372c6541061cf2d425ebf58acc336f7 - pristine_git_object: ec3948b6b7c470258a3dfe10d304c2d52bd68b04 + last_write_checksum: sha1:511b994a0bd1241856b06184f05433bec3a16733 + pristine_git_object: d2370a94a10fadec861d31e6fd1a9b2566e94d22 src/openrouter/operations/getmodels.py: id: 5bd5dfcb0125 last_write_checksum: sha1:013ccee44da99aa609f290aef9f253e64dca38c6 @@ -4776,10 +5094,14 @@ trackedFiles: id: a5f626467a69 last_write_checksum: sha1:00f000b3fab29247f632c12bcdfe71a579a2ee6a pristine_git_object: 3a120ed0aacd7ac94b3421fc1439e1308d53f83f + src/openrouter/operations/getworkspace.py: + id: 2ead327ab15e + last_write_checksum: sha1:d9c6371c14333537e74d326634bc2ed2dbbeb76a + pristine_git_object: f4d279e42c326dbda828b4a875cd152cfa0ae14a src/openrouter/operations/list.py: id: 3ced31e3804e - last_write_checksum: sha1:a160c202d3cce31f3cb2f9cc911d5e4cd9c44c30 - pristine_git_object: e1d703cfe6485faee33c1ca4a7599b9c950bb7af + last_write_checksum: sha1:aeaae46cbe0e9403241e50baab791212404b29a0 + pristine_git_object: bf9965a274d7249abb169adb43c8358b1ee73105 src/openrouter/operations/listembeddingsmodels.py: id: bf749a1f23d6 last_write_checksum: sha1:654a4e7e7b486f1d321eeb11ef7a7fa928e501a6 @@ -4792,6 +5114,10 @@ trackedFiles: id: 588bf206e92f last_write_checksum: sha1:6d8e90c542ae6344e403767a3a4f8ec5d1d4dc75 pristine_git_object: 23e735db74e27dc35e80b2f72cf386b0eeeb116d + src/openrouter/operations/listgenerationcontent.py: + id: 2f086d74631c + last_write_checksum: sha1:922e30991bb7b3ef69e2672a2b969d74ce0b838d + pristine_git_object: 8d195009671fdd52cc86795bc1612fa3ddb79364 src/openrouter/operations/listguardrailkeyassignments.py: id: ee9d33f4de6b last_write_checksum: sha1:51cdc972a09b21dc3610b634bd0837a8d3b5b249 @@ -4802,8 +5128,8 @@ trackedFiles: pristine_git_object: c9c8c3ec5ea6ebcf1e160aa1e3ec41390bcbdfe3 src/openrouter/operations/listguardrails.py: id: c99a9e7be93c - last_write_checksum: sha1:0a38c88bb6f4f89dc5dd671d6d8b752902e042b5 - pristine_git_object: 8345e0e2d960cb1df76f5a8c60dd7817db7d22f8 + last_write_checksum: sha1:f82932a120516264880ec2defa377bb03a56071f + pristine_git_object: f91db9e67fe3a10b2fffd681a517a65eee4df8c8 src/openrouter/operations/listkeyassignments.py: id: e26c11d1bd3c last_write_checksum: sha1:2c4e9b2dac5566beb3b4f1331686ec45c174e021 @@ -4836,6 +5162,10 @@ trackedFiles: id: 77ba4890284b last_write_checksum: sha1:9bb93fb1d1d71effb5f4dc58cef9d7b2265a92b7 pristine_git_object: d1497b8429e19d06cc674940e2641b3ed2222ca7 + src/openrouter/operations/listworkspaces.py: + id: fe94c6f61835 + last_write_checksum: sha1:d8845cc07779359b6d9b29ff4a2367e8c8eeb942 + pristine_git_object: 236dc188826db184deca4a749dab47e58c3dd637 src/openrouter/operations/sendchatcompletionrequest.py: id: d9fee71bb577 last_write_checksum: sha1:35f707844223de94c0ddcb0d7d67abb50dc0fa26 @@ -4846,8 +5176,12 @@ trackedFiles: pristine_git_object: b3675a1d1a828f26750e5b7ac98fb7cf42ed49e1 src/openrouter/operations/updatekeys.py: id: 56fb213253a8 - last_write_checksum: sha1:cd60ee4ccc84dc5e491edc2df0780f2ea757d3ae - pristine_git_object: a8d2f865c3915c75bfef1865f567c3ffe6129bf7 + last_write_checksum: sha1:d7eeeaae7c738016d176985c529b9a60df5f7966 + pristine_git_object: 8ea23655b38916560ec65dc2f37842812add7c3f + src/openrouter/operations/updateworkspace.py: + id: 2e9960985cbc + last_write_checksum: sha1:88c11ee7a31bc5e2267981d882a01a2a71aafe55 + pristine_git_object: 4ab7929896a5dede1fa4cf9ce6acfaedd99160aa src/openrouter/organization.py: id: 6f4c63c416e8 last_write_checksum: sha1:4ca00158cd6a4971e7a4cf6da1ef084da25630d9 @@ -4870,12 +5204,16 @@ trackedFiles: pristine_git_object: 4844bc0a635f0d4450e617c4a66810ff9e55890e src/openrouter/sdk.py: id: ee9846c4c9c5 - last_write_checksum: sha1:af0469095dac69b5b92dd0f717ecf193a9c353e2 - pristine_git_object: 43d1636646e181c09eaa9a42cae71c53d8ee9f1e + last_write_checksum: sha1:9030d3ea5c154aab3a2534588c05054fd1f8ed2e + pristine_git_object: 580ff52d4a8a33bb3301ce7d4e2a4ede4f407c05 src/openrouter/sdkconfiguration.py: id: 55773bb98d7c last_write_checksum: sha1:c01826125c31a8b8bc99d9d679782c8758fae001 pristine_git_object: 26433165a0b1c25d7bd3115b9b129b18f2dc9387 + src/openrouter/tts.py: + id: 5055d4b95f1d + last_write_checksum: sha1:48a6876f2bef9735dff732ffdd095401995a6669 + pristine_git_object: 9a54e40356aba917a100cacf4df72ccae7da46e1 src/openrouter/types/__init__.py: id: 5eab536205b7 last_write_checksum: sha1:140ebdd01a46f92ffc710c52c958c4eba3cf68ed @@ -4954,8 +5292,12 @@ trackedFiles: pristine_git_object: dae01a44384ac3bc13ae07453a053bf6c898ebe3 src/openrouter/video_generation.py: id: d0a90c1b8efe - last_write_checksum: sha1:e71109a7ac4215c56e5fa3d0e843d532278d681c - pristine_git_object: 238bbcc92885086a6faaf351dbfdc095b8c6d8d8 + last_write_checksum: sha1:9368a2ab3224c71cc2962dc3af305fbdaff788af + pristine_git_object: 60a2a38c48f42d392fafd9a4f64408947b3a42b4 + src/openrouter/workspaces.py: + id: cd6c533b1802 + last_write_checksum: sha1:0fd13cd2b072d5ae2e95812c4103408f3cc604d7 + pristine_git_object: 5d6e6ce57547701328c3afc3430a91b2acbbb175 examples: createResponses: speakeasy-default-create-responses: @@ -5098,7 +5440,7 @@ examples: id: "gen-1234567890" responses: "200": - application/json: {"data": {"api_type": "completions", "app_id": 12345, "cache_discount": 0.0002, "cancelled": false, "created_at": "2024-07-15T23:33:19.433273+00:00", "external_user": "user-123", "finish_reason": "stop", "generation_time": 1200, "http_referer": "", "id": "gen-3bhGkxlo4XFrqiabUM7NDtwDzWwG", "is_byok": false, "latency": 1250, "model": "sao10k/l3-stheno-8b", "moderation_latency": 50, "native_finish_reason": "stop", "native_tokens_cached": 3, "native_tokens_completion": 25, "native_tokens_completion_images": 0, "native_tokens_prompt": 10, "native_tokens_reasoning": 5, "num_input_audio_prompt": 0, "num_media_completion": 0, "num_media_prompt": 1, "num_search_results": 5, "origin": "https://openrouter.ai/", "provider_name": "Infermatic", "provider_responses": [], "router": "openrouter/auto", "streamed": true, "tokens_completion": 25, "tokens_prompt": 10, "total_cost": 0.0015, "upstream_id": "chatcmpl-791bcf62-080e-4568-87d0-94c72e3b4946", "upstream_inference_cost": 0.0012, "usage": 0.0015, "user_agent": ""}} + application/json: {"data": {"api_type": "completions", "app_id": 12345, "cache_discount": null, "cancelled": false, "created_at": "2024-07-15T23:33:19.433273+00:00", "external_user": "user-123", "finish_reason": "stop", "generation_time": 1200, "http_referer": "https://openrouter.ai/", "id": "gen-3bhGkxlo4XFrqiabUM7NDtwDzWwG", "is_byok": false, "latency": 1250, "model": "sao10k/l3-stheno-8b", "moderation_latency": 50, "native_finish_reason": "stop", "native_tokens_cached": 3, "native_tokens_completion": 25, "native_tokens_completion_images": 0, "native_tokens_prompt": 10, "native_tokens_reasoning": 5, "num_fetches": 0, "num_input_audio_prompt": 0, "num_media_completion": 0, "num_media_prompt": 1, "num_search_results": 5, "origin": "https://openrouter.ai/", "provider_name": "Infermatic", "provider_responses": null, "router": "openrouter/auto", "streamed": true, "tokens_completion": 25, "tokens_prompt": 10, "total_cost": 0.0015, "upstream_id": "chatcmpl-791bcf62-080e-4568-87d0-94c72e3b4946", "upstream_inference_cost": 0.0012, "usage": 0.0015, "user_agent": "Mozilla/5.0", "web_search_engine": "exa"}} "401": application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} "402": @@ -5175,7 +5517,7 @@ examples: speakeasy-default-list: responses: "200": - application/json: {"data": [{"byok_usage": 17.38, "byok_usage_daily": 17.38, "byok_usage_monthly": 17.38, "byok_usage_weekly": 17.38, "created_at": "2025-08-24T10:30:00Z", "creator_user_id": "user_2dHFtVWx2n56w6HkM0000000000", "disabled": false, "hash": "f01d52606dc8f0a8303a7b5cc3fa07109c2e346cec7c0a16b40de462992ce943", "include_byok_in_limit": false, "label": "Production API Key", "limit": 100, "limit_remaining": 74.5, "limit_reset": "monthly", "name": "My Production Key", "updated_at": "2025-08-24T15:45:00Z", "usage": 25.5, "usage_daily": 25.5, "usage_monthly": 25.5, "usage_weekly": 25.5}]} + application/json: {"data": [{"byok_usage": 17.38, "byok_usage_daily": 17.38, "byok_usage_monthly": 17.38, "byok_usage_weekly": 17.38, "created_at": "2025-08-24T10:30:00Z", "creator_user_id": "user_2dHFtVWx2n56w6HkM0000000000", "disabled": false, "hash": "f01d52606dc8f0a8303a7b5cc3fa07109c2e346cec7c0a16b40de462992ce943", "include_byok_in_limit": false, "label": "Production API Key", "limit": 100, "limit_remaining": 74.5, "limit_reset": "monthly", "name": "My Production Key", "updated_at": "2025-08-24T15:45:00Z", "usage": 25.5, "usage_daily": 25.5, "usage_monthly": 25.5, "usage_weekly": 25.5, "workspace_id": "0df9e665-d932-5740-b2c7-b52af166bc11"}]} "401": application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} "429": @@ -5188,7 +5530,7 @@ examples: application/json: {"name": "My New API Key"} responses: "201": - application/json: {"data": {"byok_usage": 0, "byok_usage_daily": 0, "byok_usage_monthly": 0, "byok_usage_weekly": 0, "created_at": "2025-08-24T10:30:00Z", "creator_user_id": "user_2dHFtVWx2n56w6HkM0000000000", "disabled": false, "hash": "f01d52606dc8f0a8303a7b5cc3fa07109c2e346cec7c0a16b40de462992ce943", "include_byok_in_limit": true, "label": "My New API Key", "limit": 50, "limit_remaining": 50, "limit_reset": "monthly", "name": "My New API Key", "updated_at": null, "usage": 0, "usage_daily": 0, "usage_monthly": 0, "usage_weekly": 0}, "key": "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"} + application/json: {"data": {"byok_usage": 0, "byok_usage_daily": 0, "byok_usage_monthly": 0, "byok_usage_weekly": 0, "created_at": "2025-08-24T10:30:00Z", "creator_user_id": "user_2dHFtVWx2n56w6HkM0000000000", "disabled": false, "hash": "f01d52606dc8f0a8303a7b5cc3fa07109c2e346cec7c0a16b40de462992ce943", "include_byok_in_limit": true, "label": "My New API Key", "limit": 50, "limit_remaining": 50, "limit_reset": "monthly", "name": "My New API Key", "updated_at": null, "usage": 0, "usage_daily": 0, "usage_monthly": 0, "usage_weekly": 0, "workspace_id": "0df9e665-d932-5740-b2c7-b52af166bc11"}, "key": "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"} "400": application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} "401": @@ -5197,6 +5539,8 @@ examples: application/json: {"error": {"code": 429, "message": "Rate limit exceeded"}} "500": application/json: {"error": {"code": 500, "message": "Internal Server Error"}} + "403": + application/json: {"error": {"code": 403, "message": "Only management keys can perform this operation"}} updateKeys: speakeasy-default-update-keys: parameters: @@ -5206,7 +5550,7 @@ examples: application/json: {} responses: "200": - application/json: {"data": {"byok_usage": 17.38, "byok_usage_daily": 17.38, "byok_usage_monthly": 17.38, "byok_usage_weekly": 17.38, "created_at": "2025-08-24T10:30:00Z", "creator_user_id": "user_2dHFtVWx2n56w6HkM0000000000", "disabled": false, "hash": "f01d52606dc8f0a8303a7b5cc3fa07109c2e346cec7c0a16b40de462992ce943", "include_byok_in_limit": true, "label": "Updated API Key Name", "limit": 75, "limit_remaining": 49.5, "limit_reset": "daily", "name": "Updated API Key Name", "updated_at": "2025-08-24T16:00:00Z", "usage": 25.5, "usage_daily": 25.5, "usage_monthly": 25.5, "usage_weekly": 25.5}} + application/json: {"data": {"byok_usage": 17.38, "byok_usage_daily": 17.38, "byok_usage_monthly": 17.38, "byok_usage_weekly": 17.38, "created_at": "2025-08-24T10:30:00Z", "creator_user_id": "user_2dHFtVWx2n56w6HkM0000000000", "disabled": false, "hash": "f01d52606dc8f0a8303a7b5cc3fa07109c2e346cec7c0a16b40de462992ce943", "include_byok_in_limit": true, "label": "Updated API Key Name", "limit": 75, "limit_remaining": 49.5, "limit_reset": "daily", "name": "Updated API Key Name", "updated_at": "2025-08-24T16:00:00Z", "usage": 25.5, "usage_daily": 25.5, "usage_monthly": 25.5, "usage_weekly": 25.5, "workspace_id": "0df9e665-d932-5740-b2c7-b52af166bc11"}} "400": application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} "401": @@ -5240,7 +5584,7 @@ examples: hash: "f01d52606dc8f0a8303a7b5cc3fa07109c2e346cec7c0a16b40de462992ce943" responses: "200": - application/json: {"data": {"byok_usage": 17.38, "byok_usage_daily": 17.38, "byok_usage_monthly": 17.38, "byok_usage_weekly": 17.38, "created_at": "2025-08-24T10:30:00Z", "creator_user_id": "user_2dHFtVWx2n56w6HkM0000000000", "disabled": false, "hash": "f01d52606dc8f0a8303a7b5cc3fa07109c2e346cec7c0a16b40de462992ce943", "include_byok_in_limit": false, "label": "Production API Key", "limit": 100, "limit_remaining": 74.5, "limit_reset": "monthly", "name": "My Production Key", "updated_at": "2025-08-24T15:45:00Z", "usage": 25.5, "usage_daily": 25.5, "usage_monthly": 25.5, "usage_weekly": 25.5}} + application/json: {"data": {"byok_usage": 17.38, "byok_usage_daily": 17.38, "byok_usage_monthly": 17.38, "byok_usage_weekly": 17.38, "created_at": "2025-08-24T10:30:00Z", "creator_user_id": "user_2dHFtVWx2n56w6HkM0000000000", "disabled": false, "hash": "f01d52606dc8f0a8303a7b5cc3fa07109c2e346cec7c0a16b40de462992ce943", "include_byok_in_limit": false, "label": "Production API Key", "limit": 100, "limit_remaining": 74.5, "limit_reset": "monthly", "name": "My Production Key", "updated_at": "2025-08-24T15:45:00Z", "usage": 25.5, "usage_daily": 25.5, "usage_monthly": 25.5, "usage_weekly": 25.5, "workspace_id": "0df9e665-d932-5740-b2c7-b52af166bc11"}} "401": application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} "404": @@ -5262,7 +5606,7 @@ examples: speakeasy-default-list-guardrails: responses: "200": - application/json: {"data": [{"created_at": "2025-08-24T10:30:00Z", "id": "550e8400-e29b-41d4-a716-446655440000", "name": "Production Guardrail"}], "total_count": 1} + application/json: {"data": [{"created_at": "2025-08-24T10:30:00Z", "id": "550e8400-e29b-41d4-a716-446655440000", "name": "Production Guardrail", "workspace_id": "0df9e665-d932-5740-b2c7-b52af166bc11"}], "total_count": 1} "401": application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} "500": @@ -5273,13 +5617,15 @@ examples: application/json: {"name": "My New Guardrail"} responses: "201": - application/json: {"data": {"created_at": "2025-08-24T10:30:00Z", "id": "550e8400-e29b-41d4-a716-446655440000", "name": "My New Guardrail"}} + application/json: {"data": {"created_at": "2025-08-24T10:30:00Z", "id": "550e8400-e29b-41d4-a716-446655440000", "name": "My New Guardrail", "workspace_id": "0df9e665-d932-5740-b2c7-b52af166bc11"}} "400": application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} "401": application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} "500": application/json: {"error": {"code": 500, "message": "Internal Server Error"}} + "403": + application/json: {"error": {"code": 403, "message": "Only management keys can perform this operation"}} getGuardrail: speakeasy-default-get-guardrail: parameters: @@ -5287,7 +5633,7 @@ examples: id: "550e8400-e29b-41d4-a716-446655440000" responses: "200": - application/json: {"data": {"created_at": "2025-08-24T10:30:00Z", "id": "550e8400-e29b-41d4-a716-446655440000", "name": "Production Guardrail"}} + application/json: {"data": {"created_at": "2025-08-24T10:30:00Z", "id": "550e8400-e29b-41d4-a716-446655440000", "name": "Production Guardrail", "workspace_id": "0df9e665-d932-5740-b2c7-b52af166bc11"}} "401": application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} "404": @@ -5303,7 +5649,7 @@ examples: application/json: {} responses: "200": - application/json: {"data": {"created_at": "2025-08-24T10:30:00Z", "id": "550e8400-e29b-41d4-a716-446655440000", "name": "Updated Guardrail Name"}} + application/json: {"data": {"created_at": "2025-08-24T10:30:00Z", "id": "550e8400-e29b-41d4-a716-446655440000", "name": "Updated Guardrail Name", "workspace_id": "0df9e665-d932-5740-b2c7-b52af166bc11"}} "400": application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} "401": @@ -5573,4 +5919,172 @@ examples: application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} "500": application/json: {"error": {"code": 500, "message": "Internal Server Error"}} + createAudioSpeech: + speakeasy-default-create-audio-speech: + requestBody: + application/json: {"input": "Hello world", "model": "elevenlabs/eleven-turbo-v2", "response_format": "pcm", "voice": "alloy"} + responses: + "200": + audio/*: "" + "400": + application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} + "401": + application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} + "402": + application/json: {"error": {"code": 402, "message": "Insufficient credits. Add more using https://openrouter.ai/credits"}} + "404": + application/json: {"error": {"code": 404, "message": "Resource not found"}} + "429": + application/json: {"error": {"code": 429, "message": "Rate limit exceeded"}} + "500": + application/json: {"error": {"code": 500, "message": "Internal Server Error"}} + "502": + application/json: {"error": {"code": 502, "message": "Provider returned error"}} + "503": + application/json: {"error": {"code": 503, "message": "Service temporarily unavailable"}} + "524": + application/json: {"error": {"code": 524, "message": "Request timed out. Please try again later."}} + "529": + application/json: {"error": {"code": 529, "message": "Provider returned error"}} + listGenerationContent: + speakeasy-default-list-generation-content: + parameters: + query: + id: "gen-1234567890" + responses: + "200": + application/json: {"data": {"input": {"messages": [{"content": "What is the meaning of life?", "role": "user"}]}, "output": {"completion": "The meaning of life is a philosophical question...", "reasoning": null}}} + "401": + application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} + "403": + application/json: {"error": {"code": 403, "message": "Only management keys can perform this operation"}} + "404": + application/json: {"error": {"code": 404, "message": "Resource not found"}} + "429": + application/json: {"error": {"code": 429, "message": "Rate limit exceeded"}} + "500": + application/json: {"error": {"code": 500, "message": "Internal Server Error"}} + "502": + application/json: {"error": {"code": 502, "message": "Provider returned error"}} + "524": + application/json: {"error": {"code": 524, "message": "Request timed out. Please try again later."}} + "529": + application/json: {"error": {"code": 529, "message": "Provider returned error"}} + listWorkspaces: + speakeasy-default-list-workspaces: + responses: + "200": + application/json: {"data": [{"created_at": "2025-08-24T10:30:00Z", "created_by": "user_abc123", "default_image_model": "openai/dall-e-3", "default_provider_sort": "price", "default_text_model": "openai/gpt-4o", "description": "Production environment workspace", "id": "550e8400-e29b-41d4-a716-446655440000", "is_data_discount_logging_enabled": true, "is_observability_broadcast_enabled": false, "is_observability_io_logging_enabled": false, "name": "Production", "slug": "production", "updated_at": "2025-08-24T15:45:00Z"}], "total_count": 1} + "401": + application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} + "500": + application/json: {"error": {"code": 500, "message": "Internal Server Error"}} + createWorkspace: + speakeasy-default-create-workspace: + requestBody: + application/json: {"name": "Production", "slug": "production"} + responses: + "201": + application/json: {"data": {"created_at": "2025-08-24T10:30:00Z", "created_by": "user_abc123", "default_image_model": "openai/dall-e-3", "default_provider_sort": "price", "default_text_model": "openai/gpt-4o", "description": "Production environment workspace", "id": "550e8400-e29b-41d4-a716-446655440000", "is_data_discount_logging_enabled": true, "is_observability_broadcast_enabled": false, "is_observability_io_logging_enabled": false, "name": "Production", "slug": "production", "updated_at": null}} + "400": + application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} + "401": + application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} + "403": + application/json: {"error": {"code": 403, "message": "Only management keys can perform this operation"}} + "500": + application/json: {"error": {"code": 500, "message": "Internal Server Error"}} + deleteWorkspace: + speakeasy-default-delete-workspace: + parameters: + path: + id: "production" + responses: + "200": + application/json: {"deleted": true} + "400": + application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} + "401": + application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} + "403": + application/json: {"error": {"code": 403, "message": "Only management keys can perform this operation"}} + "404": + application/json: {"error": {"code": 404, "message": "Resource not found"}} + "500": + application/json: {"error": {"code": 500, "message": "Internal Server Error"}} + getWorkspace: + speakeasy-default-get-workspace: + parameters: + path: + id: "production" + responses: + "200": + application/json: {"data": {"created_at": "2025-08-24T10:30:00Z", "created_by": "user_abc123", "default_image_model": "openai/dall-e-3", "default_provider_sort": "price", "default_text_model": "openai/gpt-4o", "description": "Production environment workspace", "id": "550e8400-e29b-41d4-a716-446655440000", "is_data_discount_logging_enabled": true, "is_observability_broadcast_enabled": false, "is_observability_io_logging_enabled": false, "name": "Production", "slug": "production", "updated_at": "2025-08-24T15:45:00Z"}} + "401": + application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} + "404": + application/json: {"error": {"code": 404, "message": "Resource not found"}} + "500": + application/json: {"error": {"code": 500, "message": "Internal Server Error"}} + updateWorkspace: + speakeasy-default-update-workspace: + parameters: + path: + id: "production" + requestBody: + application/json: {} + responses: + "200": + application/json: {"data": {"created_at": "2025-08-24T10:30:00Z", "created_by": "user_abc123", "default_image_model": "openai/dall-e-3", "default_provider_sort": "price", "default_text_model": "openai/gpt-4o", "description": "Production environment workspace", "id": "550e8400-e29b-41d4-a716-446655440000", "is_data_discount_logging_enabled": true, "is_observability_broadcast_enabled": false, "is_observability_io_logging_enabled": false, "name": "Updated Workspace", "slug": "updated-workspace", "updated_at": "2025-08-25T10:00:00Z"}} + "400": + application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} + "401": + application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} + "403": + application/json: {"error": {"code": 403, "message": "Only management keys can perform this operation"}} + "404": + application/json: {"error": {"code": 404, "message": "Resource not found"}} + "500": + application/json: {"error": {"code": 500, "message": "Internal Server Error"}} + bulkAddWorkspaceMembers: + speakeasy-default-bulk-add-workspace-members: + parameters: + path: + id: "production" + requestBody: + application/json: {"user_ids": ["user_abc123", "user_def456"]} + responses: + "200": + application/json: {"added_count": 1, "data": [{"created_at": "2025-08-24T10:30:00Z", "id": "660e8400-e29b-41d4-a716-446655440000", "role": "member", "user_id": "user_abc123", "workspace_id": "550e8400-e29b-41d4-a716-446655440000"}]} + "400": + application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} + "401": + application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} + "403": + application/json: {"error": {"code": 403, "message": "Only management keys can perform this operation"}} + "404": + application/json: {"error": {"code": 404, "message": "Resource not found"}} + "500": + application/json: {"error": {"code": 500, "message": "Internal Server Error"}} + bulkRemoveWorkspaceMembers: + speakeasy-default-bulk-remove-workspace-members: + parameters: + path: + id: "production" + requestBody: + application/json: {"user_ids": ["user_abc123", "user_def456"]} + responses: + "200": + application/json: {"removed_count": 2} + "400": + application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} + "401": + application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} + "403": + application/json: {"error": {"code": 403, "message": "Only management keys can perform this operation"}} + "404": + application/json: {"error": {"code": 404, "message": "Resource not found"}} + "500": + application/json: {"error": {"code": 500, "message": "Internal Server Error"}} examplesVersion: 1.0.2 +releaseNotes: "## Python SDK Changes:\n* `open_router.chat.send()`: `request` **Changed** **Breaking** :warning:\n* `open_router.beta.responses.send()`: \n * `request` **Changed** **Breaking** :warning:\n * `response` **Changed** **Breaking** :warning:\n* `open_router.embeddings.generate()`: `response.usage.prompt_tokens_details` **Added**\n* `open_router.generations.get_generation()`: `response.data` **Changed**\n* `open_router.workspaces.delete()`: **Added**\n* `open_router.workspaces.get()`: **Added**\n* `open_router.workspaces.update()`: **Added**\n* `open_router.workspaces.bulk_add_members()`: **Added**\n* `open_router.workspaces.bulk_remove_members()`: **Added**\n* `open_router.workspaces.list()`: **Added**\n* `open_router.tts.create_speech()`: **Added**\n* `open_router.workspaces.create()`: **Added**\n* `open_router.guardrails.list()`: \n * `request.workspace_id` **Added**\n * `response.data.[].workspace_id` **Added**\n* `open_router.guardrails.create()`: \n * `request.workspace_id` **Added**\n * `response.data.workspace_id` **Added**\n * `error.status[403]` **Added**\n* `open_router.guardrails.get()`: `response.data.workspace_id` **Added**\n* `open_router.guardrails.update()`: `response.data.workspace_id` **Added**\n* `open_router.api_keys.list()`: \n * `request.workspace_id` **Added**\n * `response.data.[].workspace_id` **Added**\n* `open_router.api_keys.create()`: \n * `request.workspace_id` **Added**\n * `response.data.workspace_id` **Added**\n * `error.status[403]` **Added**\n* `open_router.api_keys.get()`: `response.data.workspace_id` **Added**\n* `open_router.api_keys.update()`: `response.data.workspace_id` **Added**\n* `open_router.generations.list_generation_content()`: **Added**\n* `open_router.video_generation.generate()`: \n * `request.provider.options.baidu` **Added**\n" diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index 27a3b9f..a104a8b 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -32,7 +32,7 @@ generation: skipResponseBodyAssertions: false preApplyUnionDiscriminators: true python: - version: 0.9.1 + version: 0.9.2 additionalDependencies: dev: {} main: {} diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml index 6cbf6ba..7284c66 100644 --- a/.speakeasy/out.openapi.yaml +++ b/.speakeasy/out.openapi.yaml @@ -1489,6 +1489,15 @@ components: - thinking - signature type: object + AnthropicThinkingDisplay: + enum: + - summarized + - omitted + - null + example: summarized + nullable: true + type: string + x-speakeasy-unknown-values: allow AnthropicThinkingTurns: example: type: thinking_turns @@ -2983,6 +2992,48 @@ components: description: Price per million prompt tokens example: 1000 type: string + BulkAddWorkspaceMembersRequest: + example: + user_ids: + - user_abc123 + - user_def456 + properties: + user_ids: + description: List of user IDs to add to the workspace. Members are assigned the same role they hold in the organization. + example: + - user_abc123 + - user_def456 + items: + type: string + maxItems: 100 + minItems: 1 + type: array + required: + - user_ids + type: object + BulkAddWorkspaceMembersResponse: + example: + added_count: 1 + data: + - created_at: '2025-08-24T10:30:00Z' + id: 660e8400-e29b-41d4-a716-446655440000 + role: member + user_id: user_abc123 + workspace_id: 550e8400-e29b-41d4-a716-446655440000 + properties: + added_count: + description: Number of workspace memberships created or updated + example: 2 + type: integer + data: + description: List of added workspace memberships + items: + $ref: '#/components/schemas/WorkspaceMember' + type: array + required: + - data + - added_count + type: object BulkAssignKeysRequest: example: key_hashes: @@ -3041,6 +3092,36 @@ components: required: - assigned_count type: object + BulkRemoveWorkspaceMembersRequest: + example: + user_ids: + - user_abc123 + - user_def456 + properties: + user_ids: + description: List of user IDs to remove from the workspace + example: + - user_abc123 + - user_def456 + items: + type: string + maxItems: 100 + minItems: 1 + type: array + required: + - user_ids + type: object + BulkRemoveWorkspaceMembersResponse: + example: + removed_count: 2 + properties: + removed_count: + description: Number of members removed + example: 2 + type: integer + required: + - removed_count + type: object BulkUnassignKeysRequest: example: key_hashes: @@ -3547,6 +3628,7 @@ components: - $ref: '#/components/schemas/DatetimeServerTool' - $ref: '#/components/schemas/ImageGenerationServerTool_OpenRouter' - $ref: '#/components/schemas/ChatSearchModelsServerTool' + - $ref: '#/components/schemas/WebFetchServerTool' - $ref: '#/components/schemas/OpenRouterWebSearchServerTool' - $ref: '#/components/schemas/ChatWebSearchShorthand' description: Tool definition for function calling (regular function or OpenRouter built-in server tool) @@ -3783,6 +3865,7 @@ components: context-compression: '#/components/schemas/ContextCompressionPlugin' file-parser: '#/components/schemas/FileParserPlugin' moderation: '#/components/schemas/ModerationPlugin' + pareto-router: '#/components/schemas/ParetoRouterPlugin' response-healing: '#/components/schemas/ResponseHealingPlugin' web: '#/components/schemas/WebSearchPlugin' propertyName: id @@ -3793,6 +3876,7 @@ components: - $ref: '#/components/schemas/FileParserPlugin' - $ref: '#/components/schemas/ResponseHealingPlugin' - $ref: '#/components/schemas/ContextCompressionPlugin' + - $ref: '#/components/schemas/ParetoRouterPlugin' type: array presence_penalty: description: Presence penalty (-2.0 to 2.0) @@ -4955,6 +5039,11 @@ components: type: string reset_interval: $ref: '#/components/schemas/GuardrailInterval' + workspace_id: + description: The workspace to create the guardrail in. Defaults to the default workspace if not provided. + example: 0df9e665-d932-5740-b2c7-b52af166bc11 + format: uuid + type: string required: - name type: object @@ -4976,6 +5065,7 @@ components: name: My New Guardrail reset_interval: monthly updated_at: null + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 properties: data: allOf: @@ -4984,6 +5074,89 @@ components: required: - data type: object + CreateWorkspaceRequest: + example: + default_image_model: openai/dall-e-3 + default_provider_sort: price + default_text_model: openai/gpt-4o + description: Production environment workspace + name: Production + slug: production + properties: + default_image_model: + description: Default image model for this workspace + example: openai/dall-e-3 + nullable: true + type: string + default_provider_sort: + description: Default provider sort preference (price, throughput, latency, exacto) + example: price + nullable: true + type: string + default_text_model: + description: Default text model for this workspace + example: openai/gpt-4o + nullable: true + type: string + description: + description: Description of the workspace + example: Production environment workspace + maxLength: 500 + nullable: true + type: string + is_data_discount_logging_enabled: + description: Whether data discount logging is enabled + example: true + type: boolean + is_observability_broadcast_enabled: + description: Whether broadcast is enabled + example: false + type: boolean + is_observability_io_logging_enabled: + description: Whether private logging is enabled + example: false + type: boolean + name: + description: Name for the new workspace + example: Production + maxLength: 100 + minLength: 1 + type: string + slug: + description: URL-friendly slug (lowercase alphanumeric and hyphens only) + example: production + maxLength: 50 + minLength: 1 + pattern: ^[a-z0-9-]+$ + type: string + required: + - name + - slug + type: object + CreateWorkspaceResponse: + example: + data: + created_at: '2025-08-24T10:30:00Z' + created_by: user_abc123 + default_image_model: openai/dall-e-3 + default_provider_sort: price + default_text_model: openai/gpt-4o + description: Production environment workspace + id: 550e8400-e29b-41d4-a716-446655440000 + is_data_discount_logging_enabled: true + is_observability_broadcast_enabled: false + is_observability_io_logging_enabled: false + name: Production + slug: production + updated_at: null + properties: + data: + allOf: + - $ref: '#/components/schemas/Workspace' + - description: The created workspace + required: + - data + type: object CustomTool: description: Custom tool configuration example: @@ -5104,6 +5277,18 @@ components: required: - deleted type: object + DeleteWorkspaceResponse: + example: + deleted: true + properties: + deleted: + const: true + description: Confirmation that the workspace was deleted + example: true + type: boolean + required: + - deleted + type: object DeprecatedRoute: deprecated: true description: >- @@ -5631,6 +5816,370 @@ components: - name - parameters type: object + GenerationContentData: + description: Stored prompt and completion content + example: + input: + messages: + - content: What is the meaning of life? + role: user + output: + completion: The meaning of life is a philosophical question... + reasoning: null + properties: + input: + anyOf: + - properties: + prompt: + example: What is the meaning of life? + type: string + required: + - prompt + type: object + - properties: + messages: + example: + - content: What is the meaning of life? + role: user + items: + nullable: true + type: array + required: + - messages + type: object + description: The input to the generation — either a prompt string or an array of messages + output: + description: The output from the generation + properties: + completion: + description: The completion output + example: The meaning of life is a philosophical question... + nullable: true + type: string + reasoning: + description: Reasoning/thinking output, if any + example: null + nullable: true + type: string + required: + - reasoning + - completion + type: object + required: + - input + - output + type: object + GenerationContentResponse: + description: Stored prompt and completion content for a generation + example: + data: + input: + messages: + - content: What is the meaning of life? + role: user + output: + completion: The meaning of life is a philosophical question... + reasoning: null + properties: + data: + $ref: '#/components/schemas/GenerationContentData' + required: + - data + type: object + GenerationResponse: + description: Generation response + example: + data: + api_type: completions + app_id: 12345 + cache_discount: null + cancelled: false + created_at: '2024-07-15T23:33:19.433273+00:00' + external_user: user-123 + finish_reason: stop + generation_time: 1200 + http_referer: https://openrouter.ai/ + id: gen-3bhGkxlo4XFrqiabUM7NDtwDzWwG + is_byok: false + latency: 1250 + model: sao10k/l3-stheno-8b + moderation_latency: 50 + native_finish_reason: stop + native_tokens_cached: 3 + native_tokens_completion: 25 + native_tokens_completion_images: 0 + native_tokens_prompt: 10 + native_tokens_reasoning: 5 + num_input_audio_prompt: 0 + num_media_completion: 0 + num_media_prompt: 1 + num_search_results: 5 + origin: https://openrouter.ai/ + provider_name: Infermatic + provider_responses: null + request_id: req-1727282430-aBcDeFgHiJkLmNoPqRsT + router: openrouter/auto + session_id: null + streamed: true + tokens_completion: 25 + tokens_prompt: 10 + total_cost: 0.0015 + upstream_id: chatcmpl-791bcf62-080e-4568-87d0-94c72e3b4946 + upstream_inference_cost: 0.0012 + usage: 0.0015 + user_agent: Mozilla/5.0 + properties: + data: + description: Generation data + properties: + api_type: + description: Type of API used for the generation + enum: + - completions + - embeddings + - rerank + - tts + - video + - null + nullable: true + type: string + x-speakeasy-unknown-values: allow + app_id: + description: ID of the app that made the request + example: 12345 + nullable: true + type: integer + cache_discount: + description: Discount applied due to caching + example: 0.0002 + format: double + nullable: true + type: number + cancelled: + description: Whether the generation was cancelled + example: false + nullable: true + type: boolean + created_at: + description: ISO 8601 timestamp of when the generation was created + example: '2024-07-15T23:33:19.433273+00:00' + type: string + external_user: + description: External user identifier + example: user-123 + nullable: true + type: string + finish_reason: + description: Reason the generation finished + example: stop + nullable: true + type: string + generation_time: + description: Time taken for generation in milliseconds + example: 1200 + format: double + nullable: true + type: number + http_referer: + description: Referer header from the request + nullable: true + type: string + id: + description: Unique identifier for the generation + example: gen-3bhGkxlo4XFrqiabUM7NDtwDzWwG + type: string + is_byok: + description: Whether this used bring-your-own-key + example: false + type: boolean + latency: + description: Total latency in milliseconds + example: 1250 + format: double + nullable: true + type: number + model: + description: Model used for the generation + example: sao10k/l3-stheno-8b + type: string + moderation_latency: + description: Moderation latency in milliseconds + example: 50 + format: double + nullable: true + type: number + native_finish_reason: + description: Native finish reason as reported by provider + example: stop + nullable: true + type: string + native_tokens_cached: + description: Native cached tokens as reported by provider + example: 3 + nullable: true + type: integer + native_tokens_completion: + description: Native completion tokens as reported by provider + example: 25 + nullable: true + type: integer + native_tokens_completion_images: + description: Native completion image tokens as reported by provider + example: 0 + nullable: true + type: integer + native_tokens_prompt: + description: Native prompt tokens as reported by provider + example: 10 + nullable: true + type: integer + native_tokens_reasoning: + description: Native reasoning tokens as reported by provider + example: 5 + nullable: true + type: integer + num_fetches: + description: Number of web fetches performed + example: 0 + nullable: true + type: integer + num_input_audio_prompt: + description: Number of audio inputs in the prompt + example: 0 + nullable: true + type: integer + num_media_completion: + description: Number of media items in the completion + example: 0 + nullable: true + type: integer + num_media_prompt: + description: Number of media items in the prompt + example: 1 + nullable: true + type: integer + num_search_results: + description: Number of search results included + example: 5 + nullable: true + type: integer + origin: + description: Origin URL of the request + example: https://openrouter.ai/ + type: string + provider_name: + description: Name of the provider that served the request + example: Infermatic + nullable: true + type: string + provider_responses: + description: List of provider responses for this generation, including fallback attempts + items: + $ref: '#/components/schemas/ProviderResponse' + nullable: true + type: array + request_id: + description: Unique identifier grouping all generations from a single API request + example: req-1727282430-aBcDeFgHiJkLmNoPqRsT + nullable: true + type: string + router: + description: Router used for the request (e.g., openrouter/auto) + example: openrouter/auto + nullable: true + type: string + session_id: + description: Session identifier grouping multiple generations in the same session + nullable: true + type: string + streamed: + description: Whether the response was streamed + example: true + nullable: true + type: boolean + tokens_completion: + description: Number of tokens in the completion + example: 25 + nullable: true + type: integer + tokens_prompt: + description: Number of tokens in the prompt + example: 10 + nullable: true + type: integer + total_cost: + description: Total cost of the generation in USD + example: 0.0015 + format: double + type: number + upstream_id: + description: Upstream provider's identifier for this generation + example: chatcmpl-791bcf62-080e-4568-87d0-94c72e3b4946 + nullable: true + type: string + upstream_inference_cost: + description: Cost charged by the upstream provider + example: 0.0012 + format: double + nullable: true + type: number + usage: + description: Usage amount in USD + example: 0.0015 + format: double + type: number + user_agent: + description: User-Agent header from the request + nullable: true + type: string + web_search_engine: + description: The resolved web search engine used for this generation (e.g. exa, firecrawl, parallel) + example: exa + nullable: true + type: string + required: + - id + - upstream_id + - total_cost + - cache_discount + - upstream_inference_cost + - created_at + - model + - app_id + - streamed + - cancelled + - provider_name + - latency + - moderation_latency + - generation_time + - finish_reason + - tokens_prompt + - tokens_completion + - native_tokens_prompt + - native_tokens_completion + - native_tokens_completion_images + - native_tokens_reasoning + - native_tokens_cached + - num_media_prompt + - num_input_audio_prompt + - num_media_completion + - num_search_results + - num_fetches + - web_search_engine + - origin + - usage + - is_byok + - native_finish_reason + - external_user + - api_type + - router + - provider_responses + - user_agent + - http_referer + type: object + required: + - data + type: object GetGuardrailResponse: example: data: @@ -5649,6 +6198,7 @@ components: name: Production Guardrail reset_interval: monthly updated_at: '2025-08-24T15:45:00Z' + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 properties: data: allOf: @@ -5657,6 +6207,30 @@ components: required: - data type: object + GetWorkspaceResponse: + example: + data: + created_at: '2025-08-24T10:30:00Z' + created_by: user_abc123 + default_image_model: openai/dall-e-3 + default_provider_sort: price + default_text_model: openai/gpt-4o + description: Production environment workspace + id: 550e8400-e29b-41d4-a716-446655440000 + is_data_discount_logging_enabled: true + is_observability_broadcast_enabled: false + is_observability_io_logging_enabled: false + name: Production + slug: production + updated_at: '2025-08-24T15:45:00Z' + properties: + data: + allOf: + - $ref: '#/components/schemas/Workspace' + - description: The workspace + required: + - data + type: object GoneResponse: description: Gone - Endpoint has been permanently removed or deprecated example: @@ -5710,6 +6284,7 @@ components: name: Production Guardrail reset_interval: monthly updated_at: '2025-08-24T15:45:00Z' + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 properties: allowed_models: description: Array of model canonical_slugs (immutable identifiers) @@ -5783,10 +6358,15 @@ components: example: '2025-08-24T15:45:00Z' nullable: true type: string + workspace_id: + description: The workspace ID this guardrail belongs to. + example: 0df9e665-d932-5740-b2c7-b52af166bc11 + type: string required: - id - name - created_at + - workspace_id type: object GuardrailInterval: description: Interval at which the limit resets (daily, weekly, monthly) @@ -5965,12 +6545,12 @@ components: Configuration for the openrouter:image_generation server tool. Accepts all image_config params (aspect_ratio, quality, size, background, output_format, output_compression, moderation, etc.) plus a model field. example: aspect_ratio: '16:9' - model: openai/gpt-image-1 + model: openai/gpt-5-image quality: high properties: model: - description: Which image generation model to use (e.g. "openai/gpt-image-1"). Defaults to "openai/gpt-image-1". - example: openai/gpt-image-1 + description: Which image generation model to use (e.g. "openai/gpt-5-image"). Defaults to "openai/gpt-5-image". + example: openai/gpt-5-image type: string type: object ImageGenerationStatus: @@ -6594,6 +7174,7 @@ components: name: Production Guardrail reset_interval: monthly updated_at: '2025-08-24T15:45:00Z' + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 total_count: 1 properties: data: @@ -6658,7 +7239,38 @@ components: - data - total_count type: object - McpServerTool: + ListWorkspacesResponse: + example: + data: + - created_at: '2025-08-24T10:30:00Z' + created_by: user_abc123 + default_image_model: openai/dall-e-3 + default_provider_sort: price + default_text_model: openai/gpt-4o + description: Production environment workspace + id: 550e8400-e29b-41d4-a716-446655440000 + is_data_discount_logging_enabled: true + is_observability_broadcast_enabled: false + is_observability_io_logging_enabled: false + name: Production + slug: production + updated_at: '2025-08-24T15:45:00Z' + total_count: 1 + properties: + data: + description: List of workspaces + items: + $ref: '#/components/schemas/Workspace' + type: array + total_count: + description: Total number of workspaces + example: 5 + type: integer + required: + - data + - total_count + type: object + McpServerTool: description: MCP (Model Context Protocol) tool configuration example: server_label: my-server @@ -7255,11 +7867,12 @@ components: properties: effort: description: >- - How much effort the model should put into its response. Higher effort levels may result in more thorough analysis but take longer. Valid values are `low`, `medium`, `high`, or `max`. + How much effort the model should put into its response. Higher effort levels may result in more thorough analysis but take longer. Valid values are `low`, `medium`, `high`, `xhigh`, or `max`. enum: - low - medium - high + - xhigh - max - null example: medium @@ -7283,6 +7896,29 @@ components: - type - schema type: object + task_budget: + description: >- + Task budget for an agentic turn. The model sees a countdown of remaining tokens and uses it to prioritize work and wind down gracefully. Advisory — does not enforce a hard cap. + example: + total: 400000 + type: tokens + nullable: true + properties: + remaining: + minimum: 0 + nullable: true + type: integer + total: + minimum: 20000 + type: integer + type: + enum: + - tokens + type: string + required: + - type + - total + type: object type: object MessagesPingEvent: description: Keep-alive ping event @@ -7423,6 +8059,7 @@ components: context-compression: '#/components/schemas/ContextCompressionPlugin' file-parser: '#/components/schemas/FileParserPlugin' moderation: '#/components/schemas/ModerationPlugin' + pareto-router: '#/components/schemas/ParetoRouterPlugin' response-healing: '#/components/schemas/ResponseHealingPlugin' web: '#/components/schemas/WebSearchPlugin' propertyName: id @@ -7433,6 +8070,7 @@ components: - $ref: '#/components/schemas/FileParserPlugin' - $ref: '#/components/schemas/ResponseHealingPlugin' - $ref: '#/components/schemas/ContextCompressionPlugin' + - $ref: '#/components/schemas/ParetoRouterPlugin' type: array provider: $ref: '#/components/schemas/ProviderPreferences' @@ -7475,6 +8113,8 @@ components: - properties: budget_tokens: type: integer + display: + $ref: '#/components/schemas/AnthropicThinkingDisplay' type: enum: - enabled @@ -7492,6 +8132,8 @@ components: - type type: object - properties: + display: + $ref: '#/components/schemas/AnthropicThinkingDisplay' type: enum: - adaptive @@ -7677,6 +8319,7 @@ components: - $ref: '#/components/schemas/DatetimeServerTool' - $ref: '#/components/schemas/ImageGenerationServerTool_OpenRouter' - $ref: '#/components/schemas/ChatSearchModelsServerTool' + - $ref: '#/components/schemas/WebFetchServerTool' - $ref: '#/components/schemas/OpenRouterWebSearchServerTool' type: array top_k: @@ -7699,6 +8342,23 @@ components: allOf: - $ref: '#/components/schemas/BaseMessagesResult' - properties: + context_management: + nullable: true + properties: + applied_edits: + items: + additionalProperties: + nullable: true + properties: + type: + type: string + required: + - type + type: object + type: array + required: + - applied_edits + type: object provider: $ref: '#/components/schemas/ProviderName' usage: @@ -7835,6 +8495,7 @@ components: - AionLabs - Alibaba - Ambient + - Baidu - Amazon Bedrock - Amazon Nova - Anthropic @@ -8861,6 +9522,8 @@ components: service_tier: nullable: true type: string + text: + $ref: '#/components/schemas/TextExtendedConfig' usage: $ref: '#/components/schemas/Usage' type: object @@ -9248,6 +9911,7 @@ components: example: id: ig_tmp_abc123 imageUrl: https://example.com/image.png + result: https://example.com/image.png status: completed type: openrouter:image_generation properties: @@ -9257,6 +9921,10 @@ components: type: string imageUrl: type: string + result: + description: The generated image as a base64-encoded string or URL, matching OpenAI image_generation_call format + nullable: true + type: string revisedPrompt: type: string status: @@ -9504,6 +10172,7 @@ components: openrouter:browser_use: '#/components/schemas/OutputBrowserUseServerToolItem' openrouter:code_interpreter: '#/components/schemas/OutputCodeInterpreterServerToolItem' openrouter:datetime: '#/components/schemas/OutputDatetimeItem' + openrouter:experimental__search_models: '#/components/schemas/OutputSearchModelsServerToolItem' openrouter:file_search: '#/components/schemas/OutputFileSearchServerToolItem' openrouter:image_generation: '#/components/schemas/OutputImageGenerationServerToolItem' openrouter:mcp: '#/components/schemas/OutputMcpServerToolItem' @@ -9545,6 +10214,7 @@ components: - $ref: '#/components/schemas/OutputToolSearchServerToolItem' - $ref: '#/components/schemas/OutputMemoryServerToolItem' - $ref: '#/components/schemas/OutputMcpServerToolItem' + - $ref: '#/components/schemas/OutputSearchModelsServerToolItem' OutputItemWebSearchCall: example: action: @@ -9748,6 +10418,7 @@ components: - audio - video - rerank + - tts example: text type: string x-speakeasy-unknown-values: allow @@ -9788,6 +10459,32 @@ components: - text: Analyzed the problem and found the optimal solution. type: summary_text type: reasoning + OutputSearchModelsServerToolItem: + description: An openrouter:experimental__search_models server tool output item + example: + arguments: '{"query":"Claude Opus"}' + id: sm_tmp_abc123 + query: Claude Opus + status: completed + type: openrouter:experimental__search_models + properties: + arguments: + description: The JSON arguments submitted to the search tool (e.g. {"query":"Claude"}) + type: string + id: + type: string + query: + type: string + status: + $ref: '#/components/schemas/ToolCallStatus' + type: + enum: + - openrouter:experimental__search_models + type: string + required: + - status + - type + type: object OutputTextEditorServerToolItem: description: An openrouter:text_editor server tool output item example: @@ -9926,6 +10623,30 @@ components: example: temperature type: string x-speakeasy-unknown-values: allow + ParetoRouterPlugin: + example: + enabled: true + id: pareto-router + min_coding_score: 0.8 + properties: + enabled: + description: Set to false to disable the pareto-router plugin for this request. Defaults to true. + type: boolean + id: + enum: + - pareto-router + type: string + min_coding_score: + description: >- + Minimum desired coding score between 0 and 1, where 1 is best. Higher values select from stronger coding models (sourced from Artificial Analysis coding percentiles). Maps internally to one of three tiers (low, medium, high). Omit to use the router default tier. + example: 0.8 + format: double + maximum: 1 + minimum: 0 + type: number + required: + - id + type: object PayloadTooLargeResponse: description: Payload Too Large - Request payload exceeds size limits example: @@ -10228,6 +10949,7 @@ components: - AionLabs - Alibaba - Ambient + - Baidu - Amazon Bedrock - Amazon Nova - Anthropic @@ -10533,6 +11255,7 @@ components: - AionLabs - Alibaba - Ambient + - Baidu - Amazon Bedrock - Amazon Nova - Anthropic @@ -11448,6 +12171,7 @@ components: context-compression: '#/components/schemas/ContextCompressionPlugin' file-parser: '#/components/schemas/FileParserPlugin' moderation: '#/components/schemas/ModerationPlugin' + pareto-router: '#/components/schemas/ParetoRouterPlugin' response-healing: '#/components/schemas/ResponseHealingPlugin' web: '#/components/schemas/WebSearchPlugin' propertyName: id @@ -11458,6 +12182,7 @@ components: - $ref: '#/components/schemas/FileParserPlugin' - $ref: '#/components/schemas/ResponseHealingPlugin' - $ref: '#/components/schemas/ContextCompressionPlugin' + - $ref: '#/components/schemas/ParetoRouterPlugin' type: array presence_penalty: format: double @@ -11554,6 +12279,7 @@ components: - $ref: '#/components/schemas/DatetimeServerTool' - $ref: '#/components/schemas/ImageGenerationServerTool_OpenRouter' - $ref: '#/components/schemas/ChatSearchModelsServerTool' + - $ref: '#/components/schemas/WebFetchServerTool' - $ref: '#/components/schemas/WebSearchServerTool_OpenRouter' type: array top_k: @@ -11596,7 +12322,7 @@ components: type: object SearchQualityLevel: description: >- - How much context to retrieve per result. Defaults to medium (15000 chars). Only applies when using the Exa engine; ignored with native provider search. + How much context to retrieve per result. Defaults to medium (15000 chars). Applies to Exa and Parallel engines; ignored with native provider search and Firecrawl. enum: - low - medium @@ -11662,752 +12388,29 @@ components: required: - type type: object - StoredPromptTemplate: + SpeechRequest: + description: Text-to-speech request input example: - id: prompt-abc123 - variables: - name: John - nullable: true + input: Hello world + model: elevenlabs/eleven-turbo-v2 + response_format: pcm + speed: 1 + voice: alloy properties: - id: + input: + description: Text to synthesize + example: Hello world type: string - variables: - additionalProperties: - anyOf: - - type: string - - $ref: '#/components/schemas/InputText' - - $ref: '#/components/schemas/InputImage' - - $ref: '#/components/schemas/InputFile' - nullable: true - type: object - required: - - id - type: object - StreamEvents: - description: Union of all possible event types emitted during response streaming - discriminator: - mapping: - error: '#/components/schemas/ErrorEvent' - response.completed: '#/components/schemas/StreamEventsResponseCompleted' - response.content_part.added: '#/components/schemas/ContentPartAddedEvent' - response.content_part.done: '#/components/schemas/ContentPartDoneEvent' - response.created: '#/components/schemas/OpenResponsesCreatedEvent' - response.failed: '#/components/schemas/StreamEventsResponseFailed' - response.function_call_arguments.delta: '#/components/schemas/FunctionCallArgsDeltaEvent' - response.function_call_arguments.done: '#/components/schemas/FunctionCallArgsDoneEvent' - response.image_generation_call.completed: '#/components/schemas/ImageGenCallCompletedEvent' - response.image_generation_call.generating: '#/components/schemas/ImageGenCallGeneratingEvent' - response.image_generation_call.in_progress: '#/components/schemas/ImageGenCallInProgressEvent' - response.image_generation_call.partial_image: '#/components/schemas/ImageGenCallPartialImageEvent' - response.in_progress: '#/components/schemas/OpenResponsesInProgressEvent' - response.incomplete: '#/components/schemas/StreamEventsResponseIncomplete' - response.output_item.added: '#/components/schemas/StreamEventsResponseOutputItemAdded' - response.output_item.done: '#/components/schemas/StreamEventsResponseOutputItemDone' - response.output_text.annotation.added: '#/components/schemas/AnnotationAddedEvent' - response.output_text.delta: '#/components/schemas/TextDeltaEvent' - response.output_text.done: '#/components/schemas/TextDoneEvent' - response.reasoning_summary_part.added: '#/components/schemas/ReasoningSummaryPartAddedEvent' - response.reasoning_summary_part.done: '#/components/schemas/ReasoningSummaryPartDoneEvent' - response.reasoning_summary_text.delta: '#/components/schemas/ReasoningSummaryTextDeltaEvent' - response.reasoning_summary_text.done: '#/components/schemas/ReasoningSummaryTextDoneEvent' - response.reasoning_text.delta: '#/components/schemas/ReasoningDeltaEvent' - response.reasoning_text.done: '#/components/schemas/ReasoningDoneEvent' - response.refusal.delta: '#/components/schemas/RefusalDeltaEvent' - response.refusal.done: '#/components/schemas/RefusalDoneEvent' - response.web_search_call.completed: '#/components/schemas/WebSearchCallCompletedEvent' - response.web_search_call.in_progress: '#/components/schemas/WebSearchCallInProgressEvent' - response.web_search_call.searching: '#/components/schemas/WebSearchCallSearchingEvent' - propertyName: type - example: - response: - created_at: 1704067200 - error: null - id: resp-abc123 - incomplete_details: null - instructions: null - max_output_tokens: null - metadata: null - model: gpt-4 - object: response - output: [] - parallel_tool_calls: true - status: in_progress - temperature: null - tool_choice: auto - tools: [] - top_p: null - sequence_number: 0 - type: response.created - oneOf: - - $ref: '#/components/schemas/OpenResponsesCreatedEvent' - - $ref: '#/components/schemas/OpenResponsesInProgressEvent' - - $ref: '#/components/schemas/StreamEventsResponseCompleted' - - $ref: '#/components/schemas/StreamEventsResponseIncomplete' - - $ref: '#/components/schemas/StreamEventsResponseFailed' - - $ref: '#/components/schemas/ErrorEvent' - - $ref: '#/components/schemas/StreamEventsResponseOutputItemAdded' - - $ref: '#/components/schemas/StreamEventsResponseOutputItemDone' - - $ref: '#/components/schemas/ContentPartAddedEvent' - - $ref: '#/components/schemas/ContentPartDoneEvent' - - $ref: '#/components/schemas/TextDeltaEvent' - - $ref: '#/components/schemas/TextDoneEvent' - - $ref: '#/components/schemas/RefusalDeltaEvent' - - $ref: '#/components/schemas/RefusalDoneEvent' - - $ref: '#/components/schemas/AnnotationAddedEvent' - - $ref: '#/components/schemas/FunctionCallArgsDeltaEvent' - - $ref: '#/components/schemas/FunctionCallArgsDoneEvent' - - $ref: '#/components/schemas/ReasoningDeltaEvent' - - $ref: '#/components/schemas/ReasoningDoneEvent' - - $ref: '#/components/schemas/ReasoningSummaryPartAddedEvent' - - $ref: '#/components/schemas/ReasoningSummaryPartDoneEvent' - - $ref: '#/components/schemas/ReasoningSummaryTextDeltaEvent' - - $ref: '#/components/schemas/ReasoningSummaryTextDoneEvent' - - $ref: '#/components/schemas/ImageGenCallInProgressEvent' - - $ref: '#/components/schemas/ImageGenCallGeneratingEvent' - - $ref: '#/components/schemas/ImageGenCallPartialImageEvent' - - $ref: '#/components/schemas/ImageGenCallCompletedEvent' - - $ref: '#/components/schemas/WebSearchCallInProgressEvent' - - $ref: '#/components/schemas/WebSearchCallSearchingEvent' - - $ref: '#/components/schemas/WebSearchCallCompletedEvent' - StreamEventsResponseCompleted: - allOf: - - $ref: '#/components/schemas/CompletedEvent' - - properties: - response: - $ref: '#/components/schemas/OpenResponsesResult' - type: object - description: Event emitted when a response has completed successfully - example: - response: - created_at: 1704067200 - error: null - id: resp-abc123 - incomplete_details: null - instructions: null - max_output_tokens: null - metadata: null - model: gpt-4 - object: response - output: [] - parallel_tool_calls: true - status: completed - temperature: null - tool_choice: auto - tools: [] - top_p: null - sequence_number: 10 - type: response.completed - StreamEventsResponseFailed: - allOf: - - $ref: '#/components/schemas/FailedEvent' - - properties: - response: - $ref: '#/components/schemas/OpenResponsesResult' - type: object - description: Event emitted when a response has failed - example: - response: - created_at: 1704067200 - error: null - id: resp-abc123 - incomplete_details: null - instructions: null - max_output_tokens: null - metadata: null - model: gpt-4 - object: response - output: [] - parallel_tool_calls: true - status: failed - temperature: null - tool_choice: auto - tools: [] - top_p: null - sequence_number: 3 - type: response.failed - StreamEventsResponseIncomplete: - allOf: - - $ref: '#/components/schemas/IncompleteEvent' - - properties: - response: - $ref: '#/components/schemas/OpenResponsesResult' - type: object - description: Event emitted when a response is incomplete - example: - response: - created_at: 1704067200 - error: null - id: resp-abc123 - incomplete_details: null - instructions: null - max_output_tokens: null - metadata: null - model: gpt-4 - object: response - output: [] - parallel_tool_calls: true - status: incomplete - temperature: null - tool_choice: auto - tools: [] - top_p: null - sequence_number: 5 - type: response.incomplete - StreamEventsResponseOutputItemAdded: - allOf: - - $ref: '#/components/schemas/OutputItemAddedEvent' - - properties: - item: - $ref: '#/components/schemas/OutputItems' - type: object - description: Event emitted when a new output item is added to the response - example: - item: - content: [] - id: item-1 - role: assistant - status: in_progress - type: message - output_index: 0 - sequence_number: 2 - type: response.output_item.added - StreamEventsResponseOutputItemDone: - allOf: - - $ref: '#/components/schemas/OutputItemDoneEvent' - - properties: - item: - $ref: '#/components/schemas/OutputItems' - type: object - description: Event emitted when an output item is complete - example: - item: - content: - - annotations: [] - text: Hello! How can I help you? - type: output_text - id: item-1 - role: assistant - status: completed - type: message - output_index: 0 - sequence_number: 8 - type: response.output_item.done - StreamLogprob: - allOf: - - $ref: '#/components/schemas/OpenResponsesLogProbs' - - properties: - top_logprobs: - items: - $ref: '#/components/schemas/StreamLogprobTopLogprob' - type: array - type: object - description: Log probability information for a token - example: - bytes: - - 72 - - 101 - - 108 - - 108 - - 111 - logprob: -0.5 - token: Hello - top_logprobs: [] - StreamLogprobTopLogprob: - allOf: - - $ref: '#/components/schemas/OpenResponsesTopLogprobs' - - properties: {} - type: object - description: Alternative token with its log probability - example: - bytes: - - 72 - - 101 - - 108 - - 108 - - 111 - logprob: -0.5 - token: Hello - TextConfig: - description: Text output configuration including format and verbosity - example: - format: - type: text - verbosity: medium - properties: - format: - $ref: '#/components/schemas/Formats' - verbosity: - enum: - - high - - low - - medium - - null - nullable: true - type: string - x-speakeasy-unknown-values: allow - type: object - TextDeltaEvent: - allOf: - - $ref: '#/components/schemas/BaseTextDeltaEvent' - - properties: - logprobs: - items: - $ref: '#/components/schemas/StreamLogprob' - type: array - type: object - description: Event emitted when a text delta is streamed - example: - content_index: 0 - delta: Hello - item_id: item-1 - logprobs: [] - output_index: 0 - sequence_number: 4 - type: response.output_text.delta - TextDoneEvent: - allOf: - - $ref: '#/components/schemas/BaseTextDoneEvent' - - properties: - logprobs: - items: - $ref: '#/components/schemas/StreamLogprob' - type: array - type: object - description: Event emitted when text streaming is complete - example: - content_index: 0 - item_id: item-1 - logprobs: [] - output_index: 0 - sequence_number: 6 - text: Hello! How can I help you? - type: response.output_text.done - TextExtendedConfig: - allOf: - - $ref: '#/components/schemas/TextConfig' - - properties: {} - type: object - description: Text output configuration including format and verbosity - example: - format: - type: text - ToolCallStatus: - enum: - - in_progress - - completed - - incomplete - example: completed - type: string - x-speakeasy-unknown-values: allow - ToolChoiceAllowed: - description: Constrains the model to a pre-defined set of allowed tools - example: - mode: auto - tools: - - name: get_weather - type: function - type: allowed_tools - properties: - mode: - anyOf: - - enum: - - auto - type: string - - enum: - - required - type: string - tools: - items: - additionalProperties: - nullable: true - type: object - type: array - type: - enum: - - allowed_tools - type: string - required: - - type - - mode - - tools - type: object - TooManyRequestsResponse: - description: Too Many Requests - Rate limit exceeded - example: - error: - code: 429 - message: Rate limit exceeded - properties: - error: - $ref: '#/components/schemas/TooManyRequestsResponseErrorData' - user_id: - nullable: true - type: string - required: - - error - type: object - TooManyRequestsResponseErrorData: - description: Error data for TooManyRequestsResponse - example: - code: 429 - message: Rate limit exceeded - properties: - code: - type: integer - message: + model: + description: TTS model identifier + example: elevenlabs/eleven-turbo-v2 type: string - metadata: - additionalProperties: - nullable: true - nullable: true - type: object - required: - - code - - message - type: object - TopProviderInfo: - description: Information about the top provider for this model - example: - context_length: 8192 - is_moderated: true - max_completion_tokens: 4096 - properties: - context_length: - description: Context length from the top provider - example: 8192 - nullable: true - type: integer - is_moderated: - description: Whether the top provider moderates content - example: true - type: boolean - max_completion_tokens: - description: Maximum completion tokens from the top provider - example: 4096 - nullable: true - type: integer - required: - - is_moderated - type: object - TraceConfig: - additionalProperties: - nullable: true - description: >- - Metadata for observability and tracing. Known keys (trace_id, trace_name, span_name, generation_name, parent_span_id) have special handling. Additional keys are passed through as custom metadata to configured broadcast destinations. - example: - trace_id: trace-abc123 - trace_name: my-app-trace - properties: - generation_name: - type: string - parent_span_id: - type: string - span_name: - type: string - trace_id: - type: string - trace_name: - type: string - type: object - Truncation: - enum: - - auto - - disabled - - null - example: auto - nullable: true - type: string - x-speakeasy-unknown-values: allow - UnauthorizedResponse: - description: Unauthorized - Authentication required or invalid credentials - example: - error: - code: 401 - message: Missing Authentication header - properties: - error: - $ref: '#/components/schemas/UnauthorizedResponseErrorData' - user_id: - nullable: true - type: string - required: - - error - type: object - UnauthorizedResponseErrorData: - description: Error data for UnauthorizedResponse - example: - code: 401 - message: Missing Authentication header - properties: - code: - type: integer - message: - type: string - metadata: - additionalProperties: - nullable: true - nullable: true - type: object - required: - - code - - message - type: object - UnprocessableEntityResponse: - description: Unprocessable Entity - Semantic validation failure - example: - error: - code: 422 - message: Invalid argument - properties: - error: - $ref: '#/components/schemas/UnprocessableEntityResponseErrorData' - user_id: - nullable: true - type: string - required: - - error - type: object - UnprocessableEntityResponseErrorData: - description: Error data for UnprocessableEntityResponse - example: - code: 422 - message: Invalid argument - properties: - code: - type: integer - message: - type: string - metadata: - additionalProperties: - nullable: true - nullable: true - type: object - required: - - code - - message - type: object - UpdateGuardrailRequest: - example: - description: Updated description - limit_usd: 75 - name: Updated Guardrail Name - reset_interval: weekly - properties: - allowed_models: - description: Array of model identifiers (slug or canonical_slug accepted) - example: - - openai/gpt-5.2 - items: - type: string - minItems: 1 - nullable: true - type: array - allowed_providers: - description: New list of allowed provider IDs - example: - - openai - - anthropic - - deepseek - items: - type: string - minItems: 1 - nullable: true - type: array - description: - description: New description for the guardrail - example: Updated description - maxLength: 1000 - nullable: true - type: string - enforce_zdr: - description: Whether to enforce zero data retention - example: true - nullable: true - type: boolean - ignored_models: - description: Array of model identifiers to exclude from routing (slug or canonical_slug accepted) - example: - - openai/gpt-4o-mini - items: - type: string - minItems: 1 - nullable: true - type: array - ignored_providers: - description: List of provider IDs to exclude from routing - example: - - azure - items: - type: string - minItems: 1 - nullable: true - type: array - limit_usd: - description: New spending limit in USD - example: 75 - format: double - nullable: true - type: number - name: - description: New name for the guardrail - example: Updated Guardrail Name - maxLength: 200 - minLength: 1 - type: string - reset_interval: - $ref: '#/components/schemas/GuardrailInterval' - type: object - UpdateGuardrailResponse: - example: - data: - allowed_models: null - allowed_providers: - - openai - created_at: '2025-08-24T10:30:00Z' - description: Updated description - enforce_zdr: true - id: 550e8400-e29b-41d4-a716-446655440000 - ignored_models: null - ignored_providers: null - limit_usd: 75 - name: Updated Guardrail Name - reset_interval: weekly - updated_at: '2025-08-24T16:00:00Z' - properties: - data: - allOf: - - $ref: '#/components/schemas/Guardrail' - - description: The updated guardrail - required: - - data - type: object - URLCitation: - example: - end_index: 42 - start_index: 0 - title: OpenRouter Documentation - type: url_citation - url: https://openrouter.ai/docs - properties: - end_index: - type: integer - start_index: - type: integer - title: - type: string - type: - enum: - - url_citation - type: string - url: - type: string - required: - - type - - url - - title - - start_index - - end_index - type: object - Usage: - allOf: - - $ref: '#/components/schemas/OpenAIResponsesUsage' - - nullable: true + provider: + description: Provider-specific passthrough configuration properties: - cost: - description: Cost of the completion - format: double - nullable: true - type: number - cost_details: - properties: - upstream_inference_cost: - format: double - nullable: true - type: number - upstream_inference_input_cost: - format: double - type: number - upstream_inference_output_cost: - format: double - type: number - required: - - upstream_inference_input_cost - - upstream_inference_output_cost - type: object - is_byok: - description: Whether a request was made using a Bring Your Own Key configuration - type: boolean - type: object - description: Token usage information for the response - example: - cost: 0.0012 - cost_details: - upstream_inference_cost: null - upstream_inference_input_cost: 0.0008 - upstream_inference_output_cost: 0.0004 - input_tokens: 10 - input_tokens_details: - cached_tokens: 0 - output_tokens: 25 - output_tokens_details: - reasoning_tokens: 0 - total_tokens: 35 - VideoGenerationRequest: - example: - aspect_ratio: '16:9' - duration: 8 - model: google/veo-3.1 - prompt: A serene mountain landscape at sunset - resolution: 720p - properties: - aspect_ratio: - description: Aspect ratio of the generated video - enum: - - '16:9' - - '9:16' - - '1:1' - - '4:3' - - '3:4' - - '21:9' - - '9:21' - example: '16:9' - type: string - x-speakeasy-unknown-values: allow - duration: - description: Duration of the generated video in seconds - example: 8 - minimum: 1 - type: integer - frame_images: - description: >- - Images to use as the first and/or last frame of the generated video. Each image must specify a frame_type of first_frame or last_frame. - items: - $ref: '#/components/schemas/FrameImage' - type: array - generate_audio: - description: >- - Whether to generate audio alongside the video. Defaults to the endpoint's generate_audio capability flag, false if not set. - example: true - type: boolean - input_references: - description: Reference images to guide video generation - items: - $ref: '#/components/schemas/ContentPartImage' - type: array - model: - type: string - prompt: - type: string - provider: - description: Provider-specific passthrough configuration - properties: - options: - description: >- - Provider-specific options keyed by provider slug. The options for the matched provider are spread into the upstream request body. - example: - google-vertex: - output_config: - effort: low + options: + description: >- + Provider-specific options keyed by provider slug. The options for the matched provider are spread into the upstream request body. properties: 01ai: additionalProperties: @@ -12469,6 +12472,10 @@ components: additionalProperties: nullable: true type: object + baidu: + additionalProperties: + nullable: true + type: object baseten: additionalProperties: nullable: true @@ -12835,1346 +12842,2955 @@ components: type: object type: object type: object - resolution: - description: Resolution of the generated video + response_format: + default: pcm + description: Audio output format enum: - - 480p - - 720p - - 1080p - - 1K - - 2K - - 4K - example: 720p + - mp3 + - pcm + example: pcm type: string x-speakeasy-unknown-values: allow - seed: - description: >- - If specified, the generation will sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed for all providers. - type: integer - size: + speed: description: >- - Exact pixel dimensions of the generated video in "WIDTHxHEIGHT" format (e.g. "1280x720"). Interchangeable with resolution + aspect_ratio. - example: 1280x720 + Playback speed multiplier. Only used by models that support it (e.g. OpenAI TTS). Ignored by other providers. + example: 1 + format: double + type: number + voice: + description: Voice identifier (provider-specific). + example: alloy type: string required: - - prompt - model + - input + - voice type: object - VideoGenerationResponse: + StoredPromptTemplate: example: - generation_id: gen-xyz789 - id: job-abc123 - polling_url: /api/v1/videos/job-abc123 - status: pending + id: prompt-abc123 + variables: + name: John + nullable: true properties: - error: - type: string - generation_id: - description: The generation ID associated with this video generation job. Available once the job has been processed. - type: string id: type: string - polling_url: - type: string - status: - enum: - - pending - - in_progress - - completed - - failed - - cancelled - - expired - type: string - x-speakeasy-unknown-values: allow - unsigned_urls: - items: - type: string - type: array - usage: - $ref: '#/components/schemas/VideoGenerationUsage' + variables: + additionalProperties: + anyOf: + - type: string + - $ref: '#/components/schemas/InputText' + - $ref: '#/components/schemas/InputImage' + - $ref: '#/components/schemas/InputFile' + nullable: true + type: object required: - id - - polling_url - - status type: object - VideoGenerationUsage: - description: Usage and cost information for the video generation. Available once the job has completed. + StreamEvents: + description: Union of all possible event types emitted during response streaming + discriminator: + mapping: + error: '#/components/schemas/ErrorEvent' + response.completed: '#/components/schemas/StreamEventsResponseCompleted' + response.content_part.added: '#/components/schemas/ContentPartAddedEvent' + response.content_part.done: '#/components/schemas/ContentPartDoneEvent' + response.created: '#/components/schemas/OpenResponsesCreatedEvent' + response.failed: '#/components/schemas/StreamEventsResponseFailed' + response.function_call_arguments.delta: '#/components/schemas/FunctionCallArgsDeltaEvent' + response.function_call_arguments.done: '#/components/schemas/FunctionCallArgsDoneEvent' + response.image_generation_call.completed: '#/components/schemas/ImageGenCallCompletedEvent' + response.image_generation_call.generating: '#/components/schemas/ImageGenCallGeneratingEvent' + response.image_generation_call.in_progress: '#/components/schemas/ImageGenCallInProgressEvent' + response.image_generation_call.partial_image: '#/components/schemas/ImageGenCallPartialImageEvent' + response.in_progress: '#/components/schemas/OpenResponsesInProgressEvent' + response.incomplete: '#/components/schemas/StreamEventsResponseIncomplete' + response.output_item.added: '#/components/schemas/StreamEventsResponseOutputItemAdded' + response.output_item.done: '#/components/schemas/StreamEventsResponseOutputItemDone' + response.output_text.annotation.added: '#/components/schemas/AnnotationAddedEvent' + response.output_text.delta: '#/components/schemas/TextDeltaEvent' + response.output_text.done: '#/components/schemas/TextDoneEvent' + response.reasoning_summary_part.added: '#/components/schemas/ReasoningSummaryPartAddedEvent' + response.reasoning_summary_part.done: '#/components/schemas/ReasoningSummaryPartDoneEvent' + response.reasoning_summary_text.delta: '#/components/schemas/ReasoningSummaryTextDeltaEvent' + response.reasoning_summary_text.done: '#/components/schemas/ReasoningSummaryTextDoneEvent' + response.reasoning_text.delta: '#/components/schemas/ReasoningDeltaEvent' + response.reasoning_text.done: '#/components/schemas/ReasoningDoneEvent' + response.refusal.delta: '#/components/schemas/RefusalDeltaEvent' + response.refusal.done: '#/components/schemas/RefusalDoneEvent' + response.web_search_call.completed: '#/components/schemas/WebSearchCallCompletedEvent' + response.web_search_call.in_progress: '#/components/schemas/WebSearchCallInProgressEvent' + response.web_search_call.searching: '#/components/schemas/WebSearchCallSearchingEvent' + propertyName: type example: - cost: 0.5 - is_byok: false - properties: - cost: - description: The cost of the video generation in USD. - format: double - nullable: true - type: number - is_byok: - description: Whether the request was made using a Bring Your Own Key configuration. - type: boolean - type: object - VideoModel: + response: + created_at: 1704067200 + error: null + id: resp-abc123 + incomplete_details: null + instructions: null + max_output_tokens: null + metadata: null + model: gpt-4 + object: response + output: [] + parallel_tool_calls: true + status: in_progress + temperature: null + tool_choice: auto + tools: [] + top_p: null + sequence_number: 0 + type: response.created + oneOf: + - $ref: '#/components/schemas/OpenResponsesCreatedEvent' + - $ref: '#/components/schemas/OpenResponsesInProgressEvent' + - $ref: '#/components/schemas/StreamEventsResponseCompleted' + - $ref: '#/components/schemas/StreamEventsResponseIncomplete' + - $ref: '#/components/schemas/StreamEventsResponseFailed' + - $ref: '#/components/schemas/ErrorEvent' + - $ref: '#/components/schemas/StreamEventsResponseOutputItemAdded' + - $ref: '#/components/schemas/StreamEventsResponseOutputItemDone' + - $ref: '#/components/schemas/ContentPartAddedEvent' + - $ref: '#/components/schemas/ContentPartDoneEvent' + - $ref: '#/components/schemas/TextDeltaEvent' + - $ref: '#/components/schemas/TextDoneEvent' + - $ref: '#/components/schemas/RefusalDeltaEvent' + - $ref: '#/components/schemas/RefusalDoneEvent' + - $ref: '#/components/schemas/AnnotationAddedEvent' + - $ref: '#/components/schemas/FunctionCallArgsDeltaEvent' + - $ref: '#/components/schemas/FunctionCallArgsDoneEvent' + - $ref: '#/components/schemas/ReasoningDeltaEvent' + - $ref: '#/components/schemas/ReasoningDoneEvent' + - $ref: '#/components/schemas/ReasoningSummaryPartAddedEvent' + - $ref: '#/components/schemas/ReasoningSummaryPartDoneEvent' + - $ref: '#/components/schemas/ReasoningSummaryTextDeltaEvent' + - $ref: '#/components/schemas/ReasoningSummaryTextDoneEvent' + - $ref: '#/components/schemas/ImageGenCallInProgressEvent' + - $ref: '#/components/schemas/ImageGenCallGeneratingEvent' + - $ref: '#/components/schemas/ImageGenCallPartialImageEvent' + - $ref: '#/components/schemas/ImageGenCallCompletedEvent' + - $ref: '#/components/schemas/WebSearchCallInProgressEvent' + - $ref: '#/components/schemas/WebSearchCallSearchingEvent' + - $ref: '#/components/schemas/WebSearchCallCompletedEvent' + StreamEventsResponseCompleted: + allOf: + - $ref: '#/components/schemas/CompletedEvent' + - properties: + response: + $ref: '#/components/schemas/OpenResponsesResult' + type: object + description: Event emitted when a response has completed successfully example: - allowed_passthrough_parameters: [] - canonical_slug: google/veo-3.1 - created: 1700000000 - description: Google video generation model - generate_audio: true - id: google/veo-3.1 - name: Veo 3.1 - pricing_skus: - generate: '0.50' - seed: null - supported_aspect_ratios: - - '16:9' - supported_durations: - - 5 - - 8 - supported_frame_images: - - first_frame - - last_frame - supported_resolutions: - - 720p - supported_sizes: null - properties: - allowed_passthrough_parameters: - description: List of parameters that are allowed to be passed through to the provider - items: - type: string - type: array - canonical_slug: - description: Canonical slug for the model - example: openai/gpt-4 - type: string - created: - description: Unix timestamp of when the model was created - example: 1692901234 - type: integer - description: - description: Description of the model - example: GPT-4 is a large multimodal model that can solve difficult problems with greater accuracy. - type: string - generate_audio: - description: Whether the model supports generating audio alongside video - nullable: true - type: boolean - hugging_face_id: - description: Hugging Face model identifier, if applicable - example: microsoft/DialoGPT-medium - nullable: true - type: string - id: - description: Unique identifier for the model - example: openai/gpt-4 - type: string - name: - description: Display name of the model - example: GPT-4 - type: string - pricing_skus: - additionalProperties: - type: string - description: Pricing SKUs with provider prefix stripped, values as strings - nullable: true - type: object - seed: - description: Whether the model supports deterministic generation via seed parameter - nullable: true - type: boolean - supported_aspect_ratios: - description: Supported output aspect ratios - items: - enum: - - '16:9' - - '9:16' - - '1:1' - - '4:3' - - '3:4' - - '21:9' - - '9:21' - type: string - x-speakeasy-unknown-values: allow - nullable: true - type: array - supported_durations: - description: Supported video durations in seconds - items: - type: integer - nullable: true - type: array - supported_frame_images: - description: Supported frame image types (e.g. first_frame, last_frame) - items: - enum: - - first_frame - - last_frame - type: string - x-speakeasy-unknown-values: allow - nullable: true - type: array - supported_resolutions: - description: Supported output resolutions - items: - enum: - - 480p - - 720p - - 1080p - - 1K - - 2K - - 4K - type: string - x-speakeasy-unknown-values: allow - nullable: true - type: array - supported_sizes: - description: Supported output sizes (width x height) - items: - enum: - - 480x480 - - 480x640 - - 480x854 - - 480x1120 - - 640x480 - - 720x720 - - 720x960 - - 720x1280 - - 720x1680 - - 854x480 - - 960x720 - - 1080x1080 - - 1080x1440 - - 1080x1920 - - 1080x2520 - - 1120x480 - - 1280x720 - - 1440x1080 - - 1680x720 - - 1920x1080 - - 2160x2160 - - 2160x2880 - - 2160x3840 - - 2160x5040 - - 2520x1080 - - 2880x2160 - - 3840x2160 - - 5040x2160 - type: string - x-speakeasy-unknown-values: allow - nullable: true - type: array - required: - - id - - canonical_slug - - name - - created - - supported_resolutions - - supported_aspect_ratios - - supported_sizes - - supported_durations - - supported_frame_images - - generate_audio - - seed - - allowed_passthrough_parameters - type: object - VideoModelsListResponse: - example: - data: - - allowed_passthrough_parameters: [] - canonical_slug: google/veo-3.1 - created: 1700000000 - description: Google video generation model - generate_audio: true - id: google/veo-3.1 - name: Veo 3.1 - pricing_skus: - generate: '0.50' - seed: null - supported_aspect_ratios: - - '16:9' - supported_durations: - - 5 - - 8 - supported_frame_images: - - first_frame - - last_frame - supported_resolutions: - - 720p - supported_sizes: null - properties: - data: - items: - $ref: '#/components/schemas/VideoModel' - type: array - required: - - data - type: object - WebSearchCallCompletedEvent: + response: + created_at: 1704067200 + error: null + id: resp-abc123 + incomplete_details: null + instructions: null + max_output_tokens: null + metadata: null + model: gpt-4 + object: response + output: [] + parallel_tool_calls: true + status: completed + temperature: null + tool_choice: auto + tools: [] + top_p: null + sequence_number: 10 + type: response.completed + StreamEventsResponseFailed: allOf: - - $ref: '#/components/schemas/OpenAIResponsesSearchCompleted' - - properties: {} + - $ref: '#/components/schemas/FailedEvent' + - properties: + response: + $ref: '#/components/schemas/OpenResponsesResult' type: object - description: Web search call completed + description: Event emitted when a response has failed example: - item_id: ws-123 - output_index: 0 + response: + created_at: 1704067200 + error: null + id: resp-abc123 + incomplete_details: null + instructions: null + max_output_tokens: null + metadata: null + model: gpt-4 + object: response + output: [] + parallel_tool_calls: true + status: failed + temperature: null + tool_choice: auto + tools: [] + top_p: null sequence_number: 3 - type: response.web_search_call.completed - WebSearchCallInProgressEvent: - allOf: - - $ref: '#/components/schemas/OpenAIResponsesWebSearchCallInProgress' - - properties: {} - type: object - description: Web search call in progress - example: - item_id: ws-123 - output_index: 0 - sequence_number: 1 - type: response.web_search_call.in_progress - WebSearchCallSearchingEvent: + type: response.failed + StreamEventsResponseIncomplete: allOf: - - $ref: '#/components/schemas/OpenAIResponsesWebSearchCallSearching' - - properties: {} + - $ref: '#/components/schemas/IncompleteEvent' + - properties: + response: + $ref: '#/components/schemas/OpenResponsesResult' type: object - description: Web search call is searching - example: - item_id: ws-123 - output_index: 0 - sequence_number: 2 - type: response.web_search_call.searching - WebSearchConfig: + description: Event emitted when a response is incomplete example: - max_results: 5 - search_context_size: medium - properties: - allowed_domains: - description: >- - Limit search results to these domains. Supported by Exa, Parallel, and most native providers (Anthropic, OpenAI, xAI). Not supported with Firecrawl or Perplexity. - items: - type: string - type: array - engine: - $ref: '#/components/schemas/WebSearchEngineEnum' - excluded_domains: - description: >- - Exclude search results from these domains. Supported by Exa, Parallel, Anthropic, and xAI. Not supported with Firecrawl, OpenAI (silently ignored), or Perplexity. - items: - type: string - type: array - max_results: - description: >- - Maximum number of search results to return per search call. Defaults to 5. Applies to Exa, Firecrawl, and Parallel engines; ignored with native provider search. - example: 5 - type: integer - max_total_results: - description: >- - Maximum total number of search results across all search calls in a single request. Once this limit is reached, the tool will stop returning new results. Useful for controlling cost and context size in agentic loops. - example: 20 - type: integer - search_context_size: - $ref: '#/components/schemas/SearchQualityLevel' - user_location: - $ref: '#/components/schemas/WebSearchUserLocationServerTool' - type: object - WebSearchDomainFilter: + response: + created_at: 1704067200 + error: null + id: resp-abc123 + incomplete_details: null + instructions: null + max_output_tokens: null + metadata: null + model: gpt-4 + object: response + output: [] + parallel_tool_calls: true + status: incomplete + temperature: null + tool_choice: auto + tools: [] + top_p: null + sequence_number: 5 + type: response.incomplete + StreamEventsResponseOutputItemAdded: + allOf: + - $ref: '#/components/schemas/OutputItemAddedEvent' + - properties: + item: + $ref: '#/components/schemas/OutputItems' + type: object + description: Event emitted when a new output item is added to the response example: - allowed_domains: - - example.com - excluded_domains: - - spam.com - nullable: true + item: + content: [] + id: item-1 + role: assistant + status: in_progress + type: message + output_index: 0 + sequence_number: 2 + type: response.output_item.added + StreamEventsResponseOutputItemDone: + allOf: + - $ref: '#/components/schemas/OutputItemDoneEvent' + - properties: + item: + $ref: '#/components/schemas/OutputItems' + type: object + description: Event emitted when an output item is complete + example: + item: + content: + - annotations: [] + text: Hello! How can I help you? + type: output_text + id: item-1 + role: assistant + status: completed + type: message + output_index: 0 + sequence_number: 8 + type: response.output_item.done + StreamLogprob: + allOf: + - $ref: '#/components/schemas/OpenResponsesLogProbs' + - properties: + top_logprobs: + items: + $ref: '#/components/schemas/StreamLogprobTopLogprob' + type: array + type: object + description: Log probability information for a token + example: + bytes: + - 72 + - 101 + - 108 + - 108 + - 111 + logprob: -0.5 + token: Hello + top_logprobs: [] + StreamLogprobTopLogprob: + allOf: + - $ref: '#/components/schemas/OpenResponsesTopLogprobs' + - properties: {} + type: object + description: Alternative token with its log probability + example: + bytes: + - 72 + - 101 + - 108 + - 108 + - 111 + logprob: -0.5 + token: Hello + TextConfig: + description: Text output configuration including format and verbosity + example: + format: + type: text + verbosity: medium properties: - allowed_domains: - items: - type: string - nullable: true - type: array - excluded_domains: - items: - type: string + format: + $ref: '#/components/schemas/Formats' + verbosity: + enum: + - high + - low + - medium + - null nullable: true - type: array + type: string + x-speakeasy-unknown-values: allow type: object - WebSearchEngine: - description: The search engine to use for web search. - enum: - - native - - exa - - firecrawl - - parallel - example: exa - type: string - x-speakeasy-unknown-values: allow - WebSearchEngineEnum: - description: >- - Which search engine to use. "auto" (default) uses native if the provider supports it, otherwise Exa. "native" forces the provider's built-in search. "exa" forces the Exa search API. "firecrawl" uses Firecrawl (requires BYOK). "parallel" uses the Parallel search API. + TextDeltaEvent: + allOf: + - $ref: '#/components/schemas/BaseTextDeltaEvent' + - properties: + logprobs: + items: + $ref: '#/components/schemas/StreamLogprob' + type: array + type: object + description: Event emitted when a text delta is streamed + example: + content_index: 0 + delta: Hello + item_id: item-1 + logprobs: [] + output_index: 0 + sequence_number: 4 + type: response.output_text.delta + TextDoneEvent: + allOf: + - $ref: '#/components/schemas/BaseTextDoneEvent' + - properties: + logprobs: + items: + $ref: '#/components/schemas/StreamLogprob' + type: array + type: object + description: Event emitted when text streaming is complete + example: + content_index: 0 + item_id: item-1 + logprobs: [] + output_index: 0 + sequence_number: 6 + text: Hello! How can I help you? + type: response.output_text.done + TextExtendedConfig: + allOf: + - $ref: '#/components/schemas/TextConfig' + - properties: + verbosity: + enum: + - low + - medium + - high + - xhigh + - max + - null + nullable: true + type: string + x-speakeasy-unknown-values: allow + type: object + description: Text output configuration including format and verbosity + example: + format: + type: text + ToolCallStatus: enum: - - auto - - native - - exa - - firecrawl - - parallel - example: auto + - in_progress + - completed + - incomplete + example: completed type: string x-speakeasy-unknown-values: allow - WebSearchPlugin: + ToolChoiceAllowed: + description: Constrains the model to a pre-defined set of allowed tools example: - enabled: true - id: web - max_results: 5 + mode: auto + tools: + - name: get_weather + type: function + type: allowed_tools properties: - enabled: - description: Set to false to disable the web-search plugin for this request. Defaults to true. - type: boolean - engine: - $ref: '#/components/schemas/WebSearchEngine' - exclude_domains: - description: >- - A list of domains to exclude from web search results. Supports wildcards (e.g. "*.substack.com") and path filtering (e.g. "openai.com/blog"). - example: - - example.com - - '*.substack.com' - - openai.com/blog - items: - type: string - type: array - id: - enum: - - web - type: string - include_domains: - description: >- - A list of domains to restrict web search results to. Supports wildcards (e.g. "*.substack.com") and path filtering (e.g. "openai.com/blog"). - example: - - example.com - - '*.substack.com' - - openai.com/blog + mode: + anyOf: + - enum: + - auto + type: string + - enum: + - required + type: string + tools: items: - type: string + additionalProperties: + nullable: true + type: object type: array - max_results: - type: integer - search_prompt: + type: + enum: + - allowed_tools type: string required: - - id + - type + - mode + - tools type: object - WebSearchServerTool: - description: Web search tool configuration (2025-08-26 version) + TooManyRequestsResponse: + description: Too Many Requests - Rate limit exceeded example: - engine: auto - filters: - allowed_domains: - - example.com - type: web_search_2025_08_26 + error: + code: 429 + message: Rate limit exceeded properties: - engine: - $ref: '#/components/schemas/WebSearchEngineEnum' - filters: - $ref: '#/components/schemas/WebSearchDomainFilter' - max_results: - description: >- - Maximum number of search results to return per search call. Defaults to 5. Applies to Exa, Firecrawl, and Parallel engines; ignored with native provider search. - example: 5 - type: integer - search_context_size: - $ref: '#/components/schemas/SearchContextSizeEnum' - type: - enum: - - web_search_2025_08_26 + error: + $ref: '#/components/schemas/TooManyRequestsResponseErrorData' + user_id: + nullable: true type: string - user_location: - $ref: '#/components/schemas/WebSearchUserLocation' required: - - type + - error type: object - WebSearchServerTool_OpenRouter: - description: 'OpenRouter built-in server tool: searches the web for current information' + TooManyRequestsResponseErrorData: + description: Error data for TooManyRequestsResponse example: - parameters: - max_results: 5 - type: openrouter:web_search + code: 429 + message: Rate limit exceeded properties: - parameters: - properties: - max_results: - description: Maximum number of search results to return per search call. Defaults to 5. - example: 5 - type: integer - max_total_results: - description: >- - Maximum total number of search results across all search calls in a single request. Once this limit is reached, the tool will stop returning new results. - example: 20 - type: integer - type: object - type: - enum: - - openrouter:web_search + code: + type: integer + message: type: string + metadata: + additionalProperties: + nullable: true + nullable: true + type: object required: - - type + - code + - message type: object - WebSearchSource: + TopProviderInfo: + description: Information about the top provider for this model example: - type: url - url: https://example.com/article + context_length: 8192 + is_moderated: true + max_completion_tokens: 4096 properties: - type: - enum: - - url + context_length: + description: Context length from the top provider + example: 8192 + nullable: true + type: integer + is_moderated: + description: Whether the top provider moderates content + example: true + type: boolean + max_completion_tokens: + description: Maximum completion tokens from the top provider + example: 4096 + nullable: true + type: integer + required: + - is_moderated + type: object + TraceConfig: + additionalProperties: + nullable: true + description: >- + Metadata for observability and tracing. Known keys (trace_id, trace_name, span_name, generation_name, parent_span_id) have special handling. Additional keys are passed through as custom metadata to configured broadcast destinations. + example: + trace_id: trace-abc123 + trace_name: my-app-trace + properties: + generation_name: type: string - url: + parent_span_id: + type: string + span_name: + type: string + trace_id: + type: string + trace_name: type: string - required: - - type - - url type: object - WebSearchStatus: + Truncation: enum: - - completed - - searching - - in_progress - - failed - example: completed + - auto + - disabled + - null + example: auto + nullable: true type: string x-speakeasy-unknown-values: allow - WebSearchUserLocation: - description: User location information for web search + UnauthorizedResponse: + description: Unauthorized - Authentication required or invalid credentials example: - city: San Francisco - country: USA - region: California - timezone: America/Los_Angeles - type: approximate - nullable: true + error: + code: 401 + message: Missing Authentication header properties: - city: + error: + $ref: '#/components/schemas/UnauthorizedResponseErrorData' + user_id: nullable: true type: string - country: - nullable: true + required: + - error + type: object + UnauthorizedResponseErrorData: + description: Error data for UnauthorizedResponse + example: + code: 401 + message: Missing Authentication header + properties: + code: + type: integer + message: type: string - region: + metadata: + additionalProperties: + nullable: true nullable: true - type: string - timezone: + type: object + required: + - code + - message + type: object + UnprocessableEntityResponse: + description: Unprocessable Entity - Semantic validation failure + example: + error: + code: 422 + message: Invalid argument + properties: + error: + $ref: '#/components/schemas/UnprocessableEntityResponseErrorData' + user_id: nullable: true type: string - type: - enum: - - approximate - type: string + required: + - error type: object - WebSearchUserLocationServerTool: - description: Approximate user location for location-biased results. + UnprocessableEntityResponseErrorData: + description: Error data for UnprocessableEntityResponse example: - city: San Francisco - country: US - region: California - timezone: America/Los_Angeles - type: approximate + code: 422 + message: Invalid argument properties: - city: - type: string - country: - type: string - region: - type: string - timezone: - type: string - type: - enum: - - approximate + code: + type: integer + message: type: string + metadata: + additionalProperties: + nullable: true + nullable: true + type: object + required: + - code + - message type: object - securitySchemes: - apiKey: - description: API key as bearer token in Authorization header - scheme: bearer - type: http - bearer: - description: API key as bearer token in Authorization header - scheme: bearer - type: http -externalDocs: - description: OpenRouter Documentation - url: https://openrouter.ai/docs -info: - contact: - email: support@openrouter.ai - name: OpenRouter Support - url: https://openrouter.ai/docs - description: OpenAI-compatible API with additional OpenRouter features - license: - name: MIT - url: https://opensource.org/licenses/MIT - title: OpenRouter API - version: 1.0.0 -openapi: 3.1.0 -paths: - /activity: - get: - description: >- - Returns user activity data grouped by endpoint for the last 30 (completed) UTC days. [Management key](/docs/guides/overview/auth/management-api-keys) required. - operationId: getUserActivity - parameters: - - description: Filter by a single UTC date in the last 30 days (YYYY-MM-DD format). - in: query - name: date - required: false - schema: - description: Filter by a single UTC date in the last 30 days (YYYY-MM-DD format). - example: '2025-08-24' + UpdateGuardrailRequest: + example: + description: Updated description + limit_usd: 75 + name: Updated Guardrail Name + reset_interval: weekly + properties: + allowed_models: + description: Array of model identifiers (slug or canonical_slug accepted) + example: + - openai/gpt-5.2 + items: type: string - - description: Filter by API key hash (SHA-256 hex string, as returned by the keys API). - in: query - name: api_key_hash - required: false - schema: - description: Filter by API key hash (SHA-256 hex string, as returned by the keys API). - example: abc123def456... + minItems: 1 + nullable: true + type: array + allowed_providers: + description: New list of allowed provider IDs + example: + - openai + - anthropic + - deepseek + items: type: string - - description: Filter by org member user ID. Only applicable for organization accounts. - in: query - name: user_id - required: false - schema: - description: Filter by org member user ID. Only applicable for organization accounts. - example: user_abc123 + minItems: 1 + nullable: true + type: array + description: + description: New description for the guardrail + example: Updated description + maxLength: 1000 + nullable: true + type: string + enforce_zdr: + description: Whether to enforce zero data retention + example: true + nullable: true + type: boolean + ignored_models: + description: Array of model identifiers to exclude from routing (slug or canonical_slug accepted) + example: + - openai/gpt-4o-mini + items: type: string - responses: - '200': - content: - application/json: - example: - data: - - byok_usage_inference: 0.012 - completion_tokens: 125 - date: '2025-08-24' - endpoint_id: 550e8400-e29b-41d4-a716-446655440000 - model: openai/gpt-4.1 - model_permaslug: openai/gpt-4.1-2025-04-14 - prompt_tokens: 50 - provider_name: OpenAI - reasoning_tokens: 25 - requests: 5 - usage: 0.015 - schema: - $ref: '#/components/schemas/ActivityResponse' - description: Returns user activity data grouped by endpoint - '400': - content: - application/json: - example: - error: - code: 400 - message: Invalid request parameters - schema: - $ref: '#/components/schemas/BadRequestResponse' - description: Bad Request - Invalid request parameters or malformed input - '401': - content: - application/json: - example: - error: - code: 401 - message: Missing Authentication header - schema: - $ref: '#/components/schemas/UnauthorizedResponse' - description: Unauthorized - Authentication required or invalid credentials - '403': - content: - application/json: - example: - error: - code: 403 - message: Only management keys can perform this operation - schema: - $ref: '#/components/schemas/ForbiddenResponse' - description: Forbidden - Authentication successful but insufficient permissions - '404': - content: - application/json: - example: - error: - code: 404 - message: Resource not found - schema: - $ref: '#/components/schemas/NotFoundResponse' - description: Not Found - Resource does not exist - '500': - content: - application/json: - example: - error: - code: 500 - message: Internal Server Error - schema: - $ref: '#/components/schemas/InternalServerResponse' - description: Internal Server Error - Unexpected server error - summary: Get user activity grouped by endpoint - tags: - - Analytics - parameters: - - $ref: "#/components/parameters/AppIdentifier" - - $ref: "#/components/parameters/AppDisplayName" - - $ref: "#/components/parameters/AppCategories" - /auth/keys: - post: - description: Exchange an authorization code from the PKCE flow for a user-controlled API key - operationId: exchangeAuthCodeForAPIKey - requestBody: - content: - application/json: - example: - code: auth_code_abc123def456 - code_challenge_method: S256 - code_verifier: dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk - schema: - example: - code: auth_code_abc123def456 - code_challenge_method: S256 - code_verifier: dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk - properties: - code: - description: The authorization code received from the OAuth redirect - example: auth_code_abc123def456 - type: string - code_challenge_method: - description: The method used to generate the code challenge - enum: - - S256 - - plain - - null - example: S256 - nullable: true - type: string - x-speakeasy-unknown-values: allow - code_verifier: - description: The code verifier if code_challenge was used in the authorization request - example: dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk - type: string - required: - - code - type: object - required: true - responses: - '200': - content: - application/json: - example: - key: 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 - user_id: user_2yOPcMpKoQhcd4bVgSMlELRaIah - schema: - example: - key: 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 - user_id: user_2yOPcMpKoQhcd4bVgSMlELRaIah - properties: - key: - description: The API key to use for OpenRouter requests - example: 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 - type: string - user_id: - description: User ID associated with the API key - example: user_2yOPcMpKoQhcd4bVgSMlELRaIah - nullable: true - type: string - required: - - key - - user_id - type: object - description: Successfully exchanged code for an API key - '400': - content: - application/json: - example: - error: - code: 400 - message: Invalid request parameters - schema: - $ref: '#/components/schemas/BadRequestResponse' - description: Bad Request - Invalid request parameters or malformed input - '403': - content: - application/json: - example: - error: - code: 403 - message: Only management keys can perform this operation - schema: - $ref: '#/components/schemas/ForbiddenResponse' - description: Forbidden - Authentication successful but insufficient permissions - '500': - content: - application/json: - example: - error: - code: 500 - message: Internal Server Error - schema: - $ref: '#/components/schemas/InternalServerResponse' - description: Internal Server Error - Unexpected server error - summary: Exchange authorization code for API key - tags: - - OAuth - parameters: - - $ref: "#/components/parameters/AppIdentifier" - - $ref: "#/components/parameters/AppDisplayName" - - $ref: "#/components/parameters/AppCategories" - /auth/keys/code: - post: - description: Create an authorization code for the PKCE flow to generate a user-controlled API key - operationId: createAuthKeysCode - requestBody: - content: - application/json: - example: - callback_url: https://myapp.com/auth/callback - code_challenge: E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM - code_challenge_method: S256 - limit: 100 - schema: - example: - callback_url: https://myapp.com/auth/callback - code_challenge: E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM - code_challenge_method: S256 - limit: 100 + minItems: 1 + nullable: true + type: array + ignored_providers: + description: List of provider IDs to exclude from routing + example: + - azure + items: + type: string + minItems: 1 + nullable: true + type: array + limit_usd: + description: New spending limit in USD + example: 75 + format: double + nullable: true + type: number + name: + description: New name for the guardrail + example: Updated Guardrail Name + maxLength: 200 + minLength: 1 + type: string + reset_interval: + $ref: '#/components/schemas/GuardrailInterval' + type: object + UpdateGuardrailResponse: + example: + data: + allowed_models: null + allowed_providers: + - openai + created_at: '2025-08-24T10:30:00Z' + description: Updated description + enforce_zdr: true + id: 550e8400-e29b-41d4-a716-446655440000 + ignored_models: null + ignored_providers: null + limit_usd: 75 + name: Updated Guardrail Name + reset_interval: weekly + updated_at: '2025-08-24T16:00:00Z' + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 + properties: + data: + allOf: + - $ref: '#/components/schemas/Guardrail' + - description: The updated guardrail + required: + - data + type: object + UpdateWorkspaceRequest: + example: + name: Updated Workspace + slug: updated-workspace + properties: + default_image_model: + description: Default image model for this workspace + example: openai/dall-e-3 + nullable: true + type: string + default_provider_sort: + description: Default provider sort preference (price, throughput, latency, exacto) + example: price + nullable: true + type: string + default_text_model: + description: Default text model for this workspace + example: openai/gpt-4o + nullable: true + type: string + description: + description: New description for the workspace + example: Updated description + maxLength: 500 + nullable: true + type: string + is_data_discount_logging_enabled: + description: Whether data discount logging is enabled + example: true + type: boolean + is_observability_broadcast_enabled: + description: Whether broadcast is enabled + example: false + type: boolean + is_observability_io_logging_enabled: + description: Whether private logging is enabled + example: false + type: boolean + name: + description: New name for the workspace + example: Updated Workspace + maxLength: 100 + minLength: 1 + type: string + slug: + description: New URL-friendly slug + example: updated-workspace + maxLength: 50 + minLength: 1 + pattern: ^[a-z0-9-]+$ + type: string + type: object + UpdateWorkspaceResponse: + example: + data: + created_at: '2025-08-24T10:30:00Z' + created_by: user_abc123 + default_image_model: openai/dall-e-3 + default_provider_sort: price + default_text_model: openai/gpt-4o + description: Production environment workspace + id: 550e8400-e29b-41d4-a716-446655440000 + is_data_discount_logging_enabled: true + is_observability_broadcast_enabled: false + is_observability_io_logging_enabled: false + name: Updated Workspace + slug: updated-workspace + updated_at: '2025-08-25T10:00:00Z' + properties: + data: + allOf: + - $ref: '#/components/schemas/Workspace' + - description: The updated workspace + required: + - data + type: object + URLCitation: + example: + end_index: 42 + start_index: 0 + title: OpenRouter Documentation + type: url_citation + url: https://openrouter.ai/docs + properties: + end_index: + type: integer + start_index: + type: integer + title: + type: string + type: + enum: + - url_citation + type: string + url: + type: string + required: + - type + - url + - title + - start_index + - end_index + type: object + Usage: + allOf: + - $ref: '#/components/schemas/OpenAIResponsesUsage' + - nullable: true + properties: + cost: + description: Cost of the completion + format: double + nullable: true + type: number + cost_details: properties: - callback_url: - description: >- - The callback URL to redirect to after authorization. Note, only https URLs on ports 443 and 3000 are allowed. - example: https://myapp.com/auth/callback - format: uri - type: string - code_challenge: - description: PKCE code challenge for enhanced security - example: E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM - type: string - code_challenge_method: - description: The method used to generate the code challenge - enum: - - S256 - - plain - example: S256 - type: string - x-speakeasy-unknown-values: allow - expires_at: - description: Optional expiration time for the API key to be created - example: '2027-12-31T23:59:59Z' - format: date-time + upstream_inference_cost: + format: double nullable: true - type: string - key_label: - description: Optional custom label for the API key. Defaults to the app name if not provided. - example: My Custom Key - maxLength: 100 - type: string - limit: - description: Credit limit for the API key to be created - example: 100 + type: number + upstream_inference_input_cost: + format: double + type: number + upstream_inference_output_cost: 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: - - daily - - weekly - - monthly - example: monthly - type: string - x-speakeasy-unknown-values: allow required: - - callback_url + - upstream_inference_input_cost + - upstream_inference_output_cost type: object - required: true - responses: - '200': - content: - application/json: - example: - data: - app_id: 12345 - created_at: '2025-08-24T10:30:00Z' - id: auth_code_xyz789 - schema: - example: - data: - app_id: 12345 - created_at: '2025-08-24T10:30:00Z' - id: auth_code_xyz789 - properties: - data: - description: Auth code data - example: - app_id: 12345 - created_at: '2025-08-24T10:30:00Z' - id: auth_code_xyz789 - properties: - app_id: - description: The application ID associated with this auth code - example: 12345 - type: integer - created_at: - description: ISO 8601 timestamp of when the auth code was created - example: '2025-08-24T10:30:00Z' - type: string - id: - description: The authorization code ID to use in the exchange request - example: auth_code_xyz789 - type: string - required: - - id - - app_id - - created_at - type: object - required: - - data - type: object - description: Successfully created authorization code - '400': - content: - application/json: - example: - error: - code: 400 - message: Invalid request parameters - schema: - $ref: '#/components/schemas/BadRequestResponse' - description: Bad Request - Invalid request parameters or malformed input - '401': - content: - application/json: - example: - error: - code: 401 - message: Missing Authentication header - schema: - $ref: '#/components/schemas/UnauthorizedResponse' - description: Unauthorized - Authentication required or invalid credentials - '409': - content: - application/json: - example: - error: - code: 409 - message: Resource conflict. Please try again later. - schema: - $ref: '#/components/schemas/ConflictResponse' - description: Conflict - Resource conflict or concurrent modification - '500': - content: - application/json: - example: - error: - code: 500 - message: Internal Server Error - schema: - $ref: '#/components/schemas/InternalServerResponse' - description: Internal Server Error - Unexpected server error - summary: Create authorization code - tags: - - OAuth - x-speakeasy-name-override: createAuthCode - parameters: - - $ref: "#/components/parameters/AppIdentifier" - - $ref: "#/components/parameters/AppDisplayName" - - $ref: "#/components/parameters/AppCategories" - /chat/completions: - post: - description: >- - Sends a request for a model response for the given chat conversation. Supports both streaming and non-streaming modes. - operationId: sendChatCompletionRequest - requestBody: - content: - application/json: - example: - max_tokens: 150 - messages: - - content: You are a helpful assistant. - role: system - - content: What is the capital of France? - role: user - model: openai/gpt-4 - temperature: 0.7 - schema: - $ref: '#/components/schemas/ChatRequest' - required: true - responses: - '200': - content: - application/json: - example: - choices: - - finish_reason: stop - index: 0 - message: - content: The capital of France is Paris. - role: assistant - created: 1677652288 - id: chatcmpl-123 - model: openai/gpt-4 - object: chat.completion - usage: - completion_tokens: 10 - prompt_tokens: 25 - total_tokens: 35 - schema: - $ref: '#/components/schemas/ChatResult' - text/event-stream: - example: - data: - choices: - - delta: - content: Hello - role: assistant - finish_reason: null - index: 0 - created: 1677652288 - id: chatcmpl-123 - model: openai/gpt-4 - object: chat.completion.chunk - schema: - properties: - data: - $ref: '#/components/schemas/ChatStreamChunk' - required: - - data - type: object - x-speakeasy-sse-sentinel: '[DONE]' - description: Successful chat completion response - '400': - content: - application/json: - example: - error: - code: 400 - message: Invalid request parameters - schema: - $ref: '#/components/schemas/BadRequestResponse' - description: Bad Request - Invalid request parameters or malformed input - '401': - content: - application/json: - example: - error: - code: 401 - message: Missing Authentication header - schema: - $ref: '#/components/schemas/UnauthorizedResponse' - description: Unauthorized - Authentication required or invalid credentials - '402': - content: - application/json: - example: - error: - code: 402 - message: Insufficient credits. Add more using https://openrouter.ai/credits - schema: - $ref: '#/components/schemas/PaymentRequiredResponse' - description: Payment Required - Insufficient credits or quota to complete request - '404': - content: - application/json: - example: - error: - code: 404 - message: Resource not found - schema: - $ref: '#/components/schemas/NotFoundResponse' - description: Not Found - Resource does not exist - '408': - content: - application/json: - example: - error: - code: 408 - message: Operation timed out. Please try again later. - schema: - $ref: '#/components/schemas/RequestTimeoutResponse' - description: Request Timeout - Operation exceeded time limit - '413': - content: - application/json: - example: - error: - code: 413 - message: Request payload too large - schema: - $ref: '#/components/schemas/PayloadTooLargeResponse' - description: Payload Too Large - Request payload exceeds size limits - '422': - content: - application/json: + is_byok: + description: Whether a request was made using a Bring Your Own Key configuration + type: boolean + type: object + description: Token usage information for the response + example: + cost: 0.0012 + cost_details: + upstream_inference_cost: null + upstream_inference_input_cost: 0.0008 + upstream_inference_output_cost: 0.0004 + input_tokens: 10 + input_tokens_details: + cached_tokens: 0 + output_tokens: 25 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 35 + VideoGenerationRequest: + example: + aspect_ratio: '16:9' + duration: 8 + model: google/veo-3.1 + prompt: A serene mountain landscape at sunset + resolution: 720p + properties: + aspect_ratio: + description: Aspect ratio of the generated video + enum: + - '16:9' + - '9:16' + - '1:1' + - '4:3' + - '3:4' + - '21:9' + - '9:21' + example: '16:9' + type: string + x-speakeasy-unknown-values: allow + duration: + description: Duration of the generated video in seconds + example: 8 + minimum: 1 + type: integer + frame_images: + description: >- + Images to use as the first and/or last frame of the generated video. Each image must specify a frame_type of first_frame or last_frame. + items: + $ref: '#/components/schemas/FrameImage' + type: array + generate_audio: + description: >- + Whether to generate audio alongside the video. Defaults to the endpoint's generate_audio capability flag, false if not set. + example: true + type: boolean + input_references: + description: Reference images to guide video generation + items: + $ref: '#/components/schemas/ContentPartImage' + type: array + model: + type: string + prompt: + type: string + provider: + description: Provider-specific passthrough configuration + properties: + options: + description: >- + Provider-specific options keyed by provider slug. The options for the matched provider are spread into the upstream request body. example: - error: - code: 422 - message: Invalid argument - schema: - $ref: '#/components/schemas/UnprocessableEntityResponse' - description: Unprocessable Entity - Semantic validation failure - '429': - content: - application/json: - example: - error: - code: 429 - message: Rate limit exceeded - schema: - $ref: '#/components/schemas/TooManyRequestsResponse' - description: Too Many Requests - Rate limit exceeded - '500': - content: - application/json: - example: - error: - code: 500 - message: Internal Server Error - schema: - $ref: '#/components/schemas/InternalServerResponse' - description: Internal Server Error - Unexpected server error - '502': - content: - application/json: - example: - error: - code: 502 - message: Provider returned error - schema: - $ref: '#/components/schemas/BadGatewayResponse' - description: Bad Gateway - Provider/upstream API failure - '503': - content: - application/json: - example: - error: - code: 503 - message: Service temporarily unavailable - schema: - $ref: '#/components/schemas/ServiceUnavailableResponse' - description: Service Unavailable - Service temporarily unavailable - '524': - content: - application/json: - example: - error: - code: 524 - message: Request timed out. Please try again later. - schema: - $ref: '#/components/schemas/EdgeNetworkTimeoutResponse' - description: Infrastructure Timeout - Provider request timed out at edge network - '529': - content: - application/json: - example: - error: - code: 529 - message: Provider returned error - schema: - $ref: '#/components/schemas/ProviderOverloadedResponse' - description: Provider Overloaded - Provider is temporarily overloaded - summary: Create a chat completion - tags: - - Chat - x-speakeasy-group: chat - x-speakeasy-name-override: send - x-speakeasy-stream-request-field: stream - parameters: - - $ref: "#/components/parameters/AppIdentifier" - - $ref: "#/components/parameters/AppDisplayName" - - $ref: "#/components/parameters/AppCategories" - /credits: - get: - description: >- - Get total credits purchased and used for the authenticated user. [Management key](/docs/guides/overview/auth/management-api-keys) required. - operationId: getCredits - responses: - '200': - content: - application/json: - example: - data: - total_credits: 100.5 - total_usage: 25.75 - schema: - description: Total credits purchased and used - example: - data: - total_credits: 100.5 - total_usage: 25.75 - properties: - data: - example: - total_credits: 100.5 - total_usage: 25.75 - properties: - total_credits: - description: Total credits purchased - example: 100.5 - format: double - type: number - total_usage: - description: Total credits used - example: 25.75 - format: double - type: number - required: - - total_credits - - total_usage - type: object - required: - - data - type: object - description: Returns the total credits purchased and used - '401': - content: - application/json: - example: - error: - code: 401 - message: Missing Authentication header - schema: - $ref: '#/components/schemas/UnauthorizedResponse' - description: Unauthorized - Authentication required or invalid credentials - '403': - content: - application/json: - example: - error: - code: 403 - message: Only management keys can perform this operation - schema: - $ref: '#/components/schemas/ForbiddenResponse' - description: Forbidden - Authentication successful but insufficient permissions - '500': - content: - application/json: - example: - error: - code: 500 - message: Internal Server Error - schema: - $ref: '#/components/schemas/InternalServerResponse' - description: Internal Server Error - Unexpected server error - summary: Get remaining credits - tags: - - Credits - x-speakeasy-name-override: getCredits - parameters: - - $ref: "#/components/parameters/AppIdentifier" - - $ref: "#/components/parameters/AppDisplayName" - - $ref: "#/components/parameters/AppCategories" - /credits/coinbase: - post: - deprecated: true - description: >- - Deprecated. The Coinbase APIs used by this endpoint have been deprecated, so Coinbase Commerce charges have been removed. Use the web credits purchase flow instead. - operationId: createCoinbaseCharge - responses: - '200': - description: This endpoint is deprecated and will never return a 200 response. - '410': - content: - application/json: - example: - error: - code: 410 - message: >- - The Coinbase APIs used by this endpoint have been deprecated, so the Coinbase Commerce credits API has been removed. Use the web credits purchase flow instead. - schema: - $ref: '#/components/schemas/GoneResponse' - description: Gone - Endpoint has been permanently removed or deprecated - security: [] - summary: Deprecated Coinbase Commerce charge endpoint - tags: - - Credits - x-fern-ignore: true - x-speakeasy-ignore: true - x-speakeasy-name-override: createCoinbaseCharge - parameters: - - $ref: "#/components/parameters/AppIdentifier" - - $ref: "#/components/parameters/AppDisplayName" - - $ref: "#/components/parameters/AppCategories" - /embeddings: - post: - description: Submits an embedding request to the embeddings router - operationId: createEmbeddings - requestBody: - content: - application/json: - schema: - description: Embeddings request input - example: - dimensions: 1536 - input: The quick brown fox jumps over the lazy dog - model: openai/text-embedding-3-small + google-vertex: + output_config: + effort: low properties: - dimensions: - description: The number of dimensions for the output embeddings - example: 1536 - minimum: 1 - type: integer - encoding_format: - description: The format of the output embeddings - enum: - - float - - base64 - example: float - type: string - x-speakeasy-unknown-values: allow - input: - anyOf: - - type: string - - items: - type: string - type: array - - items: - type: number - type: array - - items: - items: - type: number - type: array - type: array - - items: - properties: - content: - items: - oneOf: - - properties: - text: - type: string - type: - enum: - - text - type: string - required: - - type - - text - type: object - - properties: - image_url: - properties: - url: - type: string - required: - - url - type: object - type: - enum: - - image_url - type: string - required: - - type + 01ai: + additionalProperties: + nullable: true + type: object + ai21: + additionalProperties: + nullable: true + type: object + aion-labs: + additionalProperties: + nullable: true + type: object + akashml: + additionalProperties: + nullable: true + type: object + alibaba: + additionalProperties: + nullable: true + type: object + amazon-bedrock: + additionalProperties: + nullable: true + type: object + amazon-nova: + additionalProperties: + nullable: true + type: object + ambient: + additionalProperties: + nullable: true + type: object + anthropic: + additionalProperties: + nullable: true + type: object + anyscale: + additionalProperties: + nullable: true + type: object + arcee-ai: + additionalProperties: + nullable: true + type: object + atlas-cloud: + additionalProperties: + nullable: true + type: object + atoma: + additionalProperties: + nullable: true + type: object + avian: + additionalProperties: + nullable: true + type: object + azure: + additionalProperties: + nullable: true + type: object + baidu: + additionalProperties: + nullable: true + type: object + baseten: + additionalProperties: + nullable: true + type: object + black-forest-labs: + additionalProperties: + nullable: true + type: object + byteplus: + additionalProperties: + nullable: true + type: object + centml: + additionalProperties: + nullable: true + type: object + cerebras: + additionalProperties: + nullable: true + type: object + chutes: + additionalProperties: + nullable: true + type: object + cirrascale: + additionalProperties: + nullable: true + type: object + clarifai: + additionalProperties: + nullable: true + type: object + cloudflare: + additionalProperties: + nullable: true + type: object + cohere: + additionalProperties: + nullable: true + type: object + crofai: + additionalProperties: + nullable: true + type: object + crusoe: + additionalProperties: + nullable: true + type: object + deepinfra: + additionalProperties: + nullable: true + type: object + deepseek: + additionalProperties: + nullable: true + type: object + dekallm: + additionalProperties: + nullable: true + type: object + enfer: + additionalProperties: + nullable: true + type: object + fake-provider: + additionalProperties: + nullable: true + type: object + featherless: + additionalProperties: + nullable: true + type: object + fireworks: + additionalProperties: + nullable: true + type: object + friendli: + additionalProperties: + nullable: true + type: object + gmicloud: + additionalProperties: + nullable: true + type: object + google-ai-studio: + additionalProperties: + nullable: true + type: object + google-vertex: + additionalProperties: + nullable: true + type: object + gopomelo: + additionalProperties: + nullable: true + type: object + groq: + additionalProperties: + nullable: true + type: object + huggingface: + additionalProperties: + nullable: true + type: object + hyperbolic: + additionalProperties: + nullable: true + type: object + hyperbolic-quantized: + additionalProperties: + nullable: true + type: object + inception: + additionalProperties: + nullable: true + type: object + inceptron: + additionalProperties: + nullable: true + type: object + inference-net: + additionalProperties: + nullable: true + type: object + infermatic: + additionalProperties: + nullable: true + type: object + inflection: + additionalProperties: + nullable: true + type: object + inocloud: + additionalProperties: + nullable: true + type: object + io-net: + additionalProperties: + nullable: true + type: object + ionstream: + additionalProperties: + nullable: true + type: object + klusterai: + additionalProperties: + nullable: true + type: object + lambda: + additionalProperties: + nullable: true + type: object + lepton: + additionalProperties: + nullable: true + type: object + liquid: + additionalProperties: + nullable: true + type: object + lynn: + additionalProperties: + nullable: true + type: object + lynn-private: + additionalProperties: + nullable: true + type: object + mancer: + additionalProperties: + nullable: true + type: object + mancer-old: + additionalProperties: + nullable: true + type: object + mara: + additionalProperties: + nullable: true + type: object + meta: + additionalProperties: + nullable: true + type: object + minimax: + additionalProperties: + nullable: true + type: object + mistral: + additionalProperties: + nullable: true + type: object + modal: + additionalProperties: + nullable: true + type: object + modelrun: + additionalProperties: + nullable: true + type: object + modular: + additionalProperties: + nullable: true + type: object + moonshotai: + additionalProperties: + nullable: true + type: object + morph: + additionalProperties: + nullable: true + type: object + ncompass: + additionalProperties: + nullable: true + type: object + nebius: + additionalProperties: + nullable: true + type: object + nextbit: + additionalProperties: + nullable: true + type: object + nineteen: + additionalProperties: + nullable: true + type: object + novita: + additionalProperties: + nullable: true + type: object + nvidia: + additionalProperties: + nullable: true + type: object + octoai: + additionalProperties: + nullable: true + type: object + open-inference: + additionalProperties: + nullable: true + type: object + openai: + additionalProperties: + nullable: true + type: object + parasail: + additionalProperties: + nullable: true + type: object + perplexity: + additionalProperties: + nullable: true + type: object + phala: + additionalProperties: + nullable: true + type: object + recraft: + additionalProperties: + nullable: true + type: object + recursal: + additionalProperties: + nullable: true + type: object + reflection: + additionalProperties: + nullable: true + type: object + reka: + additionalProperties: + nullable: true + type: object + relace: + additionalProperties: + nullable: true + type: object + replicate: + additionalProperties: + nullable: true + type: object + sambanova: + additionalProperties: + nullable: true + type: object + sambanova-cloaked: + additionalProperties: + nullable: true + type: object + seed: + additionalProperties: + nullable: true + type: object + sf-compute: + additionalProperties: + nullable: true + type: object + siliconflow: + additionalProperties: + nullable: true + type: object + sourceful: + additionalProperties: + nullable: true + type: object + stealth: + additionalProperties: + nullable: true + type: object + stepfun: + additionalProperties: + nullable: true + type: object + streamlake: + additionalProperties: + nullable: true + type: object + switchpoint: + additionalProperties: + nullable: true + type: object + targon: + additionalProperties: + nullable: true + type: object + together: + additionalProperties: + nullable: true + type: object + together-lite: + additionalProperties: + nullable: true + type: object + ubicloud: + additionalProperties: + nullable: true + type: object + upstage: + additionalProperties: + nullable: true + type: object + venice: + additionalProperties: + nullable: true + type: object + wandb: + additionalProperties: + nullable: true + type: object + xai: + additionalProperties: + nullable: true + type: object + xiaomi: + additionalProperties: + nullable: true + type: object + z-ai: + additionalProperties: + nullable: true + type: object + type: object + type: object + resolution: + description: Resolution of the generated video + enum: + - 480p + - 720p + - 1080p + - 1K + - 2K + - 4K + example: 720p + type: string + x-speakeasy-unknown-values: allow + seed: + description: >- + If specified, the generation will sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed for all providers. + type: integer + size: + description: >- + Exact pixel dimensions of the generated video in "WIDTHxHEIGHT" format (e.g. "1280x720"). Interchangeable with resolution + aspect_ratio. + example: 1280x720 + type: string + required: + - prompt + - model + type: object + VideoGenerationResponse: + example: + generation_id: gen-xyz789 + id: job-abc123 + polling_url: /api/v1/videos/job-abc123 + status: pending + properties: + error: + type: string + generation_id: + description: The generation ID associated with this video generation job. Available once the job has been processed. + type: string + id: + type: string + polling_url: + type: string + status: + enum: + - pending + - in_progress + - completed + - failed + - cancelled + - expired + type: string + x-speakeasy-unknown-values: allow + unsigned_urls: + items: + type: string + type: array + usage: + $ref: '#/components/schemas/VideoGenerationUsage' + required: + - id + - polling_url + - status + type: object + VideoGenerationUsage: + description: Usage and cost information for the video generation. Available once the job has completed. + example: + cost: 0.5 + is_byok: false + properties: + cost: + description: The cost of the video generation in USD. + format: double + nullable: true + type: number + is_byok: + description: Whether the request was made using a Bring Your Own Key configuration. + type: boolean + type: object + VideoModel: + example: + allowed_passthrough_parameters: [] + canonical_slug: google/veo-3.1 + created: 1700000000 + description: Google video generation model + generate_audio: true + id: google/veo-3.1 + name: Veo 3.1 + pricing_skus: + generate: '0.50' + seed: null + supported_aspect_ratios: + - '16:9' + supported_durations: + - 5 + - 8 + supported_frame_images: + - first_frame + - last_frame + supported_resolutions: + - 720p + supported_sizes: null + properties: + allowed_passthrough_parameters: + description: List of parameters that are allowed to be passed through to the provider + items: + type: string + type: array + canonical_slug: + description: Canonical slug for the model + example: openai/gpt-4 + type: string + created: + description: Unix timestamp of when the model was created + example: 1692901234 + type: integer + description: + description: Description of the model + example: GPT-4 is a large multimodal model that can solve difficult problems with greater accuracy. + type: string + generate_audio: + description: Whether the model supports generating audio alongside video + nullable: true + type: boolean + hugging_face_id: + description: Hugging Face model identifier, if applicable + example: microsoft/DialoGPT-medium + nullable: true + type: string + id: + description: Unique identifier for the model + example: openai/gpt-4 + type: string + name: + description: Display name of the model + example: GPT-4 + type: string + pricing_skus: + additionalProperties: + type: string + description: Pricing SKUs with provider prefix stripped, values as strings + nullable: true + type: object + seed: + description: Whether the model supports deterministic generation via seed parameter + nullable: true + type: boolean + supported_aspect_ratios: + description: Supported output aspect ratios + items: + enum: + - '16:9' + - '9:16' + - '1:1' + - '4:3' + - '3:4' + - '21:9' + - '9:21' + type: string + x-speakeasy-unknown-values: allow + nullable: true + type: array + supported_durations: + description: Supported video durations in seconds + items: + type: integer + nullable: true + type: array + supported_frame_images: + description: Supported frame image types (e.g. first_frame, last_frame) + items: + enum: + - first_frame + - last_frame + type: string + x-speakeasy-unknown-values: allow + nullable: true + type: array + supported_resolutions: + description: Supported output resolutions + items: + enum: + - 480p + - 720p + - 1080p + - 1K + - 2K + - 4K + type: string + x-speakeasy-unknown-values: allow + nullable: true + type: array + supported_sizes: + description: Supported output sizes (width x height) + items: + enum: + - 480x480 + - 480x640 + - 480x854 + - 480x1120 + - 640x480 + - 720x720 + - 720x960 + - 720x1280 + - 720x1680 + - 854x480 + - 960x720 + - 1080x1080 + - 1080x1440 + - 1080x1920 + - 1080x2520 + - 1120x480 + - 1280x720 + - 1440x1080 + - 1680x720 + - 1920x1080 + - 2160x2160 + - 2160x2880 + - 2160x3840 + - 2160x5040 + - 2520x1080 + - 2880x2160 + - 3840x2160 + - 5040x2160 + type: string + x-speakeasy-unknown-values: allow + nullable: true + type: array + required: + - id + - canonical_slug + - name + - created + - supported_resolutions + - supported_aspect_ratios + - supported_sizes + - supported_durations + - supported_frame_images + - generate_audio + - seed + - allowed_passthrough_parameters + type: object + VideoModelsListResponse: + example: + data: + - allowed_passthrough_parameters: [] + canonical_slug: google/veo-3.1 + created: 1700000000 + description: Google video generation model + generate_audio: true + id: google/veo-3.1 + name: Veo 3.1 + pricing_skus: + generate: '0.50' + seed: null + supported_aspect_ratios: + - '16:9' + supported_durations: + - 5 + - 8 + supported_frame_images: + - first_frame + - last_frame + supported_resolutions: + - 720p + supported_sizes: null + properties: + data: + items: + $ref: '#/components/schemas/VideoModel' + type: array + required: + - data + type: object + WebFetchEngineEnum: + description: >- + Which fetch engine to use. "auto" (default) uses native if the provider supports it, otherwise Exa. "native" forces the provider's built-in fetch. "exa" uses Exa Contents API (supports BYOK). "openrouter" uses direct HTTP fetch. "firecrawl" uses Firecrawl scrape (requires BYOK). + enum: + - auto + - native + - openrouter + - firecrawl + - exa + example: auto + type: string + x-speakeasy-unknown-values: allow + WebFetchServerTool: + description: 'OpenRouter built-in server tool: fetches full content from a URL (web page or PDF)' + example: + parameters: + max_uses: 10 + type: openrouter:web_fetch + properties: + parameters: + $ref: '#/components/schemas/WebFetchServerToolConfig' + type: + enum: + - openrouter:web_fetch + type: string + required: + - type + type: object + WebFetchServerToolConfig: + description: Configuration for the openrouter:web_fetch server tool + example: + max_content_tokens: 100000 + max_uses: 10 + properties: + allowed_domains: + description: Only fetch from these domains. + items: + type: string + type: array + blocked_domains: + description: Never fetch from these domains. + items: + type: string + type: array + engine: + $ref: '#/components/schemas/WebFetchEngineEnum' + max_content_tokens: + description: Maximum content length in approximate tokens. Content exceeding this limit is truncated. + example: 100000 + type: integer + max_uses: + description: Maximum number of web fetches per request. Once exceeded, the tool returns an error. + example: 10 + type: integer + type: object + WebSearchCallCompletedEvent: + allOf: + - $ref: '#/components/schemas/OpenAIResponsesSearchCompleted' + - properties: {} + type: object + description: Web search call completed + example: + item_id: ws-123 + output_index: 0 + sequence_number: 3 + type: response.web_search_call.completed + WebSearchCallInProgressEvent: + allOf: + - $ref: '#/components/schemas/OpenAIResponsesWebSearchCallInProgress' + - properties: {} + type: object + description: Web search call in progress + example: + item_id: ws-123 + output_index: 0 + sequence_number: 1 + type: response.web_search_call.in_progress + WebSearchCallSearchingEvent: + allOf: + - $ref: '#/components/schemas/OpenAIResponsesWebSearchCallSearching' + - properties: {} + type: object + description: Web search call is searching + example: + item_id: ws-123 + output_index: 0 + sequence_number: 2 + type: response.web_search_call.searching + WebSearchConfig: + example: + max_results: 5 + search_context_size: medium + properties: + allowed_domains: + description: >- + Limit search results to these domains. Supported by Exa, Parallel, and most native providers (Anthropic, OpenAI, xAI). Not supported with Firecrawl or Perplexity. + items: + type: string + type: array + engine: + $ref: '#/components/schemas/WebSearchEngineEnum' + excluded_domains: + description: >- + Exclude search results from these domains. Supported by Exa, Parallel, Anthropic, and xAI. Not supported with Firecrawl, OpenAI (silently ignored), or Perplexity. + items: + type: string + type: array + max_results: + description: >- + Maximum number of search results to return per search call. Defaults to 5. Applies to Exa, Firecrawl, and Parallel engines; ignored with native provider search. + example: 5 + type: integer + max_total_results: + description: >- + Maximum total number of search results across all search calls in a single request. Once this limit is reached, the tool will stop returning new results. Useful for controlling cost and context size in agentic loops. + example: 20 + type: integer + search_context_size: + $ref: '#/components/schemas/SearchQualityLevel' + user_location: + $ref: '#/components/schemas/WebSearchUserLocationServerTool' + type: object + WebSearchDomainFilter: + example: + allowed_domains: + - example.com + excluded_domains: + - spam.com + nullable: true + properties: + allowed_domains: + items: + type: string + nullable: true + type: array + excluded_domains: + items: + type: string + nullable: true + type: array + type: object + WebSearchEngine: + description: The search engine to use for web search. + enum: + - native + - exa + - firecrawl + - parallel + example: exa + type: string + x-speakeasy-unknown-values: allow + WebSearchEngineEnum: + description: >- + Which search engine to use. "auto" (default) uses native if the provider supports it, otherwise Exa. "native" forces the provider's built-in search. "exa" forces the Exa search API. "firecrawl" uses Firecrawl (requires BYOK). "parallel" uses the Parallel search API. + enum: + - auto + - native + - exa + - firecrawl + - parallel + example: auto + type: string + x-speakeasy-unknown-values: allow + WebSearchPlugin: + example: + enabled: true + id: web + max_results: 5 + properties: + enabled: + description: Set to false to disable the web-search plugin for this request. Defaults to true. + type: boolean + engine: + $ref: '#/components/schemas/WebSearchEngine' + exclude_domains: + description: >- + A list of domains to exclude from web search results. Supports wildcards (e.g. "*.substack.com") and path filtering (e.g. "openai.com/blog"). + example: + - example.com + - '*.substack.com' + - openai.com/blog + items: + type: string + type: array + id: + enum: + - web + type: string + include_domains: + description: >- + A list of domains to restrict web search results to. Supports wildcards (e.g. "*.substack.com") and path filtering (e.g. "openai.com/blog"). + example: + - example.com + - '*.substack.com' + - openai.com/blog + items: + type: string + type: array + max_results: + type: integer + search_prompt: + type: string + required: + - id + type: object + WebSearchServerTool: + description: Web search tool configuration (2025-08-26 version) + example: + engine: auto + filters: + allowed_domains: + - example.com + type: web_search_2025_08_26 + properties: + engine: + $ref: '#/components/schemas/WebSearchEngineEnum' + filters: + $ref: '#/components/schemas/WebSearchDomainFilter' + max_results: + description: >- + Maximum number of search results to return per search call. Defaults to 5. Applies to Exa, Firecrawl, and Parallel engines; ignored with native provider search. + example: 5 + type: integer + search_context_size: + $ref: '#/components/schemas/SearchContextSizeEnum' + type: + enum: + - web_search_2025_08_26 + type: string + user_location: + $ref: '#/components/schemas/WebSearchUserLocation' + required: + - type + type: object + WebSearchServerTool_OpenRouter: + description: 'OpenRouter built-in server tool: searches the web for current information' + example: + parameters: + max_results: 5 + type: openrouter:web_search + properties: + parameters: + properties: + max_results: + description: Maximum number of search results to return per search call. Defaults to 5. + example: 5 + type: integer + max_total_results: + description: >- + Maximum total number of search results across all search calls in a single request. Once this limit is reached, the tool will stop returning new results. + example: 20 + type: integer + type: object + type: + enum: + - openrouter:web_search + type: string + required: + - type + type: object + WebSearchSource: + example: + type: url + url: https://example.com/article + properties: + type: + enum: + - url + type: string + url: + type: string + required: + - type + - url + type: object + WebSearchStatus: + enum: + - completed + - searching + - in_progress + - failed + example: completed + type: string + x-speakeasy-unknown-values: allow + WebSearchUserLocation: + description: User location information for web search + example: + city: San Francisco + country: USA + region: California + timezone: America/Los_Angeles + type: approximate + nullable: true + properties: + city: + nullable: true + type: string + country: + nullable: true + type: string + region: + nullable: true + type: string + timezone: + nullable: true + type: string + type: + enum: + - approximate + type: string + type: object + WebSearchUserLocationServerTool: + description: Approximate user location for location-biased results. + example: + city: San Francisco + country: US + region: California + timezone: America/Los_Angeles + type: approximate + properties: + city: + type: string + country: + type: string + region: + type: string + timezone: + type: string + type: + enum: + - approximate + type: string + type: object + Workspace: + example: + created_at: '2025-08-24T10:30:00Z' + created_by: user_abc123 + default_image_model: openai/dall-e-3 + default_provider_sort: price + default_text_model: openai/gpt-4o + description: Production environment workspace + id: 550e8400-e29b-41d4-a716-446655440000 + is_data_discount_logging_enabled: true + is_observability_broadcast_enabled: false + is_observability_io_logging_enabled: false + name: Production + slug: production + updated_at: '2025-08-24T15:45:00Z' + properties: + created_at: + description: ISO 8601 timestamp of when the workspace was created + example: '2025-08-24T10:30:00Z' + type: string + created_by: + description: User ID of the workspace creator + example: user_abc123 + nullable: true + type: string + default_image_model: + description: Default image model for this workspace + example: openai/dall-e-3 + nullable: true + type: string + default_provider_sort: + description: Default provider sort preference (price, throughput, latency, exacto) + example: price + nullable: true + type: string + default_text_model: + description: Default text model for this workspace + example: openai/gpt-4o + nullable: true + type: string + description: + description: Description of the workspace + example: Production environment workspace + nullable: true + type: string + id: + description: Unique identifier for the workspace + example: 550e8400-e29b-41d4-a716-446655440000 + format: uuid + type: string + is_data_discount_logging_enabled: + description: Whether data discount logging is enabled for this workspace + example: true + type: boolean + is_observability_broadcast_enabled: + description: Whether broadcast is enabled for this workspace + example: false + type: boolean + is_observability_io_logging_enabled: + description: Whether private logging is enabled for this workspace + example: false + type: boolean + name: + description: Name of the workspace + example: Production + type: string + slug: + description: URL-friendly slug for the workspace + example: production + type: string + updated_at: + description: ISO 8601 timestamp of when the workspace was last updated + example: '2025-08-24T15:45:00Z' + nullable: true + type: string + required: + - id + - name + - slug + - description + - default_text_model + - default_image_model + - default_provider_sort + - is_observability_io_logging_enabled + - is_observability_broadcast_enabled + - is_data_discount_logging_enabled + - created_at + - updated_at + - created_by + type: object + WorkspaceMember: + example: + created_at: '2025-08-24T10:30:00Z' + id: 660e8400-e29b-41d4-a716-446655440000 + role: member + user_id: user_abc123 + workspace_id: 550e8400-e29b-41d4-a716-446655440000 + properties: + created_at: + description: ISO 8601 timestamp of when the membership was created + example: '2025-08-24T10:30:00Z' + type: string + id: + description: Unique identifier for the workspace membership + example: 660e8400-e29b-41d4-a716-446655440000 + format: uuid + type: string + role: + description: Role of the member in the workspace + enum: + - admin + - member + example: member + type: string + x-speakeasy-unknown-values: allow + user_id: + description: Clerk user ID of the member + example: user_abc123 + type: string + workspace_id: + description: ID of the workspace + example: 550e8400-e29b-41d4-a716-446655440000 + format: uuid + type: string + required: + - id + - workspace_id + - user_id + - role + - created_at + type: object + securitySchemes: + apiKey: + description: API key as bearer token in Authorization header + scheme: bearer + type: http + bearer: + description: API key as bearer token in Authorization header + scheme: bearer + type: http +externalDocs: + description: OpenRouter Documentation + url: https://openrouter.ai/docs +info: + contact: + email: support@openrouter.ai + name: OpenRouter Support + url: https://openrouter.ai/docs + description: OpenAI-compatible API with additional OpenRouter features + license: + name: MIT + url: https://opensource.org/licenses/MIT + title: OpenRouter API + version: 1.0.0 +openapi: 3.1.0 +paths: + /activity: + get: + description: >- + Returns user activity data grouped by endpoint for the last 30 (completed) UTC days. [Management key](/docs/guides/overview/auth/management-api-keys) required. + operationId: getUserActivity + parameters: + - description: Filter by a single UTC date in the last 30 days (YYYY-MM-DD format). + in: query + name: date + required: false + schema: + description: Filter by a single UTC date in the last 30 days (YYYY-MM-DD format). + example: '2025-08-24' + type: string + - description: Filter by API key hash (SHA-256 hex string, as returned by the keys API). + in: query + name: api_key_hash + required: false + schema: + description: Filter by API key hash (SHA-256 hex string, as returned by the keys API). + example: abc123def456... + type: string + - description: Filter by org member user ID. Only applicable for organization accounts. + in: query + name: user_id + required: false + schema: + description: Filter by org member user ID. Only applicable for organization accounts. + example: user_abc123 + type: string + responses: + '200': + content: + application/json: + example: + data: + - byok_usage_inference: 0.012 + completion_tokens: 125 + date: '2025-08-24' + endpoint_id: 550e8400-e29b-41d4-a716-446655440000 + model: openai/gpt-4.1 + model_permaslug: openai/gpt-4.1-2025-04-14 + prompt_tokens: 50 + provider_name: OpenAI + reasoning_tokens: 25 + requests: 5 + usage: 0.015 + schema: + $ref: '#/components/schemas/ActivityResponse' + description: Returns user activity data grouped by endpoint + '400': + content: + application/json: + example: + error: + code: 400 + message: Invalid request parameters + schema: + $ref: '#/components/schemas/BadRequestResponse' + description: Bad Request - Invalid request parameters or malformed input + '401': + content: + application/json: + example: + error: + code: 401 + message: Missing Authentication header + schema: + $ref: '#/components/schemas/UnauthorizedResponse' + description: Unauthorized - Authentication required or invalid credentials + '403': + content: + application/json: + example: + error: + code: 403 + message: Only management keys can perform this operation + schema: + $ref: '#/components/schemas/ForbiddenResponse' + description: Forbidden - Authentication successful but insufficient permissions + '404': + content: + application/json: + example: + error: + code: 404 + message: Resource not found + schema: + $ref: '#/components/schemas/NotFoundResponse' + description: Not Found - Resource does not exist + '500': + content: + application/json: + example: + error: + code: 500 + message: Internal Server Error + schema: + $ref: '#/components/schemas/InternalServerResponse' + description: Internal Server Error - Unexpected server error + summary: Get user activity grouped by endpoint + tags: + - Analytics + parameters: + - $ref: "#/components/parameters/AppIdentifier" + - $ref: "#/components/parameters/AppDisplayName" + - $ref: "#/components/parameters/AppCategories" + /audio/speech: + post: + description: Synthesizes audio from the input text + operationId: createAudioSpeech + requestBody: + content: + application/json: + example: + input: Hello world + model: elevenlabs/eleven-turbo-v2 + response_format: pcm + speed: 1 + voice: alloy + schema: + $ref: '#/components/schemas/SpeechRequest' + required: true + responses: + '200': + content: + audio/*: + schema: + description: Raw audio bytestream. Content-Type varies by requested format (audio/mpeg for mp3, audio/L16 for pcm). + example: + format: binary + type: string + description: Audio bytes stream + '400': + content: + application/json: + example: + error: + code: 400 + message: Invalid request parameters + schema: + $ref: '#/components/schemas/BadRequestResponse' + description: Bad Request - Invalid request parameters or malformed input + '401': + content: + application/json: + example: + error: + code: 401 + message: Missing Authentication header + schema: + $ref: '#/components/schemas/UnauthorizedResponse' + description: Unauthorized - Authentication required or invalid credentials + '402': + content: + application/json: + example: + error: + code: 402 + message: Insufficient credits. Add more using https://openrouter.ai/credits + schema: + $ref: '#/components/schemas/PaymentRequiredResponse' + description: Payment Required - Insufficient credits or quota to complete request + '404': + content: + application/json: + example: + error: + code: 404 + message: Resource not found + schema: + $ref: '#/components/schemas/NotFoundResponse' + description: Not Found - Resource does not exist + '429': + content: + application/json: + example: + error: + code: 429 + message: Rate limit exceeded + schema: + $ref: '#/components/schemas/TooManyRequestsResponse' + description: Too Many Requests - Rate limit exceeded + '500': + content: + application/json: + example: + error: + code: 500 + message: Internal Server Error + schema: + $ref: '#/components/schemas/InternalServerResponse' + description: Internal Server Error - Unexpected server error + '502': + content: + application/json: + example: + error: + code: 502 + message: Provider returned error + schema: + $ref: '#/components/schemas/BadGatewayResponse' + description: Bad Gateway - Provider/upstream API failure + '503': + content: + application/json: + example: + error: + code: 503 + message: Service temporarily unavailable + schema: + $ref: '#/components/schemas/ServiceUnavailableResponse' + description: Service Unavailable - Service temporarily unavailable + '524': + content: + application/json: + example: + error: + code: 524 + message: Request timed out. Please try again later. + schema: + $ref: '#/components/schemas/EdgeNetworkTimeoutResponse' + description: Infrastructure Timeout - Provider request timed out at edge network + '529': + content: + application/json: + example: + error: + code: 529 + message: Provider returned error + schema: + $ref: '#/components/schemas/ProviderOverloadedResponse' + description: Provider Overloaded - Provider is temporarily overloaded + summary: Create speech + tags: + - TTS + x-speakeasy-name-override: createSpeech + parameters: + - $ref: "#/components/parameters/AppIdentifier" + - $ref: "#/components/parameters/AppDisplayName" + - $ref: "#/components/parameters/AppCategories" + /auth/keys: + post: + description: Exchange an authorization code from the PKCE flow for a user-controlled API key + operationId: exchangeAuthCodeForAPIKey + requestBody: + content: + application/json: + example: + code: auth_code_abc123def456 + code_challenge_method: S256 + code_verifier: dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk + schema: + example: + code: auth_code_abc123def456 + code_challenge_method: S256 + code_verifier: dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk + properties: + code: + description: The authorization code received from the OAuth redirect + example: auth_code_abc123def456 + type: string + code_challenge_method: + description: The method used to generate the code challenge + enum: + - S256 + - plain + - null + example: S256 + nullable: true + type: string + x-speakeasy-unknown-values: allow + code_verifier: + description: The code verifier if code_challenge was used in the authorization request + example: dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk + type: string + required: + - code + type: object + required: true + responses: + '200': + content: + application/json: + example: + key: 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 + user_id: user_2yOPcMpKoQhcd4bVgSMlELRaIah + schema: + example: + key: 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 + user_id: user_2yOPcMpKoQhcd4bVgSMlELRaIah + properties: + key: + description: The API key to use for OpenRouter requests + example: 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 + type: string + user_id: + description: User ID associated with the API key + example: user_2yOPcMpKoQhcd4bVgSMlELRaIah + nullable: true + type: string + required: + - key + - user_id + type: object + description: Successfully exchanged code for an API key + '400': + content: + application/json: + example: + error: + code: 400 + message: Invalid request parameters + schema: + $ref: '#/components/schemas/BadRequestResponse' + description: Bad Request - Invalid request parameters or malformed input + '403': + content: + application/json: + example: + error: + code: 403 + message: Only management keys can perform this operation + schema: + $ref: '#/components/schemas/ForbiddenResponse' + description: Forbidden - Authentication successful but insufficient permissions + '500': + content: + application/json: + example: + error: + code: 500 + message: Internal Server Error + schema: + $ref: '#/components/schemas/InternalServerResponse' + description: Internal Server Error - Unexpected server error + summary: Exchange authorization code for API key + tags: + - OAuth + parameters: + - $ref: "#/components/parameters/AppIdentifier" + - $ref: "#/components/parameters/AppDisplayName" + - $ref: "#/components/parameters/AppCategories" + /auth/keys/code: + post: + description: Create an authorization code for the PKCE flow to generate a user-controlled API key + operationId: createAuthKeysCode + requestBody: + content: + application/json: + example: + callback_url: https://myapp.com/auth/callback + code_challenge: E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM + code_challenge_method: S256 + limit: 100 + schema: + example: + callback_url: https://myapp.com/auth/callback + code_challenge: E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM + code_challenge_method: S256 + limit: 100 + properties: + callback_url: + description: >- + The callback URL to redirect to after authorization. Note, only https URLs on ports 443 and 3000 are allowed. + example: https://myapp.com/auth/callback + format: uri + type: string + code_challenge: + description: PKCE code challenge for enhanced security + example: E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM + type: string + code_challenge_method: + description: The method used to generate the code challenge + enum: + - S256 + - plain + example: S256 + type: string + x-speakeasy-unknown-values: allow + expires_at: + description: Optional expiration time for the API key to be created + example: '2027-12-31T23:59:59Z' + format: date-time + nullable: true + type: string + key_label: + description: Optional custom label for the API key. Defaults to the app name if not provided. + example: My Custom Key + maxLength: 100 + type: string + limit: + description: Credit limit for the API key to be created + 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: + - daily + - weekly + - monthly + example: monthly + type: string + x-speakeasy-unknown-values: allow + required: + - callback_url + type: object + required: true + responses: + '200': + content: + application/json: + example: + data: + app_id: 12345 + created_at: '2025-08-24T10:30:00Z' + id: auth_code_xyz789 + schema: + example: + data: + app_id: 12345 + created_at: '2025-08-24T10:30:00Z' + id: auth_code_xyz789 + properties: + data: + description: Auth code data + example: + app_id: 12345 + created_at: '2025-08-24T10:30:00Z' + id: auth_code_xyz789 + properties: + app_id: + description: The application ID associated with this auth code + example: 12345 + type: integer + created_at: + description: ISO 8601 timestamp of when the auth code was created + example: '2025-08-24T10:30:00Z' + type: string + id: + description: The authorization code ID to use in the exchange request + example: auth_code_xyz789 + type: string + required: + - id + - app_id + - created_at + type: object + required: + - data + type: object + description: Successfully created authorization code + '400': + content: + application/json: + example: + error: + code: 400 + message: Invalid request parameters + schema: + $ref: '#/components/schemas/BadRequestResponse' + description: Bad Request - Invalid request parameters or malformed input + '401': + content: + application/json: + example: + error: + code: 401 + message: Missing Authentication header + schema: + $ref: '#/components/schemas/UnauthorizedResponse' + description: Unauthorized - Authentication required or invalid credentials + '409': + content: + application/json: + example: + error: + code: 409 + message: Resource conflict. Please try again later. + schema: + $ref: '#/components/schemas/ConflictResponse' + description: Conflict - Resource conflict or concurrent modification + '500': + content: + application/json: + example: + error: + code: 500 + message: Internal Server Error + schema: + $ref: '#/components/schemas/InternalServerResponse' + description: Internal Server Error - Unexpected server error + summary: Create authorization code + tags: + - OAuth + x-speakeasy-name-override: createAuthCode + parameters: + - $ref: "#/components/parameters/AppIdentifier" + - $ref: "#/components/parameters/AppDisplayName" + - $ref: "#/components/parameters/AppCategories" + /chat/completions: + post: + description: >- + Sends a request for a model response for the given chat conversation. Supports both streaming and non-streaming modes. + operationId: sendChatCompletionRequest + requestBody: + content: + application/json: + example: + max_tokens: 150 + messages: + - content: You are a helpful assistant. + role: system + - content: What is the capital of France? + role: user + model: openai/gpt-4 + temperature: 0.7 + schema: + $ref: '#/components/schemas/ChatRequest' + required: true + responses: + '200': + content: + application/json: + example: + choices: + - finish_reason: stop + index: 0 + message: + content: The capital of France is Paris. + role: assistant + created: 1677652288 + id: chatcmpl-123 + model: openai/gpt-4 + object: chat.completion + usage: + completion_tokens: 10 + prompt_tokens: 25 + total_tokens: 35 + schema: + $ref: '#/components/schemas/ChatResult' + text/event-stream: + example: + data: + choices: + - delta: + content: Hello + role: assistant + finish_reason: null + index: 0 + created: 1677652288 + id: chatcmpl-123 + model: openai/gpt-4 + object: chat.completion.chunk + schema: + properties: + data: + $ref: '#/components/schemas/ChatStreamChunk' + required: + - data + type: object + x-speakeasy-sse-sentinel: '[DONE]' + description: Successful chat completion response + '400': + content: + application/json: + example: + error: + code: 400 + message: Invalid request parameters + schema: + $ref: '#/components/schemas/BadRequestResponse' + description: Bad Request - Invalid request parameters or malformed input + '401': + content: + application/json: + example: + error: + code: 401 + message: Missing Authentication header + schema: + $ref: '#/components/schemas/UnauthorizedResponse' + description: Unauthorized - Authentication required or invalid credentials + '402': + content: + application/json: + example: + error: + code: 402 + message: Insufficient credits. Add more using https://openrouter.ai/credits + schema: + $ref: '#/components/schemas/PaymentRequiredResponse' + description: Payment Required - Insufficient credits or quota to complete request + '404': + content: + application/json: + example: + error: + code: 404 + message: Resource not found + schema: + $ref: '#/components/schemas/NotFoundResponse' + description: Not Found - Resource does not exist + '408': + content: + application/json: + example: + error: + code: 408 + message: Operation timed out. Please try again later. + schema: + $ref: '#/components/schemas/RequestTimeoutResponse' + description: Request Timeout - Operation exceeded time limit + '413': + content: + application/json: + example: + error: + code: 413 + message: Request payload too large + schema: + $ref: '#/components/schemas/PayloadTooLargeResponse' + description: Payload Too Large - Request payload exceeds size limits + '422': + content: + application/json: + example: + error: + code: 422 + message: Invalid argument + schema: + $ref: '#/components/schemas/UnprocessableEntityResponse' + description: Unprocessable Entity - Semantic validation failure + '429': + content: + application/json: + example: + error: + code: 429 + message: Rate limit exceeded + schema: + $ref: '#/components/schemas/TooManyRequestsResponse' + description: Too Many Requests - Rate limit exceeded + '500': + content: + application/json: + example: + error: + code: 500 + message: Internal Server Error + schema: + $ref: '#/components/schemas/InternalServerResponse' + description: Internal Server Error - Unexpected server error + '502': + content: + application/json: + example: + error: + code: 502 + message: Provider returned error + schema: + $ref: '#/components/schemas/BadGatewayResponse' + description: Bad Gateway - Provider/upstream API failure + '503': + content: + application/json: + example: + error: + code: 503 + message: Service temporarily unavailable + schema: + $ref: '#/components/schemas/ServiceUnavailableResponse' + description: Service Unavailable - Service temporarily unavailable + '524': + content: + application/json: + example: + error: + code: 524 + message: Request timed out. Please try again later. + schema: + $ref: '#/components/schemas/EdgeNetworkTimeoutResponse' + description: Infrastructure Timeout - Provider request timed out at edge network + '529': + content: + application/json: + example: + error: + code: 529 + message: Provider returned error + schema: + $ref: '#/components/schemas/ProviderOverloadedResponse' + description: Provider Overloaded - Provider is temporarily overloaded + summary: Create a chat completion + tags: + - Chat + x-speakeasy-group: chat + x-speakeasy-name-override: send + x-speakeasy-stream-request-field: stream + parameters: + - $ref: "#/components/parameters/AppIdentifier" + - $ref: "#/components/parameters/AppDisplayName" + - $ref: "#/components/parameters/AppCategories" + /credits: + get: + description: >- + Get total credits purchased and used for the authenticated user. [Management key](/docs/guides/overview/auth/management-api-keys) required. + operationId: getCredits + responses: + '200': + content: + application/json: + example: + data: + total_credits: 100.5 + total_usage: 25.75 + schema: + description: Total credits purchased and used + example: + data: + total_credits: 100.5 + total_usage: 25.75 + properties: + data: + example: + total_credits: 100.5 + total_usage: 25.75 + properties: + total_credits: + description: Total credits purchased + example: 100.5 + format: double + type: number + total_usage: + description: Total credits used + example: 25.75 + format: double + type: number + required: + - total_credits + - total_usage + type: object + required: + - data + type: object + description: Returns the total credits purchased and used + '401': + content: + application/json: + example: + error: + code: 401 + message: Missing Authentication header + schema: + $ref: '#/components/schemas/UnauthorizedResponse' + description: Unauthorized - Authentication required or invalid credentials + '403': + content: + application/json: + example: + error: + code: 403 + message: Only management keys can perform this operation + schema: + $ref: '#/components/schemas/ForbiddenResponse' + description: Forbidden - Authentication successful but insufficient permissions + '500': + content: + application/json: + example: + error: + code: 500 + message: Internal Server Error + schema: + $ref: '#/components/schemas/InternalServerResponse' + description: Internal Server Error - Unexpected server error + summary: Get remaining credits + tags: + - Credits + x-speakeasy-name-override: getCredits + parameters: + - $ref: "#/components/parameters/AppIdentifier" + - $ref: "#/components/parameters/AppDisplayName" + - $ref: "#/components/parameters/AppCategories" + /credits/coinbase: + post: + deprecated: true + description: >- + Deprecated. The Coinbase APIs used by this endpoint have been deprecated, so Coinbase Commerce charges have been removed. Use the web credits purchase flow instead. + operationId: createCoinbaseCharge + responses: + '200': + description: This endpoint is deprecated and will never return a 200 response. + '410': + content: + application/json: + example: + error: + code: 410 + message: >- + The Coinbase APIs used by this endpoint have been deprecated, so the Coinbase Commerce credits API has been removed. Use the web credits purchase flow instead. + schema: + $ref: '#/components/schemas/GoneResponse' + description: Gone - Endpoint has been permanently removed or deprecated + security: [] + summary: Deprecated Coinbase Commerce charge endpoint + tags: + - Credits + x-fern-ignore: true + x-speakeasy-ignore: true + x-speakeasy-name-override: createCoinbaseCharge + parameters: + - $ref: "#/components/parameters/AppIdentifier" + - $ref: "#/components/parameters/AppDisplayName" + - $ref: "#/components/parameters/AppCategories" + /embeddings: + post: + description: Submits an embedding request to the embeddings router + operationId: createEmbeddings + requestBody: + content: + application/json: + schema: + description: Embeddings request input + example: + dimensions: 1536 + input: The quick brown fox jumps over the lazy dog + model: openai/text-embedding-3-small + properties: + dimensions: + description: The number of dimensions for the output embeddings + example: 1536 + minimum: 1 + type: integer + encoding_format: + description: The format of the output embeddings + enum: + - float + - base64 + example: float + type: string + x-speakeasy-unknown-values: allow + input: + anyOf: + - type: string + - items: + type: string + type: array + - items: + type: number + type: array + - items: + items: + type: number + type: array + type: array + - items: + properties: + content: + items: + oneOf: + - properties: + text: + type: string + type: + enum: + - text + type: string + required: + - type + - text + type: object + - properties: + image_url: + properties: + url: + type: string + required: + - url + type: object + type: + enum: + - image_url + type: string + required: + - type - image_url type: object type: array @@ -14295,6 +15911,25 @@ paths: description: Number of tokens in the input example: 8 type: integer + prompt_tokens_details: + description: >- + Per-modality token breakdown. Only present when the input contains 2+ modalities (e.g. text + image) and the upstream provider returns modality-level usage data. Only non-zero modality counts are included. + properties: + audio_tokens: + description: Number of audio tokens in the input + type: integer + image_tokens: + description: Number of image tokens in the input + example: 258 + type: integer + text_tokens: + description: Number of text tokens in the input + example: 8 + type: integer + video_tokens: + description: Number of video tokens in the input + type: integer + type: object total_tokens: description: Total number of tokens used example: 8 @@ -14618,284 +16253,46 @@ paths: application/json: example: data: - api_type: null + api_type: completions app_id: 12345 - cache_discount: 0.0002 + cache_discount: null cancelled: false created_at: '2024-07-15T23:33:19.433273+00:00' external_user: user-123 finish_reason: stop generation_time: 1200 - http_referer: null + http_referer: https://openrouter.ai/ id: gen-3bhGkxlo4XFrqiabUM7NDtwDzWwG is_byok: false latency: 1250 model: sao10k/l3-stheno-8b moderation_latency: 50 - native_finish_reason: stop - native_tokens_cached: 3 - native_tokens_completion: 25 - native_tokens_completion_images: 0 - native_tokens_prompt: 10 - native_tokens_reasoning: 5 - num_input_audio_prompt: 0 - num_media_completion: 0 - num_media_prompt: 1 - num_search_results: 5 - origin: https://openrouter.ai/ - provider_name: Infermatic - provider_responses: null - request_id: req-1727282430-aBcDeFgHiJkLmNoPqRsT - router: null - streamed: true - tokens_completion: 25 - tokens_prompt: 10 - total_cost: 0.0015 - upstream_id: chatcmpl-791bcf62-080e-4568-87d0-94c72e3b4946 - upstream_inference_cost: 0.0012 - usage: 0.0015 - user_agent: null - schema: - description: Generation response - properties: - data: - description: Generation data - properties: - api_type: - description: Type of API used for the generation - enum: - - completions - - embeddings - - rerank - - video - - null - nullable: true - type: string - x-speakeasy-unknown-values: allow - app_id: - description: ID of the app that made the request - example: 12345 - nullable: true - type: integer - cache_discount: - description: Discount applied due to caching - example: 0.0002 - format: double - nullable: true - type: number - cancelled: - description: Whether the generation was cancelled - example: false - nullable: true - type: boolean - created_at: - description: ISO 8601 timestamp of when the generation was created - example: '2024-07-15T23:33:19.433273+00:00' - type: string - external_user: - description: External user identifier - example: user-123 - nullable: true - type: string - finish_reason: - description: Reason the generation finished - example: stop - nullable: true - type: string - generation_time: - description: Time taken for generation in milliseconds - example: 1200 - format: double - nullable: true - type: number - http_referer: - description: Referer header from the request - nullable: true - type: string - id: - description: Unique identifier for the generation - example: gen-3bhGkxlo4XFrqiabUM7NDtwDzWwG - type: string - is_byok: - description: Whether this used bring-your-own-key - example: false - type: boolean - latency: - description: Total latency in milliseconds - example: 1250 - format: double - nullable: true - type: number - model: - description: Model used for the generation - example: sao10k/l3-stheno-8b - type: string - moderation_latency: - description: Moderation latency in milliseconds - example: 50 - format: double - nullable: true - type: number - native_finish_reason: - description: Native finish reason as reported by provider - example: stop - nullable: true - type: string - native_tokens_cached: - description: Native cached tokens as reported by provider - example: 3 - nullable: true - type: integer - native_tokens_completion: - description: Native completion tokens as reported by provider - example: 25 - nullable: true - type: integer - native_tokens_completion_images: - description: Native completion image tokens as reported by provider - example: 0 - nullable: true - type: integer - native_tokens_prompt: - description: Native prompt tokens as reported by provider - example: 10 - nullable: true - type: integer - native_tokens_reasoning: - description: Native reasoning tokens as reported by provider - example: 5 - nullable: true - type: integer - num_input_audio_prompt: - description: Number of audio inputs in the prompt - example: 0 - nullable: true - type: integer - num_media_completion: - description: Number of media items in the completion - example: 0 - nullable: true - type: integer - num_media_prompt: - description: Number of media items in the prompt - example: 1 - nullable: true - type: integer - num_search_results: - description: Number of search results included - example: 5 - nullable: true - type: integer - origin: - description: Origin URL of the request - example: https://openrouter.ai/ - type: string - provider_name: - description: Name of the provider that served the request - example: Infermatic - nullable: true - type: string - provider_responses: - description: List of provider responses for this generation, including fallback attempts - items: - $ref: '#/components/schemas/ProviderResponse' - nullable: true - type: array - request_id: - description: Unique identifier grouping all generations from a single API request - example: req-1727282430-aBcDeFgHiJkLmNoPqRsT - nullable: true - type: string - router: - description: Router used for the request (e.g., openrouter/auto) - example: openrouter/auto - nullable: true - type: string - session_id: - description: Session identifier grouping multiple generations in the same session - nullable: true - type: string - streamed: - description: Whether the response was streamed - example: true - nullable: true - type: boolean - tokens_completion: - description: Number of tokens in the completion - example: 25 - nullable: true - type: integer - tokens_prompt: - description: Number of tokens in the prompt - example: 10 - nullable: true - type: integer - total_cost: - description: Total cost of the generation in USD - example: 0.0015 - format: double - type: number - upstream_id: - description: Upstream provider's identifier for this generation - example: chatcmpl-791bcf62-080e-4568-87d0-94c72e3b4946 - nullable: true - type: string - upstream_inference_cost: - description: Cost charged by the upstream provider - example: 0.0012 - format: double - nullable: true - type: number - usage: - description: Usage amount in USD - example: 0.0015 - format: double - type: number - user_agent: - description: User-Agent header from the request - nullable: true - type: string - required: - - id - - upstream_id - - total_cost - - cache_discount - - upstream_inference_cost - - created_at - - model - - app_id - - streamed - - cancelled - - provider_name - - latency - - moderation_latency - - generation_time - - finish_reason - - tokens_prompt - - tokens_completion - - native_tokens_prompt - - native_tokens_completion - - native_tokens_completion_images - - native_tokens_reasoning - - native_tokens_cached - - num_media_prompt - - num_input_audio_prompt - - num_media_completion - - num_search_results - - origin - - usage - - is_byok - - native_finish_reason - - external_user - - api_type - - router - - provider_responses - - user_agent - - http_referer - type: object - required: - - data - type: object + native_finish_reason: stop + native_tokens_cached: 3 + native_tokens_completion: 25 + native_tokens_completion_images: 0 + native_tokens_prompt: 10 + native_tokens_reasoning: 5 + num_input_audio_prompt: 0 + num_media_completion: 0 + num_media_prompt: 1 + num_search_results: 5 + origin: https://openrouter.ai/ + provider_name: Infermatic + provider_responses: null + request_id: req-1727282430-aBcDeFgHiJkLmNoPqRsT + router: openrouter/auto + session_id: null + streamed: true + tokens_completion: 25 + tokens_prompt: 10 + total_cost: 0.0015 + upstream_id: chatcmpl-791bcf62-080e-4568-87d0-94c72e3b4946 + upstream_inference_cost: 0.0012 + usage: 0.0015 + user_agent: Mozilla/5.0 + schema: + $ref: '#/components/schemas/GenerationResponse' description: Returns the request metadata for this generation '401': content: @@ -14984,6 +16381,122 @@ paths: - $ref: "#/components/parameters/AppIdentifier" - $ref: "#/components/parameters/AppDisplayName" - $ref: "#/components/parameters/AppCategories" + /generation/content: + get: + operationId: listGenerationContent + parameters: + - description: The generation ID + in: query + name: id + required: true + schema: + description: The generation ID + example: gen-1234567890 + minLength: 1 + type: string + responses: + '200': + content: + application/json: + example: + data: + input: + messages: + - content: What is the meaning of life? + role: user + output: + completion: The meaning of life is a philosophical question... + reasoning: null + schema: + $ref: '#/components/schemas/GenerationContentResponse' + description: Returns the stored prompt and completion content + '401': + content: + application/json: + example: + error: + code: 401 + message: Missing Authentication header + schema: + $ref: '#/components/schemas/UnauthorizedResponse' + description: Unauthorized - Authentication required or invalid credentials + '403': + content: + application/json: + example: + error: + code: 403 + message: Only management keys can perform this operation + schema: + $ref: '#/components/schemas/ForbiddenResponse' + description: Forbidden - Authentication successful but insufficient permissions + '404': + content: + application/json: + example: + error: + code: 404 + message: Resource not found + schema: + $ref: '#/components/schemas/NotFoundResponse' + description: Not Found - Resource does not exist + '429': + content: + application/json: + example: + error: + code: 429 + message: Rate limit exceeded + schema: + $ref: '#/components/schemas/TooManyRequestsResponse' + description: Too Many Requests - Rate limit exceeded + '500': + content: + application/json: + example: + error: + code: 500 + message: Internal Server Error + schema: + $ref: '#/components/schemas/InternalServerResponse' + description: Internal Server Error - Unexpected server error + '502': + content: + application/json: + example: + error: + code: 502 + message: Provider returned error + schema: + $ref: '#/components/schemas/BadGatewayResponse' + description: Bad Gateway - Provider/upstream API failure + '524': + content: + application/json: + example: + error: + code: 524 + message: Request timed out. Please try again later. + schema: + $ref: '#/components/schemas/EdgeNetworkTimeoutResponse' + description: Infrastructure Timeout - Provider request timed out at edge network + '529': + content: + application/json: + example: + error: + code: 529 + message: Provider returned error + schema: + $ref: '#/components/schemas/ProviderOverloadedResponse' + description: Provider Overloaded - Provider is temporarily overloaded + summary: Get stored prompt and completion content for a generation + tags: + - Generations + parameters: + - $ref: "#/components/parameters/AppIdentifier" + - $ref: "#/components/parameters/AppDisplayName" + - $ref: "#/components/parameters/AppCategories" /guardrails: get: description: >- @@ -15010,6 +16523,15 @@ paths: maximum: 100 minimum: 1 type: integer + - description: Filter guardrails by workspace ID. By default, guardrails in the default workspace are returned. + in: query + name: workspace_id + required: false + schema: + description: Filter guardrails by workspace ID. By default, guardrails in the default workspace are returned. + example: 0df9e665-d932-5740-b2c7-b52af166bc11 + format: uuid + type: string responses: '200': content: @@ -15031,6 +16553,7 @@ paths: name: Production Guardrail reset_interval: monthly updated_at: '2025-08-24T15:45:00Z' + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 total_count: 1 schema: $ref: '#/components/schemas/ListGuardrailsResponse' @@ -15114,6 +16637,7 @@ paths: name: My New Guardrail reset_interval: monthly updated_at: null + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 schema: $ref: '#/components/schemas/CreateGuardrailResponse' description: Guardrail created successfully @@ -15137,6 +16661,16 @@ paths: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: Unauthorized - Authentication required or invalid credentials + '403': + content: + application/json: + example: + error: + code: 403 + message: Only management keys can perform this operation + schema: + $ref: '#/components/schemas/ForbiddenResponse' + description: Forbidden - Authentication successful but insufficient permissions '500': content: application/json: @@ -15246,6 +16780,7 @@ paths: name: Production Guardrail reset_interval: monthly updated_at: '2025-08-24T15:45:00Z' + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 schema: $ref: '#/components/schemas/GetGuardrailResponse' description: Guardrail details @@ -15326,6 +16861,7 @@ paths: name: Updated Guardrail Name reset_interval: weekly updated_at: '2025-08-24T16:00:00Z' + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 schema: $ref: '#/components/schemas/UpdateGuardrailResponse' description: Guardrail updated successfully @@ -16333,6 +17869,15 @@ paths: minimum: 0 nullable: false type: integer + - description: Filter API keys by workspace ID. By default, keys in the default workspace are returned. + in: query + name: workspace_id + required: false + schema: + description: Filter API keys by workspace ID. By default, keys in the default workspace are returned. + example: 0df9e665-d932-5740-b2c7-b52af166bc11 + format: uuid + type: string responses: '200': content: @@ -16359,6 +17904,7 @@ paths: usage_daily: 25.5 usage_monthly: 25.5 usage_weekly: 25.5 + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 schema: example: data: @@ -16382,6 +17928,7 @@ paths: usage_daily: 25.5 usage_monthly: 25.5 usage_weekly: 25.5 + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 properties: data: description: List of API keys @@ -16407,6 +17954,7 @@ paths: usage_daily: 25.5 usage_monthly: 25.5 usage_weekly: 25.5 + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 properties: byok_usage: description: Total external BYOK usage (in USD) for the API key @@ -16506,6 +18054,10 @@ paths: example: 25.5 format: double type: number + workspace_id: + description: The workspace ID this API key belongs to. + example: 0df9e665-d932-5740-b2c7-b52af166bc11 + type: string required: - hash - name @@ -16526,6 +18078,7 @@ paths: - created_at - updated_at - creator_user_id + - workspace_id type: object type: array required: @@ -16628,6 +18181,11 @@ paths: example: My New API Key minLength: 1 type: string + workspace_id: + description: The workspace to create the API key in. Defaults to the default workspace if not provided. + example: 0df9e665-d932-5740-b2c7-b52af166bc11 + format: uuid + type: string required: - name type: object @@ -16658,6 +18216,7 @@ paths: usage_daily: 0 usage_monthly: 0 usage_weekly: 0 + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 key: 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 schema: example: @@ -16682,6 +18241,7 @@ paths: usage_daily: 0 usage_monthly: 0 usage_weekly: 0 + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 key: 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 properties: data: @@ -16707,6 +18267,7 @@ paths: usage_daily: 25.5 usage_monthly: 25.5 usage_weekly: 25.5 + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 properties: byok_usage: description: Total external BYOK usage (in USD) for the API key @@ -16806,6 +18367,10 @@ paths: example: 25.5 format: double type: number + workspace_id: + description: The workspace ID this API key belongs to. + example: 0df9e665-d932-5740-b2c7-b52af166bc11 + type: string required: - hash - name @@ -16826,6 +18391,7 @@ paths: - created_at - updated_at - creator_user_id + - workspace_id type: object key: description: The actual API key string (only shown once) @@ -16856,6 +18422,16 @@ paths: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: Unauthorized - Authentication required or invalid credentials + '403': + content: + application/json: + example: + error: + code: 403 + message: Only management keys can perform this operation + schema: + $ref: '#/components/schemas/ForbiddenResponse' + description: Forbidden - Authentication successful but insufficient permissions '429': content: application/json: @@ -16998,6 +18574,7 @@ paths: usage_daily: 25.5 usage_monthly: 25.5 usage_weekly: 25.5 + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 schema: example: data: @@ -17021,6 +18598,7 @@ paths: usage_daily: 25.5 usage_monthly: 25.5 usage_weekly: 25.5 + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 properties: data: description: The API key information @@ -17045,6 +18623,7 @@ paths: usage_daily: 25.5 usage_monthly: 25.5 usage_weekly: 25.5 + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 properties: byok_usage: description: Total external BYOK usage (in USD) for the API key @@ -17144,6 +18723,10 @@ paths: example: 25.5 format: double type: number + workspace_id: + description: The workspace ID this API key belongs to. + example: 0df9e665-d932-5740-b2c7-b52af166bc11 + type: string required: - hash - name @@ -17164,6 +18747,7 @@ paths: - created_at - updated_at - creator_user_id + - workspace_id type: object required: - data @@ -17300,6 +18884,7 @@ paths: usage_daily: 25.5 usage_monthly: 25.5 usage_weekly: 25.5 + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 schema: example: data: @@ -17323,6 +18908,7 @@ paths: usage_daily: 25.5 usage_monthly: 25.5 usage_weekly: 25.5 + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 properties: data: description: The updated API key information @@ -17347,6 +18933,7 @@ paths: usage_daily: 25.5 usage_monthly: 25.5 usage_weekly: 25.5 + workspace_id: 0df9e665-d932-5740-b2c7-b52af166bc11 properties: byok_usage: description: Total external BYOK usage (in USD) for the API key @@ -17446,6 +19033,10 @@ paths: example: 25.5 format: double type: number + workspace_id: + description: The workspace ID this API key belongs to. + example: 0df9e665-d932-5740-b2c7-b52af166bc11 + type: string required: - hash - name @@ -17466,6 +19057,7 @@ paths: - created_at - updated_at - creator_user_id + - workspace_id type: object required: - data @@ -18780,15 +20372,622 @@ paths: nullable: true type: string required: - - name - - slug - - privacy_policy_url + - name + - slug + - privacy_policy_url + type: object + type: array + required: + - data + type: object + description: Returns a list of providers + '500': + content: + application/json: + example: + error: + code: 500 + message: Internal Server Error + schema: + $ref: '#/components/schemas/InternalServerResponse' + description: Internal Server Error - Unexpected server error + summary: List all providers + tags: + - Providers + x-speakeasy-name-override: list + parameters: + - $ref: "#/components/parameters/AppIdentifier" + - $ref: "#/components/parameters/AppDisplayName" + - $ref: "#/components/parameters/AppCategories" + /rerank: + post: + description: Submits a rerank request to the rerank router + operationId: createRerank + requestBody: + content: + application/json: + schema: + description: Rerank request input + example: + documents: + - Paris is the capital of France. + - Berlin is the capital of Germany. + model: cohere/rerank-v3.5 + query: What is the capital of France? + top_n: 3 + properties: + documents: + description: The list of documents to rerank + example: + - Paris is the capital of France. + - Berlin is the capital of Germany. + items: + type: string + type: array + model: + description: The rerank model to use + example: cohere/rerank-v3.5 + type: string + provider: + allOf: + - $ref: '#/components/schemas/ProviderPreferences' + - description: Provider routing preferences for the request. + query: + description: The search query to rerank documents against + example: What is the capital of France? + type: string + top_n: + description: Number of most relevant documents to return + example: 3 + minimum: 1 + type: integer + required: + - model + - query + - documents + type: object + required: true + responses: + '200': + content: + application/json: + schema: + description: Rerank response containing ranked results + example: + id: gen-rerank-1234567890-abc + model: cohere/rerank-v3.5 + results: + - document: + text: Paris is the capital of France. + index: 0 + relevance_score: 0.98 + usage: + search_units: 1 + total_tokens: 150 + properties: + id: + description: Unique identifier for the rerank response (ORID format) + example: gen-rerank-1234567890-abc + type: string + model: + description: The model used for reranking + example: cohere/rerank-v3.5 + type: string + provider: + description: The provider that served the rerank request + example: Cohere + type: string + results: + description: List of rerank results sorted by relevance + example: + - document: + text: Paris is the capital of France. + index: 0 + relevance_score: 0.98 + items: + description: A single rerank result + example: + document: + text: Paris is the capital of France. + index: 0 + relevance_score: 0.98 + properties: + document: + description: The document object containing the original text + properties: + text: + description: The document text + example: Paris is the capital of France. + type: string + required: + - text + type: object + index: + description: Index of the document in the original input list + example: 0 + type: integer + relevance_score: + description: Relevance score of the document to the query + example: 0.98 + format: double + type: number + required: + - index + - relevance_score + - document type: object type: array + usage: + description: Usage statistics + example: + search_units: 1 + total_tokens: 150 + properties: + cost: + description: Cost of the request in credits + example: 0.001 + format: double + type: number + search_units: + description: Number of search units consumed (Cohere billing) + example: 1 + type: integer + total_tokens: + description: Total number of tokens used + example: 150 + type: integer + type: object + required: + - model + - results + type: object + text/event-stream: + example: 'data: [DONE]' + schema: + description: Not used for rerank - rerank does not support streaming + type: string + x-speakeasy-sse-sentinel: '[DONE]' + description: Rerank response + '400': + content: + application/json: + example: + error: + code: 400 + message: Invalid request parameters + schema: + $ref: '#/components/schemas/BadRequestResponse' + description: Bad Request - Invalid request parameters or malformed input + '401': + content: + application/json: + example: + error: + code: 401 + message: Missing Authentication header + schema: + $ref: '#/components/schemas/UnauthorizedResponse' + description: Unauthorized - Authentication required or invalid credentials + '402': + content: + application/json: + example: + error: + code: 402 + message: Insufficient credits. Add more using https://openrouter.ai/credits + schema: + $ref: '#/components/schemas/PaymentRequiredResponse' + description: Payment Required - Insufficient credits or quota to complete request + '404': + content: + application/json: + example: + error: + code: 404 + message: Resource not found + schema: + $ref: '#/components/schemas/NotFoundResponse' + description: Not Found - Resource does not exist + '429': + content: + application/json: + example: + error: + code: 429 + message: Rate limit exceeded + schema: + $ref: '#/components/schemas/TooManyRequestsResponse' + description: Too Many Requests - Rate limit exceeded + '500': + content: + application/json: + example: + error: + code: 500 + message: Internal Server Error + schema: + $ref: '#/components/schemas/InternalServerResponse' + description: Internal Server Error - Unexpected server error + '502': + content: + application/json: + example: + error: + code: 502 + message: Provider returned error + schema: + $ref: '#/components/schemas/BadGatewayResponse' + description: Bad Gateway - Provider/upstream API failure + '503': + content: + application/json: + example: + error: + code: 503 + message: Service temporarily unavailable + schema: + $ref: '#/components/schemas/ServiceUnavailableResponse' + description: Service Unavailable - Service temporarily unavailable + '524': + content: + application/json: + example: + error: + code: 524 + message: Request timed out. Please try again later. + schema: + $ref: '#/components/schemas/EdgeNetworkTimeoutResponse' + description: Infrastructure Timeout - Provider request timed out at edge network + '529': + content: + application/json: + example: + error: + code: 529 + message: Provider returned error + schema: + $ref: '#/components/schemas/ProviderOverloadedResponse' + description: Provider Overloaded - Provider is temporarily overloaded + summary: Submit a rerank request + tags: + - Rerank + x-speakeasy-name-override: rerank + parameters: + - $ref: "#/components/parameters/AppIdentifier" + - $ref: "#/components/parameters/AppDisplayName" + - $ref: "#/components/parameters/AppCategories" + /responses: + post: + description: Creates a streaming or non-streaming response using OpenResponses API format + operationId: createResponses + requestBody: + content: + application/json: + example: + input: Tell me a joke + model: openai/gpt-4o + schema: + $ref: '#/components/schemas/ResponsesRequest' + required: true + responses: + '200': + content: + application/json: + example: + created_at: 1700000000 + id: resp_abc123 + model: openai/gpt-4o + object: response + output: + - content: + - text: Why did the chicken cross the road? To get to the other side! + type: output_text + role: assistant + type: message + status: completed + usage: + completion_tokens: 20 + prompt_tokens: 10 + total_tokens: 30 + schema: + $ref: '#/components/schemas/OpenResponsesResult' + text/event-stream: + example: + data: + delta: Hello + type: response.output_text.delta + schema: + properties: + data: + $ref: '#/components/schemas/StreamEvents' required: - data type: object - description: Returns a list of providers + x-speakeasy-sse-sentinel: '[DONE]' + description: Successful response + '400': + content: + application/json: + example: + error: + code: 400 + message: Invalid request parameters + schema: + $ref: '#/components/schemas/BadRequestResponse' + description: Bad Request - Invalid request parameters or malformed input + '401': + content: + application/json: + example: + error: + code: 401 + message: Missing Authentication header + schema: + $ref: '#/components/schemas/UnauthorizedResponse' + description: Unauthorized - Authentication required or invalid credentials + '402': + content: + application/json: + example: + error: + code: 402 + message: Insufficient credits. Add more using https://openrouter.ai/credits + schema: + $ref: '#/components/schemas/PaymentRequiredResponse' + description: Payment Required - Insufficient credits or quota to complete request + '404': + content: + application/json: + example: + error: + code: 404 + message: Resource not found + schema: + $ref: '#/components/schemas/NotFoundResponse' + description: Not Found - Resource does not exist + '408': + content: + application/json: + example: + error: + code: 408 + message: Operation timed out. Please try again later. + schema: + $ref: '#/components/schemas/RequestTimeoutResponse' + description: Request Timeout - Operation exceeded time limit + '413': + content: + application/json: + example: + error: + code: 413 + message: Request payload too large + schema: + $ref: '#/components/schemas/PayloadTooLargeResponse' + description: Payload Too Large - Request payload exceeds size limits + '422': + content: + application/json: + example: + error: + code: 422 + message: Invalid argument + schema: + $ref: '#/components/schemas/UnprocessableEntityResponse' + description: Unprocessable Entity - Semantic validation failure + '429': + content: + application/json: + example: + error: + code: 429 + message: Rate limit exceeded + schema: + $ref: '#/components/schemas/TooManyRequestsResponse' + description: Too Many Requests - Rate limit exceeded + '500': + content: + application/json: + example: + error: + code: 500 + message: Internal Server Error + schema: + $ref: '#/components/schemas/InternalServerResponse' + description: Internal Server Error - Unexpected server error + '502': + content: + application/json: + example: + error: + code: 502 + message: Provider returned error + schema: + $ref: '#/components/schemas/BadGatewayResponse' + description: Bad Gateway - Provider/upstream API failure + '503': + content: + application/json: + example: + error: + code: 503 + message: Service temporarily unavailable + schema: + $ref: '#/components/schemas/ServiceUnavailableResponse' + description: Service Unavailable - Service temporarily unavailable + '524': + content: + application/json: + example: + error: + code: 524 + message: Request timed out. Please try again later. + schema: + $ref: '#/components/schemas/EdgeNetworkTimeoutResponse' + description: Infrastructure Timeout - Provider request timed out at edge network + '529': + content: + application/json: + example: + error: + code: 529 + message: Provider returned error + schema: + $ref: '#/components/schemas/ProviderOverloadedResponse' + description: Provider Overloaded - Provider is temporarily overloaded + summary: Create a response + tags: + - beta.responses + x-speakeasy-name-override: send + x-speakeasy-stream-request-field: stream + parameters: + - $ref: "#/components/parameters/AppIdentifier" + - $ref: "#/components/parameters/AppDisplayName" + - $ref: "#/components/parameters/AppCategories" + /videos: + post: + description: Submits a video generation request and returns a polling URL to check status + operationId: createVideos + requestBody: + content: + application/json: + example: + aspect_ratio: '16:9' + duration: 8 + model: google/veo-3.1 + prompt: A serene mountain landscape at sunset + resolution: 720p + schema: + $ref: '#/components/schemas/VideoGenerationRequest' + required: true + responses: + '202': + content: + application/json: + example: + generation_id: gen-xyz789 + id: job-abc123 + polling_url: /api/v1/videos/job-abc123 + status: pending + schema: + $ref: '#/components/schemas/VideoGenerationResponse' + description: Video generation request accepted + '400': + content: + application/json: + example: + error: + code: 400 + message: Invalid request parameters + schema: + $ref: '#/components/schemas/BadRequestResponse' + description: Bad Request - Invalid request parameters or malformed input + '401': + content: + application/json: + example: + error: + code: 401 + message: Missing Authentication header + schema: + $ref: '#/components/schemas/UnauthorizedResponse' + description: Unauthorized - Authentication required or invalid credentials + '402': + content: + application/json: + example: + error: + code: 402 + message: Insufficient credits. Add more using https://openrouter.ai/credits + schema: + $ref: '#/components/schemas/PaymentRequiredResponse' + description: Payment Required - Insufficient credits or quota to complete request + '404': + content: + application/json: + example: + error: + code: 404 + message: Resource not found + schema: + $ref: '#/components/schemas/NotFoundResponse' + description: Not Found - Resource does not exist + '429': + content: + application/json: + example: + error: + code: 429 + message: Rate limit exceeded + schema: + $ref: '#/components/schemas/TooManyRequestsResponse' + description: Too Many Requests - Rate limit exceeded + '500': + content: + application/json: + example: + error: + code: 500 + message: Internal Server Error + schema: + $ref: '#/components/schemas/InternalServerResponse' + description: Internal Server Error - Unexpected server error + summary: Submit a video generation request + tags: + - Video Generation + x-speakeasy-name-override: generate + parameters: + - $ref: "#/components/parameters/AppIdentifier" + - $ref: "#/components/parameters/AppDisplayName" + - $ref: "#/components/parameters/AppCategories" + /videos/{jobId}: + get: + description: Returns job status and content URLs when completed + operationId: getVideos + parameters: + - in: path + name: jobId + required: true + schema: + example: job-abc123 + minLength: 1 + type: string + responses: + '200': + content: + application/json: + example: + generation_id: gen-xyz789 + id: job-abc123 + polling_url: /api/v1/videos/job-abc123 + status: complete + unsigned_urls: + - https://storage.example.com/video.mp4 + usage: + cost: 0.5 + schema: + $ref: '#/components/schemas/VideoGenerationResponse' + description: Video generation status + '401': + content: + application/json: + example: + error: + code: 401 + message: Missing Authentication header + schema: + $ref: '#/components/schemas/UnauthorizedResponse' + description: Unauthorized - Authentication required or invalid credentials + '404': + content: + application/json: + example: + error: + code: 404 + message: Resource not found + schema: + $ref: '#/components/schemas/NotFoundResponse' + description: Not Found - Resource does not exist '500': content: application/json: @@ -18799,163 +20998,44 @@ paths: schema: $ref: '#/components/schemas/InternalServerResponse' description: Internal Server Error - Unexpected server error - summary: List all providers + summary: Poll video generation status tags: - - Providers - x-speakeasy-name-override: list + - Video Generation + x-speakeasy-name-override: getGeneration parameters: - $ref: "#/components/parameters/AppIdentifier" - $ref: "#/components/parameters/AppDisplayName" - $ref: "#/components/parameters/AppCategories" - /rerank: - post: - description: Submits a rerank request to the rerank router - operationId: createRerank - requestBody: - content: - application/json: - schema: - description: Rerank request input - example: - documents: - - Paris is the capital of France. - - Berlin is the capital of Germany. - model: cohere/rerank-v3.5 - query: What is the capital of France? - top_n: 3 - properties: - documents: - description: The list of documents to rerank - example: - - Paris is the capital of France. - - Berlin is the capital of Germany. - items: - type: string - type: array - model: - description: The rerank model to use - example: cohere/rerank-v3.5 - type: string - provider: - allOf: - - $ref: '#/components/schemas/ProviderPreferences' - - description: Provider routing preferences for the request. - query: - description: The search query to rerank documents against - example: What is the capital of France? - type: string - top_n: - description: Number of most relevant documents to return - example: 3 - minimum: 1 - type: integer - required: - - model - - query - - documents - type: object - required: true + /videos/{jobId}/content: + get: + description: Streams the generated video content from the upstream provider + operationId: listVideosContent + parameters: + - in: path + name: jobId + required: true + schema: + example: job-abc123 + minLength: 1 + type: string + - in: query + name: index + required: false + schema: + default: 0 + example: 0 + minimum: 0 + nullable: true + type: integer responses: '200': content: - application/json: - schema: - description: Rerank response containing ranked results - example: - id: gen-rerank-1234567890-abc - model: cohere/rerank-v3.5 - results: - - document: - text: Paris is the capital of France. - index: 0 - relevance_score: 0.98 - usage: - search_units: 1 - total_tokens: 150 - properties: - id: - description: Unique identifier for the rerank response (ORID format) - example: gen-rerank-1234567890-abc - type: string - model: - description: The model used for reranking - example: cohere/rerank-v3.5 - type: string - provider: - description: The provider that served the rerank request - example: Cohere - type: string - results: - description: List of rerank results sorted by relevance - example: - - document: - text: Paris is the capital of France. - index: 0 - relevance_score: 0.98 - items: - description: A single rerank result - example: - document: - text: Paris is the capital of France. - index: 0 - relevance_score: 0.98 - properties: - document: - description: The document object containing the original text - properties: - text: - description: The document text - example: Paris is the capital of France. - type: string - required: - - text - type: object - index: - description: Index of the document in the original input list - example: 0 - type: integer - relevance_score: - description: Relevance score of the document to the query - example: 0.98 - format: double - type: number - required: - - index - - relevance_score - - document - type: object - type: array - usage: - description: Usage statistics - example: - search_units: 1 - total_tokens: 150 - properties: - cost: - description: Cost of the request in credits - example: 0.001 - format: double - type: number - search_units: - description: Number of search units consumed (Cohere billing) - example: 1 - type: integer - total_tokens: - description: Total number of tokens used - example: 150 - type: integer - type: object - required: - - model - - results - type: object - text/event-stream: - example: 'data: [DONE]' + application/octet-stream: + example: schema: - description: Not used for rerank - rerank does not support streaming + format: binary type: string - x-speakeasy-sse-sentinel: '[DONE]' - description: Rerank response + description: Video content stream '400': content: application/json: @@ -18976,16 +21056,6 @@ paths: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: Unauthorized - Authentication required or invalid credentials - '402': - content: - application/json: - example: - error: - code: 402 - message: Insufficient credits. Add more using https://openrouter.ai/credits - schema: - $ref: '#/components/schemas/PaymentRequiredResponse' - description: Payment Required - Insufficient credits or quota to complete request '404': content: application/json: @@ -18996,16 +21066,78 @@ paths: schema: $ref: '#/components/schemas/NotFoundResponse' description: Not Found - Resource does not exist - '429': + '500': + content: + application/json: + example: + error: + code: 500 + message: Internal Server Error + schema: + $ref: '#/components/schemas/InternalServerResponse' + description: Internal Server Error - Unexpected server error + '502': + content: + application/json: + example: + error: + code: 502 + message: Provider returned error + schema: + $ref: '#/components/schemas/BadGatewayResponse' + description: Bad Gateway - Provider/upstream API failure + summary: Download generated video content + tags: + - Video Generation + x-speakeasy-name-override: getVideoContent + parameters: + - $ref: "#/components/parameters/AppIdentifier" + - $ref: "#/components/parameters/AppDisplayName" + - $ref: "#/components/parameters/AppCategories" + /videos/models: + get: + description: Returns a list of all available video generation models and their properties + operationId: listVideosModels + responses: + '200': + content: + application/json: + example: + data: + - allowed_passthrough_parameters: [] + canonical_slug: google/veo-3.1 + created: 1700000000 + description: Google video generation model + generate_audio: true + id: google/veo-3.1 + name: Veo 3.1 + pricing_skus: + generate: '0.50' + seed: null + supported_aspect_ratios: + - '16:9' + supported_durations: + - 5 + - 8 + supported_frame_images: + - first_frame + - last_frame + supported_resolutions: + - 720p + supported_sizes: null + schema: + $ref: '#/components/schemas/VideoModelsListResponse' + description: Returns a list of video generation models + '400': content: application/json: example: error: - code: 429 - message: Rate limit exceeded + code: 400 + message: Invalid request parameters schema: - $ref: '#/components/schemas/TooManyRequestsResponse' - description: Too Many Requests - Rate limit exceeded + $ref: '#/components/schemas/BadRequestResponse' + description: Bad Request - Invalid request parameters or malformed input '500': content: application/json: @@ -19016,103 +21148,136 @@ paths: schema: $ref: '#/components/schemas/InternalServerResponse' description: Internal Server Error - Unexpected server error - '502': - content: - application/json: - example: - error: - code: 502 - message: Provider returned error - schema: - $ref: '#/components/schemas/BadGatewayResponse' - description: Bad Gateway - Provider/upstream API failure - '503': + summary: List all video generation models + tags: + - Video Generation + parameters: + - $ref: "#/components/parameters/AppIdentifier" + - $ref: "#/components/parameters/AppDisplayName" + - $ref: "#/components/parameters/AppCategories" + /workspaces: + get: + description: >- + List all workspaces for the authenticated user. [Management key](/docs/guides/overview/auth/management-api-keys) required. + operationId: listWorkspaces + parameters: + - description: Number of records to skip for pagination + in: query + name: offset + required: false + schema: + description: Number of records to skip for pagination + example: 0 + minimum: 0 + nullable: false + type: integer + - description: Maximum number of records to return (max 100) + in: query + name: limit + required: false + schema: + description: Maximum number of records to return (max 100) + example: 50 + maximum: 100 + minimum: 1 + type: integer + responses: + '200': content: application/json: example: - error: - code: 503 - message: Service temporarily unavailable + data: + - created_at: '2025-08-24T10:30:00Z' + created_by: user_abc123 + default_image_model: openai/dall-e-3 + default_provider_sort: price + default_text_model: openai/gpt-4o + description: Production environment workspace + id: 550e8400-e29b-41d4-a716-446655440000 + is_data_discount_logging_enabled: true + is_observability_broadcast_enabled: false + is_observability_io_logging_enabled: false + name: Production + slug: production + updated_at: '2025-08-24T15:45:00Z' + total_count: 1 schema: - $ref: '#/components/schemas/ServiceUnavailableResponse' - description: Service Unavailable - Service temporarily unavailable - '524': + $ref: '#/components/schemas/ListWorkspacesResponse' + description: List of workspaces + '401': content: application/json: example: error: - code: 524 - message: Request timed out. Please try again later. + code: 401 + message: Missing Authentication header schema: - $ref: '#/components/schemas/EdgeNetworkTimeoutResponse' - description: Infrastructure Timeout - Provider request timed out at edge network - '529': + $ref: '#/components/schemas/UnauthorizedResponse' + description: Unauthorized - Authentication required or invalid credentials + '500': content: application/json: example: error: - code: 529 - message: Provider returned error + code: 500 + message: Internal Server Error schema: - $ref: '#/components/schemas/ProviderOverloadedResponse' - description: Provider Overloaded - Provider is temporarily overloaded - summary: Submit a rerank request + $ref: '#/components/schemas/InternalServerResponse' + description: Internal Server Error - Unexpected server error + summary: List workspaces tags: - - Rerank - x-speakeasy-name-override: rerank - parameters: - - $ref: "#/components/parameters/AppIdentifier" - - $ref: "#/components/parameters/AppDisplayName" - - $ref: "#/components/parameters/AppCategories" - /responses: + - Workspaces + x-speakeasy-name-override: list + x-speakeasy-pagination: + inputs: + - in: parameters + name: offset + type: offset + - in: parameters + name: limit + type: limit + outputs: + results: $.data + type: offsetLimit post: - description: Creates a streaming or non-streaming response using OpenResponses API format - operationId: createResponses + description: >- + Create a new workspace for the authenticated user. [Management key](/docs/guides/overview/auth/management-api-keys) required. + operationId: createWorkspace requestBody: content: application/json: example: - input: Tell me a joke - model: openai/gpt-4o + default_image_model: openai/dall-e-3 + default_provider_sort: price + default_text_model: openai/gpt-4o + description: Production environment workspace + name: Production + slug: production schema: - $ref: '#/components/schemas/ResponsesRequest' + $ref: '#/components/schemas/CreateWorkspaceRequest' required: true responses: - '200': + '201': content: application/json: - example: - created_at: 1700000000 - id: resp_abc123 - model: openai/gpt-4o - object: response - output: - - content: - - text: Why did the chicken cross the road? To get to the other side! - type: output_text - role: assistant - type: message - status: completed - usage: - completion_tokens: 20 - prompt_tokens: 10 - total_tokens: 30 - schema: - $ref: '#/components/schemas/OpenResponsesResult' - text/event-stream: example: data: - delta: Hello - type: response.output_text.delta + created_at: '2025-08-24T10:30:00Z' + created_by: user_abc123 + default_image_model: openai/dall-e-3 + default_provider_sort: price + default_text_model: openai/gpt-4o + description: Production environment workspace + id: 550e8400-e29b-41d4-a716-446655440000 + is_data_discount_logging_enabled: true + is_observability_broadcast_enabled: false + is_observability_io_logging_enabled: false + name: Production + slug: production + updated_at: null schema: - properties: - data: - $ref: '#/components/schemas/StreamEvents' - required: - - data - type: object - x-speakeasy-sse-sentinel: '[DONE]' - description: Successful response + $ref: '#/components/schemas/CreateWorkspaceResponse' + description: Workspace created successfully '400': content: application/json: @@ -19133,66 +21298,98 @@ paths: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: Unauthorized - Authentication required or invalid credentials - '402': + '403': content: application/json: example: error: - code: 402 - message: Insufficient credits. Add more using https://openrouter.ai/credits + code: 403 + message: Only management keys can perform this operation schema: - $ref: '#/components/schemas/PaymentRequiredResponse' - description: Payment Required - Insufficient credits or quota to complete request - '404': + $ref: '#/components/schemas/ForbiddenResponse' + description: Forbidden - Authentication successful but insufficient permissions + '500': content: application/json: example: error: - code: 404 - message: Resource not found + code: 500 + message: Internal Server Error schema: - $ref: '#/components/schemas/NotFoundResponse' - description: Not Found - Resource does not exist - '408': + $ref: '#/components/schemas/InternalServerResponse' + description: Internal Server Error - Unexpected server error + summary: Create a workspace + tags: + - Workspaces + x-speakeasy-name-override: create + parameters: + - $ref: "#/components/parameters/AppIdentifier" + - $ref: "#/components/parameters/AppDisplayName" + - $ref: "#/components/parameters/AppCategories" + /workspaces/{id}: + delete: + description: >- + Delete an existing workspace. The default workspace cannot be deleted. Workspaces with active API keys cannot be deleted. [Management key](/docs/guides/overview/auth/management-api-keys) required. + operationId: deleteWorkspace + parameters: + - description: The workspace ID (UUID) or slug + in: path + name: id + required: true + schema: + description: The workspace ID (UUID) or slug + example: production + minLength: 1 + type: string + responses: + '200': + content: + application/json: + example: + deleted: true + schema: + $ref: '#/components/schemas/DeleteWorkspaceResponse' + description: Workspace deleted successfully + '400': content: application/json: example: error: - code: 408 - message: Operation timed out. Please try again later. + code: 400 + message: Invalid request parameters schema: - $ref: '#/components/schemas/RequestTimeoutResponse' - description: Request Timeout - Operation exceeded time limit - '413': + $ref: '#/components/schemas/BadRequestResponse' + description: Bad Request - Invalid request parameters or malformed input + '401': content: application/json: example: error: - code: 413 - message: Request payload too large + code: 401 + message: Missing Authentication header schema: - $ref: '#/components/schemas/PayloadTooLargeResponse' - description: Payload Too Large - Request payload exceeds size limits - '422': + $ref: '#/components/schemas/UnauthorizedResponse' + description: Unauthorized - Authentication required or invalid credentials + '403': content: application/json: example: error: - code: 422 - message: Invalid argument + code: 403 + message: Only management keys can perform this operation schema: - $ref: '#/components/schemas/UnprocessableEntityResponse' - description: Unprocessable Entity - Semantic validation failure - '429': + $ref: '#/components/schemas/ForbiddenResponse' + description: Forbidden - Authentication successful but insufficient permissions + '404': content: application/json: example: error: - code: 429 - message: Rate limit exceeded + code: 404 + message: Resource not found schema: - $ref: '#/components/schemas/TooManyRequestsResponse' - description: Too Many Requests - Rate limit exceeded + $ref: '#/components/schemas/NotFoundResponse' + description: Not Found - Resource does not exist '500': content: application/json: @@ -19203,83 +21400,124 @@ paths: schema: $ref: '#/components/schemas/InternalServerResponse' description: Internal Server Error - Unexpected server error - '502': + summary: Delete a workspace + tags: + - Workspaces + x-speakeasy-name-override: delete + get: + description: Get a single workspace by ID or slug. [Management key](/docs/guides/overview/auth/management-api-keys) required. + operationId: getWorkspace + parameters: + - description: The workspace ID (UUID) or slug + in: path + name: id + required: true + schema: + description: The workspace ID (UUID) or slug + example: production + minLength: 1 + type: string + responses: + '200': content: application/json: example: - error: - code: 502 - message: Provider returned error + data: + created_at: '2025-08-24T10:30:00Z' + created_by: user_abc123 + default_image_model: openai/dall-e-3 + default_provider_sort: price + default_text_model: openai/gpt-4o + description: Production environment workspace + id: 550e8400-e29b-41d4-a716-446655440000 + is_data_discount_logging_enabled: true + is_observability_broadcast_enabled: false + is_observability_io_logging_enabled: false + name: Production + slug: production + updated_at: '2025-08-24T15:45:00Z' schema: - $ref: '#/components/schemas/BadGatewayResponse' - description: Bad Gateway - Provider/upstream API failure - '503': + $ref: '#/components/schemas/GetWorkspaceResponse' + description: Workspace details + '401': content: application/json: example: error: - code: 503 - message: Service temporarily unavailable + code: 401 + message: Missing Authentication header schema: - $ref: '#/components/schemas/ServiceUnavailableResponse' - description: Service Unavailable - Service temporarily unavailable - '524': + $ref: '#/components/schemas/UnauthorizedResponse' + description: Unauthorized - Authentication required or invalid credentials + '404': content: application/json: example: error: - code: 524 - message: Request timed out. Please try again later. + code: 404 + message: Resource not found schema: - $ref: '#/components/schemas/EdgeNetworkTimeoutResponse' - description: Infrastructure Timeout - Provider request timed out at edge network - '529': + $ref: '#/components/schemas/NotFoundResponse' + description: Not Found - Resource does not exist + '500': content: application/json: example: error: - code: 529 - message: Provider returned error + code: 500 + message: Internal Server Error schema: - $ref: '#/components/schemas/ProviderOverloadedResponse' - description: Provider Overloaded - Provider is temporarily overloaded - summary: Create a response + $ref: '#/components/schemas/InternalServerResponse' + description: Internal Server Error - Unexpected server error + summary: Get a workspace tags: - - beta.responses - x-speakeasy-name-override: send - x-speakeasy-stream-request-field: stream - parameters: - - $ref: "#/components/parameters/AppIdentifier" - - $ref: "#/components/parameters/AppDisplayName" - - $ref: "#/components/parameters/AppCategories" - /videos: - post: - description: Submits a video generation request and returns a polling URL to check status - operationId: createVideos + - Workspaces + x-speakeasy-name-override: get + patch: + description: >- + Update an existing workspace by ID or slug. [Management key](/docs/guides/overview/auth/management-api-keys) required. + operationId: updateWorkspace + parameters: + - description: The workspace ID (UUID) or slug + in: path + name: id + required: true + schema: + description: The workspace ID (UUID) or slug + example: production + minLength: 1 + type: string requestBody: content: application/json: example: - aspect_ratio: '16:9' - duration: 8 - model: google/veo-3.1 - prompt: A serene mountain landscape at sunset - resolution: 720p + name: Updated Workspace + slug: updated-workspace schema: - $ref: '#/components/schemas/VideoGenerationRequest' + $ref: '#/components/schemas/UpdateWorkspaceRequest' required: true responses: - '202': + '200': content: application/json: example: - generation_id: gen-xyz789 - id: job-abc123 - polling_url: /api/v1/videos/job-abc123 - status: pending + data: + created_at: '2025-08-24T10:30:00Z' + created_by: user_abc123 + default_image_model: openai/dall-e-3 + default_provider_sort: price + default_text_model: openai/gpt-4o + description: Production environment workspace + id: 550e8400-e29b-41d4-a716-446655440000 + is_data_discount_logging_enabled: true + is_observability_broadcast_enabled: false + is_observability_io_logging_enabled: false + name: Updated Workspace + slug: updated-workspace + updated_at: '2025-08-25T10:00:00Z' schema: - $ref: '#/components/schemas/VideoGenerationResponse' - description: Video generation request accepted + $ref: '#/components/schemas/UpdateWorkspaceResponse' + description: Workspace updated successfully '400': content: application/json: @@ -19300,16 +21538,16 @@ paths: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: Unauthorized - Authentication required or invalid credentials - '402': + '403': content: application/json: example: error: - code: 402 - message: Insufficient credits. Add more using https://openrouter.ai/credits + code: 403 + message: Only management keys can perform this operation schema: - $ref: '#/components/schemas/PaymentRequiredResponse' - description: Payment Required - Insufficient credits or quota to complete request + $ref: '#/components/schemas/ForbiddenResponse' + description: Forbidden - Authentication successful but insufficient permissions '404': content: application/json: @@ -19320,16 +21558,6 @@ paths: schema: $ref: '#/components/schemas/NotFoundResponse' description: Not Found - Resource does not exist - '429': - content: - application/json: - example: - error: - code: 429 - message: Rate limit exceeded - schema: - $ref: '#/components/schemas/TooManyRequestsResponse' - description: Too Many Requests - Rate limit exceeded '500': content: application/json: @@ -19340,42 +21568,64 @@ paths: schema: $ref: '#/components/schemas/InternalServerResponse' description: Internal Server Error - Unexpected server error - summary: Submit a video generation request + summary: Update a workspace tags: - - Video Generation - x-speakeasy-name-override: generate + - Workspaces + x-speakeasy-name-override: update parameters: - $ref: "#/components/parameters/AppIdentifier" - $ref: "#/components/parameters/AppDisplayName" - $ref: "#/components/parameters/AppCategories" - /videos/{jobId}: - get: - description: Returns job status and content URLs when completed - operationId: getVideos + /workspaces/{id}/members/add: + post: + description: >- + Add multiple organization members to a workspace. Members are assigned the same role they hold in the organization. [Management key](/docs/guides/overview/auth/management-api-keys) required. + operationId: bulkAddWorkspaceMembers parameters: - - in: path - name: jobId + - description: The workspace ID (UUID) or slug + in: path + name: id required: true schema: - example: job-abc123 + description: The workspace ID (UUID) or slug + example: production minLength: 1 type: string + requestBody: + content: + application/json: + example: + user_ids: + - user_abc123 + - user_def456 + schema: + $ref: '#/components/schemas/BulkAddWorkspaceMembersRequest' + required: true responses: '200': content: application/json: example: - generation_id: gen-xyz789 - id: job-abc123 - polling_url: /api/v1/videos/job-abc123 - status: complete - unsigned_urls: - - https://storage.example.com/video.mp4 - usage: - cost: 0.5 + added_count: 1 + data: + - created_at: '2025-08-24T10:30:00Z' + id: 660e8400-e29b-41d4-a716-446655440000 + role: member + user_id: user_abc123 + workspace_id: 550e8400-e29b-41d4-a716-446655440000 schema: - $ref: '#/components/schemas/VideoGenerationResponse' - description: Video generation status + $ref: '#/components/schemas/BulkAddWorkspaceMembersResponse' + description: Members added successfully + '400': + content: + application/json: + example: + error: + code: 400 + message: Invalid request parameters + schema: + $ref: '#/components/schemas/BadRequestResponse' + description: Bad Request - Invalid request parameters or malformed input '401': content: application/json: @@ -19386,6 +21636,16 @@ paths: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: Unauthorized - Authentication required or invalid credentials + '403': + content: + application/json: + example: + error: + code: 403 + message: Only management keys can perform this operation + schema: + $ref: '#/components/schemas/ForbiddenResponse' + description: Forbidden - Authentication successful but insufficient permissions '404': content: application/json: @@ -19406,44 +21666,48 @@ paths: schema: $ref: '#/components/schemas/InternalServerResponse' description: Internal Server Error - Unexpected server error - summary: Poll video generation status + summary: Bulk add members to a workspace tags: - - Video Generation - x-speakeasy-name-override: getGeneration + - Workspaces + x-speakeasy-name-override: bulkAddMembers parameters: - $ref: "#/components/parameters/AppIdentifier" - $ref: "#/components/parameters/AppDisplayName" - $ref: "#/components/parameters/AppCategories" - /videos/{jobId}/content: - get: - description: Streams the generated video content from the upstream provider - operationId: listVideosContent + /workspaces/{id}/members/remove: + post: + description: >- + Remove multiple members from a workspace. Members with active API keys in the workspace cannot be removed. [Management key](/docs/guides/overview/auth/management-api-keys) required. + operationId: bulkRemoveWorkspaceMembers parameters: - - in: path - name: jobId + - description: The workspace ID (UUID) or slug + in: path + name: id required: true schema: - example: job-abc123 + description: The workspace ID (UUID) or slug + example: production minLength: 1 type: string - - in: query - name: index - required: false - schema: - default: 0 - example: 0 - minimum: 0 - nullable: true - type: integer + requestBody: + content: + application/json: + example: + user_ids: + - user_abc123 + - user_def456 + schema: + $ref: '#/components/schemas/BulkRemoveWorkspaceMembersRequest' + required: true responses: '200': content: - application/octet-stream: - example: + application/json: + example: + removed_count: 2 schema: - format: binary - type: string - description: Video content stream + $ref: '#/components/schemas/BulkRemoveWorkspaceMembersResponse' + description: Members removed successfully '400': content: application/json: @@ -19464,88 +21728,26 @@ paths: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: Unauthorized - Authentication required or invalid credentials - '404': - content: - application/json: - example: - error: - code: 404 - message: Resource not found - schema: - $ref: '#/components/schemas/NotFoundResponse' - description: Not Found - Resource does not exist - '500': - content: - application/json: - example: - error: - code: 500 - message: Internal Server Error - schema: - $ref: '#/components/schemas/InternalServerResponse' - description: Internal Server Error - Unexpected server error - '502': + '403': content: application/json: example: error: - code: 502 - message: Provider returned error - schema: - $ref: '#/components/schemas/BadGatewayResponse' - description: Bad Gateway - Provider/upstream API failure - summary: Download generated video content - tags: - - Video Generation - x-speakeasy-name-override: getVideoContent - parameters: - - $ref: "#/components/parameters/AppIdentifier" - - $ref: "#/components/parameters/AppDisplayName" - - $ref: "#/components/parameters/AppCategories" - /videos/models: - get: - description: Returns a list of all available video generation models and their properties - operationId: listVideosModels - responses: - '200': - content: - application/json: - example: - data: - - allowed_passthrough_parameters: [] - canonical_slug: google/veo-3.1 - created: 1700000000 - description: Google video generation model - generate_audio: true - id: google/veo-3.1 - name: Veo 3.1 - pricing_skus: - generate: '0.50' - seed: null - supported_aspect_ratios: - - '16:9' - supported_durations: - - 5 - - 8 - supported_frame_images: - - first_frame - - last_frame - supported_resolutions: - - 720p - supported_sizes: null + code: 403 + message: Only management keys can perform this operation schema: - $ref: '#/components/schemas/VideoModelsListResponse' - description: Returns a list of video generation models - '400': + $ref: '#/components/schemas/ForbiddenResponse' + description: Forbidden - Authentication successful but insufficient permissions + '404': content: application/json: example: error: - code: 400 - message: Invalid request parameters + code: 404 + message: Resource not found schema: - $ref: '#/components/schemas/BadRequestResponse' - description: Bad Request - Invalid request parameters or malformed input + $ref: '#/components/schemas/NotFoundResponse' + description: Not Found - Resource does not exist '500': content: application/json: @@ -19556,9 +21758,10 @@ paths: schema: $ref: '#/components/schemas/InternalServerResponse' description: Internal Server Error - Unexpected server error - summary: List all video generation models + summary: Bulk remove members from a workspace tags: - - Video Generation + - Workspaces + x-speakeasy-name-override: bulkRemoveMembers parameters: - $ref: "#/components/parameters/AppIdentifier" - $ref: "#/components/parameters/AppDisplayName" @@ -19598,8 +21801,12 @@ tags: name: Providers - description: Rerank endpoints name: Rerank + - description: Text-to-speech endpoints + name: TTS - description: Video Generation endpoints name: Video Generation + - description: Workspaces endpoints + name: Workspaces - description: beta.responses endpoints name: beta.responses x-fern-base-path: / diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index d4e0269..514f541 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -2,19 +2,20 @@ speakeasyVersion: 1.680.0 sources: OpenRouter API: sourceNamespace: open-router-chat-completions-api - sourceRevisionDigest: sha256:3982892b2b8f82bfc2a26a0f6fcc9512b665a1051dc240a9cfa29001b9453aa9 - sourceBlobDigest: sha256:727d3c1f7d36ffbf94c57b565536d8a16804eaef4c4043dd6c98152fc1629c8f + sourceRevisionDigest: sha256:2da90a06974496f07ec369592d037f3108498d4ab5bffbeb610e831a555ed9b1 + sourceBlobDigest: sha256:12a86810e64653ebd06c95db7869995aa0f1c23b5cd826b13de6378d261acc7a tags: - latest + - speakeasy-sdk-regen-1776818276 - 1.0.0 targets: open-router: source: OpenRouter API sourceNamespace: open-router-chat-completions-api - sourceRevisionDigest: sha256:3982892b2b8f82bfc2a26a0f6fcc9512b665a1051dc240a9cfa29001b9453aa9 - sourceBlobDigest: sha256:727d3c1f7d36ffbf94c57b565536d8a16804eaef4c4043dd6c98152fc1629c8f + sourceRevisionDigest: sha256:2da90a06974496f07ec369592d037f3108498d4ab5bffbeb610e831a555ed9b1 + sourceBlobDigest: sha256:12a86810e64653ebd06c95db7869995aa0f1c23b5cd826b13de6378d261acc7a codeSamplesNamespace: open-router-python-code-samples - codeSamplesRevisionDigest: sha256:db86aed74d199f265e2e20442ef652dac0911c8a657ccb3e6614d56a26b8b44e + codeSamplesRevisionDigest: sha256:4cc90ab7ce3eb74ec18f21ddc12886b4c137334df85447f2ff122a0da109c0ce workflow: workflowVersion: 1.0.0 speakeasyVersion: 1.680.0 diff --git a/README-PYPI.md b/README-PYPI.md index 5f7e784..35f11f1 100644 --- a/README-PYPI.md +++ b/README-PYPI.md @@ -169,6 +169,36 @@ asyncio.run(main()) + +## Pagination + +Some of the endpoints in this SDK support pagination. To use pagination, you make your SDK calls as usual, but the +returned response object will have a `Next` method that can be called to pull down the next group of results. If the +return value of `Next` is `None`, then there are no more pages to be fetched. + +Here's an example of one such pagination call: +```python +from openrouter import OpenRouter +import os + + +with OpenRouter( + http_referer="", + x_open_router_title="", + x_open_router_categories="", + api_key=os.getenv("OPENROUTER_API_KEY", ""), +) as open_router: + + res = open_router.guardrails.list() + + while res is not None: + # Handle items + + res = res.next() + +``` + + ## Resource Management diff --git a/RELEASES.md b/RELEASES.md index 0d0d01f..a46ff96 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -8,4 +8,14 @@ Based on: ### Generated - [python v0.0.16] . ### Releases -- [PyPI v0.0.16] https://pypi.org/project/openrouter/0.0.16 - . \ No newline at end of file +- [PyPI v0.0.16] https://pypi.org/project/openrouter/0.0.16 - . + +## 2026-04-23 00:41:29 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.680.0 (2.788.4) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v0.9.2] . +### Releases +- [PyPI v0.9.2] https://pypi.org/project/openrouter/0.9.2 - . \ No newline at end of file diff --git a/docs/components/data.md b/docs/components/data.md deleted file mode 100644 index 386321b..0000000 --- a/docs/components/data.md +++ /dev/null @@ -1,10 +0,0 @@ -# Data - -Model count data - - -## Fields - -| Field | Type | Required | Description | Example | -| -------------------------------- | -------------------------------- | -------------------------------- | -------------------------------- | -------------------------------- | -| `count` | *int* | :heavy_check_mark: | Total number of available models | 150 | \ No newline at end of file diff --git a/docs/components/modelscountresponse.md b/docs/components/modelscountresponse.md index 84bbce8..4ad6e6a 100644 --- a/docs/components/modelscountresponse.md +++ b/docs/components/modelscountresponse.md @@ -5,6 +5,6 @@ Model count data ## Fields -| Field | Type | Required | Description | Example | -| ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | -| `data` | [components.Data](../components/data.md) | :heavy_check_mark: | Model count data | {
"count": 150
} | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | +| `data` | [components.ModelsCountResponseData](../components/modelscountresponsedata.md) | :heavy_check_mark: | Model count data | {
"count": 150
} | \ No newline at end of file diff --git a/docs/components/outputmodality.md b/docs/components/outputmodality.md index 7b8edcf..1644bda 100644 --- a/docs/components/outputmodality.md +++ b/docs/components/outputmodality.md @@ -10,4 +10,5 @@ | `EMBEDDINGS` | embeddings | | `AUDIO` | audio | | `VIDEO` | video | -| `RERANK` | rerank | \ No newline at end of file +| `RERANK` | rerank | +| `TTS` | tts | \ No newline at end of file diff --git a/docs/components/providername.md b/docs/components/providername.md index 22effdd..1136a77 100644 --- a/docs/components/providername.md +++ b/docs/components/providername.md @@ -10,6 +10,7 @@ | `AION_LABS` | AionLabs | | `ALIBABA` | Alibaba | | `AMBIENT` | Ambient | +| `BAIDU` | Baidu | | `AMAZON_BEDROCK` | Amazon Bedrock | | `AMAZON_NOVA` | Amazon Nova | | `ANTHROPIC` | Anthropic | diff --git a/docs/operations/apitype.md b/docs/operations/apitype.md deleted file mode 100644 index ffff0b9..0000000 --- a/docs/operations/apitype.md +++ /dev/null @@ -1,13 +0,0 @@ -# APIType - -Type of API used for the generation - - -## Values - -| Name | Value | -| ------------- | ------------- | -| `COMPLETIONS` | completions | -| `EMBEDDINGS` | embeddings | -| `RERANK` | rerank | -| `VIDEO` | video | \ No newline at end of file diff --git a/docs/operations/createkeysdata.md b/docs/operations/createkeysdata.md index f51f201..e60eaf9 100644 --- a/docs/operations/createkeysdata.md +++ b/docs/operations/createkeysdata.md @@ -26,4 +26,5 @@ The created API key information | `usage` | *float* | :heavy_check_mark: | Total OpenRouter credit usage (in USD) for the API key | 25.5 | | `usage_daily` | *float* | :heavy_check_mark: | OpenRouter credit usage (in USD) for the current UTC day | 25.5 | | `usage_monthly` | *float* | :heavy_check_mark: | OpenRouter credit usage (in USD) for the current UTC month | 25.5 | -| `usage_weekly` | *float* | :heavy_check_mark: | OpenRouter credit usage (in USD) for the current UTC week (Monday-Sunday) | 25.5 | \ No newline at end of file +| `usage_weekly` | *float* | :heavy_check_mark: | OpenRouter credit usage (in USD) for the current UTC week (Monday-Sunday) | 25.5 | +| `workspace_id` | *str* | :heavy_check_mark: | The workspace ID this API key belongs to. | 0df9e665-d932-5740-b2c7-b52af166bc11 | \ No newline at end of file diff --git a/docs/operations/createkeysrequestbody.md b/docs/operations/createkeysrequestbody.md index a384fab..e63e997 100644 --- a/docs/operations/createkeysrequestbody.md +++ b/docs/operations/createkeysrequestbody.md @@ -10,4 +10,5 @@ | `include_byok_in_limit` | *Optional[bool]* | :heavy_minus_sign: | Whether to include BYOK usage in the limit | true | | `limit` | *OptionalNullable[float]* | :heavy_minus_sign: | Optional spending limit for the API key in USD | 50 | | `limit_reset` | [OptionalNullable[operations.CreateKeysLimitReset]](../operations/createkeyslimitreset.md) | :heavy_minus_sign: | Type of limit reset for the API key (daily, weekly, monthly, or null for no reset). Resets happen automatically at midnight UTC, and weeks are Monday through Sunday. | monthly | -| `name` | *str* | :heavy_check_mark: | Name for the new API key | My New API Key | \ No newline at end of file +| `name` | *str* | :heavy_check_mark: | Name for the new API key | My New API Key | +| `workspace_id` | *Optional[str]* | :heavy_minus_sign: | The workspace to create the API key in. Defaults to the default workspace if not provided. | 0df9e665-d932-5740-b2c7-b52af166bc11 | \ No newline at end of file diff --git a/docs/operations/createkeysresponse.md b/docs/operations/createkeysresponse.md index e749075..91744f3 100644 --- a/docs/operations/createkeysresponse.md +++ b/docs/operations/createkeysresponse.md @@ -5,7 +5,7 @@ API key created successfully ## Fields -| Field | Type | Required | Description | Example | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `data` | [operations.CreateKeysData](../operations/createkeysdata.md) | :heavy_check_mark: | The created API key information | {
"byok_usage": 17.38,
"byok_usage_daily": 17.38,
"byok_usage_monthly": 17.38,
"byok_usage_weekly": 17.38,
"created_at": "2025-08-24T10:30:00Z",
"creator_user_id": "user_2dHFtVWx2n56w6HkM0000000000",
"disabled": false,
"expires_at": "2027-12-31T23:59:59Z",
"hash": "f01d52606dc8f0a8303a7b5cc3fa07109c2e346cec7c0a16b40de462992ce943",
"include_byok_in_limit": false,
"label": "sk-or-v1-0e6...1c96",
"limit": 100,
"limit_remaining": 74.5,
"limit_reset": "monthly",
"name": "My Production Key",
"updated_at": "2025-08-24T15:45:00Z",
"usage": 25.5,
"usage_daily": 25.5,
"usage_monthly": 25.5,
"usage_weekly": 25.5
} | -| `key` | *str* | :heavy_check_mark: | The actual API key string (only shown once) | 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 | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `data` | [operations.CreateKeysData](../operations/createkeysdata.md) | :heavy_check_mark: | The created API key information | {
"byok_usage": 17.38,
"byok_usage_daily": 17.38,
"byok_usage_monthly": 17.38,
"byok_usage_weekly": 17.38,
"created_at": "2025-08-24T10:30:00Z",
"creator_user_id": "user_2dHFtVWx2n56w6HkM0000000000",
"disabled": false,
"expires_at": "2027-12-31T23:59:59Z",
"hash": "f01d52606dc8f0a8303a7b5cc3fa07109c2e346cec7c0a16b40de462992ce943",
"include_byok_in_limit": false,
"label": "sk-or-v1-0e6...1c96",
"limit": 100,
"limit_remaining": 74.5,
"limit_reset": "monthly",
"name": "My Production Key",
"updated_at": "2025-08-24T15:45:00Z",
"usage": 25.5,
"usage_daily": 25.5,
"usage_monthly": 25.5,
"usage_weekly": 25.5,
"workspace_id": "0df9e665-d932-5740-b2c7-b52af166bc11"
} | +| `key` | *str* | :heavy_check_mark: | The actual API key string (only shown once) | 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 | \ No newline at end of file diff --git a/docs/operations/getgenerationdata.md b/docs/operations/getgenerationdata.md deleted file mode 100644 index 7be5766..0000000 --- a/docs/operations/getgenerationdata.md +++ /dev/null @@ -1,47 +0,0 @@ -# GetGenerationData - -Generation data - - -## Fields - -| Field | Type | Required | Description | Example | -| --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | -| `api_type` | [Nullable[operations.APIType]](../operations/apitype.md) | :heavy_check_mark: | Type of API used for the generation | | -| `app_id` | *Nullable[int]* | :heavy_check_mark: | ID of the app that made the request | 12345 | -| `cache_discount` | *Nullable[float]* | :heavy_check_mark: | Discount applied due to caching | 0.0002 | -| `cancelled` | *Nullable[bool]* | :heavy_check_mark: | Whether the generation was cancelled | false | -| `created_at` | *str* | :heavy_check_mark: | ISO 8601 timestamp of when the generation was created | 2024-07-15T23:33:19.433273+00:00 | -| `external_user` | *Nullable[str]* | :heavy_check_mark: | External user identifier | user-123 | -| `finish_reason` | *Nullable[str]* | :heavy_check_mark: | Reason the generation finished | stop | -| `generation_time` | *Nullable[float]* | :heavy_check_mark: | Time taken for generation in milliseconds | 1200 | -| `http_referer` | *Nullable[str]* | :heavy_check_mark: | Referer header from the request | | -| `id` | *str* | :heavy_check_mark: | Unique identifier for the generation | gen-3bhGkxlo4XFrqiabUM7NDtwDzWwG | -| `is_byok` | *bool* | :heavy_check_mark: | Whether this used bring-your-own-key | false | -| `latency` | *Nullable[float]* | :heavy_check_mark: | Total latency in milliseconds | 1250 | -| `model` | *str* | :heavy_check_mark: | Model used for the generation | sao10k/l3-stheno-8b | -| `moderation_latency` | *Nullable[float]* | :heavy_check_mark: | Moderation latency in milliseconds | 50 | -| `native_finish_reason` | *Nullable[str]* | :heavy_check_mark: | Native finish reason as reported by provider | stop | -| `native_tokens_cached` | *Nullable[int]* | :heavy_check_mark: | Native cached tokens as reported by provider | 3 | -| `native_tokens_completion` | *Nullable[int]* | :heavy_check_mark: | Native completion tokens as reported by provider | 25 | -| `native_tokens_completion_images` | *Nullable[int]* | :heavy_check_mark: | Native completion image tokens as reported by provider | 0 | -| `native_tokens_prompt` | *Nullable[int]* | :heavy_check_mark: | Native prompt tokens as reported by provider | 10 | -| `native_tokens_reasoning` | *Nullable[int]* | :heavy_check_mark: | Native reasoning tokens as reported by provider | 5 | -| `num_input_audio_prompt` | *Nullable[int]* | :heavy_check_mark: | Number of audio inputs in the prompt | 0 | -| `num_media_completion` | *Nullable[int]* | :heavy_check_mark: | Number of media items in the completion | 0 | -| `num_media_prompt` | *Nullable[int]* | :heavy_check_mark: | Number of media items in the prompt | 1 | -| `num_search_results` | *Nullable[int]* | :heavy_check_mark: | Number of search results included | 5 | -| `origin` | *str* | :heavy_check_mark: | Origin URL of the request | https://openrouter.ai/ | -| `provider_name` | *Nullable[str]* | :heavy_check_mark: | Name of the provider that served the request | Infermatic | -| `provider_responses` | List[[components.ProviderResponse](../components/providerresponse.md)] | :heavy_check_mark: | List of provider responses for this generation, including fallback attempts | | -| `request_id` | *OptionalNullable[str]* | :heavy_minus_sign: | Unique identifier grouping all generations from a single API request | req-1727282430-aBcDeFgHiJkLmNoPqRsT | -| `router` | *Nullable[str]* | :heavy_check_mark: | Router used for the request (e.g., openrouter/auto) | openrouter/auto | -| `session_id` | *OptionalNullable[str]* | :heavy_minus_sign: | Session identifier grouping multiple generations in the same session | | -| `streamed` | *Nullable[bool]* | :heavy_check_mark: | Whether the response was streamed | true | -| `tokens_completion` | *Nullable[int]* | :heavy_check_mark: | Number of tokens in the completion | 25 | -| `tokens_prompt` | *Nullable[int]* | :heavy_check_mark: | Number of tokens in the prompt | 10 | -| `total_cost` | *float* | :heavy_check_mark: | Total cost of the generation in USD | 0.0015 | -| `upstream_id` | *Nullable[str]* | :heavy_check_mark: | Upstream provider's identifier for this generation | chatcmpl-791bcf62-080e-4568-87d0-94c72e3b4946 | -| `upstream_inference_cost` | *Nullable[float]* | :heavy_check_mark: | Cost charged by the upstream provider | 0.0012 | -| `usage` | *float* | :heavy_check_mark: | Usage amount in USD | 0.0015 | -| `user_agent` | *Nullable[str]* | :heavy_check_mark: | User-Agent header from the request | | \ No newline at end of file diff --git a/docs/operations/getgenerationresponse.md b/docs/operations/getgenerationresponse.md deleted file mode 100644 index 989c19a..0000000 --- a/docs/operations/getgenerationresponse.md +++ /dev/null @@ -1,10 +0,0 @@ -# GetGenerationResponse - -Generation response - - -## Fields - -| Field | Type | Required | Description | -| ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | -| `data` | [operations.GetGenerationData](../operations/getgenerationdata.md) | :heavy_check_mark: | Generation data | \ No newline at end of file diff --git a/docs/operations/getkeydata.md b/docs/operations/getkeydata.md index 5ba4a1f..c5a3db6 100644 --- a/docs/operations/getkeydata.md +++ b/docs/operations/getkeydata.md @@ -26,4 +26,5 @@ The API key information | `usage` | *float* | :heavy_check_mark: | Total OpenRouter credit usage (in USD) for the API key | 25.5 | | `usage_daily` | *float* | :heavy_check_mark: | OpenRouter credit usage (in USD) for the current UTC day | 25.5 | | `usage_monthly` | *float* | :heavy_check_mark: | OpenRouter credit usage (in USD) for the current UTC month | 25.5 | -| `usage_weekly` | *float* | :heavy_check_mark: | OpenRouter credit usage (in USD) for the current UTC week (Monday-Sunday) | 25.5 | \ No newline at end of file +| `usage_weekly` | *float* | :heavy_check_mark: | OpenRouter credit usage (in USD) for the current UTC week (Monday-Sunday) | 25.5 | +| `workspace_id` | *str* | :heavy_check_mark: | The workspace ID this API key belongs to. | 0df9e665-d932-5740-b2c7-b52af166bc11 | \ No newline at end of file diff --git a/docs/operations/getkeyresponse.md b/docs/operations/getkeyresponse.md index 7959a40..72e8055 100644 --- a/docs/operations/getkeyresponse.md +++ b/docs/operations/getkeyresponse.md @@ -5,6 +5,6 @@ API key details ## Fields -| Field | Type | Required | Description | Example | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `data` | [operations.GetKeyData](../operations/getkeydata.md) | :heavy_check_mark: | The API key information | {
"byok_usage": 17.38,
"byok_usage_daily": 17.38,
"byok_usage_monthly": 17.38,
"byok_usage_weekly": 17.38,
"created_at": "2025-08-24T10:30:00Z",
"creator_user_id": "user_2dHFtVWx2n56w6HkM0000000000",
"disabled": false,
"expires_at": "2027-12-31T23:59:59Z",
"hash": "f01d52606dc8f0a8303a7b5cc3fa07109c2e346cec7c0a16b40de462992ce943",
"include_byok_in_limit": false,
"label": "sk-or-v1-0e6...1c96",
"limit": 100,
"limit_remaining": 74.5,
"limit_reset": "monthly",
"name": "My Production Key",
"updated_at": "2025-08-24T15:45:00Z",
"usage": 25.5,
"usage_daily": 25.5,
"usage_monthly": 25.5,
"usage_weekly": 25.5
} | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `data` | [operations.GetKeyData](../operations/getkeydata.md) | :heavy_check_mark: | The API key information | {
"byok_usage": 17.38,
"byok_usage_daily": 17.38,
"byok_usage_monthly": 17.38,
"byok_usage_weekly": 17.38,
"created_at": "2025-08-24T10:30:00Z",
"creator_user_id": "user_2dHFtVWx2n56w6HkM0000000000",
"disabled": false,
"expires_at": "2027-12-31T23:59:59Z",
"hash": "f01d52606dc8f0a8303a7b5cc3fa07109c2e346cec7c0a16b40de462992ce943",
"include_byok_in_limit": false,
"label": "sk-or-v1-0e6...1c96",
"limit": 100,
"limit_remaining": 74.5,
"limit_reset": "monthly",
"name": "My Production Key",
"updated_at": "2025-08-24T15:45:00Z",
"usage": 25.5,
"usage_daily": 25.5,
"usage_monthly": 25.5,
"usage_weekly": 25.5,
"workspace_id": "0df9e665-d932-5740-b2c7-b52af166bc11"
} | \ No newline at end of file diff --git a/docs/operations/listdata.md b/docs/operations/listdata.md index d8fcbe3..d2a0b36 100644 --- a/docs/operations/listdata.md +++ b/docs/operations/listdata.md @@ -24,4 +24,5 @@ | `usage` | *float* | :heavy_check_mark: | Total OpenRouter credit usage (in USD) for the API key | 25.5 | | `usage_daily` | *float* | :heavy_check_mark: | OpenRouter credit usage (in USD) for the current UTC day | 25.5 | | `usage_monthly` | *float* | :heavy_check_mark: | OpenRouter credit usage (in USD) for the current UTC month | 25.5 | -| `usage_weekly` | *float* | :heavy_check_mark: | OpenRouter credit usage (in USD) for the current UTC week (Monday-Sunday) | 25.5 | \ No newline at end of file +| `usage_weekly` | *float* | :heavy_check_mark: | OpenRouter credit usage (in USD) for the current UTC week (Monday-Sunday) | 25.5 | +| `workspace_id` | *str* | :heavy_check_mark: | The workspace ID this API key belongs to. | 0df9e665-d932-5740-b2c7-b52af166bc11 | \ No newline at end of file diff --git a/docs/operations/listguardrailsrequest.md b/docs/operations/listguardrailsrequest.md index 65946b1..e6f8126 100644 --- a/docs/operations/listguardrailsrequest.md +++ b/docs/operations/listguardrailsrequest.md @@ -9,4 +9,5 @@ | `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
| | | `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
| | | `offset` | *Optional[int]* | :heavy_minus_sign: | Number of records to skip for pagination | 0 | -| `limit` | *Optional[int]* | :heavy_minus_sign: | Maximum number of records to return (max 100) | 50 | \ No newline at end of file +| `limit` | *Optional[int]* | :heavy_minus_sign: | Maximum number of records to return (max 100) | 50 | +| `workspace_id` | *Optional[str]* | :heavy_minus_sign: | Filter guardrails by workspace ID. By default, guardrails in the default workspace are returned. | 0df9e665-d932-5740-b2c7-b52af166bc11 | \ No newline at end of file diff --git a/docs/operations/listguardrailsresponse.md b/docs/operations/listguardrailsresponse.md index 3046aeb..1bb2d53 100644 --- a/docs/operations/listguardrailsresponse.md +++ b/docs/operations/listguardrailsresponse.md @@ -3,6 +3,6 @@ ## Fields -| Field | Type | Required | Description | Example | -| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `result` | [components.ListGuardrailsResponse](../components/listguardrailsresponse.md) | :heavy_check_mark: | N/A | {
"data": [
{
"allowed_models": null,
"allowed_providers": [
"openai",
"anthropic",
"google"
],
"created_at": "2025-08-24T10:30:00Z",
"description": "Guardrail for production environment",
"enforce_zdr": false,
"id": "550e8400-e29b-41d4-a716-446655440000",
"ignored_models": null,
"ignored_providers": null,
"limit_usd": 100,
"name": "Production Guardrail",
"reset_interval": "monthly",
"updated_at": "2025-08-24T15:45:00Z"
}
],
"total_count": 1
} | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `result` | [components.ListGuardrailsResponse](../components/listguardrailsresponse.md) | :heavy_check_mark: | N/A | {
"data": [
{
"allowed_models": null,
"allowed_providers": [
"openai",
"anthropic",
"google"
],
"created_at": "2025-08-24T10:30:00Z",
"description": "Guardrail for production environment",
"enforce_zdr": false,
"id": "550e8400-e29b-41d4-a716-446655440000",
"ignored_models": null,
"ignored_providers": null,
"limit_usd": 100,
"name": "Production Guardrail",
"reset_interval": "monthly",
"updated_at": "2025-08-24T15:45:00Z",
"workspace_id": "0df9e665-d932-5740-b2c7-b52af166bc11"
}
],
"total_count": 1
} | \ No newline at end of file diff --git a/docs/operations/listrequest.md b/docs/operations/listrequest.md index 5507b0a..a5646bd 100644 --- a/docs/operations/listrequest.md +++ b/docs/operations/listrequest.md @@ -9,4 +9,5 @@ | `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
| | | `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
| | | `include_disabled` | *Optional[bool]* | :heavy_minus_sign: | Whether to include disabled API keys in the response | false | -| `offset` | *Optional[int]* | :heavy_minus_sign: | Number of API keys to skip for pagination | 0 | \ No newline at end of file +| `offset` | *Optional[int]* | :heavy_minus_sign: | Number of API keys to skip for pagination | 0 | +| `workspace_id` | *Optional[str]* | :heavy_minus_sign: | Filter API keys by workspace ID. By default, keys in the default workspace are returned. | 0df9e665-d932-5740-b2c7-b52af166bc11 | \ No newline at end of file diff --git a/docs/operations/updatekeysdata.md b/docs/operations/updatekeysdata.md index 499598c..f1ef382 100644 --- a/docs/operations/updatekeysdata.md +++ b/docs/operations/updatekeysdata.md @@ -26,4 +26,5 @@ The updated API key information | `usage` | *float* | :heavy_check_mark: | Total OpenRouter credit usage (in USD) for the API key | 25.5 | | `usage_daily` | *float* | :heavy_check_mark: | OpenRouter credit usage (in USD) for the current UTC day | 25.5 | | `usage_monthly` | *float* | :heavy_check_mark: | OpenRouter credit usage (in USD) for the current UTC month | 25.5 | -| `usage_weekly` | *float* | :heavy_check_mark: | OpenRouter credit usage (in USD) for the current UTC week (Monday-Sunday) | 25.5 | \ No newline at end of file +| `usage_weekly` | *float* | :heavy_check_mark: | OpenRouter credit usage (in USD) for the current UTC week (Monday-Sunday) | 25.5 | +| `workspace_id` | *str* | :heavy_check_mark: | The workspace ID this API key belongs to. | 0df9e665-d932-5740-b2c7-b52af166bc11 | \ No newline at end of file diff --git a/docs/operations/updatekeysresponse.md b/docs/operations/updatekeysresponse.md index c1dde7c..8b5ef1f 100644 --- a/docs/operations/updatekeysresponse.md +++ b/docs/operations/updatekeysresponse.md @@ -5,6 +5,6 @@ API key updated successfully ## Fields -| Field | Type | Required | Description | Example | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `data` | [operations.UpdateKeysData](../operations/updatekeysdata.md) | :heavy_check_mark: | The updated API key information | {
"byok_usage": 17.38,
"byok_usage_daily": 17.38,
"byok_usage_monthly": 17.38,
"byok_usage_weekly": 17.38,
"created_at": "2025-08-24T10:30:00Z",
"creator_user_id": "user_2dHFtVWx2n56w6HkM0000000000",
"disabled": false,
"expires_at": "2027-12-31T23:59:59Z",
"hash": "f01d52606dc8f0a8303a7b5cc3fa07109c2e346cec7c0a16b40de462992ce943",
"include_byok_in_limit": false,
"label": "sk-or-v1-0e6...1c96",
"limit": 100,
"limit_remaining": 74.5,
"limit_reset": "monthly",
"name": "My Production Key",
"updated_at": "2025-08-24T15:45:00Z",
"usage": 25.5,
"usage_daily": 25.5,
"usage_monthly": 25.5,
"usage_weekly": 25.5
} | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `data` | [operations.UpdateKeysData](../operations/updatekeysdata.md) | :heavy_check_mark: | The updated API key information | {
"byok_usage": 17.38,
"byok_usage_daily": 17.38,
"byok_usage_monthly": 17.38,
"byok_usage_weekly": 17.38,
"created_at": "2025-08-24T10:30:00Z",
"creator_user_id": "user_2dHFtVWx2n56w6HkM0000000000",
"disabled": false,
"expires_at": "2027-12-31T23:59:59Z",
"hash": "f01d52606dc8f0a8303a7b5cc3fa07109c2e346cec7c0a16b40de462992ce943",
"include_byok_in_limit": false,
"label": "sk-or-v1-0e6...1c96",
"limit": 100,
"limit_remaining": 74.5,
"limit_reset": "monthly",
"name": "My Production Key",
"updated_at": "2025-08-24T15:45:00Z",
"usage": 25.5,
"usage_daily": 25.5,
"usage_monthly": 25.5,
"usage_weekly": 25.5,
"workspace_id": "0df9e665-d932-5740-b2c7-b52af166bc11"
} | \ No newline at end of file diff --git a/docs/sdks/apikeys/README.md b/docs/sdks/apikeys/README.md index 0e6da85..6e72f51 100644 --- a/docs/sdks/apikeys/README.md +++ b/docs/sdks/apikeys/README.md @@ -95,6 +95,7 @@ with OpenRouter( | `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
| | | `include_disabled` | *Optional[bool]* | :heavy_minus_sign: | Whether to include disabled API keys in the response | false | | `offset` | *Optional[int]* | :heavy_minus_sign: | Number of API keys to skip for pagination | 0 | +| `workspace_id` | *Optional[str]* | :heavy_minus_sign: | Filter API keys by workspace ID. By default, keys in the default workspace are returned. | 0df9e665-d932-5740-b2c7-b52af166bc11 | | `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | | ### Response @@ -150,6 +151,7 @@ with OpenRouter( | `include_byok_in_limit` | *Optional[bool]* | :heavy_minus_sign: | Whether to include BYOK usage in the limit | true | | `limit` | *OptionalNullable[float]* | :heavy_minus_sign: | Optional spending limit for the API key in USD | 50 | | `limit_reset` | [OptionalNullable[operations.CreateKeysLimitReset]](../../operations/createkeyslimitreset.md) | :heavy_minus_sign: | Type of limit reset for the API key (daily, weekly, monthly, or null for no reset). Resets happen automatically at midnight UTC, and weeks are Monday through Sunday. | monthly | +| `workspace_id` | *Optional[str]* | :heavy_minus_sign: | The workspace to create the API key in. Defaults to the default workspace if not provided. | 0df9e665-d932-5740-b2c7-b52af166bc11 | | `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | | ### Response @@ -162,6 +164,7 @@ with OpenRouter( | ----------------------------------- | ----------------------------------- | ----------------------------------- | | errors.BadRequestResponseError | 400 | application/json | | errors.UnauthorizedResponseError | 401 | application/json | +| errors.ForbiddenResponseError | 403 | application/json | | errors.TooManyRequestsResponseError | 429 | application/json | | errors.InternalServerResponseError | 500 | application/json | | errors.OpenRouterDefaultError | 4XX, 5XX | \*/\* | diff --git a/docs/sdks/generations/README.md b/docs/sdks/generations/README.md index 332b568..7fd647d 100644 --- a/docs/sdks/generations/README.md +++ b/docs/sdks/generations/README.md @@ -7,6 +7,7 @@ Generation history endpoints ### Available Operations * [get_generation](#get_generation) - Get request & usage metadata for a generation +* [list_generation_content](#list_generation_content) - Get stored prompt and completion content for a generation ## get_generation @@ -46,7 +47,7 @@ with OpenRouter( ### Response -**[operations.GetGenerationResponse](../../operations/getgenerationresponse.md)** +**[components.GenerationResponse](../../components/generationresponse.md)** ### Errors @@ -60,4 +61,58 @@ with OpenRouter( | errors.BadGatewayResponseError | 502 | application/json | | errors.EdgeNetworkTimeoutResponseError | 524 | application/json | | errors.ProviderOverloadedResponseError | 529 | application/json | +| errors.OpenRouterDefaultError | 4XX, 5XX | \*/\* | + +## list_generation_content + +Get stored prompt and completion content for a generation + +### Example Usage + + +```python +from openrouter import OpenRouter +import os + + +with OpenRouter( + http_referer="", + x_open_router_title="", + x_open_router_categories="", + api_key=os.getenv("OPENROUTER_API_KEY", ""), +) as open_router: + + res = open_router.generations.list_generation_content(id="gen-1234567890") + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | *str* | :heavy_check_mark: | The generation ID | gen-1234567890 | +| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
| | +| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
| | +| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
| | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | | + +### Response + +**[components.GenerationContentResponse](../../components/generationcontentresponse.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| -------------------------------------- | -------------------------------------- | -------------------------------------- | +| errors.UnauthorizedResponseError | 401 | application/json | +| errors.ForbiddenResponseError | 403 | application/json | +| errors.NotFoundResponseError | 404 | application/json | +| errors.TooManyRequestsResponseError | 429 | application/json | +| errors.InternalServerResponseError | 500 | application/json | +| errors.BadGatewayResponseError | 502 | application/json | +| errors.EdgeNetworkTimeoutResponseError | 524 | application/json | +| errors.ProviderOverloadedResponseError | 529 | application/json | | errors.OpenRouterDefaultError | 4XX, 5XX | \*/\* | \ No newline at end of file diff --git a/docs/sdks/guardrails/README.md b/docs/sdks/guardrails/README.md index 7bcdbb6..dfb499d 100644 --- a/docs/sdks/guardrails/README.md +++ b/docs/sdks/guardrails/README.md @@ -57,6 +57,7 @@ with OpenRouter( | `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
| | | `offset` | *Optional[int]* | :heavy_minus_sign: | Number of records to skip for pagination | 0 | | `limit` | *Optional[int]* | :heavy_minus_sign: | Maximum number of records to return (max 100) | 50 | +| `workspace_id` | *Optional[str]* | :heavy_minus_sign: | Filter guardrails by workspace ID. By default, guardrails in the default workspace are returned. | 0df9e665-d932-5740-b2c7-b52af166bc11 | | `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | | ### Response @@ -117,6 +118,7 @@ with OpenRouter( | `ignored_providers` | List[*str*] | :heavy_minus_sign: | List of provider IDs to exclude from routing | [
"azure"
] | | `limit_usd` | *OptionalNullable[float]* | :heavy_minus_sign: | Spending limit in USD | 50 | | `reset_interval` | [OptionalNullable[components.GuardrailInterval]](../../components/guardrailinterval.md) | :heavy_minus_sign: | Interval at which the limit resets (daily, weekly, monthly) | monthly | +| `workspace_id` | *Optional[str]* | :heavy_minus_sign: | The workspace to create the guardrail in. Defaults to the default workspace if not provided. | 0df9e665-d932-5740-b2c7-b52af166bc11 | | `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | | ### Response @@ -129,6 +131,7 @@ with OpenRouter( | ---------------------------------- | ---------------------------------- | ---------------------------------- | | errors.BadRequestResponseError | 400 | application/json | | errors.UnauthorizedResponseError | 401 | application/json | +| errors.ForbiddenResponseError | 403 | application/json | | errors.InternalServerResponseError | 500 | application/json | | errors.OpenRouterDefaultError | 4XX, 5XX | \*/\* | diff --git a/pyproject.toml b/pyproject.toml index c678027..9e4606d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,9 +1,9 @@ [project] name = "openrouter" -version = "0.9.1" +version = "0.9.2" description = "Official Python Client SDK for OpenRouter." authors = [{ name = "OpenRouter" },] -readme = "README.md" +readme = "README-PYPI.md" requires-python = ">=3.9.2" dependencies = [ "httpcore >=1.0.9", @@ -11,6 +11,7 @@ dependencies = [ "jsonpath-python >=1.0.6", "pydantic >=2.11.2", ] +urls.repository = "https://github.com/OpenRouterTeam/python-sdk.git" license = { text = "Apache-2.0" } [dependency-groups] diff --git a/scripts/publish.sh b/scripts/publish.sh index ef28dc1..c35748f 100755 --- a/scripts/publish.sh +++ b/scripts/publish.sh @@ -1,4 +1,6 @@ #!/usr/bin/env bash +uv run python scripts/prepare_readme.py + uv build uv publish --token $PYPI_TOKEN diff --git a/src/openrouter/_version.py b/src/openrouter/_version.py index 4d43d33..fcebde3 100644 --- a/src/openrouter/_version.py +++ b/src/openrouter/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "openrouter" -__version__: str = "0.9.1" +__version__: str = "0.9.2" __openapi_doc_version__: str = "1.0.0" __gen_version__: str = "2.788.4" -__user_agent__: str = "speakeasy-sdk/python 0.9.1 2.788.4 1.0.0 openrouter" +__user_agent__: str = "speakeasy-sdk/python 0.9.2 2.788.4 1.0.0 openrouter" try: if __package__ is not None: diff --git a/src/openrouter/api_keys.py b/src/openrouter/api_keys.py index 923a5f8..e4a30e1 100644 --- a/src/openrouter/api_keys.py +++ b/src/openrouter/api_keys.py @@ -257,6 +257,7 @@ def list( x_open_router_categories: Optional[str] = None, include_disabled: Optional[bool] = None, offset: Optional[int] = None, + workspace_id: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -275,6 +276,7 @@ def list( :param include_disabled: Whether to include disabled API keys in the response :param offset: Number of API keys to skip for pagination + :param workspace_id: Filter API keys by workspace ID. By default, keys in the default workspace are returned. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -296,6 +298,7 @@ def list( x_open_router_categories=x_open_router_categories, include_disabled=include_disabled, offset=offset, + workspace_id=workspace_id, ) req = self._build_request( @@ -386,6 +389,7 @@ async def list_async( x_open_router_categories: Optional[str] = None, include_disabled: Optional[bool] = None, offset: Optional[int] = None, + workspace_id: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -404,6 +408,7 @@ async def list_async( :param include_disabled: Whether to include disabled API keys in the response :param offset: Number of API keys to skip for pagination + :param workspace_id: Filter API keys by workspace ID. By default, keys in the default workspace are returned. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -425,6 +430,7 @@ async def list_async( x_open_router_categories=x_open_router_categories, include_disabled=include_disabled, offset=offset, + workspace_id=workspace_id, ) req = self._build_request_async( @@ -519,6 +525,7 @@ def create( include_byok_in_limit: Optional[bool] = None, limit: OptionalNullable[float] = UNSET, limit_reset: OptionalNullable[operations.CreateKeysLimitReset] = UNSET, + workspace_id: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -541,6 +548,7 @@ def create( :param include_byok_in_limit: Whether to include BYOK usage in the limit :param limit: Optional spending limit for the API key in USD :param limit_reset: Type of limit reset for the API key (daily, weekly, monthly, or null for no reset). Resets happen automatically at midnight UTC, and weeks are Monday through Sunday. + :param workspace_id: The workspace to create the API key in. Defaults to the default workspace if not provided. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -567,6 +575,7 @@ def create( limit=limit, limit_reset=limit_reset, name=name, + workspace_id=workspace_id, ), ) @@ -622,7 +631,7 @@ def create( ), ), request=req, - error_status_codes=["400", "401", "429", "4XX", "500", "5XX"], + error_status_codes=["400", "401", "403", "429", "4XX", "500", "5XX"], retry_config=retry_config, ) @@ -639,6 +648,11 @@ def create( errors.UnauthorizedResponseErrorData, http_res ) raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "403", "application/json"): + response_data = unmarshal_json_response( + errors.ForbiddenResponseErrorData, http_res + ) + raise errors.ForbiddenResponseError(response_data, http_res) if utils.match_response(http_res, "429", "application/json"): response_data = unmarshal_json_response( errors.TooManyRequestsResponseErrorData, http_res @@ -674,6 +688,7 @@ async def create_async( include_byok_in_limit: Optional[bool] = None, limit: OptionalNullable[float] = UNSET, limit_reset: OptionalNullable[operations.CreateKeysLimitReset] = UNSET, + workspace_id: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -696,6 +711,7 @@ async def create_async( :param include_byok_in_limit: Whether to include BYOK usage in the limit :param limit: Optional spending limit for the API key in USD :param limit_reset: Type of limit reset for the API key (daily, weekly, monthly, or null for no reset). Resets happen automatically at midnight UTC, and weeks are Monday through Sunday. + :param workspace_id: The workspace to create the API key in. Defaults to the default workspace if not provided. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -722,6 +738,7 @@ async def create_async( limit=limit, limit_reset=limit_reset, name=name, + workspace_id=workspace_id, ), ) @@ -777,7 +794,7 @@ async def create_async( ), ), request=req, - error_status_codes=["400", "401", "429", "4XX", "500", "5XX"], + error_status_codes=["400", "401", "403", "429", "4XX", "500", "5XX"], retry_config=retry_config, ) @@ -794,6 +811,11 @@ async def create_async( errors.UnauthorizedResponseErrorData, http_res ) raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "403", "application/json"): + response_data = unmarshal_json_response( + errors.ForbiddenResponseErrorData, http_res + ) + raise errors.ForbiddenResponseError(response_data, http_res) if utils.match_response(http_res, "429", "application/json"): response_data = unmarshal_json_response( errors.TooManyRequestsResponseErrorData, http_res diff --git a/src/openrouter/components/__init__.py b/src/openrouter/components/__init__.py index e41de29..3155966 100644 --- a/src/openrouter/components/__init__.py +++ b/src/openrouter/components/__init__.py @@ -61,6 +61,14 @@ BaseInputsUnionTypedDict, ) from .basereasoningconfig import BaseReasoningConfig, BaseReasoningConfigTypedDict + from .bulkaddworkspacemembersrequest import ( + BulkAddWorkspaceMembersRequest, + BulkAddWorkspaceMembersRequestTypedDict, + ) + from .bulkaddworkspacemembersresponse import ( + BulkAddWorkspaceMembersResponse, + BulkAddWorkspaceMembersResponseTypedDict, + ) from .bulkassignkeysrequest import ( BulkAssignKeysRequest, BulkAssignKeysRequestTypedDict, @@ -77,6 +85,14 @@ BulkAssignMembersResponse, BulkAssignMembersResponseTypedDict, ) + from .bulkremoveworkspacemembersrequest import ( + BulkRemoveWorkspaceMembersRequest, + BulkRemoveWorkspaceMembersRequestTypedDict, + ) + from .bulkremoveworkspacemembersresponse import ( + BulkRemoveWorkspaceMembersResponse, + BulkRemoveWorkspaceMembersResponseTypedDict, + ) from .bulkunassignkeysrequest import ( BulkUnassignKeysRequest, BulkUnassignKeysRequestTypedDict, @@ -364,6 +380,14 @@ CreateGuardrailResponse, CreateGuardrailResponseTypedDict, ) + from .createworkspacerequest import ( + CreateWorkspaceRequest, + CreateWorkspaceRequestTypedDict, + ) + from .createworkspaceresponse import ( + CreateWorkspaceResponse, + CreateWorkspaceResponseTypedDict, + ) from .customtool import ( CustomTool, CustomToolTypedDict, @@ -392,6 +416,10 @@ DeleteGuardrailResponse, DeleteGuardrailResponseTypedDict, ) + from .deleteworkspaceresponse import ( + DeleteWorkspaceResponse, + DeleteWorkspaceResponseTypedDict, + ) from .easyinputmessage import ( EasyInputMessage, EasyInputMessageContentInputImage, @@ -502,10 +530,37 @@ OutputInputImage, OutputInputImageTypedDict, ) + from .generationcontentdata import ( + GenerationContentData, + GenerationContentDataOutput, + GenerationContentDataOutputTypedDict, + GenerationContentDataTypedDict, + Input1, + Input1TypedDict, + Input2, + Input2TypedDict, + InputUnion, + InputUnionTypedDict, + ) + from .generationcontentresponse import ( + GenerationContentResponse, + GenerationContentResponseTypedDict, + ) + from .generationresponse import ( + APIType, + GenerationResponse, + GenerationResponseData, + GenerationResponseDataTypedDict, + GenerationResponseTypedDict, + ) from .getguardrailresponse import ( GetGuardrailResponse, GetGuardrailResponseTypedDict, ) + from .getworkspaceresponse import ( + GetWorkspaceResponse, + GetWorkspaceResponseTypedDict, + ) from .guardrail import Guardrail, GuardrailTypedDict from .guardrailinterval import GuardrailInterval from .imageconfig import ImageConfig, ImageConfigTypedDict @@ -658,6 +713,10 @@ ListMemberAssignmentsResponse, ListMemberAssignmentsResponseTypedDict, ) + from .listworkspacesresponse import ( + ListWorkspacesResponse, + ListWorkspacesResponseTypedDict, + ) from .mcpservertool import ( AllowedTools, AllowedToolsTypedDict, @@ -688,9 +747,9 @@ from .modelgroup import ModelGroup from .modellinks import ModelLinks, ModelLinksTypedDict from .modelscountresponse import ( - Data, - DataTypedDict, ModelsCountResponse, + ModelsCountResponseData, + ModelsCountResponseDataTypedDict, ModelsCountResponseTypedDict, ) from .modelslistresponse import ModelsListResponse, ModelsListResponseTypedDict @@ -921,6 +980,11 @@ OutputReasoningItemType, OutputReasoningItemTypedDict, ) + from .outputsearchmodelsservertoolitem import ( + OutputSearchModelsServerToolItem, + OutputSearchModelsServerToolItemType, + OutputSearchModelsServerToolItemTypedDict, + ) from .outputtexteditorservertoolitem import ( Command, OutputTextEditorServerToolItem, @@ -959,6 +1023,11 @@ OutputWebSearchServerToolItemTypedDict, ) from .parameter import Parameter + from .paretorouterplugin import ( + ParetoRouterPlugin, + ParetoRouterPluginID, + ParetoRouterPluginTypedDict, + ) from .payloadtoolargeresponseerrordata import ( PayloadTooLargeResponseErrorData, PayloadTooLargeResponseErrorDataTypedDict, @@ -1180,6 +1249,15 @@ ShellServerToolType, ShellServerToolTypedDict, ) + from .speechrequest import ( + ResponseFormatEnum, + SpeechRequest, + SpeechRequestOptions, + SpeechRequestOptionsTypedDict, + SpeechRequestProvider, + SpeechRequestProviderTypedDict, + SpeechRequestTypedDict, + ) from .storedprompttemplate import ( StoredPromptTemplate, StoredPromptTemplateTypedDict, @@ -1217,7 +1295,6 @@ StreamLogprobTopLogprob, StreamLogprobTopLogprobTypedDict, ) - from .textconfig import TextConfig, TextConfigTypedDict, TextConfigVerbosity from .textdeltaevent import ( TextDeltaEvent, TextDeltaEventType, @@ -1227,7 +1304,7 @@ from .textextendedconfig import ( TextExtendedConfig, TextExtendedConfigTypedDict, - TextExtendedConfigVerbosity, + Verbosity, ) from .toolcallstatus import ToolCallStatus from .toolchoiceallowed import ( @@ -1262,6 +1339,14 @@ UpdateGuardrailResponse, UpdateGuardrailResponseTypedDict, ) + from .updateworkspacerequest import ( + UpdateWorkspaceRequest, + UpdateWorkspaceRequestTypedDict, + ) + from .updateworkspaceresponse import ( + UpdateWorkspaceResponse, + UpdateWorkspaceResponseTypedDict, + ) from .urlcitation import URLCitation, URLCitationType, URLCitationTypedDict from .usage import ( CostDetails, @@ -1275,12 +1360,12 @@ ) from .videogenerationrequest import ( AspectRatio, - Options, - OptionsTypedDict, - Provider, - ProviderTypedDict, Resolution, VideoGenerationRequest, + VideoGenerationRequestOptions, + VideoGenerationRequestOptionsTypedDict, + VideoGenerationRequestProvider, + VideoGenerationRequestProviderTypedDict, VideoGenerationRequestTypedDict, ) from .videogenerationresponse import ( @@ -1304,6 +1389,16 @@ VideoModelsListResponse, VideoModelsListResponseTypedDict, ) + from .webfetchengineenum import WebFetchEngineEnum + from .webfetchservertool import ( + WebFetchServerTool, + WebFetchServerToolType, + WebFetchServerToolTypedDict, + ) + from .webfetchservertoolconfig import ( + WebFetchServerToolConfig, + WebFetchServerToolConfigTypedDict, + ) from .websearchcallcompletedevent import ( WebSearchCallCompletedEvent, WebSearchCallCompletedEventType, @@ -1359,8 +1454,15 @@ WebSearchUserLocationServerToolType, WebSearchUserLocationServerToolTypedDict, ) + from .workspace import Workspace, WorkspaceTypedDict + from .workspacemember import ( + WorkspaceMember, + WorkspaceMemberRole, + WorkspaceMemberTypedDict, + ) __all__ = [ + "APIType", "Action", "ActionEnum", "ActionFindInPage", @@ -1424,6 +1526,10 @@ "BaseInputsUnionTypedDict", "BaseReasoningConfig", "BaseReasoningConfigTypedDict", + "BulkAddWorkspaceMembersRequest", + "BulkAddWorkspaceMembersRequestTypedDict", + "BulkAddWorkspaceMembersResponse", + "BulkAddWorkspaceMembersResponseTypedDict", "BulkAssignKeysRequest", "BulkAssignKeysRequestTypedDict", "BulkAssignKeysResponse", @@ -1432,6 +1538,10 @@ "BulkAssignMembersRequestTypedDict", "BulkAssignMembersResponse", "BulkAssignMembersResponseTypedDict", + "BulkRemoveWorkspaceMembersRequest", + "BulkRemoveWorkspaceMembersRequestTypedDict", + "BulkRemoveWorkspaceMembersResponse", + "BulkRemoveWorkspaceMembersResponseTypedDict", "BulkUnassignKeysRequest", "BulkUnassignKeysRequestTypedDict", "BulkUnassignKeysResponse", @@ -1628,11 +1738,13 @@ "CreateGuardrailRequestTypedDict", "CreateGuardrailResponse", "CreateGuardrailResponseTypedDict", + "CreateWorkspaceRequest", + "CreateWorkspaceRequestTypedDict", + "CreateWorkspaceResponse", + "CreateWorkspaceResponseTypedDict", "CustomTool", "CustomToolTypedDict", - "Data", "DataCollection", - "DataTypedDict", "DatetimeServerTool", "DatetimeServerToolConfig", "DatetimeServerToolConfigTypedDict", @@ -1642,6 +1754,8 @@ "DefaultParametersTypedDict", "DeleteGuardrailResponse", "DeleteGuardrailResponseTypedDict", + "DeleteWorkspaceResponse", + "DeleteWorkspaceResponseTypedDict", "EasyInputMessage", "EasyInputMessageContentInputImage", "EasyInputMessageContentInputImageTypedDict", @@ -1738,8 +1852,20 @@ "FunctionCallOutputItemStatus", "FunctionCallOutputItemTypeFunctionCallOutput", "FunctionCallOutputItemTypedDict", + "GenerationContentData", + "GenerationContentDataOutput", + "GenerationContentDataOutputTypedDict", + "GenerationContentDataTypedDict", + "GenerationContentResponse", + "GenerationContentResponseTypedDict", + "GenerationResponse", + "GenerationResponseData", + "GenerationResponseDataTypedDict", + "GenerationResponseTypedDict", "GetGuardrailResponse", "GetGuardrailResponseTypedDict", + "GetWorkspaceResponse", + "GetWorkspaceResponseTypedDict", "Guardrail", "GuardrailInterval", "GuardrailTypedDict", @@ -1772,6 +1898,10 @@ "ImageGenerationStatus", "IncompleteDetails", "IncompleteDetailsTypedDict", + "Input1", + "Input1TypedDict", + "Input2", + "Input2TypedDict", "InputAudio", "InputAudioInputAudio", "InputAudioInputAudioTypedDict", @@ -1807,6 +1937,8 @@ "InputTextTypedDict", "InputTokensDetails", "InputTokensDetailsTypedDict", + "InputUnion", + "InputUnionTypedDict", "InputVideo", "InputVideoType", "InputVideoTypedDict", @@ -1858,6 +1990,8 @@ "ListKeyAssignmentsResponseTypedDict", "ListMemberAssignmentsResponse", "ListMemberAssignmentsResponseTypedDict", + "ListWorkspacesResponse", + "ListWorkspacesResponseTypedDict", "Logprob", "LogprobTypedDict", "MaxPrice", @@ -1883,6 +2017,8 @@ "ModelLinksTypedDict", "ModelTypedDict", "ModelsCountResponse", + "ModelsCountResponseData", + "ModelsCountResponseDataTypedDict", "ModelsCountResponseTypedDict", "ModelsListResponse", "ModelsListResponseTypedDict", @@ -1953,8 +2089,6 @@ "OpenRouterWebSearchServerTool", "OpenRouterWebSearchServerToolType", "OpenRouterWebSearchServerToolTypedDict", - "Options", - "OptionsTypedDict", "Order", "OrderTypedDict", "OutputApplyPatchServerToolItem", @@ -2058,6 +2192,9 @@ "OutputReasoningItemStatusUnionTypedDict", "OutputReasoningItemType", "OutputReasoningItemTypedDict", + "OutputSearchModelsServerToolItem", + "OutputSearchModelsServerToolItemType", + "OutputSearchModelsServerToolItemTypedDict", "OutputTextEditorServerToolItem", "OutputTextEditorServerToolItemType", "OutputTextEditorServerToolItemTypedDict", @@ -2083,6 +2220,9 @@ "Parameter", "Parameters", "ParametersTypedDict", + "ParetoRouterPlugin", + "ParetoRouterPluginID", + "ParetoRouterPluginTypedDict", "Partition", "PayloadTooLargeResponseErrorData", "PayloadTooLargeResponseErrorDataTypedDict", @@ -2115,7 +2255,6 @@ "PricingTypedDict", "PromptTokensDetails", "PromptTokensDetailsTypedDict", - "Provider", "ProviderName", "ProviderOverloadedResponseErrorData", "ProviderOverloadedResponseErrorDataTypedDict", @@ -2127,7 +2266,6 @@ "ProviderSort", "ProviderSortConfig", "ProviderSortConfigTypedDict", - "ProviderTypedDict", "PublicEndpoint", "PublicEndpointQuantization", "PublicEndpointTypedDict", @@ -2205,6 +2343,7 @@ "RequireApprovalUnionTypedDict", "Resolution", "ResponseFormat", + "ResponseFormatEnum", "ResponseFormatTypedDict", "ResponseHealingPlugin", "ResponseHealingPluginID", @@ -2241,6 +2380,12 @@ "Size", "Sort", "SortTypedDict", + "SpeechRequest", + "SpeechRequestOptions", + "SpeechRequestOptionsTypedDict", + "SpeechRequestProvider", + "SpeechRequestProviderTypedDict", + "SpeechRequestTypedDict", "Stop", "StopTypedDict", "StoredPromptTemplate", @@ -2271,9 +2416,6 @@ "SupportedResolution", "SupportedSize", "Syntax", - "TextConfig", - "TextConfigTypedDict", - "TextConfigVerbosity", "TextDeltaEvent", "TextDeltaEventType", "TextDeltaEventTypedDict", @@ -2282,7 +2424,6 @@ "TextDoneEventTypedDict", "TextExtendedConfig", "TextExtendedConfigTypedDict", - "TextExtendedConfigVerbosity", "Tokenizer", "TooManyRequestsResponseErrorData", "TooManyRequestsResponseErrorDataTypedDict", @@ -2318,6 +2459,10 @@ "UpdateGuardrailRequestTypedDict", "UpdateGuardrailResponse", "UpdateGuardrailResponseTypedDict", + "UpdateWorkspaceRequest", + "UpdateWorkspaceRequestTypedDict", + "UpdateWorkspaceResponse", + "UpdateWorkspaceResponseTypedDict", "Usage", "UsageTypedDict", "Value1", @@ -2326,7 +2471,12 @@ "Value2TypedDict", "Variables", "VariablesTypedDict", + "Verbosity", "VideoGenerationRequest", + "VideoGenerationRequestOptions", + "VideoGenerationRequestOptionsTypedDict", + "VideoGenerationRequestProvider", + "VideoGenerationRequestProviderTypedDict", "VideoGenerationRequestTypedDict", "VideoGenerationResponse", "VideoGenerationResponseStatus", @@ -2337,6 +2487,12 @@ "VideoModelTypedDict", "VideoModelsListResponse", "VideoModelsListResponseTypedDict", + "WebFetchEngineEnum", + "WebFetchServerTool", + "WebFetchServerToolConfig", + "WebFetchServerToolConfigTypedDict", + "WebFetchServerToolType", + "WebFetchServerToolTypedDict", "WebSearchCallCompletedEvent", "WebSearchCallCompletedEventType", "WebSearchCallCompletedEventTypedDict", @@ -2371,6 +2527,11 @@ "WebSearchUserLocationServerToolTypedDict", "WebSearchUserLocationType", "WebSearchUserLocationTypedDict", + "Workspace", + "WorkspaceMember", + "WorkspaceMemberRole", + "WorkspaceMemberTypedDict", + "WorkspaceTypedDict", ] _dynamic_imports: dict[str, str] = { @@ -2418,6 +2579,10 @@ "BaseInputsUnionTypedDict": ".baseinputs_union", "BaseReasoningConfig": ".basereasoningconfig", "BaseReasoningConfigTypedDict": ".basereasoningconfig", + "BulkAddWorkspaceMembersRequest": ".bulkaddworkspacemembersrequest", + "BulkAddWorkspaceMembersRequestTypedDict": ".bulkaddworkspacemembersrequest", + "BulkAddWorkspaceMembersResponse": ".bulkaddworkspacemembersresponse", + "BulkAddWorkspaceMembersResponseTypedDict": ".bulkaddworkspacemembersresponse", "BulkAssignKeysRequest": ".bulkassignkeysrequest", "BulkAssignKeysRequestTypedDict": ".bulkassignkeysrequest", "BulkAssignKeysResponse": ".bulkassignkeysresponse", @@ -2426,6 +2591,10 @@ "BulkAssignMembersRequestTypedDict": ".bulkassignmembersrequest", "BulkAssignMembersResponse": ".bulkassignmembersresponse", "BulkAssignMembersResponseTypedDict": ".bulkassignmembersresponse", + "BulkRemoveWorkspaceMembersRequest": ".bulkremoveworkspacemembersrequest", + "BulkRemoveWorkspaceMembersRequestTypedDict": ".bulkremoveworkspacemembersrequest", + "BulkRemoveWorkspaceMembersResponse": ".bulkremoveworkspacemembersresponse", + "BulkRemoveWorkspaceMembersResponseTypedDict": ".bulkremoveworkspacemembersresponse", "BulkUnassignKeysRequest": ".bulkunassignkeysrequest", "BulkUnassignKeysRequestTypedDict": ".bulkunassignkeysrequest", "BulkUnassignKeysResponse": ".bulkunassignkeysresponse", @@ -2633,6 +2802,10 @@ "CreateGuardrailRequestTypedDict": ".createguardrailrequest", "CreateGuardrailResponse": ".createguardrailresponse", "CreateGuardrailResponseTypedDict": ".createguardrailresponse", + "CreateWorkspaceRequest": ".createworkspacerequest", + "CreateWorkspaceRequestTypedDict": ".createworkspacerequest", + "CreateWorkspaceResponse": ".createworkspaceresponse", + "CreateWorkspaceResponseTypedDict": ".createworkspaceresponse", "CustomTool": ".customtool", "CustomToolTypedDict": ".customtool", "Format": ".customtool", @@ -2654,6 +2827,8 @@ "DefaultParametersTypedDict": ".defaultparameters", "DeleteGuardrailResponse": ".deleteguardrailresponse", "DeleteGuardrailResponseTypedDict": ".deleteguardrailresponse", + "DeleteWorkspaceResponse": ".deleteworkspaceresponse", + "DeleteWorkspaceResponseTypedDict": ".deleteworkspaceresponse", "EasyInputMessage": ".easyinputmessage", "EasyInputMessageContentInputImage": ".easyinputmessage", "EasyInputMessageContentInputImageTypedDict": ".easyinputmessage", @@ -2745,8 +2920,27 @@ "FunctionCallOutputItemTypedDict": ".functioncalloutputitem", "OutputInputImage": ".functioncalloutputitem", "OutputInputImageTypedDict": ".functioncalloutputitem", + "GenerationContentData": ".generationcontentdata", + "GenerationContentDataOutput": ".generationcontentdata", + "GenerationContentDataOutputTypedDict": ".generationcontentdata", + "GenerationContentDataTypedDict": ".generationcontentdata", + "Input1": ".generationcontentdata", + "Input1TypedDict": ".generationcontentdata", + "Input2": ".generationcontentdata", + "Input2TypedDict": ".generationcontentdata", + "InputUnion": ".generationcontentdata", + "InputUnionTypedDict": ".generationcontentdata", + "GenerationContentResponse": ".generationcontentresponse", + "GenerationContentResponseTypedDict": ".generationcontentresponse", + "APIType": ".generationresponse", + "GenerationResponse": ".generationresponse", + "GenerationResponseData": ".generationresponse", + "GenerationResponseDataTypedDict": ".generationresponse", + "GenerationResponseTypedDict": ".generationresponse", "GetGuardrailResponse": ".getguardrailresponse", "GetGuardrailResponseTypedDict": ".getguardrailresponse", + "GetWorkspaceResponse": ".getworkspaceresponse", + "GetWorkspaceResponseTypedDict": ".getworkspaceresponse", "Guardrail": ".guardrail", "GuardrailTypedDict": ".guardrail", "GuardrailInterval": ".guardrailinterval", @@ -2872,6 +3066,8 @@ "ListKeyAssignmentsResponseTypedDict": ".listkeyassignmentsresponse", "ListMemberAssignmentsResponse": ".listmemberassignmentsresponse", "ListMemberAssignmentsResponseTypedDict": ".listmemberassignmentsresponse", + "ListWorkspacesResponse": ".listworkspacesresponse", + "ListWorkspacesResponseTypedDict": ".listworkspacesresponse", "AllowedTools": ".mcpservertool", "AllowedToolsTypedDict": ".mcpservertool", "AllowedToolsUnion": ".mcpservertool", @@ -2900,9 +3096,9 @@ "ModelGroup": ".modelgroup", "ModelLinks": ".modellinks", "ModelLinksTypedDict": ".modellinks", - "Data": ".modelscountresponse", - "DataTypedDict": ".modelscountresponse", "ModelsCountResponse": ".modelscountresponse", + "ModelsCountResponseData": ".modelscountresponse", + "ModelsCountResponseDataTypedDict": ".modelscountresponse", "ModelsCountResponseTypedDict": ".modelscountresponse", "ModelsListResponse": ".modelslistresponse", "ModelsListResponseTypedDict": ".modelslistresponse", @@ -3074,6 +3270,9 @@ "OutputReasoningItemStatusUnionTypedDict": ".outputreasoningitem", "OutputReasoningItemType": ".outputreasoningitem", "OutputReasoningItemTypedDict": ".outputreasoningitem", + "OutputSearchModelsServerToolItem": ".outputsearchmodelsservertoolitem", + "OutputSearchModelsServerToolItemType": ".outputsearchmodelsservertoolitem", + "OutputSearchModelsServerToolItemTypedDict": ".outputsearchmodelsservertoolitem", "Command": ".outputtexteditorservertoolitem", "OutputTextEditorServerToolItem": ".outputtexteditorservertoolitem", "OutputTextEditorServerToolItemType": ".outputtexteditorservertoolitem", @@ -3102,6 +3301,9 @@ "OutputWebSearchServerToolItemType": ".outputwebsearchservertoolitem", "OutputWebSearchServerToolItemTypedDict": ".outputwebsearchservertoolitem", "Parameter": ".parameter", + "ParetoRouterPlugin": ".paretorouterplugin", + "ParetoRouterPluginID": ".paretorouterplugin", + "ParetoRouterPluginTypedDict": ".paretorouterplugin", "PayloadTooLargeResponseErrorData": ".payloadtoolargeresponseerrordata", "PayloadTooLargeResponseErrorDataTypedDict": ".payloadtoolargeresponseerrordata", "PaymentRequiredResponseErrorData": ".paymentrequiredresponseerrordata", @@ -3256,6 +3458,13 @@ "ShellServerTool": ".shellservertool", "ShellServerToolType": ".shellservertool", "ShellServerToolTypedDict": ".shellservertool", + "ResponseFormatEnum": ".speechrequest", + "SpeechRequest": ".speechrequest", + "SpeechRequestOptions": ".speechrequest", + "SpeechRequestOptionsTypedDict": ".speechrequest", + "SpeechRequestProvider": ".speechrequest", + "SpeechRequestProviderTypedDict": ".speechrequest", + "SpeechRequestTypedDict": ".speechrequest", "StoredPromptTemplate": ".storedprompttemplate", "StoredPromptTemplateTypedDict": ".storedprompttemplate", "Variables": ".storedprompttemplate", @@ -3281,9 +3490,6 @@ "StreamLogprobTypedDict": ".streamlogprob", "StreamLogprobTopLogprob": ".streamlogprobtoplogprob", "StreamLogprobTopLogprobTypedDict": ".streamlogprobtoplogprob", - "TextConfig": ".textconfig", - "TextConfigTypedDict": ".textconfig", - "TextConfigVerbosity": ".textconfig", "TextDeltaEvent": ".textdeltaevent", "TextDeltaEventType": ".textdeltaevent", "TextDeltaEventTypedDict": ".textdeltaevent", @@ -3292,7 +3498,7 @@ "TextDoneEventTypedDict": ".textdoneevent", "TextExtendedConfig": ".textextendedconfig", "TextExtendedConfigTypedDict": ".textextendedconfig", - "TextExtendedConfigVerbosity": ".textextendedconfig", + "Verbosity": ".textextendedconfig", "ToolCallStatus": ".toolcallstatus", "Mode": ".toolchoiceallowed", "ModeAuto": ".toolchoiceallowed", @@ -3316,6 +3522,10 @@ "UpdateGuardrailRequestTypedDict": ".updateguardrailrequest", "UpdateGuardrailResponse": ".updateguardrailresponse", "UpdateGuardrailResponseTypedDict": ".updateguardrailresponse", + "UpdateWorkspaceRequest": ".updateworkspacerequest", + "UpdateWorkspaceRequestTypedDict": ".updateworkspacerequest", + "UpdateWorkspaceResponse": ".updateworkspaceresponse", + "UpdateWorkspaceResponseTypedDict": ".updateworkspaceresponse", "URLCitation": ".urlcitation", "URLCitationType": ".urlcitation", "URLCitationTypedDict": ".urlcitation", @@ -3328,12 +3538,12 @@ "Usage": ".usage", "UsageTypedDict": ".usage", "AspectRatio": ".videogenerationrequest", - "Options": ".videogenerationrequest", - "OptionsTypedDict": ".videogenerationrequest", - "Provider": ".videogenerationrequest", - "ProviderTypedDict": ".videogenerationrequest", "Resolution": ".videogenerationrequest", "VideoGenerationRequest": ".videogenerationrequest", + "VideoGenerationRequestOptions": ".videogenerationrequest", + "VideoGenerationRequestOptionsTypedDict": ".videogenerationrequest", + "VideoGenerationRequestProvider": ".videogenerationrequest", + "VideoGenerationRequestProviderTypedDict": ".videogenerationrequest", "VideoGenerationRequestTypedDict": ".videogenerationrequest", "VideoGenerationResponse": ".videogenerationresponse", "VideoGenerationResponseStatus": ".videogenerationresponse", @@ -3348,6 +3558,12 @@ "VideoModelTypedDict": ".videomodel", "VideoModelsListResponse": ".videomodelslistresponse", "VideoModelsListResponseTypedDict": ".videomodelslistresponse", + "WebFetchEngineEnum": ".webfetchengineenum", + "WebFetchServerTool": ".webfetchservertool", + "WebFetchServerToolType": ".webfetchservertool", + "WebFetchServerToolTypedDict": ".webfetchservertool", + "WebFetchServerToolConfig": ".webfetchservertoolconfig", + "WebFetchServerToolConfigTypedDict": ".webfetchservertoolconfig", "WebSearchCallCompletedEvent": ".websearchcallcompletedevent", "WebSearchCallCompletedEventType": ".websearchcallcompletedevent", "WebSearchCallCompletedEventTypedDict": ".websearchcallcompletedevent", @@ -3384,6 +3600,11 @@ "WebSearchUserLocationServerTool": ".websearchuserlocationservertool", "WebSearchUserLocationServerToolType": ".websearchuserlocationservertool", "WebSearchUserLocationServerToolTypedDict": ".websearchuserlocationservertool", + "Workspace": ".workspace", + "WorkspaceTypedDict": ".workspace", + "WorkspaceMember": ".workspacemember", + "WorkspaceMemberRole": ".workspacemember", + "WorkspaceMemberTypedDict": ".workspacemember", } diff --git a/src/openrouter/components/bulkaddworkspacemembersrequest.py b/src/openrouter/components/bulkaddworkspacemembersrequest.py new file mode 100644 index 0000000..c792725 --- /dev/null +++ b/src/openrouter/components/bulkaddworkspacemembersrequest.py @@ -0,0 +1,16 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel +from typing import List +from typing_extensions import TypedDict + + +class BulkAddWorkspaceMembersRequestTypedDict(TypedDict): + user_ids: List[str] + r"""List of user IDs to add to the workspace. Members are assigned the same role they hold in the organization.""" + + +class BulkAddWorkspaceMembersRequest(BaseModel): + user_ids: List[str] + r"""List of user IDs to add to the workspace. Members are assigned the same role they hold in the organization.""" diff --git a/src/openrouter/components/bulkaddworkspacemembersresponse.py b/src/openrouter/components/bulkaddworkspacemembersresponse.py new file mode 100644 index 0000000..f46030f --- /dev/null +++ b/src/openrouter/components/bulkaddworkspacemembersresponse.py @@ -0,0 +1,22 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .workspacemember import WorkspaceMember, WorkspaceMemberTypedDict +from openrouter.types import BaseModel +from typing import List +from typing_extensions import TypedDict + + +class BulkAddWorkspaceMembersResponseTypedDict(TypedDict): + added_count: int + r"""Number of workspace memberships created or updated""" + data: List[WorkspaceMemberTypedDict] + r"""List of added workspace memberships""" + + +class BulkAddWorkspaceMembersResponse(BaseModel): + added_count: int + r"""Number of workspace memberships created or updated""" + + data: List[WorkspaceMember] + r"""List of added workspace memberships""" diff --git a/src/openrouter/components/bulkremoveworkspacemembersrequest.py b/src/openrouter/components/bulkremoveworkspacemembersrequest.py new file mode 100644 index 0000000..a02c46c --- /dev/null +++ b/src/openrouter/components/bulkremoveworkspacemembersrequest.py @@ -0,0 +1,16 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel +from typing import List +from typing_extensions import TypedDict + + +class BulkRemoveWorkspaceMembersRequestTypedDict(TypedDict): + user_ids: List[str] + r"""List of user IDs to remove from the workspace""" + + +class BulkRemoveWorkspaceMembersRequest(BaseModel): + user_ids: List[str] + r"""List of user IDs to remove from the workspace""" diff --git a/src/openrouter/components/bulkremoveworkspacemembersresponse.py b/src/openrouter/components/bulkremoveworkspacemembersresponse.py new file mode 100644 index 0000000..69082ff --- /dev/null +++ b/src/openrouter/components/bulkremoveworkspacemembersresponse.py @@ -0,0 +1,15 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel +from typing_extensions import TypedDict + + +class BulkRemoveWorkspaceMembersResponseTypedDict(TypedDict): + removed_count: int + r"""Number of members removed""" + + +class BulkRemoveWorkspaceMembersResponse(BaseModel): + removed_count: int + r"""Number of members removed""" diff --git a/src/openrouter/components/chatfunctiontool.py b/src/openrouter/components/chatfunctiontool.py index b0c0d43..90b069f 100644 --- a/src/openrouter/components/chatfunctiontool.py +++ b/src/openrouter/components/chatfunctiontool.py @@ -22,6 +22,7 @@ OpenRouterWebSearchServerTool, OpenRouterWebSearchServerToolTypedDict, ) +from .webfetchservertool import WebFetchServerTool, WebFetchServerToolTypedDict from openrouter.types import ( BaseModel, Nullable, @@ -121,6 +122,7 @@ class ChatFunctionToolFunction(BaseModel): DatetimeServerToolTypedDict, ImageGenerationServerToolOpenRouterTypedDict, ChatSearchModelsServerToolTypedDict, + WebFetchServerToolTypedDict, OpenRouterWebSearchServerToolTypedDict, ChatFunctionToolFunctionTypedDict, ChatWebSearchShorthandTypedDict, @@ -139,6 +141,7 @@ class ChatFunctionToolFunction(BaseModel): Annotated[ ChatSearchModelsServerTool, Tag("openrouter:experimental__search_models") ], + Annotated[WebFetchServerTool, Tag("openrouter:web_fetch")], Annotated[OpenRouterWebSearchServerTool, Tag("openrouter:web_search")], Annotated[ChatWebSearchShorthand, Tag("web_search")], Annotated[ChatWebSearchShorthand, Tag("web_search_preview")], diff --git a/src/openrouter/components/chatrequest.py b/src/openrouter/components/chatrequest.py index 7559c77..dc5ca5d 100644 --- a/src/openrouter/components/chatrequest.py +++ b/src/openrouter/components/chatrequest.py @@ -36,6 +36,7 @@ ) from .imageconfig import ImageConfig, ImageConfigTypedDict from .moderationplugin import ModerationPlugin, ModerationPluginTypedDict +from .paretorouterplugin import ParetoRouterPlugin, ParetoRouterPluginTypedDict from .providerpreferences import ProviderPreferences, ProviderPreferencesTypedDict from .responsehealingplugin import ResponseHealingPlugin, ResponseHealingPluginTypedDict from .traceconfig import TraceConfig, TraceConfigTypedDict @@ -73,6 +74,7 @@ AutoRouterPluginTypedDict, FileParserPluginTypedDict, ContextCompressionPluginTypedDict, + ParetoRouterPluginTypedDict, WebSearchPluginTypedDict, ], ) @@ -84,6 +86,7 @@ Annotated[ContextCompressionPlugin, Tag("context-compression")], Annotated[FileParserPlugin, Tag("file-parser")], Annotated[ModerationPlugin, Tag("moderation")], + Annotated[ParetoRouterPlugin, Tag("pareto-router")], Annotated[ResponseHealingPlugin, Tag("response-healing")], Annotated[WebSearchPlugin, Tag("web")], ], diff --git a/src/openrouter/components/chatwebsearchshorthand.py b/src/openrouter/components/chatwebsearchshorthand.py index 707f0cf..a92eed6 100644 --- a/src/openrouter/components/chatwebsearchshorthand.py +++ b/src/openrouter/components/chatwebsearchshorthand.py @@ -42,7 +42,7 @@ class ChatWebSearchShorthandTypedDict(TypedDict): r"""Maximum total number of search results across all search calls in a single request. Once this limit is reached, the tool will stop returning new results. Useful for controlling cost and context size in agentic loops.""" parameters: NotRequired[WebSearchConfigTypedDict] search_context_size: NotRequired[SearchQualityLevel] - r"""How much context to retrieve per result. Defaults to medium (15000 chars). Only applies when using the Exa engine; ignored with native provider search.""" + r"""How much context to retrieve per result. Defaults to medium (15000 chars). Applies to Exa and Parallel engines; ignored with native provider search and Firecrawl.""" user_location: NotRequired[WebSearchUserLocationServerToolTypedDict] r"""Approximate user location for location-biased results.""" @@ -76,7 +76,7 @@ class ChatWebSearchShorthand(BaseModel): search_context_size: Annotated[ Optional[SearchQualityLevel], PlainValidator(validate_open_enum(False)) ] = None - r"""How much context to retrieve per result. Defaults to medium (15000 chars). Only applies when using the Exa engine; ignored with native provider search.""" + r"""How much context to retrieve per result. Defaults to medium (15000 chars). Applies to Exa and Parallel engines; ignored with native provider search and Firecrawl.""" user_location: Optional[WebSearchUserLocationServerTool] = None r"""Approximate user location for location-biased results.""" diff --git a/src/openrouter/components/createguardrailrequest.py b/src/openrouter/components/createguardrailrequest.py index c6dd6d6..421b13f 100644 --- a/src/openrouter/components/createguardrailrequest.py +++ b/src/openrouter/components/createguardrailrequest.py @@ -12,7 +12,7 @@ from openrouter.utils import validate_open_enum from pydantic import model_serializer from pydantic.functional_validators import PlainValidator -from typing import List +from typing import List, Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -35,6 +35,8 @@ class CreateGuardrailRequestTypedDict(TypedDict): r"""Spending limit in USD""" reset_interval: NotRequired[Nullable[GuardrailInterval]] r"""Interval at which the limit resets (daily, weekly, monthly)""" + workspace_id: NotRequired[str] + r"""The workspace to create the guardrail in. Defaults to the default workspace if not provided.""" class CreateGuardrailRequest(BaseModel): @@ -67,6 +69,9 @@ class CreateGuardrailRequest(BaseModel): ] = UNSET r"""Interval at which the limit resets (daily, weekly, monthly)""" + workspace_id: Optional[str] = None + r"""The workspace to create the guardrail in. Defaults to the default workspace if not provided.""" + @model_serializer(mode="wrap") def serialize_model(self, handler): optional_fields = [ @@ -78,6 +83,7 @@ def serialize_model(self, handler): "ignored_providers", "limit_usd", "reset_interval", + "workspace_id", ] nullable_fields = [ "allowed_models", diff --git a/src/openrouter/components/createworkspacerequest.py b/src/openrouter/components/createworkspacerequest.py new file mode 100644 index 0000000..ff5d506 --- /dev/null +++ b/src/openrouter/components/createworkspacerequest.py @@ -0,0 +1,106 @@ +"""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 Optional +from typing_extensions import NotRequired, TypedDict + + +class CreateWorkspaceRequestTypedDict(TypedDict): + name: str + r"""Name for the new workspace""" + slug: str + r"""URL-friendly slug (lowercase alphanumeric and hyphens only)""" + default_image_model: NotRequired[Nullable[str]] + r"""Default image model for this workspace""" + default_provider_sort: NotRequired[Nullable[str]] + r"""Default provider sort preference (price, throughput, latency, exacto)""" + default_text_model: NotRequired[Nullable[str]] + r"""Default text model for this workspace""" + description: NotRequired[Nullable[str]] + r"""Description of the workspace""" + is_data_discount_logging_enabled: NotRequired[bool] + r"""Whether data discount logging is enabled""" + is_observability_broadcast_enabled: NotRequired[bool] + r"""Whether broadcast is enabled""" + is_observability_io_logging_enabled: NotRequired[bool] + r"""Whether private logging is enabled""" + + +class CreateWorkspaceRequest(BaseModel): + name: str + r"""Name for the new workspace""" + + slug: str + r"""URL-friendly slug (lowercase alphanumeric and hyphens only)""" + + default_image_model: OptionalNullable[str] = UNSET + r"""Default image model for this workspace""" + + default_provider_sort: OptionalNullable[str] = UNSET + r"""Default provider sort preference (price, throughput, latency, exacto)""" + + default_text_model: OptionalNullable[str] = UNSET + r"""Default text model for this workspace""" + + description: OptionalNullable[str] = UNSET + r"""Description of the workspace""" + + is_data_discount_logging_enabled: Optional[bool] = None + r"""Whether data discount logging is enabled""" + + is_observability_broadcast_enabled: Optional[bool] = None + r"""Whether broadcast is enabled""" + + is_observability_io_logging_enabled: Optional[bool] = None + r"""Whether private logging is enabled""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = [ + "default_image_model", + "default_provider_sort", + "default_text_model", + "description", + "is_data_discount_logging_enabled", + "is_observability_broadcast_enabled", + "is_observability_io_logging_enabled", + ] + nullable_fields = [ + "default_image_model", + "default_provider_sort", + "default_text_model", + "description", + ] + null_default_fields = [] + + serialized = handler(self) + + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + serialized.pop(k, None) + + optional_nullable = k in optional_fields and k in nullable_fields + is_set = ( + self.__pydantic_fields_set__.intersection({n}) + or k in null_default_fields + ) # pylint: disable=no-member + + if val is not None and val != UNSET_SENTINEL: + m[k] = val + elif val != UNSET_SENTINEL and ( + not k in optional_fields or (optional_nullable and is_set) + ): + m[k] = val + + return m diff --git a/src/openrouter/components/createworkspaceresponse.py b/src/openrouter/components/createworkspaceresponse.py new file mode 100644 index 0000000..54c7b43 --- /dev/null +++ b/src/openrouter/components/createworkspaceresponse.py @@ -0,0 +1,14 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .workspace import Workspace, WorkspaceTypedDict +from openrouter.types import BaseModel +from typing_extensions import TypedDict + + +class CreateWorkspaceResponseTypedDict(TypedDict): + data: WorkspaceTypedDict + + +class CreateWorkspaceResponse(BaseModel): + data: Workspace diff --git a/src/openrouter/components/deleteworkspaceresponse.py b/src/openrouter/components/deleteworkspaceresponse.py new file mode 100644 index 0000000..bed4595 --- /dev/null +++ b/src/openrouter/components/deleteworkspaceresponse.py @@ -0,0 +1,22 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel +from openrouter.utils import validate_const +import pydantic +from pydantic.functional_validators import AfterValidator +from typing import Literal +from typing_extensions import Annotated, TypedDict + + +class DeleteWorkspaceResponseTypedDict(TypedDict): + deleted: Literal[True] + r"""Confirmation that the workspace was deleted""" + + +class DeleteWorkspaceResponse(BaseModel): + DELETED: Annotated[ + Annotated[Literal[True], AfterValidator(validate_const(True))], + pydantic.Field(alias="deleted"), + ] = True + r"""Confirmation that the workspace was deleted""" diff --git a/src/openrouter/components/generationcontentdata.py b/src/openrouter/components/generationcontentdata.py new file mode 100644 index 0000000..065679a --- /dev/null +++ b/src/openrouter/components/generationcontentdata.py @@ -0,0 +1,101 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel, Nullable, UNSET_SENTINEL +from pydantic import model_serializer +from typing import Any, List, Union +from typing_extensions import TypeAliasType, TypedDict + + +class Input2TypedDict(TypedDict): + messages: List[Nullable[Any]] + + +class Input2(BaseModel): + messages: List[Nullable[Any]] + + +class Input1TypedDict(TypedDict): + prompt: str + + +class Input1(BaseModel): + prompt: str + + +InputUnionTypedDict = TypeAliasType( + "InputUnionTypedDict", Union[Input1TypedDict, Input2TypedDict] +) +r"""The input to the generation — either a prompt string or an array of messages""" + + +InputUnion = TypeAliasType("InputUnion", Union[Input1, Input2]) +r"""The input to the generation — either a prompt string or an array of messages""" + + +class GenerationContentDataOutputTypedDict(TypedDict): + r"""The output from the generation""" + + completion: Nullable[str] + r"""The completion output""" + reasoning: Nullable[str] + r"""Reasoning/thinking output, if any""" + + +class GenerationContentDataOutput(BaseModel): + r"""The output from the generation""" + + completion: Nullable[str] + r"""The completion output""" + + reasoning: Nullable[str] + r"""Reasoning/thinking output, if any""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = [] + nullable_fields = ["completion", "reasoning"] + null_default_fields = [] + + serialized = handler(self) + + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + serialized.pop(k, None) + + optional_nullable = k in optional_fields and k in nullable_fields + is_set = ( + self.__pydantic_fields_set__.intersection({n}) + or k in null_default_fields + ) # pylint: disable=no-member + + if val is not None and val != UNSET_SENTINEL: + m[k] = val + elif val != UNSET_SENTINEL and ( + not k in optional_fields or (optional_nullable and is_set) + ): + m[k] = val + + return m + + +class GenerationContentDataTypedDict(TypedDict): + r"""Stored prompt and completion content""" + + input: InputUnionTypedDict + r"""The input to the generation — either a prompt string or an array of messages""" + output: GenerationContentDataOutputTypedDict + r"""The output from the generation""" + + +class GenerationContentData(BaseModel): + r"""Stored prompt and completion content""" + + input: InputUnion + r"""The input to the generation — either a prompt string or an array of messages""" + + output: GenerationContentDataOutput + r"""The output from the generation""" diff --git a/src/openrouter/components/generationcontentresponse.py b/src/openrouter/components/generationcontentresponse.py new file mode 100644 index 0000000..b762f65 --- /dev/null +++ b/src/openrouter/components/generationcontentresponse.py @@ -0,0 +1,20 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .generationcontentdata import GenerationContentData, GenerationContentDataTypedDict +from openrouter.types import BaseModel +from typing_extensions import TypedDict + + +class GenerationContentResponseTypedDict(TypedDict): + r"""Stored prompt and completion content for a generation""" + + data: GenerationContentDataTypedDict + r"""Stored prompt and completion content""" + + +class GenerationContentResponse(BaseModel): + r"""Stored prompt and completion content for a generation""" + + data: GenerationContentData + r"""Stored prompt and completion content""" diff --git a/src/openrouter/components/generationresponse.py b/src/openrouter/components/generationresponse.py new file mode 100644 index 0000000..4dedb7a --- /dev/null +++ b/src/openrouter/components/generationresponse.py @@ -0,0 +1,317 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .providerresponse import ProviderResponse, ProviderResponseTypedDict +from openrouter.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, + UnrecognizedStr, +) +from openrouter.utils import validate_open_enum +from pydantic import model_serializer +from pydantic.functional_validators import PlainValidator +from typing import List, Literal, Union +from typing_extensions import Annotated, NotRequired, TypedDict + + +APIType = Union[ + Literal[ + "completions", + "embeddings", + "rerank", + "tts", + "video", + ], + UnrecognizedStr, +] +r"""Type of API used for the generation""" + + +class GenerationResponseDataTypedDict(TypedDict): + r"""Generation data""" + + api_type: Nullable[APIType] + r"""Type of API used for the generation""" + app_id: Nullable[int] + r"""ID of the app that made the request""" + cache_discount: Nullable[float] + r"""Discount applied due to caching""" + cancelled: Nullable[bool] + r"""Whether the generation was cancelled""" + created_at: str + r"""ISO 8601 timestamp of when the generation was created""" + external_user: Nullable[str] + r"""External user identifier""" + finish_reason: Nullable[str] + r"""Reason the generation finished""" + generation_time: Nullable[float] + r"""Time taken for generation in milliseconds""" + http_referer: Nullable[str] + r"""Referer header from the request""" + id: str + r"""Unique identifier for the generation""" + is_byok: bool + r"""Whether this used bring-your-own-key""" + latency: Nullable[float] + r"""Total latency in milliseconds""" + model: str + r"""Model used for the generation""" + moderation_latency: Nullable[float] + r"""Moderation latency in milliseconds""" + native_finish_reason: Nullable[str] + r"""Native finish reason as reported by provider""" + native_tokens_cached: Nullable[int] + r"""Native cached tokens as reported by provider""" + native_tokens_completion: Nullable[int] + r"""Native completion tokens as reported by provider""" + native_tokens_completion_images: Nullable[int] + r"""Native completion image tokens as reported by provider""" + native_tokens_prompt: Nullable[int] + r"""Native prompt tokens as reported by provider""" + native_tokens_reasoning: Nullable[int] + r"""Native reasoning tokens as reported by provider""" + num_fetches: Nullable[int] + r"""Number of web fetches performed""" + num_input_audio_prompt: Nullable[int] + r"""Number of audio inputs in the prompt""" + num_media_completion: Nullable[int] + r"""Number of media items in the completion""" + num_media_prompt: Nullable[int] + r"""Number of media items in the prompt""" + num_search_results: Nullable[int] + r"""Number of search results included""" + origin: str + r"""Origin URL of the request""" + provider_name: Nullable[str] + r"""Name of the provider that served the request""" + provider_responses: Nullable[List[ProviderResponseTypedDict]] + r"""List of provider responses for this generation, including fallback attempts""" + router: Nullable[str] + r"""Router used for the request (e.g., openrouter/auto)""" + streamed: Nullable[bool] + r"""Whether the response was streamed""" + tokens_completion: Nullable[int] + r"""Number of tokens in the completion""" + tokens_prompt: Nullable[int] + r"""Number of tokens in the prompt""" + total_cost: float + r"""Total cost of the generation in USD""" + upstream_id: Nullable[str] + r"""Upstream provider's identifier for this generation""" + upstream_inference_cost: Nullable[float] + r"""Cost charged by the upstream provider""" + usage: float + r"""Usage amount in USD""" + user_agent: Nullable[str] + r"""User-Agent header from the request""" + web_search_engine: Nullable[str] + r"""The resolved web search engine used for this generation (e.g. exa, firecrawl, parallel)""" + request_id: NotRequired[Nullable[str]] + r"""Unique identifier grouping all generations from a single API request""" + session_id: NotRequired[Nullable[str]] + r"""Session identifier grouping multiple generations in the same session""" + + +class GenerationResponseData(BaseModel): + r"""Generation data""" + + api_type: Annotated[Nullable[APIType], PlainValidator(validate_open_enum(False))] + r"""Type of API used for the generation""" + + app_id: Nullable[int] + r"""ID of the app that made the request""" + + cache_discount: Nullable[float] + r"""Discount applied due to caching""" + + cancelled: Nullable[bool] + r"""Whether the generation was cancelled""" + + created_at: str + r"""ISO 8601 timestamp of when the generation was created""" + + external_user: Nullable[str] + r"""External user identifier""" + + finish_reason: Nullable[str] + r"""Reason the generation finished""" + + generation_time: Nullable[float] + r"""Time taken for generation in milliseconds""" + + http_referer: Nullable[str] + r"""Referer header from the request""" + + id: str + r"""Unique identifier for the generation""" + + is_byok: bool + r"""Whether this used bring-your-own-key""" + + latency: Nullable[float] + r"""Total latency in milliseconds""" + + model: str + r"""Model used for the generation""" + + moderation_latency: Nullable[float] + r"""Moderation latency in milliseconds""" + + native_finish_reason: Nullable[str] + r"""Native finish reason as reported by provider""" + + native_tokens_cached: Nullable[int] + r"""Native cached tokens as reported by provider""" + + native_tokens_completion: Nullable[int] + r"""Native completion tokens as reported by provider""" + + native_tokens_completion_images: Nullable[int] + r"""Native completion image tokens as reported by provider""" + + native_tokens_prompt: Nullable[int] + r"""Native prompt tokens as reported by provider""" + + native_tokens_reasoning: Nullable[int] + r"""Native reasoning tokens as reported by provider""" + + num_fetches: Nullable[int] + r"""Number of web fetches performed""" + + num_input_audio_prompt: Nullable[int] + r"""Number of audio inputs in the prompt""" + + num_media_completion: Nullable[int] + r"""Number of media items in the completion""" + + num_media_prompt: Nullable[int] + r"""Number of media items in the prompt""" + + num_search_results: Nullable[int] + r"""Number of search results included""" + + origin: str + r"""Origin URL of the request""" + + provider_name: Nullable[str] + r"""Name of the provider that served the request""" + + provider_responses: Nullable[List[ProviderResponse]] + r"""List of provider responses for this generation, including fallback attempts""" + + router: Nullable[str] + r"""Router used for the request (e.g., openrouter/auto)""" + + streamed: Nullable[bool] + r"""Whether the response was streamed""" + + tokens_completion: Nullable[int] + r"""Number of tokens in the completion""" + + tokens_prompt: Nullable[int] + r"""Number of tokens in the prompt""" + + total_cost: float + r"""Total cost of the generation in USD""" + + upstream_id: Nullable[str] + r"""Upstream provider's identifier for this generation""" + + upstream_inference_cost: Nullable[float] + r"""Cost charged by the upstream provider""" + + usage: float + r"""Usage amount in USD""" + + user_agent: Nullable[str] + r"""User-Agent header from the request""" + + web_search_engine: Nullable[str] + r"""The resolved web search engine used for this generation (e.g. exa, firecrawl, parallel)""" + + request_id: OptionalNullable[str] = UNSET + r"""Unique identifier grouping all generations from a single API request""" + + session_id: OptionalNullable[str] = UNSET + r"""Session identifier grouping multiple generations in the same session""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = ["request_id", "session_id"] + nullable_fields = [ + "api_type", + "app_id", + "cache_discount", + "cancelled", + "external_user", + "finish_reason", + "generation_time", + "http_referer", + "latency", + "moderation_latency", + "native_finish_reason", + "native_tokens_cached", + "native_tokens_completion", + "native_tokens_completion_images", + "native_tokens_prompt", + "native_tokens_reasoning", + "num_fetches", + "num_input_audio_prompt", + "num_media_completion", + "num_media_prompt", + "num_search_results", + "provider_name", + "provider_responses", + "request_id", + "router", + "session_id", + "streamed", + "tokens_completion", + "tokens_prompt", + "upstream_id", + "upstream_inference_cost", + "user_agent", + "web_search_engine", + ] + null_default_fields = [] + + serialized = handler(self) + + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + serialized.pop(k, None) + + optional_nullable = k in optional_fields and k in nullable_fields + is_set = ( + self.__pydantic_fields_set__.intersection({n}) + or k in null_default_fields + ) # pylint: disable=no-member + + if val is not None and val != UNSET_SENTINEL: + m[k] = val + elif val != UNSET_SENTINEL and ( + not k in optional_fields or (optional_nullable and is_set) + ): + m[k] = val + + return m + + +class GenerationResponseTypedDict(TypedDict): + r"""Generation response""" + + data: GenerationResponseDataTypedDict + r"""Generation data""" + + +class GenerationResponse(BaseModel): + r"""Generation response""" + + data: GenerationResponseData + r"""Generation data""" diff --git a/src/openrouter/components/getworkspaceresponse.py b/src/openrouter/components/getworkspaceresponse.py new file mode 100644 index 0000000..acda534 --- /dev/null +++ b/src/openrouter/components/getworkspaceresponse.py @@ -0,0 +1,14 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .workspace import Workspace, WorkspaceTypedDict +from openrouter.types import BaseModel +from typing_extensions import TypedDict + + +class GetWorkspaceResponseTypedDict(TypedDict): + data: WorkspaceTypedDict + + +class GetWorkspaceResponse(BaseModel): + data: Workspace diff --git a/src/openrouter/components/guardrail.py b/src/openrouter/components/guardrail.py index afc25c7..64bb092 100644 --- a/src/openrouter/components/guardrail.py +++ b/src/openrouter/components/guardrail.py @@ -23,6 +23,8 @@ class GuardrailTypedDict(TypedDict): r"""Unique identifier for the guardrail""" name: str r"""Name of the guardrail""" + workspace_id: str + r"""The workspace ID this guardrail belongs to.""" allowed_models: NotRequired[Nullable[List[str]]] r"""Array of model canonical_slugs (immutable identifiers)""" allowed_providers: NotRequired[Nullable[List[str]]] @@ -53,6 +55,9 @@ class Guardrail(BaseModel): name: str r"""Name of the guardrail""" + workspace_id: str + r"""The workspace ID this guardrail belongs to.""" + allowed_models: OptionalNullable[List[str]] = UNSET r"""Array of model canonical_slugs (immutable identifiers)""" diff --git a/src/openrouter/components/imagegenerationservertoolconfig.py b/src/openrouter/components/imagegenerationservertoolconfig.py index 7b7010a..0fdc8f6 100644 --- a/src/openrouter/components/imagegenerationservertoolconfig.py +++ b/src/openrouter/components/imagegenerationservertoolconfig.py @@ -13,7 +13,7 @@ class ImageGenerationServerToolConfigTypedDict(TypedDict): r"""Configuration for the openrouter:image_generation server tool. Accepts all image_config params (aspect_ratio, quality, size, background, output_format, output_compression, moderation, etc.) plus a model field.""" model: NotRequired[str] - r"""Which image generation model to use (e.g. \"openai/gpt-image-1\"). Defaults to \"openai/gpt-image-1\".""" + r"""Which image generation model to use (e.g. \"openai/gpt-5-image\"). Defaults to \"openai/gpt-5-image\".""" class ImageGenerationServerToolConfig(BaseModel): @@ -27,7 +27,7 @@ class ImageGenerationServerToolConfig(BaseModel): ) model: Optional[str] = None - r"""Which image generation model to use (e.g. \"openai/gpt-image-1\"). Defaults to \"openai/gpt-image-1\".""" + r"""Which image generation model to use (e.g. \"openai/gpt-5-image\"). Defaults to \"openai/gpt-5-image\".""" @property def additional_properties(self): diff --git a/src/openrouter/components/listworkspacesresponse.py b/src/openrouter/components/listworkspacesresponse.py new file mode 100644 index 0000000..b70d4bb --- /dev/null +++ b/src/openrouter/components/listworkspacesresponse.py @@ -0,0 +1,22 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .workspace import Workspace, WorkspaceTypedDict +from openrouter.types import BaseModel +from typing import List +from typing_extensions import TypedDict + + +class ListWorkspacesResponseTypedDict(TypedDict): + data: List[WorkspaceTypedDict] + r"""List of workspaces""" + total_count: int + r"""Total number of workspaces""" + + +class ListWorkspacesResponse(BaseModel): + data: List[Workspace] + r"""List of workspaces""" + + total_count: int + r"""Total number of workspaces""" diff --git a/src/openrouter/components/modelscountresponse.py b/src/openrouter/components/modelscountresponse.py index 86bb27c..8d68ee4 100644 --- a/src/openrouter/components/modelscountresponse.py +++ b/src/openrouter/components/modelscountresponse.py @@ -5,14 +5,14 @@ from typing_extensions import TypedDict -class DataTypedDict(TypedDict): +class ModelsCountResponseDataTypedDict(TypedDict): r"""Model count data""" count: int r"""Total number of available models""" -class Data(BaseModel): +class ModelsCountResponseData(BaseModel): r"""Model count data""" count: int @@ -22,12 +22,12 @@ class Data(BaseModel): class ModelsCountResponseTypedDict(TypedDict): r"""Model count data""" - data: DataTypedDict + data: ModelsCountResponseDataTypedDict r"""Model count data""" class ModelsCountResponse(BaseModel): r"""Model count data""" - data: Data + data: ModelsCountResponseData r"""Model count data""" diff --git a/src/openrouter/components/openresponsesresult.py b/src/openrouter/components/openresponsesresult.py index fa04955..ea63258 100644 --- a/src/openrouter/components/openresponsesresult.py +++ b/src/openrouter/components/openresponsesresult.py @@ -39,7 +39,7 @@ from .responseserrorfield import ResponsesErrorField, ResponsesErrorFieldTypedDict from .shellservertool import ShellServerTool, ShellServerToolTypedDict from .storedprompttemplate import StoredPromptTemplate, StoredPromptTemplateTypedDict -from .textconfig import TextConfig, TextConfigTypedDict +from .textextendedconfig import TextExtendedConfig, TextExtendedConfigTypedDict from .truncation import Truncation from .usage import Usage, UsageTypedDict from .websearchservertool import WebSearchServerTool, WebSearchServerToolTypedDict @@ -195,7 +195,7 @@ class OpenResponsesResultTypedDict(TypedDict): safety_identifier: NotRequired[Nullable[str]] service_tier: NotRequired[Nullable[str]] store: NotRequired[bool] - text: NotRequired[TextConfigTypedDict] + text: NotRequired[TextExtendedConfigTypedDict] r"""Text output configuration including format and verbosity""" top_logprobs: NotRequired[int] truncation: NotRequired[Nullable[Truncation]] @@ -269,7 +269,7 @@ class OpenResponsesResult(BaseModel): store: Optional[bool] = None - text: Optional[TextConfig] = None + text: Optional[TextExtendedConfig] = None r"""Text output configuration including format and verbosity""" top_logprobs: Optional[int] = None diff --git a/src/openrouter/components/outputimagegenerationservertoolitem.py b/src/openrouter/components/outputimagegenerationservertoolitem.py index e91756b..a94bd09 100644 --- a/src/openrouter/components/outputimagegenerationservertoolitem.py +++ b/src/openrouter/components/outputimagegenerationservertoolitem.py @@ -2,9 +2,16 @@ from __future__ import annotations from .toolcallstatus import ToolCallStatus -from openrouter.types import BaseModel +from openrouter.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) from openrouter.utils import validate_open_enum import pydantic +from pydantic import model_serializer from pydantic.functional_validators import PlainValidator from typing import Literal, Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -21,6 +28,8 @@ class OutputImageGenerationServerToolItemTypedDict(TypedDict): id: NotRequired[str] image_b64: NotRequired[str] image_url: NotRequired[str] + result: NotRequired[Nullable[str]] + r"""The generated image as a base64-encoded string or URL, matching OpenAI image_generation_call format""" revised_prompt: NotRequired[str] @@ -37,6 +46,39 @@ class OutputImageGenerationServerToolItem(BaseModel): image_url: Annotated[Optional[str], pydantic.Field(alias="imageUrl")] = None + result: OptionalNullable[str] = UNSET + r"""The generated image as a base64-encoded string or URL, matching OpenAI image_generation_call format""" + revised_prompt: Annotated[Optional[str], pydantic.Field(alias="revisedPrompt")] = ( None ) + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = ["id", "imageB64", "imageUrl", "result", "revisedPrompt"] + nullable_fields = ["result"] + null_default_fields = [] + + serialized = handler(self) + + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + serialized.pop(k, None) + + optional_nullable = k in optional_fields and k in nullable_fields + is_set = ( + self.__pydantic_fields_set__.intersection({n}) + or k in null_default_fields + ) # pylint: disable=no-member + + if val is not None and val != UNSET_SENTINEL: + m[k] = val + elif val != UNSET_SENTINEL and ( + not k in optional_fields or (optional_nullable and is_set) + ): + m[k] = val + + return m diff --git a/src/openrouter/components/outputitems.py b/src/openrouter/components/outputitems.py index 4457f80..75ffbc5 100644 --- a/src/openrouter/components/outputitems.py +++ b/src/openrouter/components/outputitems.py @@ -56,6 +56,10 @@ ) from .outputmessageitem import OutputMessageItem, OutputMessageItemTypedDict from .outputreasoningitem import OutputReasoningItem, OutputReasoningItemTypedDict +from .outputsearchmodelsservertoolitem import ( + OutputSearchModelsServerToolItem, + OutputSearchModelsServerToolItemTypedDict, +) from .outputtexteditorservertoolitem import ( OutputTextEditorServerToolItem, OutputTextEditorServerToolItemTypedDict, @@ -94,18 +98,19 @@ OutputTextEditorServerToolItemTypedDict, OutputApplyPatchServerToolItemTypedDict, OutputDatetimeItemTypedDict, + OutputSearchModelsServerToolItemTypedDict, OutputMcpServerToolItemTypedDict, OutputBrowserUseServerToolItemTypedDict, OutputFunctionCallItemTypedDict, - OutputImageGenerationServerToolItemTypedDict, OutputMessageItemTypedDict, OutputComputerCallItemTypedDict, OutputWebFetchServerToolItemTypedDict, OutputMemoryServerToolItemTypedDict, OutputCodeInterpreterCallItemTypedDict, + OutputImageGenerationServerToolItemTypedDict, OutputBashServerToolItemTypedDict, - OutputCodeInterpreterServerToolItemTypedDict, OutputReasoningItemTypedDict, + OutputCodeInterpreterServerToolItemTypedDict, ], ) r"""An output item from the response""" @@ -126,6 +131,10 @@ OutputCodeInterpreterServerToolItem, Tag("openrouter:code_interpreter") ], Annotated[OutputDatetimeItem, Tag("openrouter:datetime")], + Annotated[ + OutputSearchModelsServerToolItem, + Tag("openrouter:experimental__search_models"), + ], Annotated[OutputFileSearchServerToolItem, Tag("openrouter:file_search")], Annotated[ OutputImageGenerationServerToolItem, Tag("openrouter:image_generation") diff --git a/src/openrouter/components/outputmodality.py b/src/openrouter/components/outputmodality.py index c926bb6..4d38da6 100644 --- a/src/openrouter/components/outputmodality.py +++ b/src/openrouter/components/outputmodality.py @@ -13,6 +13,7 @@ "audio", "video", "rerank", + "tts", ], UnrecognizedStr, ] diff --git a/src/openrouter/components/outputsearchmodelsservertoolitem.py b/src/openrouter/components/outputsearchmodelsservertoolitem.py new file mode 100644 index 0000000..f94949d --- /dev/null +++ b/src/openrouter/components/outputsearchmodelsservertoolitem.py @@ -0,0 +1,40 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .toolcallstatus import ToolCallStatus +from openrouter.types import BaseModel +from openrouter.utils import validate_open_enum +from pydantic.functional_validators import PlainValidator +from typing import Literal, Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +OutputSearchModelsServerToolItemType = Literal[ + "openrouter:experimental__search_models", +] + + +class OutputSearchModelsServerToolItemTypedDict(TypedDict): + r"""An openrouter:experimental__search_models server tool output item""" + + status: ToolCallStatus + type: OutputSearchModelsServerToolItemType + arguments: NotRequired[str] + r"""The JSON arguments submitted to the search tool (e.g. {\"query\":\"Claude\"})""" + id: NotRequired[str] + query: NotRequired[str] + + +class OutputSearchModelsServerToolItem(BaseModel): + r"""An openrouter:experimental__search_models server tool output item""" + + status: Annotated[ToolCallStatus, PlainValidator(validate_open_enum(False))] + + type: OutputSearchModelsServerToolItemType + + arguments: Optional[str] = None + r"""The JSON arguments submitted to the search tool (e.g. {\"query\":\"Claude\"})""" + + id: Optional[str] = None + + query: Optional[str] = None diff --git a/src/openrouter/components/paretorouterplugin.py b/src/openrouter/components/paretorouterplugin.py new file mode 100644 index 0000000..6b12a70 --- /dev/null +++ b/src/openrouter/components/paretorouterplugin.py @@ -0,0 +1,27 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel +from typing import Literal, Optional +from typing_extensions import NotRequired, TypedDict + + +ParetoRouterPluginID = Literal["pareto-router",] + + +class ParetoRouterPluginTypedDict(TypedDict): + id: ParetoRouterPluginID + enabled: NotRequired[bool] + r"""Set to false to disable the pareto-router plugin for this request. Defaults to true.""" + min_coding_score: NotRequired[float] + r"""Minimum desired coding score between 0 and 1, where 1 is best. Higher values select from stronger coding models (sourced from Artificial Analysis coding percentiles). Maps internally to one of three tiers (low, medium, high). Omit to use the router default tier.""" + + +class ParetoRouterPlugin(BaseModel): + id: ParetoRouterPluginID + + enabled: Optional[bool] = None + r"""Set to false to disable the pareto-router plugin for this request. Defaults to true.""" + + min_coding_score: Optional[float] = None + r"""Minimum desired coding score between 0 and 1, where 1 is best. Higher values select from stronger coding models (sourced from Artificial Analysis coding percentiles). Maps internally to one of three tiers (low, medium, high). Omit to use the router default tier.""" diff --git a/src/openrouter/components/providername.py b/src/openrouter/components/providername.py index 7764a12..109379a 100644 --- a/src/openrouter/components/providername.py +++ b/src/openrouter/components/providername.py @@ -12,6 +12,7 @@ "AionLabs", "Alibaba", "Ambient", + "Baidu", "Amazon Bedrock", "Amazon Nova", "Anthropic", diff --git a/src/openrouter/components/providerresponse.py b/src/openrouter/components/providerresponse.py index 4856eee..14f4f7e 100644 --- a/src/openrouter/components/providerresponse.py +++ b/src/openrouter/components/providerresponse.py @@ -44,6 +44,7 @@ "AionLabs", "Alibaba", "Ambient", + "Baidu", "Amazon Bedrock", "Amazon Nova", "Anthropic", diff --git a/src/openrouter/components/responsesrequest.py b/src/openrouter/components/responsesrequest.py index 357c19a..6b45ef7 100644 --- a/src/openrouter/components/responsesrequest.py +++ b/src/openrouter/components/responsesrequest.py @@ -43,6 +43,7 @@ ) from .openairesponsestruncation import OpenAIResponsesTruncation from .outputmodalityenum import OutputModalityEnum +from .paretorouterplugin import ParetoRouterPlugin, ParetoRouterPluginTypedDict from .preview_20250311_websearchservertool import ( Preview20250311WebSearchServerTool, Preview20250311WebSearchServerToolTypedDict, @@ -59,6 +60,7 @@ from .storedprompttemplate import StoredPromptTemplate, StoredPromptTemplateTypedDict from .textextendedconfig import TextExtendedConfig, TextExtendedConfigTypedDict from .traceconfig import TraceConfig, TraceConfigTypedDict +from .webfetchservertool import WebFetchServerTool, WebFetchServerToolTypedDict from .websearchplugin import WebSearchPlugin, WebSearchPluginTypedDict from .websearchservertool import WebSearchServerTool, WebSearchServerToolTypedDict from .websearchservertool_openrouter import ( @@ -89,6 +91,7 @@ AutoRouterPluginTypedDict, FileParserPluginTypedDict, ContextCompressionPluginTypedDict, + ParetoRouterPluginTypedDict, WebSearchPluginTypedDict, ], ) @@ -100,6 +103,7 @@ Annotated[ContextCompressionPlugin, Tag("context-compression")], Annotated[FileParserPlugin, Tag("file-parser")], Annotated[ModerationPlugin, Tag("moderation")], + Annotated[ParetoRouterPlugin, Tag("pareto-router")], Annotated[ResponseHealingPlugin, Tag("response-healing")], Annotated[WebSearchPlugin, Tag("web")], ], @@ -179,14 +183,15 @@ def serialize_model(self, handler): ResponsesRequestToolUnionTypedDict = TypeAliasType( "ResponsesRequestToolUnionTypedDict", Union[ - ApplyPatchServerToolTypedDict, CodexLocalShellToolTypedDict, + ApplyPatchServerToolTypedDict, ShellServerToolTypedDict, - WebSearchServerToolOpenRouterTypedDict, - ChatSearchModelsServerToolTypedDict, - ImageGenerationServerToolOpenRouterTypedDict, - CodeInterpreterServerToolTypedDict, DatetimeServerToolTypedDict, + CodeInterpreterServerToolTypedDict, + ImageGenerationServerToolOpenRouterTypedDict, + ChatSearchModelsServerToolTypedDict, + WebFetchServerToolTypedDict, + WebSearchServerToolOpenRouterTypedDict, ComputerUseServerToolTypedDict, CustomToolTypedDict, ResponsesRequestToolFunctionTypedDict, @@ -226,6 +231,7 @@ def serialize_model(self, handler): Annotated[ ChatSearchModelsServerTool, Tag("openrouter:experimental__search_models") ], + Annotated[WebFetchServerTool, Tag("openrouter:web_fetch")], Annotated[WebSearchServerToolOpenRouter, Tag("openrouter:web_search")], ], Discriminator(lambda m: get_discriminator(m, "type", "type")), diff --git a/src/openrouter/components/searchqualitylevel.py b/src/openrouter/components/searchqualitylevel.py index 36eba03..b5ed4f1 100644 --- a/src/openrouter/components/searchqualitylevel.py +++ b/src/openrouter/components/searchqualitylevel.py @@ -13,4 +13,4 @@ ], UnrecognizedStr, ] -r"""How much context to retrieve per result. Defaults to medium (15000 chars). Only applies when using the Exa engine; ignored with native provider search.""" +r"""How much context to retrieve per result. Defaults to medium (15000 chars). Applies to Exa and Parallel engines; ignored with native provider search and Firecrawl.""" diff --git a/src/openrouter/components/speechrequest.py b/src/openrouter/components/speechrequest.py new file mode 100644 index 0000000..50eda11 --- /dev/null +++ b/src/openrouter/components/speechrequest.py @@ -0,0 +1,446 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel, Nullable, UnrecognizedStr +from openrouter.utils import validate_open_enum +import pydantic +from pydantic.functional_validators import PlainValidator +from typing import Any, Dict, Literal, Optional, Union +from typing_extensions import Annotated, NotRequired, TypedDict + + +class SpeechRequestOptionsTypedDict(TypedDict): + r"""Provider-specific options keyed by provider slug. The options for the matched provider are spread into the upstream request body.""" + + oneai: NotRequired[Dict[str, Nullable[Any]]] + ai21: NotRequired[Dict[str, Nullable[Any]]] + aion_labs: NotRequired[Dict[str, Nullable[Any]]] + akashml: NotRequired[Dict[str, Nullable[Any]]] + alibaba: NotRequired[Dict[str, Nullable[Any]]] + amazon_bedrock: NotRequired[Dict[str, Nullable[Any]]] + amazon_nova: NotRequired[Dict[str, Nullable[Any]]] + ambient: NotRequired[Dict[str, Nullable[Any]]] + anthropic: NotRequired[Dict[str, Nullable[Any]]] + anyscale: NotRequired[Dict[str, Nullable[Any]]] + arcee_ai: NotRequired[Dict[str, Nullable[Any]]] + atlas_cloud: NotRequired[Dict[str, Nullable[Any]]] + atoma: NotRequired[Dict[str, Nullable[Any]]] + avian: NotRequired[Dict[str, Nullable[Any]]] + azure: NotRequired[Dict[str, Nullable[Any]]] + baidu: NotRequired[Dict[str, Nullable[Any]]] + baseten: NotRequired[Dict[str, Nullable[Any]]] + black_forest_labs: NotRequired[Dict[str, Nullable[Any]]] + byteplus: NotRequired[Dict[str, Nullable[Any]]] + centml: NotRequired[Dict[str, Nullable[Any]]] + cerebras: NotRequired[Dict[str, Nullable[Any]]] + chutes: NotRequired[Dict[str, Nullable[Any]]] + cirrascale: NotRequired[Dict[str, Nullable[Any]]] + clarifai: NotRequired[Dict[str, Nullable[Any]]] + cloudflare: NotRequired[Dict[str, Nullable[Any]]] + cohere: NotRequired[Dict[str, Nullable[Any]]] + crofai: NotRequired[Dict[str, Nullable[Any]]] + crusoe: NotRequired[Dict[str, Nullable[Any]]] + deepinfra: NotRequired[Dict[str, Nullable[Any]]] + deepseek: NotRequired[Dict[str, Nullable[Any]]] + dekallm: NotRequired[Dict[str, Nullable[Any]]] + enfer: NotRequired[Dict[str, Nullable[Any]]] + fake_provider: NotRequired[Dict[str, Nullable[Any]]] + featherless: NotRequired[Dict[str, Nullable[Any]]] + fireworks: NotRequired[Dict[str, Nullable[Any]]] + friendli: NotRequired[Dict[str, Nullable[Any]]] + gmicloud: NotRequired[Dict[str, Nullable[Any]]] + google_ai_studio: NotRequired[Dict[str, Nullable[Any]]] + google_vertex: NotRequired[Dict[str, Nullable[Any]]] + gopomelo: NotRequired[Dict[str, Nullable[Any]]] + groq: NotRequired[Dict[str, Nullable[Any]]] + huggingface: NotRequired[Dict[str, Nullable[Any]]] + hyperbolic: NotRequired[Dict[str, Nullable[Any]]] + hyperbolic_quantized: NotRequired[Dict[str, Nullable[Any]]] + inception: NotRequired[Dict[str, Nullable[Any]]] + inceptron: NotRequired[Dict[str, Nullable[Any]]] + inference_net: NotRequired[Dict[str, Nullable[Any]]] + infermatic: NotRequired[Dict[str, Nullable[Any]]] + inflection: NotRequired[Dict[str, Nullable[Any]]] + inocloud: NotRequired[Dict[str, Nullable[Any]]] + io_net: NotRequired[Dict[str, Nullable[Any]]] + ionstream: NotRequired[Dict[str, Nullable[Any]]] + klusterai: NotRequired[Dict[str, Nullable[Any]]] + lambda_: NotRequired[Dict[str, Nullable[Any]]] + lepton: NotRequired[Dict[str, Nullable[Any]]] + liquid: NotRequired[Dict[str, Nullable[Any]]] + lynn: NotRequired[Dict[str, Nullable[Any]]] + lynn_private: NotRequired[Dict[str, Nullable[Any]]] + mancer: NotRequired[Dict[str, Nullable[Any]]] + mancer_old: NotRequired[Dict[str, Nullable[Any]]] + mara: NotRequired[Dict[str, Nullable[Any]]] + meta: NotRequired[Dict[str, Nullable[Any]]] + minimax: NotRequired[Dict[str, Nullable[Any]]] + mistral: NotRequired[Dict[str, Nullable[Any]]] + modal: NotRequired[Dict[str, Nullable[Any]]] + modelrun: NotRequired[Dict[str, Nullable[Any]]] + modular: NotRequired[Dict[str, Nullable[Any]]] + moonshotai: NotRequired[Dict[str, Nullable[Any]]] + morph: NotRequired[Dict[str, Nullable[Any]]] + ncompass: NotRequired[Dict[str, Nullable[Any]]] + nebius: NotRequired[Dict[str, Nullable[Any]]] + nextbit: NotRequired[Dict[str, Nullable[Any]]] + nineteen: NotRequired[Dict[str, Nullable[Any]]] + novita: NotRequired[Dict[str, Nullable[Any]]] + nvidia: NotRequired[Dict[str, Nullable[Any]]] + octoai: NotRequired[Dict[str, Nullable[Any]]] + open_inference: NotRequired[Dict[str, Nullable[Any]]] + openai: NotRequired[Dict[str, Nullable[Any]]] + parasail: NotRequired[Dict[str, Nullable[Any]]] + perplexity: NotRequired[Dict[str, Nullable[Any]]] + phala: NotRequired[Dict[str, Nullable[Any]]] + recraft: NotRequired[Dict[str, Nullable[Any]]] + recursal: NotRequired[Dict[str, Nullable[Any]]] + reflection: NotRequired[Dict[str, Nullable[Any]]] + reka: NotRequired[Dict[str, Nullable[Any]]] + relace: NotRequired[Dict[str, Nullable[Any]]] + replicate: NotRequired[Dict[str, Nullable[Any]]] + sambanova: NotRequired[Dict[str, Nullable[Any]]] + sambanova_cloaked: NotRequired[Dict[str, Nullable[Any]]] + seed: NotRequired[Dict[str, Nullable[Any]]] + sf_compute: NotRequired[Dict[str, Nullable[Any]]] + siliconflow: NotRequired[Dict[str, Nullable[Any]]] + sourceful: NotRequired[Dict[str, Nullable[Any]]] + stealth: NotRequired[Dict[str, Nullable[Any]]] + stepfun: NotRequired[Dict[str, Nullable[Any]]] + streamlake: NotRequired[Dict[str, Nullable[Any]]] + switchpoint: NotRequired[Dict[str, Nullable[Any]]] + targon: NotRequired[Dict[str, Nullable[Any]]] + together: NotRequired[Dict[str, Nullable[Any]]] + together_lite: NotRequired[Dict[str, Nullable[Any]]] + ubicloud: NotRequired[Dict[str, Nullable[Any]]] + upstage: NotRequired[Dict[str, Nullable[Any]]] + venice: NotRequired[Dict[str, Nullable[Any]]] + wandb: NotRequired[Dict[str, Nullable[Any]]] + xai: NotRequired[Dict[str, Nullable[Any]]] + xiaomi: NotRequired[Dict[str, Nullable[Any]]] + z_ai: NotRequired[Dict[str, Nullable[Any]]] + + +class SpeechRequestOptions(BaseModel): + r"""Provider-specific options keyed by provider slug. The options for the matched provider are spread into the upstream request body.""" + + oneai: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="01ai") + ] = None + + ai21: Optional[Dict[str, Nullable[Any]]] = None + + aion_labs: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="aion-labs") + ] = None + + akashml: Optional[Dict[str, Nullable[Any]]] = None + + alibaba: Optional[Dict[str, Nullable[Any]]] = None + + amazon_bedrock: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="amazon-bedrock") + ] = None + + amazon_nova: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="amazon-nova") + ] = None + + ambient: Optional[Dict[str, Nullable[Any]]] = None + + anthropic: Optional[Dict[str, Nullable[Any]]] = None + + anyscale: Optional[Dict[str, Nullable[Any]]] = None + + arcee_ai: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="arcee-ai") + ] = None + + atlas_cloud: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="atlas-cloud") + ] = None + + atoma: Optional[Dict[str, Nullable[Any]]] = None + + avian: Optional[Dict[str, Nullable[Any]]] = None + + azure: Optional[Dict[str, Nullable[Any]]] = None + + baidu: Optional[Dict[str, Nullable[Any]]] = None + + baseten: Optional[Dict[str, Nullable[Any]]] = None + + black_forest_labs: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="black-forest-labs") + ] = None + + byteplus: Optional[Dict[str, Nullable[Any]]] = None + + centml: Optional[Dict[str, Nullable[Any]]] = None + + cerebras: Optional[Dict[str, Nullable[Any]]] = None + + chutes: Optional[Dict[str, Nullable[Any]]] = None + + cirrascale: Optional[Dict[str, Nullable[Any]]] = None + + clarifai: Optional[Dict[str, Nullable[Any]]] = None + + cloudflare: Optional[Dict[str, Nullable[Any]]] = None + + cohere: Optional[Dict[str, Nullable[Any]]] = None + + crofai: Optional[Dict[str, Nullable[Any]]] = None + + crusoe: Optional[Dict[str, Nullable[Any]]] = None + + deepinfra: Optional[Dict[str, Nullable[Any]]] = None + + deepseek: Optional[Dict[str, Nullable[Any]]] = None + + dekallm: Optional[Dict[str, Nullable[Any]]] = None + + enfer: Optional[Dict[str, Nullable[Any]]] = None + + fake_provider: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="fake-provider") + ] = None + + featherless: Optional[Dict[str, Nullable[Any]]] = None + + fireworks: Optional[Dict[str, Nullable[Any]]] = None + + friendli: Optional[Dict[str, Nullable[Any]]] = None + + gmicloud: Optional[Dict[str, Nullable[Any]]] = None + + google_ai_studio: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="google-ai-studio") + ] = None + + google_vertex: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="google-vertex") + ] = None + + gopomelo: Optional[Dict[str, Nullable[Any]]] = None + + groq: Optional[Dict[str, Nullable[Any]]] = None + + huggingface: Optional[Dict[str, Nullable[Any]]] = None + + hyperbolic: Optional[Dict[str, Nullable[Any]]] = None + + hyperbolic_quantized: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="hyperbolic-quantized") + ] = None + + inception: Optional[Dict[str, Nullable[Any]]] = None + + inceptron: Optional[Dict[str, Nullable[Any]]] = None + + inference_net: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="inference-net") + ] = None + + infermatic: Optional[Dict[str, Nullable[Any]]] = None + + inflection: Optional[Dict[str, Nullable[Any]]] = None + + inocloud: Optional[Dict[str, Nullable[Any]]] = None + + io_net: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="io-net") + ] = None + + ionstream: Optional[Dict[str, Nullable[Any]]] = None + + klusterai: Optional[Dict[str, Nullable[Any]]] = None + + lambda_: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="lambda") + ] = None + + lepton: Optional[Dict[str, Nullable[Any]]] = None + + liquid: Optional[Dict[str, Nullable[Any]]] = None + + lynn: Optional[Dict[str, Nullable[Any]]] = None + + lynn_private: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="lynn-private") + ] = None + + mancer: Optional[Dict[str, Nullable[Any]]] = None + + mancer_old: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="mancer-old") + ] = None + + mara: Optional[Dict[str, Nullable[Any]]] = None + + meta: Optional[Dict[str, Nullable[Any]]] = None + + minimax: Optional[Dict[str, Nullable[Any]]] = None + + mistral: Optional[Dict[str, Nullable[Any]]] = None + + modal: Optional[Dict[str, Nullable[Any]]] = None + + modelrun: Optional[Dict[str, Nullable[Any]]] = None + + modular: Optional[Dict[str, Nullable[Any]]] = None + + moonshotai: Optional[Dict[str, Nullable[Any]]] = None + + morph: Optional[Dict[str, Nullable[Any]]] = None + + ncompass: Optional[Dict[str, Nullable[Any]]] = None + + nebius: Optional[Dict[str, Nullable[Any]]] = None + + nextbit: Optional[Dict[str, Nullable[Any]]] = None + + nineteen: Optional[Dict[str, Nullable[Any]]] = None + + novita: Optional[Dict[str, Nullable[Any]]] = None + + nvidia: Optional[Dict[str, Nullable[Any]]] = None + + octoai: Optional[Dict[str, Nullable[Any]]] = None + + open_inference: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="open-inference") + ] = None + + openai: Optional[Dict[str, Nullable[Any]]] = None + + parasail: Optional[Dict[str, Nullable[Any]]] = None + + perplexity: Optional[Dict[str, Nullable[Any]]] = None + + phala: Optional[Dict[str, Nullable[Any]]] = None + + recraft: Optional[Dict[str, Nullable[Any]]] = None + + recursal: Optional[Dict[str, Nullable[Any]]] = None + + reflection: Optional[Dict[str, Nullable[Any]]] = None + + reka: Optional[Dict[str, Nullable[Any]]] = None + + relace: Optional[Dict[str, Nullable[Any]]] = None + + replicate: Optional[Dict[str, Nullable[Any]]] = None + + sambanova: Optional[Dict[str, Nullable[Any]]] = None + + sambanova_cloaked: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="sambanova-cloaked") + ] = None + + seed: Optional[Dict[str, Nullable[Any]]] = None + + sf_compute: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="sf-compute") + ] = None + + siliconflow: Optional[Dict[str, Nullable[Any]]] = None + + sourceful: Optional[Dict[str, Nullable[Any]]] = None + + stealth: Optional[Dict[str, Nullable[Any]]] = None + + stepfun: Optional[Dict[str, Nullable[Any]]] = None + + streamlake: Optional[Dict[str, Nullable[Any]]] = None + + switchpoint: Optional[Dict[str, Nullable[Any]]] = None + + targon: Optional[Dict[str, Nullable[Any]]] = None + + together: Optional[Dict[str, Nullable[Any]]] = None + + together_lite: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="together-lite") + ] = None + + ubicloud: Optional[Dict[str, Nullable[Any]]] = None + + upstage: Optional[Dict[str, Nullable[Any]]] = None + + venice: Optional[Dict[str, Nullable[Any]]] = None + + wandb: Optional[Dict[str, Nullable[Any]]] = None + + xai: Optional[Dict[str, Nullable[Any]]] = None + + xiaomi: Optional[Dict[str, Nullable[Any]]] = None + + z_ai: Annotated[ + Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="z-ai") + ] = None + + +class SpeechRequestProviderTypedDict(TypedDict): + r"""Provider-specific passthrough configuration""" + + options: NotRequired[SpeechRequestOptionsTypedDict] + r"""Provider-specific options keyed by provider slug. The options for the matched provider are spread into the upstream request body.""" + + +class SpeechRequestProvider(BaseModel): + r"""Provider-specific passthrough configuration""" + + options: Optional[SpeechRequestOptions] = None + r"""Provider-specific options keyed by provider slug. The options for the matched provider are spread into the upstream request body.""" + + +ResponseFormatEnum = Union[ + Literal[ + "mp3", + "pcm", + ], + UnrecognizedStr, +] +r"""Audio output format""" + + +class SpeechRequestTypedDict(TypedDict): + r"""Text-to-speech request input""" + + input: str + r"""Text to synthesize""" + model: str + r"""TTS model identifier""" + voice: str + r"""Voice identifier (provider-specific).""" + provider: NotRequired[SpeechRequestProviderTypedDict] + r"""Provider-specific passthrough configuration""" + response_format: NotRequired[ResponseFormatEnum] + r"""Audio output format""" + speed: NotRequired[float] + r"""Playback speed multiplier. Only used by models that support it (e.g. OpenAI TTS). Ignored by other providers.""" + + +class SpeechRequest(BaseModel): + r"""Text-to-speech request input""" + + input: str + r"""Text to synthesize""" + + model: str + r"""TTS model identifier""" + + voice: str + r"""Voice identifier (provider-specific).""" + + provider: Optional[SpeechRequestProvider] = None + r"""Provider-specific passthrough configuration""" + + response_format: Annotated[ + Optional[ResponseFormatEnum], PlainValidator(validate_open_enum(False)) + ] = "pcm" + r"""Audio output format""" + + speed: Optional[float] = None + r"""Playback speed multiplier. Only used by models that support it (e.g. OpenAI TTS). Ignored by other providers.""" diff --git a/src/openrouter/components/textconfig.py b/src/openrouter/components/textconfig.py deleted file mode 100644 index cf8fa53..0000000 --- a/src/openrouter/components/textconfig.py +++ /dev/null @@ -1,77 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" - -from __future__ import annotations -from .formats import Formats, FormatsTypedDict -from openrouter.types import ( - BaseModel, - Nullable, - OptionalNullable, - UNSET, - UNSET_SENTINEL, - UnrecognizedStr, -) -from openrouter.utils import validate_open_enum -import pydantic -from pydantic import model_serializer -from pydantic.functional_validators import PlainValidator -from typing import Literal, Optional, Union -from typing_extensions import Annotated, NotRequired, TypedDict - - -TextConfigVerbosity = Union[ - Literal[ - "high", - "low", - "medium", - ], - UnrecognizedStr, -] - - -class TextConfigTypedDict(TypedDict): - r"""Text output configuration including format and verbosity""" - - format_: NotRequired[FormatsTypedDict] - r"""Text response format configuration""" - verbosity: NotRequired[Nullable[TextConfigVerbosity]] - - -class TextConfig(BaseModel): - r"""Text output configuration including format and verbosity""" - - format_: Annotated[Optional[Formats], pydantic.Field(alias="format")] = None - r"""Text response format configuration""" - - verbosity: Annotated[ - OptionalNullable[TextConfigVerbosity], PlainValidator(validate_open_enum(False)) - ] = UNSET - - @model_serializer(mode="wrap") - def serialize_model(self, handler): - optional_fields = ["format", "verbosity"] - nullable_fields = ["verbosity"] - null_default_fields = [] - - serialized = handler(self) - - m = {} - - for n, f in type(self).model_fields.items(): - k = f.alias or n - val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val - - return m diff --git a/src/openrouter/components/textextendedconfig.py b/src/openrouter/components/textextendedconfig.py index ee561b1..89224c7 100644 --- a/src/openrouter/components/textextendedconfig.py +++ b/src/openrouter/components/textextendedconfig.py @@ -18,11 +18,13 @@ from typing_extensions import Annotated, NotRequired, TypedDict -TextExtendedConfigVerbosity = Union[ +Verbosity = Union[ Literal[ - "high", "low", "medium", + "high", + "xhigh", + "max", ], UnrecognizedStr, ] @@ -33,7 +35,7 @@ class TextExtendedConfigTypedDict(TypedDict): format_: NotRequired[FormatsTypedDict] r"""Text response format configuration""" - verbosity: NotRequired[Nullable[TextExtendedConfigVerbosity]] + verbosity: NotRequired[Nullable[Verbosity]] class TextExtendedConfig(BaseModel): @@ -43,8 +45,7 @@ class TextExtendedConfig(BaseModel): r"""Text response format configuration""" verbosity: Annotated[ - OptionalNullable[TextExtendedConfigVerbosity], - PlainValidator(validate_open_enum(False)), + OptionalNullable[Verbosity], PlainValidator(validate_open_enum(False)) ] = UNSET @model_serializer(mode="wrap") diff --git a/src/openrouter/components/updateworkspacerequest.py b/src/openrouter/components/updateworkspacerequest.py new file mode 100644 index 0000000..a0ed364 --- /dev/null +++ b/src/openrouter/components/updateworkspacerequest.py @@ -0,0 +1,108 @@ +"""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 Optional +from typing_extensions import NotRequired, TypedDict + + +class UpdateWorkspaceRequestTypedDict(TypedDict): + default_image_model: NotRequired[Nullable[str]] + r"""Default image model for this workspace""" + default_provider_sort: NotRequired[Nullable[str]] + r"""Default provider sort preference (price, throughput, latency, exacto)""" + default_text_model: NotRequired[Nullable[str]] + r"""Default text model for this workspace""" + description: NotRequired[Nullable[str]] + r"""New description for the workspace""" + is_data_discount_logging_enabled: NotRequired[bool] + r"""Whether data discount logging is enabled""" + is_observability_broadcast_enabled: NotRequired[bool] + r"""Whether broadcast is enabled""" + is_observability_io_logging_enabled: NotRequired[bool] + r"""Whether private logging is enabled""" + name: NotRequired[str] + r"""New name for the workspace""" + slug: NotRequired[str] + r"""New URL-friendly slug""" + + +class UpdateWorkspaceRequest(BaseModel): + default_image_model: OptionalNullable[str] = UNSET + r"""Default image model for this workspace""" + + default_provider_sort: OptionalNullable[str] = UNSET + r"""Default provider sort preference (price, throughput, latency, exacto)""" + + default_text_model: OptionalNullable[str] = UNSET + r"""Default text model for this workspace""" + + description: OptionalNullable[str] = UNSET + r"""New description for the workspace""" + + is_data_discount_logging_enabled: Optional[bool] = None + r"""Whether data discount logging is enabled""" + + is_observability_broadcast_enabled: Optional[bool] = None + r"""Whether broadcast is enabled""" + + is_observability_io_logging_enabled: Optional[bool] = None + r"""Whether private logging is enabled""" + + name: Optional[str] = None + r"""New name for the workspace""" + + slug: Optional[str] = None + r"""New URL-friendly slug""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = [ + "default_image_model", + "default_provider_sort", + "default_text_model", + "description", + "is_data_discount_logging_enabled", + "is_observability_broadcast_enabled", + "is_observability_io_logging_enabled", + "name", + "slug", + ] + nullable_fields = [ + "default_image_model", + "default_provider_sort", + "default_text_model", + "description", + ] + null_default_fields = [] + + serialized = handler(self) + + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + serialized.pop(k, None) + + optional_nullable = k in optional_fields and k in nullable_fields + is_set = ( + self.__pydantic_fields_set__.intersection({n}) + or k in null_default_fields + ) # pylint: disable=no-member + + if val is not None and val != UNSET_SENTINEL: + m[k] = val + elif val != UNSET_SENTINEL and ( + not k in optional_fields or (optional_nullable and is_set) + ): + m[k] = val + + return m diff --git a/src/openrouter/components/updateworkspaceresponse.py b/src/openrouter/components/updateworkspaceresponse.py new file mode 100644 index 0000000..35d7ad3 --- /dev/null +++ b/src/openrouter/components/updateworkspaceresponse.py @@ -0,0 +1,14 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .workspace import Workspace, WorkspaceTypedDict +from openrouter.types import BaseModel +from typing_extensions import TypedDict + + +class UpdateWorkspaceResponseTypedDict(TypedDict): + data: WorkspaceTypedDict + + +class UpdateWorkspaceResponse(BaseModel): + data: Workspace diff --git a/src/openrouter/components/videogenerationrequest.py b/src/openrouter/components/videogenerationrequest.py index db54f12..01faca7 100644 --- a/src/openrouter/components/videogenerationrequest.py +++ b/src/openrouter/components/videogenerationrequest.py @@ -26,7 +26,7 @@ r"""Aspect ratio of the generated video""" -class OptionsTypedDict(TypedDict): +class VideoGenerationRequestOptionsTypedDict(TypedDict): r"""Provider-specific options keyed by provider slug. The options for the matched provider are spread into the upstream request body.""" oneai: NotRequired[Dict[str, Nullable[Any]]] @@ -44,6 +44,7 @@ class OptionsTypedDict(TypedDict): atoma: NotRequired[Dict[str, Nullable[Any]]] avian: NotRequired[Dict[str, Nullable[Any]]] azure: NotRequired[Dict[str, Nullable[Any]]] + baidu: NotRequired[Dict[str, Nullable[Any]]] baseten: NotRequired[Dict[str, Nullable[Any]]] black_forest_labs: NotRequired[Dict[str, Nullable[Any]]] byteplus: NotRequired[Dict[str, Nullable[Any]]] @@ -137,7 +138,7 @@ class OptionsTypedDict(TypedDict): z_ai: NotRequired[Dict[str, Nullable[Any]]] -class Options(BaseModel): +class VideoGenerationRequestOptions(BaseModel): r"""Provider-specific options keyed by provider slug. The options for the matched provider are spread into the upstream request body.""" oneai: Annotated[ @@ -182,6 +183,8 @@ class Options(BaseModel): azure: Optional[Dict[str, Nullable[Any]]] = None + baidu: Optional[Dict[str, Nullable[Any]]] = None + baseten: Optional[Dict[str, Nullable[Any]]] = None black_forest_labs: Annotated[ @@ -395,17 +398,17 @@ class Options(BaseModel): ] = None -class ProviderTypedDict(TypedDict): +class VideoGenerationRequestProviderTypedDict(TypedDict): r"""Provider-specific passthrough configuration""" - options: NotRequired[OptionsTypedDict] + options: NotRequired[VideoGenerationRequestOptionsTypedDict] r"""Provider-specific options keyed by provider slug. The options for the matched provider are spread into the upstream request body.""" -class Provider(BaseModel): +class VideoGenerationRequestProvider(BaseModel): r"""Provider-specific passthrough configuration""" - options: Optional[Options] = None + options: Optional[VideoGenerationRequestOptions] = None r"""Provider-specific options keyed by provider slug. The options for the matched provider are spread into the upstream request body.""" @@ -436,7 +439,7 @@ class VideoGenerationRequestTypedDict(TypedDict): r"""Whether to generate audio alongside the video. Defaults to the endpoint's generate_audio capability flag, false if not set.""" input_references: NotRequired[List[ContentPartImageTypedDict]] r"""Reference images to guide video generation""" - provider: NotRequired[ProviderTypedDict] + provider: NotRequired[VideoGenerationRequestProviderTypedDict] r"""Provider-specific passthrough configuration""" resolution: NotRequired[Resolution] r"""Resolution of the generated video""" @@ -468,7 +471,7 @@ class VideoGenerationRequest(BaseModel): input_references: Optional[List[ContentPartImage]] = None r"""Reference images to guide video generation""" - provider: Optional[Provider] = None + provider: Optional[VideoGenerationRequestProvider] = None r"""Provider-specific passthrough configuration""" resolution: Annotated[ diff --git a/src/openrouter/components/webfetchengineenum.py b/src/openrouter/components/webfetchengineenum.py new file mode 100644 index 0000000..7573a92 --- /dev/null +++ b/src/openrouter/components/webfetchengineenum.py @@ -0,0 +1,18 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import UnrecognizedStr +from typing import Literal, Union + + +WebFetchEngineEnum = Union[ + Literal[ + "auto", + "native", + "openrouter", + "firecrawl", + "exa", + ], + UnrecognizedStr, +] +r"""Which fetch engine to use. \"auto\" (default) uses native if the provider supports it, otherwise Exa. \"native\" forces the provider's built-in fetch. \"exa\" uses Exa Contents API (supports BYOK). \"openrouter\" uses direct HTTP fetch. \"firecrawl\" uses Firecrawl scrape (requires BYOK).""" diff --git a/src/openrouter/components/webfetchservertool.py b/src/openrouter/components/webfetchservertool.py new file mode 100644 index 0000000..cbd34b3 --- /dev/null +++ b/src/openrouter/components/webfetchservertool.py @@ -0,0 +1,30 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .webfetchservertoolconfig import ( + WebFetchServerToolConfig, + WebFetchServerToolConfigTypedDict, +) +from openrouter.types import BaseModel +from typing import Literal, Optional +from typing_extensions import NotRequired, TypedDict + + +WebFetchServerToolType = Literal["openrouter:web_fetch",] + + +class WebFetchServerToolTypedDict(TypedDict): + r"""OpenRouter built-in server tool: fetches full content from a URL (web page or PDF)""" + + type: WebFetchServerToolType + parameters: NotRequired[WebFetchServerToolConfigTypedDict] + r"""Configuration for the openrouter:web_fetch server tool""" + + +class WebFetchServerTool(BaseModel): + r"""OpenRouter built-in server tool: fetches full content from a URL (web page or PDF)""" + + type: WebFetchServerToolType + + parameters: Optional[WebFetchServerToolConfig] = None + r"""Configuration for the openrouter:web_fetch server tool""" diff --git a/src/openrouter/components/webfetchservertoolconfig.py b/src/openrouter/components/webfetchservertoolconfig.py new file mode 100644 index 0000000..b65fd21 --- /dev/null +++ b/src/openrouter/components/webfetchservertoolconfig.py @@ -0,0 +1,45 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .webfetchengineenum import WebFetchEngineEnum +from openrouter.types import BaseModel +from openrouter.utils import validate_open_enum +from pydantic.functional_validators import PlainValidator +from typing import List, Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +class WebFetchServerToolConfigTypedDict(TypedDict): + r"""Configuration for the openrouter:web_fetch server tool""" + + allowed_domains: NotRequired[List[str]] + r"""Only fetch from these domains.""" + blocked_domains: NotRequired[List[str]] + r"""Never fetch from these domains.""" + engine: NotRequired[WebFetchEngineEnum] + r"""Which fetch engine to use. \"auto\" (default) uses native if the provider supports it, otherwise Exa. \"native\" forces the provider's built-in fetch. \"exa\" uses Exa Contents API (supports BYOK). \"openrouter\" uses direct HTTP fetch. \"firecrawl\" uses Firecrawl scrape (requires BYOK).""" + max_content_tokens: NotRequired[int] + r"""Maximum content length in approximate tokens. Content exceeding this limit is truncated.""" + max_uses: NotRequired[int] + r"""Maximum number of web fetches per request. Once exceeded, the tool returns an error.""" + + +class WebFetchServerToolConfig(BaseModel): + r"""Configuration for the openrouter:web_fetch server tool""" + + allowed_domains: Optional[List[str]] = None + r"""Only fetch from these domains.""" + + blocked_domains: Optional[List[str]] = None + r"""Never fetch from these domains.""" + + engine: Annotated[ + Optional[WebFetchEngineEnum], PlainValidator(validate_open_enum(False)) + ] = None + r"""Which fetch engine to use. \"auto\" (default) uses native if the provider supports it, otherwise Exa. \"native\" forces the provider's built-in fetch. \"exa\" uses Exa Contents API (supports BYOK). \"openrouter\" uses direct HTTP fetch. \"firecrawl\" uses Firecrawl scrape (requires BYOK).""" + + max_content_tokens: Optional[int] = None + r"""Maximum content length in approximate tokens. Content exceeding this limit is truncated.""" + + max_uses: Optional[int] = None + r"""Maximum number of web fetches per request. Once exceeded, the tool returns an error.""" diff --git a/src/openrouter/components/websearchconfig.py b/src/openrouter/components/websearchconfig.py index dfe9115..8188e57 100644 --- a/src/openrouter/components/websearchconfig.py +++ b/src/openrouter/components/websearchconfig.py @@ -26,7 +26,7 @@ class WebSearchConfigTypedDict(TypedDict): max_total_results: NotRequired[int] r"""Maximum total number of search results across all search calls in a single request. Once this limit is reached, the tool will stop returning new results. Useful for controlling cost and context size in agentic loops.""" search_context_size: NotRequired[SearchQualityLevel] - r"""How much context to retrieve per result. Defaults to medium (15000 chars). Only applies when using the Exa engine; ignored with native provider search.""" + r"""How much context to retrieve per result. Defaults to medium (15000 chars). Applies to Exa and Parallel engines; ignored with native provider search and Firecrawl.""" user_location: NotRequired[WebSearchUserLocationServerToolTypedDict] r"""Approximate user location for location-biased results.""" @@ -52,7 +52,7 @@ class WebSearchConfig(BaseModel): search_context_size: Annotated[ Optional[SearchQualityLevel], PlainValidator(validate_open_enum(False)) ] = None - r"""How much context to retrieve per result. Defaults to medium (15000 chars). Only applies when using the Exa engine; ignored with native provider search.""" + r"""How much context to retrieve per result. Defaults to medium (15000 chars). Applies to Exa and Parallel engines; ignored with native provider search and Firecrawl.""" user_location: Optional[WebSearchUserLocationServerTool] = None r"""Approximate user location for location-biased results.""" diff --git a/src/openrouter/components/workspace.py b/src/openrouter/components/workspace.py new file mode 100644 index 0000000..a097f38 --- /dev/null +++ b/src/openrouter/components/workspace.py @@ -0,0 +1,113 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel, Nullable, UNSET_SENTINEL +from pydantic import model_serializer +from typing_extensions import TypedDict + + +class WorkspaceTypedDict(TypedDict): + created_at: str + r"""ISO 8601 timestamp of when the workspace was created""" + created_by: Nullable[str] + r"""User ID of the workspace creator""" + default_image_model: Nullable[str] + r"""Default image model for this workspace""" + default_provider_sort: Nullable[str] + r"""Default provider sort preference (price, throughput, latency, exacto)""" + default_text_model: Nullable[str] + r"""Default text model for this workspace""" + description: Nullable[str] + r"""Description of the workspace""" + id: str + r"""Unique identifier for the workspace""" + is_data_discount_logging_enabled: bool + r"""Whether data discount logging is enabled for this workspace""" + is_observability_broadcast_enabled: bool + r"""Whether broadcast is enabled for this workspace""" + is_observability_io_logging_enabled: bool + r"""Whether private logging is enabled for this workspace""" + name: str + r"""Name of the workspace""" + slug: str + r"""URL-friendly slug for the workspace""" + updated_at: Nullable[str] + r"""ISO 8601 timestamp of when the workspace was last updated""" + + +class Workspace(BaseModel): + created_at: str + r"""ISO 8601 timestamp of when the workspace was created""" + + created_by: Nullable[str] + r"""User ID of the workspace creator""" + + default_image_model: Nullable[str] + r"""Default image model for this workspace""" + + default_provider_sort: Nullable[str] + r"""Default provider sort preference (price, throughput, latency, exacto)""" + + default_text_model: Nullable[str] + r"""Default text model for this workspace""" + + description: Nullable[str] + r"""Description of the workspace""" + + id: str + r"""Unique identifier for the workspace""" + + is_data_discount_logging_enabled: bool + r"""Whether data discount logging is enabled for this workspace""" + + is_observability_broadcast_enabled: bool + r"""Whether broadcast is enabled for this workspace""" + + is_observability_io_logging_enabled: bool + r"""Whether private logging is enabled for this workspace""" + + name: str + r"""Name of the workspace""" + + slug: str + r"""URL-friendly slug for the workspace""" + + updated_at: Nullable[str] + r"""ISO 8601 timestamp of when the workspace was last updated""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = [] + nullable_fields = [ + "created_by", + "default_image_model", + "default_provider_sort", + "default_text_model", + "description", + "updated_at", + ] + null_default_fields = [] + + serialized = handler(self) + + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + serialized.pop(k, None) + + optional_nullable = k in optional_fields and k in nullable_fields + is_set = ( + self.__pydantic_fields_set__.intersection({n}) + or k in null_default_fields + ) # pylint: disable=no-member + + if val is not None and val != UNSET_SENTINEL: + m[k] = val + elif val != UNSET_SENTINEL and ( + not k in optional_fields or (optional_nullable and is_set) + ): + m[k] = val + + return m diff --git a/src/openrouter/components/workspacemember.py b/src/openrouter/components/workspacemember.py new file mode 100644 index 0000000..9ece878 --- /dev/null +++ b/src/openrouter/components/workspacemember.py @@ -0,0 +1,48 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel, UnrecognizedStr +from openrouter.utils import validate_open_enum +from pydantic.functional_validators import PlainValidator +from typing import Literal, Union +from typing_extensions import Annotated, TypedDict + + +WorkspaceMemberRole = Union[ + Literal[ + "admin", + "member", + ], + UnrecognizedStr, +] +r"""Role of the member in the workspace""" + + +class WorkspaceMemberTypedDict(TypedDict): + created_at: str + r"""ISO 8601 timestamp of when the membership was created""" + id: str + r"""Unique identifier for the workspace membership""" + role: WorkspaceMemberRole + r"""Role of the member in the workspace""" + user_id: str + r"""Clerk user ID of the member""" + workspace_id: str + r"""ID of the workspace""" + + +class WorkspaceMember(BaseModel): + created_at: str + r"""ISO 8601 timestamp of when the membership was created""" + + id: str + r"""Unique identifier for the workspace membership""" + + role: Annotated[WorkspaceMemberRole, PlainValidator(validate_open_enum(False))] + r"""Role of the member in the workspace""" + + user_id: str + r"""Clerk user ID of the member""" + + workspace_id: str + r"""ID of the workspace""" diff --git a/src/openrouter/generations.py b/src/openrouter/generations.py index fddcce7..409e169 100644 --- a/src/openrouter/generations.py +++ b/src/openrouter/generations.py @@ -23,7 +23,7 @@ def get_generation( server_url: Optional[str] = None, timeout_ms: Optional[int] = None, http_headers: Optional[Mapping[str, str]] = None, - ) -> operations.GetGenerationResponse: + ) -> components.GenerationResponse: r"""Get request & usage metadata for a generation :param id: The generation ID @@ -118,7 +118,7 @@ def get_generation( response_data: Any = None if utils.match_response(http_res, "200", "application/json"): - return unmarshal_json_response(operations.GetGenerationResponse, http_res) + return unmarshal_json_response(components.GenerationResponse, http_res) if utils.match_response(http_res, "401", "application/json"): response_data = unmarshal_json_response( errors.UnauthorizedResponseErrorData, http_res @@ -183,7 +183,7 @@ async def get_generation_async( server_url: Optional[str] = None, timeout_ms: Optional[int] = None, http_headers: Optional[Mapping[str, str]] = None, - ) -> operations.GetGenerationResponse: + ) -> components.GenerationResponse: r"""Get request & usage metadata for a generation :param id: The generation ID @@ -278,7 +278,7 @@ async def get_generation_async( response_data: Any = None if utils.match_response(http_res, "200", "application/json"): - return unmarshal_json_response(operations.GetGenerationResponse, http_res) + return unmarshal_json_response(components.GenerationResponse, http_res) if utils.match_response(http_res, "401", "application/json"): response_data = unmarshal_json_response( errors.UnauthorizedResponseErrorData, http_res @@ -331,3 +331,327 @@ async def get_generation_async( ) raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + def list_generation_content( + self, + *, + id: str, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.GenerationContentResponse: + r"""Get stored prompt and completion content for a generation + + :param id: The generation ID + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.ListGenerationContentRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + id=id, + ) + + req = self._build_request( + method="GET", + path="/generation/content", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.ListGenerationContentGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="listGenerationContent", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + ), + request=req, + error_status_codes=[ + "401", + "403", + "404", + "429", + "4XX", + "500", + "502", + "524", + "529", + "5XX", + ], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response( + components.GenerationContentResponse, http_res + ) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "403", "application/json"): + response_data = unmarshal_json_response( + errors.ForbiddenResponseErrorData, http_res + ) + raise errors.ForbiddenResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "429", "application/json"): + response_data = unmarshal_json_response( + errors.TooManyRequestsResponseErrorData, http_res + ) + raise errors.TooManyRequestsResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "502", "application/json"): + response_data = unmarshal_json_response( + errors.BadGatewayResponseErrorData, http_res + ) + raise errors.BadGatewayResponseError(response_data, http_res) + if utils.match_response(http_res, "524", "application/json"): + response_data = unmarshal_json_response( + errors.EdgeNetworkTimeoutResponseErrorData, http_res + ) + raise errors.EdgeNetworkTimeoutResponseError(response_data, http_res) + if utils.match_response(http_res, "529", "application/json"): + response_data = unmarshal_json_response( + errors.ProviderOverloadedResponseErrorData, http_res + ) + raise errors.ProviderOverloadedResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + async def list_generation_content_async( + self, + *, + id: str, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.GenerationContentResponse: + r"""Get stored prompt and completion content for a generation + + :param id: The generation ID + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.ListGenerationContentRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + id=id, + ) + + req = self._build_request_async( + method="GET", + path="/generation/content", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.ListGenerationContentGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="listGenerationContent", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + ), + request=req, + error_status_codes=[ + "401", + "403", + "404", + "429", + "4XX", + "500", + "502", + "524", + "529", + "5XX", + ], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response( + components.GenerationContentResponse, http_res + ) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "403", "application/json"): + response_data = unmarshal_json_response( + errors.ForbiddenResponseErrorData, http_res + ) + raise errors.ForbiddenResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "429", "application/json"): + response_data = unmarshal_json_response( + errors.TooManyRequestsResponseErrorData, http_res + ) + raise errors.TooManyRequestsResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "502", "application/json"): + response_data = unmarshal_json_response( + errors.BadGatewayResponseErrorData, http_res + ) + raise errors.BadGatewayResponseError(response_data, http_res) + if utils.match_response(http_res, "524", "application/json"): + response_data = unmarshal_json_response( + errors.EdgeNetworkTimeoutResponseErrorData, http_res + ) + raise errors.EdgeNetworkTimeoutResponseError(response_data, http_res) + if utils.match_response(http_res, "529", "application/json"): + response_data = unmarshal_json_response( + errors.ProviderOverloadedResponseErrorData, http_res + ) + raise errors.ProviderOverloadedResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) diff --git a/src/openrouter/guardrails.py b/src/openrouter/guardrails.py index 7d1038d..f80ac69 100644 --- a/src/openrouter/guardrails.py +++ b/src/openrouter/guardrails.py @@ -21,6 +21,7 @@ def list( x_open_router_categories: Optional[str] = None, offset: Optional[int] = None, limit: Optional[int] = None, + workspace_id: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -39,6 +40,7 @@ def list( :param offset: Number of records to skip for pagination :param limit: Maximum number of records to return (max 100) + :param workspace_id: Filter guardrails by workspace ID. By default, guardrails in the default workspace are returned. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -60,6 +62,7 @@ def list( x_open_router_categories=x_open_router_categories, offset=offset, limit=limit, + workspace_id=workspace_id, ) req = self._build_request( @@ -132,6 +135,7 @@ def next_func() -> Optional[operations.ListGuardrailsResponse]: x_open_router_categories=x_open_router_categories, offset=next_offset, limit=limit, + workspace_id=workspace_id, retries=retries, ) @@ -174,6 +178,7 @@ async def list_async( x_open_router_categories: Optional[str] = None, offset: Optional[int] = None, limit: Optional[int] = None, + workspace_id: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -192,6 +197,7 @@ async def list_async( :param offset: Number of records to skip for pagination :param limit: Maximum number of records to return (max 100) + :param workspace_id: Filter guardrails by workspace ID. By default, guardrails in the default workspace are returned. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -213,6 +219,7 @@ async def list_async( x_open_router_categories=x_open_router_categories, offset=offset, limit=limit, + workspace_id=workspace_id, ) req = self._build_request_async( @@ -288,6 +295,7 @@ async def empty_result(): x_open_router_categories=x_open_router_categories, offset=next_offset, limit=limit, + workspace_id=workspace_id, retries=retries, ) @@ -337,6 +345,7 @@ def create( ignored_providers: OptionalNullable[List[str]] = UNSET, limit_usd: OptionalNullable[float] = UNSET, reset_interval: OptionalNullable[components.GuardrailInterval] = UNSET, + workspace_id: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -362,6 +371,7 @@ def create( :param ignored_providers: List of provider IDs to exclude from routing :param limit_usd: Spending limit in USD :param reset_interval: Interval at which the limit resets (daily, weekly, monthly) + :param workspace_id: The workspace to create the guardrail in. Defaults to the default workspace if not provided. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -391,6 +401,7 @@ def create( limit_usd=limit_usd, name=name, reset_interval=reset_interval, + workspace_id=workspace_id, ), ) @@ -446,7 +457,7 @@ def create( ), ), request=req, - error_status_codes=["400", "401", "4XX", "500", "5XX"], + error_status_codes=["400", "401", "403", "4XX", "500", "5XX"], retry_config=retry_config, ) @@ -463,6 +474,11 @@ def create( errors.UnauthorizedResponseErrorData, http_res ) raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "403", "application/json"): + response_data = unmarshal_json_response( + errors.ForbiddenResponseErrorData, http_res + ) + raise errors.ForbiddenResponseError(response_data, http_res) if utils.match_response(http_res, "500", "application/json"): response_data = unmarshal_json_response( errors.InternalServerResponseErrorData, http_res @@ -496,6 +512,7 @@ async def create_async( ignored_providers: OptionalNullable[List[str]] = UNSET, limit_usd: OptionalNullable[float] = UNSET, reset_interval: OptionalNullable[components.GuardrailInterval] = UNSET, + workspace_id: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -521,6 +538,7 @@ async def create_async( :param ignored_providers: List of provider IDs to exclude from routing :param limit_usd: Spending limit in USD :param reset_interval: Interval at which the limit resets (daily, weekly, monthly) + :param workspace_id: The workspace to create the guardrail in. Defaults to the default workspace if not provided. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -550,6 +568,7 @@ async def create_async( limit_usd=limit_usd, name=name, reset_interval=reset_interval, + workspace_id=workspace_id, ), ) @@ -605,7 +624,7 @@ async def create_async( ), ), request=req, - error_status_codes=["400", "401", "4XX", "500", "5XX"], + error_status_codes=["400", "401", "403", "4XX", "500", "5XX"], retry_config=retry_config, ) @@ -622,6 +641,11 @@ async def create_async( errors.UnauthorizedResponseErrorData, http_res ) raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "403", "application/json"): + response_data = unmarshal_json_response( + errors.ForbiddenResponseErrorData, http_res + ) + raise errors.ForbiddenResponseError(response_data, http_res) if utils.match_response(http_res, "500", "application/json"): response_data = unmarshal_json_response( errors.InternalServerResponseErrorData, http_res diff --git a/src/openrouter/operations/__init__.py b/src/openrouter/operations/__init__.py index 8c2b319..e9eb83e 100644 --- a/src/openrouter/operations/__init__.py +++ b/src/openrouter/operations/__init__.py @@ -6,6 +6,12 @@ import sys if TYPE_CHECKING: + from .bulkaddworkspacemembers import ( + BulkAddWorkspaceMembersGlobals, + BulkAddWorkspaceMembersGlobalsTypedDict, + BulkAddWorkspaceMembersRequest, + BulkAddWorkspaceMembersRequestTypedDict, + ) from .bulkassignkeystoguardrail import ( BulkAssignKeysToGuardrailGlobals, BulkAssignKeysToGuardrailGlobalsTypedDict, @@ -18,6 +24,12 @@ BulkAssignMembersToGuardrailRequest, BulkAssignMembersToGuardrailRequestTypedDict, ) + from .bulkremoveworkspacemembers import ( + BulkRemoveWorkspaceMembersGlobals, + BulkRemoveWorkspaceMembersGlobalsTypedDict, + BulkRemoveWorkspaceMembersRequest, + BulkRemoveWorkspaceMembersRequestTypedDict, + ) from .bulkunassignkeysfromguardrail import ( BulkUnassignKeysFromGuardrailGlobals, BulkUnassignKeysFromGuardrailGlobalsTypedDict, @@ -30,6 +42,12 @@ BulkUnassignMembersFromGuardrailRequest, BulkUnassignMembersFromGuardrailRequestTypedDict, ) + from .createaudiospeech import ( + CreateAudioSpeechGlobals, + CreateAudioSpeechGlobalsTypedDict, + CreateAudioSpeechRequest, + CreateAudioSpeechRequestTypedDict, + ) from .createauthkeyscode import ( CreateAuthKeysCodeCodeChallengeMethod, CreateAuthKeysCodeData, @@ -76,6 +94,8 @@ InputUnionTypedDict, Object, ObjectEmbedding, + PromptTokensDetails, + PromptTokensDetailsTypedDict, TypeImageURL, TypeText, ) @@ -132,6 +152,12 @@ CreateVideosRequest, CreateVideosRequestTypedDict, ) + from .createworkspace import ( + CreateWorkspaceGlobals, + CreateWorkspaceGlobalsTypedDict, + CreateWorkspaceRequest, + CreateWorkspaceRequestTypedDict, + ) from .deleteguardrail import ( DeleteGuardrailGlobals, DeleteGuardrailGlobalsTypedDict, @@ -146,6 +172,12 @@ DeleteKeysResponse, DeleteKeysResponseTypedDict, ) + from .deleteworkspace import ( + DeleteWorkspaceGlobals, + DeleteWorkspaceGlobalsTypedDict, + DeleteWorkspaceRequest, + DeleteWorkspaceRequestTypedDict, + ) from .exchangeauthcodeforapikey import ( ExchangeAuthCodeForAPIKeyCodeChallengeMethod, ExchangeAuthCodeForAPIKeyGlobals, @@ -180,15 +212,10 @@ RateLimitTypedDict, ) from .getgeneration import ( - APIType, - GetGenerationData, - GetGenerationDataTypedDict, GetGenerationGlobals, GetGenerationGlobalsTypedDict, GetGenerationRequest, GetGenerationRequestTypedDict, - GetGenerationResponse, - GetGenerationResponseTypedDict, ) from .getguardrail import ( GetGuardrailGlobals, @@ -225,6 +252,12 @@ GetVideosRequest, GetVideosRequestTypedDict, ) + from .getworkspace import ( + GetWorkspaceGlobals, + GetWorkspaceGlobalsTypedDict, + GetWorkspaceRequest, + GetWorkspaceRequestTypedDict, + ) from .list import ( ListData, ListDataTypedDict, @@ -257,6 +290,12 @@ ListEndpointsZdrResponse, ListEndpointsZdrResponseTypedDict, ) + from .listgenerationcontent import ( + ListGenerationContentGlobals, + ListGenerationContentGlobalsTypedDict, + ListGenerationContentRequest, + ListGenerationContentRequestTypedDict, + ) from .listguardrailkeyassignments import ( ListGuardrailKeyAssignmentsGlobals, ListGuardrailKeyAssignmentsGlobalsTypedDict, @@ -348,6 +387,14 @@ ListVideosModelsRequest, ListVideosModelsRequestTypedDict, ) + from .listworkspaces import ( + ListWorkspacesGlobals, + ListWorkspacesGlobalsTypedDict, + ListWorkspacesRequest, + ListWorkspacesRequestTypedDict, + ListWorkspacesResponse, + ListWorkspacesResponseTypedDict, + ) from .sendchatcompletionrequest import ( SendChatCompletionRequestGlobals, SendChatCompletionRequestGlobalsTypedDict, @@ -377,9 +424,18 @@ UpdateKeysResponse, UpdateKeysResponseTypedDict, ) + from .updateworkspace import ( + UpdateWorkspaceGlobals, + UpdateWorkspaceGlobalsTypedDict, + UpdateWorkspaceRequest, + UpdateWorkspaceRequestTypedDict, + ) __all__ = [ - "APIType", + "BulkAddWorkspaceMembersGlobals", + "BulkAddWorkspaceMembersGlobalsTypedDict", + "BulkAddWorkspaceMembersRequest", + "BulkAddWorkspaceMembersRequestTypedDict", "BulkAssignKeysToGuardrailGlobals", "BulkAssignKeysToGuardrailGlobalsTypedDict", "BulkAssignKeysToGuardrailRequest", @@ -388,6 +444,10 @@ "BulkAssignMembersToGuardrailGlobalsTypedDict", "BulkAssignMembersToGuardrailRequest", "BulkAssignMembersToGuardrailRequestTypedDict", + "BulkRemoveWorkspaceMembersGlobals", + "BulkRemoveWorkspaceMembersGlobalsTypedDict", + "BulkRemoveWorkspaceMembersRequest", + "BulkRemoveWorkspaceMembersRequestTypedDict", "BulkUnassignKeysFromGuardrailGlobals", "BulkUnassignKeysFromGuardrailGlobalsTypedDict", "BulkUnassignKeysFromGuardrailRequest", @@ -403,6 +463,10 @@ "ContentText", "ContentTextTypedDict", "ContentTypedDict", + "CreateAudioSpeechGlobals", + "CreateAudioSpeechGlobalsTypedDict", + "CreateAudioSpeechRequest", + "CreateAudioSpeechRequestTypedDict", "CreateAuthKeysCodeCodeChallengeMethod", "CreateAuthKeysCodeData", "CreateAuthKeysCodeDataTypedDict", @@ -467,6 +531,10 @@ "CreateVideosGlobalsTypedDict", "CreateVideosRequest", "CreateVideosRequestTypedDict", + "CreateWorkspaceGlobals", + "CreateWorkspaceGlobalsTypedDict", + "CreateWorkspaceRequest", + "CreateWorkspaceRequestTypedDict", "Datacenter", "DeleteGuardrailGlobals", "DeleteGuardrailGlobalsTypedDict", @@ -478,6 +546,10 @@ "DeleteKeysRequestTypedDict", "DeleteKeysResponse", "DeleteKeysResponseTypedDict", + "DeleteWorkspaceGlobals", + "DeleteWorkspaceGlobalsTypedDict", + "DeleteWorkspaceRequest", + "DeleteWorkspaceRequestTypedDict", "Document", "DocumentTypedDict", "Embedding", @@ -508,14 +580,10 @@ "GetCurrentKeyRequestTypedDict", "GetCurrentKeyResponse", "GetCurrentKeyResponseTypedDict", - "GetGenerationData", - "GetGenerationDataTypedDict", "GetGenerationGlobals", "GetGenerationGlobalsTypedDict", "GetGenerationRequest", "GetGenerationRequestTypedDict", - "GetGenerationResponse", - "GetGenerationResponseTypedDict", "GetGuardrailGlobals", "GetGuardrailGlobalsTypedDict", "GetGuardrailRequest", @@ -540,6 +608,10 @@ "GetVideosGlobalsTypedDict", "GetVideosRequest", "GetVideosRequestTypedDict", + "GetWorkspaceGlobals", + "GetWorkspaceGlobalsTypedDict", + "GetWorkspaceRequest", + "GetWorkspaceRequestTypedDict", "Headquarters", "ImageURL", "ImageURLTypedDict", @@ -565,6 +637,10 @@ "ListEndpointsZdrRequestTypedDict", "ListEndpointsZdrResponse", "ListEndpointsZdrResponseTypedDict", + "ListGenerationContentGlobals", + "ListGenerationContentGlobalsTypedDict", + "ListGenerationContentRequest", + "ListGenerationContentRequestTypedDict", "ListGlobals", "ListGlobalsTypedDict", "ListGuardrailKeyAssignmentsGlobals", @@ -637,8 +713,16 @@ "ListVideosModelsGlobalsTypedDict", "ListVideosModelsRequest", "ListVideosModelsRequestTypedDict", + "ListWorkspacesGlobals", + "ListWorkspacesGlobalsTypedDict", + "ListWorkspacesRequest", + "ListWorkspacesRequestTypedDict", + "ListWorkspacesResponse", + "ListWorkspacesResponseTypedDict", "Object", "ObjectEmbedding", + "PromptTokensDetails", + "PromptTokensDetailsTypedDict", "RateLimit", "RateLimitTypedDict", "Result", @@ -669,10 +753,18 @@ "UpdateKeysRequestTypedDict", "UpdateKeysResponse", "UpdateKeysResponseTypedDict", + "UpdateWorkspaceGlobals", + "UpdateWorkspaceGlobalsTypedDict", + "UpdateWorkspaceRequest", + "UpdateWorkspaceRequestTypedDict", "UsageLimitType", ] _dynamic_imports: dict[str, str] = { + "BulkAddWorkspaceMembersGlobals": ".bulkaddworkspacemembers", + "BulkAddWorkspaceMembersGlobalsTypedDict": ".bulkaddworkspacemembers", + "BulkAddWorkspaceMembersRequest": ".bulkaddworkspacemembers", + "BulkAddWorkspaceMembersRequestTypedDict": ".bulkaddworkspacemembers", "BulkAssignKeysToGuardrailGlobals": ".bulkassignkeystoguardrail", "BulkAssignKeysToGuardrailGlobalsTypedDict": ".bulkassignkeystoguardrail", "BulkAssignKeysToGuardrailRequest": ".bulkassignkeystoguardrail", @@ -681,6 +773,10 @@ "BulkAssignMembersToGuardrailGlobalsTypedDict": ".bulkassignmemberstoguardrail", "BulkAssignMembersToGuardrailRequest": ".bulkassignmemberstoguardrail", "BulkAssignMembersToGuardrailRequestTypedDict": ".bulkassignmemberstoguardrail", + "BulkRemoveWorkspaceMembersGlobals": ".bulkremoveworkspacemembers", + "BulkRemoveWorkspaceMembersGlobalsTypedDict": ".bulkremoveworkspacemembers", + "BulkRemoveWorkspaceMembersRequest": ".bulkremoveworkspacemembers", + "BulkRemoveWorkspaceMembersRequestTypedDict": ".bulkremoveworkspacemembers", "BulkUnassignKeysFromGuardrailGlobals": ".bulkunassignkeysfromguardrail", "BulkUnassignKeysFromGuardrailGlobalsTypedDict": ".bulkunassignkeysfromguardrail", "BulkUnassignKeysFromGuardrailRequest": ".bulkunassignkeysfromguardrail", @@ -689,6 +785,10 @@ "BulkUnassignMembersFromGuardrailGlobalsTypedDict": ".bulkunassignmembersfromguardrail", "BulkUnassignMembersFromGuardrailRequest": ".bulkunassignmembersfromguardrail", "BulkUnassignMembersFromGuardrailRequestTypedDict": ".bulkunassignmembersfromguardrail", + "CreateAudioSpeechGlobals": ".createaudiospeech", + "CreateAudioSpeechGlobalsTypedDict": ".createaudiospeech", + "CreateAudioSpeechRequest": ".createaudiospeech", + "CreateAudioSpeechRequestTypedDict": ".createaudiospeech", "CreateAuthKeysCodeCodeChallengeMethod": ".createauthkeyscode", "CreateAuthKeysCodeData": ".createauthkeyscode", "CreateAuthKeysCodeDataTypedDict": ".createauthkeyscode", @@ -732,6 +832,8 @@ "InputUnionTypedDict": ".createembeddings", "Object": ".createembeddings", "ObjectEmbedding": ".createembeddings", + "PromptTokensDetails": ".createembeddings", + "PromptTokensDetailsTypedDict": ".createembeddings", "TypeImageURL": ".createembeddings", "TypeText": ".createembeddings", "CreateGuardrailGlobals": ".createguardrail", @@ -777,6 +879,10 @@ "CreateVideosGlobalsTypedDict": ".createvideos", "CreateVideosRequest": ".createvideos", "CreateVideosRequestTypedDict": ".createvideos", + "CreateWorkspaceGlobals": ".createworkspace", + "CreateWorkspaceGlobalsTypedDict": ".createworkspace", + "CreateWorkspaceRequest": ".createworkspace", + "CreateWorkspaceRequestTypedDict": ".createworkspace", "DeleteGuardrailGlobals": ".deleteguardrail", "DeleteGuardrailGlobalsTypedDict": ".deleteguardrail", "DeleteGuardrailRequest": ".deleteguardrail", @@ -787,6 +893,10 @@ "DeleteKeysRequestTypedDict": ".deletekeys", "DeleteKeysResponse": ".deletekeys", "DeleteKeysResponseTypedDict": ".deletekeys", + "DeleteWorkspaceGlobals": ".deleteworkspace", + "DeleteWorkspaceGlobalsTypedDict": ".deleteworkspace", + "DeleteWorkspaceRequest": ".deleteworkspace", + "DeleteWorkspaceRequestTypedDict": ".deleteworkspace", "ExchangeAuthCodeForAPIKeyCodeChallengeMethod": ".exchangeauthcodeforapikey", "ExchangeAuthCodeForAPIKeyGlobals": ".exchangeauthcodeforapikey", "ExchangeAuthCodeForAPIKeyGlobalsTypedDict": ".exchangeauthcodeforapikey", @@ -814,15 +924,10 @@ "GetCurrentKeyResponseTypedDict": ".getcurrentkey", "RateLimit": ".getcurrentkey", "RateLimitTypedDict": ".getcurrentkey", - "APIType": ".getgeneration", - "GetGenerationData": ".getgeneration", - "GetGenerationDataTypedDict": ".getgeneration", "GetGenerationGlobals": ".getgeneration", "GetGenerationGlobalsTypedDict": ".getgeneration", "GetGenerationRequest": ".getgeneration", "GetGenerationRequestTypedDict": ".getgeneration", - "GetGenerationResponse": ".getgeneration", - "GetGenerationResponseTypedDict": ".getgeneration", "GetGuardrailGlobals": ".getguardrail", "GetGuardrailGlobalsTypedDict": ".getguardrail", "GetGuardrailRequest": ".getguardrail", @@ -848,6 +953,10 @@ "GetVideosGlobalsTypedDict": ".getvideos", "GetVideosRequest": ".getvideos", "GetVideosRequestTypedDict": ".getvideos", + "GetWorkspaceGlobals": ".getworkspace", + "GetWorkspaceGlobalsTypedDict": ".getworkspace", + "GetWorkspaceRequest": ".getworkspace", + "GetWorkspaceRequestTypedDict": ".getworkspace", "ListData": ".list", "ListDataTypedDict": ".list", "ListGlobals": ".list", @@ -872,6 +981,10 @@ "ListEndpointsZdrRequestTypedDict": ".listendpointszdr", "ListEndpointsZdrResponse": ".listendpointszdr", "ListEndpointsZdrResponseTypedDict": ".listendpointszdr", + "ListGenerationContentGlobals": ".listgenerationcontent", + "ListGenerationContentGlobalsTypedDict": ".listgenerationcontent", + "ListGenerationContentRequest": ".listgenerationcontent", + "ListGenerationContentRequestTypedDict": ".listgenerationcontent", "ListGuardrailKeyAssignmentsGlobals": ".listguardrailkeyassignments", "ListGuardrailKeyAssignmentsGlobalsTypedDict": ".listguardrailkeyassignments", "ListGuardrailKeyAssignmentsRequest": ".listguardrailkeyassignments", @@ -941,6 +1054,12 @@ "ListVideosModelsGlobalsTypedDict": ".listvideosmodels", "ListVideosModelsRequest": ".listvideosmodels", "ListVideosModelsRequestTypedDict": ".listvideosmodels", + "ListWorkspacesGlobals": ".listworkspaces", + "ListWorkspacesGlobalsTypedDict": ".listworkspaces", + "ListWorkspacesRequest": ".listworkspaces", + "ListWorkspacesRequestTypedDict": ".listworkspaces", + "ListWorkspacesResponse": ".listworkspaces", + "ListWorkspacesResponseTypedDict": ".listworkspaces", "SendChatCompletionRequestGlobals": ".sendchatcompletionrequest", "SendChatCompletionRequestGlobalsTypedDict": ".sendchatcompletionrequest", "SendChatCompletionRequestRequest": ".sendchatcompletionrequest", @@ -964,6 +1083,10 @@ "UpdateKeysRequestTypedDict": ".updatekeys", "UpdateKeysResponse": ".updatekeys", "UpdateKeysResponseTypedDict": ".updatekeys", + "UpdateWorkspaceGlobals": ".updateworkspace", + "UpdateWorkspaceGlobalsTypedDict": ".updateworkspace", + "UpdateWorkspaceRequest": ".updateworkspace", + "UpdateWorkspaceRequestTypedDict": ".updateworkspace", } diff --git a/src/openrouter/operations/bulkaddworkspacemembers.py b/src/openrouter/operations/bulkaddworkspacemembers.py new file mode 100644 index 0000000..32dcfea --- /dev/null +++ b/src/openrouter/operations/bulkaddworkspacemembers.py @@ -0,0 +1,121 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.components import ( + bulkaddworkspacemembersrequest as components_bulkaddworkspacemembersrequest, +) +from openrouter.types import BaseModel +from openrouter.utils import ( + FieldMetadata, + HeaderMetadata, + PathParamMetadata, + RequestMetadata, +) +import pydantic +from typing import Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +class BulkAddWorkspaceMembersGlobalsTypedDict(TypedDict): + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class BulkAddWorkspaceMembersGlobals(BaseModel): + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class BulkAddWorkspaceMembersRequestTypedDict(TypedDict): + id: str + r"""The workspace ID (UUID) or slug""" + bulk_add_workspace_members_request: components_bulkaddworkspacemembersrequest.BulkAddWorkspaceMembersRequestTypedDict + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class BulkAddWorkspaceMembersRequest(BaseModel): + id: Annotated[ + str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False)) + ] + r"""The workspace ID (UUID) or slug""" + + bulk_add_workspace_members_request: Annotated[ + components_bulkaddworkspacemembersrequest.BulkAddWorkspaceMembersRequest, + FieldMetadata(request=RequestMetadata(media_type="application/json")), + ] + + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ diff --git a/src/openrouter/operations/bulkremoveworkspacemembers.py b/src/openrouter/operations/bulkremoveworkspacemembers.py new file mode 100644 index 0000000..fe0ebfd --- /dev/null +++ b/src/openrouter/operations/bulkremoveworkspacemembers.py @@ -0,0 +1,121 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.components import ( + bulkremoveworkspacemembersrequest as components_bulkremoveworkspacemembersrequest, +) +from openrouter.types import BaseModel +from openrouter.utils import ( + FieldMetadata, + HeaderMetadata, + PathParamMetadata, + RequestMetadata, +) +import pydantic +from typing import Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +class BulkRemoveWorkspaceMembersGlobalsTypedDict(TypedDict): + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class BulkRemoveWorkspaceMembersGlobals(BaseModel): + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class BulkRemoveWorkspaceMembersRequestTypedDict(TypedDict): + id: str + r"""The workspace ID (UUID) or slug""" + bulk_remove_workspace_members_request: components_bulkremoveworkspacemembersrequest.BulkRemoveWorkspaceMembersRequestTypedDict + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class BulkRemoveWorkspaceMembersRequest(BaseModel): + id: Annotated[ + str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False)) + ] + r"""The workspace ID (UUID) or slug""" + + bulk_remove_workspace_members_request: Annotated[ + components_bulkremoveworkspacemembersrequest.BulkRemoveWorkspaceMembersRequest, + FieldMetadata(request=RequestMetadata(media_type="application/json")), + ] + + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ diff --git a/src/openrouter/operations/createaudiospeech.py b/src/openrouter/operations/createaudiospeech.py new file mode 100644 index 0000000..dae7b28 --- /dev/null +++ b/src/openrouter/operations/createaudiospeech.py @@ -0,0 +1,107 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.components import speechrequest as components_speechrequest +from openrouter.types import BaseModel +from openrouter.utils import FieldMetadata, HeaderMetadata, RequestMetadata +import pydantic +from typing import Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +class CreateAudioSpeechGlobalsTypedDict(TypedDict): + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class CreateAudioSpeechGlobals(BaseModel): + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class CreateAudioSpeechRequestTypedDict(TypedDict): + speech_request: components_speechrequest.SpeechRequestTypedDict + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class CreateAudioSpeechRequest(BaseModel): + speech_request: Annotated[ + components_speechrequest.SpeechRequest, + FieldMetadata(request=RequestMetadata(media_type="application/json")), + ] + + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ diff --git a/src/openrouter/operations/createembeddings.py b/src/openrouter/operations/createembeddings.py index 3872d32..e0efba7 100644 --- a/src/openrouter/operations/createembeddings.py +++ b/src/openrouter/operations/createembeddings.py @@ -323,6 +323,35 @@ class CreateEmbeddingsData(BaseModel): Object = Literal["list",] +class PromptTokensDetailsTypedDict(TypedDict): + r"""Per-modality token breakdown. Only present when the input contains 2+ modalities (e.g. text + image) and the upstream provider returns modality-level usage data. Only non-zero modality counts are included.""" + + audio_tokens: NotRequired[int] + r"""Number of audio tokens in the input""" + image_tokens: NotRequired[int] + r"""Number of image tokens in the input""" + text_tokens: NotRequired[int] + r"""Number of text tokens in the input""" + video_tokens: NotRequired[int] + r"""Number of video tokens in the input""" + + +class PromptTokensDetails(BaseModel): + r"""Per-modality token breakdown. Only present when the input contains 2+ modalities (e.g. text + image) and the upstream provider returns modality-level usage data. Only non-zero modality counts are included.""" + + audio_tokens: Optional[int] = None + r"""Number of audio tokens in the input""" + + image_tokens: Optional[int] = None + r"""Number of image tokens in the input""" + + text_tokens: Optional[int] = None + r"""Number of text tokens in the input""" + + video_tokens: Optional[int] = None + r"""Number of video tokens in the input""" + + class CreateEmbeddingsUsageTypedDict(TypedDict): r"""Token usage statistics""" @@ -332,6 +361,8 @@ class CreateEmbeddingsUsageTypedDict(TypedDict): r"""Total number of tokens used""" cost: NotRequired[float] r"""Cost of the request in credits""" + prompt_tokens_details: NotRequired[PromptTokensDetailsTypedDict] + r"""Per-modality token breakdown. Only present when the input contains 2+ modalities (e.g. text + image) and the upstream provider returns modality-level usage data. Only non-zero modality counts are included.""" class CreateEmbeddingsUsage(BaseModel): @@ -346,6 +377,9 @@ class CreateEmbeddingsUsage(BaseModel): cost: Optional[float] = None r"""Cost of the request in credits""" + prompt_tokens_details: Optional[PromptTokensDetails] = None + r"""Per-modality token breakdown. Only present when the input contains 2+ modalities (e.g. text + image) and the upstream provider returns modality-level usage data. Only non-zero modality counts are included.""" + class CreateEmbeddingsResponseBodyTypedDict(TypedDict): r"""Embeddings response containing embedding vectors""" diff --git a/src/openrouter/operations/createkeys.py b/src/openrouter/operations/createkeys.py index 5ed218d..6d18cf7 100644 --- a/src/openrouter/operations/createkeys.py +++ b/src/openrouter/operations/createkeys.py @@ -93,6 +93,8 @@ class CreateKeysRequestBodyTypedDict(TypedDict): r"""Optional spending limit for the API key in USD""" limit_reset: NotRequired[Nullable[CreateKeysLimitReset]] r"""Type of limit reset for the API key (daily, weekly, monthly, or null for no reset). Resets happen automatically at midnight UTC, and weeks are Monday through Sunday.""" + workspace_id: NotRequired[str] + r"""The workspace to create the API key in. Defaults to the default workspace if not provided.""" class CreateKeysRequestBody(BaseModel): @@ -117,6 +119,9 @@ class CreateKeysRequestBody(BaseModel): ] = UNSET r"""Type of limit reset for the API key (daily, weekly, monthly, or null for no reset). Resets happen automatically at midnight UTC, and weeks are Monday through Sunday.""" + workspace_id: Optional[str] = None + r"""The workspace to create the API key in. Defaults to the default workspace if not provided.""" + @model_serializer(mode="wrap") def serialize_model(self, handler): optional_fields = [ @@ -125,6 +130,7 @@ def serialize_model(self, handler): "include_byok_in_limit", "limit", "limit_reset", + "workspace_id", ] nullable_fields = ["creator_user_id", "expires_at", "limit", "limit_reset"] null_default_fields = [] @@ -247,6 +253,8 @@ class CreateKeysDataTypedDict(TypedDict): r"""OpenRouter credit usage (in USD) for the current UTC month""" usage_weekly: float r"""OpenRouter credit usage (in USD) for the current UTC week (Monday-Sunday)""" + workspace_id: str + r"""The workspace ID this API key belongs to.""" expires_at: NotRequired[Nullable[datetime]] r"""ISO 8601 UTC timestamp when the API key expires, or null if no expiration""" @@ -311,6 +319,9 @@ class CreateKeysData(BaseModel): usage_weekly: float r"""OpenRouter credit usage (in USD) for the current UTC week (Monday-Sunday)""" + workspace_id: str + r"""The workspace ID this API key belongs to.""" + expires_at: OptionalNullable[datetime] = UNSET r"""ISO 8601 UTC timestamp when the API key expires, or null if no expiration""" diff --git a/src/openrouter/operations/createworkspace.py b/src/openrouter/operations/createworkspace.py new file mode 100644 index 0000000..1757be8 --- /dev/null +++ b/src/openrouter/operations/createworkspace.py @@ -0,0 +1,111 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.components import ( + createworkspacerequest as components_createworkspacerequest, +) +from openrouter.types import BaseModel +from openrouter.utils import FieldMetadata, HeaderMetadata, RequestMetadata +import pydantic +from typing import Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +class CreateWorkspaceGlobalsTypedDict(TypedDict): + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class CreateWorkspaceGlobals(BaseModel): + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class CreateWorkspaceRequestTypedDict(TypedDict): + create_workspace_request: ( + components_createworkspacerequest.CreateWorkspaceRequestTypedDict + ) + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class CreateWorkspaceRequest(BaseModel): + create_workspace_request: Annotated[ + components_createworkspacerequest.CreateWorkspaceRequest, + FieldMetadata(request=RequestMetadata(media_type="application/json")), + ] + + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ diff --git a/src/openrouter/operations/deleteworkspace.py b/src/openrouter/operations/deleteworkspace.py new file mode 100644 index 0000000..fbfef88 --- /dev/null +++ b/src/openrouter/operations/deleteworkspace.py @@ -0,0 +1,107 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel +from openrouter.utils import FieldMetadata, HeaderMetadata, PathParamMetadata +import pydantic +from typing import Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +class DeleteWorkspaceGlobalsTypedDict(TypedDict): + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class DeleteWorkspaceGlobals(BaseModel): + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class DeleteWorkspaceRequestTypedDict(TypedDict): + id: str + r"""The workspace ID (UUID) or slug""" + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class DeleteWorkspaceRequest(BaseModel): + id: Annotated[ + str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False)) + ] + r"""The workspace ID (UUID) or slug""" + + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ diff --git a/src/openrouter/operations/getgeneration.py b/src/openrouter/operations/getgeneration.py index 94dfcb7..bf21d05 100644 --- a/src/openrouter/operations/getgeneration.py +++ b/src/openrouter/operations/getgeneration.py @@ -1,25 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from openrouter.components import providerresponse as components_providerresponse -from openrouter.types import ( - BaseModel, - Nullable, - OptionalNullable, - UNSET, - UNSET_SENTINEL, - UnrecognizedStr, -) -from openrouter.utils import ( - FieldMetadata, - HeaderMetadata, - QueryParamMetadata, - validate_open_enum, -) +from openrouter.types import BaseModel +from openrouter.utils import FieldMetadata, HeaderMetadata, QueryParamMetadata import pydantic -from pydantic import model_serializer -from pydantic.functional_validators import PlainValidator -from typing import List, Literal, Optional, Union +from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -120,292 +105,3 @@ class GetGenerationRequest(BaseModel): r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. """ - - -APIType = Union[ - Literal[ - "completions", - "embeddings", - "rerank", - "video", - ], - UnrecognizedStr, -] -r"""Type of API used for the generation""" - - -class GetGenerationDataTypedDict(TypedDict): - r"""Generation data""" - - api_type: Nullable[APIType] - r"""Type of API used for the generation""" - app_id: Nullable[int] - r"""ID of the app that made the request""" - cache_discount: Nullable[float] - r"""Discount applied due to caching""" - cancelled: Nullable[bool] - r"""Whether the generation was cancelled""" - created_at: str - r"""ISO 8601 timestamp of when the generation was created""" - external_user: Nullable[str] - r"""External user identifier""" - finish_reason: Nullable[str] - r"""Reason the generation finished""" - generation_time: Nullable[float] - r"""Time taken for generation in milliseconds""" - http_referer: Nullable[str] - r"""Referer header from the request""" - id: str - r"""Unique identifier for the generation""" - is_byok: bool - r"""Whether this used bring-your-own-key""" - latency: Nullable[float] - r"""Total latency in milliseconds""" - model: str - r"""Model used for the generation""" - moderation_latency: Nullable[float] - r"""Moderation latency in milliseconds""" - native_finish_reason: Nullable[str] - r"""Native finish reason as reported by provider""" - native_tokens_cached: Nullable[int] - r"""Native cached tokens as reported by provider""" - native_tokens_completion: Nullable[int] - r"""Native completion tokens as reported by provider""" - native_tokens_completion_images: Nullable[int] - r"""Native completion image tokens as reported by provider""" - native_tokens_prompt: Nullable[int] - r"""Native prompt tokens as reported by provider""" - native_tokens_reasoning: Nullable[int] - r"""Native reasoning tokens as reported by provider""" - num_input_audio_prompt: Nullable[int] - r"""Number of audio inputs in the prompt""" - num_media_completion: Nullable[int] - r"""Number of media items in the completion""" - num_media_prompt: Nullable[int] - r"""Number of media items in the prompt""" - num_search_results: Nullable[int] - r"""Number of search results included""" - origin: str - r"""Origin URL of the request""" - provider_name: Nullable[str] - r"""Name of the provider that served the request""" - provider_responses: Nullable[ - List[components_providerresponse.ProviderResponseTypedDict] - ] - r"""List of provider responses for this generation, including fallback attempts""" - router: Nullable[str] - r"""Router used for the request (e.g., openrouter/auto)""" - streamed: Nullable[bool] - r"""Whether the response was streamed""" - tokens_completion: Nullable[int] - r"""Number of tokens in the completion""" - tokens_prompt: Nullable[int] - r"""Number of tokens in the prompt""" - total_cost: float - r"""Total cost of the generation in USD""" - upstream_id: Nullable[str] - r"""Upstream provider's identifier for this generation""" - upstream_inference_cost: Nullable[float] - r"""Cost charged by the upstream provider""" - usage: float - r"""Usage amount in USD""" - user_agent: Nullable[str] - r"""User-Agent header from the request""" - request_id: NotRequired[Nullable[str]] - r"""Unique identifier grouping all generations from a single API request""" - session_id: NotRequired[Nullable[str]] - r"""Session identifier grouping multiple generations in the same session""" - - -class GetGenerationData(BaseModel): - r"""Generation data""" - - api_type: Annotated[Nullable[APIType], PlainValidator(validate_open_enum(False))] - r"""Type of API used for the generation""" - - app_id: Nullable[int] - r"""ID of the app that made the request""" - - cache_discount: Nullable[float] - r"""Discount applied due to caching""" - - cancelled: Nullable[bool] - r"""Whether the generation was cancelled""" - - created_at: str - r"""ISO 8601 timestamp of when the generation was created""" - - external_user: Nullable[str] - r"""External user identifier""" - - finish_reason: Nullable[str] - r"""Reason the generation finished""" - - generation_time: Nullable[float] - r"""Time taken for generation in milliseconds""" - - http_referer: Nullable[str] - r"""Referer header from the request""" - - id: str - r"""Unique identifier for the generation""" - - is_byok: bool - r"""Whether this used bring-your-own-key""" - - latency: Nullable[float] - r"""Total latency in milliseconds""" - - model: str - r"""Model used for the generation""" - - moderation_latency: Nullable[float] - r"""Moderation latency in milliseconds""" - - native_finish_reason: Nullable[str] - r"""Native finish reason as reported by provider""" - - native_tokens_cached: Nullable[int] - r"""Native cached tokens as reported by provider""" - - native_tokens_completion: Nullable[int] - r"""Native completion tokens as reported by provider""" - - native_tokens_completion_images: Nullable[int] - r"""Native completion image tokens as reported by provider""" - - native_tokens_prompt: Nullable[int] - r"""Native prompt tokens as reported by provider""" - - native_tokens_reasoning: Nullable[int] - r"""Native reasoning tokens as reported by provider""" - - num_input_audio_prompt: Nullable[int] - r"""Number of audio inputs in the prompt""" - - num_media_completion: Nullable[int] - r"""Number of media items in the completion""" - - num_media_prompt: Nullable[int] - r"""Number of media items in the prompt""" - - num_search_results: Nullable[int] - r"""Number of search results included""" - - origin: str - r"""Origin URL of the request""" - - provider_name: Nullable[str] - r"""Name of the provider that served the request""" - - provider_responses: Nullable[List[components_providerresponse.ProviderResponse]] - r"""List of provider responses for this generation, including fallback attempts""" - - router: Nullable[str] - r"""Router used for the request (e.g., openrouter/auto)""" - - streamed: Nullable[bool] - r"""Whether the response was streamed""" - - tokens_completion: Nullable[int] - r"""Number of tokens in the completion""" - - tokens_prompt: Nullable[int] - r"""Number of tokens in the prompt""" - - total_cost: float - r"""Total cost of the generation in USD""" - - upstream_id: Nullable[str] - r"""Upstream provider's identifier for this generation""" - - upstream_inference_cost: Nullable[float] - r"""Cost charged by the upstream provider""" - - usage: float - r"""Usage amount in USD""" - - user_agent: Nullable[str] - r"""User-Agent header from the request""" - - request_id: OptionalNullable[str] = UNSET - r"""Unique identifier grouping all generations from a single API request""" - - session_id: OptionalNullable[str] = UNSET - r"""Session identifier grouping multiple generations in the same session""" - - @model_serializer(mode="wrap") - def serialize_model(self, handler): - optional_fields = ["request_id", "session_id"] - nullable_fields = [ - "api_type", - "app_id", - "cache_discount", - "cancelled", - "external_user", - "finish_reason", - "generation_time", - "http_referer", - "latency", - "moderation_latency", - "native_finish_reason", - "native_tokens_cached", - "native_tokens_completion", - "native_tokens_completion_images", - "native_tokens_prompt", - "native_tokens_reasoning", - "num_input_audio_prompt", - "num_media_completion", - "num_media_prompt", - "num_search_results", - "provider_name", - "provider_responses", - "request_id", - "router", - "session_id", - "streamed", - "tokens_completion", - "tokens_prompt", - "upstream_id", - "upstream_inference_cost", - "user_agent", - ] - null_default_fields = [] - - serialized = handler(self) - - m = {} - - for n, f in type(self).model_fields.items(): - k = f.alias or n - val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val - - return m - - -class GetGenerationResponseTypedDict(TypedDict): - r"""Generation response""" - - data: GetGenerationDataTypedDict - r"""Generation data""" - - -class GetGenerationResponse(BaseModel): - r"""Generation response""" - - data: GetGenerationData - r"""Generation data""" diff --git a/src/openrouter/operations/getkey.py b/src/openrouter/operations/getkey.py index ec3948b..d2370a9 100644 --- a/src/openrouter/operations/getkey.py +++ b/src/openrouter/operations/getkey.py @@ -156,6 +156,8 @@ class GetKeyDataTypedDict(TypedDict): r"""OpenRouter credit usage (in USD) for the current UTC month""" usage_weekly: float r"""OpenRouter credit usage (in USD) for the current UTC week (Monday-Sunday)""" + workspace_id: str + r"""The workspace ID this API key belongs to.""" expires_at: NotRequired[Nullable[datetime]] r"""ISO 8601 UTC timestamp when the API key expires, or null if no expiration""" @@ -220,6 +222,9 @@ class GetKeyData(BaseModel): usage_weekly: float r"""OpenRouter credit usage (in USD) for the current UTC week (Monday-Sunday)""" + workspace_id: str + r"""The workspace ID this API key belongs to.""" + expires_at: OptionalNullable[datetime] = UNSET r"""ISO 8601 UTC timestamp when the API key expires, or null if no expiration""" diff --git a/src/openrouter/operations/getworkspace.py b/src/openrouter/operations/getworkspace.py new file mode 100644 index 0000000..f4d279e --- /dev/null +++ b/src/openrouter/operations/getworkspace.py @@ -0,0 +1,107 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel +from openrouter.utils import FieldMetadata, HeaderMetadata, PathParamMetadata +import pydantic +from typing import Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +class GetWorkspaceGlobalsTypedDict(TypedDict): + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class GetWorkspaceGlobals(BaseModel): + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class GetWorkspaceRequestTypedDict(TypedDict): + id: str + r"""The workspace ID (UUID) or slug""" + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class GetWorkspaceRequest(BaseModel): + id: Annotated[ + str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False)) + ] + r"""The workspace ID (UUID) or slug""" + + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ diff --git a/src/openrouter/operations/list.py b/src/openrouter/operations/list.py index e1d703c..bf9965a 100644 --- a/src/openrouter/operations/list.py +++ b/src/openrouter/operations/list.py @@ -80,6 +80,8 @@ class ListRequestTypedDict(TypedDict): r"""Whether to include disabled API keys in the response""" offset: NotRequired[int] r"""Number of API keys to skip for pagination""" + workspace_id: NotRequired[str] + r"""Filter API keys by workspace ID. By default, keys in the default workspace are returned.""" class ListRequest(BaseModel): @@ -123,6 +125,12 @@ class ListRequest(BaseModel): ] = None r"""Number of API keys to skip for pagination""" + workspace_id: Annotated[ + Optional[str], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = None + r"""Filter API keys by workspace ID. By default, keys in the default workspace are returned.""" + class ListDataTypedDict(TypedDict): byok_usage: float @@ -163,6 +171,8 @@ class ListDataTypedDict(TypedDict): r"""OpenRouter credit usage (in USD) for the current UTC month""" usage_weekly: float r"""OpenRouter credit usage (in USD) for the current UTC week (Monday-Sunday)""" + workspace_id: str + r"""The workspace ID this API key belongs to.""" expires_at: NotRequired[Nullable[datetime]] r"""ISO 8601 UTC timestamp when the API key expires, or null if no expiration""" @@ -225,6 +235,9 @@ class ListData(BaseModel): usage_weekly: float r"""OpenRouter credit usage (in USD) for the current UTC week (Monday-Sunday)""" + workspace_id: str + r"""The workspace ID this API key belongs to.""" + expires_at: OptionalNullable[datetime] = UNSET r"""ISO 8601 UTC timestamp when the API key expires, or null if no expiration""" diff --git a/src/openrouter/operations/listgenerationcontent.py b/src/openrouter/operations/listgenerationcontent.py new file mode 100644 index 0000000..8d19500 --- /dev/null +++ b/src/openrouter/operations/listgenerationcontent.py @@ -0,0 +1,107 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel +from openrouter.utils import FieldMetadata, HeaderMetadata, QueryParamMetadata +import pydantic +from typing import Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +class ListGenerationContentGlobalsTypedDict(TypedDict): + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class ListGenerationContentGlobals(BaseModel): + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class ListGenerationContentRequestTypedDict(TypedDict): + id: str + r"""The generation ID""" + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class ListGenerationContentRequest(BaseModel): + id: Annotated[ + str, FieldMetadata(query=QueryParamMetadata(style="form", explode=True)) + ] + r"""The generation ID""" + + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ diff --git a/src/openrouter/operations/listguardrails.py b/src/openrouter/operations/listguardrails.py index 8345e0e..f91db9e 100644 --- a/src/openrouter/operations/listguardrails.py +++ b/src/openrouter/operations/listguardrails.py @@ -75,6 +75,8 @@ class ListGuardrailsRequestTypedDict(TypedDict): r"""Number of records to skip for pagination""" limit: NotRequired[int] r"""Maximum number of records to return (max 100)""" + workspace_id: NotRequired[str] + r"""Filter guardrails by workspace ID. By default, guardrails in the default workspace are returned.""" class ListGuardrailsRequest(BaseModel): @@ -118,6 +120,12 @@ class ListGuardrailsRequest(BaseModel): ] = None r"""Maximum number of records to return (max 100)""" + workspace_id: Annotated[ + Optional[str], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = None + r"""Filter guardrails by workspace ID. By default, guardrails in the default workspace are returned.""" + class ListGuardrailsResponseTypedDict(TypedDict): result: components_listguardrailsresponse.ListGuardrailsResponseTypedDict diff --git a/src/openrouter/operations/listworkspaces.py b/src/openrouter/operations/listworkspaces.py new file mode 100644 index 0000000..236dc18 --- /dev/null +++ b/src/openrouter/operations/listworkspaces.py @@ -0,0 +1,132 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.components import ( + listworkspacesresponse as components_listworkspacesresponse, +) +from openrouter.types import BaseModel +from openrouter.utils import FieldMetadata, HeaderMetadata, QueryParamMetadata +import pydantic +from typing import Awaitable, Callable, Optional, Union +from typing_extensions import Annotated, NotRequired, TypedDict + + +class ListWorkspacesGlobalsTypedDict(TypedDict): + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class ListWorkspacesGlobals(BaseModel): + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class ListWorkspacesRequestTypedDict(TypedDict): + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + offset: NotRequired[int] + r"""Number of records to skip for pagination""" + limit: NotRequired[int] + r"""Maximum number of records to return (max 100)""" + + +class ListWorkspacesRequest(BaseModel): + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + offset: Annotated[ + Optional[int], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = None + r"""Number of records to skip for pagination""" + + limit: Annotated[ + Optional[int], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = None + r"""Maximum number of records to return (max 100)""" + + +class ListWorkspacesResponseTypedDict(TypedDict): + result: components_listworkspacesresponse.ListWorkspacesResponseTypedDict + + +class ListWorkspacesResponse(BaseModel): + next: Union[ + Callable[[], Optional[ListWorkspacesResponse]], + Callable[[], Awaitable[Optional[ListWorkspacesResponse]]], + ] + + result: components_listworkspacesresponse.ListWorkspacesResponse diff --git a/src/openrouter/operations/updatekeys.py b/src/openrouter/operations/updatekeys.py index a8d2f86..8ea2365 100644 --- a/src/openrouter/operations/updatekeys.py +++ b/src/openrouter/operations/updatekeys.py @@ -250,6 +250,8 @@ class UpdateKeysDataTypedDict(TypedDict): r"""OpenRouter credit usage (in USD) for the current UTC month""" usage_weekly: float r"""OpenRouter credit usage (in USD) for the current UTC week (Monday-Sunday)""" + workspace_id: str + r"""The workspace ID this API key belongs to.""" expires_at: NotRequired[Nullable[datetime]] r"""ISO 8601 UTC timestamp when the API key expires, or null if no expiration""" @@ -314,6 +316,9 @@ class UpdateKeysData(BaseModel): usage_weekly: float r"""OpenRouter credit usage (in USD) for the current UTC week (Monday-Sunday)""" + workspace_id: str + r"""The workspace ID this API key belongs to.""" + expires_at: OptionalNullable[datetime] = UNSET r"""ISO 8601 UTC timestamp when the API key expires, or null if no expiration""" diff --git a/src/openrouter/operations/updateworkspace.py b/src/openrouter/operations/updateworkspace.py new file mode 100644 index 0000000..4ab7929 --- /dev/null +++ b/src/openrouter/operations/updateworkspace.py @@ -0,0 +1,123 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.components import ( + updateworkspacerequest as components_updateworkspacerequest, +) +from openrouter.types import BaseModel +from openrouter.utils import ( + FieldMetadata, + HeaderMetadata, + PathParamMetadata, + RequestMetadata, +) +import pydantic +from typing import Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +class UpdateWorkspaceGlobalsTypedDict(TypedDict): + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class UpdateWorkspaceGlobals(BaseModel): + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class UpdateWorkspaceRequestTypedDict(TypedDict): + id: str + r"""The workspace ID (UUID) or slug""" + update_workspace_request: ( + components_updateworkspacerequest.UpdateWorkspaceRequestTypedDict + ) + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class UpdateWorkspaceRequest(BaseModel): + id: Annotated[ + str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False)) + ] + r"""The workspace ID (UUID) or slug""" + + update_workspace_request: Annotated[ + components_updateworkspacerequest.UpdateWorkspaceRequest, + FieldMetadata(request=RequestMetadata(media_type="application/json")), + ] + + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ diff --git a/src/openrouter/sdk.py b/src/openrouter/sdk.py index 43d1636..580ff52 100644 --- a/src/openrouter/sdk.py +++ b/src/openrouter/sdk.py @@ -30,7 +30,9 @@ from openrouter.organization import Organization from openrouter.providers import Providers from openrouter.rerank import Rerank + from openrouter.tts import Tts from openrouter.video_generation import VideoGeneration + from openrouter.workspaces import Workspaces class OpenRouter(BaseSDK): @@ -40,6 +42,8 @@ class OpenRouter(BaseSDK): analytics: "Analytics" r"""Analytics and usage endpoints""" + tts: "Tts" + r"""Text-to-speech endpoints""" o_auth: "OAuth" r"""OAuth authentication endpoints""" chat: "Chat" @@ -66,8 +70,11 @@ class OpenRouter(BaseSDK): beta: "Beta" video_generation: "VideoGeneration" r"""Video Generation endpoints""" + workspaces: "Workspaces" + r"""Workspaces endpoints""" _sub_sdk_map = { "analytics": ("openrouter.analytics", "Analytics"), + "tts": ("openrouter.tts", "Tts"), "o_auth": ("openrouter.oauth", "OAuth"), "chat": ("openrouter.chat", "Chat"), "credits": ("openrouter.credits", "Credits"), @@ -82,6 +89,7 @@ class OpenRouter(BaseSDK): "rerank": ("openrouter.rerank", "Rerank"), "beta": ("openrouter.beta", "Beta"), "video_generation": ("openrouter.video_generation", "VideoGeneration"), + "workspaces": ("openrouter.workspaces", "Workspaces"), } def __init__( diff --git a/src/openrouter/tts.py b/src/openrouter/tts.py new file mode 100644 index 0000000..9a54e40 --- /dev/null +++ b/src/openrouter/tts.py @@ -0,0 +1,472 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from .basesdk import BaseSDK +import httpx +from openrouter import components, errors, operations, utils +from openrouter._hooks import HookContext +from openrouter.types import OptionalNullable, UNSET +from openrouter.utils import get_security_from_env +from openrouter.utils.unmarshal_json_response import unmarshal_json_response +from typing import Any, Mapping, Optional, Union + + +class Tts(BaseSDK): + r"""Text-to-speech endpoints""" + + def create_speech( + self, + *, + input: str, + model: str, + voice: str, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + provider: Optional[ + Union[ + components.SpeechRequestProvider, + components.SpeechRequestProviderTypedDict, + ] + ] = None, + response_format: Optional[components.ResponseFormatEnum] = "pcm", + speed: Optional[float] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> httpx.Response: + r"""Create speech + + Synthesizes audio from the input text + + :param input: Text to synthesize + :param model: TTS model identifier + :param voice: Voice identifier (provider-specific). + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param provider: Provider-specific passthrough configuration + :param response_format: Audio output format + :param speed: Playback speed multiplier. Only used by models that support it (e.g. OpenAI TTS). Ignored by other providers. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.CreateAudioSpeechRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + speech_request=components.SpeechRequest( + input=input, + model=model, + provider=utils.get_pydantic_model( + provider, Optional[components.SpeechRequestProvider] + ), + response_format=response_format, + speed=speed, + voice=voice, + ), + ) + + req = self._build_request( + method="POST", + path="/audio/speech", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="audio/*", + http_headers=http_headers, + _globals=operations.CreateAudioSpeechGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.speech_request, False, False, "json", components.SpeechRequest + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="createAudioSpeech", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + ), + request=req, + error_status_codes=[ + "400", + "401", + "402", + "404", + "429", + "4XX", + "500", + "502", + "503", + "524", + "529", + "5XX", + ], + stream=True, + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "audio/*"): + return http_res + if utils.match_response(http_res, "400", "application/json"): + http_res_text = utils.stream_to_text(http_res) + response_data = unmarshal_json_response( + errors.BadRequestResponseErrorData, http_res, http_res_text + ) + raise errors.BadRequestResponseError(response_data, http_res, http_res_text) + if utils.match_response(http_res, "401", "application/json"): + http_res_text = utils.stream_to_text(http_res) + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res, http_res_text + ) + raise errors.UnauthorizedResponseError( + response_data, http_res, http_res_text + ) + if utils.match_response(http_res, "402", "application/json"): + http_res_text = utils.stream_to_text(http_res) + response_data = unmarshal_json_response( + errors.PaymentRequiredResponseErrorData, http_res, http_res_text + ) + raise errors.PaymentRequiredResponseError( + response_data, http_res, http_res_text + ) + if utils.match_response(http_res, "404", "application/json"): + http_res_text = utils.stream_to_text(http_res) + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res, http_res_text + ) + raise errors.NotFoundResponseError(response_data, http_res, http_res_text) + if utils.match_response(http_res, "429", "application/json"): + http_res_text = utils.stream_to_text(http_res) + response_data = unmarshal_json_response( + errors.TooManyRequestsResponseErrorData, http_res, http_res_text + ) + raise errors.TooManyRequestsResponseError( + response_data, http_res, http_res_text + ) + if utils.match_response(http_res, "500", "application/json"): + http_res_text = utils.stream_to_text(http_res) + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res, http_res_text + ) + raise errors.InternalServerResponseError( + response_data, http_res, http_res_text + ) + if utils.match_response(http_res, "502", "application/json"): + http_res_text = utils.stream_to_text(http_res) + response_data = unmarshal_json_response( + errors.BadGatewayResponseErrorData, http_res, http_res_text + ) + raise errors.BadGatewayResponseError(response_data, http_res, http_res_text) + if utils.match_response(http_res, "503", "application/json"): + http_res_text = utils.stream_to_text(http_res) + response_data = unmarshal_json_response( + errors.ServiceUnavailableResponseErrorData, http_res, http_res_text + ) + raise errors.ServiceUnavailableResponseError( + response_data, http_res, http_res_text + ) + if utils.match_response(http_res, "524", "application/json"): + http_res_text = utils.stream_to_text(http_res) + response_data = unmarshal_json_response( + errors.EdgeNetworkTimeoutResponseErrorData, http_res, http_res_text + ) + raise errors.EdgeNetworkTimeoutResponseError( + response_data, http_res, http_res_text + ) + if utils.match_response(http_res, "529", "application/json"): + http_res_text = utils.stream_to_text(http_res) + response_data = unmarshal_json_response( + errors.ProviderOverloadedResponseErrorData, http_res, http_res_text + ) + raise errors.ProviderOverloadedResponseError( + response_data, http_res, http_res_text + ) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "Unexpected response received", http_res, http_res_text + ) + + async def create_speech_async( + self, + *, + input: str, + model: str, + voice: str, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + provider: Optional[ + Union[ + components.SpeechRequestProvider, + components.SpeechRequestProviderTypedDict, + ] + ] = None, + response_format: Optional[components.ResponseFormatEnum] = "pcm", + speed: Optional[float] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> httpx.Response: + r"""Create speech + + Synthesizes audio from the input text + + :param input: Text to synthesize + :param model: TTS model identifier + :param voice: Voice identifier (provider-specific). + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param provider: Provider-specific passthrough configuration + :param response_format: Audio output format + :param speed: Playback speed multiplier. Only used by models that support it (e.g. OpenAI TTS). Ignored by other providers. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.CreateAudioSpeechRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + speech_request=components.SpeechRequest( + input=input, + model=model, + provider=utils.get_pydantic_model( + provider, Optional[components.SpeechRequestProvider] + ), + response_format=response_format, + speed=speed, + voice=voice, + ), + ) + + req = self._build_request_async( + method="POST", + path="/audio/speech", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="audio/*", + http_headers=http_headers, + _globals=operations.CreateAudioSpeechGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.speech_request, False, False, "json", components.SpeechRequest + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="createAudioSpeech", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + ), + request=req, + error_status_codes=[ + "400", + "401", + "402", + "404", + "429", + "4XX", + "500", + "502", + "503", + "524", + "529", + "5XX", + ], + stream=True, + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "audio/*"): + return http_res + if utils.match_response(http_res, "400", "application/json"): + http_res_text = await utils.stream_to_text_async(http_res) + response_data = unmarshal_json_response( + errors.BadRequestResponseErrorData, http_res, http_res_text + ) + raise errors.BadRequestResponseError(response_data, http_res, http_res_text) + if utils.match_response(http_res, "401", "application/json"): + http_res_text = await utils.stream_to_text_async(http_res) + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res, http_res_text + ) + raise errors.UnauthorizedResponseError( + response_data, http_res, http_res_text + ) + if utils.match_response(http_res, "402", "application/json"): + http_res_text = await utils.stream_to_text_async(http_res) + response_data = unmarshal_json_response( + errors.PaymentRequiredResponseErrorData, http_res, http_res_text + ) + raise errors.PaymentRequiredResponseError( + response_data, http_res, http_res_text + ) + if utils.match_response(http_res, "404", "application/json"): + http_res_text = await utils.stream_to_text_async(http_res) + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res, http_res_text + ) + raise errors.NotFoundResponseError(response_data, http_res, http_res_text) + if utils.match_response(http_res, "429", "application/json"): + http_res_text = await utils.stream_to_text_async(http_res) + response_data = unmarshal_json_response( + errors.TooManyRequestsResponseErrorData, http_res, http_res_text + ) + raise errors.TooManyRequestsResponseError( + response_data, http_res, http_res_text + ) + if utils.match_response(http_res, "500", "application/json"): + http_res_text = await utils.stream_to_text_async(http_res) + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res, http_res_text + ) + raise errors.InternalServerResponseError( + response_data, http_res, http_res_text + ) + if utils.match_response(http_res, "502", "application/json"): + http_res_text = await utils.stream_to_text_async(http_res) + response_data = unmarshal_json_response( + errors.BadGatewayResponseErrorData, http_res, http_res_text + ) + raise errors.BadGatewayResponseError(response_data, http_res, http_res_text) + if utils.match_response(http_res, "503", "application/json"): + http_res_text = await utils.stream_to_text_async(http_res) + response_data = unmarshal_json_response( + errors.ServiceUnavailableResponseErrorData, http_res, http_res_text + ) + raise errors.ServiceUnavailableResponseError( + response_data, http_res, http_res_text + ) + if utils.match_response(http_res, "524", "application/json"): + http_res_text = await utils.stream_to_text_async(http_res) + response_data = unmarshal_json_response( + errors.EdgeNetworkTimeoutResponseErrorData, http_res, http_res_text + ) + raise errors.EdgeNetworkTimeoutResponseError( + response_data, http_res, http_res_text + ) + if utils.match_response(http_res, "529", "application/json"): + http_res_text = await utils.stream_to_text_async(http_res) + response_data = unmarshal_json_response( + errors.ProviderOverloadedResponseErrorData, http_res, http_res_text + ) + raise errors.ProviderOverloadedResponseError( + response_data, http_res, http_res_text + ) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "Unexpected response received", http_res, http_res_text + ) diff --git a/src/openrouter/video_generation.py b/src/openrouter/video_generation.py index 238bbcc..60a2a38 100644 --- a/src/openrouter/video_generation.py +++ b/src/openrouter/video_generation.py @@ -34,7 +34,10 @@ def generate( ] ] = None, provider: Optional[ - Union[components.Provider, components.ProviderTypedDict] + Union[ + components.VideoGenerationRequestProvider, + components.VideoGenerationRequestProviderTypedDict, + ] ] = None, resolution: Optional[components.Resolution] = None, seed: Optional[int] = None, @@ -98,7 +101,7 @@ def generate( model=model, prompt=prompt, provider=utils.get_pydantic_model( - provider, Optional[components.Provider] + provider, Optional[components.VideoGenerationRequestProvider] ), resolution=resolution, seed=seed, @@ -229,7 +232,10 @@ async def generate_async( ] ] = None, provider: Optional[ - Union[components.Provider, components.ProviderTypedDict] + Union[ + components.VideoGenerationRequestProvider, + components.VideoGenerationRequestProviderTypedDict, + ] ] = None, resolution: Optional[components.Resolution] = None, seed: Optional[int] = None, @@ -293,7 +299,7 @@ async def generate_async( model=model, prompt=prompt, provider=utils.get_pydantic_model( - provider, Optional[components.Provider] + provider, Optional[components.VideoGenerationRequestProvider] ), resolution=resolution, seed=seed, diff --git a/src/openrouter/workspaces.py b/src/openrouter/workspaces.py new file mode 100644 index 0000000..5d6e6ce --- /dev/null +++ b/src/openrouter/workspaces.py @@ -0,0 +1,2119 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from .basesdk import BaseSDK +from jsonpath import JSONPath +from openrouter import components, errors, operations, utils +from openrouter._hooks import HookContext +from openrouter.types import OptionalNullable, UNSET +from openrouter.utils import get_security_from_env +from openrouter.utils.unmarshal_json_response import unmarshal_json_response +from typing import Any, Awaitable, Dict, List, Mapping, Optional, Union + + +class Workspaces(BaseSDK): + r"""Workspaces endpoints""" + + def list( + self, + *, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + offset: Optional[int] = None, + limit: Optional[int] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[operations.ListWorkspacesResponse]: + r"""List workspaces + + List all workspaces for the authenticated user. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param offset: Number of records to skip for pagination + :param limit: Maximum number of records to return (max 100) + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.ListWorkspacesRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + offset=offset, + limit=limit, + ) + + req = self._build_request( + method="GET", + path="/workspaces", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.ListWorkspacesGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="listWorkspaces", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + ), + request=req, + error_status_codes=["401", "4XX", "500", "5XX"], + retry_config=retry_config, + ) + + def next_func() -> Optional[operations.ListWorkspacesResponse]: + body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]]) + + offset = request.offset if not request.offset is None else 0 + + if not http_res.text: + return None + results = JSONPath("$.data").parse(body) + if len(results) == 0 or len(results[0]) == 0: + return None + limit = request.limit if not request.limit is None else 0 + if len(results[0]) < limit: + return None + next_offset = offset + len(results[0]) + + return self.list( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + offset=next_offset, + limit=limit, + retries=retries, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return operations.ListWorkspacesResponse( + result=unmarshal_json_response( + components.ListWorkspacesResponse, http_res + ), + next=next_func, + ) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + async def list_async( + self, + *, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + offset: Optional[int] = None, + limit: Optional[int] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[operations.ListWorkspacesResponse]: + r"""List workspaces + + List all workspaces for the authenticated user. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param offset: Number of records to skip for pagination + :param limit: Maximum number of records to return (max 100) + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.ListWorkspacesRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + offset=offset, + limit=limit, + ) + + req = self._build_request_async( + method="GET", + path="/workspaces", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.ListWorkspacesGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="listWorkspaces", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + ), + request=req, + error_status_codes=["401", "4XX", "500", "5XX"], + retry_config=retry_config, + ) + + def next_func() -> Awaitable[Optional[operations.ListWorkspacesResponse]]: + body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]]) + + async def empty_result(): + return None + + offset = request.offset if not request.offset is None else 0 + + if not http_res.text: + return empty_result() + results = JSONPath("$.data").parse(body) + if len(results) == 0 or len(results[0]) == 0: + return empty_result() + limit = request.limit if not request.limit is None else 0 + if len(results[0]) < limit: + return empty_result() + next_offset = offset + len(results[0]) + + return self.list_async( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + offset=next_offset, + limit=limit, + retries=retries, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return operations.ListWorkspacesResponse( + result=unmarshal_json_response( + components.ListWorkspacesResponse, http_res + ), + next=next_func, + ) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + def create( + self, + *, + name: str, + slug: str, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + default_image_model: OptionalNullable[str] = UNSET, + default_provider_sort: OptionalNullable[str] = UNSET, + default_text_model: OptionalNullable[str] = UNSET, + description: OptionalNullable[str] = UNSET, + is_data_discount_logging_enabled: Optional[bool] = None, + is_observability_broadcast_enabled: Optional[bool] = None, + is_observability_io_logging_enabled: Optional[bool] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.CreateWorkspaceResponse: + r"""Create a workspace + + Create a new workspace for the authenticated user. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param name: Name for the new workspace + :param slug: URL-friendly slug (lowercase alphanumeric and hyphens only) + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param default_image_model: Default image model for this workspace + :param default_provider_sort: Default provider sort preference (price, throughput, latency, exacto) + :param default_text_model: Default text model for this workspace + :param description: Description of the workspace + :param is_data_discount_logging_enabled: Whether data discount logging is enabled + :param is_observability_broadcast_enabled: Whether broadcast is enabled + :param is_observability_io_logging_enabled: Whether private logging is enabled + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.CreateWorkspaceRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + create_workspace_request=components.CreateWorkspaceRequest( + default_image_model=default_image_model, + default_provider_sort=default_provider_sort, + default_text_model=default_text_model, + description=description, + is_data_discount_logging_enabled=is_data_discount_logging_enabled, + is_observability_broadcast_enabled=is_observability_broadcast_enabled, + is_observability_io_logging_enabled=is_observability_io_logging_enabled, + name=name, + slug=slug, + ), + ) + + req = self._build_request( + method="POST", + path="/workspaces", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.CreateWorkspaceGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.create_workspace_request, + False, + False, + "json", + components.CreateWorkspaceRequest, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="createWorkspace", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + ), + request=req, + error_status_codes=["400", "401", "403", "4XX", "500", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "201", "application/json"): + return unmarshal_json_response(components.CreateWorkspaceResponse, http_res) + if utils.match_response(http_res, "400", "application/json"): + response_data = unmarshal_json_response( + errors.BadRequestResponseErrorData, http_res + ) + raise errors.BadRequestResponseError(response_data, http_res) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "403", "application/json"): + response_data = unmarshal_json_response( + errors.ForbiddenResponseErrorData, http_res + ) + raise errors.ForbiddenResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + async def create_async( + self, + *, + name: str, + slug: str, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + default_image_model: OptionalNullable[str] = UNSET, + default_provider_sort: OptionalNullable[str] = UNSET, + default_text_model: OptionalNullable[str] = UNSET, + description: OptionalNullable[str] = UNSET, + is_data_discount_logging_enabled: Optional[bool] = None, + is_observability_broadcast_enabled: Optional[bool] = None, + is_observability_io_logging_enabled: Optional[bool] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.CreateWorkspaceResponse: + r"""Create a workspace + + Create a new workspace for the authenticated user. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param name: Name for the new workspace + :param slug: URL-friendly slug (lowercase alphanumeric and hyphens only) + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param default_image_model: Default image model for this workspace + :param default_provider_sort: Default provider sort preference (price, throughput, latency, exacto) + :param default_text_model: Default text model for this workspace + :param description: Description of the workspace + :param is_data_discount_logging_enabled: Whether data discount logging is enabled + :param is_observability_broadcast_enabled: Whether broadcast is enabled + :param is_observability_io_logging_enabled: Whether private logging is enabled + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.CreateWorkspaceRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + create_workspace_request=components.CreateWorkspaceRequest( + default_image_model=default_image_model, + default_provider_sort=default_provider_sort, + default_text_model=default_text_model, + description=description, + is_data_discount_logging_enabled=is_data_discount_logging_enabled, + is_observability_broadcast_enabled=is_observability_broadcast_enabled, + is_observability_io_logging_enabled=is_observability_io_logging_enabled, + name=name, + slug=slug, + ), + ) + + req = self._build_request_async( + method="POST", + path="/workspaces", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.CreateWorkspaceGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.create_workspace_request, + False, + False, + "json", + components.CreateWorkspaceRequest, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="createWorkspace", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + ), + request=req, + error_status_codes=["400", "401", "403", "4XX", "500", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "201", "application/json"): + return unmarshal_json_response(components.CreateWorkspaceResponse, http_res) + if utils.match_response(http_res, "400", "application/json"): + response_data = unmarshal_json_response( + errors.BadRequestResponseErrorData, http_res + ) + raise errors.BadRequestResponseError(response_data, http_res) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "403", "application/json"): + response_data = unmarshal_json_response( + errors.ForbiddenResponseErrorData, http_res + ) + raise errors.ForbiddenResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + def delete( + self, + *, + id: str, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.DeleteWorkspaceResponse: + r"""Delete a workspace + + Delete an existing workspace. The default workspace cannot be deleted. Workspaces with active API keys cannot be deleted. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param id: The workspace ID (UUID) or slug + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.DeleteWorkspaceRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + id=id, + ) + + req = self._build_request( + method="DELETE", + path="/workspaces/{id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.DeleteWorkspaceGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="deleteWorkspace", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + ), + request=req, + error_status_codes=["400", "401", "403", "404", "4XX", "500", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(components.DeleteWorkspaceResponse, http_res) + if utils.match_response(http_res, "400", "application/json"): + response_data = unmarshal_json_response( + errors.BadRequestResponseErrorData, http_res + ) + raise errors.BadRequestResponseError(response_data, http_res) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "403", "application/json"): + response_data = unmarshal_json_response( + errors.ForbiddenResponseErrorData, http_res + ) + raise errors.ForbiddenResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + async def delete_async( + self, + *, + id: str, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.DeleteWorkspaceResponse: + r"""Delete a workspace + + Delete an existing workspace. The default workspace cannot be deleted. Workspaces with active API keys cannot be deleted. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param id: The workspace ID (UUID) or slug + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.DeleteWorkspaceRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + id=id, + ) + + req = self._build_request_async( + method="DELETE", + path="/workspaces/{id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.DeleteWorkspaceGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="deleteWorkspace", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + ), + request=req, + error_status_codes=["400", "401", "403", "404", "4XX", "500", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(components.DeleteWorkspaceResponse, http_res) + if utils.match_response(http_res, "400", "application/json"): + response_data = unmarshal_json_response( + errors.BadRequestResponseErrorData, http_res + ) + raise errors.BadRequestResponseError(response_data, http_res) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "403", "application/json"): + response_data = unmarshal_json_response( + errors.ForbiddenResponseErrorData, http_res + ) + raise errors.ForbiddenResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + def get( + self, + *, + id: str, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.GetWorkspaceResponse: + r"""Get a workspace + + Get a single workspace by ID or slug. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param id: The workspace ID (UUID) or slug + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.GetWorkspaceRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + id=id, + ) + + req = self._build_request( + method="GET", + path="/workspaces/{id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.GetWorkspaceGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="getWorkspace", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + ), + request=req, + error_status_codes=["401", "404", "4XX", "500", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(components.GetWorkspaceResponse, http_res) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + async def get_async( + self, + *, + id: str, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.GetWorkspaceResponse: + r"""Get a workspace + + Get a single workspace by ID or slug. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param id: The workspace ID (UUID) or slug + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.GetWorkspaceRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + id=id, + ) + + req = self._build_request_async( + method="GET", + path="/workspaces/{id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.GetWorkspaceGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="getWorkspace", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + ), + request=req, + error_status_codes=["401", "404", "4XX", "500", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(components.GetWorkspaceResponse, http_res) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + def update( + self, + *, + id: str, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + default_image_model: OptionalNullable[str] = UNSET, + default_provider_sort: OptionalNullable[str] = UNSET, + default_text_model: OptionalNullable[str] = UNSET, + description: OptionalNullable[str] = UNSET, + is_data_discount_logging_enabled: Optional[bool] = None, + is_observability_broadcast_enabled: Optional[bool] = None, + is_observability_io_logging_enabled: Optional[bool] = None, + name: Optional[str] = None, + slug: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.UpdateWorkspaceResponse: + r"""Update a workspace + + Update an existing workspace by ID or slug. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param id: The workspace ID (UUID) or slug + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param default_image_model: Default image model for this workspace + :param default_provider_sort: Default provider sort preference (price, throughput, latency, exacto) + :param default_text_model: Default text model for this workspace + :param description: New description for the workspace + :param is_data_discount_logging_enabled: Whether data discount logging is enabled + :param is_observability_broadcast_enabled: Whether broadcast is enabled + :param is_observability_io_logging_enabled: Whether private logging is enabled + :param name: New name for the workspace + :param slug: New URL-friendly slug + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.UpdateWorkspaceRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + id=id, + update_workspace_request=components.UpdateWorkspaceRequest( + default_image_model=default_image_model, + default_provider_sort=default_provider_sort, + default_text_model=default_text_model, + description=description, + is_data_discount_logging_enabled=is_data_discount_logging_enabled, + is_observability_broadcast_enabled=is_observability_broadcast_enabled, + is_observability_io_logging_enabled=is_observability_io_logging_enabled, + name=name, + slug=slug, + ), + ) + + req = self._build_request( + method="PATCH", + path="/workspaces/{id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.UpdateWorkspaceGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.update_workspace_request, + False, + False, + "json", + components.UpdateWorkspaceRequest, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="updateWorkspace", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + ), + request=req, + error_status_codes=["400", "401", "403", "404", "4XX", "500", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(components.UpdateWorkspaceResponse, http_res) + if utils.match_response(http_res, "400", "application/json"): + response_data = unmarshal_json_response( + errors.BadRequestResponseErrorData, http_res + ) + raise errors.BadRequestResponseError(response_data, http_res) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "403", "application/json"): + response_data = unmarshal_json_response( + errors.ForbiddenResponseErrorData, http_res + ) + raise errors.ForbiddenResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + async def update_async( + self, + *, + id: str, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + default_image_model: OptionalNullable[str] = UNSET, + default_provider_sort: OptionalNullable[str] = UNSET, + default_text_model: OptionalNullable[str] = UNSET, + description: OptionalNullable[str] = UNSET, + is_data_discount_logging_enabled: Optional[bool] = None, + is_observability_broadcast_enabled: Optional[bool] = None, + is_observability_io_logging_enabled: Optional[bool] = None, + name: Optional[str] = None, + slug: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.UpdateWorkspaceResponse: + r"""Update a workspace + + Update an existing workspace by ID or slug. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param id: The workspace ID (UUID) or slug + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param default_image_model: Default image model for this workspace + :param default_provider_sort: Default provider sort preference (price, throughput, latency, exacto) + :param default_text_model: Default text model for this workspace + :param description: New description for the workspace + :param is_data_discount_logging_enabled: Whether data discount logging is enabled + :param is_observability_broadcast_enabled: Whether broadcast is enabled + :param is_observability_io_logging_enabled: Whether private logging is enabled + :param name: New name for the workspace + :param slug: New URL-friendly slug + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.UpdateWorkspaceRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + id=id, + update_workspace_request=components.UpdateWorkspaceRequest( + default_image_model=default_image_model, + default_provider_sort=default_provider_sort, + default_text_model=default_text_model, + description=description, + is_data_discount_logging_enabled=is_data_discount_logging_enabled, + is_observability_broadcast_enabled=is_observability_broadcast_enabled, + is_observability_io_logging_enabled=is_observability_io_logging_enabled, + name=name, + slug=slug, + ), + ) + + req = self._build_request_async( + method="PATCH", + path="/workspaces/{id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.UpdateWorkspaceGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.update_workspace_request, + False, + False, + "json", + components.UpdateWorkspaceRequest, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="updateWorkspace", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + ), + request=req, + error_status_codes=["400", "401", "403", "404", "4XX", "500", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(components.UpdateWorkspaceResponse, http_res) + if utils.match_response(http_res, "400", "application/json"): + response_data = unmarshal_json_response( + errors.BadRequestResponseErrorData, http_res + ) + raise errors.BadRequestResponseError(response_data, http_res) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "403", "application/json"): + response_data = unmarshal_json_response( + errors.ForbiddenResponseErrorData, http_res + ) + raise errors.ForbiddenResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + def bulk_add_members( + self, + *, + id: str, + user_ids: List[str], + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.BulkAddWorkspaceMembersResponse: + r"""Bulk add members to a workspace + + Add multiple organization members to a workspace. Members are assigned the same role they hold in the organization. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param id: The workspace ID (UUID) or slug + :param user_ids: List of user IDs to add to the workspace. Members are assigned the same role they hold in the organization. + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.BulkAddWorkspaceMembersRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + id=id, + bulk_add_workspace_members_request=components.BulkAddWorkspaceMembersRequest( + user_ids=user_ids, + ), + ) + + req = self._build_request( + method="POST", + path="/workspaces/{id}/members/add", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.BulkAddWorkspaceMembersGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.bulk_add_workspace_members_request, + False, + False, + "json", + components.BulkAddWorkspaceMembersRequest, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="bulkAddWorkspaceMembers", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + ), + request=req, + error_status_codes=["400", "401", "403", "404", "4XX", "500", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response( + components.BulkAddWorkspaceMembersResponse, http_res + ) + if utils.match_response(http_res, "400", "application/json"): + response_data = unmarshal_json_response( + errors.BadRequestResponseErrorData, http_res + ) + raise errors.BadRequestResponseError(response_data, http_res) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "403", "application/json"): + response_data = unmarshal_json_response( + errors.ForbiddenResponseErrorData, http_res + ) + raise errors.ForbiddenResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + async def bulk_add_members_async( + self, + *, + id: str, + user_ids: List[str], + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.BulkAddWorkspaceMembersResponse: + r"""Bulk add members to a workspace + + Add multiple organization members to a workspace. Members are assigned the same role they hold in the organization. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param id: The workspace ID (UUID) or slug + :param user_ids: List of user IDs to add to the workspace. Members are assigned the same role they hold in the organization. + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.BulkAddWorkspaceMembersRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + id=id, + bulk_add_workspace_members_request=components.BulkAddWorkspaceMembersRequest( + user_ids=user_ids, + ), + ) + + req = self._build_request_async( + method="POST", + path="/workspaces/{id}/members/add", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.BulkAddWorkspaceMembersGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.bulk_add_workspace_members_request, + False, + False, + "json", + components.BulkAddWorkspaceMembersRequest, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="bulkAddWorkspaceMembers", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + ), + request=req, + error_status_codes=["400", "401", "403", "404", "4XX", "500", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response( + components.BulkAddWorkspaceMembersResponse, http_res + ) + if utils.match_response(http_res, "400", "application/json"): + response_data = unmarshal_json_response( + errors.BadRequestResponseErrorData, http_res + ) + raise errors.BadRequestResponseError(response_data, http_res) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "403", "application/json"): + response_data = unmarshal_json_response( + errors.ForbiddenResponseErrorData, http_res + ) + raise errors.ForbiddenResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + def bulk_remove_members( + self, + *, + id: str, + user_ids: List[str], + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.BulkRemoveWorkspaceMembersResponse: + r"""Bulk remove members from a workspace + + Remove multiple members from a workspace. Members with active API keys in the workspace cannot be removed. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param id: The workspace ID (UUID) or slug + :param user_ids: List of user IDs to remove from the workspace + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.BulkRemoveWorkspaceMembersRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + id=id, + bulk_remove_workspace_members_request=components.BulkRemoveWorkspaceMembersRequest( + user_ids=user_ids, + ), + ) + + req = self._build_request( + method="POST", + path="/workspaces/{id}/members/remove", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.BulkRemoveWorkspaceMembersGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.bulk_remove_workspace_members_request, + False, + False, + "json", + components.BulkRemoveWorkspaceMembersRequest, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="bulkRemoveWorkspaceMembers", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + ), + request=req, + error_status_codes=["400", "401", "403", "404", "4XX", "500", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response( + components.BulkRemoveWorkspaceMembersResponse, http_res + ) + if utils.match_response(http_res, "400", "application/json"): + response_data = unmarshal_json_response( + errors.BadRequestResponseErrorData, http_res + ) + raise errors.BadRequestResponseError(response_data, http_res) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "403", "application/json"): + response_data = unmarshal_json_response( + errors.ForbiddenResponseErrorData, http_res + ) + raise errors.ForbiddenResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + async def bulk_remove_members_async( + self, + *, + id: str, + user_ids: List[str], + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.BulkRemoveWorkspaceMembersResponse: + r"""Bulk remove members from a workspace + + Remove multiple members from a workspace. Members with active API keys in the workspace cannot be removed. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param id: The workspace ID (UUID) or slug + :param user_ids: List of user IDs to remove from the workspace + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.BulkRemoveWorkspaceMembersRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + id=id, + bulk_remove_workspace_members_request=components.BulkRemoveWorkspaceMembersRequest( + user_ids=user_ids, + ), + ) + + req = self._build_request_async( + method="POST", + path="/workspaces/{id}/members/remove", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.BulkRemoveWorkspaceMembersGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.bulk_remove_workspace_members_request, + False, + False, + "json", + components.BulkRemoveWorkspaceMembersRequest, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="bulkRemoveWorkspaceMembers", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + ), + request=req, + error_status_codes=["400", "401", "403", "404", "4XX", "500", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response( + components.BulkRemoveWorkspaceMembersResponse, http_res + ) + if utils.match_response(http_res, "400", "application/json"): + response_data = unmarshal_json_response( + errors.BadRequestResponseErrorData, http_res + ) + raise errors.BadRequestResponseError(response_data, http_res) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "403", "application/json"): + response_data = unmarshal_json_response( + errors.ForbiddenResponseErrorData, http_res + ) + raise errors.ForbiddenResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) diff --git a/uv.lock b/uv.lock index f7af3d4..72f33e0 100644 --- a/uv.lock +++ b/uv.lock @@ -220,7 +220,7 @@ wheels = [ [[package]] name = "openrouter" -version = "0.9.1" +version = "0.9.2" source = { editable = "." } dependencies = [ { name = "httpcore" },