diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock
index 12eec51a..77da33bc 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: 3dfbbc516fcd4f5af7d4444fc707f4a0
+ docChecksum: 157312c7b959a008c5b97a61e81d7b20
docVersion: 1.0.0
speakeasyVersion: 1.787.0
generationVersion: 2.914.0
- releaseVersion: 1.3.3
- configChecksum: 96722859d244c41fff7e97c2d850ef5a
+ releaseVersion: 1.3.4
+ configChecksum: 6d3458d3bc1f63c5197abbbfacd0f546
repoURL: https://github.com/OpenRouterTeam/python-sdk.git
installationURL: https://github.com/OpenRouterTeam/python-sdk.git
published: true
persistentEdits:
- generation_id: 238eeb4e-1de5-4da0-bf88-48ebda54c506
- pristine_commit_hash: 63231bb192e7d72aee3d28b1cf9e78eae6c1087e
- pristine_tree_hash: 60835084ca22d26b5994989d72c24d0713e7fc50
+ generation_id: be106d32-4d4e-479e-ad07-e4aa0101c6fe
+ pristine_commit_hash: 587fb5041b57f27cf7d4ea2a19dcbdcadc2cc1c6
+ pristine_tree_hash: 37f7a2488d3b606ef14892f02dad55c0152eef43
features:
python:
acceptHeaders: 3.0.0
@@ -1804,8 +1804,8 @@ trackedFiles:
pristine_git_object: 643c118fe458c24cdaeca90edceadf1c7d1c9cc2
docs/components/chatrequestplugin.mdx:
id: 157782a43de6
- last_write_checksum: sha1:8facf5484222cfa6e7f233fae26bd9dd3bdb5904
- pristine_git_object: d49c7382f84afd7c312cc3b6db4ceefd4172f3f3
+ last_write_checksum: sha1:b7d5ba44a376c4bbd992a181a970def51d62bc36
+ pristine_git_object: 22dc3e6784760feb79c1c5e0c255d8c52c5c7dba
docs/components/chatrequestreasoning.mdx:
id: 8f0176992b3e
last_write_checksum: sha1:84576cd6513f125955685c7bdfe315ef886160eb
@@ -3954,6 +3954,14 @@ trackedFiles:
id: 4a97a0028d93
last_write_checksum: sha1:a80dda1fb6cc098102c643649ac1fac2c9df4bb9
pristine_git_object: 74c61e5f750e2df770862017b6b406065398ca9e
+ docs/components/jevrouterplugin.mdx:
+ id: 258aa7058bc5
+ last_write_checksum: sha1:772786a50c96e16cfef4665a03f707e67ff26e7c
+ pristine_git_object: 332536f6765995a19ef9bc591a127eb8c1382049
+ docs/components/jevrouterpluginid.mdx:
+ id: 30d920f53cde
+ last_write_checksum: sha1:dfc1a3a7d9011c2a15b475b51eaf48ad78856ff3
+ pristine_git_object: 5eb47c20b3849e3ad7d3ae15a2c999b30285e509
docs/components/keep.mdx:
id: c3da64331e76
last_write_checksum: sha1:f58b4b0416619717f16b37897c0cfe19bdac2362
@@ -4316,8 +4324,8 @@ trackedFiles:
pristine_git_object: fb2a55630750a5c10fe509403c6d95cbfa8373c5
docs/components/messagesrequestplugin.mdx:
id: 45918e4b5c26
- last_write_checksum: sha1:dc624f813cd9245dfe038b63dd436f000e4f6cd6
- pristine_git_object: f5c917a2f183599ae190138bca6bb2a46871ef07
+ last_write_checksum: sha1:f328f8077bc6db2baa5bd20a6cce630ec0703c64
+ pristine_git_object: 240da49cf68e7bb365767193999525e37905902c
docs/components/messagesrequesttool.mdx:
id: f9dc5aede7ad
last_write_checksum: sha1:dfa67d1bcd58e5743ba4bcd14d50bb1f5d2b836c
@@ -6204,8 +6212,8 @@ trackedFiles:
pristine_git_object: 61e284e3ec7cc02541b74e533300ba8072cc0e6c
docs/components/responsesrequestplugin.mdx:
id: 4d550c41c85f
- last_write_checksum: sha1:3f77f77765d7a5bcc3375e90d8c0a26512268ae3
- pristine_git_object: 7637e58f87f910ea410f981718295c20d79b6e51
+ last_write_checksum: sha1:6b8983d000776727ef4ae1b8f878c5116c983255
+ pristine_git_object: 70990bd403bd20926c3c8202fd61e6ea6268eff0
docs/components/responsesrequestservicetier.mdx:
id: 5000ee5983ff
last_write_checksum: sha1:3b17d5eb36a9a41d84fd38fc7478d9368975438a
@@ -9456,8 +9464,8 @@ trackedFiles:
pristine_git_object: 3e38f1a929f7d6b1d6de74604aa87e3d8f010544
pyproject.toml:
id: 5d07e7d72637
- last_write_checksum: sha1:578ab8b48f8c511ad6785a9ff61a39ba4acff610
- pristine_git_object: a94d517e1b84972de76b090b37585fb80e5c8318
+ last_write_checksum: sha1:c2a0293505cf4856714ceb9dda1b3c8f44bd0e4d
+ pristine_git_object: dd8635e88fdd50fd837dc3eeb6a1712e871ccf98
scripts/prepare_readme.py:
id: e0c5957a6035
last_write_checksum: sha1:77f44b60b98bc126557ec27391f91dfba764bb54
@@ -9484,8 +9492,8 @@ trackedFiles:
pristine_git_object: 86713cfea633e09d33b3d4e65281071fe20e6137
src/openrouter/_version.py:
id: d8d15ad6c586
- last_write_checksum: sha1:3903cafc0528515e036d3a9967f0729fa2479613
- pristine_git_object: 65c46806afb993ee9cd58f78b4930c67cfb4ab74
+ last_write_checksum: sha1:0560b44e32f6b1672056251e8ff85512d7d09594
+ pristine_git_object: 85647b680d04b750ec7ad5ba355d2db5731c5a92
src/openrouter/alpha.py:
id: 306c4d93308d
last_write_checksum: sha1:30f55a360f41376ab194b9ea725fe4e001a5ae1a
@@ -9532,8 +9540,8 @@ trackedFiles:
pristine_git_object: ad3d247954547814054c01989a2dff3d12b3e4e1
src/openrouter/components/__init__.py:
id: 81754e97b3f4
- last_write_checksum: sha1:66cb742b924019f5a71034b5f35c82417460032a
- pristine_git_object: 5c3c0093a18643a99523be50e960a0d0dddbd754
+ last_write_checksum: sha1:87da07af0941e246f7369f761ef79dd407c934a2
+ pristine_git_object: 26f2d3ddf7feb78661aa36786af1c39a08c92098
src/openrouter/components/aabenchmarkentry.py:
id: e2e0f0b48c82
last_write_checksum: sha1:fab4d9a24d2cea937bb749d46c5f83941e99d65c
@@ -10292,8 +10300,8 @@ trackedFiles:
pristine_git_object: 8bbde153b53887e426989fd5b0486b6dc1122810
src/openrouter/components/chatrequest.py:
id: 5e39eaefa9cf
- last_write_checksum: sha1:408b2e83158d3991c8df9efd13232f768609c1f0
- pristine_git_object: f5cd7c3b431837bc96a5000e0ba403df659854ec
+ last_write_checksum: sha1:a6cac9daba13ffa180d87cc64aa53de0d411b4aa
+ pristine_git_object: 416e26207d90de151047ce101a9d6ad49c6d44e9
src/openrouter/components/chatresult.py:
id: 9062fe2935fe
last_write_checksum: sha1:2ff1963c54e7e79500115c8549c8d395f4e336d1
@@ -11222,6 +11230,10 @@ trackedFiles:
id: d3c42b5f11fb
last_write_checksum: sha1:25fd74f1c34307a97931e1d2c138a1db347218ad
pristine_git_object: b5a0bc16faa52f26d293eea18183e4d0b0bbb901
+ src/openrouter/components/jevrouterplugin.py:
+ id: fcb6e65e2e08
+ last_write_checksum: sha1:b616dfe462102792dd944877e043ba99e498bb3f
+ pristine_git_object: 6d55aa0ebee46e71aead739ad1a65f337d387c0c
src/openrouter/components/keyassignment.py:
id: 07a64362e7fd
last_write_checksum: sha1:4b47a6f1ab4992ec81d7236ca28dbf94d3a4fbaf
@@ -11372,8 +11384,8 @@ trackedFiles:
pristine_git_object: 7e69d1f775baece5f94b03d35bcd884d5e6f519d
src/openrouter/components/messagesrequest.py:
id: 72b1f339024d
- last_write_checksum: sha1:bc002830b658a7215f6dbf67967f35be24a5efc6
- pristine_git_object: 21aeffb2da5b1f0104aa7804b8105cf1f8381740
+ last_write_checksum: sha1:03a0d52a9d9c5dae3f9f58d4d6b1b0cc68423b16
+ pristine_git_object: 56976fb6055ade7dce6b574d221ad7471e1aea60
src/openrouter/components/messagessearchmodelsservertool.py:
id: 53d755edb120
last_write_checksum: sha1:389786fc22ba4bb47b0a086b7aa321f2f04fe943
@@ -12128,8 +12140,8 @@ trackedFiles:
pristine_git_object: 1364b9bd6384600f0f59afbe181eb0e940f686eb
src/openrouter/components/responsesrequest.py:
id: 8c850080ec5d
- last_write_checksum: sha1:8831ff3cb82f6fa3b0eaba2f51ea83122ec707e2
- pristine_git_object: 3bfc1035bf54b256022b27826b757467b4ba2583
+ last_write_checksum: sha1:28de0d1f80241721fe79a381e4d80cc421ba827d
+ pristine_git_object: e5665b8c7ac98d857160688ea5abeccffb359c39
src/openrouter/components/responsesstreamingresponse.py:
id: 142379f3bd90
last_write_checksum: sha1:a48d6f3610f5d15248ef4d25a0d88a0a4a1a9db7
@@ -17366,6 +17378,4 @@ examples:
"504":
application/json: {"error": {"code": 504, "message": "Vault request timed out"}}
examplesVersion: 1.0.2
-releaseNotes: |
- ## Python SDK Changes:
- * `open_router.batch.get_batches()`: `error.status[410]` **Added**
+releaseNotes: "## Python SDK Changes:\n* `open_router.chat.send()`: \n * `request.plugins[].union(jev-router)` **Added**\n* `open_router.presets.create_presets_chat_completions()`: \n * `request.plugins[].union(jev-router)` **Added**\n* `open_router.presets.create_presets_messages()`: \n * `request.plugins[].union(jev-router)` **Added**\n* `open_router.presets.create_presets_responses()`: \n * `request.plugins[].union(jev-router)` **Added**\n* `open_router.responses.send()`: \n * `request.plugins[].union(jev-router)` **Added**\n* `open_router.beta.responses.send()`: \n * `request.plugins[].union(jev-router)` **Added**\n"
diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml
index 56296796..a959c6b8 100644
--- a/.speakeasy/gen.yaml
+++ b/.speakeasy/gen.yaml
@@ -36,7 +36,7 @@ generation:
documentation: mintlify
preApplyUnionDiscriminators: true
python:
- version: 1.3.3
+ version: 1.3.4
additionalDependencies:
dev: {}
main: {}
diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml
index c595bac8..885e5575 100644
--- a/.speakeasy/out.openapi.yaml
+++ b/.speakeasy/out.openapi.yaml
@@ -7095,6 +7095,7 @@ components:
context-compression: '#/components/schemas/ContextCompressionPlugin'
file-parser: '#/components/schemas/FileParserPlugin'
fusion: '#/components/schemas/FusionPlugin'
+ jev-router: '#/components/schemas/JevRouterPlugin'
moderation: '#/components/schemas/ModerationPlugin'
pareto-router: '#/components/schemas/ParetoRouterPlugin'
response-healing: '#/components/schemas/ResponseHealingPlugin'
@@ -7114,6 +7115,7 @@ components:
- $ref: '#/components/schemas/ParetoRouterPlugin'
- $ref: '#/components/schemas/FusionPlugin'
- $ref: '#/components/schemas/SwitchyardRouterPlugin'
+ - $ref: '#/components/schemas/JevRouterPlugin'
type: 'array'
prediction:
$ref: '#/components/schemas/Prediction'
@@ -14969,6 +14971,42 @@ components:
- 'type'
- 'id'
type: 'object'
+ JevRouterPlugin:
+ example:
+ excluded_models:
+ - 'openai/gpt-6-astra'
+ id: 'jev-router'
+ models:
+ - 'anthropic/*'
+ - 'openai/gpt-5.6-sol'
+ properties:
+ excluded_models:
+ description: 'Remove these models from the router. Each entry is a model slug or a wildcard pattern (e.g. "xiaomi/*"). Up to 1024 patterns, each at most 1024 characters, with 65536 total characters across all patterns. Applied after `models`, so an excluded pattern always wins over an included one; excluding every pool model fails the request with 404 rather than routing to an excluded model.'
+ example:
+ - 'openai/gpt-6-astra'
+ - 'xiaomi/*'
+ items:
+ maxLength: 1024
+ type: 'string'
+ maxItems: 1024
+ type: 'array'
+ id:
+ enum:
+ - 'jev-router'
+ type: 'string'
+ models:
+ description: 'Restrict the router to these models. Each entry is a model slug or a wildcard pattern (e.g. "anthropic/*"), matched against the current pool; models outside the pool are ignored. Up to 1024 patterns, each at most 1024 characters, with 65536 total characters across all patterns. When omitted or empty, every model in the pool is a candidate; when no pool model matches, the list is ignored and the whole pool is used (`excluded_models` still apply).'
+ example:
+ - 'anthropic/*'
+ - 'openai/gpt-5.6-sol'
+ items:
+ maxLength: 1024
+ type: 'string'
+ maxItems: 1024
+ type: 'array'
+ required:
+ - 'id'
+ type: 'object'
KeyAssignment:
example:
assigned_by: 'user_abc123'
@@ -16774,6 +16812,7 @@ components:
context-compression: '#/components/schemas/ContextCompressionPlugin'
file-parser: '#/components/schemas/FileParserPlugin'
fusion: '#/components/schemas/FusionPlugin'
+ jev-router: '#/components/schemas/JevRouterPlugin'
moderation: '#/components/schemas/ModerationPlugin'
pareto-router: '#/components/schemas/ParetoRouterPlugin'
response-healing: '#/components/schemas/ResponseHealingPlugin'
@@ -16793,6 +16832,7 @@ components:
- $ref: '#/components/schemas/ParetoRouterPlugin'
- $ref: '#/components/schemas/FusionPlugin'
- $ref: '#/components/schemas/SwitchyardRouterPlugin'
+ - $ref: '#/components/schemas/JevRouterPlugin'
type: 'array'
provider:
$ref: '#/components/schemas/ProviderPreferences'
@@ -27079,6 +27119,7 @@ components:
context-compression: '#/components/schemas/ContextCompressionPlugin'
file-parser: '#/components/schemas/FileParserPlugin'
fusion: '#/components/schemas/FusionPlugin'
+ jev-router: '#/components/schemas/JevRouterPlugin'
moderation: '#/components/schemas/ModerationPlugin'
pareto-router: '#/components/schemas/ParetoRouterPlugin'
response-healing: '#/components/schemas/ResponseHealingPlugin'
@@ -27098,6 +27139,7 @@ components:
- $ref: '#/components/schemas/ParetoRouterPlugin'
- $ref: '#/components/schemas/FusionPlugin'
- $ref: '#/components/schemas/SwitchyardRouterPlugin'
+ - $ref: '#/components/schemas/JevRouterPlugin'
type: 'array'
presence_penalty:
format: 'double'
diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock
index ce5fa5b7..0981c667 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:067d6e5e2e54a2de16af352c4ac3a09be3883e97c6b3a1c4fca980435a7c89a0
- sourceBlobDigest: sha256:055a3b99945230c28460be38760423c9a3dc1370ac8a159ae16c70095cf6d8fc
+ sourceRevisionDigest: sha256:50fc549ec7810f15e96bc3caab0f272eac648edbdc5cf7b51a3785351fd5f21c
+ sourceBlobDigest: sha256:73f2116de241dc0914b0888e75b324cb7a0ce6e9188e7ad4a9d575cb0dc6bdfd
tags:
- latest
- 1.0.0
@@ -11,10 +11,10 @@ targets:
open-router:
source: OpenRouter API
sourceNamespace: open-router-chat-completions-api
- sourceRevisionDigest: sha256:067d6e5e2e54a2de16af352c4ac3a09be3883e97c6b3a1c4fca980435a7c89a0
- sourceBlobDigest: sha256:055a3b99945230c28460be38760423c9a3dc1370ac8a159ae16c70095cf6d8fc
+ sourceRevisionDigest: sha256:50fc549ec7810f15e96bc3caab0f272eac648edbdc5cf7b51a3785351fd5f21c
+ sourceBlobDigest: sha256:73f2116de241dc0914b0888e75b324cb7a0ce6e9188e7ad4a9d575cb0dc6bdfd
codeSamplesNamespace: open-router-python-code-samples
- codeSamplesRevisionDigest: sha256:430cf82504eed6be5fd5d1408039ba2cc9121e78a02fb02d7944d88e799d13ee
+ codeSamplesRevisionDigest: sha256:b989967bb870baa59b9c1fe69e3c7d0155f4743e4b47cee3d0343c4526182669
workflow:
workflowVersion: 1.0.0
speakeasyVersion: 1.787.0
diff --git a/RELEASES.md b/RELEASES.md
index c26690ef..8e0f677c 100644
--- a/RELEASES.md
+++ b/RELEASES.md
@@ -2799,4 +2799,14 @@ Based on:
### Generated
- [python v1.3.3] .
### Releases
-- [PyPI v1.3.3] https://pypi.org/project/openrouter/1.3.3 - .
\ No newline at end of file
+- [PyPI v1.3.3] https://pypi.org/project/openrouter/1.3.3 - .
+
+## 2026-09-29 14:24:23
+### Changes
+Based on:
+- OpenAPI Doc
+- Speakeasy CLI 1.787.0 (2.914.0) https://github.com/speakeasy-api/speakeasy
+### Generated
+- [python v1.3.4] .
+### Releases
+- [PyPI v1.3.4] https://pypi.org/project/openrouter/1.3.4 - .
\ No newline at end of file
diff --git a/docs/components/chatrequestplugin.mdx b/docs/components/chatrequestplugin.mdx
index d49c7382..22dc3e67 100644
--- a/docs/components/chatrequestplugin.mdx
+++ b/docs/components/chatrequestplugin.mdx
@@ -34,6 +34,12 @@ value: components.FileParserPlugin = /* values here */
value: components.FusionPlugin = /* values here */
```
+### `components.JevRouterPlugin`
+
+```python
+value: components.JevRouterPlugin = /* values here */
+```
+
### `components.ModerationPlugin`
```python
diff --git a/docs/components/jevrouterplugin.mdx b/docs/components/jevrouterplugin.mdx
new file mode 100644
index 00000000..332536f6
--- /dev/null
+++ b/docs/components/jevrouterplugin.mdx
@@ -0,0 +1,11 @@
+---
+title: "JevRouterPlugin"
+---
+
+## Fields
+
+| Field | Type | Required | Description | Example |
+| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `excluded_models` | List[*str*] | :heavy_minus_sign: | Remove these models from the router. Each entry is a model slug or a wildcard pattern (e.g. "xiaomi/*"). Up to 1024 patterns, each at most 1024 characters, with 65536 total characters across all patterns. Applied after `models`, so an excluded pattern always wins over an included one; excluding every pool model fails the request with 404 rather than routing to an excluded model. | [
"openai/gpt-6-astra",
"xiaomi/*"
] |
+| `id` | [components.JevRouterPluginID](../components/jevrouterpluginid.mdx) | :heavy_check_mark: | N/A | |
+| `models` | List[*str*] | :heavy_minus_sign: | Restrict the router to these models. Each entry is a model slug or a wildcard pattern (e.g. "anthropic/*"), matched against the current pool; models outside the pool are ignored. Up to 1024 patterns, each at most 1024 characters, with 65536 total characters across all patterns. When omitted or empty, every model in the pool is a candidate; when no pool model matches, the list is ignored and the whole pool is used (`excluded_models` still apply). | [
"anthropic/*",
"openai/gpt-5.6-sol"
] |
\ No newline at end of file
diff --git a/docs/components/jevrouterpluginid.mdx b/docs/components/jevrouterpluginid.mdx
new file mode 100644
index 00000000..5eb47c20
--- /dev/null
+++ b/docs/components/jevrouterpluginid.mdx
@@ -0,0 +1,15 @@
+---
+title: "JevRouterPluginID"
+---
+
+## Example Usage
+
+```python
+from openrouter.components import JevRouterPluginID
+value: JevRouterPluginID = "jev-router"
+```
+
+
+## Values
+
+- `"jev-router"`
diff --git a/docs/components/messagesrequestplugin.mdx b/docs/components/messagesrequestplugin.mdx
index f5c917a2..240da49c 100644
--- a/docs/components/messagesrequestplugin.mdx
+++ b/docs/components/messagesrequestplugin.mdx
@@ -34,6 +34,12 @@ value: components.FileParserPlugin = /* values here */
value: components.FusionPlugin = /* values here */
```
+### `components.JevRouterPlugin`
+
+```python
+value: components.JevRouterPlugin = /* values here */
+```
+
### `components.ModerationPlugin`
```python
diff --git a/docs/components/responsesrequestplugin.mdx b/docs/components/responsesrequestplugin.mdx
index 7637e58f..70990bd4 100644
--- a/docs/components/responsesrequestplugin.mdx
+++ b/docs/components/responsesrequestplugin.mdx
@@ -34,6 +34,12 @@ value: components.FileParserPlugin = /* values here */
value: components.FusionPlugin = /* values here */
```
+### `components.JevRouterPlugin`
+
+```python
+value: components.JevRouterPlugin = /* values here */
+```
+
### `components.ModerationPlugin`
```python
diff --git a/pyproject.toml b/pyproject.toml
index a94d517e..dd8635e8 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "openrouter"
-version = "1.3.3"
+version = "1.3.4"
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 65c46806..85647b68 100644
--- a/src/openrouter/_version.py
+++ b/src/openrouter/_version.py
@@ -3,10 +3,10 @@
import importlib.metadata
__title__: str = "openrouter"
-__version__: str = "1.3.3"
+__version__: str = "1.3.4"
__openapi_doc_version__: str = "1.0.0"
__gen_version__: str = "2.914.0"
-__user_agent__: str = "speakeasy-sdk/python 1.3.3 2.914.0 1.0.0 openrouter"
+__user_agent__: str = "speakeasy-sdk/python 1.3.4 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 5c3c0093..26f2d3dd 100644
--- a/src/openrouter/components/__init__.py
+++ b/src/openrouter/components/__init__.py
@@ -2214,6 +2214,11 @@
ItemReferenceItemType,
ItemReferenceItemTypedDict,
)
+ from .jevrouterplugin import (
+ JevRouterPlugin,
+ JevRouterPluginID,
+ JevRouterPluginTypedDict,
+ )
from .keyassignment import KeyAssignment, KeyAssignmentTypedDict
from .legacy_chatcontentvideo import (
LegacyChatContentVideo,
@@ -5673,6 +5678,9 @@
"ItemReferenceItem",
"ItemReferenceItemType",
"ItemReferenceItemTypedDict",
+ "JevRouterPlugin",
+ "JevRouterPluginID",
+ "JevRouterPluginTypedDict",
"Keep",
"KeepAll",
"KeepAllTypedDict",
@@ -8688,6 +8696,9 @@
"ItemReferenceItem": ".itemreferenceitem",
"ItemReferenceItemType": ".itemreferenceitem",
"ItemReferenceItemTypedDict": ".itemreferenceitem",
+ "JevRouterPlugin": ".jevrouterplugin",
+ "JevRouterPluginID": ".jevrouterplugin",
+ "JevRouterPluginTypedDict": ".jevrouterplugin",
"KeyAssignment": ".keyassignment",
"KeyAssignmentTypedDict": ".keyassignment",
"LegacyChatContentVideo": ".legacy_chatcontentvideo",
diff --git a/src/openrouter/components/chatrequest.py b/src/openrouter/components/chatrequest.py
index f5cd7c3b..416e2620 100644
--- a/src/openrouter/components/chatrequest.py
+++ b/src/openrouter/components/chatrequest.py
@@ -37,6 +37,7 @@
from .fileparserplugin import FileParserPlugin, FileParserPluginTypedDict
from .fusionplugin import FusionPlugin, FusionPluginTypedDict
from .imageconfig import ImageConfig, ImageConfigTypedDict
+from .jevrouterplugin import JevRouterPlugin, JevRouterPluginTypedDict
from .moderationplugin import ModerationPlugin, ModerationPluginTypedDict
from .paretorouterplugin import ParetoRouterPlugin, ParetoRouterPluginTypedDict
from .prediction import Prediction, PredictionTypedDict
@@ -86,6 +87,7 @@
SwitchyardRouterPluginTypedDict,
FileParserPluginTypedDict,
ContextCompressionPluginTypedDict,
+ JevRouterPluginTypedDict,
WebFetchPluginTypedDict,
ParetoRouterPluginTypedDict,
AutoBetaRouterPluginTypedDict,
@@ -103,6 +105,7 @@
Annotated[ContextCompressionPlugin, Tag("context-compression")],
Annotated[FileParserPlugin, Tag("file-parser")],
Annotated[FusionPlugin, Tag("fusion")],
+ Annotated[JevRouterPlugin, Tag("jev-router")],
Annotated[ModerationPlugin, Tag("moderation")],
Annotated[ParetoRouterPlugin, Tag("pareto-router")],
Annotated[ResponseHealingPlugin, Tag("response-healing")],
diff --git a/src/openrouter/components/jevrouterplugin.py b/src/openrouter/components/jevrouterplugin.py
new file mode 100644
index 00000000..6d55aa0e
--- /dev/null
+++ b/src/openrouter/components/jevrouterplugin.py
@@ -0,0 +1,44 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from openrouter.types import BaseModel, UNSET_SENTINEL
+from pydantic import model_serializer
+from typing import List, Literal, Optional
+from typing_extensions import NotRequired, TypedDict
+
+
+JevRouterPluginID = Literal["jev-router",]
+
+
+class JevRouterPluginTypedDict(TypedDict):
+ id: JevRouterPluginID
+ excluded_models: NotRequired[List[str]]
+ r"""Remove these models from the router. Each entry is a model slug or a wildcard pattern (e.g. \"xiaomi/*\"). Up to 1024 patterns, each at most 1024 characters, with 65536 total characters across all patterns. Applied after `models`, so an excluded pattern always wins over an included one; excluding every pool model fails the request with 404 rather than routing to an excluded model."""
+ models: NotRequired[List[str]]
+ r"""Restrict the router to these models. Each entry is a model slug or a wildcard pattern (e.g. \"anthropic/*\"), matched against the current pool; models outside the pool are ignored. Up to 1024 patterns, each at most 1024 characters, with 65536 total characters across all patterns. When omitted or empty, every model in the pool is a candidate; when no pool model matches, the list is ignored and the whole pool is used (`excluded_models` still apply)."""
+
+
+class JevRouterPlugin(BaseModel):
+ id: JevRouterPluginID
+
+ excluded_models: Optional[List[str]] = None
+ r"""Remove these models from the router. Each entry is a model slug or a wildcard pattern (e.g. \"xiaomi/*\"). Up to 1024 patterns, each at most 1024 characters, with 65536 total characters across all patterns. Applied after `models`, so an excluded pattern always wins over an included one; excluding every pool model fails the request with 404 rather than routing to an excluded model."""
+
+ models: Optional[List[str]] = None
+ r"""Restrict the router to these models. Each entry is a model slug or a wildcard pattern (e.g. \"anthropic/*\"), matched against the current pool; models outside the pool are ignored. Up to 1024 patterns, each at most 1024 characters, with 65536 total characters across all patterns. When omitted or empty, every model in the pool is a candidate; when no pool model matches, the list is ignored and the whole pool is used (`excluded_models` still apply)."""
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(["excluded_models", "models"])
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+
+ if val != UNSET_SENTINEL:
+ if val is not None or k not in optional_fields:
+ m[k] = val
+
+ return m
diff --git a/src/openrouter/components/messagesrequest.py b/src/openrouter/components/messagesrequest.py
index 21aeffb2..56976fb6 100644
--- a/src/openrouter/components/messagesrequest.py
+++ b/src/openrouter/components/messagesrequest.py
@@ -59,6 +59,7 @@
ImageGenerationServerToolOpenRouter,
ImageGenerationServerToolOpenRouterTypedDict,
)
+from .jevrouterplugin import JevRouterPlugin, JevRouterPluginTypedDict
from .messagesfallbackparam import MessagesFallbackParam, MessagesFallbackParamTypedDict
from .messagesmessageparam import MessagesMessageParam, MessagesMessageParamTypedDict
from .messagesoutputconfig import MessagesOutputConfig, MessagesOutputConfigTypedDict
@@ -378,6 +379,7 @@ def serialize_model(self, handler):
SwitchyardRouterPluginTypedDict,
FileParserPluginTypedDict,
ContextCompressionPluginTypedDict,
+ JevRouterPluginTypedDict,
WebFetchPluginTypedDict,
ParetoRouterPluginTypedDict,
AutoBetaRouterPluginTypedDict,
@@ -395,6 +397,7 @@ def serialize_model(self, handler):
Annotated[ContextCompressionPlugin, Tag("context-compression")],
Annotated[FileParserPlugin, Tag("file-parser")],
Annotated[FusionPlugin, Tag("fusion")],
+ Annotated[JevRouterPlugin, Tag("jev-router")],
Annotated[ModerationPlugin, Tag("moderation")],
Annotated[ParetoRouterPlugin, Tag("pareto-router")],
Annotated[ResponseHealingPlugin, Tag("response-healing")],
diff --git a/src/openrouter/components/responsesrequest.py b/src/openrouter/components/responsesrequest.py
index 3bfc1035..e5665b8c 100644
--- a/src/openrouter/components/responsesrequest.py
+++ b/src/openrouter/components/responsesrequest.py
@@ -48,6 +48,7 @@
ImageGenerationServerToolOpenRouterTypedDict,
)
from .inputs_union import InputsUnion, InputsUnionTypedDict
+from .jevrouterplugin import JevRouterPlugin, JevRouterPluginTypedDict
from .legacy_websearchservertool import (
LegacyWebSearchServerTool,
LegacyWebSearchServerToolTypedDict,
@@ -135,6 +136,7 @@
SwitchyardRouterPluginTypedDict,
FileParserPluginTypedDict,
ContextCompressionPluginTypedDict,
+ JevRouterPluginTypedDict,
WebFetchPluginTypedDict,
ParetoRouterPluginTypedDict,
AutoBetaRouterPluginTypedDict,
@@ -152,6 +154,7 @@
Annotated[ContextCompressionPlugin, Tag("context-compression")],
Annotated[FileParserPlugin, Tag("file-parser")],
Annotated[FusionPlugin, Tag("fusion")],
+ Annotated[JevRouterPlugin, Tag("jev-router")],
Annotated[ModerationPlugin, Tag("moderation")],
Annotated[ParetoRouterPlugin, Tag("pareto-router")],
Annotated[ResponseHealingPlugin, Tag("response-healing")],
diff --git a/uv.lock b/uv.lock
index ad0d434f..1019d15a 100644
--- a/uv.lock
+++ b/uv.lock
@@ -213,7 +213,7 @@ wheels = [
[[package]]
name = "openrouter"
-version = "1.3.3"
+version = "1.3.4"
source = { editable = "." }
dependencies = [
{ name = "httpcore" },