From 0b1f4f10bceec441f5531e3e1d6eeb1e3c3c5045 Mon Sep 17 00:00:00 2001 From: speakeasybot Date: Thu, 30 Jul 2026 19:25:27 +0000 Subject: [PATCH 1/3] ## Python SDK Changes: * `open_router.scim.list_mappings()`: **Added** * `open_router.scim.create()`: **Added** * `open_router.scim.delete()`: **Added** * `open_router.scim.read()`: **Added** * `open_router.scim.update()`: **Added** * `open_router.scim.list_groups()`: **Added** --- .speakeasy/gen.lock | 325 ++- .speakeasy/gen.yaml | 2 +- .speakeasy/out.openapi.yaml | 595 ++++++ .speakeasy/workflow.lock | 10 +- RELEASES.md | 12 +- .../createscimgroupmappingrequest.mdx | 11 + .../createscimgroupmappingrequestrole.mdx | 20 + .../createscimgroupmappingresponse.mdx | 9 + .../deletescimgroupmappingresponse.mdx | 9 + .../getscimgroupmappingresponse.mdx | 9 + .../listscimgroupmappingsresponse.mdx | 10 + docs/components/listscimgroupsresponse.mdx | 10 + docs/components/scimgroup.mdx | 14 + docs/components/scimgroupmapping.mdx | 15 + docs/components/scimgroupmappingrole.mdx | 20 + .../updatescimgroupmappingrequest.mdx | 9 + .../updatescimgroupmappingrequestrole.mdx | 20 + .../updatescimgroupmappingresponse.mdx | 9 + .../createscimgroupmappingglobals.mdx | 11 + .../createscimgroupmappingrequest.mdx | 12 + .../deletescimgroupmappingglobals.mdx | 11 + .../deletescimgroupmappingrequest.mdx | 13 + .../operations/getscimgroupmappingglobals.mdx | 11 + .../operations/getscimgroupmappingrequest.mdx | 12 + docs/operations/keepmembers.mdx | 21 + docs/operations/keepmembersenum.mdx | 20 + .../listscimgroupmappingsglobals.mdx | 11 + .../listscimgroupmappingsrequest.mdx | 13 + .../listscimgroupmappingsresponse.mdx | 9 + docs/operations/listscimgroupsglobals.mdx | 11 + docs/operations/listscimgroupsrequest.mdx | 13 + docs/operations/listscimgroupsresponse.mdx | 9 + .../updatescimgroupmappingglobals.mdx | 11 + .../updatescimgroupmappingrequest.mdx | 13 + docs/sdks/scim/README.mdx | 319 +++ pyproject.toml | 2 +- src/openrouter/_version.py | 4 +- src/openrouter/components/__init__.py | 86 + .../createscimgroupmappingrequest.py | 29 + .../createscimgroupmappingresponse.py | 14 + .../deletescimgroupmappingresponse.py | 26 + .../components/getscimgroupmappingresponse.py | 14 + .../listscimgroupmappingsresponse.py | 18 + .../components/listscimgroupsresponse.py | 18 + src/openrouter/components/scimgroup.py | 43 + src/openrouter/components/scimgroupmapping.py | 41 + .../updatescimgroupmappingrequest.py | 23 + .../updatescimgroupmappingresponse.py | 14 + src/openrouter/operations/__init__.py | 105 + .../operations/createscimgroupmapping.py | 148 ++ .../operations/deletescimgroupmapping.py | 173 ++ .../operations/getscimgroupmapping.py | 142 ++ .../operations/listscimgroupmappings.py | 186 ++ src/openrouter/operations/listscimgroups.py | 184 ++ .../operations/updatescimgroupmapping.py | 158 ++ src/openrouter/scim.py | 1814 +++++++++++++++++ src/openrouter/sdk.py | 4 + uv.lock | 2 +- 58 files changed, 4850 insertions(+), 27 deletions(-) create mode 100644 docs/components/createscimgroupmappingrequest.mdx create mode 100644 docs/components/createscimgroupmappingrequestrole.mdx create mode 100644 docs/components/createscimgroupmappingresponse.mdx create mode 100644 docs/components/deletescimgroupmappingresponse.mdx create mode 100644 docs/components/getscimgroupmappingresponse.mdx create mode 100644 docs/components/listscimgroupmappingsresponse.mdx create mode 100644 docs/components/listscimgroupsresponse.mdx create mode 100644 docs/components/scimgroup.mdx create mode 100644 docs/components/scimgroupmapping.mdx create mode 100644 docs/components/scimgroupmappingrole.mdx create mode 100644 docs/components/updatescimgroupmappingrequest.mdx create mode 100644 docs/components/updatescimgroupmappingrequestrole.mdx create mode 100644 docs/components/updatescimgroupmappingresponse.mdx create mode 100644 docs/operations/createscimgroupmappingglobals.mdx create mode 100644 docs/operations/createscimgroupmappingrequest.mdx create mode 100644 docs/operations/deletescimgroupmappingglobals.mdx create mode 100644 docs/operations/deletescimgroupmappingrequest.mdx create mode 100644 docs/operations/getscimgroupmappingglobals.mdx create mode 100644 docs/operations/getscimgroupmappingrequest.mdx create mode 100644 docs/operations/keepmembers.mdx create mode 100644 docs/operations/keepmembersenum.mdx create mode 100644 docs/operations/listscimgroupmappingsglobals.mdx create mode 100644 docs/operations/listscimgroupmappingsrequest.mdx create mode 100644 docs/operations/listscimgroupmappingsresponse.mdx create mode 100644 docs/operations/listscimgroupsglobals.mdx create mode 100644 docs/operations/listscimgroupsrequest.mdx create mode 100644 docs/operations/listscimgroupsresponse.mdx create mode 100644 docs/operations/updatescimgroupmappingglobals.mdx create mode 100644 docs/operations/updatescimgroupmappingrequest.mdx create mode 100644 docs/sdks/scim/README.mdx create mode 100644 src/openrouter/components/createscimgroupmappingrequest.py create mode 100644 src/openrouter/components/createscimgroupmappingresponse.py create mode 100644 src/openrouter/components/deletescimgroupmappingresponse.py create mode 100644 src/openrouter/components/getscimgroupmappingresponse.py create mode 100644 src/openrouter/components/listscimgroupmappingsresponse.py create mode 100644 src/openrouter/components/listscimgroupsresponse.py create mode 100644 src/openrouter/components/scimgroup.py create mode 100644 src/openrouter/components/scimgroupmapping.py create mode 100644 src/openrouter/components/updatescimgroupmappingrequest.py create mode 100644 src/openrouter/components/updatescimgroupmappingresponse.py create mode 100644 src/openrouter/operations/createscimgroupmapping.py create mode 100644 src/openrouter/operations/deletescimgroupmapping.py create mode 100644 src/openrouter/operations/getscimgroupmapping.py create mode 100644 src/openrouter/operations/listscimgroupmappings.py create mode 100644 src/openrouter/operations/listscimgroups.py create mode 100644 src/openrouter/operations/updatescimgroupmapping.py create mode 100644 src/openrouter/scim.py diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index fa7f411d..27d776f5 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: e57df319c7e9d4d6b1220f745af8aacd + docChecksum: a06c6ca0e6a2702dc5961d1fe352effd docVersion: 1.0.0 speakeasyVersion: 1.787.0 generationVersion: 2.914.0 - releaseVersion: 1.1.19 - configChecksum: 24829920a2633e943ff596045c400ea5 + releaseVersion: 1.1.20 + configChecksum: b90e24294499df16fce0f0318e81d5b5 repoURL: https://github.com/OpenRouterTeam/python-sdk.git installationURL: https://github.com/OpenRouterTeam/python-sdk.git published: true persistentEdits: - generation_id: 2c61b687-79d3-4063-aaf5-7909ccbf31a3 - pristine_commit_hash: f28b02a40adab635845384852965e0cf2f1d5159 - pristine_tree_hash: c37fafe899dcc3ae24c84ed5baf89f5182b87b5e + generation_id: d95362c8-539d-469e-8ec3-61350209cdd2 + pristine_commit_hash: 38e60620bf6e9859508e7fb78da53aef3019b646 + pristine_tree_hash: de05b8232a25e6961245f9f490f5756b338b527d features: python: acceptHeaders: 3.0.0 @@ -1520,6 +1520,18 @@ trackedFiles: id: ed0298bf47bf last_write_checksum: sha1:01fc963af14788ca0453a09fe4f7a60e4420244a pristine_git_object: c31f263d23205ebfa16eb7e4ae5f33a11fb19764 + docs/components/createscimgroupmappingrequest.mdx: + id: 652e24fba424 + last_write_checksum: sha1:cc05315f9faccdaf7a2acf77f4eb1099a355dc18 + pristine_git_object: 5ad1269cb225d00b37bf0b0e83461bf338d351a5 + docs/components/createscimgroupmappingrequestrole.mdx: + id: 64eac132ca80 + last_write_checksum: sha1:6b13026c589b184b01bee2b01555684c5ad5b424 + pristine_git_object: f49282c436684f6846640e89c6bbfe52b3cba3b0 + docs/components/createscimgroupmappingresponse.mdx: + id: 1343f81fb7f9 + last_write_checksum: sha1:405c1e9143c6d51cebda7e415fb3b981da5e6c83 + pristine_git_object: 9ac0db3fbdb1995b37cbe28015dc24425af0660e docs/components/createworkspacerequest.mdx: id: ea85d6684017 last_write_checksum: sha1:3fd0555fe82dbdff103995079630e6bcb7503795 @@ -1644,6 +1656,10 @@ trackedFiles: id: 0f606ad36822 last_write_checksum: sha1:99269cd4a1958da8aa09cb828709ca8a734541ff pristine_git_object: 4d572b68887b463586c64afbe73498fe70b7f8d3 + docs/components/deletescimgroupmappingresponse.mdx: + id: 3cd77320d674 + last_write_checksum: sha1:b9812c5692d64fed0e49cde56531b83f57605bdc + pristine_git_object: 1ed4e164aa134141d79ad5122bac2c3a17f49799 docs/components/deleteworkspacebudgetresponse.mdx: id: 438cab4d21cf last_write_checksum: sha1:ee3e008f82c76693cb018712a921bcbf32bd28fd @@ -2144,6 +2160,10 @@ trackedFiles: id: ec319a1ab019 last_write_checksum: sha1:e3378700484df1b9d94e39e1dc1c1bb92490f3cd pristine_git_object: 6c3040281b154c953a524bed1bc45f1c6a8c4a40 + docs/components/getscimgroupmappingresponse.mdx: + id: 59edec5c97d1 + last_write_checksum: sha1:e60a199f393362e0182d4b5aa6218294e6c1af48 + pristine_git_object: 3031bf1129e51ad652a31b7142154b49fcc4560f docs/components/getworkspaceresponse.mdx: id: c8d0c4683019 last_write_checksum: sha1:5d10c3c4510cdc869a740deee62c31e9d2b02cc9 @@ -2680,6 +2700,14 @@ trackedFiles: id: a6eb4fad37a7 last_write_checksum: sha1:b6e1c0dacac17485fceedc43c19f73684c950149 pristine_git_object: 768df799d61dcc27510f108d123d4182e8f9eba3 + docs/components/listscimgroupmappingsresponse.mdx: + id: 7ac1b5a82a51 + last_write_checksum: sha1:421ce0c03370b2307f26cadafe5cc0d6429f6a2b + pristine_git_object: 14dff7d7d87ac91ff929b6b65dc1a23c1bd9feaf + docs/components/listscimgroupsresponse.mdx: + id: b7b20d46cf95 + last_write_checksum: sha1:fbdf5e1ed9651ac69b03e6b07d2f061480c15f0d + pristine_git_object: 6c0e6c816c9cc4a625f1d341773ede7888ea5a4d docs/components/listworkspacebudgetsresponse.mdx: id: be60b3aa222d last_write_checksum: sha1:69367bef2e3cfa9073fa41794a9af4a3344f16ee @@ -4548,6 +4576,18 @@ trackedFiles: id: 652b4ec56a02 last_write_checksum: sha1:689f48837abf4c42c787a7a531e751d32d1e3c67 pristine_git_object: 14a9f713694cfd61d45b800a23294d906482bca5 + docs/components/scimgroup.mdx: + id: bc553f57b8ab + last_write_checksum: sha1:9b9eefe3a298e57f01b751ffa8127d58306361fc + pristine_git_object: 98a3dfc33a4a396d72a562022c9cb3f2f4804b4f + docs/components/scimgroupmapping.mdx: + id: 26b9ee81ad86 + last_write_checksum: sha1:468f593496c4a7e0d3f88228f0fba57413828e3b + pristine_git_object: a1ee91fada7ed5ef87de2f70d8147e648468c546 + docs/components/scimgroupmappingrole.mdx: + id: 0306b7b3cf78 + last_write_checksum: sha1:93f2d7d1dc60a2b1635202d83ae9f00cc314e2e6 + pristine_git_object: 94331ee57f8ebf2b21903d5ebda22e0faf23044a docs/components/searchcontextsizeenum.mdx: id: b6b9a99acb5f last_write_checksum: sha1:177016c42a56a7a8dcd40caa7e9105ca7a6ea1cc @@ -5272,6 +5312,18 @@ trackedFiles: id: be9661c3676e last_write_checksum: sha1:c8fde493ab2c8285b0a800795e6106f2dbf3a63f pristine_git_object: c7aba4370fef4f13a7640e16f1a5404bc640f78c + docs/components/updatescimgroupmappingrequest.mdx: + id: 4318f4ed22f5 + last_write_checksum: sha1:80947ab2421cee078a515582fc49381bfc2641a7 + pristine_git_object: 8206d91829e104893ca4a2004f091241fbb357f8 + docs/components/updatescimgroupmappingrequestrole.mdx: + id: b41b96afd421 + last_write_checksum: sha1:0c939415a0735e827b1e5b178f57e36a716fce25 + pristine_git_object: 6f5f0062f163d23390cd625a82169be311e8956d + docs/components/updatescimgroupmappingresponse.mdx: + id: 6d2a71282cce + last_write_checksum: sha1:9f7c28e520631ac5b986fff0057ec961b5e59027 + pristine_git_object: 651230ce14044f67b3930628c9b0a4feaab3f7e6 docs/components/updateworkspacerequest.mdx: id: 9870d016bf28 last_write_checksum: sha1:b798c6d985770a44b3db121bb2aa6cd983ad5387 @@ -5860,6 +5912,14 @@ trackedFiles: id: 405549d19438 last_write_checksum: sha1:a2ef51d1e93fe47903803316e036fe579ff69903 pristine_git_object: a51a1e375e5ec80ff76a1e585477dd2f6ac43621 + docs/operations/createscimgroupmappingglobals.mdx: + id: 2888cafe124a + last_write_checksum: sha1:fa796c3c5ef48a275169e68eaba4ec4b6ed82827 + pristine_git_object: ee1187f7f1f4a6cd250b79e96faf0ff9fe78e430 + docs/operations/createscimgroupmappingrequest.mdx: + id: 0cf573a9a3b4 + last_write_checksum: sha1:19276108c153ccd0d96cb8330f559085ed6c43c9 + pristine_git_object: c5b268ab42e01e5056deaf0d432858cfa147a362 docs/operations/createvideosglobals.mdx: id: 84de29ff23d6 last_write_checksum: sha1:b0e6bc84afd5b4bcdb3f491c64b3f5c15e74d187 @@ -5924,6 +5984,14 @@ trackedFiles: id: 86192950ff34 last_write_checksum: sha1:c39ee4ad159c25a9bb988a1b0b32eab4ea45f58f pristine_git_object: 6dee392d1c4bbd32eda1cfac08e8daa1e3ad139e + docs/operations/deletescimgroupmappingglobals.mdx: + id: 97ed538b3737 + last_write_checksum: sha1:91c7cbdd9cf6ec660575814c49ab65e2c099cea2 + pristine_git_object: 098b906f69605c4e4f014e0c9977c2e9e09a40d4 + docs/operations/deletescimgroupmappingrequest.mdx: + id: 429d1931c37a + last_write_checksum: sha1:02a4aebe7722d11c44caaff6e203a03b21518c20 + pristine_git_object: 44e2e267a0a99200a02d71e4d87be41bf689224e docs/operations/deleteworkspacebudgetglobals.mdx: id: c1b4f6dabfee last_write_checksum: sha1:f2e30630f5ff69ba236f790def147e41e145ddd7 @@ -6196,6 +6264,14 @@ trackedFiles: id: a83322d91eea last_write_checksum: sha1:fd05c4e755a6ba4f6b41bb37856169ad1b14d927 pristine_git_object: 04784a9f4a05fa7d473b532d4e881a6d45a64a10 + docs/operations/getscimgroupmappingglobals.mdx: + id: 77bec8664122 + last_write_checksum: sha1:f3e3e81004c1baef10f69af21f945f2ead97c9b5 + pristine_git_object: 6d93a7f2595fdfaf64135ecd658993b0d5d2d165 + docs/operations/getscimgroupmappingrequest.mdx: + id: d5f5f6747522 + last_write_checksum: sha1:f86eff956c41225004a47350e31bfb0842f6b968 + pristine_git_object: 65e59b601a99b58683e4af1f7302a21c9ac3ce04 docs/operations/gettaskclassificationsglobals.mdx: id: 14d0010b40f8 last_write_checksum: sha1:6c967e8855540035a6f70fa895ceea0c9caf1cdd @@ -6252,6 +6328,14 @@ trackedFiles: id: fa09ca81a05c last_write_checksum: sha1:6126fc355e98574f157b9b485ac850a0ec6f2a5e pristine_git_object: 2394952123e253a775bb81426d6ee2d49911e97b + docs/operations/keepmembers.mdx: + id: 2794baf69c28 + last_write_checksum: sha1:aaeb714170a62787f1821383b6136d1753f14722 + pristine_git_object: 8f46e9fffa111f629447d88073a1bc71f5d74ec2 + docs/operations/keepmembersenum.mdx: + id: 6ee61c9ccd20 + last_write_checksum: sha1:29e22c0b38d77f4920d0f8e3704cb3ed0ce01ace + pristine_git_object: 50c5569bdc0a0a0cf8ed9c7a88120ebac5505022 docs/operations/languagetype.mdx: id: fe52912b0ea7 last_write_checksum: sha1:85897c7620d5c3725f610a496f4ceb485b9f5063 @@ -6512,6 +6596,30 @@ trackedFiles: id: 0fbda0f81ae8 last_write_checksum: sha1:ba97d1d6ae126c3e7a0e28d800705847377d2e86 pristine_git_object: ffadcfc3029043df64d38ed75fe5047adcc9f7cc + docs/operations/listscimgroupmappingsglobals.mdx: + id: 895d22ec37c3 + last_write_checksum: sha1:d80db938928ed189c2a2757ea5d188bb1179307c + pristine_git_object: 579e2aceabe49ccb863b60a9e8d591d732246af3 + docs/operations/listscimgroupmappingsrequest.mdx: + id: 6ef42d4cff72 + last_write_checksum: sha1:5c39ffeb497320341d049cd6a6e64492901af996 + pristine_git_object: e30aea7a59c2f378c66198111d348c085c491aa3 + docs/operations/listscimgroupmappingsresponse.mdx: + id: 82fd03794ec7 + last_write_checksum: sha1:066a306244125516ec9dbf46d22d52703450cb12 + pristine_git_object: f426e5f4541cee6cd5d881d4d000108d43c22884 + docs/operations/listscimgroupsglobals.mdx: + id: 4bba8d8ae8ec + last_write_checksum: sha1:ffeab5c225586e53ed8739894bf380120c9e51d3 + pristine_git_object: 5294ada2ed869243414124ab5c76e8a2b35f4512 + docs/operations/listscimgroupsrequest.mdx: + id: df7ed9b0f3b3 + last_write_checksum: sha1:26602f5d6904cdfe0d9bda06cf51f30eba59bb8d + pristine_git_object: 559e6e18a2281c2d63c6a7fdfa58658daa89cdd9 + docs/operations/listscimgroupsresponse.mdx: + id: b763a3eaa70b + last_write_checksum: sha1:2421768f7c35319a79083c02017056bd40f21c4e + pristine_git_object: 80f9a41f5527839636e8a51814d420a22a28a82f docs/operations/listvideoscontentglobals.mdx: id: 3332db3cd666 last_write_checksum: sha1:a5c1c54148c4f70454639dc474aad4fe32b82149 @@ -6748,6 +6856,14 @@ trackedFiles: id: d83497c7a77d last_write_checksum: sha1:de57252c9ee61e445b637c961ffb2a5e16a8b6f7 pristine_git_object: 16926383142c262c3c0f352bb40319fa48082fcd + docs/operations/updatescimgroupmappingglobals.mdx: + id: 01643bdf3b7d + last_write_checksum: sha1:5865e4a382c162a7f92ec7dc8a08516570bd9c56 + pristine_git_object: a8893db669581bed50c7cda7516a6a3beef5eb46 + docs/operations/updatescimgroupmappingrequest.mdx: + id: b74e0f64f34e + last_write_checksum: sha1:f63374fe6448d689438a3ca4fd3409cedcf7e269 + pristine_git_object: a2785d52426647fcd31cfc58f3dbafd0aabd6125 docs/operations/updateworkspaceglobals.mdx: id: 053b3b5bb1eb last_write_checksum: sha1:975e76f8c53dc170a42ecf80d01474518dda8944 @@ -6904,6 +7020,10 @@ trackedFiles: id: abab319e080e last_write_checksum: sha1:bdf477b88af63011ec6cc460d17f36fe0aeada68 pristine_git_object: 356232d47db82bebc0de98789226f8246dce647e + docs/sdks/scim/README.mdx: + id: fd6d8a91a053 + last_write_checksum: sha1:383e2108f6270137e54c1c993f655e32bd7283d6 + pristine_git_object: 89918692e893f665f65a870440659a63ab821693 docs/sdks/stt/README.mdx: id: 190b0dc9a5d1 last_write_checksum: sha1:0280bf119668798bf78f662fd41364b573c7fe53 @@ -6926,8 +7046,8 @@ trackedFiles: pristine_git_object: 3e38f1a929f7d6b1d6de74604aa87e3d8f010544 pyproject.toml: id: 5d07e7d72637 - last_write_checksum: sha1:48d1af8c208f573c9befba911026b232b1f08f64 - pristine_git_object: df1602a8e3d940ab5bdcd5bee9e8dd263e483b3f + last_write_checksum: sha1:a178037a3aff766a6bdca4b992281081588985c4 + pristine_git_object: 70475e9206d203172f21a7d9d37167b3ce7f06a5 scripts/prepare_readme.py: id: e0c5957a6035 last_write_checksum: sha1:77f44b60b98bc126557ec27391f91dfba764bb54 @@ -6954,8 +7074,8 @@ trackedFiles: pristine_git_object: 86713cfea633e09d33b3d4e65281071fe20e6137 src/openrouter/_version.py: id: d8d15ad6c586 - last_write_checksum: sha1:b7030862bce62a83c3cb651ab27fc68475cdbb96 - pristine_git_object: 7eb9b4cf2a3d58602f51334bfbc1a0627e4f9404 + last_write_checksum: sha1:56acaf4f3fb1c458cd5a17949976e024ce63c994 + pristine_git_object: 473195b0473d2c49e64aed63d2c078aba716a050 src/openrouter/analytics.py: id: cb406b5aaabb last_write_checksum: sha1:9e709b71dd0611056dc0cec6150b578defe32841 @@ -6998,8 +7118,8 @@ trackedFiles: pristine_git_object: ad3d247954547814054c01989a2dff3d12b3e4e1 src/openrouter/components/__init__.py: id: 81754e97b3f4 - last_write_checksum: sha1:17849cbb4c4b44eddfe56dd30ccac9d6eadd0225 - pristine_git_object: 22427f8f7738d7aeb326f86cd3b4c17565f69703 + last_write_checksum: sha1:b86e37067f135b24f13d24f19bb32ff5b74dd49f + pristine_git_object: 624a1748169e863ff2a308ef0c720b32880a0266 src/openrouter/components/aabenchmarkentry.py: id: e2e0f0b48c82 last_write_checksum: sha1:fab4d9a24d2cea937bb749d46c5f83941e99d65c @@ -7676,6 +7796,14 @@ trackedFiles: id: 4b6609465770 last_write_checksum: sha1:169981e2df08762f8cc251f2dccc9c0848a16902 pristine_git_object: ffdb3753adda06f3d93b505ab17657337c66067c + src/openrouter/components/createscimgroupmappingrequest.py: + id: 57d83beb2d2d + last_write_checksum: sha1:152e425925cc126310cee52fb6a98f6187a09261 + pristine_git_object: f451191bdf0741577c7b7a028345cbf88b82e4a6 + src/openrouter/components/createscimgroupmappingresponse.py: + id: f8798c422360 + last_write_checksum: sha1:fe554fba7ee3924661b789491b1cc31e4517119d + pristine_git_object: 7fde9784d1da97bbd4a70b5a64d72ea8ffa7fe64 src/openrouter/components/createworkspacerequest.py: id: 3785d9b207c2 last_write_checksum: sha1:26d39e88354ea17dc3a9c0156ddc8769dbae33a4 @@ -7736,6 +7864,10 @@ trackedFiles: id: daf99e240820 last_write_checksum: sha1:485d3e763c2edd7ccd69926e2ea872eb6d031fdc pristine_git_object: 28a54ebbcd00a3b64b50c6f221b4e1e7856797a8 + src/openrouter/components/deletescimgroupmappingresponse.py: + id: aef026b5e627 + last_write_checksum: sha1:ccf8a4261d6c889d320fcce82bd8f73ae13cb07f + pristine_git_object: 08a2289ff162c8758168d8da8414dd2f0ec3cc6e src/openrouter/components/deleteworkspacebudgetresponse.py: id: f9b733ad07c1 last_write_checksum: sha1:9bbbb1e27113d3ccebf7adf47b6554acf6139cb2 @@ -7940,6 +8072,10 @@ trackedFiles: id: 2175d9fa777c last_write_checksum: sha1:200d7a21b0da01ee15de359057da7259e0d367bd pristine_git_object: 122b9e8c5e75dcb27a5d6fa7a7f5c0c794241970 + src/openrouter/components/getscimgroupmappingresponse.py: + id: f6dd9e0daa9e + last_write_checksum: sha1:0b1ba09ad5da624c4fdbd1bff5d8919e55133cb9 + pristine_git_object: cfca9a058673bf7db640c2cec6d8dfc4f87837bd src/openrouter/components/getworkspaceresponse.py: id: d993d0c4c3da last_write_checksum: sha1:918535730d1c352bcc8fd2342e1c4cea89bc357f @@ -8160,6 +8296,14 @@ trackedFiles: id: c99fabaf956a last_write_checksum: sha1:de6c8f9f4b6ef6ef16d62918a1dd16e0ec619c88 pristine_git_object: d75ab3b91f58885e0d43d10d399f3f67a87349e8 + src/openrouter/components/listscimgroupmappingsresponse.py: + id: 7170aaa087e9 + last_write_checksum: sha1:4cf71a1acd3e413f920c8ac02bd3e8f497b8a124 + pristine_git_object: 546ec322c98cd8d4904002cc09d3a5b9bc57dd40 + src/openrouter/components/listscimgroupsresponse.py: + id: 7c20d71efb80 + last_write_checksum: sha1:1a8318984c6789d39fcfb26950003decd43e8671 + pristine_git_object: 8eedc46ae432ebaf1dcf40a15a918456c801f836 src/openrouter/components/listworkspacebudgetsresponse.py: id: 64fa8723acb0 last_write_checksum: sha1:7a1c0108d9d1f53c17f339c40b012e9472089fb8 @@ -8896,6 +9040,14 @@ trackedFiles: id: 553fefb9814c last_write_checksum: sha1:5db57f3fb6368777e8c2713eba613830d4f647fb pristine_git_object: 2f0e24f4e60f92151982237f1b2e871fbbf03278 + src/openrouter/components/scimgroup.py: + id: 2c6efb2db9c3 + last_write_checksum: sha1:b9309eab6d218c56eed1fc32a452e3ac5e89e2a2 + pristine_git_object: 4086c587a17812c5d90455b4a0bda35e5752367e + src/openrouter/components/scimgroupmapping.py: + id: c4d7a895a0bc + last_write_checksum: sha1:426befccd88107766691cff08a93741c6f388471 + pristine_git_object: b2e0acc56568f3c0ff542ec141c761ad62ddad80 src/openrouter/components/searchcontextsizeenum.py: id: c246413c0bd7 last_write_checksum: sha1:863a664a9f17def86180b0407c8233c263acfae7 @@ -9180,6 +9332,14 @@ trackedFiles: id: 187c51d2b3a4 last_write_checksum: sha1:cadc62b37feddb4281e471d15627a9a1bef32cb1 pristine_git_object: 95abc42170d9ebeadee791d15c2bbc643720f1dc + src/openrouter/components/updatescimgroupmappingrequest.py: + id: e014a151bfdd + last_write_checksum: sha1:cc62d7f12e168cbe7899f9d96144a480c32159e1 + pristine_git_object: a95a4e18b7f9004cd777d93d55f9f705fb35056e + src/openrouter/components/updatescimgroupmappingresponse.py: + id: 9af86345cb8d + last_write_checksum: sha1:8d4b084302952a541df662012eb0d2f0f144a2d0 + pristine_git_object: 2f110211bb0a6889bb6455a7a3901e0be260b170 src/openrouter/components/updateworkspacerequest.py: id: 78d86b3b0a63 last_write_checksum: sha1:ff25d835cf026e5401004b26067c778c9e85fe38 @@ -9454,8 +9614,8 @@ trackedFiles: pristine_git_object: 0f62389a8410522fe76eed82c64227903a8605c5 src/openrouter/operations/__init__.py: id: 9afcea1e7161 - last_write_checksum: sha1:6c6afd7330b690e2bd2bae3ffd586a1d28456319 - pristine_git_object: 1044a7cfabd59c96334c9119c647622d3947e9f3 + last_write_checksum: sha1:79b687677ed95380c7548ec6ed3e3efa0a32f386 + pristine_git_object: 71aa5c14ab18f683fe648f8a08e8190d6dc894d2 src/openrouter/operations/bulkaddworkspacemembers.py: id: e0ed56117619 last_write_checksum: sha1:5c44eb0d40fdece3ac084615f6c6082be4cf1d5a @@ -9540,6 +9700,10 @@ trackedFiles: id: afb834172b62 last_write_checksum: sha1:3cfb72d6b7dc9c55dc3955b53b0a7326a11f4688 pristine_git_object: a0925b14a4c830b168dd050798329cf364122091 + src/openrouter/operations/createscimgroupmapping.py: + id: 48a7da108d46 + last_write_checksum: sha1:7d510d57cce56c508847565be44dfe0f2d2812e3 + pristine_git_object: 5e9dc6fb071c8087c7edbd766dded2fc19e00c9f src/openrouter/operations/createvideos.py: id: d52f6a4a3fe4 last_write_checksum: sha1:dbcf7068a23f48a5d4cfd9c8150206731a40cc9b @@ -9568,6 +9732,10 @@ trackedFiles: id: efcdc4e7e19d last_write_checksum: sha1:975fb2edbcb96c6e890d1ed6ce2101ae261600d8 pristine_git_object: 92560ae6d7ad4399f3f1f8a2bf9347ac5f0d7283 + src/openrouter/operations/deletescimgroupmapping.py: + id: 5006e36e243e + last_write_checksum: sha1:e3842ba18645e0c26de1810acce50da3b90e2cfc + pristine_git_object: fec5503fa15f0f9588686f364f2066bf55f3ea80 src/openrouter/operations/deleteworkspace.py: id: f92017ce65e8 last_write_checksum: sha1:4ed5d02547fd400d801117e13ae108f6256fc591 @@ -9648,6 +9816,10 @@ trackedFiles: id: 61dd0325de08 last_write_checksum: sha1:352d2aeaebf68140c78343f31cc8ba344dc3d9ae pristine_git_object: fb9267c75f1e40b75ad22f313c3c1028f026f657 + src/openrouter/operations/getscimgroupmapping.py: + id: e1222ef7697e + last_write_checksum: sha1:e1d1933f745296958538ae7c4bdc8ead53944492 + pristine_git_object: d930ef5a4202b0ec9a88329927f7ea6373a7971f src/openrouter/operations/gettaskclassifications.py: id: ba6156d68acf last_write_checksum: sha1:c569572d21aa766ac542d5c535208e8b1caae503 @@ -9748,6 +9920,14 @@ trackedFiles: id: cf6e2db15118 last_write_checksum: sha1:decee82d2b55738162cc47f02f56c592d53f9ee9 pristine_git_object: 80bcd4b8e5d9e5f92ab4375175d6ee3a826a2e94 + src/openrouter/operations/listscimgroupmappings.py: + id: 67a3b97ff2bc + last_write_checksum: sha1:5acad915dd8fcaa9bc7dd4e087635023ae5a4ebf + pristine_git_object: a913e2774bfb2a74def1a707076fad6cb49b6496 + src/openrouter/operations/listscimgroups.py: + id: 9f32309bb157 + last_write_checksum: sha1:530b9e465c38b29c313a2c3a4bc596055825fd81 + pristine_git_object: 8d3d678ade3ba25aa65c4ff0bc3cb0783d87106a src/openrouter/operations/listvideoscontent.py: id: c27f9deb98f8 last_write_checksum: sha1:7eadc5d4d5f52469c09740d08f56970fafb407f2 @@ -9796,6 +9976,10 @@ trackedFiles: id: 18e06708d1b4 last_write_checksum: sha1:d490e19e8698ed5193df9d06673f975cb3a1410f pristine_git_object: e2819c904941d06f664a29312d9515150412ac44 + src/openrouter/operations/updatescimgroupmapping.py: + id: 5887929f6dff + last_write_checksum: sha1:c989609f3c53c3e455f0ad77595a1ce07a21b6e9 + pristine_git_object: 2cceda1e615ee9e5f8d3d2aedf23f4d49b5110ed src/openrouter/operations/updateworkspace.py: id: 2e9960985cbc last_write_checksum: sha1:0b74790d6673ca8bb8c203d97c5a6ce8128a16df @@ -9832,10 +10016,14 @@ trackedFiles: id: f2108fb635e1 last_write_checksum: sha1:30ccc0290b363a2cd9292a3cbcaadcdcd08e80a8 pristine_git_object: 0376b684fe0a28516ea79f0d036668163fc9ed4d + src/openrouter/scim.py: + id: 351afd6b616e + last_write_checksum: sha1:a20b8969f347f771fdcd6c8ea396ce3cd74ddc45 + pristine_git_object: f6ad93a8202863708520f9fdb7043eeb4f1f1fc6 src/openrouter/sdk.py: id: ee9846c4c9c5 - last_write_checksum: sha1:cfd9ed072cc69753aeb8142c70a6b54d5be69514 - pristine_git_object: 9fdcc2fce0bff737021a66cb2c2548473036a973 + last_write_checksum: sha1:a93d3271a6996e95f800f8c70eb26c81012d05bc + pristine_git_object: 3846f88706ca912096cfc40a460f6a0bb431c546 src/openrouter/sdkconfiguration.py: id: 55773bb98d7c last_write_checksum: sha1:c01826125c31a8b8bc99d9d679782c8758fae001 @@ -11536,4 +11724,109 @@ examples: application/json: {"error": {"code": 429, "message": "Rate limit exceeded"}} "500": application/json: {"error": {"code": 500, "message": "Internal Server Error"}} + listScimGroupMappings: + speakeasy-default-list-scim-group-mappings: + parameters: + query: + offset: 0 + limit: 50 + responses: + "200": + application/json: {"data": [{"created_at": "2025-08-24T10:30:00.000Z", "id": "770e8400-e29b-41d4-a716-446655440000", "organization_id": "org_123456", "role": "member", "scim_group_id": "550e8400-e29b-41d4-a716-446655440000", "updated_at": "2025-08-24T10:30:00.000Z", "workspace_id": "660e8400-e29b-41d4-a716-446655440000"}], "total_count": 320360} + "401": + application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} + "404": + application/json: {"error": {"code": 404, "message": "Resource not found"}} + "500": + application/json: {"error": {"code": 500, "message": "Internal Server Error"}} + createScimGroupMapping: + speakeasy-default-create-scim-group-mapping: + requestBody: + application/json: {"role": "admin", "scim_group_id": "ecdda85d-40dc-4ed7-9955-2bf12128e7da", "workspace_id": "d5a84a53-ce30-4057-ab5e-bd7b45553567"} + responses: + "201": + application/json: {"data": {"created_at": "2025-08-24T10:30:00.000Z", "id": "770e8400-e29b-41d4-a716-446655440000", "organization_id": "org_123456", "role": "member", "scim_group_id": "550e8400-e29b-41d4-a716-446655440000", "updated_at": "2025-08-24T10:30:00.000Z", "workspace_id": "660e8400-e29b-41d4-a716-446655440000"}} + "400": + application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} + "401": + application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} + "404": + application/json: {"error": {"code": 404, "message": "Resource not found"}} + "409": + application/json: {"error": {"code": 409, "message": "Resource conflict. Please try again later."}} + "500": + application/json: {"error": {"code": 500, "message": "Internal Server Error"}} + deleteScimGroupMapping: + speakeasy-default-delete-scim-group-mapping: + parameters: + path: + id: "ef7219ae-c495-43b3-b46b-52bf82772570" + query: + keep_members: false + responses: + "200": + application/json: {"deleted": true} + "400": + application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} + "401": + application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} + "404": + application/json: {"error": {"code": 404, "message": "Resource not found"}} + "500": + application/json: {"error": {"code": 500, "message": "Internal Server Error"}} + getScimGroupMapping: + speakeasy-default-get-scim-group-mapping: + parameters: + path: + id: "aca4d64d-fff7-419d-a8ae-3ec5ab8a0c1e" + responses: + "200": + application/json: {"data": {"created_at": "2025-08-24T10:30:00.000Z", "id": "770e8400-e29b-41d4-a716-446655440000", "organization_id": "org_123456", "role": "member", "scim_group_id": "550e8400-e29b-41d4-a716-446655440000", "updated_at": "2025-08-24T10:30:00.000Z", "workspace_id": "660e8400-e29b-41d4-a716-446655440000"}} + "401": + application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} + "404": + application/json: {"error": {"code": 404, "message": "Resource not found"}} + "500": + application/json: {"error": {"code": 500, "message": "Internal Server Error"}} + updateScimGroupMapping: + speakeasy-default-update-scim-group-mapping: + parameters: + path: + id: "361a9698-8c34-4cbb-b0be-f6fd47094a30" + requestBody: + application/json: {"role": "member"} + responses: + "200": + application/json: {"data": {"created_at": "2025-08-24T10:30:00.000Z", "id": "770e8400-e29b-41d4-a716-446655440000", "organization_id": "org_123456", "role": "member", "scim_group_id": "550e8400-e29b-41d4-a716-446655440000", "updated_at": "2025-08-24T10:30:00.000Z", "workspace_id": "660e8400-e29b-41d4-a716-446655440000"}} + "400": + application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} + "401": + application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} + "404": + application/json: {"error": {"code": 404, "message": "Resource not found"}} + "500": + application/json: {"error": {"code": 500, "message": "Internal Server Error"}} + listScimGroups: + speakeasy-default-list-scim-groups: + parameters: + query: + offset: 0 + limit: 50 + responses: + "200": + application/json: {"data": [{"created_at": "2025-08-24T10:30:00.000Z", "display_name": "Engineering", "external_id": "group-external-id", "id": "550e8400-e29b-41d4-a716-446655440000", "organization_id": "org_123456", "updated_at": "2025-08-24T10:30:00.000Z"}], "total_count": 926673} + "401": + application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} + "404": + application/json: {"error": {"code": 404, "message": "Resource not found"}} + "500": + application/json: {"error": {"code": 500, "message": "Internal Server Error"}} examplesVersion: 1.0.2 +releaseNotes: | + ## Python SDK Changes: + * `open_router.scim.list_mappings()`: **Added** + * `open_router.scim.create()`: **Added** + * `open_router.scim.delete()`: **Added** + * `open_router.scim.read()`: **Added** + * `open_router.scim.update()`: **Added** + * `open_router.scim.list_groups()`: **Added** diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index d53d9a1a..b0676647 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -36,7 +36,7 @@ generation: documentation: mintlify preApplyUnionDiscriminators: true python: - version: 1.1.19 + version: 1.1.20 additionalDependencies: dev: {} main: {} diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml index 7bfb6e6d..7d4dbf70 100644 --- a/.speakeasy/out.openapi.yaml +++ b/.speakeasy/out.openapi.yaml @@ -7306,6 +7306,32 @@ components: required: - 'data' type: 'object' + CreateScimGroupMappingRequest: + properties: + role: + enum: + - 'admin' + - 'member' + type: 'string' + x-speakeasy-unknown-values: allow + scim_group_id: + format: 'uuid' + type: 'string' + workspace_id: + format: 'uuid' + type: 'string' + required: + - 'scim_group_id' + - 'workspace_id' + - 'role' + type: 'object' + CreateScimGroupMappingResponse: + properties: + data: + $ref: '#/components/schemas/ScimGroupMapping' + required: + - 'data' + type: 'object' CreateWorkspaceRequest: example: default_image_model: 'openai/dall-e-3' @@ -7726,6 +7752,14 @@ components: required: - 'deleted' type: 'object' + DeleteScimGroupMappingResponse: + properties: + deleted: + const: true + type: 'boolean' + required: + - 'deleted' + type: 'object' DeleteWorkspaceBudgetResponse: example: deleted: true @@ -9580,6 +9614,13 @@ components: required: - 'data' type: 'object' + GetScimGroupMappingResponse: + properties: + data: + $ref: '#/components/schemas/ScimGroupMapping' + required: + - 'data' + type: 'object' GetWorkspaceResponse: example: data: @@ -11683,6 +11724,30 @@ components: - 'data' - 'total_count' type: 'object' + ListScimGroupMappingsResponse: + properties: + data: + items: + $ref: '#/components/schemas/ScimGroupMapping' + type: 'array' + total_count: + type: 'integer' + required: + - 'data' + - 'total_count' + type: 'object' + ListScimGroupsResponse: + properties: + data: + items: + $ref: '#/components/schemas/ScimGroup' + type: 'array' + total_count: + type: 'integer' + required: + - 'data' + - 'total_count' + type: 'object' ListWorkspaceBudgetsResponse: example: data: @@ -21531,6 +21596,78 @@ components: description: 'How long (in seconds) the container stays warm after its last command before sleeping, freeing its capacity slot. Idle-based: each command renews the timer. Defaults to 900 (15 minutes); capped at 2592000 (30 days).' example: 900 type: 'integer' + ScimGroup: + example: + created_at: '2025-08-24T10:30:00.000Z' + display_name: 'Engineering' + external_id: 'group-external-id' + id: '550e8400-e29b-41d4-a716-446655440000' + organization_id: 'org_123456' + updated_at: '2025-08-24T10:30:00.000Z' + properties: + created_at: + type: 'string' + display_name: + type: 'string' + external_id: + type: + - 'string' + - 'null' + id: + format: 'uuid' + type: 'string' + organization_id: + type: 'string' + updated_at: + type: 'string' + required: + - 'id' + - 'organization_id' + - 'external_id' + - 'display_name' + - 'created_at' + - 'updated_at' + type: 'object' + ScimGroupMapping: + example: + created_at: '2025-08-24T10:30:00.000Z' + id: '770e8400-e29b-41d4-a716-446655440000' + organization_id: 'org_123456' + role: 'member' + scim_group_id: '550e8400-e29b-41d4-a716-446655440000' + updated_at: '2025-08-24T10:30:00.000Z' + workspace_id: '660e8400-e29b-41d4-a716-446655440000' + properties: + created_at: + type: 'string' + id: + format: 'uuid' + type: 'string' + organization_id: + type: 'string' + role: + enum: + - 'admin' + - 'member' + type: 'string' + x-speakeasy-unknown-values: allow + scim_group_id: + format: 'uuid' + type: 'string' + updated_at: + type: 'string' + workspace_id: + format: 'uuid' + type: 'string' + required: + - 'id' + - 'organization_id' + - 'scim_group_id' + - 'workspace_id' + - 'role' + - 'created_at' + - 'updated_at' + type: 'object' SearchContextSizeEnum: description: 'Size of the search context for web search tools' enum: @@ -23851,6 +23988,24 @@ components: required: - 'data' type: 'object' + UpdateScimGroupMappingRequest: + properties: + role: + enum: + - 'admin' + - 'member' + type: 'string' + x-speakeasy-unknown-values: allow + required: + - 'role' + type: 'object' + UpdateScimGroupMappingResponse: + properties: + data: + $ref: '#/components/schemas/ScimGroupMapping' + required: + - 'data' + type: 'object' UpdateWorkspaceRequest: example: name: 'Updated Workspace' @@ -35894,6 +36049,444 @@ paths: - $ref: "#/components/parameters/AppIdentifier" - $ref: "#/components/parameters/AppDisplayName" - $ref: "#/components/parameters/AppCategories" + /scim/group-mappings: + get: + description: 'List SCIM group-to-workspace mappings for the organization. [Management key](/docs/guides/overview/auth/management-api-keys) required.' + operationId: 'listScimGroupMappings' + parameters: + - description: 'Number of records to skip for pagination' + in: 'query' + name: 'offset' + required: false + schema: + default: 0 + description: 'Number of records to skip for pagination' + example: 0 + minimum: 0 + type: + - 'integer' + - 'null' + nullable: false + - description: 'Maximum number of records to return (max 100)' + in: 'query' + name: 'limit' + required: false + schema: + default: 50 + description: 'Maximum number of records to return (max 100)' + example: 50 + maximum: 100 + minimum: 1 + type: 'integer' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ListScimGroupMappingsResponse' + description: 'List of SCIM group mappings' + '401': + content: + application/json: + example: + error: + code: 401 + message: 'Missing Authentication header' + schema: + $ref: '#/components/schemas/UnauthorizedResponse' + description: 'Unauthorized - Authentication required or invalid credentials' + '404': + content: + application/json: + example: + error: + code: 404 + message: 'Resource not found' + schema: + $ref: '#/components/schemas/NotFoundResponse' + description: 'Not Found - Resource does not exist' + '500': + content: + application/json: + example: + error: + code: 500 + message: 'Internal Server Error' + schema: + $ref: '#/components/schemas/InternalServerResponse' + description: 'Internal Server Error - Unexpected server error' + summary: 'List SCIM group mappings' + tags: + - 'SCIM' + x-speakeasy-name-override: 'listMappings' + x-speakeasy-pagination: + inputs: + - in: 'parameters' + name: 'offset' + type: 'offset' + - in: 'parameters' + name: 'limit' + type: 'limit' + outputs: + results: '$.data' + type: 'offsetLimit' + post: + description: 'Create a SCIM group-to-workspace role mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required.' + operationId: 'createScimGroupMapping' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CreateScimGroupMappingRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/CreateScimGroupMappingResponse' + description: 'SCIM group mapping created' + '400': + content: + application/json: + example: + error: + code: 400 + message: 'Invalid request parameters' + schema: + $ref: '#/components/schemas/BadRequestResponse' + description: 'Bad Request - Invalid request parameters or malformed input' + '401': + content: + application/json: + example: + error: + code: 401 + message: 'Missing Authentication header' + schema: + $ref: '#/components/schemas/UnauthorizedResponse' + description: 'Unauthorized - Authentication required or invalid credentials' + '404': + content: + application/json: + example: + error: + code: 404 + message: 'Resource not found' + schema: + $ref: '#/components/schemas/NotFoundResponse' + description: 'Not Found - Resource does not exist' + '409': + content: + application/json: + example: + error: + code: 409 + message: 'Resource conflict. Please try again later.' + schema: + $ref: '#/components/schemas/ConflictResponse' + description: 'Conflict - Resource conflict or concurrent modification' + '500': + content: + application/json: + example: + error: + code: 500 + message: 'Internal Server Error' + schema: + $ref: '#/components/schemas/InternalServerResponse' + description: 'Internal Server Error - Unexpected server error' + summary: 'Create a SCIM group mapping' + tags: + - 'SCIM' + x-speakeasy-name-override: 'create' + parameters: + - $ref: "#/components/parameters/AppIdentifier" + - $ref: "#/components/parameters/AppDisplayName" + - $ref: "#/components/parameters/AppCategories" + /scim/group-mappings/{id}: + delete: + description: 'Delete a SCIM group-to-workspace mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required.' + operationId: 'deleteScimGroupMapping' + parameters: + - in: 'path' + name: 'id' + required: true + schema: + format: 'uuid' + type: 'string' + - description: 'Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required.' + in: 'query' + name: 'keep_members' + required: true + schema: + anyOf: + - enum: + - 'true' + - 'false' + type: 'string' + x-speakeasy-unknown-values: allow + - type: 'boolean' + description: 'Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required.' + example: false + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteScimGroupMappingResponse' + description: 'SCIM group mapping deleted' + '400': + content: + application/json: + example: + error: + code: 400 + message: 'Invalid request parameters' + schema: + $ref: '#/components/schemas/BadRequestResponse' + description: 'Bad Request - Invalid request parameters or malformed input' + '401': + content: + application/json: + example: + error: + code: 401 + message: 'Missing Authentication header' + schema: + $ref: '#/components/schemas/UnauthorizedResponse' + description: 'Unauthorized - Authentication required or invalid credentials' + '404': + content: + application/json: + example: + error: + code: 404 + message: 'Resource not found' + schema: + $ref: '#/components/schemas/NotFoundResponse' + description: 'Not Found - Resource does not exist' + '500': + content: + application/json: + example: + error: + code: 500 + message: 'Internal Server Error' + schema: + $ref: '#/components/schemas/InternalServerResponse' + description: 'Internal Server Error - Unexpected server error' + summary: 'Delete a SCIM group mapping' + tags: + - 'SCIM' + x-speakeasy-name-override: 'delete' + get: + description: 'Get a SCIM group-to-workspace mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required.' + operationId: 'getScimGroupMapping' + parameters: + - in: 'path' + name: 'id' + required: true + schema: + format: 'uuid' + type: 'string' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/GetScimGroupMappingResponse' + description: 'SCIM group mapping' + '401': + content: + application/json: + example: + error: + code: 401 + message: 'Missing Authentication header' + schema: + $ref: '#/components/schemas/UnauthorizedResponse' + description: 'Unauthorized - Authentication required or invalid credentials' + '404': + content: + application/json: + example: + error: + code: 404 + message: 'Resource not found' + schema: + $ref: '#/components/schemas/NotFoundResponse' + description: 'Not Found - Resource does not exist' + '500': + content: + application/json: + example: + error: + code: 500 + message: 'Internal Server Error' + schema: + $ref: '#/components/schemas/InternalServerResponse' + description: 'Internal Server Error - Unexpected server error' + summary: 'Get a SCIM group mapping' + tags: + - 'SCIM' + x-speakeasy-name-override: 'read' + patch: + description: 'Update a SCIM group mapping role. [Management key](/docs/guides/overview/auth/management-api-keys) required.' + operationId: 'updateScimGroupMapping' + parameters: + - in: 'path' + name: 'id' + required: true + schema: + format: 'uuid' + type: 'string' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateScimGroupMappingRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateScimGroupMappingResponse' + description: 'SCIM group mapping updated' + '400': + content: + application/json: + example: + error: + code: 400 + message: 'Invalid request parameters' + schema: + $ref: '#/components/schemas/BadRequestResponse' + description: 'Bad Request - Invalid request parameters or malformed input' + '401': + content: + application/json: + example: + error: + code: 401 + message: 'Missing Authentication header' + schema: + $ref: '#/components/schemas/UnauthorizedResponse' + description: 'Unauthorized - Authentication required or invalid credentials' + '404': + content: + application/json: + example: + error: + code: 404 + message: 'Resource not found' + schema: + $ref: '#/components/schemas/NotFoundResponse' + description: 'Not Found - Resource does not exist' + '500': + content: + application/json: + example: + error: + code: 500 + message: 'Internal Server Error' + schema: + $ref: '#/components/schemas/InternalServerResponse' + description: 'Internal Server Error - Unexpected server error' + summary: 'Update a SCIM group mapping' + tags: + - 'SCIM' + x-speakeasy-name-override: 'update' + parameters: + - $ref: "#/components/parameters/AppIdentifier" + - $ref: "#/components/parameters/AppDisplayName" + - $ref: "#/components/parameters/AppCategories" + /scim/groups: + get: + description: 'List SCIM groups for the organization. [Management key](/docs/guides/overview/auth/management-api-keys) required.' + operationId: 'listScimGroups' + parameters: + - description: 'Number of records to skip for pagination' + in: 'query' + name: 'offset' + required: false + schema: + default: 0 + description: 'Number of records to skip for pagination' + example: 0 + minimum: 0 + type: + - 'integer' + - 'null' + nullable: false + - description: 'Maximum number of records to return (max 100)' + in: 'query' + name: 'limit' + required: false + schema: + default: 50 + description: 'Maximum number of records to return (max 100)' + example: 50 + maximum: 100 + minimum: 1 + type: 'integer' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ListScimGroupsResponse' + description: 'List of SCIM groups' + '401': + content: + application/json: + example: + error: + code: 401 + message: 'Missing Authentication header' + schema: + $ref: '#/components/schemas/UnauthorizedResponse' + description: 'Unauthorized - Authentication required or invalid credentials' + '404': + content: + application/json: + example: + error: + code: 404 + message: 'Resource not found' + schema: + $ref: '#/components/schemas/NotFoundResponse' + description: 'Not Found - Resource does not exist' + '500': + content: + application/json: + example: + error: + code: 500 + message: 'Internal Server Error' + schema: + $ref: '#/components/schemas/InternalServerResponse' + description: 'Internal Server Error - Unexpected server error' + summary: 'List SCIM groups' + tags: + - 'SCIM' + x-speakeasy-name-override: 'listGroups' + 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" + - $ref: "#/components/parameters/AppCategories" /videos: post: description: 'Submits a video generation request and returns a polling URL to check status' @@ -37221,6 +37814,8 @@ tags: name: 'Rerank' - description: 'OpenAI-compatible Responses API endpoints' name: 'Responses' + - description: 'SCIM endpoints' + name: 'SCIM' - description: 'Speech-to-text endpoints' name: 'STT' x-displayName: 'Transcriptions' diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index c3603395..3873448f 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:7a31fb4618f31111fe92f1ca6b3aef017cc70ca839661b3db3db39bae93e04dc - sourceBlobDigest: sha256:86a165f8f0d523293c7524d3a3cd0b77c8762126573dbeeb8b7f9d30bd55c618 + sourceRevisionDigest: sha256:4899932a9aa11fcd1f8472116fa746ef59056f8a33f6cc08df53031e37887e32 + sourceBlobDigest: sha256:50d61f318fdf1f026d41fd26976aef9ac7ca2e462650cbd7cca260e17611d61d tags: - latest - 1.0.0 @@ -11,10 +11,10 @@ targets: open-router: source: OpenRouter API sourceNamespace: open-router-chat-completions-api - sourceRevisionDigest: sha256:7a31fb4618f31111fe92f1ca6b3aef017cc70ca839661b3db3db39bae93e04dc - sourceBlobDigest: sha256:86a165f8f0d523293c7524d3a3cd0b77c8762126573dbeeb8b7f9d30bd55c618 + sourceRevisionDigest: sha256:4899932a9aa11fcd1f8472116fa746ef59056f8a33f6cc08df53031e37887e32 + sourceBlobDigest: sha256:50d61f318fdf1f026d41fd26976aef9ac7ca2e462650cbd7cca260e17611d61d codeSamplesNamespace: open-router-python-code-samples - codeSamplesRevisionDigest: sha256:2b61e0bdf6df067c6e72f6ec6864dc089642c0655a579fda9b3bd06596fe1f50 + codeSamplesRevisionDigest: sha256:369a78b648f89a6e7740d32e6cc537cee534609caebc2fad23dd50dab7dc05a3 workflow: workflowVersion: 1.0.0 speakeasyVersion: 1.787.0 diff --git a/RELEASES.md b/RELEASES.md index c5a5c1fa..3e836fb8 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -979,4 +979,14 @@ Based on: ### Generated - [python v1.1.18] . ### Releases -- [PyPI v1.1.18] https://pypi.org/project/openrouter/1.1.18 - . \ No newline at end of file +- [PyPI v1.1.18] https://pypi.org/project/openrouter/1.1.18 - . + +## 2026-07-30 19:23:28 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.787.0 (2.914.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.1.20] . +### Releases +- [PyPI v1.1.20] https://pypi.org/project/openrouter/1.1.20 - . \ No newline at end of file diff --git a/docs/components/createscimgroupmappingrequest.mdx b/docs/components/createscimgroupmappingrequest.mdx new file mode 100644 index 00000000..5ad1269c --- /dev/null +++ b/docs/components/createscimgroupmappingrequest.mdx @@ -0,0 +1,11 @@ +--- +title: "CreateScimGroupMappingRequest" +--- + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | +| `role` | [components.CreateScimGroupMappingRequestRole](../components/createscimgroupmappingrequestrole.mdx) | :heavy_check_mark: | N/A | +| `scim_group_id` | *str* | :heavy_check_mark: | N/A | +| `workspace_id` | *str* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/createscimgroupmappingrequestrole.mdx b/docs/components/createscimgroupmappingrequestrole.mdx new file mode 100644 index 00000000..f49282c4 --- /dev/null +++ b/docs/components/createscimgroupmappingrequestrole.mdx @@ -0,0 +1,20 @@ +--- +title: "CreateScimGroupMappingRequestRole" +--- + +## Example Usage + +```python +from openrouter.components import CreateScimGroupMappingRequestRole + +# Open enum: unrecognized values are captured as UnrecognizedStr +value: CreateScimGroupMappingRequestRole = "admin" +``` + + +## Values + +This is an open enum. Unrecognized values will not fail type checks. + +- `"admin"` +- `"member"` diff --git a/docs/components/createscimgroupmappingresponse.mdx b/docs/components/createscimgroupmappingresponse.mdx new file mode 100644 index 00000000..9ac0db3f --- /dev/null +++ b/docs/components/createscimgroupmappingresponse.mdx @@ -0,0 +1,9 @@ +--- +title: "CreateScimGroupMappingResponse" +--- + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `data` | [components.ScimGroupMapping](../components/scimgroupmapping.mdx) | :heavy_check_mark: | N/A | \{
"created_at": "2025-08-24T10:30:00.000Z",
"id": "770e8400-e29b-41d4-a716-446655440000",
"organization_id": "org_123456",
"role": "member",
"scim_group_id": "550e8400-e29b-41d4-a716-446655440000",
"updated_at": "2025-08-24T10:30:00.000Z",
"workspace_id": "660e8400-e29b-41d4-a716-446655440000"
} | \ No newline at end of file diff --git a/docs/components/deletescimgroupmappingresponse.mdx b/docs/components/deletescimgroupmappingresponse.mdx new file mode 100644 index 00000000..1ed4e164 --- /dev/null +++ b/docs/components/deletescimgroupmappingresponse.mdx @@ -0,0 +1,9 @@ +--- +title: "DeleteScimGroupMappingResponse" +--- + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `deleted` | *Literal[True]* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/getscimgroupmappingresponse.mdx b/docs/components/getscimgroupmappingresponse.mdx new file mode 100644 index 00000000..3031bf11 --- /dev/null +++ b/docs/components/getscimgroupmappingresponse.mdx @@ -0,0 +1,9 @@ +--- +title: "GetScimGroupMappingResponse" +--- + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `data` | [components.ScimGroupMapping](../components/scimgroupmapping.mdx) | :heavy_check_mark: | N/A | \{
"created_at": "2025-08-24T10:30:00.000Z",
"id": "770e8400-e29b-41d4-a716-446655440000",
"organization_id": "org_123456",
"role": "member",
"scim_group_id": "550e8400-e29b-41d4-a716-446655440000",
"updated_at": "2025-08-24T10:30:00.000Z",
"workspace_id": "660e8400-e29b-41d4-a716-446655440000"
} | \ No newline at end of file diff --git a/docs/components/listscimgroupmappingsresponse.mdx b/docs/components/listscimgroupmappingsresponse.mdx new file mode 100644 index 00000000..14dff7d7 --- /dev/null +++ b/docs/components/listscimgroupmappingsresponse.mdx @@ -0,0 +1,10 @@ +--- +title: "ListScimGroupMappingsResponse" +--- + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | +| `data` | List[[components.ScimGroupMapping](../components/scimgroupmapping.mdx)] | :heavy_check_mark: | N/A | +| `total_count` | *int* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/listscimgroupsresponse.mdx b/docs/components/listscimgroupsresponse.mdx new file mode 100644 index 00000000..6c0e6c81 --- /dev/null +++ b/docs/components/listscimgroupsresponse.mdx @@ -0,0 +1,10 @@ +--- +title: "ListScimGroupsResponse" +--- + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------- | +| `data` | List[[components.ScimGroup](../components/scimgroup.mdx)] | :heavy_check_mark: | N/A | +| `total_count` | *int* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/scimgroup.mdx b/docs/components/scimgroup.mdx new file mode 100644 index 00000000..98a3dfc3 --- /dev/null +++ b/docs/components/scimgroup.mdx @@ -0,0 +1,14 @@ +--- +title: "ScimGroup" +--- + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `created_at` | *str* | :heavy_check_mark: | N/A | +| `display_name` | *str* | :heavy_check_mark: | N/A | +| `external_id` | *Nullable[str]* | :heavy_check_mark: | N/A | +| `id` | *str* | :heavy_check_mark: | N/A | +| `organization_id` | *str* | :heavy_check_mark: | N/A | +| `updated_at` | *str* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/scimgroupmapping.mdx b/docs/components/scimgroupmapping.mdx new file mode 100644 index 00000000..a1ee91fa --- /dev/null +++ b/docs/components/scimgroupmapping.mdx @@ -0,0 +1,15 @@ +--- +title: "ScimGroupMapping" +--- + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | +| `created_at` | *str* | :heavy_check_mark: | N/A | +| `id` | *str* | :heavy_check_mark: | N/A | +| `organization_id` | *str* | :heavy_check_mark: | N/A | +| `role` | [components.ScimGroupMappingRole](../components/scimgroupmappingrole.mdx) | :heavy_check_mark: | N/A | +| `scim_group_id` | *str* | :heavy_check_mark: | N/A | +| `updated_at` | *str* | :heavy_check_mark: | N/A | +| `workspace_id` | *str* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/scimgroupmappingrole.mdx b/docs/components/scimgroupmappingrole.mdx new file mode 100644 index 00000000..94331ee5 --- /dev/null +++ b/docs/components/scimgroupmappingrole.mdx @@ -0,0 +1,20 @@ +--- +title: "ScimGroupMappingRole" +--- + +## Example Usage + +```python +from openrouter.components import ScimGroupMappingRole + +# Open enum: unrecognized values are captured as UnrecognizedStr +value: ScimGroupMappingRole = "admin" +``` + + +## Values + +This is an open enum. Unrecognized values will not fail type checks. + +- `"admin"` +- `"member"` diff --git a/docs/components/updatescimgroupmappingrequest.mdx b/docs/components/updatescimgroupmappingrequest.mdx new file mode 100644 index 00000000..8206d918 --- /dev/null +++ b/docs/components/updatescimgroupmappingrequest.mdx @@ -0,0 +1,9 @@ +--- +title: "UpdateScimGroupMappingRequest" +--- + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | +| `role` | [components.UpdateScimGroupMappingRequestRole](../components/updatescimgroupmappingrequestrole.mdx) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/updatescimgroupmappingrequestrole.mdx b/docs/components/updatescimgroupmappingrequestrole.mdx new file mode 100644 index 00000000..6f5f0062 --- /dev/null +++ b/docs/components/updatescimgroupmappingrequestrole.mdx @@ -0,0 +1,20 @@ +--- +title: "UpdateScimGroupMappingRequestRole" +--- + +## Example Usage + +```python +from openrouter.components import UpdateScimGroupMappingRequestRole + +# Open enum: unrecognized values are captured as UnrecognizedStr +value: UpdateScimGroupMappingRequestRole = "admin" +``` + + +## Values + +This is an open enum. Unrecognized values will not fail type checks. + +- `"admin"` +- `"member"` diff --git a/docs/components/updatescimgroupmappingresponse.mdx b/docs/components/updatescimgroupmappingresponse.mdx new file mode 100644 index 00000000..651230ce --- /dev/null +++ b/docs/components/updatescimgroupmappingresponse.mdx @@ -0,0 +1,9 @@ +--- +title: "UpdateScimGroupMappingResponse" +--- + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `data` | [components.ScimGroupMapping](../components/scimgroupmapping.mdx) | :heavy_check_mark: | N/A | \{
"created_at": "2025-08-24T10:30:00.000Z",
"id": "770e8400-e29b-41d4-a716-446655440000",
"organization_id": "org_123456",
"role": "member",
"scim_group_id": "550e8400-e29b-41d4-a716-446655440000",
"updated_at": "2025-08-24T10:30:00.000Z",
"workspace_id": "660e8400-e29b-41d4-a716-446655440000"
} | \ No newline at end of file diff --git a/docs/operations/createscimgroupmappingglobals.mdx b/docs/operations/createscimgroupmappingglobals.mdx new file mode 100644 index 00000000..ee1187f7 --- /dev/null +++ b/docs/operations/createscimgroupmappingglobals.mdx @@ -0,0 +1,11 @@ +--- +title: "CreateScimGroupMappingGlobals" +--- + +## 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 diff --git a/docs/operations/createscimgroupmappingrequest.mdx b/docs/operations/createscimgroupmappingrequest.mdx new file mode 100644 index 00000000..c5b268ab --- /dev/null +++ b/docs/operations/createscimgroupmappingrequest.mdx @@ -0,0 +1,12 @@ +--- +title: "CreateScimGroupMappingRequest" +--- + +## 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.
| +| `create_scim_group_mapping_request` | [components.CreateScimGroupMappingRequest](../components/createscimgroupmappingrequest.mdx) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/operations/deletescimgroupmappingglobals.mdx b/docs/operations/deletescimgroupmappingglobals.mdx new file mode 100644 index 00000000..098b906f --- /dev/null +++ b/docs/operations/deletescimgroupmappingglobals.mdx @@ -0,0 +1,11 @@ +--- +title: "DeleteScimGroupMappingGlobals" +--- + +## 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 diff --git a/docs/operations/deletescimgroupmappingrequest.mdx b/docs/operations/deletescimgroupmappingrequest.mdx new file mode 100644 index 00000000..44e2e267 --- /dev/null +++ b/docs/operations/deletescimgroupmappingrequest.mdx @@ -0,0 +1,13 @@ +--- +title: "DeleteScimGroupMappingRequest" +--- + +## Fields + +| 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.
| | +| `id` | *str* | :heavy_check_mark: | N/A | | +| `keep_members` | [operations.KeepMembers](../operations/keepmembers.mdx) | :heavy_check_mark: | Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required. | false | \ No newline at end of file diff --git a/docs/operations/getscimgroupmappingglobals.mdx b/docs/operations/getscimgroupmappingglobals.mdx new file mode 100644 index 00000000..6d93a7f2 --- /dev/null +++ b/docs/operations/getscimgroupmappingglobals.mdx @@ -0,0 +1,11 @@ +--- +title: "GetScimGroupMappingGlobals" +--- + +## 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 diff --git a/docs/operations/getscimgroupmappingrequest.mdx b/docs/operations/getscimgroupmappingrequest.mdx new file mode 100644 index 00000000..65e59b60 --- /dev/null +++ b/docs/operations/getscimgroupmappingrequest.mdx @@ -0,0 +1,12 @@ +--- +title: "GetScimGroupMappingRequest" +--- + +## 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.
| +| `id` | *str* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/operations/keepmembers.mdx b/docs/operations/keepmembers.mdx new file mode 100644 index 00000000..8f46e9ff --- /dev/null +++ b/docs/operations/keepmembers.mdx @@ -0,0 +1,21 @@ +--- +title: "KeepMembers" +--- + +Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required. + + +## Supported Types + +### `operations.KeepMembersEnum` + +```python +value: operations.KeepMembersEnum = /* values here */ +``` + +### `bool` + +```python +value: bool = /* values here */ +``` + diff --git a/docs/operations/keepmembersenum.mdx b/docs/operations/keepmembersenum.mdx new file mode 100644 index 00000000..50c5569b --- /dev/null +++ b/docs/operations/keepmembersenum.mdx @@ -0,0 +1,20 @@ +--- +title: "KeepMembersEnum" +--- + +## Example Usage + +```python +from openrouter.operations import KeepMembersEnum + +# Open enum: unrecognized values are captured as UnrecognizedStr +value: KeepMembersEnum = "true" +``` + + +## Values + +This is an open enum. Unrecognized values will not fail type checks. + +- `"true"` +- `"false"` diff --git a/docs/operations/listscimgroupmappingsglobals.mdx b/docs/operations/listscimgroupmappingsglobals.mdx new file mode 100644 index 00000000..579e2ace --- /dev/null +++ b/docs/operations/listscimgroupmappingsglobals.mdx @@ -0,0 +1,11 @@ +--- +title: "ListScimGroupMappingsGlobals" +--- + +## 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 diff --git a/docs/operations/listscimgroupmappingsrequest.mdx b/docs/operations/listscimgroupmappingsrequest.mdx new file mode 100644 index 00000000..e30aea7a --- /dev/null +++ b/docs/operations/listscimgroupmappingsrequest.mdx @@ -0,0 +1,13 @@ +--- +title: "ListScimGroupMappingsRequest" +--- + +## Fields + +| 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` | *OptionalNullable[int]* | :heavy_minus_sign: | Number of records to skip for pagination | 0 | +| `limit` | *Optional[int]* | :heavy_minus_sign: | Maximum number of records to return (max 100) | 50 | \ No newline at end of file diff --git a/docs/operations/listscimgroupmappingsresponse.mdx b/docs/operations/listscimgroupmappingsresponse.mdx new file mode 100644 index 00000000..f426e5f4 --- /dev/null +++ b/docs/operations/listscimgroupmappingsresponse.mdx @@ -0,0 +1,9 @@ +--- +title: "ListScimGroupMappingsResponse" +--- + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | +| `result` | [components.ListScimGroupMappingsResponse](../components/listscimgroupmappingsresponse.mdx) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/operations/listscimgroupsglobals.mdx b/docs/operations/listscimgroupsglobals.mdx new file mode 100644 index 00000000..5294ada2 --- /dev/null +++ b/docs/operations/listscimgroupsglobals.mdx @@ -0,0 +1,11 @@ +--- +title: "ListScimGroupsGlobals" +--- + +## 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 diff --git a/docs/operations/listscimgroupsrequest.mdx b/docs/operations/listscimgroupsrequest.mdx new file mode 100644 index 00000000..559e6e18 --- /dev/null +++ b/docs/operations/listscimgroupsrequest.mdx @@ -0,0 +1,13 @@ +--- +title: "ListScimGroupsRequest" +--- + +## Fields + +| 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` | *OptionalNullable[int]* | :heavy_minus_sign: | Number of records to skip for pagination | 0 | +| `limit` | *Optional[int]* | :heavy_minus_sign: | Maximum number of records to return (max 100) | 50 | \ No newline at end of file diff --git a/docs/operations/listscimgroupsresponse.mdx b/docs/operations/listscimgroupsresponse.mdx new file mode 100644 index 00000000..80f9a41f --- /dev/null +++ b/docs/operations/listscimgroupsresponse.mdx @@ -0,0 +1,9 @@ +--- +title: "ListScimGroupsResponse" +--- + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | +| `result` | [components.ListScimGroupsResponse](../components/listscimgroupsresponse.mdx) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/operations/updatescimgroupmappingglobals.mdx b/docs/operations/updatescimgroupmappingglobals.mdx new file mode 100644 index 00000000..a8893db6 --- /dev/null +++ b/docs/operations/updatescimgroupmappingglobals.mdx @@ -0,0 +1,11 @@ +--- +title: "UpdateScimGroupMappingGlobals" +--- + +## 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 diff --git a/docs/operations/updatescimgroupmappingrequest.mdx b/docs/operations/updatescimgroupmappingrequest.mdx new file mode 100644 index 00000000..a2785d52 --- /dev/null +++ b/docs/operations/updatescimgroupmappingrequest.mdx @@ -0,0 +1,13 @@ +--- +title: "UpdateScimGroupMappingRequest" +--- + +## 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.
| +| `id` | *str* | :heavy_check_mark: | N/A | +| `update_scim_group_mapping_request` | [components.UpdateScimGroupMappingRequest](../components/updatescimgroupmappingrequest.mdx) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/sdks/scim/README.mdx b/docs/sdks/scim/README.mdx new file mode 100644 index 00000000..89918692 --- /dev/null +++ b/docs/sdks/scim/README.mdx @@ -0,0 +1,319 @@ +--- +title: "Scim" +description: "SCIM endpoints" +--- + +## Overview + +SCIM endpoints + +### Available Operations + +* [list_mappings](#list_mappings) - List SCIM group mappings +* [create](#create) - Create a SCIM group mapping +* [delete](#delete) - Delete a SCIM group mapping +* [read](#read) - Get a SCIM group mapping +* [update](#update) - Update a SCIM group mapping +* [list_groups](#list_groups) - List SCIM groups + +## list_mappings + +List SCIM group-to-workspace mappings for the organization. [Management key](/docs/guides/overview/auth/management-api-keys) required. + +### Example Usage + +```python +from openrouter import OpenRouter +import os + + +with OpenRouter( + http_referer="", + x_open_router_title="", + x_open_router_categories="", + api_key=os.getenv("OPENROUTER_API_KEY", ""), +) as open_router: + + res = open_router.scim.list_mappings(offset=0, limit=50) + + while res is not None: + # Handle items + + res = res.next() + +``` + +### Parameters + +| 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` | *OptionalNullable[int]* | :heavy_minus_sign: | Number of records to skip for pagination | 0 | +| `limit` | *Optional[int]* | :heavy_minus_sign: | Maximum number of records to return (max 100) | 50 | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.mdx) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | | + +### Response + +**[operations.ListScimGroupMappingsResponse](../../operations/listscimgroupmappingsresponse.mdx)** + +### Errors + +| Error Type | Status Code | Content Type | +| ---------------------------------- | ---------------------------------- | ---------------------------------- | +| errors.UnauthorizedResponseError | 401 | application/json | +| errors.NotFoundResponseError | 404 | application/json | +| errors.InternalServerResponseError | 500 | application/json | +| errors.OpenRouterDefaultError | 4XX, 5XX | \*/\* | + +## create + +Create a SCIM group-to-workspace role mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required. + +### Example Usage + +```python +from openrouter import OpenRouter +import os + + +with OpenRouter( + http_referer="", + x_open_router_title="", + x_open_router_categories="", + api_key=os.getenv("OPENROUTER_API_KEY", ""), +) as open_router: + + res = open_router.scim.create(role="admin", scim_group_id="ecdda85d-40dc-4ed7-9955-2bf12128e7da", workspace_id="d5a84a53-ce30-4057-ab5e-bd7b45553567") + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | +| `role` | [components.CreateScimGroupMappingRequestRole](../../components/createscimgroupmappingrequestrole.mdx) | :heavy_check_mark: | N/A | +| `scim_group_id` | *str* | :heavy_check_mark: | N/A | +| `workspace_id` | *str* | :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. | + +### Response + +**[components.CreateScimGroupMappingResponse](../../components/createscimgroupmappingresponse.mdx)** + +### Errors + +| Error Type | Status Code | Content Type | +| ---------------------------------- | ---------------------------------- | ---------------------------------- | +| errors.BadRequestResponseError | 400 | application/json | +| errors.UnauthorizedResponseError | 401 | application/json | +| errors.NotFoundResponseError | 404 | application/json | +| errors.ConflictResponseError | 409 | application/json | +| errors.InternalServerResponseError | 500 | application/json | +| errors.OpenRouterDefaultError | 4XX, 5XX | \*/\* | + +## delete + +Delete a SCIM group-to-workspace mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required. + +### Example Usage + +```python +from openrouter import OpenRouter +import os + + +with OpenRouter( + http_referer="", + x_open_router_title="", + x_open_router_categories="", + api_key=os.getenv("OPENROUTER_API_KEY", ""), +) as open_router: + + res = open_router.scim.delete(id="ef7219ae-c495-43b3-b46b-52bf82772570", keep_members=False) + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | Example | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | *str* | :heavy_check_mark: | N/A | | +| `keep_members` | [operations.KeepMembers](../../operations/keepmembers.mdx) | :heavy_check_mark: | Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required. | false | +| `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. | | + +### Response + +**[components.DeleteScimGroupMappingResponse](../../components/deletescimgroupmappingresponse.mdx)** + +### Errors + +| Error Type | Status Code | Content Type | +| ---------------------------------- | ---------------------------------- | ---------------------------------- | +| errors.BadRequestResponseError | 400 | application/json | +| errors.UnauthorizedResponseError | 401 | application/json | +| errors.NotFoundResponseError | 404 | application/json | +| errors.InternalServerResponseError | 500 | application/json | +| errors.OpenRouterDefaultError | 4XX, 5XX | \*/\* | + +## read + +Get a SCIM group-to-workspace mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required. + +### Example Usage + +```python +from openrouter import OpenRouter +import os + + +with OpenRouter( + http_referer="", + x_open_router_title="", + x_open_router_categories="", + api_key=os.getenv("OPENROUTER_API_KEY", ""), +) as open_router: + + res = open_router.scim.read(id="aca4d64d-fff7-419d-a8ae-3ec5ab8a0c1e") + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | *str* | :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. | + +### Response + +**[components.GetScimGroupMappingResponse](../../components/getscimgroupmappingresponse.mdx)** + +### Errors + +| Error Type | Status Code | Content Type | +| ---------------------------------- | ---------------------------------- | ---------------------------------- | +| errors.UnauthorizedResponseError | 401 | application/json | +| errors.NotFoundResponseError | 404 | application/json | +| errors.InternalServerResponseError | 500 | application/json | +| errors.OpenRouterDefaultError | 4XX, 5XX | \*/\* | + +## update + +Update a SCIM group mapping role. [Management key](/docs/guides/overview/auth/management-api-keys) required. + +### Example Usage + +```python +from openrouter import OpenRouter +import os + + +with OpenRouter( + http_referer="", + x_open_router_title="", + x_open_router_categories="", + api_key=os.getenv("OPENROUTER_API_KEY", ""), +) as open_router: + + res = open_router.scim.update(id="361a9698-8c34-4cbb-b0be-f6fd47094a30", role="member") + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | *str* | :heavy_check_mark: | N/A | +| `role` | [components.UpdateScimGroupMappingRequestRole](../../components/updatescimgroupmappingrequestrole.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. | + +### Response + +**[components.UpdateScimGroupMappingResponse](../../components/updatescimgroupmappingresponse.mdx)** + +### Errors + +| Error Type | Status Code | Content Type | +| ---------------------------------- | ---------------------------------- | ---------------------------------- | +| errors.BadRequestResponseError | 400 | application/json | +| errors.UnauthorizedResponseError | 401 | application/json | +| errors.NotFoundResponseError | 404 | application/json | +| errors.InternalServerResponseError | 500 | application/json | +| errors.OpenRouterDefaultError | 4XX, 5XX | \*/\* | + +## list_groups + +List SCIM groups for the organization. [Management key](/docs/guides/overview/auth/management-api-keys) required. + +### Example Usage + +```python +from openrouter import OpenRouter +import os + + +with OpenRouter( + http_referer="", + x_open_router_title="", + x_open_router_categories="", + api_key=os.getenv("OPENROUTER_API_KEY", ""), +) as open_router: + + res = open_router.scim.list_groups(offset=0, limit=50) + + while res is not None: + # Handle items + + res = res.next() + +``` + +### Parameters + +| 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` | *OptionalNullable[int]* | :heavy_minus_sign: | Number of records to skip for pagination | 0 | +| `limit` | *Optional[int]* | :heavy_minus_sign: | Maximum number of records to return (max 100) | 50 | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.mdx) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | | + +### Response + +**[operations.ListScimGroupsResponse](../../operations/listscimgroupsresponse.mdx)** + +### Errors + +| Error Type | Status Code | Content Type | +| ---------------------------------- | ---------------------------------- | ---------------------------------- | +| errors.UnauthorizedResponseError | 401 | application/json | +| errors.NotFoundResponseError | 404 | application/json | +| errors.InternalServerResponseError | 500 | application/json | +| errors.OpenRouterDefaultError | 4XX, 5XX | \*/\* | \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index df1602a8..70475e92 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "openrouter" -version = "1.1.19" +version = "1.1.20" 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 7eb9b4cf..473195b0 100644 --- a/src/openrouter/_version.py +++ b/src/openrouter/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "openrouter" -__version__: str = "1.1.19" +__version__: str = "1.1.20" __openapi_doc_version__: str = "1.0.0" __gen_version__: str = "2.914.0" -__user_agent__: str = "speakeasy-sdk/python 1.1.19 2.914.0 1.0.0 openrouter" +__user_agent__: str = "speakeasy-sdk/python 1.1.20 2.914.0 1.0.0 openrouter" try: if __package__ is not None: diff --git a/src/openrouter/components/__init__.py b/src/openrouter/components/__init__.py index 22427f8f..624a1748 100644 --- a/src/openrouter/components/__init__.py +++ b/src/openrouter/components/__init__.py @@ -811,6 +811,15 @@ CreatePresetFromInferenceResponse, CreatePresetFromInferenceResponseTypedDict, ) + from .createscimgroupmappingrequest import ( + CreateScimGroupMappingRequest, + CreateScimGroupMappingRequestRole, + CreateScimGroupMappingRequestTypedDict, + ) + from .createscimgroupmappingresponse import ( + CreateScimGroupMappingResponse, + CreateScimGroupMappingResponseTypedDict, + ) from .createworkspacerequest import ( CreateWorkspaceRequest, CreateWorkspaceRequestTypedDict, @@ -895,6 +904,10 @@ DeleteObservabilityDestinationResponse, DeleteObservabilityDestinationResponseTypedDict, ) + from .deletescimgroupmappingresponse import ( + DeleteScimGroupMappingResponse, + DeleteScimGroupMappingResponseTypedDict, + ) from .deleteworkspacebudgetresponse import ( DeleteWorkspaceBudgetResponse, DeleteWorkspaceBudgetResponseTypedDict, @@ -1164,6 +1177,10 @@ GetPresetVersionResponse, GetPresetVersionResponseTypedDict, ) + from .getscimgroupmappingresponse import ( + GetScimGroupMappingResponse, + GetScimGroupMappingResponseTypedDict, + ) from .getworkspaceresponse import ( GetWorkspaceResponse, GetWorkspaceResponseTypedDict, @@ -1431,6 +1448,14 @@ ListPresetVersionsResponse, ListPresetVersionsResponseTypedDict, ) + from .listscimgroupmappingsresponse import ( + ListScimGroupMappingsResponse, + ListScimGroupMappingsResponseTypedDict, + ) + from .listscimgroupsresponse import ( + ListScimGroupsResponse, + ListScimGroupsResponseTypedDict, + ) from .listworkspacebudgetsresponse import ( ListWorkspaceBudgetsResponse, ListWorkspaceBudgetsResponseTypedDict, @@ -2553,6 +2578,12 @@ from .routerattempt import RouterAttempt, RouterAttemptTypedDict from .routerparams import RouterParams, RouterParamsTypedDict from .routingstrategy import RoutingStrategy + from .scimgroup import ScimGroup, ScimGroupTypedDict + from .scimgroupmapping import ( + ScimGroupMapping, + ScimGroupMappingRole, + ScimGroupMappingTypedDict, + ) from .searchcontextsizeenum import SearchContextSizeEnum from .searchmodelsservertool_openrouter import ( SearchModelsServerToolOpenRouter, @@ -2832,6 +2863,15 @@ UpdateObservabilityDestinationResponse, UpdateObservabilityDestinationResponseTypedDict, ) + from .updatescimgroupmappingrequest import ( + UpdateScimGroupMappingRequest, + UpdateScimGroupMappingRequestRole, + UpdateScimGroupMappingRequestTypedDict, + ) + from .updatescimgroupmappingresponse import ( + UpdateScimGroupMappingResponse, + UpdateScimGroupMappingResponseTypedDict, + ) from .updateworkspacerequest import ( UpdateWorkspaceRequest, UpdateWorkspaceRequestTypedDict, @@ -3548,6 +3588,11 @@ "CreateObservabilityDestinationResponseTypedDict", "CreatePresetFromInferenceResponse", "CreatePresetFromInferenceResponseTypedDict", + "CreateScimGroupMappingRequest", + "CreateScimGroupMappingRequestRole", + "CreateScimGroupMappingRequestTypedDict", + "CreateScimGroupMappingResponse", + "CreateScimGroupMappingResponseTypedDict", "CreateWorkspaceRequest", "CreateWorkspaceRequestTypedDict", "CreateWorkspaceResponse", @@ -3598,6 +3643,8 @@ "DeleteGuardrailResponseTypedDict", "DeleteObservabilityDestinationResponse", "DeleteObservabilityDestinationResponseTypedDict", + "DeleteScimGroupMappingResponse", + "DeleteScimGroupMappingResponseTypedDict", "DeleteWorkspaceBudgetResponse", "DeleteWorkspaceBudgetResponseTypedDict", "DeleteWorkspaceResponse", @@ -3799,6 +3846,8 @@ "GetPresetResponseTypedDict", "GetPresetVersionResponse", "GetPresetVersionResponseTypedDict", + "GetScimGroupMappingResponse", + "GetScimGroupMappingResponseTypedDict", "GetWorkspaceResponse", "GetWorkspaceResponseTypedDict", "Guardrail", @@ -4013,6 +4062,10 @@ "ListPresetVersionsResponseTypedDict", "ListPresetsResponse", "ListPresetsResponseTypedDict", + "ListScimGroupMappingsResponse", + "ListScimGroupMappingsResponseTypedDict", + "ListScimGroupsResponse", + "ListScimGroupsResponseTypedDict", "ListWorkspaceBudgetsResponse", "ListWorkspaceBudgetsResponseTypedDict", "ListWorkspaceMembersResponse", @@ -4759,6 +4812,11 @@ "STTUsageTypedDict", "STTWord", "STTWordTypedDict", + "ScimGroup", + "ScimGroupMapping", + "ScimGroupMappingRole", + "ScimGroupMappingTypedDict", + "ScimGroupTypedDict", "SearchContextSizeEnum", "SearchModelsServerToolConfig", "SearchModelsServerToolConfigTypedDict", @@ -5053,6 +5111,11 @@ "UpdateObservabilityDestinationRequestTypedDict", "UpdateObservabilityDestinationResponse", "UpdateObservabilityDestinationResponseTypedDict", + "UpdateScimGroupMappingRequest", + "UpdateScimGroupMappingRequestRole", + "UpdateScimGroupMappingRequestTypedDict", + "UpdateScimGroupMappingResponse", + "UpdateScimGroupMappingResponseTypedDict", "UpdateWorkspaceRequest", "UpdateWorkspaceRequestTypedDict", "UpdateWorkspaceResponse", @@ -5701,6 +5764,11 @@ "CreateObservabilityDestinationResponseTypedDict": ".createobservabilitydestinationresponse", "CreatePresetFromInferenceResponse": ".createpresetfrominferenceresponse", "CreatePresetFromInferenceResponseTypedDict": ".createpresetfrominferenceresponse", + "CreateScimGroupMappingRequest": ".createscimgroupmappingrequest", + "CreateScimGroupMappingRequestRole": ".createscimgroupmappingrequest", + "CreateScimGroupMappingRequestTypedDict": ".createscimgroupmappingrequest", + "CreateScimGroupMappingResponse": ".createscimgroupmappingresponse", + "CreateScimGroupMappingResponseTypedDict": ".createscimgroupmappingresponse", "CreateWorkspaceRequest": ".createworkspacerequest", "CreateWorkspaceRequestTypedDict": ".createworkspacerequest", "CreateWorkspaceResponse": ".createworkspaceresponse", @@ -5761,6 +5829,8 @@ "DeleteGuardrailResponseTypedDict": ".deleteguardrailresponse", "DeleteObservabilityDestinationResponse": ".deleteobservabilitydestinationresponse", "DeleteObservabilityDestinationResponseTypedDict": ".deleteobservabilitydestinationresponse", + "DeleteScimGroupMappingResponse": ".deletescimgroupmappingresponse", + "DeleteScimGroupMappingResponseTypedDict": ".deletescimgroupmappingresponse", "DeleteWorkspaceBudgetResponse": ".deleteworkspacebudgetresponse", "DeleteWorkspaceBudgetResponseTypedDict": ".deleteworkspacebudgetresponse", "DeleteWorkspaceResponse": ".deleteworkspaceresponse", @@ -5967,6 +6037,8 @@ "GetPresetResponseTypedDict": ".getpresetresponse", "GetPresetVersionResponse": ".getpresetversionresponse", "GetPresetVersionResponseTypedDict": ".getpresetversionresponse", + "GetScimGroupMappingResponse": ".getscimgroupmappingresponse", + "GetScimGroupMappingResponseTypedDict": ".getscimgroupmappingresponse", "GetWorkspaceResponse": ".getworkspaceresponse", "GetWorkspaceResponseTypedDict": ".getworkspaceresponse", "Guardrail": ".guardrail", @@ -6173,6 +6245,10 @@ "ListPresetsResponseTypedDict": ".listpresetsresponse", "ListPresetVersionsResponse": ".listpresetversionsresponse", "ListPresetVersionsResponseTypedDict": ".listpresetversionsresponse", + "ListScimGroupMappingsResponse": ".listscimgroupmappingsresponse", + "ListScimGroupMappingsResponseTypedDict": ".listscimgroupmappingsresponse", + "ListScimGroupsResponse": ".listscimgroupsresponse", + "ListScimGroupsResponseTypedDict": ".listscimgroupsresponse", "ListWorkspaceBudgetsResponse": ".listworkspacebudgetsresponse", "ListWorkspaceBudgetsResponseTypedDict": ".listworkspacebudgetsresponse", "ListWorkspaceMembersResponse": ".listworkspacemembersresponse", @@ -7042,6 +7118,11 @@ "RouterParams": ".routerparams", "RouterParamsTypedDict": ".routerparams", "RoutingStrategy": ".routingstrategy", + "ScimGroup": ".scimgroup", + "ScimGroupTypedDict": ".scimgroup", + "ScimGroupMapping": ".scimgroupmapping", + "ScimGroupMappingRole": ".scimgroupmapping", + "ScimGroupMappingTypedDict": ".scimgroupmapping", "SearchContextSizeEnum": ".searchcontextsizeenum", "SearchModelsServerToolOpenRouter": ".searchmodelsservertool_openrouter", "SearchModelsServerToolOpenRouterType": ".searchmodelsservertool_openrouter", @@ -7231,6 +7312,11 @@ "UpdateObservabilityDestinationRequestTypedDict": ".updateobservabilitydestinationrequest", "UpdateObservabilityDestinationResponse": ".updateobservabilitydestinationresponse", "UpdateObservabilityDestinationResponseTypedDict": ".updateobservabilitydestinationresponse", + "UpdateScimGroupMappingRequest": ".updatescimgroupmappingrequest", + "UpdateScimGroupMappingRequestRole": ".updatescimgroupmappingrequest", + "UpdateScimGroupMappingRequestTypedDict": ".updatescimgroupmappingrequest", + "UpdateScimGroupMappingResponse": ".updatescimgroupmappingresponse", + "UpdateScimGroupMappingResponseTypedDict": ".updatescimgroupmappingresponse", "UpdateWorkspaceRequest": ".updateworkspacerequest", "UpdateWorkspaceRequestTypedDict": ".updateworkspacerequest", "UpdateWorkspaceResponse": ".updateworkspaceresponse", diff --git a/src/openrouter/components/createscimgroupmappingrequest.py b/src/openrouter/components/createscimgroupmappingrequest.py new file mode 100644 index 00000000..f451191b --- /dev/null +++ b/src/openrouter/components/createscimgroupmappingrequest.py @@ -0,0 +1,29 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel, UnrecognizedStr +from typing import Literal, Union +from typing_extensions import TypedDict + + +CreateScimGroupMappingRequestRole = Union[ + Literal[ + "admin", + "member", + ], + UnrecognizedStr, +] + + +class CreateScimGroupMappingRequestTypedDict(TypedDict): + role: CreateScimGroupMappingRequestRole + scim_group_id: str + workspace_id: str + + +class CreateScimGroupMappingRequest(BaseModel): + role: CreateScimGroupMappingRequestRole + + scim_group_id: str + + workspace_id: str diff --git a/src/openrouter/components/createscimgroupmappingresponse.py b/src/openrouter/components/createscimgroupmappingresponse.py new file mode 100644 index 00000000..7fde9784 --- /dev/null +++ b/src/openrouter/components/createscimgroupmappingresponse.py @@ -0,0 +1,14 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .scimgroupmapping import ScimGroupMapping, ScimGroupMappingTypedDict +from openrouter.types import BaseModel +from typing_extensions import TypedDict + + +class CreateScimGroupMappingResponseTypedDict(TypedDict): + data: ScimGroupMappingTypedDict + + +class CreateScimGroupMappingResponse(BaseModel): + data: ScimGroupMapping diff --git a/src/openrouter/components/deletescimgroupmappingresponse.py b/src/openrouter/components/deletescimgroupmappingresponse.py new file mode 100644 index 00000000..08a2289f --- /dev/null +++ b/src/openrouter/components/deletescimgroupmappingresponse.py @@ -0,0 +1,26 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel +from openrouter.utils import validate_const +import pydantic +from pydantic.functional_validators import AfterValidator +from typing import Literal +from typing_extensions import Annotated, TypedDict + + +class DeleteScimGroupMappingResponseTypedDict(TypedDict): + deleted: Literal[True] + + +class DeleteScimGroupMappingResponse(BaseModel): + DELETED: Annotated[ + Annotated[Literal[True], AfterValidator(validate_const(True))], + pydantic.Field(alias="deleted"), + ] = True + + +try: + DeleteScimGroupMappingResponse.model_rebuild() +except NameError: + pass diff --git a/src/openrouter/components/getscimgroupmappingresponse.py b/src/openrouter/components/getscimgroupmappingresponse.py new file mode 100644 index 00000000..cfca9a05 --- /dev/null +++ b/src/openrouter/components/getscimgroupmappingresponse.py @@ -0,0 +1,14 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .scimgroupmapping import ScimGroupMapping, ScimGroupMappingTypedDict +from openrouter.types import BaseModel +from typing_extensions import TypedDict + + +class GetScimGroupMappingResponseTypedDict(TypedDict): + data: ScimGroupMappingTypedDict + + +class GetScimGroupMappingResponse(BaseModel): + data: ScimGroupMapping diff --git a/src/openrouter/components/listscimgroupmappingsresponse.py b/src/openrouter/components/listscimgroupmappingsresponse.py new file mode 100644 index 00000000..546ec322 --- /dev/null +++ b/src/openrouter/components/listscimgroupmappingsresponse.py @@ -0,0 +1,18 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .scimgroupmapping import ScimGroupMapping, ScimGroupMappingTypedDict +from openrouter.types import BaseModel +from typing import List +from typing_extensions import TypedDict + + +class ListScimGroupMappingsResponseTypedDict(TypedDict): + data: List[ScimGroupMappingTypedDict] + total_count: int + + +class ListScimGroupMappingsResponse(BaseModel): + data: List[ScimGroupMapping] + + total_count: int diff --git a/src/openrouter/components/listscimgroupsresponse.py b/src/openrouter/components/listscimgroupsresponse.py new file mode 100644 index 00000000..8eedc46a --- /dev/null +++ b/src/openrouter/components/listscimgroupsresponse.py @@ -0,0 +1,18 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .scimgroup import ScimGroup, ScimGroupTypedDict +from openrouter.types import BaseModel +from typing import List +from typing_extensions import TypedDict + + +class ListScimGroupsResponseTypedDict(TypedDict): + data: List[ScimGroupTypedDict] + total_count: int + + +class ListScimGroupsResponse(BaseModel): + data: List[ScimGroup] + + total_count: int diff --git a/src/openrouter/components/scimgroup.py b/src/openrouter/components/scimgroup.py new file mode 100644 index 00000000..4086c587 --- /dev/null +++ b/src/openrouter/components/scimgroup.py @@ -0,0 +1,43 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel, Nullable, UNSET_SENTINEL +from pydantic import model_serializer +from typing_extensions import TypedDict + + +class ScimGroupTypedDict(TypedDict): + created_at: str + display_name: str + external_id: Nullable[str] + id: str + organization_id: str + updated_at: str + + +class ScimGroup(BaseModel): + created_at: str + + display_name: str + + external_id: Nullable[str] + + id: str + + organization_id: str + + updated_at: str + + @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 diff --git a/src/openrouter/components/scimgroupmapping.py b/src/openrouter/components/scimgroupmapping.py new file mode 100644 index 00000000..b2e0acc5 --- /dev/null +++ b/src/openrouter/components/scimgroupmapping.py @@ -0,0 +1,41 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel, UnrecognizedStr +from typing import Literal, Union +from typing_extensions import TypedDict + + +ScimGroupMappingRole = Union[ + Literal[ + "admin", + "member", + ], + UnrecognizedStr, +] + + +class ScimGroupMappingTypedDict(TypedDict): + created_at: str + id: str + organization_id: str + role: ScimGroupMappingRole + scim_group_id: str + updated_at: str + workspace_id: str + + +class ScimGroupMapping(BaseModel): + created_at: str + + id: str + + organization_id: str + + role: ScimGroupMappingRole + + scim_group_id: str + + updated_at: str + + workspace_id: str diff --git a/src/openrouter/components/updatescimgroupmappingrequest.py b/src/openrouter/components/updatescimgroupmappingrequest.py new file mode 100644 index 00000000..a95a4e18 --- /dev/null +++ b/src/openrouter/components/updatescimgroupmappingrequest.py @@ -0,0 +1,23 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel, UnrecognizedStr +from typing import Literal, Union +from typing_extensions import TypedDict + + +UpdateScimGroupMappingRequestRole = Union[ + Literal[ + "admin", + "member", + ], + UnrecognizedStr, +] + + +class UpdateScimGroupMappingRequestTypedDict(TypedDict): + role: UpdateScimGroupMappingRequestRole + + +class UpdateScimGroupMappingRequest(BaseModel): + role: UpdateScimGroupMappingRequestRole diff --git a/src/openrouter/components/updatescimgroupmappingresponse.py b/src/openrouter/components/updatescimgroupmappingresponse.py new file mode 100644 index 00000000..2f110211 --- /dev/null +++ b/src/openrouter/components/updatescimgroupmappingresponse.py @@ -0,0 +1,14 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .scimgroupmapping import ScimGroupMapping, ScimGroupMappingTypedDict +from openrouter.types import BaseModel +from typing_extensions import TypedDict + + +class UpdateScimGroupMappingResponseTypedDict(TypedDict): + data: ScimGroupMappingTypedDict + + +class UpdateScimGroupMappingResponse(BaseModel): + data: ScimGroupMapping diff --git a/src/openrouter/operations/__init__.py b/src/openrouter/operations/__init__.py index 1044a7cf..71aa5c14 100644 --- a/src/openrouter/operations/__init__.py +++ b/src/openrouter/operations/__init__.py @@ -203,6 +203,12 @@ CreateResponsesResponse, CreateResponsesResponseTypedDict, ) + from .createscimgroupmapping import ( + CreateScimGroupMappingGlobals, + CreateScimGroupMappingGlobalsTypedDict, + CreateScimGroupMappingRequest, + CreateScimGroupMappingRequestTypedDict, + ) from .createvideos import ( CreateVideosGlobals, CreateVideosGlobalsTypedDict, @@ -247,6 +253,15 @@ DeleteObservabilityDestinationRequest, DeleteObservabilityDestinationRequestTypedDict, ) + from .deletescimgroupmapping import ( + DeleteScimGroupMappingGlobals, + DeleteScimGroupMappingGlobalsTypedDict, + DeleteScimGroupMappingRequest, + DeleteScimGroupMappingRequestTypedDict, + KeepMembers, + KeepMembersEnum, + KeepMembersTypedDict, + ) from .deleteworkspace import ( DeleteWorkspaceGlobals, DeleteWorkspaceGlobalsTypedDict, @@ -422,6 +437,12 @@ Modality, Period, ) + from .getscimgroupmapping import ( + GetScimGroupMappingGlobals, + GetScimGroupMappingGlobalsTypedDict, + GetScimGroupMappingRequest, + GetScimGroupMappingRequestTypedDict, + ) from .gettaskclassifications import ( GetTaskClassificationsGlobals, GetTaskClassificationsGlobalsTypedDict, @@ -622,6 +643,22 @@ ListProvidersResponse, ListProvidersResponseTypedDict, ) + from .listscimgroupmappings import ( + ListScimGroupMappingsGlobals, + ListScimGroupMappingsGlobalsTypedDict, + ListScimGroupMappingsRequest, + ListScimGroupMappingsRequestTypedDict, + ListScimGroupMappingsResponse, + ListScimGroupMappingsResponseTypedDict, + ) + from .listscimgroups import ( + ListScimGroupsGlobals, + ListScimGroupsGlobalsTypedDict, + ListScimGroupsRequest, + ListScimGroupsRequestTypedDict, + ListScimGroupsResponse, + ListScimGroupsResponseTypedDict, + ) from .listvideoscontent import ( ListVideosContentGlobals, ListVideosContentGlobalsTypedDict, @@ -738,6 +775,12 @@ UpdateObservabilityDestinationRequest, UpdateObservabilityDestinationRequestTypedDict, ) + from .updatescimgroupmapping import ( + UpdateScimGroupMappingGlobals, + UpdateScimGroupMappingGlobalsTypedDict, + UpdateScimGroupMappingRequest, + UpdateScimGroupMappingRequestTypedDict, + ) from .updateworkspace import ( UpdateWorkspaceGlobals, UpdateWorkspaceGlobalsTypedDict, @@ -902,6 +945,10 @@ "CreateResponsesRequestTypedDict", "CreateResponsesResponse", "CreateResponsesResponseTypedDict", + "CreateScimGroupMappingGlobals", + "CreateScimGroupMappingGlobalsTypedDict", + "CreateScimGroupMappingRequest", + "CreateScimGroupMappingRequestTypedDict", "CreateVideosGlobals", "CreateVideosGlobalsTypedDict", "CreateVideosRequest", @@ -933,6 +980,10 @@ "DeleteObservabilityDestinationGlobalsTypedDict", "DeleteObservabilityDestinationRequest", "DeleteObservabilityDestinationRequestTypedDict", + "DeleteScimGroupMappingGlobals", + "DeleteScimGroupMappingGlobalsTypedDict", + "DeleteScimGroupMappingRequest", + "DeleteScimGroupMappingRequestTypedDict", "DeleteWorkspaceBudgetGlobals", "DeleteWorkspaceBudgetGlobalsTypedDict", "DeleteWorkspaceBudgetRequest", @@ -1059,6 +1110,10 @@ "GetRankingsDailyGlobalsTypedDict", "GetRankingsDailyRequest", "GetRankingsDailyRequestTypedDict", + "GetScimGroupMappingGlobals", + "GetScimGroupMappingGlobalsTypedDict", + "GetScimGroupMappingRequest", + "GetScimGroupMappingRequestTypedDict", "GetTaskClassificationsGlobals", "GetTaskClassificationsGlobalsTypedDict", "GetTaskClassificationsRequest", @@ -1085,6 +1140,9 @@ "InputTypedDict", "InputUnion", "InputUnionTypedDict", + "KeepMembers", + "KeepMembersEnum", + "KeepMembersTypedDict", "LanguageType", "ListBYOKKeysGlobals", "ListBYOKKeysGlobalsTypedDict", @@ -1214,6 +1272,18 @@ "ListRequestTypedDict", "ListResponse", "ListResponseTypedDict", + "ListScimGroupMappingsGlobals", + "ListScimGroupMappingsGlobalsTypedDict", + "ListScimGroupMappingsRequest", + "ListScimGroupMappingsRequestTypedDict", + "ListScimGroupMappingsResponse", + "ListScimGroupMappingsResponseTypedDict", + "ListScimGroupsGlobals", + "ListScimGroupsGlobalsTypedDict", + "ListScimGroupsRequest", + "ListScimGroupsRequestTypedDict", + "ListScimGroupsResponse", + "ListScimGroupsResponseTypedDict", "ListVideosContentGlobals", "ListVideosContentGlobalsTypedDict", "ListVideosContentRequest", @@ -1315,6 +1385,10 @@ "UpdateObservabilityDestinationGlobalsTypedDict", "UpdateObservabilityDestinationRequest", "UpdateObservabilityDestinationRequestTypedDict", + "UpdateScimGroupMappingGlobals", + "UpdateScimGroupMappingGlobalsTypedDict", + "UpdateScimGroupMappingRequest", + "UpdateScimGroupMappingRequestTypedDict", "UpdateWorkspaceGlobals", "UpdateWorkspaceGlobalsTypedDict", "UpdateWorkspaceRequest", @@ -1500,6 +1574,10 @@ "CreateResponsesRequestTypedDict": ".createresponses", "CreateResponsesResponse": ".createresponses", "CreateResponsesResponseTypedDict": ".createresponses", + "CreateScimGroupMappingGlobals": ".createscimgroupmapping", + "CreateScimGroupMappingGlobalsTypedDict": ".createscimgroupmapping", + "CreateScimGroupMappingRequest": ".createscimgroupmapping", + "CreateScimGroupMappingRequestTypedDict": ".createscimgroupmapping", "CreateVideosGlobals": ".createvideos", "CreateVideosGlobalsTypedDict": ".createvideos", "CreateVideosRequest": ".createvideos", @@ -1530,6 +1608,13 @@ "DeleteObservabilityDestinationGlobalsTypedDict": ".deleteobservabilitydestination", "DeleteObservabilityDestinationRequest": ".deleteobservabilitydestination", "DeleteObservabilityDestinationRequestTypedDict": ".deleteobservabilitydestination", + "DeleteScimGroupMappingGlobals": ".deletescimgroupmapping", + "DeleteScimGroupMappingGlobalsTypedDict": ".deletescimgroupmapping", + "DeleteScimGroupMappingRequest": ".deletescimgroupmapping", + "DeleteScimGroupMappingRequestTypedDict": ".deletescimgroupmapping", + "KeepMembers": ".deletescimgroupmapping", + "KeepMembersEnum": ".deletescimgroupmapping", + "KeepMembersTypedDict": ".deletescimgroupmapping", "DeleteWorkspaceGlobals": ".deleteworkspace", "DeleteWorkspaceGlobalsTypedDict": ".deleteworkspace", "DeleteWorkspaceRequest": ".deleteworkspace", @@ -1665,6 +1750,10 @@ "LanguageType": ".getrankingsdaily", "Modality": ".getrankingsdaily", "Period": ".getrankingsdaily", + "GetScimGroupMappingGlobals": ".getscimgroupmapping", + "GetScimGroupMappingGlobalsTypedDict": ".getscimgroupmapping", + "GetScimGroupMappingRequest": ".getscimgroupmapping", + "GetScimGroupMappingRequestTypedDict": ".getscimgroupmapping", "GetTaskClassificationsGlobals": ".gettaskclassifications", "GetTaskClassificationsGlobalsTypedDict": ".gettaskclassifications", "GetTaskClassificationsRequest": ".gettaskclassifications", @@ -1815,6 +1904,18 @@ "ListProvidersRequestTypedDict": ".listproviders", "ListProvidersResponse": ".listproviders", "ListProvidersResponseTypedDict": ".listproviders", + "ListScimGroupMappingsGlobals": ".listscimgroupmappings", + "ListScimGroupMappingsGlobalsTypedDict": ".listscimgroupmappings", + "ListScimGroupMappingsRequest": ".listscimgroupmappings", + "ListScimGroupMappingsRequestTypedDict": ".listscimgroupmappings", + "ListScimGroupMappingsResponse": ".listscimgroupmappings", + "ListScimGroupMappingsResponseTypedDict": ".listscimgroupmappings", + "ListScimGroupsGlobals": ".listscimgroups", + "ListScimGroupsGlobalsTypedDict": ".listscimgroups", + "ListScimGroupsRequest": ".listscimgroups", + "ListScimGroupsRequestTypedDict": ".listscimgroups", + "ListScimGroupsResponse": ".listscimgroups", + "ListScimGroupsResponseTypedDict": ".listscimgroups", "ListVideosContentGlobals": ".listvideoscontent", "ListVideosContentGlobalsTypedDict": ".listvideoscontent", "ListVideosContentRequest": ".listvideoscontent", @@ -1907,6 +2008,10 @@ "UpdateObservabilityDestinationGlobalsTypedDict": ".updateobservabilitydestination", "UpdateObservabilityDestinationRequest": ".updateobservabilitydestination", "UpdateObservabilityDestinationRequestTypedDict": ".updateobservabilitydestination", + "UpdateScimGroupMappingGlobals": ".updatescimgroupmapping", + "UpdateScimGroupMappingGlobalsTypedDict": ".updatescimgroupmapping", + "UpdateScimGroupMappingRequest": ".updatescimgroupmapping", + "UpdateScimGroupMappingRequestTypedDict": ".updatescimgroupmapping", "UpdateWorkspaceGlobals": ".updateworkspace", "UpdateWorkspaceGlobalsTypedDict": ".updateworkspace", "UpdateWorkspaceRequest": ".updateworkspace", diff --git a/src/openrouter/operations/createscimgroupmapping.py b/src/openrouter/operations/createscimgroupmapping.py new file mode 100644 index 00000000..5e9dc6fb --- /dev/null +++ b/src/openrouter/operations/createscimgroupmapping.py @@ -0,0 +1,148 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.components import ( + createscimgroupmappingrequest as components_createscimgroupmappingrequest, +) +from openrouter.types import BaseModel, UNSET_SENTINEL +from openrouter.utils import FieldMetadata, HeaderMetadata, RequestMetadata +import pydantic +from pydantic import model_serializer +from typing import Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +class CreateScimGroupMappingGlobalsTypedDict(TypedDict): + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class CreateScimGroupMappingGlobals(BaseModel): + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"] + ) + 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 CreateScimGroupMappingRequestTypedDict(TypedDict): + create_scim_group_mapping_request: ( + components_createscimgroupmappingrequest.CreateScimGroupMappingRequestTypedDict + ) + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class CreateScimGroupMappingRequest(BaseModel): + create_scim_group_mapping_request: Annotated[ + components_createscimgroupmappingrequest.CreateScimGroupMappingRequest, + FieldMetadata(request=RequestMetadata(media_type="application/json")), + ] + + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"] + ) + 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/operations/deletescimgroupmapping.py b/src/openrouter/operations/deletescimgroupmapping.py new file mode 100644 index 00000000..fec5503f --- /dev/null +++ b/src/openrouter/operations/deletescimgroupmapping.py @@ -0,0 +1,173 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel, UNSET_SENTINEL, UnrecognizedStr +from openrouter.utils import ( + FieldMetadata, + HeaderMetadata, + PathParamMetadata, + QueryParamMetadata, +) +import pydantic +from pydantic import model_serializer +from typing import Literal, Optional, Union +from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict + + +class DeleteScimGroupMappingGlobalsTypedDict(TypedDict): + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class DeleteScimGroupMappingGlobals(BaseModel): + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"] + ) + 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 + + +KeepMembersEnum = Union[ + Literal[ + "true", + "false", + ], + UnrecognizedStr, +] + + +KeepMembersTypedDict = TypeAliasType( + "KeepMembersTypedDict", Union[KeepMembersEnum, bool] +) +r"""Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required.""" + + +KeepMembers = TypeAliasType("KeepMembers", Union[KeepMembersEnum, bool]) +r"""Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required.""" + + +class DeleteScimGroupMappingRequestTypedDict(TypedDict): + id: str + keep_members: KeepMembersTypedDict + r"""Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required.""" + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class DeleteScimGroupMappingRequest(BaseModel): + id: Annotated[ + str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False)) + ] + + keep_members: Annotated[ + KeepMembers, FieldMetadata(query=QueryParamMetadata(style="form", explode=True)) + ] + r"""Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required.""" + + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"] + ) + 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/operations/getscimgroupmapping.py b/src/openrouter/operations/getscimgroupmapping.py new file mode 100644 index 00000000..d930ef5a --- /dev/null +++ b/src/openrouter/operations/getscimgroupmapping.py @@ -0,0 +1,142 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel, UNSET_SENTINEL +from openrouter.utils import FieldMetadata, HeaderMetadata, PathParamMetadata +import pydantic +from pydantic import model_serializer +from typing import Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +class GetScimGroupMappingGlobalsTypedDict(TypedDict): + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class GetScimGroupMappingGlobals(BaseModel): + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"] + ) + 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 GetScimGroupMappingRequestTypedDict(TypedDict): + id: str + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class GetScimGroupMappingRequest(BaseModel): + id: Annotated[ + str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False)) + ] + + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"] + ) + 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/operations/listscimgroupmappings.py b/src/openrouter/operations/listscimgroupmappings.py new file mode 100644 index 00000000..a913e277 --- /dev/null +++ b/src/openrouter/operations/listscimgroupmappings.py @@ -0,0 +1,186 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.components import ( + listscimgroupmappingsresponse as components_listscimgroupmappingsresponse, +) +from openrouter.types import BaseModel, Nullable, OptionalNullable, UNSET_SENTINEL +from openrouter.utils import FieldMetadata, HeaderMetadata, QueryParamMetadata +import pydantic +from pydantic import model_serializer +from typing import Awaitable, Callable, Optional, Union +from typing_extensions import Annotated, NotRequired, TypedDict + + +class ListScimGroupMappingsGlobalsTypedDict(TypedDict): + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class ListScimGroupMappingsGlobals(BaseModel): + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"] + ) + 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 ListScimGroupMappingsRequestTypedDict(TypedDict): + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + offset: NotRequired[Nullable[int]] + r"""Number of records to skip for pagination""" + limit: NotRequired[int] + r"""Maximum number of records to return (max 100)""" + + +class ListScimGroupMappingsRequest(BaseModel): + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + offset: Annotated[ + OptionalNullable[int], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = 0 + r"""Number of records to skip for pagination""" + + limit: Annotated[ + Optional[int], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = 50 + r"""Maximum number of records to return (max 100)""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "HTTP-Referer", + "X-OpenRouter-Title", + "X-OpenRouter-Categories", + "offset", + "limit", + ] + ) + nullable_fields = set(["offset"]) + 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 ListScimGroupMappingsResponseTypedDict(TypedDict): + result: ( + components_listscimgroupmappingsresponse.ListScimGroupMappingsResponseTypedDict + ) + + +class ListScimGroupMappingsResponse(BaseModel): + next: Union[ + Callable[[], Optional[ListScimGroupMappingsResponse]], + Callable[[], Awaitable[Optional[ListScimGroupMappingsResponse]]], + ] + + result: components_listscimgroupmappingsresponse.ListScimGroupMappingsResponse diff --git a/src/openrouter/operations/listscimgroups.py b/src/openrouter/operations/listscimgroups.py new file mode 100644 index 00000000..8d3d678a --- /dev/null +++ b/src/openrouter/operations/listscimgroups.py @@ -0,0 +1,184 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.components import ( + listscimgroupsresponse as components_listscimgroupsresponse, +) +from openrouter.types import BaseModel, Nullable, OptionalNullable, UNSET_SENTINEL +from openrouter.utils import FieldMetadata, HeaderMetadata, QueryParamMetadata +import pydantic +from pydantic import model_serializer +from typing import Awaitable, Callable, Optional, Union +from typing_extensions import Annotated, NotRequired, TypedDict + + +class ListScimGroupsGlobalsTypedDict(TypedDict): + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class ListScimGroupsGlobals(BaseModel): + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"] + ) + 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 ListScimGroupsRequestTypedDict(TypedDict): + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + offset: NotRequired[Nullable[int]] + r"""Number of records to skip for pagination""" + limit: NotRequired[int] + r"""Maximum number of records to return (max 100)""" + + +class ListScimGroupsRequest(BaseModel): + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + offset: Annotated[ + OptionalNullable[int], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = 0 + r"""Number of records to skip for pagination""" + + limit: Annotated[ + Optional[int], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = 50 + r"""Maximum number of records to return (max 100)""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "HTTP-Referer", + "X-OpenRouter-Title", + "X-OpenRouter-Categories", + "offset", + "limit", + ] + ) + nullable_fields = set(["offset"]) + 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 ListScimGroupsResponseTypedDict(TypedDict): + result: components_listscimgroupsresponse.ListScimGroupsResponseTypedDict + + +class ListScimGroupsResponse(BaseModel): + next: Union[ + Callable[[], Optional[ListScimGroupsResponse]], + Callable[[], Awaitable[Optional[ListScimGroupsResponse]]], + ] + + result: components_listscimgroupsresponse.ListScimGroupsResponse diff --git a/src/openrouter/operations/updatescimgroupmapping.py b/src/openrouter/operations/updatescimgroupmapping.py new file mode 100644 index 00000000..2cceda1e --- /dev/null +++ b/src/openrouter/operations/updatescimgroupmapping.py @@ -0,0 +1,158 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.components import ( + updatescimgroupmappingrequest as components_updatescimgroupmappingrequest, +) +from openrouter.types import BaseModel, UNSET_SENTINEL +from openrouter.utils import ( + FieldMetadata, + HeaderMetadata, + PathParamMetadata, + RequestMetadata, +) +import pydantic +from pydantic import model_serializer +from typing import Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +class UpdateScimGroupMappingGlobalsTypedDict(TypedDict): + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class UpdateScimGroupMappingGlobals(BaseModel): + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"] + ) + 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 UpdateScimGroupMappingRequestTypedDict(TypedDict): + id: str + update_scim_group_mapping_request: ( + components_updatescimgroupmappingrequest.UpdateScimGroupMappingRequestTypedDict + ) + http_referer: NotRequired[str] + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + x_open_router_title: NotRequired[str] + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + x_open_router_categories: NotRequired[str] + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + +class UpdateScimGroupMappingRequest(BaseModel): + id: Annotated[ + str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False)) + ] + + update_scim_group_mapping_request: Annotated[ + components_updatescimgroupmappingrequest.UpdateScimGroupMappingRequest, + FieldMetadata(request=RequestMetadata(media_type="application/json")), + ] + + http_referer: Annotated[ + Optional[str], + pydantic.Field(alias="HTTP-Referer"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + """ + + x_open_router_title: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Title"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + """ + + x_open_router_categories: Annotated[ + Optional[str], + pydantic.Field(alias="X-OpenRouter-Categories"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"] + ) + 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/scim.py b/src/openrouter/scim.py new file mode 100644 index 00000000..f6ad93a8 --- /dev/null +++ b/src/openrouter/scim.py @@ -0,0 +1,1814 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from .basesdk import BaseSDK +from jsonpath import JSONPath +from openrouter import components, errors, operations, utils +from openrouter._hooks import HookContext +from openrouter.types import OptionalNullable, UNSET +from openrouter.utils import get_security_from_env +from openrouter.utils.unmarshal_json_response import unmarshal_json_response +from typing import Any, Awaitable, Dict, List, Mapping, Optional, Union + + +class Scim(BaseSDK): + r"""SCIM endpoints""" + + def list_mappings( + self, + *, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + offset: OptionalNullable[int] = 0, + limit: Optional[int] = 50, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[operations.ListScimGroupMappingsResponse]: + r"""List SCIM group mappings + + List SCIM group-to-workspace mappings for the organization. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param offset: Number of records to skip for pagination + :param limit: Maximum number of records to return (max 100) + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.ListScimGroupMappingsRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + offset=offset, + limit=limit, + ) + + req = self._build_request( + method="GET", + path="/scim/group-mappings", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.ListScimGroupMappingsGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="listScimGroupMappings", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + tags=["SCIM"], + extensions=None, + ), + request=req, + is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c), + retry_config=retry_config, + ) + + def next_func() -> Optional[operations.ListScimGroupMappingsResponse]: + 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 50 + if len(results[0]) < limit_: + return None + next_offset = offset + len(results[0]) + + return self.list_mappings( + 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 operations.ListScimGroupMappingsResponse( + result=unmarshal_json_response( + components.ListScimGroupMappingsResponse, http_res + ), + next=next_func, + ) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + async def list_mappings_async( + self, + *, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + offset: OptionalNullable[int] = 0, + limit: Optional[int] = 50, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[operations.ListScimGroupMappingsResponse]: + r"""List SCIM group mappings + + List SCIM group-to-workspace mappings for the organization. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param offset: Number of records to skip for pagination + :param limit: Maximum number of records to return (max 100) + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.ListScimGroupMappingsRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + offset=offset, + limit=limit, + ) + + req = self._build_request_async( + method="GET", + path="/scim/group-mappings", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.ListScimGroupMappingsGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="listScimGroupMappings", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + tags=["SCIM"], + extensions=None, + ), + request=req, + is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c), + retry_config=retry_config, + ) + + def next_func() -> ( + Awaitable[Optional[operations.ListScimGroupMappingsResponse]] + ): + 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 50 + if len(results[0]) < limit_: + return empty_result() + next_offset = offset + len(results[0]) + + return self.list_mappings_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 operations.ListScimGroupMappingsResponse( + result=unmarshal_json_response( + components.ListScimGroupMappingsResponse, http_res + ), + next=next_func, + ) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + def create( + self, + *, + role: components.CreateScimGroupMappingRequestRole, + scim_group_id: str, + workspace_id: str, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.CreateScimGroupMappingResponse: + r"""Create a SCIM group mapping + + Create a SCIM group-to-workspace role mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param role: + :param scim_group_id: + :param workspace_id: + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.CreateScimGroupMappingRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + create_scim_group_mapping_request=components.CreateScimGroupMappingRequest( + role=role, + scim_group_id=scim_group_id, + workspace_id=workspace_id, + ), + ) + + req = self._build_request( + method="POST", + path="/scim/group-mappings", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.CreateScimGroupMappingGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.create_scim_group_mapping_request, + False, + False, + "json", + components.CreateScimGroupMappingRequest, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="createScimGroupMapping", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + tags=["SCIM"], + extensions=None, + ), + request=req, + is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c), + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "201", "application/json"): + return unmarshal_json_response( + components.CreateScimGroupMappingResponse, http_res + ) + if utils.match_response(http_res, "400", "application/json"): + response_data = unmarshal_json_response( + errors.BadRequestResponseErrorData, http_res + ) + raise errors.BadRequestResponseError(response_data, http_res) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "409", "application/json"): + response_data = unmarshal_json_response( + errors.ConflictResponseErrorData, http_res + ) + raise errors.ConflictResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + async def create_async( + self, + *, + role: components.CreateScimGroupMappingRequestRole, + scim_group_id: str, + workspace_id: str, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.CreateScimGroupMappingResponse: + r"""Create a SCIM group mapping + + Create a SCIM group-to-workspace role mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param role: + :param scim_group_id: + :param workspace_id: + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.CreateScimGroupMappingRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + create_scim_group_mapping_request=components.CreateScimGroupMappingRequest( + role=role, + scim_group_id=scim_group_id, + workspace_id=workspace_id, + ), + ) + + req = self._build_request_async( + method="POST", + path="/scim/group-mappings", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.CreateScimGroupMappingGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.create_scim_group_mapping_request, + False, + False, + "json", + components.CreateScimGroupMappingRequest, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="createScimGroupMapping", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + tags=["SCIM"], + extensions=None, + ), + request=req, + is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c), + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "201", "application/json"): + return unmarshal_json_response( + components.CreateScimGroupMappingResponse, http_res + ) + if utils.match_response(http_res, "400", "application/json"): + response_data = unmarshal_json_response( + errors.BadRequestResponseErrorData, http_res + ) + raise errors.BadRequestResponseError(response_data, http_res) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "409", "application/json"): + response_data = unmarshal_json_response( + errors.ConflictResponseErrorData, http_res + ) + raise errors.ConflictResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + def delete( + self, + *, + id: str, + keep_members: Union[operations.KeepMembers, operations.KeepMembersTypedDict], + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.DeleteScimGroupMappingResponse: + r"""Delete a SCIM group mapping + + Delete a SCIM group-to-workspace mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param id: + :param keep_members: Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required. + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.DeleteScimGroupMappingRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + id=id, + keep_members=keep_members, + ) + + req = self._build_request( + method="DELETE", + path="/scim/group-mappings/{id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.DeleteScimGroupMappingGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="deleteScimGroupMapping", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + tags=["SCIM"], + extensions=None, + ), + request=req, + is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c), + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response( + components.DeleteScimGroupMappingResponse, http_res + ) + if utils.match_response(http_res, "400", "application/json"): + response_data = unmarshal_json_response( + errors.BadRequestResponseErrorData, http_res + ) + raise errors.BadRequestResponseError(response_data, http_res) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + async def delete_async( + self, + *, + id: str, + keep_members: Union[operations.KeepMembers, operations.KeepMembersTypedDict], + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.DeleteScimGroupMappingResponse: + r"""Delete a SCIM group mapping + + Delete a SCIM group-to-workspace mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param id: + :param keep_members: Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required. + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.DeleteScimGroupMappingRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + id=id, + keep_members=keep_members, + ) + + req = self._build_request_async( + method="DELETE", + path="/scim/group-mappings/{id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.DeleteScimGroupMappingGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="deleteScimGroupMapping", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + tags=["SCIM"], + extensions=None, + ), + request=req, + is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c), + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response( + components.DeleteScimGroupMappingResponse, http_res + ) + if utils.match_response(http_res, "400", "application/json"): + response_data = unmarshal_json_response( + errors.BadRequestResponseErrorData, http_res + ) + raise errors.BadRequestResponseError(response_data, http_res) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + def read( + self, + *, + id: str, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.GetScimGroupMappingResponse: + r"""Get a SCIM group mapping + + Get a SCIM group-to-workspace mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param id: + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.GetScimGroupMappingRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + id=id, + ) + + req = self._build_request( + method="GET", + path="/scim/group-mappings/{id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.GetScimGroupMappingGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="getScimGroupMapping", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + tags=["SCIM"], + extensions=None, + ), + request=req, + is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c), + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response( + components.GetScimGroupMappingResponse, http_res + ) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + async def read_async( + self, + *, + id: str, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.GetScimGroupMappingResponse: + r"""Get a SCIM group mapping + + Get a SCIM group-to-workspace mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param id: + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.GetScimGroupMappingRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + id=id, + ) + + req = self._build_request_async( + method="GET", + path="/scim/group-mappings/{id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.GetScimGroupMappingGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="getScimGroupMapping", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + tags=["SCIM"], + extensions=None, + ), + request=req, + is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c), + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response( + components.GetScimGroupMappingResponse, http_res + ) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + def update( + self, + *, + id: str, + role: components.UpdateScimGroupMappingRequestRole, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.UpdateScimGroupMappingResponse: + r"""Update a SCIM group mapping + + Update a SCIM group mapping role. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param id: + :param role: + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.UpdateScimGroupMappingRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + id=id, + update_scim_group_mapping_request=components.UpdateScimGroupMappingRequest( + role=role, + ), + ) + + req = self._build_request( + method="PATCH", + path="/scim/group-mappings/{id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.UpdateScimGroupMappingGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.update_scim_group_mapping_request, + False, + False, + "json", + components.UpdateScimGroupMappingRequest, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="updateScimGroupMapping", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + tags=["SCIM"], + extensions=None, + ), + request=req, + is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c), + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response( + components.UpdateScimGroupMappingResponse, http_res + ) + if utils.match_response(http_res, "400", "application/json"): + response_data = unmarshal_json_response( + errors.BadRequestResponseErrorData, http_res + ) + raise errors.BadRequestResponseError(response_data, http_res) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + async def update_async( + self, + *, + id: str, + role: components.UpdateScimGroupMappingRequestRole, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> components.UpdateScimGroupMappingResponse: + r"""Update a SCIM group mapping + + Update a SCIM group mapping role. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param id: + :param role: + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.UpdateScimGroupMappingRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + id=id, + update_scim_group_mapping_request=components.UpdateScimGroupMappingRequest( + role=role, + ), + ) + + req = self._build_request_async( + method="PATCH", + path="/scim/group-mappings/{id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.UpdateScimGroupMappingGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.update_scim_group_mapping_request, + False, + False, + "json", + components.UpdateScimGroupMappingRequest, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="updateScimGroupMapping", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + tags=["SCIM"], + extensions=None, + ), + request=req, + is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c), + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response( + components.UpdateScimGroupMappingResponse, http_res + ) + if utils.match_response(http_res, "400", "application/json"): + response_data = unmarshal_json_response( + errors.BadRequestResponseErrorData, http_res + ) + raise errors.BadRequestResponseError(response_data, http_res) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + def list_groups( + self, + *, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + offset: OptionalNullable[int] = 0, + limit: Optional[int] = 50, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[operations.ListScimGroupsResponse]: + r"""List SCIM groups + + List SCIM groups for the organization. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param offset: Number of records to skip for pagination + :param limit: Maximum number of records to return (max 100) + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.ListScimGroupsRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + offset=offset, + limit=limit, + ) + + req = self._build_request( + method="GET", + path="/scim/groups", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.ListScimGroupsGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="listScimGroups", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + tags=["SCIM"], + extensions=None, + ), + request=req, + is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c), + retry_config=retry_config, + ) + + def next_func() -> Optional[operations.ListScimGroupsResponse]: + 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 50 + if len(results[0]) < limit_: + return None + next_offset = offset + len(results[0]) + + return self.list_groups( + 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 operations.ListScimGroupsResponse( + result=unmarshal_json_response( + components.ListScimGroupsResponse, http_res + ), + next=next_func, + ) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) + + async def list_groups_async( + self, + *, + http_referer: Optional[str] = None, + x_open_router_title: Optional[str] = None, + x_open_router_categories: Optional[str] = None, + offset: OptionalNullable[int] = 0, + limit: Optional[int] = 50, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[operations.ListScimGroupsResponse]: + r"""List SCIM groups + + List SCIM groups for the organization. [Management key](/docs/guides/overview/auth/management-api-keys) required. + + :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. + This is used to track API usage per application. + + :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. + + :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. + + :param offset: Number of records to skip for pagination + :param limit: Maximum number of records to return (max 100) + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = operations.ListScimGroupsRequest( + http_referer=http_referer, + x_open_router_title=x_open_router_title, + x_open_router_categories=x_open_router_categories, + offset=offset, + limit=limit, + ) + + req = self._build_request_async( + method="GET", + path="/scim/groups", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=operations.ListScimGroupsGlobals( + http_referer=self.sdk_configuration.globals.http_referer, + x_open_router_title=self.sdk_configuration.globals.x_open_router_title, + x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="listScimGroups", + oauth2_scopes=None, + security_source=get_security_from_env( + self.sdk_configuration.security, components.Security + ), + tags=["SCIM"], + extensions=None, + ), + request=req, + is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c), + retry_config=retry_config, + ) + + def next_func() -> Awaitable[Optional[operations.ListScimGroupsResponse]]: + 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 50 + if len(results[0]) < limit_: + return empty_result() + next_offset = offset + len(results[0]) + + return self.list_groups_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 operations.ListScimGroupsResponse( + result=unmarshal_json_response( + components.ListScimGroupsResponse, http_res + ), + next=next_func, + ) + if utils.match_response(http_res, "401", "application/json"): + response_data = unmarshal_json_response( + errors.UnauthorizedResponseErrorData, http_res + ) + raise errors.UnauthorizedResponseError(response_data, http_res) + if utils.match_response(http_res, "404", "application/json"): + response_data = unmarshal_json_response( + errors.NotFoundResponseErrorData, http_res + ) + raise errors.NotFoundResponseError(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response( + errors.InternalServerResponseErrorData, http_res + ) + raise errors.InternalServerResponseError(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.OpenRouterDefaultError( + "API error occurred", http_res, http_res_text + ) + + raise errors.OpenRouterDefaultError("Unexpected response received", http_res) diff --git a/src/openrouter/sdk.py b/src/openrouter/sdk.py index 9fdcc2fc..3846f887 100644 --- a/src/openrouter/sdk.py +++ b/src/openrouter/sdk.py @@ -39,6 +39,7 @@ from openrouter.providers import Providers from openrouter.rerank import Rerank from openrouter.responses import Responses + from openrouter.scim import Scim from openrouter.stt import STT from openrouter.tts import TTS from openrouter.video_generation import VideoGeneration @@ -98,6 +99,8 @@ class OpenRouter(BaseSDK): r"""Rerank endpoints""" responses: "Responses" r"""OpenAI-compatible Responses API endpoints""" + scim: "Scim" + r"""SCIM endpoints""" video_generation: "VideoGeneration" r"""Video Generation endpoints""" workspaces: "Workspaces" @@ -128,6 +131,7 @@ class OpenRouter(BaseSDK): "providers": ("openrouter.providers", "Providers"), "rerank": ("openrouter.rerank", "Rerank"), "responses": ("openrouter.responses", "Responses"), + "scim": ("openrouter.scim", "Scim"), "video_generation": ("openrouter.video_generation", "VideoGeneration"), "workspaces": ("openrouter.workspaces", "Workspaces"), } diff --git a/uv.lock b/uv.lock index 26655c82..5f8d70b0 100644 --- a/uv.lock +++ b/uv.lock @@ -213,7 +213,7 @@ wheels = [ [[package]] name = "openrouter" -version = "1.1.19" +version = "1.1.20" source = { editable = "." } dependencies = [ { name = "httpcore" }, From 9bb699a1bdd4f2befe2dbcf060428e13bc73f52d Mon Sep 17 00:00:00 2001 From: "speakeasy-github[bot]" <128539517+speakeasy-github[bot]@users.noreply.github.com> Date: Thu, 30 Jul 2026 19:25:34 +0000 Subject: [PATCH 2/3] empty commit to trigger [run-tests] workflow From b49f4d1e512a017c9025b3f90d63d2b6389250bb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 30 Jul 2026 19:25:46 +0000 Subject: [PATCH 3/3] Chore: regenerate docs navigation Auto-generated-by: update-generated-files-action; https://github.com/OpenRouterTeam/python-sdk/actions/runs/30574775919 --- docs/docs.json | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docs.json b/docs/docs.json index a9ef22cd..918adb36 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -34,6 +34,7 @@ "sdks/providers/README", "sdks/rerank/README", "sdks/responses/README", + "sdks/scim/README", "sdks/stt/README", "sdks/tts/README", "sdks/videogeneration/README",