diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index febf4bd1..7bcf87ca 100644 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,19 +1,19 @@ lockVersion: 2.0.0 id: c48cf606-fb42-4a45-9c23-8f0555307828 management: - docChecksum: b5664b53681fb6403943916bb9b110bc + docChecksum: 992dd7bf5d636d875da8e17e4faaed29 docVersion: 1.0.0 speakeasyVersion: 1.787.0 generationVersion: 2.914.0 - releaseVersion: 0.11.23 - configChecksum: 47c73c3494869121d190f901e061e5d9 + releaseVersion: 0.11.24 + configChecksum: b26850041dd0457b248bd1e3bb936fa6 repoURL: https://github.com/OpenRouterTeam/python-sdk.git installationURL: https://github.com/OpenRouterTeam/python-sdk.git published: true persistentEdits: - generation_id: e4b4974f-8771-44db-babf-659fe2ac2518 - pristine_commit_hash: f72edbf6eebf0c3406c03b3a608aacb71c6122ce - pristine_tree_hash: 42c1bd10666bf80d49c870acf57dafbe7ffc6913 + generation_id: d85ca6f5-dca8-4c80-9b34-a859642d0dd5 + pristine_commit_hash: d8a45b3c5aa026db485cc892cce4ce59f9b2d9e3 + pristine_tree_hash: cb0f77756ac02a67faf406ee499b1f9ea70061f0 features: python: acceptHeaders: 3.0.0 @@ -126,8 +126,8 @@ trackedFiles: pristine_git_object: d78714317e328d9131e563de7807db0761bb3da1 docs/components/additionaltoolsitemtoolunion.mdx: id: b3e8598b1887 - last_write_checksum: sha1:930eb580f2512a07b58b830f588dedad8ecab631 - pristine_git_object: 5fc5576b0d88994c2e7d6996181e51e5fd63fa94 + last_write_checksum: sha1:9337d3a54afac90f430e4c7fd9ecaed326f5995a + pristine_git_object: 31c685297062f6ac8d8a61943c4430500af47744 docs/components/additionaltoolsitemtypefunction.mdx: id: bf179b4008af last_write_checksum: sha1:c0d4fee7d39fbd3d08c44bbe0e7b929350c5d7e8 @@ -268,22 +268,22 @@ trackedFiles: id: 600fbeec8753 last_write_checksum: sha1:dcc72105e3f4c5f50ff39092ad82dc511d65e73b pristine_git_object: ebe0335b3a26503e24ffa142fb1c3907c5e23600 - docs/components/anthropiccitationsearchresultlocation.mdx: - id: 40f569d8ec6e - last_write_checksum: sha1:503cabd5f211da0e9681f802b63e6a242069e3eb - pristine_git_object: 4766fcaadfbff64d65a1b3fbffd3ae95cf8fe435 - docs/components/anthropiccitationsearchresultlocationtype.mdx: - id: 100166b3a8b6 - last_write_checksum: sha1:deed2eb89dc2d1c20b084e4e4c0a2c74b4f84b7c - pristine_git_object: 096cc0d6ce515592417e620b1340aa3b4ea02638 - docs/components/anthropiccitationwebsearchresultlocation.mdx: - id: 95ef98e8c423 - last_write_checksum: sha1:033b55c4b6e7cf6161a5d059d89ba0cd506d0d0d - pristine_git_object: b03268fdff9d48c3e99696ec02c0636c5d23871b - docs/components/anthropiccitationwebsearchresultlocationtype.mdx: - id: 1d41c18eef52 - last_write_checksum: sha1:a18a6f783fc84d86afb56b21cf08ca9d74297b0a - pristine_git_object: 9cb6d29da30e11fd653a9bb5a06c6f7592ea56c8 + docs/components/anthropiccitationsearchresultlocationparam.mdx: + id: 9ae72ccb3e72 + last_write_checksum: sha1:32fca32b7cee91aa9a77edfc5cd8fea9225c0863 + pristine_git_object: 8d0c9d2ac994806fc2d2e0c4de4aec4e4a058852 + docs/components/anthropiccitationsearchresultlocationparamtype.mdx: + id: aaf65427c659 + last_write_checksum: sha1:1c244ccc9dc3e9786157f7b79f0eae68b02a2895 + pristine_git_object: 36ba3e46039d4a40008345c0939a33f95bb36b8e + docs/components/anthropiccitationwebsearchresultlocationparam.mdx: + id: e8b10b5b40f7 + last_write_checksum: sha1:3078918f99892b68eae36856265f870675ef7604 + pristine_git_object: 9b59d45b7e4a9f43588692a661c71214ff316a30 + docs/components/anthropiccitationwebsearchresultlocationparamtype.mdx: + id: 584f4fda6d05 + last_write_checksum: sha1:5529e2c7a6402f204c3dcf7ed18522aefaeb73f4 + pristine_git_object: 4bc0197a7fdc78781b645d2c8f4b32bb0b71b571 docs/components/anthropiccompactionusageiteration.mdx: id: 9bcca00fbe93 last_write_checksum: sha1:7d79a2bda26c860d3da4882bf4c8b4e044d2ed56 @@ -888,6 +888,14 @@ trackedFiles: id: 8afc3b0c53f8 last_write_checksum: sha1:f86f220ce930d1a671b8c702bdea25dcefabfa94 pristine_git_object: 9b479f4efdecfa74ed55207183a0bce5d4d38f5b + docs/components/chatformatjsonobjectconfig.mdx: + id: 6e196fe09ae2 + last_write_checksum: sha1:3db48171b63121e740354c543989c4249f6ab23d + pristine_git_object: 5dae96c7348d2ff09b872408a35afd3bd546c0f1 + docs/components/chatformatjsonobjectconfigtype.mdx: + id: f4db08f0130b + last_write_checksum: sha1:13be1ecccc74426b6db1ed68b26bbc922e836022 + pristine_git_object: 617987c42d412b2814a55a00c73cc435469559c7 docs/components/chatformatjsonschemaconfig.mdx: id: fddf166f727d last_write_checksum: sha1:454f73f794c83adb2b86edc7bc9cba8b322405de @@ -1142,8 +1150,8 @@ trackedFiles: pristine_git_object: 6056c49814eafac5ca7ce25eb0da8413a358c8be docs/components/citation.mdx: id: 9a5f3d4dc85e - last_write_checksum: sha1:e87496dfef2b1f10bc75744fb01cd8c56dc36e1a - pristine_git_object: 9e503681992fded303416915b21d3e23d1296dca + last_write_checksum: sha1:caaf7b5e9d578c27e3347b6a74151450df7b979b + pristine_git_object: 262286806c125e7b4e306e43f29f964459157382 docs/components/cleartoolinputs.mdx: id: 4e474b90f4b7 last_write_checksum: sha1:2574803d7adf914b3f90850fbaea1af2cf6eaed5 @@ -1418,8 +1426,8 @@ trackedFiles: pristine_git_object: e876cac85124ae1a612a2611c11e7039a7eed07a docs/components/createobservabilitydestinationrequest.mdx: id: 8d942a601a6e - last_write_checksum: sha1:8bed1fb299e0fb1961ee90a07274a0803c977958 - pristine_git_object: a3435fe0c498da2ef18fe16d0afab27b813d3595 + last_write_checksum: sha1:968666d16e4c3b3249f7e533829d510c5c043179 + pristine_git_object: 065e043f3ea11140659cba056f490b634d435e62 docs/components/createobservabilitydestinationrequesttype.mdx: id: 0cb269425077 last_write_checksum: sha1:f8608dbed4fcc4407be03f34d5a5ab50c5cd085e @@ -2068,10 +2076,6 @@ trackedFiles: id: c8d0c4683019 last_write_checksum: sha1:d659e4cebde3a9a14eca14c4a95f1e9e53e46f06 pristine_git_object: bb16c1fd514e8e4d4f98dfbebd3a29bcdf8ee192 - docs/components/group.mdx: - id: 7a304030a713 - last_write_checksum: sha1:e7ac1a81dba9420ef0ca16b53648812273505a3b - pristine_git_object: 34495da0d0429ae52773d520030bb2b0807bc206 docs/components/guardrail.mdx: id: 91791d4c83b6 last_write_checksum: sha1:071ca3eb0a6f158e4107d7f337c3f7a8e6ac95f8 @@ -2256,10 +2260,14 @@ trackedFiles: id: 352d5a931932 last_write_checksum: sha1:6d49bb73e36c227f1db9a865435ec47fc3076986 pristine_git_object: fffb82a794389680343b9317dd08062214edf303 + docs/components/imageinputmodality.mdx: + id: dff1855cdca0 + last_write_checksum: sha1:20c35ad045c3933c34f357aab4e9dcde89e20f6d + pristine_git_object: 9062baf545e585b575fbe567868f05451aa5bbb5 docs/components/imagemodelarchitecture.mdx: id: 605b7d0df8cd - last_write_checksum: sha1:4d1003bc766ebe55e79e172c1f959ccb3b945487 - pristine_git_object: 6842d9d695c103dc85f93fa899cb2646c5c2d62a + last_write_checksum: sha1:eb762ec64e5e384c2a3e136fd1dfb9f07ce48d71 + pristine_git_object: 860b66299facaf33aa7f5d2ceac6e4657815a905 docs/components/imagemodelendpointsresponse.mdx: id: 831c40b45635 last_write_checksum: sha1:fd1f51f3157ff364b9c61def7734a5321eb66400 @@ -2534,8 +2542,12 @@ trackedFiles: pristine_git_object: 3c18ed0fb80fbc8cfd45667af06cdecde6a907d5 docs/components/legacychatcontentvideo.mdx: id: fd222b8b9445 - last_write_checksum: sha1:c77f3069be68b3a8fe5757bf31626d73606de778 - pristine_git_object: f1d4b3d542cadec3caabd2fbb99f8769221e37ee + last_write_checksum: sha1:d6819bc122734d7dbe9abf060ae31bac61361633 + pristine_git_object: 74b480b1c49cda64a8d30cf84e91c18d4f4fa32e + docs/components/legacychatcontentvideoinput.mdx: + id: ca6bd671604d + last_write_checksum: sha1:027a30a7edefff19d85cb0065c5c1521280418bc + pristine_git_object: d79ac0622f1c74b02e6f5ce1667c52b8244ff049 docs/components/legacychatcontentvideotype.mdx: id: 6ed2500f1a33 last_write_checksum: sha1:191077107def4be932273d87f6e81a2b3aefc412 @@ -2548,6 +2560,10 @@ trackedFiles: id: 192fa7358f3b last_write_checksum: sha1:c82facbab1f9b4f53e06a6e3986b886f2a9b9b00 pristine_git_object: 3bb4205e59ddb7d332e8d900afd2ee5aaa120dc0 + docs/components/links.mdx: + id: 70a0fc77c7ab + last_write_checksum: sha1:67b732d632e9dee1437f8de51c8160568a3a5ac5 + pristine_git_object: 6debf47da9bcab18bf9b0387b70decb269dead18 docs/components/listbyokkeysresponse.mdx: id: be41921e1cce last_write_checksum: sha1:cc039aaf6927478fd3d3db9eb6a1f84c51e9caa4 @@ -2754,8 +2770,16 @@ trackedFiles: pristine_git_object: e6fae8228c3d685d6cfe815e3c24fa53fd642ff7 docs/components/messagesrequesttoolunion.mdx: id: cb1be4df3cf7 - last_write_checksum: sha1:f3afd12d5ecb4ceb5a4209dd03594abb8dcd626a - pristine_git_object: b24e866b9c3842956daae6c28351e0643c29fc49 + last_write_checksum: sha1:bf5c4e8ff92e9f7620dad799ef238f74d15a4102 + pristine_git_object: f5868bf92de456cf395b9bd769323ca35d3225a8 + docs/components/messagessearchmodelsservertool.mdx: + id: 1f9f5edef4fe + last_write_checksum: sha1:5d3026e9fc2eda9ed7c5e8a08aff7f09514d666e + pristine_git_object: e13f74e2abe12371b8dd6d13c85402c17650dc3c + docs/components/messagessearchmodelsservertooltype.mdx: + id: ecbd7f7f2e44 + last_write_checksum: sha1:b0dc13c5cf05011f6496565a4553eb52b9d09481 + pristine_git_object: 52ce907478e961eb90e709fca118e6d0631883d2 docs/components/metadatalevel.mdx: id: f564e5e9a7d3 last_write_checksum: sha1:e51f09243a346926c426f53b07865f5ed145511d @@ -2782,12 +2806,8 @@ trackedFiles: pristine_git_object: e8757cbafebf799b6f162a2b9d7a2aff95c67e4d docs/components/modelarchitecture.mdx: id: fe77e4816f6a - last_write_checksum: sha1:dcf6b88330ab80e643cb7e9b962489a85783002b - pristine_git_object: 3035c9bac4573c0b1a70f9b463ba1a0ce8cf36e2 - docs/components/modelarchitectureinstructtype.mdx: - id: 4064f8606ef4 - last_write_checksum: sha1:172862da64039b2e61ed05b24fbc4c0e219ef9b5 - pristine_git_object: c8d02132963a140b2d71c982b09bec0eed30d042 + last_write_checksum: sha1:ee0aa33ad4b453bc1a0de9aacb2d62b09fc19522 + pristine_git_object: d46fef4698df66a63c1a0e7dc7ac1793df265835 docs/components/modelbenchmarks.mdx: id: a56406a8820b last_write_checksum: sha1:556248629a58731cd01f96ad5972f9d09c00e8af @@ -2818,8 +2838,8 @@ trackedFiles: pristine_git_object: 9e1b9145d0352d47192a8427975702517923ef66 docs/components/modelslistresponse.mdx: id: 1880eae9f45e - last_write_checksum: sha1:660d60c5fb6e99883437e7e30da3586cbf35b57e - pristine_git_object: 140ec11b65ad7ee9bd3b3fd7933d21a49af3561e + last_write_checksum: sha1:37dc51e0d818c3561d0b7094cf6ab9e2cf44167d + pristine_git_object: ac531b92ce061a5062aa91aeac7ce68242c35fcf docs/components/moderation.mdx: id: d145b88b8b67 last_write_checksum: sha1:ed7cedc44d3043ef40007d3135774d168b30683d @@ -2920,14 +2940,22 @@ trackedFiles: id: 2b5b371b62ed last_write_checksum: sha1:eb15fe342436bb49fe24b4884c5989564149716f pristine_git_object: 3fcbba14f1e9d35a5b5f2aac22d4b4827a6ae149 + docs/components/observabilityfilterrulegroup.mdx: + id: 950cb2bcab56 + last_write_checksum: sha1:2d6488e843daf1826887e21964b08f7e22bea201 + pristine_git_object: 95aa7cfb8f9cf3bad8079923919c5ead01936d21 + docs/components/observabilityfilterrulegroupvalue.mdx: + id: 7394ec319945 + last_write_checksum: sha1:d35837b1d253d1d55e5d61923b4f47bb04eedc0f + pristine_git_object: af2effd1a0616aa1b534f4c3ecda08c6cce9333d docs/components/observabilityfilterrulesconfig.mdx: id: 7693db9b58d8 - last_write_checksum: sha1:e0ebf1b44bd0174e38fafee60ed17eca07c1606c - pristine_git_object: 46330428534ffced625fbd3b3a3b2da5f1a156d1 - docs/components/observabilityfilterrulesconfigvalue.mdx: - id: 7c5b26ae20b1 - last_write_checksum: sha1:f8558110d2cff9d5e3ac036fc7befacb12eaf105 - pristine_git_object: 6b335f615687720e4590e73578de2d4e9096b8b2 + last_write_checksum: sha1:83de5980ee1a40def4b464b77aeaf6aec2d83253 + pristine_git_object: 8393404427dfcb3512809c80e749961b758ab7eb + docs/components/observabilityfilterrulesconfignullable.mdx: + id: 8565a4dcf81d + last_write_checksum: sha1:0cbe6562ce8d9a3c26c0135acfb270f9ab32be72 + pristine_git_object: 842fa8f78a38e50486069046e7c2aef07997c600 docs/components/observabilitygrafanadestination.mdx: id: 933526705b96 last_write_checksum: sha1:75f67fe00561d8a7f163554ccec092903698df55 @@ -4158,8 +4186,8 @@ trackedFiles: pristine_git_object: f12a0a04d9dc4430ca6180c8507360d9bc7494cd docs/components/responseformat.mdx: id: 9b8deacad550 - last_write_checksum: sha1:2ca93510828412e375f9903be2c92bcefbacd177 - pristine_git_object: 29709effcd49176f32b4b99f9a37ed1309231549 + last_write_checksum: sha1:fab329e55c5d5be71c187de6a2ca592d7c1c3e68 + pristine_git_object: 4715eaef06706262e09a0108dab8c9fc2ef94f62 docs/components/responsehealingplugin.mdx: id: 5bf9b8008e95 last_write_checksum: sha1:1aa7dc7146a93a215d275571233ee63902a6e155 @@ -4206,8 +4234,8 @@ trackedFiles: pristine_git_object: 5f6cc606242e0f8343c7bef1d54e640fef620a80 docs/components/responsesrequesttoolunion.mdx: id: 96bafa5d19b1 - last_write_checksum: sha1:ea0dca57eedbc520f2a5097b8e0adc1b1f831be2 - pristine_git_object: bfec11b6f951665f3b0467a8e8f98e7f224a9350 + last_write_checksum: sha1:94c59f53bc6d9c13148eb65e73e8850d5714e6b1 + pristine_git_object: b06f8e77235ad31695cf106e56768f83c7432001 docs/components/responsesrequesttype.mdx: id: b2720876d384 last_write_checksum: sha1:9ed21e9f3c79e3936a4f6bc9df24eea499cc1e56 @@ -4234,8 +4262,8 @@ trackedFiles: pristine_git_object: 02852267fa52361a11f7732afe1e7818105196f0 docs/components/rule.mdx: id: 652b4ec56a02 - last_write_checksum: sha1:9e98bfe08cdbc0e13635a26c52a1d11003041b78 - pristine_git_object: d585c3be57a8c3843d6712c747983fbcdb692d17 + last_write_checksum: sha1:689f48837abf4c42c787a7a531e751d32d1e3c67 + pristine_git_object: 14a9f713694cfd61d45b800a23294d906482bca5 docs/components/searchcontextsizeenum.mdx: id: b6b9a99acb5f last_write_checksum: sha1:177016c42a56a7a8dcd40caa7e9105ca7a6ea1cc @@ -4244,6 +4272,14 @@ trackedFiles: id: afffad2845a2 last_write_checksum: sha1:4c205a6c239561b5813ec9202abeeef9e4e41331 pristine_git_object: fb2f7f7c53004cfee264fe37346b88af5cf7d61c + docs/components/searchmodelsservertoolopenrouter.mdx: + id: 7fecfe80e04e + last_write_checksum: sha1:7de51c7d40b22c850b6c49ca7a3e989fd7da71aa + pristine_git_object: e72c5e1cd8e90695cea2f97cc7909d6d7099ef2d + docs/components/searchmodelsservertoolopenroutertype.mdx: + id: a9a0e137d51e + last_write_checksum: sha1:b13d77690c90a53b9957b099560f88729956f701 + pristine_git_object: e57b04828acdf4f7cf9fa30409a47947f7e7f25e docs/components/searchqualitylevel.mdx: id: 0cbced049b6f last_write_checksum: sha1:106b7467c7ab738c7ce04ab44d83a91388dc0808 @@ -4954,8 +4990,8 @@ trackedFiles: pristine_git_object: 9c95861831e9f31f54efd7d48d8f48eece10e369 docs/components/updateobservabilitydestinationrequest.mdx: id: b54091567003 - last_write_checksum: sha1:a49d260a3c096efeeda18b7f204ed6336c25aed4 - pristine_git_object: 1a6d04101d79b08a5993638272a569695d6151c2 + last_write_checksum: sha1:9ba0d6c18b145237efd307d621834669669838f8 + pristine_git_object: f13384238a27b4d58710d33648c8ac8de766635a docs/components/updateobservabilitydestinationresponse.mdx: id: be9661c3676e last_write_checksum: sha1:c8fde493ab2c8285b0a800795e6106f2dbf3a63f @@ -5344,10 +5380,6 @@ trackedFiles: id: 2ab0b419379e last_write_checksum: sha1:f3bcb4a33fc0d7d868762b459a838d1fdca99d28 pristine_git_object: d24616128ffb2e8a3f1fc639235d8210dbeea107 - docs/operations/costdetails.mdx: - id: a5015273e58c - last_write_checksum: sha1:90a330bfa37e208bcee6615af2ee7535c4416a26 - pristine_git_object: 753493b8d505e9317dcaca6fc897da7e30e91d0c docs/operations/createaudiospeechglobals.mdx: id: 9b19782b0fc7 last_write_checksum: sha1:620e2236612f7cdf7dc23e0f975671e979d7e4f5 @@ -5438,8 +5470,8 @@ trackedFiles: pristine_git_object: 4efeda7aa813ebf97131645e6af8e49853731100 docs/operations/createembeddingsusage.mdx: id: 4f9205ca2bb9 - last_write_checksum: sha1:cda993a456ed0e22740a2d6d657dd499199e742a - pristine_git_object: 1050293af3353abc1dba846e61f3d6980cc126f8 + last_write_checksum: sha1:8156e256387b12cc08a5a92f9e9332ec2b35a2af + pristine_git_object: 1218cf960cbc2285120cb399596e0bc73b44aa9f docs/operations/createguardrailglobals.mdx: id: ce6e792df15c last_write_checksum: sha1:6542508eed5dbd74bf6812b8cc0cc9cfd3157d06 @@ -5842,8 +5874,12 @@ trackedFiles: pristine_git_object: e6beafcf11154033e2951ae58103041a2af946b9 docs/operations/getmodelsrequest.mdx: id: b2627beb1959 - last_write_checksum: sha1:f632f852d2575a081418c25c4ae1c5f8f4785ff2 - pristine_git_object: 3cf889e3b06877fa5948f307c334468ed1832d3c + last_write_checksum: sha1:416ad223f0e50e03f76f5da03ca4c3d97754201a + pristine_git_object: 532a1ab9bd3372f778cf6406d9ac686305006228 + docs/operations/getmodelsresponse.mdx: + id: acfd4707ddde + last_write_checksum: sha1:0c0fb343b7965a76cc790355b7f43d1f52f13e89 + pristine_git_object: c7353f31e48c90e3abd225386f409e211bf043de docs/operations/getmodelssort.mdx: id: 3cfd33e60661 last_write_checksum: sha1:6d75758523f8665ff617fe5d4e54385ad785c7ef @@ -5966,8 +6002,12 @@ trackedFiles: pristine_git_object: fad77722bdedf3aa5902e0216dadbbbbb2331c66 docs/operations/listembeddingsmodelsrequest.mdx: id: 280530b63070 - last_write_checksum: sha1:aa92c46789315ceae419561330e80127280e9559 - pristine_git_object: 76c365bf04a9c5fc1f461b0eda0d59d0122b22fa + last_write_checksum: sha1:f409c6a09dd308ffe3145b09b1115293c5c80862 + pristine_git_object: 7e491482186d8bd3a8b13797e591fc7128b5966d + docs/operations/listembeddingsmodelsresponse.mdx: + id: d07053bd83fc + last_write_checksum: sha1:a80671cd7e9e2247b38a0c3f0c9fa1daf0080600 + pristine_git_object: 053af0a817f0ae9077ec70ccd12e4e6581bf8e91 docs/operations/listendpointsglobals.mdx: id: 12c08333c32c last_write_checksum: sha1:72d0a3a54e8fc8cdfa2812fa929c08669dec9779 @@ -6106,8 +6146,12 @@ trackedFiles: pristine_git_object: f0a800135df0c6e4799128a4fbc901c576c8c6ce docs/operations/listmodelsuserrequest.mdx: id: 01537864056e - last_write_checksum: sha1:6a40c5348b33b01ac4dd2d5daac02fb237efc459 - pristine_git_object: 3b65b53fd19e841061b65013fe3adaedebaa5b68 + last_write_checksum: sha1:45aab507978152748484ff6d2eb394570514f08c + pristine_git_object: ca39aeabcd71a18c6e29542ef9cde33fe6b77b33 + docs/operations/listmodelsuserresponse.mdx: + id: 34f7a1648ceb + last_write_checksum: sha1:bf1ee4a9b2ad707ff1c39ea8680e72e5d0c27b9a + pristine_git_object: 380f686c12cbcd07de087be55b5a3f2b8f9eeec5 docs/operations/listmodelsusersecurity.mdx: id: fa5ad15aebfd last_write_checksum: sha1:daa5aafeecb31a35e7cb1bbedc70b722f6a675a5 @@ -6502,8 +6546,8 @@ trackedFiles: pristine_git_object: 6e4b06ff97f02da5d31d78f478094db32dfdaa6f docs/sdks/byok/README.mdx: id: 17792f3b180d - last_write_checksum: sha1:18692d1b1454837b1592113fe1aaba1b1d37a805 - pristine_git_object: f1da2da04de257540172ce771ed1b665f0da9010 + last_write_checksum: sha1:17ebad0d042bd205530b527caf71c33d248ac5c7 + pristine_git_object: 513bb72efe9f74672b1b60d6b45dc0aca282ddf6 docs/sdks/chat/README.mdx: id: 1dd859c23fe1 last_write_checksum: sha1:b6c104dc6b0c3461a2264a95d886f860e7277780 @@ -6522,8 +6566,8 @@ trackedFiles: pristine_git_object: ef43241cee60a329848e01772031d3f97e0f0d30 docs/sdks/embeddings/README.mdx: id: cd71581df291 - last_write_checksum: sha1:627e1efaacb2a29cb97e9d184ead987d95008bed - pristine_git_object: bf8b8c511bb6de4fcb0f24060788581aa51ef1a7 + last_write_checksum: sha1:6327ec4cf4aa480bbbf6eea9c8b54713e46a7db1 + pristine_git_object: 0ec380e6de0a439e80527b502d78d90963d8671b docs/sdks/endpoints/README.mdx: id: 62dfac9f7b71 last_write_checksum: sha1:05fc24509aa174b336fbe7d1a95faf7beca9bca3 @@ -6538,32 +6582,32 @@ trackedFiles: pristine_git_object: f262b34982a18293f5ae22bfbbf385010bfcdc9c docs/sdks/guardrails/README.mdx: id: a0cd4218b8fa - last_write_checksum: sha1:b6543c22a38aca53d7bfbc8d41ed482965fc3b3c - pristine_git_object: d164a1da79b0838bd68f0a6560a0317eb86e0226 + last_write_checksum: sha1:a21e4a94d1ee8d031f862e23b9282f8977d38fc2 + pristine_git_object: 52efbd96250f06588fea44689bed93f27f2e0230 docs/sdks/images/README.mdx: id: 534a6c102c4f last_write_checksum: sha1:eb919a70e20e9bde335ff1e8ae52ba0a309ca5c3 pristine_git_object: 8277c7710decc3ee152c7fe725c90bac9784800a docs/sdks/models/README.mdx: id: 58f1ca464e0b - last_write_checksum: sha1:2a8e7baeb6586e3b46d4da14c1e4701e4625ee7d - pristine_git_object: 888dcaa7005c439f2c0e5e0736ba8f78fc42a8db + last_write_checksum: sha1:90e4f262bc449464226d1d83c731709e3352bbb1 + pristine_git_object: dd4b54253703029cfcc99203de65731b350e49b7 docs/sdks/oauth/README.mdx: id: 42b5079343d2 last_write_checksum: sha1:60ecae1338bc4487fbb050b6044ddc08dd7d1685 pristine_git_object: c8f7dfd9fd46b60a5814250f8cb2de313166e2c3 docs/sdks/observability/README.mdx: id: 75811527e651 - last_write_checksum: sha1:83e566a1ab2ca84c1139d44060b3740a9a543e1d - pristine_git_object: 869bf82e6c2a769a2017220c38e6a6ef1fd270fd + last_write_checksum: sha1:e0d3c0963d72b6c982ec2164d3b38ed7f42ccfc5 + pristine_git_object: fb37fc078d177af746a8d20d989cddd4ab24aa8f docs/sdks/organization/README.mdx: id: f41b85542db0 - last_write_checksum: sha1:05a25a46b97551c8b92fbe3ec2eb736a562ca8bf - pristine_git_object: 6e199abaeb2f5269a885637d65bb176fd235a61c + last_write_checksum: sha1:7bb8e127781511bb01ce8b610084674f56e1ca00 + pristine_git_object: 32a291cb837977e7cdd475c664e5d475660b2ba3 docs/sdks/presets/README.mdx: id: eeb505928d52 - last_write_checksum: sha1:c61b06287a4f3e854cf729a6621a8760ef3c73c0 - pristine_git_object: 5f20994a95b6c41ceab181a1523d1b03935d0ac0 + last_write_checksum: sha1:0c1569e8db293c65840433adda49310960a591d1 + pristine_git_object: ef18762b9c9c42a26bf61c24af1607d7ce19c01a docs/sdks/providers/README.mdx: id: 5ea9af111324 last_write_checksum: sha1:570b55655ee7602d3807c3218e450741f634eed6 @@ -6590,16 +6634,16 @@ trackedFiles: pristine_git_object: 429ca7dad6a66516aec6bb1e674af1e09dc42dd5 docs/sdks/workspaces/README.mdx: id: 0c75d023ef6b - last_write_checksum: sha1:29a4f4699004ed16b9c980463a649576b30fe035 - pristine_git_object: 37f2346cb81f6c7712df90b676b5084808b609b5 + last_write_checksum: sha1:d44b36396b3773c8522f57b64fdd2b80a925d7f9 + pristine_git_object: 547d8b71101d58f89209eb7354d40cb96dce03fa py.typed: id: 258c3ed47ae4 last_write_checksum: sha1:8efc425ffe830805ffcc0f3055871bdcdc542c60 pristine_git_object: 3e38f1a929f7d6b1d6de74604aa87e3d8f010544 pyproject.toml: id: 5d07e7d72637 - last_write_checksum: sha1:5d3a57b654b24aa3e1d864860193cd49e30c8158 - pristine_git_object: 6c7ed425b8481808595bc0c2ea6bf15eead35678 + last_write_checksum: sha1:451a4be23fc081294b962e2bc0c6f0dbae2c43ab + pristine_git_object: 88b38af4fdfc0341a41fae784c7c78c1137e00a3 scripts/prepare_readme.py: id: e0c5957a6035 last_write_checksum: sha1:77f44b60b98bc126557ec27391f91dfba764bb54 @@ -6626,8 +6670,8 @@ trackedFiles: pristine_git_object: 86713cfea633e09d33b3d4e65281071fe20e6137 src/openrouter/_version.py: id: d8d15ad6c586 - last_write_checksum: sha1:01c911de175165f5a511285a446e1bb9b86fc01a - pristine_git_object: 400898618adb2f15eac43a4e6b1cb1f093b04c2d + last_write_checksum: sha1:5a4d07dc0be8788ed4abef1a2b48b18cdaa1afb1 + pristine_git_object: e328286d4babd45c447a377612162c30d1220393 src/openrouter/analytics.py: id: cb406b5aaabb last_write_checksum: sha1:9e709b71dd0611056dc0cec6150b578defe32841 @@ -6654,8 +6698,8 @@ trackedFiles: pristine_git_object: 1b01f0c081ffc8a42fa56d335f95ec3121e4b5e6 src/openrouter/byok.py: id: bec352462ae1 - last_write_checksum: sha1:14ffff34cdb97e81dd5ef9d7ba0f105b09b7ba48 - pristine_git_object: fcbfd1acaba89492d5ca7a58aa1126073d5cd5d7 + last_write_checksum: sha1:d812981f845cfc7313a86be8eecca156969ca0a0 + pristine_git_object: 08b177b0b39e7f3581f1a5da13e245c3daddf9d5 src/openrouter/chat.py: id: 723fdce15c1d last_write_checksum: sha1:79e9c02b4a16cae3c202b5ae0bfd6cd1d0d6f89b @@ -6666,8 +6710,8 @@ trackedFiles: pristine_git_object: ad3d247954547814054c01989a2dff3d12b3e4e1 src/openrouter/components/__init__.py: id: 81754e97b3f4 - last_write_checksum: sha1:7da528c3b443bbc59febd9ba816c068802b8f5dd - pristine_git_object: 0aa62516217cf61492f33d953c54956fbfeb4124 + last_write_checksum: sha1:1d909d376196542b7bd1a320346e7bbda7cb5f48 + pristine_git_object: 1f755537449f9869a6c5e548ae39bdb03b8f777f src/openrouter/components/aabenchmarkentry.py: id: e2e0f0b48c82 last_write_checksum: sha1:fab4d9a24d2cea937bb749d46c5f83941e99d65c @@ -6682,8 +6726,8 @@ trackedFiles: pristine_git_object: 1138e6f6bc025546a86877749ce83aca4c46499a src/openrouter/components/additionaltoolsitem.py: id: 2761ab789f41 - last_write_checksum: sha1:9156822bf7cf6b71f1351e12a03b7a659c0a2762 - pristine_git_object: 1bd74f0c42994da09935ed8a6a4c0baa49a0bc5e + last_write_checksum: sha1:955f9a0246407a1e72933c4861b9e343698f4141 + pristine_git_object: 6f2202805056318932d7426b061c24d082cacb53 src/openrouter/components/advisornestedtool.py: id: 768fcc6bad2b last_write_checksum: sha1:9c4303eb7fbefd1d7200cd588e7ab7e55db791e8 @@ -6744,14 +6788,14 @@ trackedFiles: id: "8776686778e3" last_write_checksum: sha1:9a7144f078d7b404bf3d90eac0d3a16a24ba3bba pristine_git_object: cbe0a66bb0fd32915d5f1379990f0b55b1be34e8 - src/openrouter/components/anthropiccitationsearchresultlocation.py: - id: 3bed26599605 - last_write_checksum: sha1:2dd310e399d7957ff933cd7163b7ca9f9fc348f4 - pristine_git_object: 8a90ed4f254de659efca56a8ad691dcca505bf1b - src/openrouter/components/anthropiccitationwebsearchresultlocation.py: - id: 1a120a6f2e0a - last_write_checksum: sha1:e4841838144a600bbc556aed274ecdd56aa2b51e - pristine_git_object: 4d061c61a4c7c6cee32194f7fe3ab9bebf00ec6f + src/openrouter/components/anthropiccitationsearchresultlocationparam.py: + id: 6610f6ef1f41 + last_write_checksum: sha1:8300415c29d0e1ea74e01f9a60e807ab5faec7d2 + pristine_git_object: 77b17e50979925c45c350782a3642dbc0496586d + src/openrouter/components/anthropiccitationwebsearchresultlocationparam.py: + id: e3b53306ee2f + last_write_checksum: sha1:ce75e5feff4dbaa43e8633d1c6c5492bff8a457b + pristine_git_object: 9be8376389ace420687450d12a94075c59902b18 src/openrouter/components/anthropiccompactionusageiteration.py: id: fdfc1ef0420f last_write_checksum: sha1:67b10e83d2fc7777319f6c51d4e5cc7539b9eccc @@ -6802,8 +6846,8 @@ trackedFiles: pristine_git_object: 4f9c2bc739541b12c381e3d6265184af879cc1ff src/openrouter/components/anthropictextblockparam.py: id: f387daeeb940 - last_write_checksum: sha1:f58942e9bb462aa291affec04500e112495a9acf - pristine_git_object: ed10fdcf8fdb3fcc18a59ea6cbaa1035bb987a5f + last_write_checksum: sha1:266f0b2002e313484812c69d4b85a7d84aeb0c2b + pristine_git_object: a6a70aa6825c515fb5c9c1358d011314df010b2d src/openrouter/components/anthropicthinkingdisplay.py: id: 5d63f1a15f67 last_write_checksum: sha1:388d60bbe78d3b848744564f91b31142d7bfc7e3 @@ -7072,6 +7116,10 @@ trackedFiles: id: a852009cc661 last_write_checksum: sha1:0b53b9be3fc3c703dd69f537bd4e2d74bb3794b3 pristine_git_object: 9ec411f0b6d050166527d9ad38b892763113781b + src/openrouter/components/chatformatjsonobjectconfig.py: + id: c6434d0938fa + last_write_checksum: sha1:27544a9a1fcb7531c2e2ff93b63e361a6b6db815 + pristine_git_object: 450c8f6b441ce00d6a164f236ec19ce32a2d5abe src/openrouter/components/chatformatjsonschemaconfig.py: id: ab345e635f28 last_write_checksum: sha1:cf6c6e7bf8101361b2351f978e21bf3f8d61c375 @@ -7106,8 +7154,8 @@ trackedFiles: pristine_git_object: 8bbde153b53887e426989fd5b0486b6dc1122810 src/openrouter/components/chatrequest.py: id: 5e39eaefa9cf - last_write_checksum: sha1:ca664d330b0d2904c1479cb63e7b5b7d4e4f0961 - pristine_git_object: fe89789eca242903d019c9d9dd2e50c1069a452d + last_write_checksum: sha1:e6f5dca8d7972b45dbb40d94867331ad0d1e09e7 + pristine_git_object: 914012755c34634740a1c91aa3f3f7b3da3f095e src/openrouter/components/chatresult.py: id: 9062fe2935fe last_write_checksum: sha1:2ff1963c54e7e79500115c8549c8d395f4e336d1 @@ -7302,8 +7350,8 @@ trackedFiles: pristine_git_object: d6c4a4dc73222668daddc2a1788d314ff30e8fe6 src/openrouter/components/createobservabilitydestinationrequest.py: id: 58587fb98a32 - last_write_checksum: sha1:b8a96311602687e9280550674d0d840f2916ad06 - pristine_git_object: b7bf9755acc084c2f17f3787dc5b70e354b0efe4 + last_write_checksum: sha1:a69652cab8079b002fdcdfd8a3de2d5da4ed2677 + pristine_git_object: 6cd46b4fb85e986a1b54f89e5983a3a0d53b837e src/openrouter/components/createobservabilitydestinationresponse.py: id: 9a8561661e52 last_write_checksum: sha1:730054c12ad209d5f83b88825c946fd6f322e6e9 @@ -7656,10 +7704,14 @@ trackedFiles: id: 5cfc6caf763d last_write_checksum: sha1:79c33282493bf247e4f761e878cc8242b0992c2c pristine_git_object: d433ceae961e91fee4732913cfae463775322981 + src/openrouter/components/imageinputmodality.py: + id: c2336ff63555 + last_write_checksum: sha1:391a5fb69d5e9ce8b4bcdaef4d1280bce944a439 + pristine_git_object: bfe11c62d66b9ba64627867934d9796ea1bf96e8 src/openrouter/components/imagemodelarchitecture.py: id: 5f3e50733fe9 - last_write_checksum: sha1:cc9bee6400f1b7b65ff1c86c5d6bcd5eeab03209 - pristine_git_object: 01f0cb5e15bc03592cca4d25a3d67ebb990dd433 + last_write_checksum: sha1:9400a6354c6b217939bb87dbca39c5c2bf5956a1 + pristine_git_object: 0a870e4b18be6630023ab7a3b32ea9fd90821e62 src/openrouter/components/imagemodelendpointsresponse.py: id: f3d538d38ec2 last_write_checksum: sha1:e10cae58b2bb98ab1a0df6fc162f402ac1561d3c @@ -7742,8 +7794,12 @@ trackedFiles: pristine_git_object: d334197ca0822a32f5f98a7548b254a37ee7d110 src/openrouter/components/legacy_chatcontentvideo.py: id: b06bf8b4b644 - last_write_checksum: sha1:13c50b1957251e4819fc8ac6545c64cfe940bc8f - pristine_git_object: b5dd4d1a0d29169acd66c3b92b04dd9cf5291f79 + last_write_checksum: sha1:59cab32b6634299755ba92b46c90ee4495e6e86a + pristine_git_object: 38a7bf71a9b45b3f38d0aaad567a97996f80401e + src/openrouter/components/legacy_chatcontentvideoinput.py: + id: 27b3187afed4 + last_write_checksum: sha1:b9acaad63d544772ae34ba29a6eec2248b0181ac + pristine_git_object: 0fe43c16758210b0b304f3f31cc88ba2df5e46a0 src/openrouter/components/legacy_websearchservertool.py: id: 8b28b05b8756 last_write_checksum: sha1:bff7d5ebd6a54d3a598aaaeccefd18a04bb9b489 @@ -7842,8 +7898,12 @@ trackedFiles: pristine_git_object: 9b033dd8570e1d71ddb61a63a4b320d3003bd3ef src/openrouter/components/messagesrequest.py: id: 72b1f339024d - last_write_checksum: sha1:85812e6b546d59d8788ea1a30766a01510ea57a9 - pristine_git_object: e69fe1fc961d93b9cfcfacce426937b34fd53b42 + last_write_checksum: sha1:a14c123f9362720670a6cf4eb4bd55478d5fa376 + pristine_git_object: d2e30398f665dc6b5e8dac7f53bffab6e490d14b + src/openrouter/components/messagessearchmodelsservertool.py: + id: 53d755edb120 + last_write_checksum: sha1:389786fc22ba4bb47b0a086b7aa321f2f04fe943 + pristine_git_object: d101995fd27b0bccbac266805caba629039c5f93 src/openrouter/components/metadatalevel.py: id: 0eede47eef62 last_write_checksum: sha1:b4e7e6fc4e9016b65008e9ebbfcc6f018fe89ced @@ -7854,8 +7914,8 @@ trackedFiles: pristine_git_object: a76656cf0dfc106b6c1a80dac3b53d0114aa68b6 src/openrouter/components/modelarchitecture.py: id: b37ac27e512b - last_write_checksum: sha1:4cb5ae4ebd310085d58966528958f7183f2ca9f0 - pristine_git_object: 1fb1dbcc44f43ac47d0f3c8af94298235461399f + last_write_checksum: sha1:d0b370e5a88cb723c8836ba4c5f4bf9c000ff82d + pristine_git_object: b1fb080a8142fe434784811e7c1cd51fce87c0b4 src/openrouter/components/modelbenchmarks.py: id: efd0b01b6775 last_write_checksum: sha1:71dd3f1be37b6ea21345316025cb106488a9a4c9 @@ -7882,8 +7942,8 @@ trackedFiles: pristine_git_object: 8d68ee4aa093ba2754a65f28e46a23a1848fd99b src/openrouter/components/modelslistresponse.py: id: c2d4bb2cac89 - last_write_checksum: sha1:54bc618bea7ddcaa4e49082d601065c634fb2ea1 - pristine_git_object: 8497c58e5956b9344427e0147063b01ab86c7001 + last_write_checksum: sha1:54461c815f518a71ba9f9b5a00ffad57c2d62c20 + pristine_git_object: a1cd85a3ba7fbb5c4b28936c5a3d0a70ca87aa38 src/openrouter/components/moderationplugin.py: id: d99bd9d505d3 last_write_checksum: sha1:58ff3e6829b973b3db5ed7dda3fa11558ded04b2 @@ -7916,10 +7976,18 @@ trackedFiles: id: f02862444a3d last_write_checksum: sha1:182ba82fb2aee3f33a975ce8eb2ef978bc0b46d2 pristine_git_object: b7a1d2f385159ff27bde884ad290db7878ccdfb1 + src/openrouter/components/observabilityfilterrulegroup.py: + id: f1fcf7b3732d + last_write_checksum: sha1:752f7a5db8f00c94443cc70f1c8cd1217c83e0b9 + pristine_git_object: 576d6a303f41aec506ccc7eb44c254ae5fb3064d src/openrouter/components/observabilityfilterrulesconfig.py: id: 98476c1c326b - last_write_checksum: sha1:2f0154d62e8ae85dfced48bfbc4d5430bddabc18 - pristine_git_object: 76f042e250255d33d9ed6626f1dd0be51f2fb4f3 + last_write_checksum: sha1:2ce6d9001db7a4fec752c3bb8898574be738ddef + pristine_git_object: 6f5536a507863e73dc5bdbd52b9faebf75f35b64 + src/openrouter/components/observabilityfilterrulesconfignullable.py: + id: 4e3d140792cb + last_write_checksum: sha1:6cb7c481dfe78fb6948e85c167ee3c93904ddf57 + pristine_git_object: 80ac61fe6a5044a15f9508a12a746b01085a558d src/openrouter/components/observabilitygrafanadestination.py: id: 36c8f26bcf6f last_write_checksum: sha1:d7fc978dd9c663490f1a7a8c12b07097d7985688 @@ -8434,8 +8502,8 @@ trackedFiles: pristine_git_object: f38c8edcb616d9e7cbd0f724fbb9d9f5aae014f9 src/openrouter/components/responsesrequest.py: id: 8c850080ec5d - last_write_checksum: sha1:b6afc18fad09f40c0f343cf5944e80070ef45077 - pristine_git_object: 7331187ebb7ad8010f213526e172d64d2e08d268 + last_write_checksum: sha1:f9f52d25db9ee9e72fbdf8491c47a3fc3a9971c7 + pristine_git_object: 6f97e56c468a1df21fc11fd4c3310fa648968c5f src/openrouter/components/responsesstreamingresponse.py: id: 142379f3bd90 last_write_checksum: sha1:a48d6f3610f5d15248ef4d25a0d88a0a4a1a9db7 @@ -8456,6 +8524,10 @@ trackedFiles: id: c246413c0bd7 last_write_checksum: sha1:863a664a9f17def86180b0407c8233c263acfae7 pristine_git_object: 7faa97b80bfc0d362fd89c255adb708a4f7afc05 + src/openrouter/components/searchmodelsservertool_openrouter.py: + id: 126d609eda44 + last_write_checksum: sha1:4459710e2e9299ccee45ebccc2ab6a4ad03057a3 + pristine_git_object: 158d0a1a8dcd06be171fea886635c69d2c140e63 src/openrouter/components/searchmodelsservertoolconfig.py: id: 6a1174213084 last_write_checksum: sha1:4e4cfb2275ef0d6410f9557ab6a8f28ac8e9ab16 @@ -8718,8 +8790,8 @@ trackedFiles: pristine_git_object: df833960211cc7ed2a2a42fddbeafda0092e1c0c src/openrouter/components/updateobservabilitydestinationrequest.py: id: d7a39fe04386 - last_write_checksum: sha1:3a4279ca4f9680d2a4c41464b04ace5971a125ad - pristine_git_object: a344284f904d781583b0f493839fe11930b5afc1 + last_write_checksum: sha1:9eb493e5c3c8567235b70ec7a603ebdffcb544ea + pristine_git_object: e0d3f99ca9cafe61ac6b011cc2e54348d46115e5 src/openrouter/components/updateobservabilitydestinationresponse.py: id: 187c51d2b3a4 last_write_checksum: sha1:cadc62b37feddb4281e471d15627a9a1bef32cb1 @@ -8870,8 +8942,8 @@ trackedFiles: pristine_git_object: 3d9437c8ce1bdc83d3703c4374cf10b1bcae5d71 src/openrouter/embeddings.py: id: 0374ace39067 - last_write_checksum: sha1:bdfaf3f9ffa1e337c0cc62b5a956a53c7863f24d - pristine_git_object: 9f0b5ce3612b8e56070f8cc69e890aaeb98491a9 + last_write_checksum: sha1:6a967c8d367aabf21aae51b4c098e02f3909bf5a + pristine_git_object: 906426aac514d79539160aae83cb6dbd4e128eac src/openrouter/endpoints.py: id: 465bbf2b7939 last_write_checksum: sha1:0c4ec93f6309edfb7f009679c04f59fa2a62232c @@ -8966,8 +9038,8 @@ trackedFiles: pristine_git_object: f6dbf5440466ba6b1d92442cad1b91e2b3587c52 src/openrouter/guardrails.py: id: 705839f34e66 - last_write_checksum: sha1:e525be9e5746b7b1cb6d170ac74cce37f010004a - pristine_git_object: 4add1c7f1f5608569227ae476d820fa412e33745 + last_write_checksum: sha1:65e0cab899a38685f01c55aaac154d7c34e4cf71 + pristine_git_object: 0e06ce70572df1bf0dfc202de4fb6f918f27d1c5 src/openrouter/httpclient.py: id: e9311185443d last_write_checksum: sha1:5e55338d6ee9f01ab648cad4380201a8a3da7dd7 @@ -8990,20 +9062,20 @@ trackedFiles: pristine_git_object: 5b741456655ff48919d17ffd552a6410f0587966 src/openrouter/models_.py: id: 4e1ae1fe5b98 - last_write_checksum: sha1:7b5b5454677f47a3a0fbfeff8c084ecd569a95b9 - pristine_git_object: 0379827532be6069ef8a592771c01c1e44219636 + last_write_checksum: sha1:92ace67311606c8bb05b1e264f394e58e2f3a73d + pristine_git_object: 1a85e99763d0764e5d200911200e4710e454b538 src/openrouter/oauth.py: id: 1948ce27255b last_write_checksum: sha1:8d6ba30594d5674164f045d6655914b801268f72 pristine_git_object: d6a938412d5c82be874e958ba4a3043bd46284d3 src/openrouter/observability.py: id: 6a17f32d3f33 - last_write_checksum: sha1:760a86891fad356e60d36c619e02d7c710f10d70 - pristine_git_object: a1dea9b45650cc42a6f60447c032fa46b102839a + last_write_checksum: sha1:4c9eabfefd55cb2cfe1e3813a567296e99e988aa + pristine_git_object: 67318c78e377567e897be1f572a1e3cbdac0366b src/openrouter/operations/__init__.py: id: 9afcea1e7161 - last_write_checksum: sha1:d5a5875a32fab4fc32e68a7c4036483701797944 - pristine_git_object: 134f9b320535b89c7904427ca69322f9507e7ac2 + last_write_checksum: sha1:e56a2031fc05ced63f1e1c769fc3407b290890a8 + pristine_git_object: 95999d265d654c5c2adab6aaf93bab0e75376e3d src/openrouter/operations/bulkaddworkspacemembers.py: id: e0ed56117619 last_write_checksum: sha1:5c44eb0d40fdece3ac084615f6c6082be4cf1d5a @@ -9050,8 +9122,8 @@ trackedFiles: pristine_git_object: d96c756e911994eaf6ef695a059f7575d69ff63c src/openrouter/operations/createembeddings.py: id: fe1160a960e9 - last_write_checksum: sha1:b268603b5bade55ac49a04e3ce217858ab3174b9 - pristine_git_object: 699e98674ffe69fea3bd1b8df9383cd558884c19 + last_write_checksum: sha1:a0b0b0755594b7a11b6662d9b8685fd3174d64e0 + pristine_git_object: a7fed8ead2d7dbf97fe0107a4f63318b7e610048 src/openrouter/operations/createguardrail.py: id: 52ed4b2f5903 last_write_checksum: sha1:d4351fdd66f1fa2bedcfc9a974c7f4ff6c68a6bc @@ -9178,8 +9250,8 @@ trackedFiles: pristine_git_object: d5a47b01285b12f05d46240e253a934be63f0a00 src/openrouter/operations/getmodels.py: id: 5bd5dfcb0125 - last_write_checksum: sha1:3501eb6dccdf4bf3dc52d2228b5906be95481470 - pristine_git_object: dc16709a2472ddaf838eaa21ffda7be17f7dd0f2 + last_write_checksum: sha1:f736c36217ac4f17ba5405dabcc33ee54223a256 + pristine_git_object: de855463c99bc9ea9e94fc78093d289c6dc0d20a src/openrouter/operations/getobservabilitydestination.py: id: 15b49f22aca9 last_write_checksum: sha1:351b050b646c9e2dbffaf27633cbd38b30047169 @@ -9218,12 +9290,12 @@ trackedFiles: pristine_git_object: cc90375e9aac23107e57e18e6adecc38f544e185 src/openrouter/operations/listbyokkeys.py: id: b6dd42b3e05f - last_write_checksum: sha1:09b5ddfd1b3558638199bf268b5a931a74094012 - pristine_git_object: 67d30bcc6c66aa56f40f3b56b94c2a31879f50d6 + last_write_checksum: sha1:20949993bdcdb4e6827a1a17bf1aa1230690f630 + pristine_git_object: 46c012e74b47beaa8f0b6828cc5bb319fe315e77 src/openrouter/operations/listembeddingsmodels.py: id: bf749a1f23d6 - last_write_checksum: sha1:19ed80a098e6e1b43bedfcccb11b4c8d8794541c - pristine_git_object: a019232d0cfcaccbca305f9d9aefccd0a5023df9 + last_write_checksum: sha1:0af7e243f6b7ea8dcb9c3e506c0e9382372e8397 + pristine_git_object: 016f0b9bc08b60b51e61f5b6acc44697ef5f1c27 src/openrouter/operations/listendpoints.py: id: 62b7a5f21dec last_write_checksum: sha1:1aa9ca7cc8e0376cc77fe81403e2664ecbd1abb2 @@ -9242,16 +9314,16 @@ trackedFiles: pristine_git_object: d57feee9926b76b03d1ec5ed8655cde8310b8192 src/openrouter/operations/listguardrailkeyassignments.py: id: ee9d33f4de6b - last_write_checksum: sha1:6837feb62ec5d172f6588933821232ad73fa08f2 - pristine_git_object: e7a2c31fb2451fbbc836d1356d156db8e9a7a933 + last_write_checksum: sha1:82c4cb0cd9d16cd761b7c0db8fa66165e1bb6f11 + pristine_git_object: 90f267220ceab68f8965a64b5d008a891da9f0d3 src/openrouter/operations/listguardrailmemberassignments.py: id: e36e679b02ec - last_write_checksum: sha1:de031b827a456c84a7d92790fca5ddd06780aa7a - pristine_git_object: 84076b7480837071db3d745f0fee690bd7809a01 + last_write_checksum: sha1:c281ab2ced63404c7786dd0828363708d60ae081 + pristine_git_object: 4ff57806d2d433412d45aef06b033f0c2a3502ff src/openrouter/operations/listguardrails.py: id: c99a9e7be93c - last_write_checksum: sha1:c908e642caa02b7904355cc6dba6f2c4d9a83d1f - pristine_git_object: 461e691429a7daea86a57f6d08df1bf4e9f78833 + last_write_checksum: sha1:758db0ed0413ea4a9ec15ac0e6942fd4f56cc863 + pristine_git_object: 1e36035bdc2da8a195f335d0dca4f0bf6f6858de src/openrouter/operations/listimagemodelendpoints.py: id: 40fd868ead3f last_write_checksum: sha1:2f4ba55f45f8fe4b5ce56cb6781fa8db455f8927 @@ -9262,36 +9334,36 @@ trackedFiles: pristine_git_object: 01655ae02036acf433ec5f54fd1d9323a55f0684 src/openrouter/operations/listkeyassignments.py: id: e26c11d1bd3c - last_write_checksum: sha1:bade55d5aaef4f6d9437c24f0bcb39b645af05ae - pristine_git_object: 2aee3fc4636c77ba4fcf5884a4000a1a04ee58a8 + last_write_checksum: sha1:045dffabc8207001234c5426e8fec665749597ff + pristine_git_object: f9ccb3da2d18137bfd9cadf6b53448a5bd8c3efe src/openrouter/operations/listmemberassignments.py: id: a993b5549126 - last_write_checksum: sha1:f0aab0c649c589a7d76cdaa9bbe4f0529ade66de - pristine_git_object: f8e0b658a596aaab401ff4feb3fa633f56f831f2 + last_write_checksum: sha1:00abec2beffb8b43a17c9d053fd582f4802a80b2 + pristine_git_object: 60c04beaf9ddb069d8b6e9b689e158bac1cc7d8f src/openrouter/operations/listmodelscount.py: id: d588d81b71c2 last_write_checksum: sha1:359fe33759ae50d8180ab793a32b42045a28e3af pristine_git_object: 797af26e7d4985305600eb79b3ede8e78379d13a src/openrouter/operations/listmodelsuser.py: id: 16eb5946cf60 - last_write_checksum: sha1:f77768589018acd0395e98b9a313933872834d84 - pristine_git_object: 6070772eb28a5452620eb4ebebfa2bc5c2310a4f + last_write_checksum: sha1:ac09a491143da6a59b3b84ce74fcc51f19222b0c + pristine_git_object: d2a24e430af7ad8357c453a1a91dad76635501df src/openrouter/operations/listobservabilitydestinations.py: id: 40d2ffa975ee - last_write_checksum: sha1:3f7de2adcba23902d0abc08728d82bb138fa93d1 - pristine_git_object: 465e357cbbb90b0d1be4f7e223332bc14e5deb71 + last_write_checksum: sha1:e49fcd9ded0009ac0699ad63f8ddbfbb2dc92aab + pristine_git_object: 818784f85b0d94fb4731a492ed05297720b5add2 src/openrouter/operations/listorganizationmembers.py: id: d40a3e0e2b38 - last_write_checksum: sha1:d36b77a9962c1808572789f535a04acb51e64685 - pristine_git_object: 15662f480a26a6b35a299d2845556ac4b8bbddf1 + last_write_checksum: sha1:9501a8781176d34c507edb9b160f8e1dca1b190d + pristine_git_object: 06825eead8265472d4abaa1395328215e9dca760 src/openrouter/operations/listpresets.py: id: ecdc7097aab7 - last_write_checksum: sha1:5f23af709ff305b4a1ddb26fd972a080a9c5d134 - pristine_git_object: bf21a246c75309e027a8ee69eb19f610a26af61a + last_write_checksum: sha1:a20921ac7ad2f66fe43a8e09ff14aefeafdbffd3 + pristine_git_object: 23c66e8419b295bb092f2ba1dbf59f5cb30572f8 src/openrouter/operations/listpresetversions.py: id: 697cf707300b - last_write_checksum: sha1:47eabd5ac45fe37bc05f0c57faea512fcb6b1c05 - pristine_git_object: 36052fb3de83cfafd1c021ac8ebfa56110eb55af + last_write_checksum: sha1:5059f0a2b2af9247f2d0f9c84a1338570d671465 + pristine_git_object: 1224fee0a75a1bb356e4bb53459fd1d2a0db3e72 src/openrouter/operations/listproviders.py: id: cf6e2db15118 last_write_checksum: sha1:decee82d2b55738162cc47f02f56c592d53f9ee9 @@ -9310,12 +9382,12 @@ trackedFiles: pristine_git_object: a65454da5ec6727d99312d56c64324edd8615685 src/openrouter/operations/listworkspacemembers.py: id: 9886d508d283 - last_write_checksum: sha1:c83463410e0899b9f5b686e2155f69340c7acff7 - pristine_git_object: 9a8706fcb1a1761c4e636dba74866e239e8d51a3 + last_write_checksum: sha1:dac90a6e7a00d60bff8440f8a012b2a88cf5fc82 + pristine_git_object: ff41be4a17d8b57a01aa9c2273b7db6099f589fd src/openrouter/operations/listworkspaces.py: id: fe94c6f61835 - last_write_checksum: sha1:2458a0c8d4834fa046496a68620b66c5ba55d927 - pristine_git_object: a242ff323f23dfadad254b76440114e66db4e744 + last_write_checksum: sha1:7f5d1903b71a84b51230492ea725f42ee1c413e5 + pristine_git_object: 59f628e9ebbd9da59c4e76aa1c8a080e4f6bd063 src/openrouter/operations/queryanalytics.py: id: d76c63ff66f6 last_write_checksum: sha1:b184adfb9d438f443c1fd6c4e749aff3188e9496 @@ -9358,12 +9430,12 @@ trackedFiles: pristine_git_object: 228942b37d54273e752786186a49bd1b4ed4a787 src/openrouter/organization.py: id: 6f4c63c416e8 - last_write_checksum: sha1:b60a04c6f8482981e03f69fb357c8c183a187225 - pristine_git_object: d24bfa86c4b67290033a18eced04435a3fc3d69f + last_write_checksum: sha1:d12e64ae4b677c154ff5a2cb964d34ddd848a323 + pristine_git_object: 31c74edd544c4ab7d4c5153a6d2888623ca66aed src/openrouter/presets.py: id: bd0c40379dcd - last_write_checksum: sha1:69ad1119617e8e5af1294075eceb9502492724d0 - pristine_git_object: 13b309db7d8dc063c26af9479110eca7fa5b9641 + last_write_checksum: sha1:6de7b3adbfe270bf5b492b1da06230b9f6cc35d5 + pristine_git_object: 250c20d191dfd4a999ab461d6d5d1f066e1cfbeb src/openrouter/providers.py: id: debc4c48f149 last_write_checksum: sha1:11dbc607825edee8dcc84b39ee8171e097c47acf @@ -9490,8 +9562,8 @@ trackedFiles: pristine_git_object: 4a82cde858211c0f5a01b08980cee0e9e3d0f52c src/openrouter/workspaces.py: id: cd6c533b1802 - last_write_checksum: sha1:cde38a8140d790751ffd6bb013a4c702c112aa6f - pristine_git_object: f3cf390c8f027710aaf32e794fa5229f0447b991 + last_write_checksum: sha1:02edbeb467aca20ca454d2bc420aceefd6ef340c + pristine_git_object: d2088f5ad8c1adcd8824271f322b16bfe03731df examples: createResponses: speakeasy-default-create-responses: @@ -9648,9 +9720,13 @@ examples: application/json: {"error": {"code": 529, "message": "Provider returned error"}} listEmbeddingsModels: speakeasy-default-list-embeddings-models: + parameters: + query: + offset: 0 + limit: 500 responses: "200": - application/json: {"data": [{"architecture": {"input_modalities": ["text"], "modality": "text->text", "output_modalities": ["text"]}, "canonical_slug": "openai/gpt-4", "context_length": 8192, "created": 1692901234, "default_parameters": null, "id": "openai/gpt-4", "links": {"details": "/api/v1/models/openai/gpt-5.4/endpoints"}, "name": "GPT-4", "per_request_limits": null, "pricing": {"completion": "0.00006", "prompt": "0.00003"}, "supported_parameters": ["temperature", "top_p", "max_tokens", "frequency_penalty", "presence_penalty"], "supported_voices": null, "top_provider": {"is_moderated": true}}]} + application/json: {"data": [{"architecture": {"input_modalities": ["text"], "modality": "text->text", "output_modalities": ["text"]}, "canonical_slug": "openai/gpt-4", "context_length": 8192, "created": 1692901234, "default_parameters": null, "id": "openai/gpt-4", "links": {"details": "/api/v1/models/openai/gpt-4/endpoints"}, "name": "GPT-4", "per_request_limits": null, "pricing": {"completion": "0.00006", "prompt": "0.00003"}, "supported_parameters": ["temperature", "top_p", "max_tokens", "frequency_penalty", "presence_penalty"], "supported_voices": null, "top_provider": {"is_moderated": true}}], "links": {"next": "/api/v1/models?offset=500&limit=500"}, "total_count": 150} "400": application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} "500": @@ -9690,18 +9766,26 @@ examples: application/json: {"error": {"code": 500, "message": "Internal Server Error"}} getModels: speakeasy-default-get-models: + parameters: + query: + offset: 0 + limit: 500 responses: "200": - application/json: {"data": [{"architecture": {"input_modalities": ["text"], "modality": "text->text", "output_modalities": ["text"]}, "canonical_slug": "openai/gpt-4", "context_length": 8192, "created": 1692901234, "default_parameters": null, "id": "openai/gpt-4", "links": {"details": "/api/v1/models/openai/gpt-5.4/endpoints"}, "name": "GPT-4", "per_request_limits": null, "pricing": {"completion": "0.00006", "prompt": "0.00003"}, "supported_parameters": ["temperature", "top_p", "max_tokens", "frequency_penalty", "presence_penalty"], "supported_voices": null, "top_provider": {"is_moderated": true}}]} + application/json: {"data": [{"architecture": {"input_modalities": ["text"], "modality": "text->text", "output_modalities": ["text"]}, "canonical_slug": "openai/gpt-4", "context_length": 8192, "created": 1692901234, "default_parameters": null, "id": "openai/gpt-4", "links": {"details": "/api/v1/models/openai/gpt-4/endpoints"}, "name": "GPT-4", "per_request_limits": null, "pricing": {"completion": "0.00006", "prompt": "0.00003"}, "supported_parameters": ["temperature", "top_p", "max_tokens", "frequency_penalty", "presence_penalty"], "supported_voices": null, "top_provider": {"is_moderated": true}}], "links": {"next": "/api/v1/models?offset=500&limit=500"}, "total_count": 150} "400": application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} "500": application/json: {"error": {"code": 500, "message": "Internal Server Error"}} listModelsUser: speakeasy-default-list-models-user: + parameters: + query: + offset: 0 + limit: 500 responses: "200": - application/json: {"data": [{"architecture": {"input_modalities": ["text"], "modality": "text->text", "output_modalities": ["text"]}, "canonical_slug": "openai/gpt-4", "context_length": 8192, "created": 1692901234, "default_parameters": null, "id": "openai/gpt-4", "links": {"details": "/api/v1/models/openai/gpt-5.4/endpoints"}, "name": "GPT-4", "per_request_limits": null, "pricing": {"completion": "0.00006", "prompt": "0.00003"}, "supported_parameters": ["temperature", "top_p", "max_tokens", "frequency_penalty", "presence_penalty"], "supported_voices": null, "top_provider": {"is_moderated": true}}]} + application/json: {"data": [{"architecture": {"input_modalities": ["text"], "modality": "text->text", "output_modalities": ["text"]}, "canonical_slug": "openai/gpt-4", "context_length": 8192, "created": 1692901234, "default_parameters": null, "id": "openai/gpt-4", "links": {"details": "/api/v1/models/openai/gpt-4/endpoints"}, "name": "GPT-4", "per_request_limits": null, "pricing": {"completion": "0.00006", "prompt": "0.00003"}, "supported_parameters": ["temperature", "top_p", "max_tokens", "frequency_penalty", "presence_penalty"], "supported_voices": null, "top_provider": {"is_moderated": true}}], "links": {"next": "/api/v1/models?offset=500&limit=500"}, "total_count": 150} "401": application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} "404": @@ -9826,6 +9910,10 @@ examples: application/json: {"error": {"code": 500, "message": "Internal Server Error"}} listGuardrails: speakeasy-default-list-guardrails: + parameters: + query: + offset: 0 + limit: 50 responses: "200": 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} @@ -9896,6 +9984,10 @@ examples: application/json: {"error": {"code": 500, "message": "Internal Server Error"}} listKeyAssignments: speakeasy-default-list-key-assignments: + parameters: + query: + offset: 0 + limit: 50 responses: "200": application/json: {"data": [{"assigned_by": "user_abc123", "created_at": "2025-08-24T10:30:00Z", "guardrail_id": "550e8400-e29b-41d4-a716-446655440001", "id": "550e8400-e29b-41d4-a716-446655440000", "key_hash": "c56454edb818d6b14bc0d61c46025f1450b0f4012d12304ab40aacb519fcbc93", "key_label": "prod-key", "key_name": "Production Key"}], "total_count": 1} @@ -9905,6 +9997,10 @@ examples: application/json: {"error": {"code": 500, "message": "Internal Server Error"}} listMemberAssignments: speakeasy-default-list-member-assignments: + parameters: + query: + offset: 0 + limit: 50 responses: "200": application/json: {"data": [{"assigned_by": "user_abc123", "created_at": "2025-08-24T10:30:00Z", "guardrail_id": "550e8400-e29b-41d4-a716-446655440001", "id": "550e8400-e29b-41d4-a716-446655440000", "organization_id": "org_xyz789", "user_id": "user_abc123"}], "total_count": 1} @@ -9917,6 +10013,9 @@ examples: parameters: path: id: "550e8400-e29b-41d4-a716-446655440000" + query: + offset: 0 + limit: 50 responses: "200": application/json: {"data": [{"assigned_by": "user_abc123", "created_at": "2025-08-24T10:30:00Z", "guardrail_id": "550e8400-e29b-41d4-a716-446655440001", "id": "550e8400-e29b-41d4-a716-446655440000", "key_hash": "c56454edb818d6b14bc0d61c46025f1450b0f4012d12304ab40aacb519fcbc93", "key_label": "prod-key", "key_name": "Production Key"}], "total_count": 1} @@ -9949,6 +10048,9 @@ examples: parameters: path: id: "550e8400-e29b-41d4-a716-446655440000" + query: + offset: 0 + limit: 50 responses: "200": application/json: {"data": [{"assigned_by": "user_abc123", "created_at": "2025-08-24T10:30:00Z", "guardrail_id": "550e8400-e29b-41d4-a716-446655440001", "id": "550e8400-e29b-41d4-a716-446655440000", "organization_id": "org_xyz789", "user_id": "user_abc123"}], "total_count": 1} @@ -10044,6 +10146,10 @@ examples: application/json: {"error": {"code": 403, "message": "Only management keys can perform this operation"}} listOrganizationMembers: speakeasy-default-list-organization-members: + parameters: + query: + offset: 0 + limit: 50 responses: "200": application/json: {"data": [{"email": "jane.doe@example.com", "first_name": "Jane", "id": "user_2dHFtVWx2n56w6HkM0000000000", "last_name": "Doe", "role": "org:member"}], "total_count": 25} @@ -10254,6 +10360,10 @@ examples: application/json: {"error": {"code": 529, "message": "Provider returned error"}} listBYOKKeys: speakeasy-default-list-BYOK-keys: + parameters: + query: + offset: 0 + limit: 50 responses: "200": application/json: {"data": [{"allowed_api_key_hashes": null, "allowed_models": null, "allowed_user_ids": null, "created_at": "2025-08-24T10:30:00Z", "disabled": false, "id": "11111111-2222-3333-4444-555555555555", "is_fallback": false, "label": "sk-...AbCd", "provider": "openai", "sort_order": 0, "workspace_id": "550e8400-e29b-41d4-a716-446655440000"}], "total_count": 1} @@ -10379,6 +10489,10 @@ examples: application/json: {"error": {"code": 529, "message": "Provider returned error"}} listObservabilityDestinations: speakeasy-default-list-observability-destinations: + parameters: + query: + offset: 0 + limit: 50 responses: "200": application/json: {"data": [{"api_key_hashes": null, "config": {"baseUrl": "https://us.cloud.langfuse.com", "publicKey": "pk-l...EfGh", "secretKey": "sk-l...AbCd"}, "created_at": "2025-08-24T10:30:00Z", "enabled": true, "filter_rules": null, "id": "99999999-aaaa-bbbb-cccc-dddddddddddd", "name": "Production Langfuse", "privacy_mode": false, "sampling_rate": 1, "type": "langfuse", "updated_at": "2025-08-24T15:45:00Z", "workspace_id": "550e8400-e29b-41d4-a716-446655440000"}], "total_count": 1} @@ -10453,6 +10567,10 @@ examples: application/json: {"error": {"code": 500, "message": "Internal Server Error"}} listPresets: speakeasy-default-list-presets: + parameters: + query: + offset: 0 + limit: 50 responses: "200": application/json: {"data": [{"created_at": "2026-04-20T10:00:00Z", "creator_user_id": "user_2dHFtVWx2n56w6HkM0000000000", "description": null, "designated_version_id": "550e8400-e29b-41d4-a716-446655440000", "id": "650e8400-e29b-41d4-a716-446655440001", "name": "my-preset", "slug": "my-preset", "status": "active", "status_updated_at": null, "updated_at": "2026-04-20T10:00:00Z", "workspace_id": "750e8400-e29b-41d4-a716-446655440002"}], "total_count": 1} @@ -10549,6 +10667,9 @@ examples: parameters: path: slug: "my-preset" + query: + offset: 0 + limit: 50 responses: "200": application/json: {"data": [{"config": {"model": "openai/gpt-4o", "temperature": 0.7}, "created_at": "2026-04-20T10:00:00Z", "creator_id": "user_2dHFtVWx2n56w6HkM0000000000", "id": "550e8400-e29b-41d4-a716-446655440000", "preset_id": "650e8400-e29b-41d4-a716-446655440001", "system_prompt": "You are a helpful assistant.", "updated_at": "2026-04-20T10:00:00Z", "version": 1}], "total_count": 1} @@ -10579,6 +10700,10 @@ examples: application/json: {"error": {"code": 500, "message": "Internal Server Error"}} listWorkspaces: speakeasy-default-list-workspaces: + parameters: + query: + offset: 0 + limit: 50 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", "io_logging_api_key_ids": null, "io_logging_sampling_rate": 1, "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} @@ -10952,6 +11077,9 @@ examples: parameters: path: id: "production" + query: + offset: 0 + limit: 50 responses: "200": application/json: {"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"}], "total_count": 1} @@ -10981,3 +11109,4 @@ examples: "500": application/json: {"error": {"code": 500, "message": "Internal Server Error"}} examplesVersion: 1.0.2 +releaseNotes: "## Python SDK Changes:\n* `open_router.beta.responses.send()`: \n * `request.input.union(Array<>)[].union(AdditionalToolsItem).tools[]` **Changed** (Breaking ⚠️)\n* `open_router.presets.create_presets_responses()`: \n * `request.input.union(Array<>)[].union(AdditionalToolsItem).tools[]` **Changed** (Breaking ⚠️)\n* `open_router.presets.create_presets_messages()`: \n * `request.tools[]` **Changed** (Breaking ⚠️)\n* `open_router.models.list()`: \n * `request` **Changed**\n * `response` **Changed**\n* `open_router.observability.list()`: `request` **Changed**\n* `open_router.guardrails.list_guardrail_member_assignments()`: `request` **Changed**\n* `open_router.guardrails.list_key_assignments()`: `request` **Changed**\n* `open_router.guardrails.list_member_assignments()`: `request` **Changed**\n* `open_router.guardrails.list()`: `request` **Changed**\n* `open_router.models.list_for_user()`: \n * `request` **Changed**\n * `response` **Changed**\n* `open_router.guardrails.list_guardrail_key_assignments()`: `request` **Changed**\n* `open_router.organization.list_members()`: `request` **Changed**\n* `open_router.presets.list()`: `request` **Changed**\n* `open_router.embeddings.list_models()`: \n * `request` **Changed**\n * `response` **Changed**\n* `open_router.byok.list()`: `request` **Changed**\n* `open_router.presets.list_versions()`: `request` **Changed**\n* `open_router.workspaces.list()`: `request` **Changed**\n* `open_router.workspaces.list_members()`: `request` **Changed**\n" diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index b0c9bfea..0640159e 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -36,7 +36,7 @@ generation: documentation: mintlify preApplyUnionDiscriminators: true python: - version: 0.11.23 + version: 0.11.24 additionalDependencies: dev: {} main: {} diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml index 0423eaf9..2fd440fd 100644 --- a/.speakeasy/out.openapi.yaml +++ b/.speakeasy/out.openapi.yaml @@ -223,7 +223,7 @@ components: - $ref: '#/components/schemas/FilesServerTool' - $ref: '#/components/schemas/FusionServerTool_OpenRouter' - $ref: '#/components/schemas/ImageGenerationServerTool_OpenRouter' - - $ref: '#/components/schemas/ChatSearchModelsServerTool' + - $ref: '#/components/schemas/SearchModelsServerTool_OpenRouter' - $ref: '#/components/schemas/WebFetchServerTool' - $ref: '#/components/schemas/WebSearchServerTool_OpenRouter' - $ref: '#/components/schemas/ApplyPatchServerTool_OpenRouter' @@ -972,6 +972,42 @@ components: - start_block_index - end_block_index type: object + AnthropicCitationSearchResultLocationParam: + example: + cited_text: Example cited text + end_block_index: 1 + search_result_index: 0 + source: example_source + start_block_index: 0 + title: Example Result + type: search_result_location + properties: + cited_text: + type: string + end_block_index: + type: integer + search_result_index: + type: integer + source: + type: string + start_block_index: + type: integer + title: + nullable: true + type: string + type: + enum: + - search_result_location + type: string + required: + - type + - cited_text + - search_result_index + - source + - title + - start_block_index + - end_block_index + type: object AnthropicCitationWebSearchResultLocation: example: cited_text: Example cited text @@ -1000,6 +1036,34 @@ components: - title - url type: object + AnthropicCitationWebSearchResultLocationParam: + example: + cited_text: Example cited text + encrypted_index: enc_idx_0 + title: Example Page + type: web_search_result_location + url: https://example.com + properties: + cited_text: + type: string + encrypted_index: + type: string + title: + nullable: true + type: string + type: + enum: + - web_search_result_location + type: string + url: + type: string + required: + - type + - cited_text + - encrypted_index + - title + - url + type: object AnthropicCodeExecution20250825Caller: example: tool_id: toolu_01abc @@ -1619,15 +1683,15 @@ components: char_location: '#/components/schemas/AnthropicCitationCharLocationParam' content_block_location: '#/components/schemas/AnthropicCitationContentBlockLocationParam' page_location: '#/components/schemas/AnthropicCitationPageLocationParam' - search_result_location: '#/components/schemas/AnthropicCitationSearchResultLocation' - web_search_result_location: '#/components/schemas/AnthropicCitationWebSearchResultLocation' + search_result_location: '#/components/schemas/AnthropicCitationSearchResultLocationParam' + web_search_result_location: '#/components/schemas/AnthropicCitationWebSearchResultLocationParam' propertyName: type oneOf: - $ref: '#/components/schemas/AnthropicCitationCharLocationParam' - $ref: '#/components/schemas/AnthropicCitationPageLocationParam' - $ref: '#/components/schemas/AnthropicCitationContentBlockLocationParam' - - $ref: '#/components/schemas/AnthropicCitationWebSearchResultLocation' - - $ref: '#/components/schemas/AnthropicCitationSearchResultLocation' + - $ref: '#/components/schemas/AnthropicCitationWebSearchResultLocationParam' + - $ref: '#/components/schemas/AnthropicCitationSearchResultLocationParam' nullable: true type: array text: @@ -4594,6 +4658,18 @@ components: - type - grammar type: object + ChatFormatJsonObjectConfig: + description: JSON object response format + example: + type: json_object + properties: + type: + enum: + - json_object + type: string + required: + - type + type: object ChatFormatJsonSchemaConfig: description: JSON Schema response format for structured outputs example: @@ -5025,7 +5101,7 @@ components: discriminator: mapping: grammar: '#/components/schemas/ChatFormatGrammarConfig' - json_object: '#/components/schemas/FormatJsonObjectConfig' + json_object: '#/components/schemas/ChatFormatJsonObjectConfig' json_schema: '#/components/schemas/ChatFormatJsonSchemaConfig' python: '#/components/schemas/ChatFormatPythonConfig' text: '#/components/schemas/ChatFormatTextConfig' @@ -5034,7 +5110,7 @@ components: type: json_object oneOf: - $ref: '#/components/schemas/ChatFormatTextConfig' - - $ref: '#/components/schemas/FormatJsonObjectConfig' + - $ref: '#/components/schemas/ChatFormatJsonObjectConfig' - $ref: '#/components/schemas/ChatFormatJsonSchemaConfig' - $ref: '#/components/schemas/ChatFormatGrammarConfig' - $ref: '#/components/schemas/ChatFormatPythonConfig' @@ -6758,7 +6834,7 @@ components: example: true type: boolean filter_rules: - $ref: '#/components/schemas/ObservabilityFilterRulesConfig' + $ref: '#/components/schemas/ObservabilityFilterRulesConfigNullable' name: description: Human-readable name for the destination. example: Production Langfuse @@ -9984,6 +10060,16 @@ components: - text - phase type: object + ImageInputModality: + enum: + - text + - image + - file + - audio + - video + example: text + type: string + x-speakeasy-unknown-values: allow ImageModelArchitecture: example: input_modalities: @@ -9995,7 +10081,7 @@ components: input_modalities: description: Supported input modalities items: - $ref: '#/components/schemas/InputModality' + $ref: '#/components/schemas/ImageInputModality' type: array output_modalities: description: Supported output modalities @@ -10717,11 +10803,22 @@ components: - input_video type: string video_url: - $ref: '#/components/schemas/ChatContentVideoInput' + $ref: '#/components/schemas/Legacy_ChatContentVideoInput' required: - type - video_url type: object + Legacy_ChatContentVideoInput: + description: Video input object + example: + url: https://example.com/video.mp4 + properties: + url: + description: 'URL of the video (data: URLs supported)' + type: string + required: + - url + type: object Legacy_WebSearchServerTool: description: Web search tool configuration example: @@ -12510,7 +12607,7 @@ components: - $ref: '#/components/schemas/BashServerTool' - $ref: '#/components/schemas/DatetimeServerTool' - $ref: '#/components/schemas/ImageGenerationServerTool_OpenRouter' - - $ref: '#/components/schemas/ChatSearchModelsServerTool' + - $ref: '#/components/schemas/MessagesSearchModelsServerTool' - $ref: '#/components/schemas/WebFetchServerTool' - $ref: '#/components/schemas/OpenRouterWebSearchServerTool' - additionalProperties: @@ -12618,6 +12715,22 @@ components: output_tokens: 15 server_tool_use: null service_tier: standard + MessagesSearchModelsServerTool: + description: 'OpenRouter built-in server tool: searches and filters AI models available on OpenRouter' + example: + parameters: + max_results: 5 + type: openrouter:experimental__search_models + properties: + parameters: + $ref: '#/components/schemas/SearchModelsServerToolConfig' + type: + enum: + - openrouter:experimental__search_models + type: string + required: + - type + type: object MessagesStartEvent: description: Event sent at the start of a streaming message example: @@ -13041,35 +13154,7 @@ components: $ref: '#/components/schemas/InputModality' type: array instruct_type: - description: Instruction format type - enum: - - none - - airoboros - - alpaca - - alpaca-modif - - chatml - - claude - - code-llama - - gemma - - llama2 - - llama3 - - mistral - - nemotron - - neural - - openchat - - phi3 - - rwkv - - vicuna - - zephyr - - deepseek-r1 - - deepseek-v3.1 - - qwq - - qwen3 - - null - example: chatml - nullable: true - type: string - x-speakeasy-unknown-values: allow + $ref: '#/components/schemas/InstructType' modality: description: Primary modality of the model example: text->text @@ -13275,7 +13360,7 @@ components: id: openai/gpt-4 knowledge_cutoff: null links: - details: /api/v1/models/openai/gpt-5.4/endpoints + details: /api/v1/models/openai/gpt-4/endpoints name: GPT-4 per_request_limits: null pricing: @@ -13294,11 +13379,31 @@ components: context_length: 8192 is_moderated: true max_completion_tokens: 4096 + links: + next: /api/v1/models?offset=500&limit=500 + total_count: 150 properties: data: $ref: '#/components/schemas/ModelsListResponseData' + links: + description: Pagination links + properties: + next: + description: URL for the next page of results, or null if this is the last page + example: /api/v1/models?offset=500&limit=500 + nullable: true + type: string + required: + - next + type: object + total_count: + description: Total number of models matching the query + example: 150 + type: integer required: - data + - total_count + - links type: object ModelsListResponseData: description: List of available models @@ -13320,7 +13425,7 @@ components: id: openai/gpt-4 knowledge_cutoff: null links: - details: /api/v1/models/openai/gpt-5.4/endpoints + details: /api/v1/models/openai/gpt-4/endpoints name: GPT-4 per_request_limits: null pricing: @@ -13886,6 +13991,69 @@ components: - $ref: '#/components/schemas/ObservabilitySnowflakeDestination' - $ref: '#/components/schemas/ObservabilityWeaveDestination' - $ref: '#/components/schemas/ObservabilityWebhookDestination' + ObservabilityFilterRuleGroup: + example: + logic: and + rules: + - field: model + operator: equals + value: openai/gpt-4o + properties: + logic: + default: and + enum: + - and + - or + type: string + x-speakeasy-unknown-values: allow + rules: + items: + properties: + field: + enum: + - model + - provider + - session_id + - user_id + - api_key_name + - finish_reason + - input + - output + - total_cost + - total_tokens + - prompt_tokens + - completion_tokens + type: string + x-speakeasy-unknown-values: allow + operator: + enum: + - equals + - not_equals + - contains + - not_contains + - regex + - starts_with + - ends_with + - gt + - lt + - gte + - lte + - exists + - not_exists + type: string + x-speakeasy-unknown-values: allow + value: + anyOf: + - type: string + - type: number + required: + - field + - operator + type: object + type: array + required: + - rules + type: object ObservabilityFilterRulesConfig: description: Optional structured filter rules controlling which events are forwarded. example: null @@ -13896,62 +14064,22 @@ components: type: boolean groups: items: - properties: - logic: - default: and - enum: - - and - - or - type: string - x-speakeasy-unknown-values: allow - rules: - items: - properties: - field: - enum: - - model - - provider - - session_id - - user_id - - api_key_name - - finish_reason - - input - - output - - total_cost - - total_tokens - - prompt_tokens - - completion_tokens - type: string - x-speakeasy-unknown-values: allow - operator: - enum: - - equals - - not_equals - - contains - - not_contains - - regex - - starts_with - - ends_with - - gt - - lt - - gte - - lte - - exists - - not_exists - type: string - x-speakeasy-unknown-values: allow - value: - anyOf: - - type: string - - type: number - required: - - field - - operator - type: object - type: array - required: - - rules - type: object + $ref: '#/components/schemas/ObservabilityFilterRuleGroup' + type: array + required: + - groups + type: object + ObservabilityFilterRulesConfigNullable: + description: Optional structured filter rules controlling which events are forwarded. + example: null + nullable: true + properties: + enabled: + default: true + type: boolean + groups: + items: + $ref: '#/components/schemas/ObservabilityFilterRuleGroup' type: array required: - groups @@ -20187,7 +20315,7 @@ components: - $ref: '#/components/schemas/FilesServerTool' - $ref: '#/components/schemas/FusionServerTool_OpenRouter' - $ref: '#/components/schemas/ImageGenerationServerTool_OpenRouter' - - $ref: '#/components/schemas/ChatSearchModelsServerTool' + - $ref: '#/components/schemas/SearchModelsServerTool_OpenRouter' - $ref: '#/components/schemas/WebFetchServerTool' - $ref: '#/components/schemas/WebSearchServerTool_OpenRouter' - $ref: '#/components/schemas/ApplyPatchServerTool_OpenRouter' @@ -20284,6 +20412,22 @@ components: example: medium type: string x-speakeasy-unknown-values: allow + SearchModelsServerTool_OpenRouter: + description: 'OpenRouter built-in server tool: searches and filters AI models available on OpenRouter' + example: + parameters: + max_results: 5 + type: openrouter:experimental__search_models + properties: + parameters: + $ref: '#/components/schemas/SearchModelsServerToolConfig' + type: + enum: + - openrouter:experimental__search_models + type: string + required: + - type + type: object SearchModelsServerToolConfig: description: Configuration for the openrouter:experimental__search_models server tool example: @@ -22362,7 +22506,7 @@ components: type: boolean filter_rules: allOf: - - $ref: '#/components/schemas/ObservabilityFilterRulesConfig' + - $ref: '#/components/schemas/ObservabilityFilterRulesConfigNullable' - description: Optional structured filter rules. `null` clears the rules. Omitting keeps the current value. name: description: Human-readable name for the destination. @@ -24933,6 +25077,7 @@ paths: name: offset required: false schema: + default: 0 description: Number of records to skip for pagination example: 0 minimum: 0 @@ -24943,6 +25088,7 @@ paths: name: limit required: false schema: + default: 50 description: Maximum number of records to return (max 100) example: 50 maximum: 100 @@ -26512,27 +26658,7 @@ paths: format: double type: number cost_details: - description: Breakdown of upstream inference costs - example: - upstream_inference_completions_cost: 0.0004 - upstream_inference_cost: null - upstream_inference_prompt_cost: 0.0008 - nullable: true - properties: - upstream_inference_completions_cost: - format: double - type: number - upstream_inference_cost: - format: double - nullable: true - type: number - upstream_inference_prompt_cost: - format: double - type: number - required: - - upstream_inference_prompt_cost - - upstream_inference_completions_cost - type: object + $ref: '#/components/schemas/CostDetails' is_byok: description: Whether a request was made using a Bring Your Own Key configuration type: boolean @@ -26694,6 +26820,32 @@ paths: get: description: Returns a list of all available embeddings models and their properties operationId: listEmbeddingsModels + parameters: + - description: Number of records to skip for pagination. When both offset and limit are omitted, the full list is returned + in: query + name: offset + required: false + schema: + default: 0 + description: >- + Number of records to skip for pagination. When both offset and limit are omitted, the full list is returned + example: 0 + minimum: 0 + nullable: false + type: integer + - description: >- + Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned + in: query + name: limit + required: false + schema: + default: 500 + description: >- + Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned + example: 500 + maximum: 1000 + minimum: 1 + type: integer responses: '200': content: @@ -26758,6 +26910,17 @@ paths: tags: - Embeddings x-speakeasy-name-override: listModels + x-speakeasy-pagination: + inputs: + - in: parameters + name: offset + type: offset + - in: parameters + name: limit + type: limit + outputs: + results: $.data + type: offsetLimit parameters: - $ref: "#/components/parameters/AppIdentifier" - $ref: "#/components/parameters/AppDisplayName" @@ -27683,6 +27846,7 @@ paths: name: offset required: false schema: + default: 0 description: Number of records to skip for pagination example: 0 minimum: 0 @@ -27693,6 +27857,7 @@ paths: name: limit required: false schema: + default: 50 description: Maximum number of records to return (max 100) example: 50 maximum: 100 @@ -28120,6 +28285,7 @@ paths: name: offset required: false schema: + default: 0 description: Number of records to skip for pagination example: 0 minimum: 0 @@ -28130,6 +28296,7 @@ paths: name: limit required: false schema: + default: 50 description: Maximum number of records to return (max 100) example: 50 maximum: 100 @@ -28378,6 +28545,7 @@ paths: name: offset required: false schema: + default: 0 description: Number of records to skip for pagination example: 0 minimum: 0 @@ -28388,6 +28556,7 @@ paths: name: limit required: false schema: + default: 50 description: Maximum number of records to return (max 100) example: 50 maximum: 100 @@ -28628,6 +28797,7 @@ paths: name: offset required: false schema: + default: 0 description: Number of records to skip for pagination example: 0 minimum: 0 @@ -28638,6 +28808,7 @@ paths: name: limit required: false schema: + default: 50 description: Maximum number of records to return (max 100) example: 50 maximum: 100 @@ -28710,6 +28881,7 @@ paths: name: offset required: false schema: + default: 0 description: Number of records to skip for pagination example: 0 minimum: 0 @@ -28720,6 +28892,7 @@ paths: name: limit required: false schema: + default: 50 description: Maximum number of records to return (max 100) example: 50 maximum: 100 @@ -30873,6 +31046,31 @@ paths: get: operationId: getModels parameters: + - description: Number of records to skip for pagination. When both offset and limit are omitted, the full list is returned + in: query + name: offset + required: false + schema: + default: 0 + description: >- + Number of records to skip for pagination. When both offset and limit are omitted, the full list is returned + example: 0 + minimum: 0 + nullable: false + type: integer + - description: >- + Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned + in: query + name: limit + required: false + schema: + default: 500 + description: >- + Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned + example: 500 + maximum: 1000 + minimum: 1 + type: integer - description: Filter models by use case category in: query name: category @@ -31230,6 +31428,17 @@ paths: tags: - Models 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 parameters: - $ref: "#/components/parameters/AppIdentifier" - $ref: "#/components/parameters/AppDisplayName" @@ -31414,6 +31623,32 @@ paths: description: >- List models filtered by user provider preferences, [privacy settings](https://openrouter.ai/docs/guides/privacy/provider-logging), and [guardrails](https://openrouter.ai/docs/guides/features/guardrails). If requesting through `eu.openrouter.ai/api/v1/...` the results will be filtered to models that satisfy [EU in-region routing](https://openrouter.ai/docs/guides/privacy/provider-logging#enterprise-eu-in-region-routing). operationId: listModelsUser + parameters: + - description: Number of records to skip for pagination. When both offset and limit are omitted, the full list is returned + in: query + name: offset + required: false + schema: + default: 0 + description: >- + Number of records to skip for pagination. When both offset and limit are omitted, the full list is returned + example: 0 + minimum: 0 + nullable: false + type: integer + - description: >- + Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned + in: query + name: limit + required: false + schema: + default: 500 + description: >- + Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned + example: 500 + maximum: 1000 + minimum: 1 + type: integer responses: '200': content: @@ -31437,7 +31672,7 @@ paths: id: openai/gpt-4 knowledge_cutoff: null links: - details: /api/v1/models/openai/gpt-5.4/endpoints + details: /api/v1/models/openai/gpt-4/endpoints name: GPT-4 per_request_limits: null pricing: @@ -31493,6 +31728,17 @@ paths: tags: - Models x-speakeasy-name-override: listForUser + x-speakeasy-pagination: + inputs: + - in: parameters + name: offset + type: offset + - in: parameters + name: limit + type: limit + outputs: + results: $.data + type: offsetLimit parameters: - $ref: "#/components/parameters/AppIdentifier" - $ref: "#/components/parameters/AppDisplayName" @@ -31508,6 +31754,7 @@ paths: name: offset required: false schema: + default: 0 description: Number of records to skip for pagination example: 0 minimum: 0 @@ -31518,6 +31765,7 @@ paths: name: limit required: false schema: + default: 50 description: Maximum number of records to return (max 100) example: 50 maximum: 100 @@ -31937,6 +32185,7 @@ paths: name: offset required: false schema: + default: 0 description: Number of records to skip for pagination example: 0 minimum: 0 @@ -31947,6 +32196,7 @@ paths: name: limit required: false schema: + default: 50 description: Maximum number of records to return (max 100) example: 50 maximum: 100 @@ -32072,6 +32322,7 @@ paths: name: offset required: false schema: + default: 0 description: Number of records to skip for pagination example: 0 minimum: 0 @@ -32082,6 +32333,7 @@ paths: name: limit required: false schema: + default: 50 description: Maximum number of records to return (max 100) example: 50 maximum: 100 @@ -32654,6 +32906,7 @@ paths: name: offset required: false schema: + default: 0 description: Number of records to skip for pagination example: 0 minimum: 0 @@ -32664,6 +32917,7 @@ paths: name: limit required: false schema: + default: 50 description: Maximum number of records to return (max 100) example: 50 maximum: 100 @@ -34295,6 +34549,7 @@ paths: name: offset required: false schema: + default: 0 description: Number of records to skip for pagination example: 0 minimum: 0 @@ -34305,6 +34560,7 @@ paths: name: limit required: false schema: + default: 50 description: Maximum number of records to return (max 100) example: 50 maximum: 100 @@ -34958,6 +35214,7 @@ paths: name: offset required: false schema: + default: 0 description: Number of records to skip for pagination example: 0 minimum: 0 @@ -34968,6 +35225,7 @@ paths: name: limit required: false schema: + default: 50 description: Maximum number of records to return (max 100) example: 50 maximum: 100 diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index ac79a9f7..ddd35cc9 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -2,8 +2,8 @@ speakeasyVersion: 1.787.0 sources: OpenRouter API: sourceNamespace: open-router-chat-completions-api - sourceRevisionDigest: sha256:91baf68600b99a1acb7cb48770bd8c65f2b52078522d9da36800b7643cafc19f - sourceBlobDigest: sha256:02edebbb16b70cdfd1a10bb719ff1031e41efca6d359d06417af23a8aea281cf + sourceRevisionDigest: sha256:aa9148968ef9a66307aca31b047a12fb8a955aa957482a3b06a582537f259cb4 + sourceBlobDigest: sha256:ac0a0e1f34d3f5e342c3ba497bf58ea2d83107f59302dd2c399a70116dfe8845 tags: - latest - 1.0.0 @@ -11,10 +11,10 @@ targets: open-router: source: OpenRouter API sourceNamespace: open-router-chat-completions-api - sourceRevisionDigest: sha256:91baf68600b99a1acb7cb48770bd8c65f2b52078522d9da36800b7643cafc19f - sourceBlobDigest: sha256:02edebbb16b70cdfd1a10bb719ff1031e41efca6d359d06417af23a8aea281cf + sourceRevisionDigest: sha256:aa9148968ef9a66307aca31b047a12fb8a955aa957482a3b06a582537f259cb4 + sourceBlobDigest: sha256:ac0a0e1f34d3f5e342c3ba497bf58ea2d83107f59302dd2c399a70116dfe8845 codeSamplesNamespace: open-router-python-code-samples - codeSamplesRevisionDigest: sha256:4d79cd30506971bb612d61d9874f75ba05d12922734d2c246672e3607f98b17b + codeSamplesRevisionDigest: sha256:252d3909d3f6fce4c2605924214b126af1fe4c3162dd52ba9cf9ad32ddd7dbda workflow: workflowVersion: 1.0.0 speakeasyVersion: 1.787.0 diff --git a/README-PYPI.md b/README-PYPI.md index 6b6e72cf..633da1b5 100644 --- a/README-PYPI.md +++ b/README-PYPI.md @@ -189,7 +189,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.byok.list() + res = open_router.byok.list(offset=0, limit=50) while res is not None: # Handle items diff --git a/README.md b/README.md index 6b6e72cf..633da1b5 100644 --- a/README.md +++ b/README.md @@ -189,7 +189,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.byok.list() + res = open_router.byok.list(offset=0, limit=50) while res is not None: # Handle items diff --git a/RELEASES.md b/RELEASES.md index 28a3ac2c..f8b0a1d5 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -338,4 +338,14 @@ Based on: ### Generated - [python v0.11.23] . ### Releases -- [PyPI v0.11.23] https://pypi.org/project/openrouter/0.11.23 - . \ No newline at end of file +- [PyPI v0.11.23] https://pypi.org/project/openrouter/0.11.23 - . + +## 2026-07-13 17:54:57 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.787.0 (2.914.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v0.11.24] . +### Releases +- [PyPI v0.11.24] https://pypi.org/project/openrouter/0.11.24 - . \ No newline at end of file diff --git a/docs/components/additionaltoolsitemtoolunion.mdx b/docs/components/additionaltoolsitemtoolunion.mdx index 5fc5576b..31c68529 100644 --- a/docs/components/additionaltoolsitemtoolunion.mdx +++ b/docs/components/additionaltoolsitemtoolunion.mdx @@ -124,10 +124,10 @@ value: components.FusionServerToolOpenRouter = /* values here */ value: components.ImageGenerationServerToolOpenRouter = /* values here */ ``` -### `components.ChatSearchModelsServerTool` +### `components.SearchModelsServerToolOpenRouter` ```python -value: components.ChatSearchModelsServerTool = /* values here */ +value: components.SearchModelsServerToolOpenRouter = /* values here */ ``` ### `components.WebFetchServerTool` diff --git a/docs/components/anthropiccitationsearchresultlocation.mdx b/docs/components/anthropiccitationsearchresultlocation.mdx deleted file mode 100644 index 4766fcaa..00000000 --- a/docs/components/anthropiccitationsearchresultlocation.mdx +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "AnthropicCitationSearchResultLocation" ---- - -## Fields - -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | -| `cited_text` | *str* | :heavy_check_mark: | N/A | -| `end_block_index` | *int* | :heavy_check_mark: | N/A | -| `search_result_index` | *int* | :heavy_check_mark: | N/A | -| `source` | *str* | :heavy_check_mark: | N/A | -| `start_block_index` | *int* | :heavy_check_mark: | N/A | -| `title` | *Nullable[str]* | :heavy_check_mark: | N/A | -| `type` | [components.AnthropicCitationSearchResultLocationType](../components/anthropiccitationsearchresultlocationtype.mdx) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/anthropiccitationsearchresultlocationparam.mdx b/docs/components/anthropiccitationsearchresultlocationparam.mdx new file mode 100644 index 00000000..8d0c9d2a --- /dev/null +++ b/docs/components/anthropiccitationsearchresultlocationparam.mdx @@ -0,0 +1,15 @@ +--- +title: "AnthropicCitationSearchResultLocationParam" +--- + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | +| `cited_text` | *str* | :heavy_check_mark: | N/A | +| `end_block_index` | *int* | :heavy_check_mark: | N/A | +| `search_result_index` | *int* | :heavy_check_mark: | N/A | +| `source` | *str* | :heavy_check_mark: | N/A | +| `start_block_index` | *int* | :heavy_check_mark: | N/A | +| `title` | *Nullable[str]* | :heavy_check_mark: | N/A | +| `type` | [components.AnthropicCitationSearchResultLocationParamType](../components/anthropiccitationsearchresultlocationparamtype.mdx) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/anthropiccitationsearchresultlocationparamtype.mdx b/docs/components/anthropiccitationsearchresultlocationparamtype.mdx new file mode 100644 index 00000000..36ba3e46 --- /dev/null +++ b/docs/components/anthropiccitationsearchresultlocationparamtype.mdx @@ -0,0 +1,15 @@ +--- +title: "AnthropicCitationSearchResultLocationParamType" +--- + +## Example Usage + +```python +from openrouter.components import AnthropicCitationSearchResultLocationParamType +value: AnthropicCitationSearchResultLocationParamType = "search_result_location" +``` + + +## Values + +- `"search_result_location"` diff --git a/docs/components/anthropiccitationsearchresultlocationtype.mdx b/docs/components/anthropiccitationsearchresultlocationtype.mdx deleted file mode 100644 index 096cc0d6..00000000 --- a/docs/components/anthropiccitationsearchresultlocationtype.mdx +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "AnthropicCitationSearchResultLocationType" ---- - -## Example Usage - -```python -from openrouter.components import AnthropicCitationSearchResultLocationType -value: AnthropicCitationSearchResultLocationType = "search_result_location" -``` - - -## Values - -- `"search_result_location"` diff --git a/docs/components/anthropiccitationwebsearchresultlocation.mdx b/docs/components/anthropiccitationwebsearchresultlocation.mdx deleted file mode 100644 index b03268fd..00000000 --- a/docs/components/anthropiccitationwebsearchresultlocation.mdx +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "AnthropicCitationWebSearchResultLocation" ---- - -## Fields - -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | -| `cited_text` | *str* | :heavy_check_mark: | N/A | -| `encrypted_index` | *str* | :heavy_check_mark: | N/A | -| `title` | *Nullable[str]* | :heavy_check_mark: | N/A | -| `type` | [components.AnthropicCitationWebSearchResultLocationType](../components/anthropiccitationwebsearchresultlocationtype.mdx) | :heavy_check_mark: | N/A | -| `url` | *str* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/anthropiccitationwebsearchresultlocationparam.mdx b/docs/components/anthropiccitationwebsearchresultlocationparam.mdx new file mode 100644 index 00000000..9b59d45b --- /dev/null +++ b/docs/components/anthropiccitationwebsearchresultlocationparam.mdx @@ -0,0 +1,13 @@ +--- +title: "AnthropicCitationWebSearchResultLocationParam" +--- + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | +| `cited_text` | *str* | :heavy_check_mark: | N/A | +| `encrypted_index` | *str* | :heavy_check_mark: | N/A | +| `title` | *Nullable[str]* | :heavy_check_mark: | N/A | +| `type` | [components.AnthropicCitationWebSearchResultLocationParamType](../components/anthropiccitationwebsearchresultlocationparamtype.mdx) | :heavy_check_mark: | N/A | +| `url` | *str* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/anthropiccitationwebsearchresultlocationparamtype.mdx b/docs/components/anthropiccitationwebsearchresultlocationparamtype.mdx new file mode 100644 index 00000000..4bc0197a --- /dev/null +++ b/docs/components/anthropiccitationwebsearchresultlocationparamtype.mdx @@ -0,0 +1,15 @@ +--- +title: "AnthropicCitationWebSearchResultLocationParamType" +--- + +## Example Usage + +```python +from openrouter.components import AnthropicCitationWebSearchResultLocationParamType +value: AnthropicCitationWebSearchResultLocationParamType = "web_search_result_location" +``` + + +## Values + +- `"web_search_result_location"` diff --git a/docs/components/anthropiccitationwebsearchresultlocationtype.mdx b/docs/components/anthropiccitationwebsearchresultlocationtype.mdx deleted file mode 100644 index 9cb6d29d..00000000 --- a/docs/components/anthropiccitationwebsearchresultlocationtype.mdx +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "AnthropicCitationWebSearchResultLocationType" ---- - -## Example Usage - -```python -from openrouter.components import AnthropicCitationWebSearchResultLocationType -value: AnthropicCitationWebSearchResultLocationType = "web_search_result_location" -``` - - -## Values - -- `"web_search_result_location"` diff --git a/docs/components/chatformatjsonobjectconfig.mdx b/docs/components/chatformatjsonobjectconfig.mdx new file mode 100644 index 00000000..5dae96c7 --- /dev/null +++ b/docs/components/chatformatjsonobjectconfig.mdx @@ -0,0 +1,12 @@ +--- +title: "ChatFormatJSONObjectConfig" +--- + +JSON object response format + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | +| `type` | [components.ChatFormatJSONObjectConfigType](../components/chatformatjsonobjectconfigtype.mdx) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/chatformatjsonobjectconfigtype.mdx b/docs/components/chatformatjsonobjectconfigtype.mdx new file mode 100644 index 00000000..617987c4 --- /dev/null +++ b/docs/components/chatformatjsonobjectconfigtype.mdx @@ -0,0 +1,15 @@ +--- +title: "ChatFormatJSONObjectConfigType" +--- + +## Example Usage + +```python +from openrouter.components import ChatFormatJSONObjectConfigType +value: ChatFormatJSONObjectConfigType = "json_object" +``` + + +## Values + +- `"json_object"` diff --git a/docs/components/citation.mdx b/docs/components/citation.mdx index 9e503681..26228680 100644 --- a/docs/components/citation.mdx +++ b/docs/components/citation.mdx @@ -22,15 +22,15 @@ value: components.AnthropicCitationContentBlockLocationParam = /* values here */ value: components.AnthropicCitationPageLocationParam = /* values here */ ``` -### `components.AnthropicCitationSearchResultLocation` +### `components.AnthropicCitationSearchResultLocationParam` ```python -value: components.AnthropicCitationSearchResultLocation = /* values here */ +value: components.AnthropicCitationSearchResultLocationParam = /* values here */ ``` -### `components.AnthropicCitationWebSearchResultLocation` +### `components.AnthropicCitationWebSearchResultLocationParam` ```python -value: components.AnthropicCitationWebSearchResultLocation = /* values here */ +value: components.AnthropicCitationWebSearchResultLocationParam = /* values here */ ``` diff --git a/docs/components/createobservabilitydestinationrequest.mdx b/docs/components/createobservabilitydestinationrequest.mdx index a3435fe0..065e043f 100644 --- a/docs/components/createobservabilitydestinationrequest.mdx +++ b/docs/components/createobservabilitydestinationrequest.mdx @@ -9,7 +9,7 @@ title: "CreateObservabilityDestinationRequest" | `api_key_hashes` | List[*str*] | :heavy_minus_sign: | Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. `null` or omitted means all keys. Must contain at least one hash if provided. | null | | `config` | Dict[str, *Nullable[Any]*] | :heavy_check_mark: | Provider-specific configuration. The shape depends on `type` and is validated server-side. | \{
"baseUrl": "https://us.cloud.langfuse.com",
"publicKey": "pk-l...EfGh",
"secretKey": "sk-l...AbCd"
} | | `enabled` | *Optional[bool]* | :heavy_minus_sign: | Whether this destination should be enabled immediately. | true | -| `filter_rules` | [OptionalNullable[components.ObservabilityFilterRulesConfig]](../components/observabilityfilterrulesconfig.mdx) | :heavy_minus_sign: | Optional structured filter rules controlling which events are forwarded. | null | +| `filter_rules` | [OptionalNullable[components.ObservabilityFilterRulesConfigNullable]](../components/observabilityfilterrulesconfignullable.mdx) | :heavy_minus_sign: | Optional structured filter rules controlling which events are forwarded. | null | | `name` | *str* | :heavy_check_mark: | Human-readable name for the destination. | Production Langfuse | | `privacy_mode` | *Optional[bool]* | :heavy_minus_sign: | When true, request/response bodies are not forwarded — only metadata. | false | | `sampling_rate` | *Optional[float]* | :heavy_minus_sign: | Sampling rate between 0.0001 and 1 (1 = 100%). | 1 | diff --git a/docs/components/imageinputmodality.mdx b/docs/components/imageinputmodality.mdx new file mode 100644 index 00000000..9062baf5 --- /dev/null +++ b/docs/components/imageinputmodality.mdx @@ -0,0 +1,23 @@ +--- +title: "ImageInputModality" +--- + +## Example Usage + +```python +from openrouter.components import ImageInputModality + +# Open enum: unrecognized values are captured as UnrecognizedStr +value: ImageInputModality = "text" +``` + + +## Values + +This is an open enum. Unrecognized values will not fail type checks. + +- `"text"` +- `"image"` +- `"file"` +- `"audio"` +- `"video"` diff --git a/docs/components/imagemodelarchitecture.mdx b/docs/components/imagemodelarchitecture.mdx index 6842d9d6..860b6629 100644 --- a/docs/components/imagemodelarchitecture.mdx +++ b/docs/components/imagemodelarchitecture.mdx @@ -6,5 +6,5 @@ title: "ImageModelArchitecture" | Field | Type | Required | Description | | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | -| `input_modalities` | List[[components.InputModality](../components/inputmodality.mdx)] | :heavy_check_mark: | Supported input modalities | +| `input_modalities` | List[[components.ImageInputModality](../components/imageinputmodality.mdx)] | :heavy_check_mark: | Supported input modalities | | `output_modalities` | List[[components.ImageOutputModality](../components/imageoutputmodality.mdx)] | :heavy_check_mark: | Supported output modalities | \ No newline at end of file diff --git a/docs/components/legacychatcontentvideo.mdx b/docs/components/legacychatcontentvideo.mdx index f1d4b3d5..74b480b1 100644 --- a/docs/components/legacychatcontentvideo.mdx +++ b/docs/components/legacychatcontentvideo.mdx @@ -9,7 +9,7 @@ Video input content part (legacy format - deprecated) ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | -| `type` | [components.LegacyChatContentVideoType](../components/legacychatcontentvideotype.mdx) | :heavy_check_mark: | N/A | | -| `video_url` | [components.ChatContentVideoInput](../components/chatcontentvideoinput.mdx) | :heavy_check_mark: | Video input object | \{
"url": "https://example.com/video.mp4"
} | \ No newline at end of file +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | +| `type` | [components.LegacyChatContentVideoType](../components/legacychatcontentvideotype.mdx) | :heavy_check_mark: | N/A | | +| `video_url` | [components.LegacyChatContentVideoInput](../components/legacychatcontentvideoinput.mdx) | :heavy_check_mark: | Video input object | \{
"url": "https://example.com/video.mp4"
} | \ No newline at end of file diff --git a/docs/components/legacychatcontentvideoinput.mdx b/docs/components/legacychatcontentvideoinput.mdx new file mode 100644 index 00000000..d79ac062 --- /dev/null +++ b/docs/components/legacychatcontentvideoinput.mdx @@ -0,0 +1,12 @@ +--- +title: "LegacyChatContentVideoInput" +--- + +Video input object + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------- | --------------------------------------- | --------------------------------------- | --------------------------------------- | +| `url` | *str* | :heavy_check_mark: | URL of the video (data: URLs supported) | \ No newline at end of file diff --git a/docs/components/links.mdx b/docs/components/links.mdx new file mode 100644 index 00000000..6debf47d --- /dev/null +++ b/docs/components/links.mdx @@ -0,0 +1,12 @@ +--- +title: "Links" +--- + +Pagination links + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | +| `next` | *Nullable[str]* | :heavy_check_mark: | URL for the next page of results, or null if this is the last page | /api/v1/models?offset=500&limit=500 | \ No newline at end of file diff --git a/docs/components/messagesrequesttoolunion.mdx b/docs/components/messagesrequesttoolunion.mdx index b24e866b..f5868bf9 100644 --- a/docs/components/messagesrequesttoolunion.mdx +++ b/docs/components/messagesrequesttoolunion.mdx @@ -58,10 +58,10 @@ value: components.DatetimeServerTool = /* values here */ value: components.ImageGenerationServerToolOpenRouter = /* values here */ ``` -### `components.ChatSearchModelsServerTool` +### `components.MessagesSearchModelsServerTool` ```python -value: components.ChatSearchModelsServerTool = /* values here */ +value: components.MessagesSearchModelsServerTool = /* values here */ ``` ### `components.WebFetchServerTool` diff --git a/docs/components/messagessearchmodelsservertool.mdx b/docs/components/messagessearchmodelsservertool.mdx new file mode 100644 index 00000000..e13f74e2 --- /dev/null +++ b/docs/components/messagessearchmodelsservertool.mdx @@ -0,0 +1,13 @@ +--- +title: "MessagesSearchModelsServerTool" +--- + +OpenRouter built-in server tool: searches and filters AI models available on OpenRouter + + +## Fields + +| Field | Type | Required | Description | Example | +| ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | +| `parameters` | [Optional[components.SearchModelsServerToolConfig]](../components/searchmodelsservertoolconfig.mdx) | :heavy_minus_sign: | Configuration for the openrouter:experimental__search_models server tool | \{
"max_results": 5
} | +| `type` | [components.MessagesSearchModelsServerToolType](../components/messagessearchmodelsservertooltype.mdx) | :heavy_check_mark: | N/A | | \ No newline at end of file diff --git a/docs/components/messagessearchmodelsservertooltype.mdx b/docs/components/messagessearchmodelsservertooltype.mdx new file mode 100644 index 00000000..52ce9074 --- /dev/null +++ b/docs/components/messagessearchmodelsservertooltype.mdx @@ -0,0 +1,15 @@ +--- +title: "MessagesSearchModelsServerToolType" +--- + +## Example Usage + +```python +from openrouter.components import MessagesSearchModelsServerToolType +value: MessagesSearchModelsServerToolType = "openrouter:experimental__search_models" +``` + + +## Values + +- `"openrouter:experimental__search_models"` diff --git a/docs/components/modelarchitecture.mdx b/docs/components/modelarchitecture.mdx index 3035c9ba..d46fef46 100644 --- a/docs/components/modelarchitecture.mdx +++ b/docs/components/modelarchitecture.mdx @@ -7,10 +7,10 @@ Model architecture information ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | -| `input_modalities` | List[[components.InputModality](../components/inputmodality.mdx)] | :heavy_check_mark: | Supported input modalities | | -| `instruct_type` | [OptionalNullable[components.ModelArchitectureInstructType]](../components/modelarchitectureinstructtype.mdx) | :heavy_minus_sign: | Instruction format type | chatml | -| `modality` | *Nullable[str]* | :heavy_check_mark: | Primary modality of the model | text->text | -| `output_modalities` | List[[components.OutputModality](../components/outputmodality.mdx)] | :heavy_check_mark: | Supported output modalities | | -| `tokenizer` | [Optional[components.ModelGroup]](../components/modelgroup.mdx) | :heavy_minus_sign: | Tokenizer type used by the model | GPT | \ No newline at end of file +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------------- | -------------------------------------------------------------------------- | -------------------------------------------------------------------------- | -------------------------------------------------------------------------- | -------------------------------------------------------------------------- | +| `input_modalities` | List[[components.InputModality](../components/inputmodality.mdx)] | :heavy_check_mark: | Supported input modalities | | +| `instruct_type` | [OptionalNullable[components.InstructType]](../components/instructtype.mdx) | :heavy_minus_sign: | Instruction format type | chatml | +| `modality` | *Nullable[str]* | :heavy_check_mark: | Primary modality of the model | text->text | +| `output_modalities` | List[[components.OutputModality](../components/outputmodality.mdx)] | :heavy_check_mark: | Supported output modalities | | +| `tokenizer` | [Optional[components.ModelGroup]](../components/modelgroup.mdx) | :heavy_minus_sign: | Tokenizer type used by the model | GPT | \ No newline at end of file diff --git a/docs/components/modelarchitectureinstructtype.mdx b/docs/components/modelarchitectureinstructtype.mdx deleted file mode 100644 index c8d02132..00000000 --- a/docs/components/modelarchitectureinstructtype.mdx +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: "ModelArchitectureInstructType" ---- - -Instruction format type - -## Example Usage - -```python -from openrouter.components import ModelArchitectureInstructType - -# Open enum: unrecognized values are captured as UnrecognizedStr -value: ModelArchitectureInstructType = "none" -``` - - -## Values - -This is an open enum. Unrecognized values will not fail type checks. - -- `"none"` -- `"airoboros"` -- `"alpaca"` -- `"alpaca-modif"` -- `"chatml"` -- `"claude"` -- `"code-llama"` -- `"gemma"` -- `"llama2"` -- `"llama3"` -- `"mistral"` -- `"nemotron"` -- `"neural"` -- `"openchat"` -- `"phi3"` -- `"rwkv"` -- `"vicuna"` -- `"zephyr"` -- `"deepseek-r1"` -- `"deepseek-v3.1"` -- `"qwq"` -- `"qwen3"` diff --git a/docs/components/modelslistresponse.mdx b/docs/components/modelslistresponse.mdx index 140ec11b..ac531b92 100644 --- a/docs/components/modelslistresponse.mdx +++ b/docs/components/modelslistresponse.mdx @@ -7,6 +7,8 @@ List of available models ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `data` | List[[components.Model](../components/model.mdx)] | :heavy_check_mark: | List of available models | [
\{
"architecture": \{
"input_modalities": [
"text"
],
"instruct_type": "chatml",
"modality": "text-\u003etext",
"output_modalities": [
"text"
],
"tokenizer": "GPT"
},
"canonical_slug": "openai/gpt-4",
"context_length": 8192,
"created": 1692901234,
"default_parameters": null,
"description": "GPT-4 is a large multimodal model that can solve difficult problems with greater accuracy.",
"expiration_date": null,
"id": "openai/gpt-4",
"knowledge_cutoff": null,
"links": \{
"details": "/api/v1/models/openai/gpt-5.4/endpoints"
},
"name": "GPT-4",
"per_request_limits": null,
"pricing": \{
"completion": "0.00006",
"image": "0",
"prompt": "0.00003",
"request": "0"
},
"supported_parameters": [
"temperature",
"top_p",
"max_tokens"
],
"supported_voices": null,
"top_provider": \{
"context_length": 8192,
"is_moderated": true,
"max_completion_tokens": 4096
}
}
] | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `data` | List[[components.Model](../components/model.mdx)] | :heavy_check_mark: | List of available models | [
\{
"architecture": \{
"input_modalities": [
"text"
],
"instruct_type": "chatml",
"modality": "text-\u003etext",
"output_modalities": [
"text"
],
"tokenizer": "GPT"
},
"canonical_slug": "openai/gpt-4",
"context_length": 8192,
"created": 1692901234,
"default_parameters": null,
"description": "GPT-4 is a large multimodal model that can solve difficult problems with greater accuracy.",
"expiration_date": null,
"id": "openai/gpt-4",
"knowledge_cutoff": null,
"links": \{
"details": "/api/v1/models/openai/gpt-4/endpoints"
},
"name": "GPT-4",
"per_request_limits": null,
"pricing": \{
"completion": "0.00006",
"image": "0",
"prompt": "0.00003",
"request": "0"
},
"supported_parameters": [
"temperature",
"top_p",
"max_tokens"
],
"supported_voices": null,
"top_provider": \{
"context_length": 8192,
"is_moderated": true,
"max_completion_tokens": 4096
}
}
] | +| `links` | [components.Links](../components/links.mdx) | :heavy_check_mark: | Pagination links | | +| `total_count` | *int* | :heavy_check_mark: | Total number of models matching the query | 150 | \ No newline at end of file diff --git a/docs/components/group.mdx b/docs/components/observabilityfilterrulegroup.mdx similarity index 95% rename from docs/components/group.mdx rename to docs/components/observabilityfilterrulegroup.mdx index 34495da0..95aa7cfb 100644 --- a/docs/components/group.mdx +++ b/docs/components/observabilityfilterrulegroup.mdx @@ -1,5 +1,5 @@ --- -title: "Group" +title: "ObservabilityFilterRuleGroup" --- ## Fields diff --git a/docs/components/observabilityfilterrulesconfigvalue.mdx b/docs/components/observabilityfilterrulegroupvalue.mdx similarity index 76% rename from docs/components/observabilityfilterrulesconfigvalue.mdx rename to docs/components/observabilityfilterrulegroupvalue.mdx index 6b335f61..af2effd1 100644 --- a/docs/components/observabilityfilterrulesconfigvalue.mdx +++ b/docs/components/observabilityfilterrulegroupvalue.mdx @@ -1,5 +1,5 @@ --- -title: "ObservabilityFilterRulesConfigValue" +title: "ObservabilityFilterRuleGroupValue" --- ## Supported Types diff --git a/docs/components/observabilityfilterrulesconfig.mdx b/docs/components/observabilityfilterrulesconfig.mdx index 46330428..83934044 100644 --- a/docs/components/observabilityfilterrulesconfig.mdx +++ b/docs/components/observabilityfilterrulesconfig.mdx @@ -7,7 +7,7 @@ Optional structured filter rules controlling which events are forwarded. ## Fields -| Field | Type | Required | Description | -| ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | -| `enabled` | *Optional[bool]* | :heavy_minus_sign: | N/A | -| `groups` | List[[components.Group](../components/group.mdx)] | :heavy_check_mark: | N/A | \ No newline at end of file +| Field | Type | Required | Description | +| ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| `enabled` | *Optional[bool]* | :heavy_minus_sign: | N/A | +| `groups` | List[[components.ObservabilityFilterRuleGroup](../components/observabilityfilterrulegroup.mdx)] | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/observabilityfilterrulesconfignullable.mdx b/docs/components/observabilityfilterrulesconfignullable.mdx new file mode 100644 index 00000000..842fa8f7 --- /dev/null +++ b/docs/components/observabilityfilterrulesconfignullable.mdx @@ -0,0 +1,13 @@ +--- +title: "ObservabilityFilterRulesConfigNullable" +--- + +Optional structured filter rules controlling which events are forwarded. + + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| `enabled` | *Optional[bool]* | :heavy_minus_sign: | N/A | +| `groups` | List[[components.ObservabilityFilterRuleGroup](../components/observabilityfilterrulegroup.mdx)] | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/responseformat.mdx b/docs/components/responseformat.mdx index 29709eff..4715eaef 100644 --- a/docs/components/responseformat.mdx +++ b/docs/components/responseformat.mdx @@ -13,10 +13,10 @@ Response format configuration value: components.ChatFormatGrammarConfig = /* values here */ ``` -### `components.FormatJSONObjectConfig` +### `components.ChatFormatJSONObjectConfig` ```python -value: components.FormatJSONObjectConfig = /* values here */ +value: components.ChatFormatJSONObjectConfig = /* values here */ ``` ### `components.ChatFormatJSONSchemaConfig` diff --git a/docs/components/responsesrequesttoolunion.mdx b/docs/components/responsesrequesttoolunion.mdx index bfec11b6..b06f8e77 100644 --- a/docs/components/responsesrequesttoolunion.mdx +++ b/docs/components/responsesrequesttoolunion.mdx @@ -124,10 +124,10 @@ value: components.FusionServerToolOpenRouter = /* values here */ value: components.ImageGenerationServerToolOpenRouter = /* values here */ ``` -### `components.ChatSearchModelsServerTool` +### `components.SearchModelsServerToolOpenRouter` ```python -value: components.ChatSearchModelsServerTool = /* values here */ +value: components.SearchModelsServerToolOpenRouter = /* values here */ ``` ### `components.WebFetchServerTool` diff --git a/docs/components/rule.mdx b/docs/components/rule.mdx index d585c3be..14a9f713 100644 --- a/docs/components/rule.mdx +++ b/docs/components/rule.mdx @@ -4,8 +4,8 @@ title: "Rule" ## Fields -| Field | Type | Required | Description | -| ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | -| `field` | [components.FieldT](../components/fieldt.mdx) | :heavy_check_mark: | N/A | -| `operator` | [components.Operator](../components/operator.mdx) | :heavy_check_mark: | N/A | -| `value` | [Optional[components.ObservabilityFilterRulesConfigValue]](../components/observabilityfilterrulesconfigvalue.mdx) | :heavy_minus_sign: | N/A | \ No newline at end of file +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | +| `field` | [components.FieldT](../components/fieldt.mdx) | :heavy_check_mark: | N/A | +| `operator` | [components.Operator](../components/operator.mdx) | :heavy_check_mark: | N/A | +| `value` | [Optional[components.ObservabilityFilterRuleGroupValue]](../components/observabilityfilterrulegroupvalue.mdx) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/components/searchmodelsservertoolopenrouter.mdx b/docs/components/searchmodelsservertoolopenrouter.mdx new file mode 100644 index 00000000..e72c5e1c --- /dev/null +++ b/docs/components/searchmodelsservertoolopenrouter.mdx @@ -0,0 +1,13 @@ +--- +title: "SearchModelsServerToolOpenRouter" +--- + +OpenRouter built-in server tool: searches and filters AI models available on OpenRouter + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | +| `parameters` | [Optional[components.SearchModelsServerToolConfig]](../components/searchmodelsservertoolconfig.mdx) | :heavy_minus_sign: | Configuration for the openrouter:experimental__search_models server tool | \{
"max_results": 5
} | +| `type` | [components.SearchModelsServerToolOpenRouterType](../components/searchmodelsservertoolopenroutertype.mdx) | :heavy_check_mark: | N/A | | \ No newline at end of file diff --git a/docs/components/searchmodelsservertoolopenroutertype.mdx b/docs/components/searchmodelsservertoolopenroutertype.mdx new file mode 100644 index 00000000..e57b0482 --- /dev/null +++ b/docs/components/searchmodelsservertoolopenroutertype.mdx @@ -0,0 +1,15 @@ +--- +title: "SearchModelsServerToolOpenRouterType" +--- + +## Example Usage + +```python +from openrouter.components import SearchModelsServerToolOpenRouterType +value: SearchModelsServerToolOpenRouterType = "openrouter:experimental__search_models" +``` + + +## Values + +- `"openrouter:experimental__search_models"` diff --git a/docs/components/updateobservabilitydestinationrequest.mdx b/docs/components/updateobservabilitydestinationrequest.mdx index 1a6d0410..f1338423 100644 --- a/docs/components/updateobservabilitydestinationrequest.mdx +++ b/docs/components/updateobservabilitydestinationrequest.mdx @@ -9,7 +9,7 @@ title: "UpdateObservabilityDestinationRequest" | `api_key_hashes` | List[*str*] | :heavy_minus_sign: | Optional allowlist of OpenRouter API key hashes. `null` clears the filter (all keys). Omitting leaves the current value. Must contain at least one hash if provided. | null | | `config` | Dict[str, *Nullable[Any]*] | :heavy_minus_sign: | Provider-specific configuration fields to update. Masked values are ignored; unset fields keep their current value. | \{
"baseUrl": "https://us.cloud.langfuse.com",
"publicKey": "pk-l...EfGh",
"secretKey": "sk-l...AbCd"
} | | `enabled` | *Optional[bool]* | :heavy_minus_sign: | Whether the destination is enabled. | true | -| `filter_rules` | [OptionalNullable[components.ObservabilityFilterRulesConfig]](../components/observabilityfilterrulesconfig.mdx) | :heavy_minus_sign: | N/A | null | +| `filter_rules` | [OptionalNullable[components.ObservabilityFilterRulesConfigNullable]](../components/observabilityfilterrulesconfignullable.mdx) | :heavy_minus_sign: | N/A | null | | `name` | *Optional[str]* | :heavy_minus_sign: | Human-readable name for the destination. | Production Langfuse | | `privacy_mode` | *Optional[bool]* | :heavy_minus_sign: | When true, request/response bodies are not forwarded — only metadata. | false | | `sampling_rate` | *Optional[float]* | :heavy_minus_sign: | Sampling rate between 0.0001 and 1 (1 = 100%). | 1 | \ No newline at end of file diff --git a/docs/operations/costdetails.mdx b/docs/operations/costdetails.mdx deleted file mode 100644 index 753493b8..00000000 --- a/docs/operations/costdetails.mdx +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: "CostDetails" ---- - -Breakdown of upstream inference costs - - -## Fields - -| Field | Type | Required | Description | -| ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | -| `upstream_inference_completions_cost` | *float* | :heavy_check_mark: | N/A | -| `upstream_inference_cost` | *OptionalNullable[float]* | :heavy_minus_sign: | N/A | -| `upstream_inference_prompt_cost` | *float* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/operations/createembeddingsusage.mdx b/docs/operations/createembeddingsusage.mdx index 1050293a..1218cf96 100644 --- a/docs/operations/createembeddingsusage.mdx +++ b/docs/operations/createembeddingsusage.mdx @@ -10,7 +10,7 @@ Token usage statistics | Field | Type | Required | Description | Example | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `cost` | *Optional[float]* | :heavy_minus_sign: | Cost of the request in credits | 0.0001 | -| `cost_details` | [OptionalNullable[operations.CostDetails]](../operations/costdetails.mdx) | :heavy_minus_sign: | Breakdown of upstream inference costs | \{
"upstream_inference_completions_cost": 0.0004,
"upstream_inference_cost": null,
"upstream_inference_prompt_cost": 0.0008
} | +| `cost_details` | [OptionalNullable[components.CostDetails]](../components/costdetails.mdx) | :heavy_minus_sign: | Breakdown of upstream inference costs | \{
"upstream_inference_completions_cost": 0.0004,
"upstream_inference_cost": null,
"upstream_inference_prompt_cost": 0.0008
} | | `is_byok` | *Optional[bool]* | :heavy_minus_sign: | Whether a request was made using a Bring Your Own Key configuration | | | `prompt_tokens` | *int* | :heavy_check_mark: | Number of tokens in the input | 8 | | `prompt_tokens_details` | [Optional[operations.PromptTokensDetails]](../operations/prompttokensdetails.mdx) | :heavy_minus_sign: | 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. | | diff --git a/docs/operations/getmodelsrequest.mdx b/docs/operations/getmodelsrequest.mdx index 3cf889e3..532a1ab9 100644 --- a/docs/operations/getmodelsrequest.mdx +++ b/docs/operations/getmodelsrequest.mdx @@ -9,6 +9,8 @@ title: "GetModelsRequest" | `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.
| | +| `offset` | *Optional[int]* | :heavy_minus_sign: | Number of records to skip for pagination. When both offset and limit are omitted, the full list is returned | 0 | +| `limit` | *Optional[int]* | :heavy_minus_sign: | Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned | 500 | | `category` | [Optional[operations.GetModelsCategory]](../operations/getmodelscategory.mdx) | :heavy_minus_sign: | Filter models by use case category | programming | | `supported_parameters` | *Optional[str]* | :heavy_minus_sign: | Filter models by supported parameter (comma-separated) | temperature | | `output_modalities` | *Optional[str]* | :heavy_minus_sign: | Filter models by output modality. Accepts a comma-separated list of modalities (text, image, audio, embeddings) or "all" to include all models. Defaults to "text". | text | diff --git a/docs/operations/getmodelsresponse.mdx b/docs/operations/getmodelsresponse.mdx new file mode 100644 index 00000000..c7353f31 --- /dev/null +++ b/docs/operations/getmodelsresponse.mdx @@ -0,0 +1,9 @@ +--- +title: "GetModelsResponse" +--- + +## Fields + +| Field | Type | Required | Description | Example | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `result` | [components.ModelsListResponse](../components/modelslistresponse.mdx) | :heavy_check_mark: | N/A | \{
"data": [
\{
"architecture": \{
"input_modalities": [
"text"
],
"instruct_type": "chatml",
"modality": "text-\u003etext",
"output_modalities": [
"text"
],
"tokenizer": "GPT"
},
"canonical_slug": "openai/gpt-4",
"context_length": 8192,
"created": 1692901234,
"default_parameters": null,
"description": "GPT-4 is a large multimodal model that can solve difficult problems with greater accuracy.",
"expiration_date": null,
"id": "openai/gpt-4",
"knowledge_cutoff": null,
"links": \{
"details": "/api/v1/models/openai/gpt-4/endpoints"
},
"name": "GPT-4",
"per_request_limits": null,
"pricing": \{
"completion": "0.00006",
"image": "0",
"prompt": "0.00003",
"request": "0"
},
"supported_parameters": [
"temperature",
"top_p",
"max_tokens",
"frequency_penalty",
"presence_penalty"
],
"supported_voices": null,
"top_provider": \{
"context_length": 8192,
"is_moderated": true,
"max_completion_tokens": 4096
}
}
],
"links": \{
"next": "/api/v1/models?offset=500\u0026limit=500"
},
"total_count": 150
} | \ No newline at end of file diff --git a/docs/operations/listembeddingsmodelsrequest.mdx b/docs/operations/listembeddingsmodelsrequest.mdx index 76c365bf..7e491482 100644 --- a/docs/operations/listembeddingsmodelsrequest.mdx +++ b/docs/operations/listembeddingsmodelsrequest.mdx @@ -4,8 +4,10 @@ title: "ListEmbeddingsModelsRequest" ## Fields -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | -| `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.
| \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | +| `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.
| | +| `offset` | *Optional[int]* | :heavy_minus_sign: | Number of records to skip for pagination. When both offset and limit are omitted, the full list is returned | 0 | +| `limit` | *Optional[int]* | :heavy_minus_sign: | Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned | 500 | \ No newline at end of file diff --git a/docs/operations/listembeddingsmodelsresponse.mdx b/docs/operations/listembeddingsmodelsresponse.mdx new file mode 100644 index 00000000..053af0a8 --- /dev/null +++ b/docs/operations/listembeddingsmodelsresponse.mdx @@ -0,0 +1,9 @@ +--- +title: "ListEmbeddingsModelsResponse" +--- + +## Fields + +| Field | Type | Required | Description | Example | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `result` | [components.ModelsListResponse](../components/modelslistresponse.mdx) | :heavy_check_mark: | N/A | \{
"data": [
\{
"architecture": \{
"input_modalities": [
"text"
],
"instruct_type": "chatml",
"modality": "text-\u003etext",
"output_modalities": [
"text"
],
"tokenizer": "GPT"
},
"canonical_slug": "openai/gpt-4",
"context_length": 8192,
"created": 1692901234,
"default_parameters": null,
"description": "GPT-4 is a large multimodal model that can solve difficult problems with greater accuracy.",
"expiration_date": null,
"id": "openai/gpt-4",
"knowledge_cutoff": null,
"links": \{
"details": "/api/v1/models/openai/gpt-4/endpoints"
},
"name": "GPT-4",
"per_request_limits": null,
"pricing": \{
"completion": "0.00006",
"image": "0",
"prompt": "0.00003",
"request": "0"
},
"supported_parameters": [
"temperature",
"top_p",
"max_tokens",
"frequency_penalty",
"presence_penalty"
],
"supported_voices": null,
"top_provider": \{
"context_length": 8192,
"is_moderated": true,
"max_completion_tokens": 4096
}
}
],
"links": \{
"next": "/api/v1/models?offset=500\u0026limit=500"
},
"total_count": 150
} | \ No newline at end of file diff --git a/docs/operations/listmodelsuserrequest.mdx b/docs/operations/listmodelsuserrequest.mdx index 3b65b53f..ca39aeab 100644 --- a/docs/operations/listmodelsuserrequest.mdx +++ b/docs/operations/listmodelsuserrequest.mdx @@ -4,8 +4,10 @@ title: "ListModelsUserRequest" ## Fields -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | -| `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.
| \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | +| `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.
| | +| `offset` | *Optional[int]* | :heavy_minus_sign: | Number of records to skip for pagination. When both offset and limit are omitted, the full list is returned | 0 | +| `limit` | *Optional[int]* | :heavy_minus_sign: | Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned | 500 | \ No newline at end of file diff --git a/docs/operations/listmodelsuserresponse.mdx b/docs/operations/listmodelsuserresponse.mdx new file mode 100644 index 00000000..380f686c --- /dev/null +++ b/docs/operations/listmodelsuserresponse.mdx @@ -0,0 +1,9 @@ +--- +title: "ListModelsUserResponse" +--- + +## Fields + +| Field | Type | Required | Description | Example | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `result` | [components.ModelsListResponse](../components/modelslistresponse.mdx) | :heavy_check_mark: | N/A | \{
"data": [
\{
"architecture": \{
"input_modalities": [
"text"
],
"instruct_type": "chatml",
"modality": "text-\u003etext",
"output_modalities": [
"text"
],
"tokenizer": "GPT"
},
"canonical_slug": "openai/gpt-4",
"context_length": 8192,
"created": 1692901234,
"default_parameters": null,
"description": "GPT-4 is a large multimodal model that can solve difficult problems with greater accuracy.",
"expiration_date": null,
"id": "openai/gpt-4",
"knowledge_cutoff": null,
"links": \{
"details": "/api/v1/models/openai/gpt-4/endpoints"
},
"name": "GPT-4",
"per_request_limits": null,
"pricing": \{
"completion": "0.00006",
"image": "0",
"prompt": "0.00003",
"request": "0"
},
"supported_parameters": [
"temperature",
"top_p",
"max_tokens",
"frequency_penalty",
"presence_penalty"
],
"supported_voices": null,
"top_provider": \{
"context_length": 8192,
"is_moderated": true,
"max_completion_tokens": 4096
}
}
],
"links": \{
"next": "/api/v1/models?offset=500\u0026limit=500"
},
"total_count": 150
} | \ No newline at end of file diff --git a/docs/sdks/byok/README.mdx b/docs/sdks/byok/README.mdx index f1da2da0..513bb72e 100644 --- a/docs/sdks/byok/README.mdx +++ b/docs/sdks/byok/README.mdx @@ -33,7 +33,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.byok.list() + res = open_router.byok.list(offset=0, limit=50) while res is not None: # Handle items diff --git a/docs/sdks/embeddings/README.mdx b/docs/sdks/embeddings/README.mdx index bf8b8c51..0ec380e6 100644 --- a/docs/sdks/embeddings/README.mdx +++ b/docs/sdks/embeddings/README.mdx @@ -91,25 +91,29 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.embeddings.list_models() + res = open_router.embeddings.list_models(offset=0, limit=500) - # Handle response - print(res) + while res is not None: + # Handle items + + res = res.next() ``` ### Parameters -| Parameter | Type | Required | Description | -| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | -| `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.mdx) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | +| Parameter | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | +| `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.
| | +| `offset` | *Optional[int]* | :heavy_minus_sign: | Number of records to skip for pagination. When both offset and limit are omitted, the full list is returned | 0 | +| `limit` | *Optional[int]* | :heavy_minus_sign: | Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned | 500 | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.mdx) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | | ### Response -**[components.ModelsListResponse](../../components/modelslistresponse.mdx)** +**[operations.ListEmbeddingsModelsResponse](../../operations/listembeddingsmodelsresponse.mdx)** ### Errors diff --git a/docs/sdks/guardrails/README.mdx b/docs/sdks/guardrails/README.mdx index d164a1da..52efbd96 100644 --- a/docs/sdks/guardrails/README.mdx +++ b/docs/sdks/guardrails/README.mdx @@ -41,7 +41,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.guardrails.list() + res = open_router.guardrails.list(offset=0, limit=50) while res is not None: # Handle items @@ -320,7 +320,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.guardrails.list_guardrail_key_assignments(id="550e8400-e29b-41d4-a716-446655440000") + res = open_router.guardrails.list_guardrail_key_assignments(id="550e8400-e29b-41d4-a716-446655440000", offset=0, limit=50) while res is not None: # Handle items @@ -476,7 +476,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.guardrails.list_guardrail_member_assignments(id="550e8400-e29b-41d4-a716-446655440000") + res = open_router.guardrails.list_guardrail_member_assignments(id="550e8400-e29b-41d4-a716-446655440000", offset=0, limit=50) while res is not None: # Handle items @@ -634,7 +634,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.guardrails.list_key_assignments() + res = open_router.guardrails.list_key_assignments(offset=0, limit=50) while res is not None: # Handle items @@ -684,7 +684,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.guardrails.list_member_assignments() + res = open_router.guardrails.list_member_assignments(offset=0, limit=50) while res is not None: # Handle items diff --git a/docs/sdks/models/README.mdx b/docs/sdks/models/README.mdx index 888dcaa7..dd4b5425 100644 --- a/docs/sdks/models/README.mdx +++ b/docs/sdks/models/README.mdx @@ -80,10 +80,12 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.models.list() + res = open_router.models.list(offset=0, limit=500) - # Handle response - print(res) + while res is not None: + # Handle items + + res = res.next() ``` @@ -94,6 +96,8 @@ with OpenRouter( | `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.
| | +| `offset` | *Optional[int]* | :heavy_minus_sign: | Number of records to skip for pagination. When both offset and limit are omitted, the full list is returned | 0 | +| `limit` | *Optional[int]* | :heavy_minus_sign: | Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned | 500 | | `category` | [Optional[operations.GetModelsCategory]](../../operations/getmodelscategory.mdx) | :heavy_minus_sign: | Filter models by use case category | programming | | `supported_parameters` | *Optional[str]* | :heavy_minus_sign: | Filter models by supported parameter (comma-separated) | temperature | | `output_modalities` | *Optional[str]* | :heavy_minus_sign: | Filter models by output modality. Accepts a comma-separated list of modalities (text, image, audio, embeddings) or "all" to include all models. Defaults to "text". | text | @@ -125,7 +129,7 @@ with OpenRouter( ### Response -**[components.ModelsListResponse](../../components/modelslistresponse.mdx)** +**[operations.GetModelsResponse](../../operations/getmodelsresponse.mdx)** ### Errors @@ -201,26 +205,30 @@ with OpenRouter( res = open_router.models.list_for_user(security=operations.ListModelsUserSecurity( bearer=os.getenv("OPENROUTER_BEARER", ""), - )) + ), offset=0, limit=500) - # Handle response - print(res) + while res is not None: + # Handle items + + res = res.next() ``` ### Parameters -| Parameter | Type | Required | Description | -| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | -| `security` | [operations.ListModelsUserSecurity](../../operations/listmodelsusersecurity.mdx) | :heavy_check_mark: | N/A | -| `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.mdx) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | +| Parameter | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | +| `security` | [operations.ListModelsUserSecurity](../../operations/listmodelsusersecurity.mdx) | :heavy_check_mark: | N/A | | +| `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.
| | +| `offset` | *Optional[int]* | :heavy_minus_sign: | Number of records to skip for pagination. When both offset and limit are omitted, the full list is returned | 0 | +| `limit` | *Optional[int]* | :heavy_minus_sign: | Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned | 500 | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.mdx) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | | ### Response -**[components.ModelsListResponse](../../components/modelslistresponse.mdx)** +**[operations.ListModelsUserResponse](../../operations/listmodelsuserresponse.mdx)** ### Errors diff --git a/docs/sdks/observability/README.mdx b/docs/sdks/observability/README.mdx index 869bf82e..fb37fc07 100644 --- a/docs/sdks/observability/README.mdx +++ b/docs/sdks/observability/README.mdx @@ -33,7 +33,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.observability.list() + res = open_router.observability.list(offset=0, limit=50) while res is not None: # Handle items @@ -107,7 +107,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.
| | | `api_key_hashes` | List[*str*] | :heavy_minus_sign: | Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. `null` or omitted means all keys. Must contain at least one hash if provided. | null | | `enabled` | *Optional[bool]* | :heavy_minus_sign: | Whether this destination should be enabled immediately. | true | -| `filter_rules` | [OptionalNullable[components.ObservabilityFilterRulesConfig]](../../components/observabilityfilterrulesconfig.mdx) | :heavy_minus_sign: | Optional structured filter rules controlling which events are forwarded. | null | +| `filter_rules` | [OptionalNullable[components.ObservabilityFilterRulesConfigNullable]](../../components/observabilityfilterrulesconfignullable.mdx) | :heavy_minus_sign: | Optional structured filter rules controlling which events are forwarded. | null | | `privacy_mode` | *Optional[bool]* | :heavy_minus_sign: | When true, request/response bodies are not forwarded — only metadata. | false | | `sampling_rate` | *Optional[float]* | :heavy_minus_sign: | Sampling rate between 0.0001 and 1 (1 = 100%). | 1 | | `workspace_id` | *Optional[str]* | :heavy_minus_sign: | Optional workspace ID. Defaults to the authenticated entity's default workspace. | 550e8400-e29b-41d4-a716-446655440000 | @@ -260,7 +260,7 @@ with OpenRouter( | `api_key_hashes` | List[*str*] | :heavy_minus_sign: | Optional allowlist of OpenRouter API key hashes. `null` clears the filter (all keys). Omitting leaves the current value. Must contain at least one hash if provided. | null | | `config` | Dict[str, *Nullable[Any]*] | :heavy_minus_sign: | Provider-specific configuration fields to update. Masked values are ignored; unset fields keep their current value. | \{
"baseUrl": "https://us.cloud.langfuse.com",
"publicKey": "pk-l...EfGh",
"secretKey": "sk-l...AbCd"
} | | `enabled` | *Optional[bool]* | :heavy_minus_sign: | Whether the destination is enabled. | true | -| `filter_rules` | [OptionalNullable[components.ObservabilityFilterRulesConfig]](../../components/observabilityfilterrulesconfig.mdx) | :heavy_minus_sign: | N/A | null | +| `filter_rules` | [OptionalNullable[components.ObservabilityFilterRulesConfigNullable]](../../components/observabilityfilterrulesconfignullable.mdx) | :heavy_minus_sign: | N/A | null | | `name` | *Optional[str]* | :heavy_minus_sign: | Human-readable name for the destination. | Production Langfuse | | `privacy_mode` | *Optional[bool]* | :heavy_minus_sign: | When true, request/response bodies are not forwarded — only metadata. | false | | `sampling_rate` | *Optional[float]* | :heavy_minus_sign: | Sampling rate between 0.0001 and 1 (1 = 100%). | 1 | diff --git a/docs/sdks/organization/README.mdx b/docs/sdks/organization/README.mdx index 6e199aba..32a291cb 100644 --- a/docs/sdks/organization/README.mdx +++ b/docs/sdks/organization/README.mdx @@ -29,7 +29,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.organization.list_members() + res = open_router.organization.list_members(offset=0, limit=50) while res is not None: # Handle items diff --git a/docs/sdks/presets/README.mdx b/docs/sdks/presets/README.mdx index 5f20994a..ef18762b 100644 --- a/docs/sdks/presets/README.mdx +++ b/docs/sdks/presets/README.mdx @@ -35,7 +35,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.presets.list() + res = open_router.presets.list(offset=0, limit=50) while res is not None: # Handle items @@ -404,7 +404,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.presets.list_versions(slug="my-preset") + res = open_router.presets.list_versions(slug="my-preset", offset=0, limit=50) while res is not None: # Handle items diff --git a/docs/sdks/workspaces/README.mdx b/docs/sdks/workspaces/README.mdx index 37f2346c..547d8b71 100644 --- a/docs/sdks/workspaces/README.mdx +++ b/docs/sdks/workspaces/README.mdx @@ -39,7 +39,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.workspaces.list() + res = open_router.workspaces.list(offset=0, limit=50) while res is not None: # Handle items @@ -455,7 +455,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.workspaces.list_members(id="production") + res = open_router.workspaces.list_members(id="production", offset=0, limit=50) while res is not None: # Handle items diff --git a/pyproject.toml b/pyproject.toml index 6c7ed425..88b38af4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "openrouter" -version = "0.11.23" +version = "0.11.24" description = "Official Python Client SDK for OpenRouter." authors = [{ name = "OpenRouter" },] readme = "README-PYPI.md" diff --git a/src/openrouter/_version.py b/src/openrouter/_version.py index 40089861..e328286d 100644 --- a/src/openrouter/_version.py +++ b/src/openrouter/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "openrouter" -__version__: str = "0.11.23" +__version__: str = "0.11.24" __openapi_doc_version__: str = "1.0.0" __gen_version__: str = "2.914.0" -__user_agent__: str = "speakeasy-sdk/python 0.11.23 2.914.0 1.0.0 openrouter" +__user_agent__: str = "speakeasy-sdk/python 0.11.24 2.914.0 1.0.0 openrouter" try: if __package__ is not None: diff --git a/src/openrouter/byok.py b/src/openrouter/byok.py index fcbfd1ac..08b177b0 100644 --- a/src/openrouter/byok.py +++ b/src/openrouter/byok.py @@ -19,8 +19,8 @@ def list( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, workspace_id: Optional[str] = None, provider: Optional[operations.Provider] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, @@ -129,7 +129,7 @@ def next_func() -> Optional[operations.ListBYOKKeysResponse]: results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return None - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return None next_offset = offset + len(results[0]) @@ -185,8 +185,8 @@ async def list_async( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, workspace_id: Optional[str] = None, provider: Optional[operations.Provider] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, @@ -298,7 +298,7 @@ async def empty_result(): results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return empty_result() - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return empty_result() next_offset = offset + len(results[0]) diff --git a/src/openrouter/components/__init__.py b/src/openrouter/components/__init__.py index 0aa62516..1f755537 100644 --- a/src/openrouter/components/__init__.py +++ b/src/openrouter/components/__init__.py @@ -95,15 +95,15 @@ AnthropicCitationPageLocationParamType, AnthropicCitationPageLocationParamTypedDict, ) - from .anthropiccitationsearchresultlocation import ( - AnthropicCitationSearchResultLocation, - AnthropicCitationSearchResultLocationType, - AnthropicCitationSearchResultLocationTypedDict, + from .anthropiccitationsearchresultlocationparam import ( + AnthropicCitationSearchResultLocationParam, + AnthropicCitationSearchResultLocationParamType, + AnthropicCitationSearchResultLocationParamTypedDict, ) - from .anthropiccitationwebsearchresultlocation import ( - AnthropicCitationWebSearchResultLocation, - AnthropicCitationWebSearchResultLocationType, - AnthropicCitationWebSearchResultLocationTypedDict, + from .anthropiccitationwebsearchresultlocationparam import ( + AnthropicCitationWebSearchResultLocationParam, + AnthropicCitationWebSearchResultLocationParamType, + AnthropicCitationWebSearchResultLocationParamTypedDict, ) from .anthropiccompactionusageiteration import ( AnthropicCompactionUsageIteration, @@ -470,6 +470,11 @@ ChatFormatGrammarConfigType, ChatFormatGrammarConfigTypedDict, ) + from .chatformatjsonobjectconfig import ( + ChatFormatJSONObjectConfig, + ChatFormatJSONObjectConfigType, + ChatFormatJSONObjectConfigTypedDict, + ) from .chatformatjsonschemaconfig import ( ChatFormatJSONSchemaConfig, ChatFormatJSONSchemaConfigType, @@ -1217,6 +1222,7 @@ ImageGenTextChunkEventType, ImageGenTextChunkEventTypedDict, ) + from .imageinputmodality import ImageInputModality from .imagemodelarchitecture import ( ImageModelArchitecture, ImageModelArchitectureTypedDict, @@ -1327,6 +1333,10 @@ LegacyChatContentVideoType, LegacyChatContentVideoTypedDict, ) + from .legacy_chatcontentvideoinput import ( + LegacyChatContentVideoInput, + LegacyChatContentVideoInputTypedDict, + ) from .legacy_websearchservertool import ( LegacyWebSearchServerTool, LegacyWebSearchServerToolType, @@ -1586,13 +1596,14 @@ TypeWebSearch20250305, TypeWebSearch20260209, ) + from .messagessearchmodelsservertool import ( + MessagesSearchModelsServerTool, + MessagesSearchModelsServerToolType, + MessagesSearchModelsServerToolTypedDict, + ) from .metadatalevel import MetadataLevel from .model import Model, ModelTypedDict - from .modelarchitecture import ( - ModelArchitecture, - ModelArchitectureInstructType, - ModelArchitectureTypedDict, - ) + from .modelarchitecture import ModelArchitecture, ModelArchitectureTypedDict from .modelbenchmarks import ModelBenchmarks, ModelBenchmarksTypedDict from .modelgroup import ModelGroup from .modellinks import ModelLinks, ModelLinksTypedDict @@ -1604,7 +1615,12 @@ ModelsCountResponseDataTypedDict, ModelsCountResponseTypedDict, ) - from .modelslistresponse import ModelsListResponse, ModelsListResponseTypedDict + from .modelslistresponse import ( + Links, + LinksTypedDict, + ModelsListResponse, + ModelsListResponseTypedDict, + ) from .moderationplugin import ( ModerationPlugin, ModerationPluginID, @@ -1648,19 +1664,25 @@ ObservabilityDestinationTypedDict, UnknownObservabilityDestination, ) - from .observabilityfilterrulesconfig import ( + from .observabilityfilterrulegroup import ( FieldT, - Group, - GroupTypedDict, Logic, - ObservabilityFilterRulesConfig, - ObservabilityFilterRulesConfigTypedDict, - ObservabilityFilterRulesConfigValue, - ObservabilityFilterRulesConfigValueTypedDict, + ObservabilityFilterRuleGroup, + ObservabilityFilterRuleGroupTypedDict, + ObservabilityFilterRuleGroupValue, + ObservabilityFilterRuleGroupValueTypedDict, Operator, Rule, RuleTypedDict, ) + from .observabilityfilterrulesconfig import ( + ObservabilityFilterRulesConfig, + ObservabilityFilterRulesConfigTypedDict, + ) + from .observabilityfilterrulesconfignullable import ( + ObservabilityFilterRulesConfigNullable, + ObservabilityFilterRulesConfigNullableTypedDict, + ) from .observabilitygrafanadestination import ( ObservabilityGrafanaDestination, ObservabilityGrafanaDestinationConfig, @@ -2375,6 +2397,11 @@ from .routerparams import RouterParams, RouterParamsTypedDict from .routingstrategy import RoutingStrategy from .searchcontextsizeenum import SearchContextSizeEnum + from .searchmodelsservertool_openrouter import ( + SearchModelsServerToolOpenRouter, + SearchModelsServerToolOpenRouterType, + SearchModelsServerToolOpenRouterTypedDict, + ) from .searchmodelsservertoolconfig import ( SearchModelsServerToolConfig, SearchModelsServerToolConfigTypedDict, @@ -2866,12 +2893,12 @@ "AnthropicCitationPageLocationParam", "AnthropicCitationPageLocationParamType", "AnthropicCitationPageLocationParamTypedDict", - "AnthropicCitationSearchResultLocation", - "AnthropicCitationSearchResultLocationType", - "AnthropicCitationSearchResultLocationTypedDict", - "AnthropicCitationWebSearchResultLocation", - "AnthropicCitationWebSearchResultLocationType", - "AnthropicCitationWebSearchResultLocationTypedDict", + "AnthropicCitationSearchResultLocationParam", + "AnthropicCitationSearchResultLocationParamType", + "AnthropicCitationSearchResultLocationParamTypedDict", + "AnthropicCitationWebSearchResultLocationParam", + "AnthropicCitationWebSearchResultLocationParamType", + "AnthropicCitationWebSearchResultLocationParamTypedDict", "AnthropicCompactionUsageIteration", "AnthropicCompactionUsageIterationType", "AnthropicCompactionUsageIterationTypedDict", @@ -3112,6 +3139,9 @@ "ChatFormatGrammarConfig", "ChatFormatGrammarConfigType", "ChatFormatGrammarConfigTypedDict", + "ChatFormatJSONObjectConfig", + "ChatFormatJSONObjectConfigType", + "ChatFormatJSONObjectConfigTypedDict", "ChatFormatJSONSchemaConfig", "ChatFormatJSONSchemaConfigType", "ChatFormatJSONSchemaConfigTypedDict", @@ -3592,8 +3622,6 @@ "GetPresetVersionResponseTypedDict", "GetWorkspaceResponse", "GetWorkspaceResponseTypedDict", - "Group", - "GroupTypedDict", "Guardrail", "GuardrailInterval", "GuardrailTypedDict", @@ -3665,6 +3693,7 @@ "ImageGenerationUsagePromptTokensDetails", "ImageGenerationUsagePromptTokensDetailsTypedDict", "ImageGenerationUsageTypedDict", + "ImageInputModality", "ImageModelArchitecture", "ImageModelArchitectureTypedDict", "ImageModelEndpointsResponse", @@ -3774,11 +3803,15 @@ "KeyAssignment", "KeyAssignmentTypedDict", "LegacyChatContentVideo", + "LegacyChatContentVideoInput", + "LegacyChatContentVideoInputTypedDict", "LegacyChatContentVideoType", "LegacyChatContentVideoTypedDict", "LegacyWebSearchServerTool", "LegacyWebSearchServerToolType", "LegacyWebSearchServerToolTypedDict", + "Links", + "LinksTypedDict", "ListBYOKKeysResponse", "ListBYOKKeysResponseTypedDict", "ListEndpointsResponse", @@ -3869,6 +3902,9 @@ "MessagesRequestToolUnion", "MessagesRequestToolUnionTypedDict", "MessagesRequestTypedDict", + "MessagesSearchModelsServerTool", + "MessagesSearchModelsServerToolType", + "MessagesSearchModelsServerToolTypedDict", "MetadataLevel", "Method", "Modality", @@ -3878,7 +3914,6 @@ "ModeTypedDict", "Model", "ModelArchitecture", - "ModelArchitectureInstructType", "ModelArchitectureTypedDict", "ModelBenchmarks", "ModelBenchmarksTypedDict", @@ -3933,10 +3968,14 @@ "ObservabilityDatadogDestinationTypedDict", "ObservabilityDestination", "ObservabilityDestinationTypedDict", + "ObservabilityFilterRuleGroup", + "ObservabilityFilterRuleGroupTypedDict", + "ObservabilityFilterRuleGroupValue", + "ObservabilityFilterRuleGroupValueTypedDict", "ObservabilityFilterRulesConfig", + "ObservabilityFilterRulesConfigNullable", + "ObservabilityFilterRulesConfigNullableTypedDict", "ObservabilityFilterRulesConfigTypedDict", - "ObservabilityFilterRulesConfigValue", - "ObservabilityFilterRulesConfigValueTypedDict", "ObservabilityGrafanaDestination", "ObservabilityGrafanaDestinationConfig", "ObservabilityGrafanaDestinationConfigTypedDict", @@ -4459,6 +4498,9 @@ "SearchContextSizeEnum", "SearchModelsServerToolConfig", "SearchModelsServerToolConfigTypedDict", + "SearchModelsServerToolOpenRouter", + "SearchModelsServerToolOpenRouterType", + "SearchModelsServerToolOpenRouterTypedDict", "SearchQualityLevel", "Security", "SecurityTypedDict", @@ -4906,12 +4948,12 @@ "AnthropicCitationPageLocationParam": ".anthropiccitationpagelocationparam", "AnthropicCitationPageLocationParamType": ".anthropiccitationpagelocationparam", "AnthropicCitationPageLocationParamTypedDict": ".anthropiccitationpagelocationparam", - "AnthropicCitationSearchResultLocation": ".anthropiccitationsearchresultlocation", - "AnthropicCitationSearchResultLocationType": ".anthropiccitationsearchresultlocation", - "AnthropicCitationSearchResultLocationTypedDict": ".anthropiccitationsearchresultlocation", - "AnthropicCitationWebSearchResultLocation": ".anthropiccitationwebsearchresultlocation", - "AnthropicCitationWebSearchResultLocationType": ".anthropiccitationwebsearchresultlocation", - "AnthropicCitationWebSearchResultLocationTypedDict": ".anthropiccitationwebsearchresultlocation", + "AnthropicCitationSearchResultLocationParam": ".anthropiccitationsearchresultlocationparam", + "AnthropicCitationSearchResultLocationParamType": ".anthropiccitationsearchresultlocationparam", + "AnthropicCitationSearchResultLocationParamTypedDict": ".anthropiccitationsearchresultlocationparam", + "AnthropicCitationWebSearchResultLocationParam": ".anthropiccitationwebsearchresultlocationparam", + "AnthropicCitationWebSearchResultLocationParamType": ".anthropiccitationwebsearchresultlocationparam", + "AnthropicCitationWebSearchResultLocationParamTypedDict": ".anthropiccitationwebsearchresultlocationparam", "AnthropicCompactionUsageIteration": ".anthropiccompactionusageiteration", "AnthropicCompactionUsageIterationType": ".anthropiccompactionusageiteration", "AnthropicCompactionUsageIterationTypedDict": ".anthropiccompactionusageiteration", @@ -5156,6 +5198,9 @@ "ChatFormatGrammarConfig": ".chatformatgrammarconfig", "ChatFormatGrammarConfigType": ".chatformatgrammarconfig", "ChatFormatGrammarConfigTypedDict": ".chatformatgrammarconfig", + "ChatFormatJSONObjectConfig": ".chatformatjsonobjectconfig", + "ChatFormatJSONObjectConfigType": ".chatformatjsonobjectconfig", + "ChatFormatJSONObjectConfigTypedDict": ".chatformatjsonobjectconfig", "ChatFormatJSONSchemaConfig": ".chatformatjsonschemaconfig", "ChatFormatJSONSchemaConfigType": ".chatformatjsonschemaconfig", "ChatFormatJSONSchemaConfigTypedDict": ".chatformatjsonschemaconfig", @@ -5702,6 +5747,7 @@ "ImageGenTextChunkEventPhase": ".imagegentextchunkevent", "ImageGenTextChunkEventType": ".imagegentextchunkevent", "ImageGenTextChunkEventTypedDict": ".imagegentextchunkevent", + "ImageInputModality": ".imageinputmodality", "ImageModelArchitecture": ".imagemodelarchitecture", "ImageModelArchitectureTypedDict": ".imagemodelarchitecture", "ImageModelEndpointsResponse": ".imagemodelendpointsresponse", @@ -5799,6 +5845,8 @@ "LegacyChatContentVideo": ".legacy_chatcontentvideo", "LegacyChatContentVideoType": ".legacy_chatcontentvideo", "LegacyChatContentVideoTypedDict": ".legacy_chatcontentvideo", + "LegacyChatContentVideoInput": ".legacy_chatcontentvideoinput", + "LegacyChatContentVideoInputTypedDict": ".legacy_chatcontentvideoinput", "LegacyWebSearchServerTool": ".legacy_websearchservertool", "LegacyWebSearchServerToolType": ".legacy_websearchservertool", "LegacyWebSearchServerToolTypedDict": ".legacy_websearchservertool", @@ -6018,11 +6066,13 @@ "TypeTool": ".messagesrequest", "TypeWebSearch20250305": ".messagesrequest", "TypeWebSearch20260209": ".messagesrequest", + "MessagesSearchModelsServerTool": ".messagessearchmodelsservertool", + "MessagesSearchModelsServerToolType": ".messagessearchmodelsservertool", + "MessagesSearchModelsServerToolTypedDict": ".messagessearchmodelsservertool", "MetadataLevel": ".metadatalevel", "Model": ".model", "ModelTypedDict": ".model", "ModelArchitecture": ".modelarchitecture", - "ModelArchitectureInstructType": ".modelarchitecture", "ModelArchitectureTypedDict": ".modelarchitecture", "ModelBenchmarks": ".modelbenchmarks", "ModelBenchmarksTypedDict": ".modelbenchmarks", @@ -6038,6 +6088,8 @@ "ModelsCountResponseData": ".modelscountresponse", "ModelsCountResponseDataTypedDict": ".modelscountresponse", "ModelsCountResponseTypedDict": ".modelscountresponse", + "Links": ".modelslistresponse", + "LinksTypedDict": ".modelslistresponse", "ModelsListResponse": ".modelslistresponse", "ModelsListResponseTypedDict": ".modelslistresponse", "ModerationPlugin": ".moderationplugin", @@ -6070,17 +6122,19 @@ "ObservabilityDestination": ".observabilitydestination", "ObservabilityDestinationTypedDict": ".observabilitydestination", "UnknownObservabilityDestination": ".observabilitydestination", - "FieldT": ".observabilityfilterrulesconfig", - "Group": ".observabilityfilterrulesconfig", - "GroupTypedDict": ".observabilityfilterrulesconfig", - "Logic": ".observabilityfilterrulesconfig", + "FieldT": ".observabilityfilterrulegroup", + "Logic": ".observabilityfilterrulegroup", + "ObservabilityFilterRuleGroup": ".observabilityfilterrulegroup", + "ObservabilityFilterRuleGroupTypedDict": ".observabilityfilterrulegroup", + "ObservabilityFilterRuleGroupValue": ".observabilityfilterrulegroup", + "ObservabilityFilterRuleGroupValueTypedDict": ".observabilityfilterrulegroup", + "Operator": ".observabilityfilterrulegroup", + "Rule": ".observabilityfilterrulegroup", + "RuleTypedDict": ".observabilityfilterrulegroup", "ObservabilityFilterRulesConfig": ".observabilityfilterrulesconfig", "ObservabilityFilterRulesConfigTypedDict": ".observabilityfilterrulesconfig", - "ObservabilityFilterRulesConfigValue": ".observabilityfilterrulesconfig", - "ObservabilityFilterRulesConfigValueTypedDict": ".observabilityfilterrulesconfig", - "Operator": ".observabilityfilterrulesconfig", - "Rule": ".observabilityfilterrulesconfig", - "RuleTypedDict": ".observabilityfilterrulesconfig", + "ObservabilityFilterRulesConfigNullable": ".observabilityfilterrulesconfignullable", + "ObservabilityFilterRulesConfigNullableTypedDict": ".observabilityfilterrulesconfignullable", "ObservabilityGrafanaDestination": ".observabilitygrafanadestination", "ObservabilityGrafanaDestinationConfig": ".observabilitygrafanadestination", "ObservabilityGrafanaDestinationConfigTypedDict": ".observabilitygrafanadestination", @@ -6608,6 +6662,9 @@ "RouterParamsTypedDict": ".routerparams", "RoutingStrategy": ".routingstrategy", "SearchContextSizeEnum": ".searchcontextsizeenum", + "SearchModelsServerToolOpenRouter": ".searchmodelsservertool_openrouter", + "SearchModelsServerToolOpenRouterType": ".searchmodelsservertool_openrouter", + "SearchModelsServerToolOpenRouterTypedDict": ".searchmodelsservertool_openrouter", "SearchModelsServerToolConfig": ".searchmodelsservertoolconfig", "SearchModelsServerToolConfigTypedDict": ".searchmodelsservertoolconfig", "SearchQualityLevel": ".searchqualitylevel", diff --git a/src/openrouter/components/additionaltoolsitem.py b/src/openrouter/components/additionaltoolsitem.py index 1bd74f0c..6f220280 100644 --- a/src/openrouter/components/additionaltoolsitem.py +++ b/src/openrouter/components/additionaltoolsitem.py @@ -11,10 +11,6 @@ ApplyPatchServerToolOpenRouterTypedDict, ) from .bashservertool import BashServerTool, BashServerToolTypedDict -from .chatsearchmodelsservertool import ( - ChatSearchModelsServerTool, - ChatSearchModelsServerToolTypedDict, -) from .codeinterpreterservertool import ( CodeInterpreterServerTool, CodeInterpreterServerToolTypedDict, @@ -50,6 +46,10 @@ PreviewWebSearchServerTool, PreviewWebSearchServerToolTypedDict, ) +from .searchmodelsservertool_openrouter import ( + SearchModelsServerToolOpenRouter, + SearchModelsServerToolOpenRouterTypedDict, +) from .shellservertool import ShellServerTool, ShellServerToolTypedDict from .shellservertool_openrouter import ( ShellServerToolOpenRouter, @@ -182,7 +182,7 @@ def serialize_model(self, handler): ApplyPatchServerToolOpenRouterTypedDict, WebSearchServerToolOpenRouterTypedDict, WebFetchServerToolTypedDict, - ChatSearchModelsServerToolTypedDict, + SearchModelsServerToolOpenRouterTypedDict, FilesServerToolTypedDict, AdvisorServerToolOpenRouterTypedDict, SubagentServerToolOpenRouterTypedDict, @@ -216,7 +216,7 @@ def serialize_model(self, handler): ApplyPatchServerToolOpenRouter, WebSearchServerToolOpenRouter, WebFetchServerTool, - ChatSearchModelsServerTool, + SearchModelsServerToolOpenRouter, FilesServerTool, AdvisorServerToolOpenRouter, SubagentServerToolOpenRouter, diff --git a/src/openrouter/components/anthropiccitationsearchresultlocation.py b/src/openrouter/components/anthropiccitationsearchresultlocationparam.py similarity index 73% rename from src/openrouter/components/anthropiccitationsearchresultlocation.py rename to src/openrouter/components/anthropiccitationsearchresultlocationparam.py index 8a90ed4f..77b17e50 100644 --- a/src/openrouter/components/anthropiccitationsearchresultlocation.py +++ b/src/openrouter/components/anthropiccitationsearchresultlocationparam.py @@ -7,20 +7,20 @@ from typing_extensions import TypedDict -AnthropicCitationSearchResultLocationType = Literal["search_result_location",] +AnthropicCitationSearchResultLocationParamType = Literal["search_result_location",] -class AnthropicCitationSearchResultLocationTypedDict(TypedDict): +class AnthropicCitationSearchResultLocationParamTypedDict(TypedDict): cited_text: str end_block_index: int search_result_index: int source: str start_block_index: int title: Nullable[str] - type: AnthropicCitationSearchResultLocationType + type: AnthropicCitationSearchResultLocationParamType -class AnthropicCitationSearchResultLocation(BaseModel): +class AnthropicCitationSearchResultLocationParam(BaseModel): cited_text: str end_block_index: int @@ -33,7 +33,7 @@ class AnthropicCitationSearchResultLocation(BaseModel): title: Nullable[str] - type: AnthropicCitationSearchResultLocationType + type: AnthropicCitationSearchResultLocationParamType @model_serializer(mode="wrap") def serialize_model(self, handler): diff --git a/src/openrouter/components/anthropiccitationwebsearchresultlocation.py b/src/openrouter/components/anthropiccitationwebsearchresultlocationparam.py similarity index 69% rename from src/openrouter/components/anthropiccitationwebsearchresultlocation.py rename to src/openrouter/components/anthropiccitationwebsearchresultlocationparam.py index 4d061c61..9be83763 100644 --- a/src/openrouter/components/anthropiccitationwebsearchresultlocation.py +++ b/src/openrouter/components/anthropiccitationwebsearchresultlocationparam.py @@ -7,25 +7,27 @@ from typing_extensions import TypedDict -AnthropicCitationWebSearchResultLocationType = Literal["web_search_result_location",] +AnthropicCitationWebSearchResultLocationParamType = Literal[ + "web_search_result_location", +] -class AnthropicCitationWebSearchResultLocationTypedDict(TypedDict): +class AnthropicCitationWebSearchResultLocationParamTypedDict(TypedDict): cited_text: str encrypted_index: str title: Nullable[str] - type: AnthropicCitationWebSearchResultLocationType + type: AnthropicCitationWebSearchResultLocationParamType url: str -class AnthropicCitationWebSearchResultLocation(BaseModel): +class AnthropicCitationWebSearchResultLocationParam(BaseModel): cited_text: str encrypted_index: str title: Nullable[str] - type: AnthropicCitationWebSearchResultLocationType + type: AnthropicCitationWebSearchResultLocationParamType url: str diff --git a/src/openrouter/components/anthropictextblockparam.py b/src/openrouter/components/anthropictextblockparam.py index ed10fdcf..a6a70aa6 100644 --- a/src/openrouter/components/anthropictextblockparam.py +++ b/src/openrouter/components/anthropictextblockparam.py @@ -17,13 +17,13 @@ AnthropicCitationPageLocationParam, AnthropicCitationPageLocationParamTypedDict, ) -from .anthropiccitationsearchresultlocation import ( - AnthropicCitationSearchResultLocation, - AnthropicCitationSearchResultLocationTypedDict, +from .anthropiccitationsearchresultlocationparam import ( + AnthropicCitationSearchResultLocationParam, + AnthropicCitationSearchResultLocationParamTypedDict, ) -from .anthropiccitationwebsearchresultlocation import ( - AnthropicCitationWebSearchResultLocation, - AnthropicCitationWebSearchResultLocationTypedDict, +from .anthropiccitationwebsearchresultlocationparam import ( + AnthropicCitationWebSearchResultLocationParam, + AnthropicCitationWebSearchResultLocationParamTypedDict, ) from openrouter.types import ( BaseModel, @@ -41,11 +41,11 @@ CitationTypedDict = TypeAliasType( "CitationTypedDict", Union[ - AnthropicCitationWebSearchResultLocationTypedDict, + AnthropicCitationWebSearchResultLocationParamTypedDict, AnthropicCitationCharLocationParamTypedDict, AnthropicCitationPageLocationParamTypedDict, AnthropicCitationContentBlockLocationParamTypedDict, - AnthropicCitationSearchResultLocationTypedDict, + AnthropicCitationSearchResultLocationParamTypedDict, ], ) @@ -57,9 +57,12 @@ AnthropicCitationContentBlockLocationParam, Tag("content_block_location") ], Annotated[AnthropicCitationPageLocationParam, Tag("page_location")], - Annotated[AnthropicCitationSearchResultLocation, Tag("search_result_location")], Annotated[ - AnthropicCitationWebSearchResultLocation, Tag("web_search_result_location") + AnthropicCitationSearchResultLocationParam, Tag("search_result_location") + ], + Annotated[ + AnthropicCitationWebSearchResultLocationParam, + Tag("web_search_result_location"), ], ], Discriminator(lambda m: get_discriminator(m, "type", "type")), diff --git a/src/openrouter/components/chatformatjsonobjectconfig.py b/src/openrouter/components/chatformatjsonobjectconfig.py new file mode 100644 index 00000000..450c8f6b --- /dev/null +++ b/src/openrouter/components/chatformatjsonobjectconfig.py @@ -0,0 +1,21 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel +from typing import Literal +from typing_extensions import TypedDict + + +ChatFormatJSONObjectConfigType = Literal["json_object",] + + +class ChatFormatJSONObjectConfigTypedDict(TypedDict): + r"""JSON object response format""" + + type: ChatFormatJSONObjectConfigType + + +class ChatFormatJSONObjectConfig(BaseModel): + r"""JSON object response format""" + + type: ChatFormatJSONObjectConfigType diff --git a/src/openrouter/components/chatrequest.py b/src/openrouter/components/chatrequest.py index fe89789e..91401275 100644 --- a/src/openrouter/components/chatrequest.py +++ b/src/openrouter/components/chatrequest.py @@ -11,6 +11,10 @@ ChatFormatGrammarConfig, ChatFormatGrammarConfigTypedDict, ) +from .chatformatjsonobjectconfig import ( + ChatFormatJSONObjectConfig, + ChatFormatJSONObjectConfigTypedDict, +) from .chatformatjsonschemaconfig import ( ChatFormatJSONSchemaConfig, ChatFormatJSONSchemaConfigTypedDict, @@ -30,10 +34,6 @@ ContextCompressionPluginTypedDict, ) from .fileparserplugin import FileParserPlugin, FileParserPluginTypedDict -from .formatjsonobjectconfig import ( - FormatJSONObjectConfig, - FormatJSONObjectConfigTypedDict, -) from .fusionplugin import FusionPlugin, FusionPluginTypedDict from .imageconfig import ImageConfig, ImageConfigTypedDict from .moderationplugin import ModerationPlugin, ModerationPluginTypedDict @@ -179,7 +179,7 @@ def serialize_model(self, handler): "ResponseFormatTypedDict", Union[ ChatFormatTextConfigTypedDict, - FormatJSONObjectConfigTypedDict, + ChatFormatJSONObjectConfigTypedDict, ChatFormatPythonConfigTypedDict, ChatFormatJSONSchemaConfigTypedDict, ChatFormatGrammarConfigTypedDict, @@ -191,7 +191,7 @@ def serialize_model(self, handler): ResponseFormat = Annotated[ Union[ Annotated[ChatFormatGrammarConfig, Tag("grammar")], - Annotated[FormatJSONObjectConfig, Tag("json_object")], + Annotated[ChatFormatJSONObjectConfig, Tag("json_object")], Annotated[ChatFormatJSONSchemaConfig, Tag("json_schema")], Annotated[ChatFormatPythonConfig, Tag("python")], Annotated[ChatFormatTextConfig, Tag("text")], diff --git a/src/openrouter/components/createobservabilitydestinationrequest.py b/src/openrouter/components/createobservabilitydestinationrequest.py index b7bf9755..6cd46b4f 100644 --- a/src/openrouter/components/createobservabilitydestinationrequest.py +++ b/src/openrouter/components/createobservabilitydestinationrequest.py @@ -1,9 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from .observabilityfilterrulesconfig import ( - ObservabilityFilterRulesConfig, - ObservabilityFilterRulesConfigTypedDict, +from .observabilityfilterrulesconfignullable import ( + ObservabilityFilterRulesConfigNullable, + ObservabilityFilterRulesConfigNullableTypedDict, ) from openrouter.types import ( BaseModel, @@ -54,7 +54,7 @@ class CreateObservabilityDestinationRequestTypedDict(TypedDict): r"""Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. `null` or omitted means all keys. Must contain at least one hash if provided.""" enabled: NotRequired[bool] r"""Whether this destination should be enabled immediately.""" - filter_rules: NotRequired[Nullable[ObservabilityFilterRulesConfigTypedDict]] + filter_rules: NotRequired[Nullable[ObservabilityFilterRulesConfigNullableTypedDict]] r"""Optional structured filter rules controlling which events are forwarded.""" privacy_mode: NotRequired[bool] r"""When true, request/response bodies are not forwarded — only metadata.""" @@ -80,7 +80,7 @@ class CreateObservabilityDestinationRequest(BaseModel): enabled: Optional[bool] = True r"""Whether this destination should be enabled immediately.""" - filter_rules: OptionalNullable[ObservabilityFilterRulesConfig] = UNSET + filter_rules: OptionalNullable[ObservabilityFilterRulesConfigNullable] = UNSET r"""Optional structured filter rules controlling which events are forwarded.""" privacy_mode: Optional[bool] = False diff --git a/src/openrouter/components/imageinputmodality.py b/src/openrouter/components/imageinputmodality.py new file mode 100644 index 00000000..bfe11c62 --- /dev/null +++ b/src/openrouter/components/imageinputmodality.py @@ -0,0 +1,17 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import UnrecognizedStr +from typing import Literal, Union + + +ImageInputModality = Union[ + Literal[ + "text", + "image", + "file", + "audio", + "video", + ], + UnrecognizedStr, +] diff --git a/src/openrouter/components/imagemodelarchitecture.py b/src/openrouter/components/imagemodelarchitecture.py index 01f0cb5e..0a870e4b 100644 --- a/src/openrouter/components/imagemodelarchitecture.py +++ b/src/openrouter/components/imagemodelarchitecture.py @@ -1,22 +1,22 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations +from .imageinputmodality import ImageInputModality from .imageoutputmodality import ImageOutputModality -from .inputmodality import InputModality from openrouter.types import BaseModel from typing import List from typing_extensions import TypedDict class ImageModelArchitectureTypedDict(TypedDict): - input_modalities: List[InputModality] + input_modalities: List[ImageInputModality] r"""Supported input modalities""" output_modalities: List[ImageOutputModality] r"""Supported output modalities""" class ImageModelArchitecture(BaseModel): - input_modalities: List[InputModality] + input_modalities: List[ImageInputModality] r"""Supported input modalities""" output_modalities: List[ImageOutputModality] diff --git a/src/openrouter/components/legacy_chatcontentvideo.py b/src/openrouter/components/legacy_chatcontentvideo.py index b5dd4d1a..38a7bf71 100644 --- a/src/openrouter/components/legacy_chatcontentvideo.py +++ b/src/openrouter/components/legacy_chatcontentvideo.py @@ -1,7 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from .chatcontentvideoinput import ChatContentVideoInput, ChatContentVideoInputTypedDict +from .legacy_chatcontentvideoinput import ( + LegacyChatContentVideoInput, + LegacyChatContentVideoInputTypedDict, +) from openrouter.types import BaseModel from typing import Literal from typing_extensions import TypedDict, deprecated @@ -17,7 +20,7 @@ class LegacyChatContentVideoTypedDict(TypedDict): r"""Video input content part (legacy format - deprecated)""" type: LegacyChatContentVideoType - video_url: ChatContentVideoInputTypedDict + video_url: LegacyChatContentVideoInputTypedDict r"""Video input object""" @@ -29,5 +32,5 @@ class LegacyChatContentVideo(BaseModel): type: LegacyChatContentVideoType - video_url: ChatContentVideoInput + video_url: LegacyChatContentVideoInput r"""Video input object""" diff --git a/src/openrouter/components/legacy_chatcontentvideoinput.py b/src/openrouter/components/legacy_chatcontentvideoinput.py new file mode 100644 index 00000000..0fe43c16 --- /dev/null +++ b/src/openrouter/components/legacy_chatcontentvideoinput.py @@ -0,0 +1,19 @@ +"""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 LegacyChatContentVideoInputTypedDict(TypedDict): + r"""Video input object""" + + url: str + r"""URL of the video (data: URLs supported)""" + + +class LegacyChatContentVideoInput(BaseModel): + r"""Video input object""" + + url: str + r"""URL of the video (data: URLs supported)""" diff --git a/src/openrouter/components/messagesrequest.py b/src/openrouter/components/messagesrequest.py index e69fe1fc..d2e30398 100644 --- a/src/openrouter/components/messagesrequest.py +++ b/src/openrouter/components/messagesrequest.py @@ -35,10 +35,6 @@ ) from .autorouterplugin import AutoRouterPlugin, AutoRouterPluginTypedDict from .bashservertool import BashServerTool, BashServerToolTypedDict -from .chatsearchmodelsservertool import ( - ChatSearchModelsServerTool, - ChatSearchModelsServerToolTypedDict, -) from .contextcompressionplugin import ( ContextCompressionPlugin, ContextCompressionPluginTypedDict, @@ -53,6 +49,10 @@ from .messagesfallbackparam import MessagesFallbackParam, MessagesFallbackParamTypedDict from .messagesmessageparam import MessagesMessageParam, MessagesMessageParamTypedDict from .messagesoutputconfig import MessagesOutputConfig, MessagesOutputConfigTypedDict +from .messagessearchmodelsservertool import ( + MessagesSearchModelsServerTool, + MessagesSearchModelsServerToolTypedDict, +) from .moderationplugin import ModerationPlugin, ModerationPluginTypedDict from .openrouterwebsearchservertool import ( OpenRouterWebSearchServerTool, @@ -1070,7 +1070,7 @@ def serialize_model(self, handler): MessagesRequestToolUnionTypedDict = TypeAliasType( "MessagesRequestToolUnionTypedDict", Union[ - ChatSearchModelsServerToolTypedDict, + MessagesSearchModelsServerToolTypedDict, BashServerToolTypedDict, DatetimeServerToolTypedDict, ImageGenerationServerToolOpenRouterTypedDict, @@ -1090,7 +1090,7 @@ def serialize_model(self, handler): MessagesRequestToolUnion = TypeAliasType( "MessagesRequestToolUnion", Union[ - ChatSearchModelsServerTool, + MessagesSearchModelsServerTool, BashServerTool, DatetimeServerTool, ImageGenerationServerToolOpenRouter, diff --git a/src/openrouter/components/messagessearchmodelsservertool.py b/src/openrouter/components/messagessearchmodelsservertool.py new file mode 100644 index 00000000..d101995f --- /dev/null +++ b/src/openrouter/components/messagessearchmodelsservertool.py @@ -0,0 +1,47 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .searchmodelsservertoolconfig import ( + SearchModelsServerToolConfig, + SearchModelsServerToolConfigTypedDict, +) +from openrouter.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer +from typing import Literal, Optional +from typing_extensions import NotRequired, TypedDict + + +MessagesSearchModelsServerToolType = Literal["openrouter:experimental__search_models",] + + +class MessagesSearchModelsServerToolTypedDict(TypedDict): + r"""OpenRouter built-in server tool: searches and filters AI models available on OpenRouter""" + + type: MessagesSearchModelsServerToolType + parameters: NotRequired[SearchModelsServerToolConfigTypedDict] + r"""Configuration for the openrouter:experimental__search_models server tool""" + + +class MessagesSearchModelsServerTool(BaseModel): + r"""OpenRouter built-in server tool: searches and filters AI models available on OpenRouter""" + + type: MessagesSearchModelsServerToolType + + parameters: Optional[SearchModelsServerToolConfig] = None + r"""Configuration for the openrouter:experimental__search_models server tool""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["parameters"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/openrouter/components/modelarchitecture.py b/src/openrouter/components/modelarchitecture.py index 1fb1dbcc..b1fb080a 100644 --- a/src/openrouter/components/modelarchitecture.py +++ b/src/openrouter/components/modelarchitecture.py @@ -2,6 +2,7 @@ from __future__ import annotations from .inputmodality import InputModality +from .instructtype import InstructType from .modelgroup import ModelGroup from .outputmodality import OutputModality from openrouter.types import ( @@ -10,43 +11,12 @@ OptionalNullable, UNSET, UNSET_SENTINEL, - UnrecognizedStr, ) from pydantic import model_serializer -from typing import List, Literal, Optional, Union +from typing import List, Optional from typing_extensions import NotRequired, TypedDict -ModelArchitectureInstructType = Union[ - Literal[ - "none", - "airoboros", - "alpaca", - "alpaca-modif", - "chatml", - "claude", - "code-llama", - "gemma", - "llama2", - "llama3", - "mistral", - "nemotron", - "neural", - "openchat", - "phi3", - "rwkv", - "vicuna", - "zephyr", - "deepseek-r1", - "deepseek-v3.1", - "qwq", - "qwen3", - ], - UnrecognizedStr, -] -r"""Instruction format type""" - - class ModelArchitectureTypedDict(TypedDict): r"""Model architecture information""" @@ -56,7 +26,7 @@ class ModelArchitectureTypedDict(TypedDict): r"""Primary modality of the model""" output_modalities: List[OutputModality] r"""Supported output modalities""" - instruct_type: NotRequired[Nullable[ModelArchitectureInstructType]] + instruct_type: NotRequired[Nullable[InstructType]] r"""Instruction format type""" tokenizer: NotRequired[ModelGroup] r"""Tokenizer type used by the model""" @@ -74,7 +44,7 @@ class ModelArchitecture(BaseModel): output_modalities: List[OutputModality] r"""Supported output modalities""" - instruct_type: OptionalNullable[ModelArchitectureInstructType] = UNSET + instruct_type: OptionalNullable[InstructType] = UNSET r"""Instruction format type""" tokenizer: Optional[ModelGroup] = None diff --git a/src/openrouter/components/modelslistresponse.py b/src/openrouter/components/modelslistresponse.py index 8497c58e..a1cd85a3 100644 --- a/src/openrouter/components/modelslistresponse.py +++ b/src/openrouter/components/modelslistresponse.py @@ -2,16 +2,49 @@ from __future__ import annotations from .model import Model, ModelTypedDict -from openrouter.types import BaseModel +from openrouter.types import BaseModel, Nullable, UNSET_SENTINEL +from pydantic import model_serializer from typing import List from typing_extensions import TypedDict +class LinksTypedDict(TypedDict): + r"""Pagination links""" + + next: Nullable[str] + r"""URL for the next page of results, or null if this is the last page""" + + +class Links(BaseModel): + r"""Pagination links""" + + next: Nullable[str] + r"""URL for the next page of results, or null if this is the last page""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + class ModelsListResponseTypedDict(TypedDict): r"""List of available models""" data: List[ModelTypedDict] r"""List of available models""" + links: LinksTypedDict + r"""Pagination links""" + total_count: int + r"""Total number of models matching the query""" class ModelsListResponse(BaseModel): @@ -19,3 +52,9 @@ class ModelsListResponse(BaseModel): data: List[Model] r"""List of available models""" + + links: Links + r"""Pagination links""" + + total_count: int + r"""Total number of models matching the query""" diff --git a/src/openrouter/components/observabilityfilterrulegroup.py b/src/openrouter/components/observabilityfilterrulegroup.py new file mode 100644 index 00000000..576d6a30 --- /dev/null +++ b/src/openrouter/components/observabilityfilterrulegroup.py @@ -0,0 +1,122 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel, UNSET_SENTINEL, UnrecognizedStr +from pydantic import model_serializer +from typing import List, Literal, Optional, Union +from typing_extensions import NotRequired, TypeAliasType, TypedDict + + +Logic = Union[ + Literal[ + "and", + "or", + ], + UnrecognizedStr, +] + + +FieldT = Union[ + Literal[ + "model", + "provider", + "session_id", + "user_id", + "api_key_name", + "finish_reason", + "input", + "output", + "total_cost", + "total_tokens", + "prompt_tokens", + "completion_tokens", + ], + UnrecognizedStr, +] + + +Operator = Union[ + Literal[ + "equals", + "not_equals", + "contains", + "not_contains", + "regex", + "starts_with", + "ends_with", + "gt", + "lt", + "gte", + "lte", + "exists", + "not_exists", + ], + UnrecognizedStr, +] + + +ObservabilityFilterRuleGroupValueTypedDict = TypeAliasType( + "ObservabilityFilterRuleGroupValueTypedDict", Union[str, float] +) + + +ObservabilityFilterRuleGroupValue = TypeAliasType( + "ObservabilityFilterRuleGroupValue", Union[str, float] +) + + +class RuleTypedDict(TypedDict): + field: FieldT + operator: Operator + value: NotRequired[ObservabilityFilterRuleGroupValueTypedDict] + + +class Rule(BaseModel): + field: FieldT + + operator: Operator + + value: Optional[ObservabilityFilterRuleGroupValue] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["value"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + + +class ObservabilityFilterRuleGroupTypedDict(TypedDict): + rules: List[RuleTypedDict] + logic: NotRequired[Logic] + + +class ObservabilityFilterRuleGroup(BaseModel): + rules: List[Rule] + + logic: Optional[Logic] = "and" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["logic"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/openrouter/components/observabilityfilterrulesconfig.py b/src/openrouter/components/observabilityfilterrulesconfig.py index 76f042e2..6f5536a5 100644 --- a/src/openrouter/components/observabilityfilterrulesconfig.py +++ b/src/openrouter/components/observabilityfilterrulesconfig.py @@ -1,138 +1,27 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from openrouter.types import BaseModel, UNSET_SENTINEL, UnrecognizedStr -from pydantic import model_serializer -from typing import List, Literal, Optional, Union -from typing_extensions import NotRequired, TypeAliasType, TypedDict - - -Logic = Union[ - Literal[ - "and", - "or", - ], - UnrecognizedStr, -] - - -FieldT = Union[ - Literal[ - "model", - "provider", - "session_id", - "user_id", - "api_key_name", - "finish_reason", - "input", - "output", - "total_cost", - "total_tokens", - "prompt_tokens", - "completion_tokens", - ], - UnrecognizedStr, -] - - -Operator = Union[ - Literal[ - "equals", - "not_equals", - "contains", - "not_contains", - "regex", - "starts_with", - "ends_with", - "gt", - "lt", - "gte", - "lte", - "exists", - "not_exists", - ], - UnrecognizedStr, -] - - -ObservabilityFilterRulesConfigValueTypedDict = TypeAliasType( - "ObservabilityFilterRulesConfigValueTypedDict", Union[str, float] +from .observabilityfilterrulegroup import ( + ObservabilityFilterRuleGroup, + ObservabilityFilterRuleGroupTypedDict, ) - - -ObservabilityFilterRulesConfigValue = TypeAliasType( - "ObservabilityFilterRulesConfigValue", Union[str, float] -) - - -class RuleTypedDict(TypedDict): - field: FieldT - operator: Operator - value: NotRequired[ObservabilityFilterRulesConfigValueTypedDict] - - -class Rule(BaseModel): - field: FieldT - - operator: Operator - - value: Optional[ObservabilityFilterRulesConfigValue] = None - - @model_serializer(mode="wrap") - def serialize_model(self, handler): - optional_fields = set(["value"]) - serialized = handler(self) - m = {} - - for n, f in type(self).model_fields.items(): - k = f.alias or n - val = serialized.get(k, serialized.get(n)) - - if val != UNSET_SENTINEL: - if val is not None or k not in optional_fields: - m[k] = val - - return m - - -class GroupTypedDict(TypedDict): - rules: List[RuleTypedDict] - logic: NotRequired[Logic] - - -class Group(BaseModel): - rules: List[Rule] - - logic: Optional[Logic] = "and" - - @model_serializer(mode="wrap") - def serialize_model(self, handler): - optional_fields = set(["logic"]) - serialized = handler(self) - m = {} - - for n, f in type(self).model_fields.items(): - k = f.alias or n - val = serialized.get(k, serialized.get(n)) - - if val != UNSET_SENTINEL: - if val is not None or k not in optional_fields: - m[k] = val - - return m +from openrouter.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer +from typing import List, Optional +from typing_extensions import NotRequired, TypedDict class ObservabilityFilterRulesConfigTypedDict(TypedDict): r"""Optional structured filter rules controlling which events are forwarded.""" - groups: List[GroupTypedDict] + groups: List[ObservabilityFilterRuleGroupTypedDict] enabled: NotRequired[bool] class ObservabilityFilterRulesConfig(BaseModel): r"""Optional structured filter rules controlling which events are forwarded.""" - groups: List[Group] + groups: List[ObservabilityFilterRuleGroup] enabled: Optional[bool] = True diff --git a/src/openrouter/components/observabilityfilterrulesconfignullable.py b/src/openrouter/components/observabilityfilterrulesconfignullable.py new file mode 100644 index 00000000..80ac61fe --- /dev/null +++ b/src/openrouter/components/observabilityfilterrulesconfignullable.py @@ -0,0 +1,42 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .observabilityfilterrulegroup import ( + ObservabilityFilterRuleGroup, + ObservabilityFilterRuleGroupTypedDict, +) +from openrouter.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer +from typing import List, Optional +from typing_extensions import NotRequired, TypedDict + + +class ObservabilityFilterRulesConfigNullableTypedDict(TypedDict): + r"""Optional structured filter rules controlling which events are forwarded.""" + + groups: List[ObservabilityFilterRuleGroupTypedDict] + enabled: NotRequired[bool] + + +class ObservabilityFilterRulesConfigNullable(BaseModel): + r"""Optional structured filter rules controlling which events are forwarded.""" + + groups: List[ObservabilityFilterRuleGroup] + + enabled: Optional[bool] = True + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["enabled"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/openrouter/components/responsesrequest.py b/src/openrouter/components/responsesrequest.py index 7331187e..6f97e56c 100644 --- a/src/openrouter/components/responsesrequest.py +++ b/src/openrouter/components/responsesrequest.py @@ -17,10 +17,6 @@ from .autorouterplugin import AutoRouterPlugin, AutoRouterPluginTypedDict from .bashservertool import BashServerTool, BashServerToolTypedDict from .chatdebugoptions import ChatDebugOptions, ChatDebugOptionsTypedDict -from .chatsearchmodelsservertool import ( - ChatSearchModelsServerTool, - ChatSearchModelsServerToolTypedDict, -) from .codeinterpreterservertool import ( CodeInterpreterServerTool, CodeInterpreterServerToolTypedDict, @@ -77,6 +73,10 @@ from .reasoningconfig import ReasoningConfig, ReasoningConfigTypedDict from .responsehealingplugin import ResponseHealingPlugin, ResponseHealingPluginTypedDict from .responseincludesenum import ResponseIncludesEnum +from .searchmodelsservertool_openrouter import ( + SearchModelsServerToolOpenRouter, + SearchModelsServerToolOpenRouterTypedDict, +) from .shellservertool import ShellServerTool, ShellServerToolTypedDict from .shellservertool_openrouter import ( ShellServerToolOpenRouter, @@ -227,7 +227,7 @@ def serialize_model(self, handler): ApplyPatchServerToolOpenRouterTypedDict, WebSearchServerToolOpenRouterTypedDict, WebFetchServerToolTypedDict, - ChatSearchModelsServerToolTypedDict, + SearchModelsServerToolOpenRouterTypedDict, FilesServerToolTypedDict, DatetimeServerToolTypedDict, AdvisorServerToolOpenRouterTypedDict, @@ -273,7 +273,8 @@ def serialize_model(self, handler): ImageGenerationServerToolOpenRouter, Tag("openrouter:image_generation") ], Annotated[ - ChatSearchModelsServerTool, Tag("openrouter:experimental__search_models") + SearchModelsServerToolOpenRouter, + Tag("openrouter:experimental__search_models"), ], Annotated[WebFetchServerTool, Tag("openrouter:web_fetch")], Annotated[WebSearchServerToolOpenRouter, Tag("openrouter:web_search")], diff --git a/src/openrouter/components/searchmodelsservertool_openrouter.py b/src/openrouter/components/searchmodelsservertool_openrouter.py new file mode 100644 index 00000000..158d0a1a --- /dev/null +++ b/src/openrouter/components/searchmodelsservertool_openrouter.py @@ -0,0 +1,49 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .searchmodelsservertoolconfig import ( + SearchModelsServerToolConfig, + SearchModelsServerToolConfigTypedDict, +) +from openrouter.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer +from typing import Literal, Optional +from typing_extensions import NotRequired, TypedDict + + +SearchModelsServerToolOpenRouterType = Literal[ + "openrouter:experimental__search_models", +] + + +class SearchModelsServerToolOpenRouterTypedDict(TypedDict): + r"""OpenRouter built-in server tool: searches and filters AI models available on OpenRouter""" + + type: SearchModelsServerToolOpenRouterType + parameters: NotRequired[SearchModelsServerToolConfigTypedDict] + r"""Configuration for the openrouter:experimental__search_models server tool""" + + +class SearchModelsServerToolOpenRouter(BaseModel): + r"""OpenRouter built-in server tool: searches and filters AI models available on OpenRouter""" + + type: SearchModelsServerToolOpenRouterType + + parameters: Optional[SearchModelsServerToolConfig] = None + r"""Configuration for the openrouter:experimental__search_models server tool""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["parameters"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/openrouter/components/updateobservabilitydestinationrequest.py b/src/openrouter/components/updateobservabilitydestinationrequest.py index a344284f..e0d3f99c 100644 --- a/src/openrouter/components/updateobservabilitydestinationrequest.py +++ b/src/openrouter/components/updateobservabilitydestinationrequest.py @@ -1,9 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from .observabilityfilterrulesconfig import ( - ObservabilityFilterRulesConfig, - ObservabilityFilterRulesConfigTypedDict, +from .observabilityfilterrulesconfignullable import ( + ObservabilityFilterRulesConfigNullable, + ObservabilityFilterRulesConfigNullableTypedDict, ) from openrouter.types import ( BaseModel, @@ -24,7 +24,7 @@ class UpdateObservabilityDestinationRequestTypedDict(TypedDict): r"""Provider-specific configuration fields to update. Masked values are ignored; unset fields keep their current value.""" enabled: NotRequired[bool] r"""Whether the destination is enabled.""" - filter_rules: NotRequired[Nullable[ObservabilityFilterRulesConfigTypedDict]] + filter_rules: NotRequired[Nullable[ObservabilityFilterRulesConfigNullableTypedDict]] name: NotRequired[str] r"""Human-readable name for the destination.""" privacy_mode: NotRequired[bool] @@ -43,7 +43,7 @@ class UpdateObservabilityDestinationRequest(BaseModel): enabled: Optional[bool] = None r"""Whether the destination is enabled.""" - filter_rules: OptionalNullable[ObservabilityFilterRulesConfig] = UNSET + filter_rules: OptionalNullable[ObservabilityFilterRulesConfigNullable] = UNSET name: Optional[str] = None r"""Human-readable name for the destination.""" diff --git a/src/openrouter/embeddings.py b/src/openrouter/embeddings.py index 9f0b5ce3..906426aa 100644 --- a/src/openrouter/embeddings.py +++ b/src/openrouter/embeddings.py @@ -2,12 +2,13 @@ from .basesdk import BaseSDK from enum import Enum +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, Mapping, Optional, Union +from typing import Any, Awaitable, Dict, List, Mapping, Optional, Union class GenerateAcceptEnum(str, Enum): @@ -432,11 +433,13 @@ def list_models( http_referer: Optional[str] = None, x_open_router_title: Optional[str] = None, x_open_router_categories: Optional[str] = None, + offset: Optional[int] = 0, + limit: Optional[int] = 500, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, http_headers: Optional[Mapping[str, str]] = None, - ) -> components.ModelsListResponse: + ) -> Optional[operations.ListEmbeddingsModelsResponse]: r"""List all embeddings models Returns a list of all available embeddings models and their properties @@ -448,6 +451,8 @@ def list_models( :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. When both offset and limit are omitted, the full list is returned + :param limit: Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is 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 @@ -467,6 +472,8 @@ def list_models( 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( @@ -520,9 +527,39 @@ def list_models( retry_config=retry_config, ) + def next_func() -> Optional[operations.ListEmbeddingsModelsResponse]: + body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]]) + + offset = request.offset if isinstance(request.offset, int) 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 isinstance(request.limit, int) else 500 + if len(results[0]) < limit_: + return None + next_offset = offset + len(results[0]) + + return self.list_models( + 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, + server_url=server_url, + timeout_ms=timeout_ms, + http_headers=http_headers, + ) + response_data: Any = None if utils.match_response(http_res, "200", "application/json"): - return unmarshal_json_response(components.ModelsListResponse, http_res) + return operations.ListEmbeddingsModelsResponse( + result=unmarshal_json_response(components.ModelsListResponse, http_res), + next=next_func, + ) if utils.match_response(http_res, "400", "application/json"): response_data = unmarshal_json_response( errors.BadRequestResponseErrorData, http_res @@ -552,11 +589,13 @@ async def list_models_async( http_referer: Optional[str] = None, x_open_router_title: Optional[str] = None, x_open_router_categories: Optional[str] = None, + offset: Optional[int] = 0, + limit: Optional[int] = 500, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, http_headers: Optional[Mapping[str, str]] = None, - ) -> components.ModelsListResponse: + ) -> Optional[operations.ListEmbeddingsModelsResponse]: r"""List all embeddings models Returns a list of all available embeddings models and their properties @@ -568,6 +607,8 @@ async def list_models_async( :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. When both offset and limit are omitted, the full list is returned + :param limit: Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is 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 @@ -587,6 +628,8 @@ async def list_models_async( 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( @@ -640,9 +683,42 @@ async def list_models_async( retry_config=retry_config, ) + def next_func() -> Awaitable[Optional[operations.ListEmbeddingsModelsResponse]]: + body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]]) + + async def empty_result(): + return None + + offset = request.offset if isinstance(request.offset, int) 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 isinstance(request.limit, int) else 500 + if len(results[0]) < limit_: + return empty_result() + next_offset = offset + len(results[0]) + + return self.list_models_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, + server_url=server_url, + timeout_ms=timeout_ms, + http_headers=http_headers, + ) + response_data: Any = None if utils.match_response(http_res, "200", "application/json"): - return unmarshal_json_response(components.ModelsListResponse, http_res) + return operations.ListEmbeddingsModelsResponse( + result=unmarshal_json_response(components.ModelsListResponse, http_res), + next=next_func, + ) if utils.match_response(http_res, "400", "application/json"): response_data = unmarshal_json_response( errors.BadRequestResponseErrorData, http_res diff --git a/src/openrouter/guardrails.py b/src/openrouter/guardrails.py index 4add1c7f..0e06ce70 100644 --- a/src/openrouter/guardrails.py +++ b/src/openrouter/guardrails.py @@ -19,8 +19,8 @@ def list( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, workspace_id: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, @@ -126,7 +126,7 @@ def next_func() -> Optional[operations.ListGuardrailsResponse]: results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return None - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return None next_offset = offset + len(results[0]) @@ -181,8 +181,8 @@ async def list_async( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, workspace_id: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, @@ -291,7 +291,7 @@ async def empty_result(): results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return empty_result() - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return empty_result() next_offset = offset + len(results[0]) @@ -1703,8 +1703,8 @@ def list_guardrail_key_assignments( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -1809,7 +1809,7 @@ def next_func() -> Optional[operations.ListGuardrailKeyAssignmentsResponse]: results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return None - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return None next_offset = offset + len(results[0]) @@ -1870,8 +1870,8 @@ async def list_guardrail_key_assignments_async( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -1981,7 +1981,7 @@ async def empty_result(): results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return empty_result() - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return empty_result() next_offset = offset + len(results[0]) @@ -2626,8 +2626,8 @@ def list_guardrail_member_assignments( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -2732,7 +2732,7 @@ def next_func() -> Optional[operations.ListGuardrailMemberAssignmentsResponse]: results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return None - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return None next_offset = offset + len(results[0]) @@ -2793,8 +2793,8 @@ async def list_guardrail_member_assignments_async( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -2904,7 +2904,7 @@ async def empty_result(): results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return empty_result() - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return empty_result() next_offset = offset + len(results[0]) @@ -3552,8 +3552,8 @@ def list_key_assignments( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -3656,7 +3656,7 @@ def next_func() -> Optional[operations.ListKeyAssignmentsResponse]: results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return None - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return None next_offset = offset + len(results[0]) @@ -3710,8 +3710,8 @@ async def list_key_assignments_async( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -3817,7 +3817,7 @@ async def empty_result(): results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return empty_result() - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return empty_result() next_offset = offset + len(results[0]) @@ -3871,8 +3871,8 @@ def list_member_assignments( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -3975,7 +3975,7 @@ def next_func() -> Optional[operations.ListMemberAssignmentsResponse]: results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return None - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return None next_offset = offset + len(results[0]) @@ -4029,8 +4029,8 @@ async def list_member_assignments_async( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -4138,7 +4138,7 @@ async def empty_result(): results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return empty_result() - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return empty_result() next_offset = offset + len(results[0]) diff --git a/src/openrouter/models_.py b/src/openrouter/models_.py index 03798275..1a85e997 100644 --- a/src/openrouter/models_.py +++ b/src/openrouter/models_.py @@ -1,12 +1,13 @@ """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, Mapping, Optional, Union +from typing import Any, Awaitable, Dict, List, Mapping, Optional, Union class Models(BaseSDK): @@ -270,6 +271,8 @@ def list( http_referer: Optional[str] = None, x_open_router_title: Optional[str] = None, x_open_router_categories: Optional[str] = None, + offset: Optional[int] = 0, + limit: Optional[int] = 500, category: Optional[operations.GetModelsCategory] = None, supported_parameters: Optional[str] = None, output_modalities: Optional[str] = None, @@ -301,7 +304,7 @@ def list( server_url: Optional[str] = None, timeout_ms: Optional[int] = None, http_headers: Optional[Mapping[str, str]] = None, - ) -> components.ModelsListResponse: + ) -> Optional[operations.GetModelsResponse]: r"""List all models and their properties :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. @@ -311,6 +314,8 @@ def list( :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. When both offset and limit are omitted, the full list is returned + :param limit: Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned :param category: Filter models by use case category :param supported_parameters: Filter models by supported parameter (comma-separated) :param output_modalities: Filter models by output modality. Accepts a comma-separated list of modalities (text, image, audio, embeddings) or \"all\" to include all models. Defaults to \"text\". @@ -357,6 +362,8 @@ def list( http_referer=http_referer, x_open_router_title=x_open_router_title, x_open_router_categories=x_open_router_categories, + offset=offset, + limit=limit, category=category, supported_parameters=supported_parameters, output_modalities=output_modalities, @@ -437,9 +444,66 @@ def list( retry_config=retry_config, ) + def next_func() -> Optional[operations.GetModelsResponse]: + body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]]) + + offset = request.offset if isinstance(request.offset, int) 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 isinstance(request.limit, int) else 500 + 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, + category=category, + supported_parameters=supported_parameters, + output_modalities=output_modalities, + sort=sort, + q=q, + input_modalities=input_modalities, + context=context, + min_price=min_price, + max_price=max_price, + arch=arch, + model_authors=model_authors, + providers=providers, + distillable=distillable, + zdr=zdr, + region=region, + min_output_price=min_output_price, + max_output_price=max_output_price, + min_age_days=min_age_days, + max_age_days=max_age_days, + min_intelligence_index=min_intelligence_index, + max_intelligence_index=max_intelligence_index, + min_coding_index=min_coding_index, + max_coding_index=max_coding_index, + min_agentic_index=min_agentic_index, + max_agentic_index=max_agentic_index, + min_tool_success_rate=min_tool_success_rate, + max_tool_success_rate=max_tool_success_rate, + retries=retries, + server_url=server_url, + timeout_ms=timeout_ms, + http_headers=http_headers, + ) + response_data: Any = None if utils.match_response(http_res, "200", "application/json"): - return unmarshal_json_response(components.ModelsListResponse, http_res) + return operations.GetModelsResponse( + result=unmarshal_json_response(components.ModelsListResponse, http_res), + next=next_func, + ) if utils.match_response(http_res, "400", "application/json"): response_data = unmarshal_json_response( errors.BadRequestResponseErrorData, http_res @@ -469,6 +533,8 @@ async def list_async( http_referer: Optional[str] = None, x_open_router_title: Optional[str] = None, x_open_router_categories: Optional[str] = None, + offset: Optional[int] = 0, + limit: Optional[int] = 500, category: Optional[operations.GetModelsCategory] = None, supported_parameters: Optional[str] = None, output_modalities: Optional[str] = None, @@ -500,7 +566,7 @@ async def list_async( server_url: Optional[str] = None, timeout_ms: Optional[int] = None, http_headers: Optional[Mapping[str, str]] = None, - ) -> components.ModelsListResponse: + ) -> Optional[operations.GetModelsResponse]: r"""List all models and their properties :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. @@ -510,6 +576,8 @@ async def list_async( :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. When both offset and limit are omitted, the full list is returned + :param limit: Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned :param category: Filter models by use case category :param supported_parameters: Filter models by supported parameter (comma-separated) :param output_modalities: Filter models by output modality. Accepts a comma-separated list of modalities (text, image, audio, embeddings) or \"all\" to include all models. Defaults to \"text\". @@ -556,6 +624,8 @@ async def list_async( http_referer=http_referer, x_open_router_title=x_open_router_title, x_open_router_categories=x_open_router_categories, + offset=offset, + limit=limit, category=category, supported_parameters=supported_parameters, output_modalities=output_modalities, @@ -636,9 +706,69 @@ async def list_async( retry_config=retry_config, ) + def next_func() -> Awaitable[Optional[operations.GetModelsResponse]]: + body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]]) + + async def empty_result(): + return None + + offset = request.offset if isinstance(request.offset, int) 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 isinstance(request.limit, int) else 500 + 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, + category=category, + supported_parameters=supported_parameters, + output_modalities=output_modalities, + sort=sort, + q=q, + input_modalities=input_modalities, + context=context, + min_price=min_price, + max_price=max_price, + arch=arch, + model_authors=model_authors, + providers=providers, + distillable=distillable, + zdr=zdr, + region=region, + min_output_price=min_output_price, + max_output_price=max_output_price, + min_age_days=min_age_days, + max_age_days=max_age_days, + min_intelligence_index=min_intelligence_index, + max_intelligence_index=max_intelligence_index, + min_coding_index=min_coding_index, + max_coding_index=max_coding_index, + min_agentic_index=min_agentic_index, + max_agentic_index=max_agentic_index, + min_tool_success_rate=min_tool_success_rate, + max_tool_success_rate=max_tool_success_rate, + retries=retries, + server_url=server_url, + timeout_ms=timeout_ms, + http_headers=http_headers, + ) + response_data: Any = None if utils.match_response(http_res, "200", "application/json"): - return unmarshal_json_response(components.ModelsListResponse, http_res) + return operations.GetModelsResponse( + result=unmarshal_json_response(components.ModelsListResponse, http_res), + next=next_func, + ) if utils.match_response(http_res, "400", "application/json"): response_data = unmarshal_json_response( errors.BadRequestResponseErrorData, http_res @@ -914,11 +1044,13 @@ def list_for_user( http_referer: Optional[str] = None, x_open_router_title: Optional[str] = None, x_open_router_categories: Optional[str] = None, + offset: Optional[int] = 0, + limit: Optional[int] = 500, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, http_headers: Optional[Mapping[str, str]] = None, - ) -> components.ModelsListResponse: + ) -> Optional[operations.ListModelsUserResponse]: r"""List models filtered by user provider preferences, privacy settings, and guardrails List models filtered by user provider preferences, [privacy settings](https://openrouter.ai/docs/guides/privacy/provider-logging), and [guardrails](https://openrouter.ai/docs/guides/features/guardrails). If requesting through `eu.openrouter.ai/api/v1/...` the results will be filtered to models that satisfy [EU in-region routing](https://openrouter.ai/docs/guides/privacy/provider-logging#enterprise-eu-in-region-routing). @@ -931,6 +1063,8 @@ def list_for_user( :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. When both offset and limit are omitted, the full list is returned + :param limit: Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is 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 @@ -950,6 +1084,8 @@ def list_for_user( 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( @@ -1003,9 +1139,40 @@ def list_for_user( retry_config=retry_config, ) + def next_func() -> Optional[operations.ListModelsUserResponse]: + body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]]) + + offset = request.offset if isinstance(request.offset, int) 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 isinstance(request.limit, int) else 500 + if len(results[0]) < limit_: + return None + next_offset = offset + len(results[0]) + + return self.list_for_user( + security=security, + 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, + server_url=server_url, + timeout_ms=timeout_ms, + http_headers=http_headers, + ) + response_data: Any = None if utils.match_response(http_res, "200", "application/json"): - return unmarshal_json_response(components.ModelsListResponse, http_res) + return operations.ListModelsUserResponse( + result=unmarshal_json_response(components.ModelsListResponse, http_res), + next=next_func, + ) if utils.match_response(http_res, "401", "application/json"): response_data = unmarshal_json_response( errors.UnauthorizedResponseErrorData, http_res @@ -1044,11 +1211,13 @@ async def list_for_user_async( http_referer: Optional[str] = None, x_open_router_title: Optional[str] = None, x_open_router_categories: Optional[str] = None, + offset: Optional[int] = 0, + limit: Optional[int] = 500, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, http_headers: Optional[Mapping[str, str]] = None, - ) -> components.ModelsListResponse: + ) -> Optional[operations.ListModelsUserResponse]: r"""List models filtered by user provider preferences, privacy settings, and guardrails List models filtered by user provider preferences, [privacy settings](https://openrouter.ai/docs/guides/privacy/provider-logging), and [guardrails](https://openrouter.ai/docs/guides/features/guardrails). If requesting through `eu.openrouter.ai/api/v1/...` the results will be filtered to models that satisfy [EU in-region routing](https://openrouter.ai/docs/guides/privacy/provider-logging#enterprise-eu-in-region-routing). @@ -1061,6 +1230,8 @@ async def list_for_user_async( :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. When both offset and limit are omitted, the full list is returned + :param limit: Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is 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 @@ -1080,6 +1251,8 @@ async def list_for_user_async( 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( @@ -1133,9 +1306,43 @@ async def list_for_user_async( retry_config=retry_config, ) + def next_func() -> Awaitable[Optional[operations.ListModelsUserResponse]]: + body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]]) + + async def empty_result(): + return None + + offset = request.offset if isinstance(request.offset, int) 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 isinstance(request.limit, int) else 500 + if len(results[0]) < limit_: + return empty_result() + next_offset = offset + len(results[0]) + + return self.list_for_user_async( + security=security, + 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, + server_url=server_url, + timeout_ms=timeout_ms, + http_headers=http_headers, + ) + response_data: Any = None if utils.match_response(http_res, "200", "application/json"): - return unmarshal_json_response(components.ModelsListResponse, http_res) + return operations.ListModelsUserResponse( + result=unmarshal_json_response(components.ModelsListResponse, http_res), + next=next_func, + ) if utils.match_response(http_res, "401", "application/json"): response_data = unmarshal_json_response( errors.UnauthorizedResponseErrorData, http_res diff --git a/src/openrouter/observability.py b/src/openrouter/observability.py index a1dea9b4..67318c78 100644 --- a/src/openrouter/observability.py +++ b/src/openrouter/observability.py @@ -19,8 +19,8 @@ def list( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, workspace_id: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, @@ -126,7 +126,7 @@ def next_func() -> Optional[operations.ListObservabilityDestinationsResponse]: results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return None - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return None next_offset = offset + len(results[0]) @@ -181,8 +181,8 @@ async def list_async( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, workspace_id: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, @@ -293,7 +293,7 @@ async def empty_result(): results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return empty_result() - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return empty_result() next_offset = offset + len(results[0]) @@ -355,8 +355,8 @@ def create( enabled: Optional[bool] = True, filter_rules: OptionalNullable[ Union[ - components.ObservabilityFilterRulesConfig, - components.ObservabilityFilterRulesConfigTypedDict, + components.ObservabilityFilterRulesConfigNullable, + components.ObservabilityFilterRulesConfigNullableTypedDict, ] ] = UNSET, privacy_mode: Optional[bool] = False, @@ -414,7 +414,7 @@ def create( enabled=enabled, filter_rules=utils.get_pydantic_model( filter_rules, - OptionalNullable[components.ObservabilityFilterRulesConfig], + OptionalNullable[components.ObservabilityFilterRulesConfigNullable], ), name=name, privacy_mode=privacy_mode, @@ -538,8 +538,8 @@ async def create_async( enabled: Optional[bool] = True, filter_rules: OptionalNullable[ Union[ - components.ObservabilityFilterRulesConfig, - components.ObservabilityFilterRulesConfigTypedDict, + components.ObservabilityFilterRulesConfigNullable, + components.ObservabilityFilterRulesConfigNullableTypedDict, ] ] = UNSET, privacy_mode: Optional[bool] = False, @@ -597,7 +597,7 @@ async def create_async( enabled=enabled, filter_rules=utils.get_pydantic_model( filter_rules, - OptionalNullable[components.ObservabilityFilterRulesConfig], + OptionalNullable[components.ObservabilityFilterRulesConfigNullable], ), name=name, privacy_mode=privacy_mode, @@ -1240,8 +1240,8 @@ def update( enabled: Optional[bool] = None, filter_rules: OptionalNullable[ Union[ - components.ObservabilityFilterRulesConfig, - components.ObservabilityFilterRulesConfigTypedDict, + components.ObservabilityFilterRulesConfigNullable, + components.ObservabilityFilterRulesConfigNullableTypedDict, ] ] = UNSET, name: Optional[str] = None, @@ -1299,7 +1299,7 @@ def update( enabled=enabled, filter_rules=utils.get_pydantic_model( filter_rules, - OptionalNullable[components.ObservabilityFilterRulesConfig], + OptionalNullable[components.ObservabilityFilterRulesConfigNullable], ), name=name, privacy_mode=privacy_mode, @@ -1420,8 +1420,8 @@ async def update_async( enabled: Optional[bool] = None, filter_rules: OptionalNullable[ Union[ - components.ObservabilityFilterRulesConfig, - components.ObservabilityFilterRulesConfigTypedDict, + components.ObservabilityFilterRulesConfigNullable, + components.ObservabilityFilterRulesConfigNullableTypedDict, ] ] = UNSET, name: Optional[str] = None, @@ -1479,7 +1479,7 @@ async def update_async( enabled=enabled, filter_rules=utils.get_pydantic_model( filter_rules, - OptionalNullable[components.ObservabilityFilterRulesConfig], + OptionalNullable[components.ObservabilityFilterRulesConfigNullable], ), name=name, privacy_mode=privacy_mode, diff --git a/src/openrouter/operations/__init__.py b/src/openrouter/operations/__init__.py index 134f9b32..95999d26 100644 --- a/src/openrouter/operations/__init__.py +++ b/src/openrouter/operations/__init__.py @@ -92,8 +92,6 @@ ContentText, ContentTextTypedDict, ContentTypedDict, - CostDetails, - CostDetailsTypedDict, CreateEmbeddingsData, CreateEmbeddingsDataTypedDict, CreateEmbeddingsGlobals, @@ -389,6 +387,8 @@ GetModelsGlobalsTypedDict, GetModelsRequest, GetModelsRequestTypedDict, + GetModelsResponse, + GetModelsResponseTypedDict, GetModelsSort, Region, Zdr, @@ -471,6 +471,8 @@ ListEmbeddingsModelsGlobalsTypedDict, ListEmbeddingsModelsRequest, ListEmbeddingsModelsRequestTypedDict, + ListEmbeddingsModelsResponse, + ListEmbeddingsModelsResponseTypedDict, ) from .listendpoints import ( ListEndpointsGlobals, @@ -565,6 +567,8 @@ ListModelsUserGlobalsTypedDict, ListModelsUserRequest, ListModelsUserRequestTypedDict, + ListModelsUserResponse, + ListModelsUserResponseTypedDict, ListModelsUserSecurity, ListModelsUserSecurityTypedDict, ) @@ -797,8 +801,6 @@ "ContentTextTypedDict", "ContentTypedDict", "ContextBucket", - "CostDetails", - "CostDetailsTypedDict", "CreateAudioSpeechGlobals", "CreateAudioSpeechGlobalsTypedDict", "CreateAudioSpeechRequest", @@ -1036,6 +1038,8 @@ "GetModelsGlobalsTypedDict", "GetModelsRequest", "GetModelsRequestTypedDict", + "GetModelsResponse", + "GetModelsResponseTypedDict", "GetModelsSort", "GetObservabilityDestinationGlobals", "GetObservabilityDestinationGlobalsTypedDict", @@ -1093,6 +1097,8 @@ "ListEmbeddingsModelsGlobalsTypedDict", "ListEmbeddingsModelsRequest", "ListEmbeddingsModelsRequestTypedDict", + "ListEmbeddingsModelsResponse", + "ListEmbeddingsModelsResponseTypedDict", "ListEndpointsGlobals", "ListEndpointsGlobalsTypedDict", "ListEndpointsRequest", @@ -1163,6 +1169,8 @@ "ListModelsUserGlobalsTypedDict", "ListModelsUserRequest", "ListModelsUserRequestTypedDict", + "ListModelsUserResponse", + "ListModelsUserResponseTypedDict", "ListModelsUserSecurity", "ListModelsUserSecurityTypedDict", "ListObservabilityDestinationsGlobals", @@ -1398,8 +1406,6 @@ "ContentText": ".createembeddings", "ContentTextTypedDict": ".createembeddings", "ContentTypedDict": ".createembeddings", - "CostDetails": ".createembeddings", - "CostDetailsTypedDict": ".createembeddings", "CreateEmbeddingsData": ".createembeddings", "CreateEmbeddingsDataTypedDict": ".createembeddings", "CreateEmbeddingsGlobals": ".createembeddings", @@ -1631,6 +1637,8 @@ "GetModelsGlobalsTypedDict": ".getmodels", "GetModelsRequest": ".getmodels", "GetModelsRequestTypedDict": ".getmodels", + "GetModelsResponse": ".getmodels", + "GetModelsResponseTypedDict": ".getmodels", "GetModelsSort": ".getmodels", "Region": ".getmodels", "Zdr": ".getmodels", @@ -1691,6 +1699,8 @@ "ListEmbeddingsModelsGlobalsTypedDict": ".listembeddingsmodels", "ListEmbeddingsModelsRequest": ".listembeddingsmodels", "ListEmbeddingsModelsRequestTypedDict": ".listembeddingsmodels", + "ListEmbeddingsModelsResponse": ".listembeddingsmodels", + "ListEmbeddingsModelsResponseTypedDict": ".listembeddingsmodels", "ListEndpointsGlobals": ".listendpoints", "ListEndpointsGlobalsTypedDict": ".listendpoints", "ListEndpointsRequest": ".listendpoints", @@ -1759,6 +1769,8 @@ "ListModelsUserGlobalsTypedDict": ".listmodelsuser", "ListModelsUserRequest": ".listmodelsuser", "ListModelsUserRequestTypedDict": ".listmodelsuser", + "ListModelsUserResponse": ".listmodelsuser", + "ListModelsUserResponseTypedDict": ".listmodelsuser", "ListModelsUserSecurity": ".listmodelsuser", "ListModelsUserSecurityTypedDict": ".listmodelsuser", "ListObservabilityDestinationsGlobals": ".listobservabilitydestinations", diff --git a/src/openrouter/operations/createembeddings.py b/src/openrouter/operations/createembeddings.py index 699e9867..a7fed8ea 100644 --- a/src/openrouter/operations/createembeddings.py +++ b/src/openrouter/operations/createembeddings.py @@ -5,6 +5,7 @@ contentpartinputaudio as components_contentpartinputaudio, contentpartinputfile as components_contentpartinputfile, contentpartinputvideo as components_contentpartinputvideo, + costdetails as components_costdetails, providerpreferences as components_providerpreferences, ) from openrouter.types import ( @@ -383,49 +384,6 @@ def serialize_model(self, handler): Object = Literal["list",] -class CostDetailsTypedDict(TypedDict): - r"""Breakdown of upstream inference costs""" - - upstream_inference_completions_cost: float - upstream_inference_prompt_cost: float - upstream_inference_cost: NotRequired[Nullable[float]] - - -class CostDetails(BaseModel): - r"""Breakdown of upstream inference costs""" - - upstream_inference_completions_cost: float - - upstream_inference_prompt_cost: float - - upstream_inference_cost: OptionalNullable[float] = UNSET - - @model_serializer(mode="wrap") - def serialize_model(self, handler): - optional_fields = set(["upstream_inference_cost"]) - nullable_fields = set(["upstream_inference_cost"]) - serialized = handler(self) - m = {} - - for n, f in type(self).model_fields.items(): - k = f.alias or n - val = serialized.get(k, serialized.get(n)) - is_nullable_and_explicitly_set = ( - k in nullable_fields - and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member - ) - - if val != UNSET_SENTINEL: - if ( - val is not None - or k not in optional_fields - or is_nullable_and_explicitly_set - ): - m[k] = val - - return m - - 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.""" @@ -493,7 +451,7 @@ class CreateEmbeddingsUsageTypedDict(TypedDict): r"""Total number of tokens used""" cost: NotRequired[float] r"""Cost of the request in credits""" - cost_details: NotRequired[Nullable[CostDetailsTypedDict]] + cost_details: NotRequired[Nullable[components_costdetails.CostDetailsTypedDict]] r"""Breakdown of upstream inference costs""" is_byok: NotRequired[bool] r"""Whether a request was made using a Bring Your Own Key configuration""" @@ -513,7 +471,7 @@ class CreateEmbeddingsUsage(BaseModel): cost: Optional[float] = None r"""Cost of the request in credits""" - cost_details: OptionalNullable[CostDetails] = UNSET + cost_details: OptionalNullable[components_costdetails.CostDetails] = UNSET r"""Breakdown of upstream inference costs""" is_byok: Optional[bool] = None diff --git a/src/openrouter/operations/getmodels.py b/src/openrouter/operations/getmodels.py index dc16709a..de855463 100644 --- a/src/openrouter/operations/getmodels.py +++ b/src/openrouter/operations/getmodels.py @@ -1,6 +1,7 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations +from openrouter.components import modelslistresponse as components_modelslistresponse from openrouter.types import ( BaseModel, Nullable, @@ -12,7 +13,7 @@ from openrouter.utils import FieldMetadata, HeaderMetadata, QueryParamMetadata import pydantic from pydantic import model_serializer -from typing import Literal, Optional, Union +from typing import Awaitable, Callable, Literal, Optional, Union from typing_extensions import Annotated, NotRequired, TypedDict @@ -152,6 +153,10 @@ class GetModelsRequestTypedDict(TypedDict): 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. When both offset and limit are omitted, the full list is returned""" + limit: NotRequired[int] + r"""Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned""" category: NotRequired[GetModelsCategory] r"""Filter models by use case category""" supported_parameters: NotRequired[str] @@ -237,6 +242,18 @@ class GetModelsRequest(BaseModel): """ + offset: Annotated[ + Optional[int], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = 0 + r"""Number of records to skip for pagination. When both offset and limit are omitted, the full list is returned""" + + limit: Annotated[ + Optional[int], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = 500 + r"""Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned""" + category: Annotated[ Optional[GetModelsCategory], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), @@ -406,6 +423,8 @@ def serialize_model(self, handler): "HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories", + "offset", + "limit", "category", "supported_parameters", "output_modalities", @@ -473,3 +492,16 @@ def serialize_model(self, handler): m[k] = val return m + + +class GetModelsResponseTypedDict(TypedDict): + result: components_modelslistresponse.ModelsListResponseTypedDict + + +class GetModelsResponse(BaseModel): + next: Union[ + Callable[[], Optional[GetModelsResponse]], + Callable[[], Awaitable[Optional[GetModelsResponse]]], + ] + + result: components_modelslistresponse.ModelsListResponse diff --git a/src/openrouter/operations/listbyokkeys.py b/src/openrouter/operations/listbyokkeys.py index 67d30bcc..46c012e7 100644 --- a/src/openrouter/operations/listbyokkeys.py +++ b/src/openrouter/operations/listbyokkeys.py @@ -230,13 +230,13 @@ class ListBYOKKeysRequest(BaseModel): offset: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 0 r"""Number of records to skip for pagination""" limit: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 50 r"""Maximum number of records to return (max 100)""" workspace_id: Annotated[ diff --git a/src/openrouter/operations/listembeddingsmodels.py b/src/openrouter/operations/listembeddingsmodels.py index a019232d..016f0b9b 100644 --- a/src/openrouter/operations/listembeddingsmodels.py +++ b/src/openrouter/operations/listembeddingsmodels.py @@ -1,11 +1,12 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations +from openrouter.components import modelslistresponse as components_modelslistresponse from openrouter.types import BaseModel, UNSET_SENTINEL -from openrouter.utils import FieldMetadata, HeaderMetadata +from openrouter.utils import FieldMetadata, HeaderMetadata, QueryParamMetadata import pydantic from pydantic import model_serializer -from typing import Optional +from typing import Awaitable, Callable, Optional, Union from typing_extensions import Annotated, NotRequired, TypedDict @@ -87,6 +88,10 @@ class ListEmbeddingsModelsRequestTypedDict(TypedDict): 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. When both offset and limit are omitted, the full list is returned""" + limit: NotRequired[int] + r"""Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned""" class ListEmbeddingsModelsRequest(BaseModel): @@ -118,10 +123,28 @@ class ListEmbeddingsModelsRequest(BaseModel): """ + offset: Annotated[ + Optional[int], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = 0 + r"""Number of records to skip for pagination. When both offset and limit are omitted, the full list is returned""" + + limit: Annotated[ + Optional[int], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = 500 + r"""Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned""" + @model_serializer(mode="wrap") def serialize_model(self, handler): optional_fields = set( - ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"] + [ + "HTTP-Referer", + "X-OpenRouter-Title", + "X-OpenRouter-Categories", + "offset", + "limit", + ] ) serialized = handler(self) m = {} @@ -135,3 +158,16 @@ def serialize_model(self, handler): m[k] = val return m + + +class ListEmbeddingsModelsResponseTypedDict(TypedDict): + result: components_modelslistresponse.ModelsListResponseTypedDict + + +class ListEmbeddingsModelsResponse(BaseModel): + next: Union[ + Callable[[], Optional[ListEmbeddingsModelsResponse]], + Callable[[], Awaitable[Optional[ListEmbeddingsModelsResponse]]], + ] + + result: components_modelslistresponse.ModelsListResponse diff --git a/src/openrouter/operations/listguardrailkeyassignments.py b/src/openrouter/operations/listguardrailkeyassignments.py index e7a2c31f..90f26722 100644 --- a/src/openrouter/operations/listguardrailkeyassignments.py +++ b/src/openrouter/operations/listguardrailkeyassignments.py @@ -140,13 +140,13 @@ class ListGuardrailKeyAssignmentsRequest(BaseModel): offset: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 0 r"""Number of records to skip for pagination""" limit: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 50 r"""Maximum number of records to return (max 100)""" @model_serializer(mode="wrap") diff --git a/src/openrouter/operations/listguardrailmemberassignments.py b/src/openrouter/operations/listguardrailmemberassignments.py index 84076b74..4ff57806 100644 --- a/src/openrouter/operations/listguardrailmemberassignments.py +++ b/src/openrouter/operations/listguardrailmemberassignments.py @@ -140,13 +140,13 @@ class ListGuardrailMemberAssignmentsRequest(BaseModel): offset: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 0 r"""Number of records to skip for pagination""" limit: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 50 r"""Maximum number of records to return (max 100)""" @model_serializer(mode="wrap") diff --git a/src/openrouter/operations/listguardrails.py b/src/openrouter/operations/listguardrails.py index 461e6914..1e36035b 100644 --- a/src/openrouter/operations/listguardrails.py +++ b/src/openrouter/operations/listguardrails.py @@ -130,13 +130,13 @@ class ListGuardrailsRequest(BaseModel): offset: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 0 r"""Number of records to skip for pagination""" limit: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 50 r"""Maximum number of records to return (max 100)""" workspace_id: Annotated[ diff --git a/src/openrouter/operations/listkeyassignments.py b/src/openrouter/operations/listkeyassignments.py index 2aee3fc4..f9ccb3da 100644 --- a/src/openrouter/operations/listkeyassignments.py +++ b/src/openrouter/operations/listkeyassignments.py @@ -128,13 +128,13 @@ class ListKeyAssignmentsRequest(BaseModel): offset: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 0 r"""Number of records to skip for pagination""" limit: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 50 r"""Maximum number of records to return (max 100)""" @model_serializer(mode="wrap") diff --git a/src/openrouter/operations/listmemberassignments.py b/src/openrouter/operations/listmemberassignments.py index f8e0b658..60c04bea 100644 --- a/src/openrouter/operations/listmemberassignments.py +++ b/src/openrouter/operations/listmemberassignments.py @@ -128,13 +128,13 @@ class ListMemberAssignmentsRequest(BaseModel): offset: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 0 r"""Number of records to skip for pagination""" limit: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 50 r"""Maximum number of records to return (max 100)""" @model_serializer(mode="wrap") diff --git a/src/openrouter/operations/listmodelsuser.py b/src/openrouter/operations/listmodelsuser.py index 6070772e..d2a24e43 100644 --- a/src/openrouter/operations/listmodelsuser.py +++ b/src/openrouter/operations/listmodelsuser.py @@ -1,11 +1,17 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations +from openrouter.components import modelslistresponse as components_modelslistresponse from openrouter.types import BaseModel, UNSET_SENTINEL -from openrouter.utils import FieldMetadata, HeaderMetadata, SecurityMetadata +from openrouter.utils import ( + FieldMetadata, + HeaderMetadata, + QueryParamMetadata, + SecurityMetadata, +) import pydantic from pydantic import model_serializer -from typing import Optional +from typing import Awaitable, Callable, Optional, Union from typing_extensions import Annotated, NotRequired, TypedDict @@ -105,6 +111,10 @@ class ListModelsUserRequestTypedDict(TypedDict): 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. When both offset and limit are omitted, the full list is returned""" + limit: NotRequired[int] + r"""Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned""" class ListModelsUserRequest(BaseModel): @@ -136,10 +146,28 @@ class ListModelsUserRequest(BaseModel): """ + offset: Annotated[ + Optional[int], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = 0 + r"""Number of records to skip for pagination. When both offset and limit are omitted, the full list is returned""" + + limit: Annotated[ + Optional[int], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = 500 + r"""Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned""" + @model_serializer(mode="wrap") def serialize_model(self, handler): optional_fields = set( - ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"] + [ + "HTTP-Referer", + "X-OpenRouter-Title", + "X-OpenRouter-Categories", + "offset", + "limit", + ] ) serialized = handler(self) m = {} @@ -153,3 +181,16 @@ def serialize_model(self, handler): m[k] = val return m + + +class ListModelsUserResponseTypedDict(TypedDict): + result: components_modelslistresponse.ModelsListResponseTypedDict + + +class ListModelsUserResponse(BaseModel): + next: Union[ + Callable[[], Optional[ListModelsUserResponse]], + Callable[[], Awaitable[Optional[ListModelsUserResponse]]], + ] + + result: components_modelslistresponse.ModelsListResponse diff --git a/src/openrouter/operations/listobservabilitydestinations.py b/src/openrouter/operations/listobservabilitydestinations.py index 465e357c..818784f8 100644 --- a/src/openrouter/operations/listobservabilitydestinations.py +++ b/src/openrouter/operations/listobservabilitydestinations.py @@ -130,13 +130,13 @@ class ListObservabilityDestinationsRequest(BaseModel): offset: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 0 r"""Number of records to skip for pagination""" limit: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 50 r"""Maximum number of records to return (max 100)""" workspace_id: Annotated[ diff --git a/src/openrouter/operations/listorganizationmembers.py b/src/openrouter/operations/listorganizationmembers.py index 15662f48..06825eea 100644 --- a/src/openrouter/operations/listorganizationmembers.py +++ b/src/openrouter/operations/listorganizationmembers.py @@ -125,13 +125,13 @@ class ListOrganizationMembersRequest(BaseModel): offset: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 0 r"""Number of records to skip for pagination""" limit: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 50 r"""Maximum number of records to return (max 100)""" @model_serializer(mode="wrap") diff --git a/src/openrouter/operations/listpresets.py b/src/openrouter/operations/listpresets.py index bf21a246..23c66e84 100644 --- a/src/openrouter/operations/listpresets.py +++ b/src/openrouter/operations/listpresets.py @@ -126,13 +126,13 @@ class ListPresetsRequest(BaseModel): offset: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 0 r"""Number of records to skip for pagination""" limit: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 50 r"""Maximum number of records to return (max 100)""" @model_serializer(mode="wrap") diff --git a/src/openrouter/operations/listpresetversions.py b/src/openrouter/operations/listpresetversions.py index 36052fb3..1224fee0 100644 --- a/src/openrouter/operations/listpresetversions.py +++ b/src/openrouter/operations/listpresetversions.py @@ -140,13 +140,13 @@ class ListPresetVersionsRequest(BaseModel): offset: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 0 r"""Number of records to skip for pagination""" limit: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 50 r"""Maximum number of records to return (max 100)""" @model_serializer(mode="wrap") diff --git a/src/openrouter/operations/listworkspacemembers.py b/src/openrouter/operations/listworkspacemembers.py index 9a8706fc..ff41be4a 100644 --- a/src/openrouter/operations/listworkspacemembers.py +++ b/src/openrouter/operations/listworkspacemembers.py @@ -140,13 +140,13 @@ class ListWorkspaceMembersRequest(BaseModel): offset: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 0 r"""Number of records to skip for pagination""" limit: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 50 r"""Maximum number of records to return (max 100)""" @model_serializer(mode="wrap") diff --git a/src/openrouter/operations/listworkspaces.py b/src/openrouter/operations/listworkspaces.py index a242ff32..59f628e9 100644 --- a/src/openrouter/operations/listworkspaces.py +++ b/src/openrouter/operations/listworkspaces.py @@ -128,13 +128,13 @@ class ListWorkspacesRequest(BaseModel): offset: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 0 r"""Number of records to skip for pagination""" limit: Annotated[ Optional[int], FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), - ] = None + ] = 50 r"""Maximum number of records to return (max 100)""" @model_serializer(mode="wrap") diff --git a/src/openrouter/organization.py b/src/openrouter/organization.py index d24bfa86..31c74edd 100644 --- a/src/openrouter/organization.py +++ b/src/openrouter/organization.py @@ -19,8 +19,8 @@ def list_members( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -123,7 +123,7 @@ def next_func() -> Optional[operations.ListOrganizationMembersResponse]: results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return None - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return None next_offset = offset + len(results[0]) @@ -182,8 +182,8 @@ async def list_members_async( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -291,7 +291,7 @@ async def empty_result(): results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return empty_result() - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return empty_result() next_offset = offset + len(results[0]) diff --git a/src/openrouter/presets.py b/src/openrouter/presets.py index 13b309db..250c20d1 100644 --- a/src/openrouter/presets.py +++ b/src/openrouter/presets.py @@ -19,8 +19,8 @@ def list( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -126,7 +126,7 @@ def next_func() -> Optional[operations.ListPresetsResponse]: results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return None - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return None next_offset = offset + len(results[0]) @@ -185,8 +185,8 @@ async def list_async( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -295,7 +295,7 @@ async def empty_result(): results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return empty_result() - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return empty_result() next_offset = offset + len(results[0]) @@ -2649,8 +2649,8 @@ def list_versions( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -2758,7 +2758,7 @@ def next_func() -> Optional[operations.ListPresetVersionsResponse]: results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return None - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return None next_offset = offset + len(results[0]) @@ -2824,8 +2824,8 @@ async def list_versions_async( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -2936,7 +2936,7 @@ async def empty_result(): results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return empty_result() - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return empty_result() next_offset = offset + len(results[0]) diff --git a/src/openrouter/workspaces.py b/src/openrouter/workspaces.py index f3cf390c..d2088f5a 100644 --- a/src/openrouter/workspaces.py +++ b/src/openrouter/workspaces.py @@ -19,8 +19,8 @@ def list( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -123,7 +123,7 @@ def next_func() -> Optional[operations.ListWorkspacesResponse]: results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return None - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return None next_offset = offset + len(results[0]) @@ -177,8 +177,8 @@ async def list_async( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -284,7 +284,7 @@ async def empty_result(): results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return empty_result() - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return empty_result() next_offset = offset + len(results[0]) @@ -2409,8 +2409,8 @@ def list_members( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -2515,7 +2515,7 @@ def next_func() -> Optional[operations.ListWorkspaceMembersResponse]: results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return None - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return None next_offset = offset + len(results[0]) @@ -2581,8 +2581,8 @@ async def list_members_async( 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, + offset: Optional[int] = 0, + limit: Optional[int] = 50, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -2690,7 +2690,7 @@ async def empty_result(): results = JSONPath("$.data").parse(body) if len(results) == 0 or len(results[0]) == 0: return empty_result() - limit_ = request.limit if isinstance(request.limit, int) else 0 + limit_ = request.limit if isinstance(request.limit, int) else 50 if len(results[0]) < limit_: return empty_result() next_offset = offset + len(results[0]) diff --git a/uv.lock b/uv.lock index 78390fc6..fa772e2f 100644 --- a/uv.lock +++ b/uv.lock @@ -213,7 +213,7 @@ wheels = [ [[package]] name = "openrouter" -version = "0.11.23" +version = "0.11.24" source = { editable = "." } dependencies = [ { name = "httpcore" },