diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock
index 5abb7b0f..42ee5833 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: 7f61acc9f253327b431dd21c1a81a4c8
+ docChecksum: 9fb12aaa50aac47d52de2be119794664
docVersion: 1.0.0
speakeasyVersion: 1.787.0
generationVersion: 2.914.0
- releaseVersion: 1.1.73
- configChecksum: 5d33524b8c1752f7dc142880a4ce0225
+ releaseVersion: 1.1.74
+ configChecksum: a61a95459185f7b05d7d7e2145aca63a
repoURL: https://github.com/OpenRouterTeam/python-sdk.git
installationURL: https://github.com/OpenRouterTeam/python-sdk.git
published: true
persistentEdits:
- generation_id: 770d9b72-890a-4bd9-8dfd-897630f4a338
- pristine_commit_hash: 900541d2fb635af43bed09d5d9684c81b1102517
- pristine_tree_hash: 197d6c6c7fff87ce50bf863e6f6da5b9a281b8e5
+ generation_id: 77268ed9-3648-48e6-b202-d01ffe5f50a7
+ pristine_commit_hash: 605b3e3652e82e2bda19d3067379af1ae22902b2
+ pristine_tree_hash: 9bcdabb4954b7400973ed08c699093481edfa53b
features:
python:
acceptHeaders: 3.0.0
@@ -122,12 +122,12 @@ trackedFiles:
pristine_git_object: 129b2fdfb6379bb7c755bc13f0d92da88bac1eaf
docs/components/additionaltoolsitemtoolfunction.mdx:
id: b8c1e4fcad3b
- last_write_checksum: sha1:372d0aba8f1703b6a0d93905f2dbe4d068e50886
- pristine_git_object: 619939c0a51f1f4171680082ce7d5ec6b4a81225
+ last_write_checksum: sha1:4344c64fb23b3a08f005d6c5297cfbc4260c2f1d
+ pristine_git_object: 763371ba80d45c9ac6e93ebc4994c31f99d86781
docs/components/additionaltoolsitemtoolunion.mdx:
id: b3e8598b1887
- last_write_checksum: sha1:989ba14acb7cb2d5fb09fd46427781890a63aac8
- pristine_git_object: 137fc3f93d3e840ceb1bf0081a5ac9feaf098c1e
+ last_write_checksum: sha1:c20e105aabc3f29abd791bbd7ef68fac0797acb4
+ pristine_git_object: e3a111fa7ce46da62cfe98deda6050b3e9abfabc
docs/components/additionaltoolsitemtypefunction.mdx:
id: bf179b4008af
last_write_checksum: sha1:c0d4fee7d39fbd3d08c44bbe0e7b929350c5d7e8
@@ -2966,8 +2966,8 @@ trackedFiles:
pristine_git_object: d432bb08eebe7bdedf35bbbc41bf3c215ce71057
docs/components/messagesrequesttoolunion.mdx:
id: cb1be4df3cf7
- last_write_checksum: sha1:0ef88be729c7a50c272325132e38db25c1e6afe7
- pristine_git_object: 5fac516babc03cf57023521310fde1d9652b1d5a
+ last_write_checksum: sha1:83fc5d0c9de2a0dfa5402316069e43d06f9811d2
+ pristine_git_object: 74985719c686cdc1d2274f40443aba0c1f33e7c2
docs/components/messagessearchmodelsservertool.mdx:
id: 1f9f5edef4fe
last_write_checksum: sha1:5d3026e9fc2eda9ed7c5e8a08aff7f09514d666e
@@ -3622,8 +3622,8 @@ trackedFiles:
pristine_git_object: 53ba3e6a9b38896d18e2aae4bf7c6f90e3e1fac9
docs/components/openresponsesresulttoolfunction.mdx:
id: c9aad3ae216e
- last_write_checksum: sha1:1d1e83e998d4b48b279b720886fe3c5b6e41992f
- pristine_git_object: 9ccb4ab1cf60fe7e28fa73345c434569a9a9b661
+ last_write_checksum: sha1:a2885c85349f9f7e6bc8e7cc9af557ea8263cd8e
+ pristine_git_object: 94432e2c075924507512ef964eec077cc97fb538
docs/components/openresponsesresulttoolunion.mdx:
id: d43b7e93f04a
last_write_checksum: sha1:631474df38328aa73dd3a511412cbf6b111e2686
@@ -4650,12 +4650,12 @@ trackedFiles:
pristine_git_object: 61ea7fe276229819beff171a25ee0438233af94f
docs/components/responsesrequesttoolfunction.mdx:
id: dd0c817d15e6
- last_write_checksum: sha1:62c86a4a1d5536672f628e9ae66f4af3c33c7dd7
- pristine_git_object: 783bfa34989ba0d535cfd1126a68fd3601118639
+ last_write_checksum: sha1:dfa933e6efc523a2f07e96f6a5ae9e48dcd180a5
+ pristine_git_object: 19c144c13b8579663e9da47841244c7e0163a477
docs/components/responsesrequesttoolunion.mdx:
id: 96bafa5d19b1
- last_write_checksum: sha1:c626fc897137022d93c3bc9a1053353ded2c42ef
- pristine_git_object: e319e3ebeef4208dc3aac0cfcf29c7b32db52920
+ last_write_checksum: sha1:da69027ea97d06a56a22e1a6746bb5768895e5f5
+ pristine_git_object: e9024a4e9c6c343d7a04be37afbb959e73a943dc
docs/components/responsesrequesttype.mdx:
id: b2720876d384
last_write_checksum: sha1:9ed21e9f3c79e3936a4f6bc9df24eea499cc1e56
@@ -5172,6 +5172,18 @@ trackedFiles:
id: b3ea2dbc7af5
last_write_checksum: sha1:b05a11b62179ab9242129b616c4ac4e24357807b
pristine_git_object: e52e0f6a01c66838f7b55e4eef45e5612a2fb4e5
+ docs/components/toolsearchservertool.mdx:
+ id: 827c342fe25b
+ last_write_checksum: sha1:62eee3897b26cfc2097be04aeb24dc578da877ec
+ pristine_git_object: 4882b510c4490161a4f046b47d18177ad87e60b6
+ docs/components/toolsearchservertoolconfig.mdx:
+ id: 3a53a7a65bd2
+ last_write_checksum: sha1:c789bbf182dd8d27b356a117a8fc65120b87c5a2
+ pristine_git_object: f6ebf76349d4e4df6b643201d64fcd7668380fe0
+ docs/components/toolsearchservertooltype.mdx:
+ id: 3c5a694766ac
+ last_write_checksum: sha1:9313b534b5d041472686f48ecc04422eff265ed0
+ pristine_git_object: 34647574795a17ce650b9dd104e446cc1af79293
docs/components/tooltexteditor20250124.mdx:
id: 58d2a6f35f9f
last_write_checksum: sha1:c785aecfc38109c995d4d2f825de0f145d3f626a
@@ -7254,8 +7266,8 @@ trackedFiles:
pristine_git_object: 3e38f1a929f7d6b1d6de74604aa87e3d8f010544
pyproject.toml:
id: 5d07e7d72637
- last_write_checksum: sha1:596a34f32e3fe93c941603f44607714c631feeff
- pristine_git_object: 7ec9ca7c5e6c7f7804dd5ce2ed706b52b3f942fc
+ last_write_checksum: sha1:c3437c95d22e45f3befad9d4bc702dee50f3049f
+ pristine_git_object: 5770dd83565f8791e800a993f6a53bc37474459a
scripts/prepare_readme.py:
id: e0c5957a6035
last_write_checksum: sha1:77f44b60b98bc126557ec27391f91dfba764bb54
@@ -7282,8 +7294,8 @@ trackedFiles:
pristine_git_object: 86713cfea633e09d33b3d4e65281071fe20e6137
src/openrouter/_version.py:
id: d8d15ad6c586
- last_write_checksum: sha1:f2a1b3a9993bc144f67c88d263e7f8f7b4ee748f
- pristine_git_object: edb6ebdf6c6faf756a5909bffa446cfd9fa7be27
+ last_write_checksum: sha1:2af0372a8794ec342f03e2eba4a878262eec658b
+ pristine_git_object: c24e3acab130d362ad77dbd34bab17cae0dc643a
src/openrouter/analytics.py:
id: cb406b5aaabb
last_write_checksum: sha1:1e0004d8d1d5d797e2b54cd1cabeb7f9489d08e9
@@ -7322,8 +7334,8 @@ trackedFiles:
pristine_git_object: ad3d247954547814054c01989a2dff3d12b3e4e1
src/openrouter/components/__init__.py:
id: 81754e97b3f4
- last_write_checksum: sha1:05cff6f5d99fb06205b7b457f8e965456c55c622
- pristine_git_object: 677e80a0eb88bf4aef80c84f8842e7ba9f1d88df
+ last_write_checksum: sha1:10eb5b4457c1df6ac3e5c5a6b7dd17219aef5bf7
+ pristine_git_object: 668446597628e5005477ca7db4f3f709cf9d6d7a
src/openrouter/components/aabenchmarkentry.py:
id: e2e0f0b48c82
last_write_checksum: sha1:fab4d9a24d2cea937bb749d46c5f83941e99d65c
@@ -7338,8 +7350,8 @@ trackedFiles:
pristine_git_object: 1138e6f6bc025546a86877749ce83aca4c46499a
src/openrouter/components/additionaltoolsitem.py:
id: 2761ab789f41
- last_write_checksum: sha1:f711aac1f44184306bed8d816190208e8c73daa5
- pristine_git_object: c9851ef1cc4b9fadc8f0cb79089282ab0b0af941
+ last_write_checksum: sha1:d75a4da1f483d9824f22b9b4e044fe16dac2f6d2
+ pristine_git_object: a6fd0aabdb75e3d0d544ecacc2ecdbb8e42d720f
src/openrouter/components/advisorreasoning.py:
id: d5af5c19fc73
last_write_checksum: sha1:0fd32e4ff2d89f7cea861d6e691e82a7e1ff62f2
@@ -8618,8 +8630,8 @@ trackedFiles:
pristine_git_object: 7e69d1f775baece5f94b03d35bcd884d5e6f519d
src/openrouter/components/messagesrequest.py:
id: 72b1f339024d
- last_write_checksum: sha1:b315657f73e9f131207d75e3e5d4653b10e8fb79
- pristine_git_object: 6a458c9fc49c88bf033bc52b2a0cd98908438501
+ last_write_checksum: sha1:760292062d2ff56aff19302d8a2094c793704d7c
+ pristine_git_object: 28b51a4be794559958948c0e64bf6761b41e8139
src/openrouter/components/messagessearchmodelsservertool.py:
id: 53d755edb120
last_write_checksum: sha1:389786fc22ba4bb47b0a086b7aa321f2f04fe943
@@ -8846,8 +8858,8 @@ trackedFiles:
pristine_git_object: 08d990d8cc07b7928158fc55784cd9d613f4c58b
src/openrouter/components/openresponsesresult.py:
id: 78f7e33b19e6
- last_write_checksum: sha1:35ed4f39bfe05c8d56e14166be09adc76b3fb0ec
- pristine_git_object: f3be4e665351b3b08a77a2fa324ca88aad4ec4e9
+ last_write_checksum: sha1:05c792b6b0f54a5707b83527f8d81a50523cc932
+ pristine_git_object: 0c7d4a2b3338b97a21f3bf72966ecbc885f47008
src/openrouter/components/openrouterfile.py:
id: df1961bcb130
last_write_checksum: sha1:1a9a1b1e640f4d0ef78ce0caa160b5ab342f02cc
@@ -9282,8 +9294,8 @@ trackedFiles:
pristine_git_object: 11b1a626ea17887a412878504cece777689f12eb
src/openrouter/components/responsesrequest.py:
id: 8c850080ec5d
- last_write_checksum: sha1:cc946d7388766d9f64baedc3b1b63c432a52a416
- pristine_git_object: 6bec03bac66aae602f41b1d182c61d8431c5d8ea
+ last_write_checksum: sha1:ce1c8822e0686c8cd0ce3688cdb321633c7a4c20
+ pristine_git_object: 69b4de8c822d20e3058fd3de34d5c0d5beda0b5a
src/openrouter/components/responsesstreamingresponse.py:
id: 142379f3bd90
last_write_checksum: sha1:a48d6f3610f5d15248ef4d25a0d88a0a4a1a9db7
@@ -9552,6 +9564,14 @@ trackedFiles:
id: 9e2a14e87eac
last_write_checksum: sha1:b969135c75e9671fbbb6bc7a325968acacec07c7
pristine_git_object: 4ad8b7e6ed164dbe62f17aabed7352319c8bbe26
+ src/openrouter/components/toolsearchservertool.py:
+ id: 3aa6de41ca07
+ last_write_checksum: sha1:21dc898a1519400cbfbda4aa35eda60a9dcbf668
+ pristine_git_object: c196ed27fa8386e13f11fdb4ff065a4822717776
+ src/openrouter/components/toolsearchservertoolconfig.py:
+ id: 4eff6a010e3a
+ last_write_checksum: sha1:fc3916e0d3f3e6367ee334ac6352e33fa61b020d
+ pristine_git_object: b11985ecd61d1f212c00dd8b0d95e466cd5283b4
src/openrouter/components/toomanyrequestsresponseerrordata.py:
id: 4dc67ae011a1
last_write_checksum: sha1:d818b385d0725e729e5463b8d5f196d82b4340fe
@@ -12179,6 +12199,4 @@ examples:
"500":
application/json: {"error": {"code": 500, "message": "Internal Server Error"}}
examplesVersion: 1.0.2
-releaseNotes: |
- ## Python SDK Changes:
- * `open_router.embeddings.generate()`: `error` **Changed**
+releaseNotes: "## Python SDK Changes:\n* `open_router.presets.create_presets_responses()`: `request` **Changed** (Breaking ⚠️)\n* `open_router.responses.send()`: \n * `request` **Changed** (Breaking ⚠️)\n * `response` **Changed**\n* `open_router.beta.responses.send()`: \n * `request` **Changed** (Breaking ⚠️)\n * `response` **Changed**\n* `open_router.presets.create_presets_messages()`: \n * `request.tools[].union(ToolSearchServerTool)` **Added**\n"
diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml
index ec760452..447ad8e4 100644
--- a/.speakeasy/gen.yaml
+++ b/.speakeasy/gen.yaml
@@ -36,7 +36,7 @@ generation:
documentation: mintlify
preApplyUnionDiscriminators: true
python:
- version: 1.1.73
+ version: 1.1.74
additionalDependencies:
dev: {}
main: {}
diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml
index 96709c95..6e3c5977 100644
--- a/.speakeasy/out.openapi.yaml
+++ b/.speakeasy/out.openapi.yaml
@@ -191,7 +191,11 @@ components:
anyOf:
- allOf:
- $ref: '#/components/schemas/FunctionTool'
- - properties: {}
+ - properties:
+ defer_loading:
+ description: 'Withhold this tool from the model until `openrouter:tool_search` finds it. Requires the tool search server tool; at least one tool must remain non-deferred.'
+ example: true
+ type: 'boolean'
type: 'object'
description: 'Function tool definition'
example:
@@ -238,6 +242,7 @@ components:
- $ref: '#/components/schemas/ApplyPatchServerTool_OpenRouter'
- $ref: '#/components/schemas/BashServerTool'
- $ref: '#/components/schemas/ShellServerTool_OpenRouter'
+ - $ref: '#/components/schemas/ToolSearchServerTool'
- additionalProperties: {}
properties:
type:
@@ -4030,7 +4035,11 @@ components:
oneOf:
- allOf:
- $ref: '#/components/schemas/FunctionTool'
- - properties: {}
+ - properties:
+ defer_loading:
+ description: 'Withhold this tool from the model until `openrouter:tool_search` finds it. Requires the tool search server tool; at least one tool must remain non-deferred.'
+ example: true
+ type: 'boolean'
type: 'object'
description: 'Function tool definition'
example:
@@ -13537,6 +13546,7 @@ components:
- $ref: '#/components/schemas/AnthropicToolSearchToolBm25'
- $ref: '#/components/schemas/AnthropicToolSearchToolRegex'
- $ref: '#/components/schemas/ShellServerTool_OpenRouter'
+ - $ref: '#/components/schemas/ToolSearchServerTool'
type: 'array'
top_k:
type: 'integer'
@@ -22451,7 +22461,11 @@ components:
anyOf:
- allOf:
- $ref: '#/components/schemas/FunctionTool'
- - properties: {}
+ - properties:
+ defer_loading:
+ description: 'Withhold this tool from the model until `openrouter:tool_search` finds it. Requires the tool search server tool; at least one tool must remain non-deferred.'
+ example: true
+ type: 'boolean'
type: 'object'
description: 'Function tool definition'
example:
@@ -22498,6 +22512,7 @@ components:
- $ref: '#/components/schemas/ApplyPatchServerTool_OpenRouter'
- $ref: '#/components/schemas/BashServerTool'
- $ref: '#/components/schemas/ShellServerTool_OpenRouter'
+ - $ref: '#/components/schemas/ToolSearchServerTool'
type: 'array'
top_k:
type: 'integer'
@@ -24329,6 +24344,32 @@ components:
- 'mode'
- 'tools'
type: 'object'
+ ToolSearchServerTool:
+ description: 'OpenRouter built-in server tool: finds tools marked `defer_loading` and makes them callable'
+ example:
+ parameters:
+ max_results: 5
+ type: 'openrouter:tool_search'
+ properties:
+ parameters:
+ $ref: '#/components/schemas/ToolSearchServerToolConfig'
+ type:
+ enum:
+ - 'openrouter:tool_search'
+ type: 'string'
+ required:
+ - 'type'
+ type: 'object'
+ ToolSearchServerToolConfig:
+ description: 'Configuration for the openrouter:tool_search server tool'
+ example:
+ max_results: 5
+ properties:
+ max_results:
+ description: 'Maximum tools returned by one search. Defaults to 5.'
+ example: 5
+ type: 'integer'
+ type: 'object'
TooManyRequestsResponse:
description: 'Too Many Requests - Rate limit exceeded'
example:
diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock
index 737c30aa..ee8884a9 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:54c62e0ede60b1ce928e151b71bc1a2b893f66f69d05cd8b69c9ab390108ed52
- sourceBlobDigest: sha256:73c180204faa8d058c5a26286e5584cce319a6ce6b2725e594998a7d2ff864f0
+ sourceRevisionDigest: sha256:d938807249c4b04e2aa3e426d81beedfb2d8204bd8c5eddb9e144ee9c969c295
+ sourceBlobDigest: sha256:1f896360285d829673d1a92c48e1ed7ad2382a0c8c59f823a11cf275e4861b1e
tags:
- latest
- 1.0.0
@@ -11,10 +11,10 @@ targets:
open-router:
source: OpenRouter API
sourceNamespace: open-router-chat-completions-api
- sourceRevisionDigest: sha256:54c62e0ede60b1ce928e151b71bc1a2b893f66f69d05cd8b69c9ab390108ed52
- sourceBlobDigest: sha256:73c180204faa8d058c5a26286e5584cce319a6ce6b2725e594998a7d2ff864f0
+ sourceRevisionDigest: sha256:d938807249c4b04e2aa3e426d81beedfb2d8204bd8c5eddb9e144ee9c969c295
+ sourceBlobDigest: sha256:1f896360285d829673d1a92c48e1ed7ad2382a0c8c59f823a11cf275e4861b1e
codeSamplesNamespace: open-router-python-code-samples
- codeSamplesRevisionDigest: sha256:2929d46dab7551ac4b7990bbd4f41554b468397b95311906b5f8ceef7b8e81c7
+ codeSamplesRevisionDigest: sha256:1521a78c388b312f5f76799e2fc3ad010b754e359cdd3f401afd2ea52eea0f62
workflow:
workflowVersion: 1.0.0
speakeasyVersion: 1.787.0
diff --git a/RELEASES.md b/RELEASES.md
index 3ce59b80..1cd05a1e 100644
--- a/RELEASES.md
+++ b/RELEASES.md
@@ -1519,4 +1519,14 @@ Based on:
### Generated
- [python v1.1.73] .
### Releases
-- [PyPI v1.1.73] https://pypi.org/project/openrouter/1.1.73 - .
\ No newline at end of file
+- [PyPI v1.1.73] https://pypi.org/project/openrouter/1.1.73 - .
+
+## 2026-08-22 05:06:38
+### Changes
+Based on:
+- OpenAPI Doc
+- Speakeasy CLI 1.787.0 (2.914.0) https://github.com/speakeasy-api/speakeasy
+### Generated
+- [python v1.1.74] .
+### Releases
+- [PyPI v1.1.74] https://pypi.org/project/openrouter/1.1.74 - .
\ No newline at end of file
diff --git a/docs/components/additionaltoolsitemtoolfunction.mdx b/docs/components/additionaltoolsitemtoolfunction.mdx
index 619939c0..763371ba 100644
--- a/docs/components/additionaltoolsitemtoolfunction.mdx
+++ b/docs/components/additionaltoolsitemtoolfunction.mdx
@@ -7,10 +7,11 @@ Function tool definition
## Fields
-| Field | Type | Required | Description |
-| ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
-| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A |
-| `name` | *str* | :heavy_check_mark: | N/A |
-| `parameters` | Dict[str, *Any*] | :heavy_check_mark: | N/A |
-| `strict` | *OptionalNullable[bool]* | :heavy_minus_sign: | N/A |
-| `type` | [components.AdditionalToolsItemTypeFunction](../components/additionaltoolsitemtypefunction.mdx) | :heavy_check_mark: | N/A |
\ No newline at end of file
+| Field | Type | Required | Description | Example |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | |
+| `name` | *str* | :heavy_check_mark: | N/A | |
+| `parameters` | Dict[str, *Any*] | :heavy_check_mark: | N/A | |
+| `strict` | *OptionalNullable[bool]* | :heavy_minus_sign: | N/A | |
+| `type` | [components.AdditionalToolsItemTypeFunction](../components/additionaltoolsitemtypefunction.mdx) | :heavy_check_mark: | N/A | |
+| `defer_loading` | *Optional[bool]* | :heavy_minus_sign: | Withhold this tool from the model until `openrouter:tool_search` finds it. Requires the tool search server tool; at least one tool must remain non-deferred. | true |
\ No newline at end of file
diff --git a/docs/components/additionaltoolsitemtoolunion.mdx b/docs/components/additionaltoolsitemtoolunion.mdx
index 137fc3f9..e3a111fa 100644
--- a/docs/components/additionaltoolsitemtoolunion.mdx
+++ b/docs/components/additionaltoolsitemtoolunion.mdx
@@ -166,6 +166,12 @@ value: components.BashServerTool = /* values here */
value: components.ShellServerToolOpenRouter = /* values here */
```
+### `components.ToolSearchServerTool`
+
+```python
+value: components.ToolSearchServerTool = /* values here */
+```
+
### `components.AdditionalToolsItemTool`
```python
diff --git a/docs/components/messagesrequesttoolunion.mdx b/docs/components/messagesrequesttoolunion.mdx
index 5fac516b..74985719 100644
--- a/docs/components/messagesrequesttoolunion.mdx
+++ b/docs/components/messagesrequesttoolunion.mdx
@@ -100,3 +100,9 @@ value: components.AnthropicToolSearchToolRegex = /* values here */
value: components.ShellServerToolOpenRouter = /* values here */
```
+### `components.ToolSearchServerTool`
+
+```python
+value: components.ToolSearchServerTool = /* values here */
+```
+
diff --git a/docs/components/openresponsesresulttoolfunction.mdx b/docs/components/openresponsesresulttoolfunction.mdx
index 9ccb4ab1..94432e2c 100644
--- a/docs/components/openresponsesresulttoolfunction.mdx
+++ b/docs/components/openresponsesresulttoolfunction.mdx
@@ -7,10 +7,11 @@ Function tool definition
## Fields
-| Field | Type | Required | Description |
-| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ |
-| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A |
-| `name` | *str* | :heavy_check_mark: | N/A |
-| `parameters` | Dict[str, *Any*] | :heavy_check_mark: | N/A |
-| `strict` | *OptionalNullable[bool]* | :heavy_minus_sign: | N/A |
-| `type` | [components.OpenResponsesResultType](../components/openresponsesresulttype.mdx) | :heavy_check_mark: | N/A |
\ No newline at end of file
+| Field | Type | Required | Description | Example |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | |
+| `name` | *str* | :heavy_check_mark: | N/A | |
+| `parameters` | Dict[str, *Any*] | :heavy_check_mark: | N/A | |
+| `strict` | *OptionalNullable[bool]* | :heavy_minus_sign: | N/A | |
+| `type` | [components.OpenResponsesResultType](../components/openresponsesresulttype.mdx) | :heavy_check_mark: | N/A | |
+| `defer_loading` | *Optional[bool]* | :heavy_minus_sign: | Withhold this tool from the model until `openrouter:tool_search` finds it. Requires the tool search server tool; at least one tool must remain non-deferred. | true |
\ No newline at end of file
diff --git a/docs/components/responsesrequesttoolfunction.mdx b/docs/components/responsesrequesttoolfunction.mdx
index 783bfa34..19c144c1 100644
--- a/docs/components/responsesrequesttoolfunction.mdx
+++ b/docs/components/responsesrequesttoolfunction.mdx
@@ -7,10 +7,11 @@ Function tool definition
## Fields
-| Field | Type | Required | Description |
-| ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ |
-| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A |
-| `name` | *str* | :heavy_check_mark: | N/A |
-| `parameters` | Dict[str, *Any*] | :heavy_check_mark: | N/A |
-| `strict` | *OptionalNullable[bool]* | :heavy_minus_sign: | N/A |
-| `type` | [components.ResponsesRequestType](../components/responsesrequesttype.mdx) | :heavy_check_mark: | N/A |
\ No newline at end of file
+| Field | Type | Required | Description | Example |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | |
+| `name` | *str* | :heavy_check_mark: | N/A | |
+| `parameters` | Dict[str, *Any*] | :heavy_check_mark: | N/A | |
+| `strict` | *OptionalNullable[bool]* | :heavy_minus_sign: | N/A | |
+| `type` | [components.ResponsesRequestType](../components/responsesrequesttype.mdx) | :heavy_check_mark: | N/A | |
+| `defer_loading` | *Optional[bool]* | :heavy_minus_sign: | Withhold this tool from the model until `openrouter:tool_search` finds it. Requires the tool search server tool; at least one tool must remain non-deferred. | true |
\ No newline at end of file
diff --git a/docs/components/responsesrequesttoolunion.mdx b/docs/components/responsesrequesttoolunion.mdx
index e319e3eb..e9024a4e 100644
--- a/docs/components/responsesrequesttoolunion.mdx
+++ b/docs/components/responsesrequesttoolunion.mdx
@@ -166,3 +166,9 @@ value: components.BashServerTool = /* values here */
value: components.ShellServerToolOpenRouter = /* values here */
```
+### `components.ToolSearchServerTool`
+
+```python
+value: components.ToolSearchServerTool = /* values here */
+```
+
diff --git a/docs/components/toolsearchservertool.mdx b/docs/components/toolsearchservertool.mdx
new file mode 100644
index 00000000..4882b510
--- /dev/null
+++ b/docs/components/toolsearchservertool.mdx
@@ -0,0 +1,13 @@
+---
+title: "ToolSearchServerTool"
+---
+
+OpenRouter built-in server tool: finds tools marked `defer_loading` and makes them callable
+
+
+## Fields
+
+| Field | Type | Required | Description | Example |
+| ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
+| `parameters` | [Optional[components.ToolSearchServerToolConfig]](../components/toolsearchservertoolconfig.mdx) | :heavy_minus_sign: | Configuration for the openrouter:tool_search server tool | \{
"max_results": 5
} |
+| `type` | [components.ToolSearchServerToolType](../components/toolsearchservertooltype.mdx) | :heavy_check_mark: | N/A | |
\ No newline at end of file
diff --git a/docs/components/toolsearchservertoolconfig.mdx b/docs/components/toolsearchservertoolconfig.mdx
new file mode 100644
index 00000000..f6ebf763
--- /dev/null
+++ b/docs/components/toolsearchservertoolconfig.mdx
@@ -0,0 +1,12 @@
+---
+title: "ToolSearchServerToolConfig"
+---
+
+Configuration for the openrouter:tool_search server tool
+
+
+## Fields
+
+| Field | Type | Required | Description | Example |
+| ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- |
+| `max_results` | *Optional[int]* | :heavy_minus_sign: | Maximum tools returned by one search. Defaults to 5. | 5 |
\ No newline at end of file
diff --git a/docs/components/toolsearchservertooltype.mdx b/docs/components/toolsearchservertooltype.mdx
new file mode 100644
index 00000000..34647574
--- /dev/null
+++ b/docs/components/toolsearchservertooltype.mdx
@@ -0,0 +1,15 @@
+---
+title: "ToolSearchServerToolType"
+---
+
+## Example Usage
+
+```python
+from openrouter.components import ToolSearchServerToolType
+value: ToolSearchServerToolType = "openrouter:tool_search"
+```
+
+
+## Values
+
+- `"openrouter:tool_search"`
diff --git a/pyproject.toml b/pyproject.toml
index 7ec9ca7c..5770dd83 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "openrouter"
-version = "1.1.73"
+version = "1.1.74"
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 edb6ebdf..c24e3aca 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.73"
+__version__: str = "1.1.74"
__openapi_doc_version__: str = "1.0.0"
__gen_version__: str = "2.914.0"
-__user_agent__: str = "speakeasy-sdk/python 1.1.73 2.914.0 1.0.0 openrouter"
+__user_agent__: str = "speakeasy-sdk/python 1.1.74 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 677e80a0..66844659 100644
--- a/src/openrouter/components/__init__.py
+++ b/src/openrouter/components/__init__.py
@@ -2884,6 +2884,15 @@
ToolChoiceAllowedType,
ToolChoiceAllowedTypedDict,
)
+ from .toolsearchservertool import (
+ ToolSearchServerTool,
+ ToolSearchServerToolType,
+ ToolSearchServerToolTypedDict,
+ )
+ from .toolsearchservertoolconfig import (
+ ToolSearchServerToolConfig,
+ ToolSearchServerToolConfigTypedDict,
+ )
from .toomanyrequestsresponseerrordata import (
TooManyRequestsResponseErrorData,
TooManyRequestsResponseErrorDataTypedDict,
@@ -5151,6 +5160,11 @@
"ToolChoiceTypedDict",
"ToolCustom",
"ToolCustomTypedDict",
+ "ToolSearchServerTool",
+ "ToolSearchServerToolConfig",
+ "ToolSearchServerToolConfigTypedDict",
+ "ToolSearchServerToolType",
+ "ToolSearchServerToolTypedDict",
"ToolTextEditor20250124",
"ToolTextEditor20250124TypedDict",
"ToolTypeCustom",
@@ -7499,6 +7513,11 @@
"ToolChoiceAllowed": ".toolchoiceallowed",
"ToolChoiceAllowedType": ".toolchoiceallowed",
"ToolChoiceAllowedTypedDict": ".toolchoiceallowed",
+ "ToolSearchServerTool": ".toolsearchservertool",
+ "ToolSearchServerToolType": ".toolsearchservertool",
+ "ToolSearchServerToolTypedDict": ".toolsearchservertool",
+ "ToolSearchServerToolConfig": ".toolsearchservertoolconfig",
+ "ToolSearchServerToolConfigTypedDict": ".toolsearchservertoolconfig",
"TooManyRequestsResponseErrorData": ".toomanyrequestsresponseerrordata",
"TooManyRequestsResponseErrorDataTypedDict": ".toomanyrequestsresponseerrordata",
"TopProviderInfo": ".topproviderinfo",
diff --git a/src/openrouter/components/additionaltoolsitem.py b/src/openrouter/components/additionaltoolsitem.py
index c9851ef1..a6fd0aab 100644
--- a/src/openrouter/components/additionaltoolsitem.py
+++ b/src/openrouter/components/additionaltoolsitem.py
@@ -60,6 +60,7 @@
SubagentServerToolOpenRouter,
SubagentServerToolOpenRouterTypedDict,
)
+from .toolsearchservertool import ToolSearchServerTool, ToolSearchServerToolTypedDict
from .webfetchservertool import WebFetchServerTool, WebFetchServerToolTypedDict
from .websearchservertool import WebSearchServerTool, WebSearchServerToolTypedDict
from .websearchservertool_openrouter import (
@@ -76,7 +77,7 @@
)
import pydantic
from pydantic import ConfigDict, model_serializer
-from typing import Any, Dict, List, Literal, Union
+from typing import Any, Dict, List, Literal, Optional, Union
from typing_extensions import NotRequired, TypeAliasType, TypedDict
@@ -127,6 +128,8 @@ class AdditionalToolsItemToolFunctionTypedDict(TypedDict):
type: AdditionalToolsItemTypeFunction
description: NotRequired[Nullable[str]]
strict: NotRequired[Nullable[bool]]
+ defer_loading: NotRequired[bool]
+ r"""Withhold this tool from the model until `openrouter:tool_search` finds it. Requires the tool search server tool; at least one tool must remain non-deferred."""
class AdditionalToolsItemToolFunction(BaseModel):
@@ -142,9 +145,12 @@ class AdditionalToolsItemToolFunction(BaseModel):
strict: OptionalNullable[bool] = UNSET
+ defer_loading: Optional[bool] = None
+ r"""Withhold this tool from the model until `openrouter:tool_search` finds it. Requires the tool search server tool; at least one tool must remain non-deferred."""
+
@model_serializer(mode="wrap")
def serialize_model(self, handler):
- optional_fields = set(["description", "strict"])
+ optional_fields = set(["description", "strict", "defer_loading"])
nullable_fields = set(["description", "parameters", "strict"])
serialized = handler(self)
m = {}
@@ -177,25 +183,26 @@ def serialize_model(self, handler):
SearchModelsServerToolOpenRouterTypedDict,
WebFetchServerToolTypedDict,
AdditionalToolsItemToolTypedDict,
- ShellServerToolOpenRouterTypedDict,
+ ToolSearchServerToolTypedDict,
CodeInterpreterServerToolTypedDict,
+ ShellServerToolOpenRouterTypedDict,
BashServerToolTypedDict,
ApplyPatchServerToolOpenRouterTypedDict,
WebSearchServerToolOpenRouterTypedDict,
ImageGenerationServerToolOpenRouterTypedDict,
FusionServerToolOpenRouterTypedDict,
FilesServerToolTypedDict,
- DatetimeServerToolTypedDict,
AdvisorServerToolOpenRouterTypedDict,
SubagentServerToolOpenRouterTypedDict,
+ DatetimeServerToolTypedDict,
NamespaceToolTypedDict,
CustomToolTypedDict,
ComputerUseServerToolTypedDict,
- AdditionalToolsItemToolFunctionTypedDict,
FileSearchServerToolTypedDict,
+ AdditionalToolsItemToolFunctionTypedDict,
PreviewWebSearchServerToolTypedDict,
- Preview20250311WebSearchServerToolTypedDict,
WebSearchServerToolTypedDict,
+ Preview20250311WebSearchServerToolTypedDict,
LegacyWebSearchServerToolTypedDict,
McpServerToolTypedDict,
ImageGenerationServerToolTypedDict,
@@ -212,25 +219,26 @@ def serialize_model(self, handler):
SearchModelsServerToolOpenRouter,
WebFetchServerTool,
AdditionalToolsItemTool,
- ShellServerToolOpenRouter,
+ ToolSearchServerTool,
CodeInterpreterServerTool,
+ ShellServerToolOpenRouter,
BashServerTool,
ApplyPatchServerToolOpenRouter,
WebSearchServerToolOpenRouter,
ImageGenerationServerToolOpenRouter,
FusionServerToolOpenRouter,
FilesServerTool,
- DatetimeServerTool,
AdvisorServerToolOpenRouter,
SubagentServerToolOpenRouter,
+ DatetimeServerTool,
NamespaceTool,
CustomTool,
ComputerUseServerTool,
- AdditionalToolsItemToolFunction,
FileSearchServerTool,
+ AdditionalToolsItemToolFunction,
PreviewWebSearchServerTool,
- Preview20250311WebSearchServerTool,
WebSearchServerTool,
+ Preview20250311WebSearchServerTool,
LegacyWebSearchServerTool,
McpServerTool,
ImageGenerationServerTool,
diff --git a/src/openrouter/components/messagesrequest.py b/src/openrouter/components/messagesrequest.py
index 6a458c9f..28b51a4b 100644
--- a/src/openrouter/components/messagesrequest.py
+++ b/src/openrouter/components/messagesrequest.py
@@ -77,6 +77,7 @@
StopServerToolsWhenCondition,
StopServerToolsWhenConditionTypedDict,
)
+from .toolsearchservertool import ToolSearchServerTool, ToolSearchServerToolTypedDict
from .traceconfig import TraceConfig, TraceConfigTypedDict
from .webfetchplugin import WebFetchPlugin, WebFetchPluginTypedDict
from .webfetchservertool import WebFetchServerTool, WebFetchServerToolTypedDict
@@ -1054,17 +1055,18 @@ def serialize_model(self, handler):
"MessagesRequestToolUnionTypedDict",
Union[
MessagesRequestToolTypedDict,
- WebFetchServerToolTypedDict,
- ShellServerToolOpenRouterTypedDict,
OpenRouterWebSearchServerToolTypedDict,
+ ToolSearchServerToolTypedDict,
+ ShellServerToolOpenRouterTypedDict,
+ WebFetchServerToolTypedDict,
BashServerToolTypedDict,
DatetimeServerToolTypedDict,
- ImageGenerationServerToolOpenRouterTypedDict,
MessagesSearchModelsServerToolTypedDict,
- ToolBash20250124TypedDict,
+ ImageGenerationServerToolOpenRouterTypedDict,
ToolTextEditor20250124TypedDict,
- ToolCustomTypedDict,
+ ToolBash20250124TypedDict,
AnthropicToolSearchToolBm25TypedDict,
+ ToolCustomTypedDict,
AnthropicToolSearchToolRegexTypedDict,
ToolWebSearch20250305TypedDict,
ToolAdvisor20260301TypedDict,
@@ -1077,17 +1079,18 @@ def serialize_model(self, handler):
"MessagesRequestToolUnion",
Union[
MessagesRequestTool,
- WebFetchServerTool,
- ShellServerToolOpenRouter,
OpenRouterWebSearchServerTool,
+ ToolSearchServerTool,
+ ShellServerToolOpenRouter,
+ WebFetchServerTool,
BashServerTool,
DatetimeServerTool,
- ImageGenerationServerToolOpenRouter,
MessagesSearchModelsServerTool,
- ToolBash20250124,
+ ImageGenerationServerToolOpenRouter,
ToolTextEditor20250124,
- ToolCustom,
+ ToolBash20250124,
AnthropicToolSearchToolBm25,
+ ToolCustom,
AnthropicToolSearchToolRegex,
ToolWebSearch20250305,
ToolAdvisor20260301,
diff --git a/src/openrouter/components/openresponsesresult.py b/src/openrouter/components/openresponsesresult.py
index f3be4e66..0c7d4a2b 100644
--- a/src/openrouter/components/openresponsesresult.py
+++ b/src/openrouter/components/openresponsesresult.py
@@ -76,6 +76,8 @@ class OpenResponsesResultToolFunctionTypedDict(TypedDict):
type: OpenResponsesResultType
description: NotRequired[Nullable[str]]
strict: NotRequired[Nullable[bool]]
+ defer_loading: NotRequired[bool]
+ r"""Withhold this tool from the model until `openrouter:tool_search` finds it. Requires the tool search server tool; at least one tool must remain non-deferred."""
class OpenResponsesResultToolFunction(BaseModel):
@@ -91,9 +93,12 @@ class OpenResponsesResultToolFunction(BaseModel):
strict: OptionalNullable[bool] = UNSET
+ defer_loading: Optional[bool] = None
+ r"""Withhold this tool from the model until `openrouter:tool_search` finds it. Requires the tool search server tool; at least one tool must remain non-deferred."""
+
@model_serializer(mode="wrap")
def serialize_model(self, handler):
- optional_fields = set(["description", "strict"])
+ optional_fields = set(["description", "strict", "defer_loading"])
nullable_fields = set(["description", "parameters", "strict"])
serialized = handler(self)
m = {}
@@ -127,8 +132,8 @@ def serialize_model(self, handler):
NamespaceToolTypedDict,
CustomToolTypedDict,
ComputerUseServerToolTypedDict,
- OpenResponsesResultToolFunctionTypedDict,
FileSearchServerToolTypedDict,
+ OpenResponsesResultToolFunctionTypedDict,
LegacyWebSearchServerToolTypedDict,
WebSearchServerToolTypedDict,
Preview20250311WebSearchServerToolTypedDict,
diff --git a/src/openrouter/components/responsesrequest.py b/src/openrouter/components/responsesrequest.py
index 6bec03ba..69b4de8c 100644
--- a/src/openrouter/components/responsesrequest.py
+++ b/src/openrouter/components/responsesrequest.py
@@ -97,6 +97,7 @@
SubagentServerToolOpenRouterTypedDict,
)
from .textextendedconfig import TextExtendedConfig, TextExtendedConfigTypedDict
+from .toolsearchservertool import ToolSearchServerTool, ToolSearchServerToolTypedDict
from .traceconfig import TraceConfig, TraceConfigTypedDict
from .webfetchplugin import WebFetchPlugin, WebFetchPluginTypedDict
from .webfetchservertool import WebFetchServerTool, WebFetchServerToolTypedDict
@@ -237,6 +238,8 @@ class ResponsesRequestToolFunctionTypedDict(TypedDict):
type: ResponsesRequestType
description: NotRequired[Nullable[str]]
strict: NotRequired[Nullable[bool]]
+ defer_loading: NotRequired[bool]
+ r"""Withhold this tool from the model until `openrouter:tool_search` finds it. Requires the tool search server tool; at least one tool must remain non-deferred."""
class ResponsesRequestToolFunction(BaseModel):
@@ -252,9 +255,12 @@ class ResponsesRequestToolFunction(BaseModel):
strict: OptionalNullable[bool] = UNSET
+ defer_loading: Optional[bool] = None
+ r"""Withhold this tool from the model until `openrouter:tool_search` finds it. Requires the tool search server tool; at least one tool must remain non-deferred."""
+
@model_serializer(mode="wrap")
def serialize_model(self, handler):
- optional_fields = set(["description", "strict"])
+ optional_fields = set(["description", "strict", "defer_loading"])
nullable_fields = set(["description", "parameters", "strict"])
serialized = handler(self)
m = {}
@@ -284,27 +290,28 @@ def serialize_model(self, handler):
CodexLocalShellToolTypedDict,
ApplyPatchServerToolTypedDict,
ShellServerToolTypedDict,
- FilesServerToolTypedDict,
- SubagentServerToolOpenRouterTypedDict,
+ SearchModelsServerToolOpenRouterTypedDict,
+ WebFetchServerToolTypedDict,
+ ToolSearchServerToolTypedDict,
ShellServerToolOpenRouterTypedDict,
- BashServerToolTypedDict,
CodeInterpreterServerToolTypedDict,
+ BashServerToolTypedDict,
ApplyPatchServerToolOpenRouterTypedDict,
WebSearchServerToolOpenRouterTypedDict,
- WebFetchServerToolTypedDict,
- SearchModelsServerToolOpenRouterTypedDict,
ImageGenerationServerToolOpenRouterTypedDict,
FusionServerToolOpenRouterTypedDict,
+ FilesServerToolTypedDict,
DatetimeServerToolTypedDict,
AdvisorServerToolOpenRouterTypedDict,
+ SubagentServerToolOpenRouterTypedDict,
NamespaceToolTypedDict,
CustomToolTypedDict,
ComputerUseServerToolTypedDict,
- ResponsesRequestToolFunctionTypedDict,
FileSearchServerToolTypedDict,
- WebSearchServerToolTypedDict,
+ ResponsesRequestToolFunctionTypedDict,
PreviewWebSearchServerToolTypedDict,
Preview20250311WebSearchServerToolTypedDict,
+ WebSearchServerToolTypedDict,
LegacyWebSearchServerToolTypedDict,
McpServerToolTypedDict,
ImageGenerationServerToolTypedDict,
@@ -348,6 +355,7 @@ def serialize_model(self, handler):
Annotated[ApplyPatchServerToolOpenRouter, Tag("openrouter:apply_patch")],
Annotated[BashServerTool, Tag("openrouter:bash")],
Annotated[ShellServerToolOpenRouter, Tag("openrouter:shell")],
+ Annotated[ToolSearchServerTool, Tag("openrouter:tool_search")],
],
Discriminator(lambda m: get_discriminator(m, "type", "type")),
]
diff --git a/src/openrouter/components/toolsearchservertool.py b/src/openrouter/components/toolsearchservertool.py
new file mode 100644
index 00000000..c196ed27
--- /dev/null
+++ b/src/openrouter/components/toolsearchservertool.py
@@ -0,0 +1,47 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from .toolsearchservertoolconfig import (
+ ToolSearchServerToolConfig,
+ ToolSearchServerToolConfigTypedDict,
+)
+from openrouter.types import BaseModel, UNSET_SENTINEL
+from pydantic import model_serializer
+from typing import Literal, Optional
+from typing_extensions import NotRequired, TypedDict
+
+
+ToolSearchServerToolType = Literal["openrouter:tool_search",]
+
+
+class ToolSearchServerToolTypedDict(TypedDict):
+ r"""OpenRouter built-in server tool: finds tools marked `defer_loading` and makes them callable"""
+
+ type: ToolSearchServerToolType
+ parameters: NotRequired[ToolSearchServerToolConfigTypedDict]
+ r"""Configuration for the openrouter:tool_search server tool"""
+
+
+class ToolSearchServerTool(BaseModel):
+ r"""OpenRouter built-in server tool: finds tools marked `defer_loading` and makes them callable"""
+
+ type: ToolSearchServerToolType
+
+ parameters: Optional[ToolSearchServerToolConfig] = None
+ r"""Configuration for the openrouter:tool_search server tool"""
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(["parameters"])
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+
+ if val != UNSET_SENTINEL:
+ if val is not None or k not in optional_fields:
+ m[k] = val
+
+ return m
diff --git a/src/openrouter/components/toolsearchservertoolconfig.py b/src/openrouter/components/toolsearchservertoolconfig.py
new file mode 100644
index 00000000..b11985ec
--- /dev/null
+++ b/src/openrouter/components/toolsearchservertoolconfig.py
@@ -0,0 +1,37 @@
+"""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 Optional
+from typing_extensions import NotRequired, TypedDict
+
+
+class ToolSearchServerToolConfigTypedDict(TypedDict):
+ r"""Configuration for the openrouter:tool_search server tool"""
+
+ max_results: NotRequired[int]
+ r"""Maximum tools returned by one search. Defaults to 5."""
+
+
+class ToolSearchServerToolConfig(BaseModel):
+ r"""Configuration for the openrouter:tool_search server tool"""
+
+ max_results: Optional[int] = None
+ r"""Maximum tools returned by one search. Defaults to 5."""
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(["max_results"])
+ 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/uv.lock b/uv.lock
index 220ea3ff..1104693d 100644
--- a/uv.lock
+++ b/uv.lock
@@ -213,7 +213,7 @@ wheels = [
[[package]]
name = "openrouter"
-version = "1.1.73"
+version = "1.1.74"
source = { editable = "." }
dependencies = [
{ name = "httpcore" },