Skip to content

Commit 669f7fb

Browse files
docs: add web search SDK examples
1 parent 98a9c6d commit 669f7fb

3 files changed

Lines changed: 158 additions & 0 deletions

File tree

README-PYPI.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,57 @@ with OpenRouter(
124124

125125
</br>
126126

127+
### Web Search
128+
129+
The SDK includes native types for OpenRouter web search. For Chat Completions, pass the OpenRouter server tool in `tools`:
130+
131+
```python
132+
from openrouter import OpenRouter, components
133+
import os
134+
135+
136+
with OpenRouter(api_key=os.getenv("OPENROUTER_API_KEY", "")) as open_router:
137+
res = open_router.chat.send(
138+
model="openai/gpt-4o",
139+
messages=[{"role": "user", "content": "What changed in AI today?"}],
140+
tools=[
141+
components.OpenRouterWebSearchServerTool(
142+
type="openrouter:web_search",
143+
parameters=components.WebSearchConfig(
144+
max_results=5,
145+
search_context_size="medium",
146+
),
147+
)
148+
],
149+
)
150+
```
151+
152+
For the Responses API, use the Responses server-tool type:
153+
154+
```python
155+
from openrouter import OpenRouter, components
156+
import os
157+
158+
159+
with OpenRouter(api_key=os.getenv("OPENROUTER_API_KEY", "")) as open_router:
160+
res = open_router.responses.send(
161+
model="openai/gpt-4o",
162+
input="What changed in AI today?",
163+
tools=[
164+
components.WebSearchServerToolOpenRouter(
165+
type="openrouter:web_search",
166+
parameters=components.WebSearchServerToolConfig(
167+
max_results=5,
168+
search_context_size="medium",
169+
),
170+
)
171+
],
172+
stream=False,
173+
)
174+
```
175+
176+
The SDK also supports OpenRouter's web-search plugin via `components.WebSearchPlugin(id="web", ...)` for request shapes that accept `plugins`.
177+
127178
The same SDK client can also be used to make asynchronous requests by importing asyncio.
128179

129180
```python

README.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,57 @@ with OpenRouter(
124124

125125
</br>
126126

127+
### Web Search
128+
129+
The SDK includes native types for OpenRouter web search. For Chat Completions, pass the OpenRouter server tool in `tools`:
130+
131+
```python
132+
from openrouter import OpenRouter, components
133+
import os
134+
135+
136+
with OpenRouter(api_key=os.getenv("OPENROUTER_API_KEY", "")) as open_router:
137+
res = open_router.chat.send(
138+
model="openai/gpt-4o",
139+
messages=[{"role": "user", "content": "What changed in AI today?"}],
140+
tools=[
141+
components.OpenRouterWebSearchServerTool(
142+
type="openrouter:web_search",
143+
parameters=components.WebSearchConfig(
144+
max_results=5,
145+
search_context_size="medium",
146+
),
147+
)
148+
],
149+
)
150+
```
151+
152+
For the Responses API, use the Responses server-tool type:
153+
154+
```python
155+
from openrouter import OpenRouter, components
156+
import os
157+
158+
159+
with OpenRouter(api_key=os.getenv("OPENROUTER_API_KEY", "")) as open_router:
160+
res = open_router.responses.send(
161+
model="openai/gpt-4o",
162+
input="What changed in AI today?",
163+
tools=[
164+
components.WebSearchServerToolOpenRouter(
165+
type="openrouter:web_search",
166+
parameters=components.WebSearchServerToolConfig(
167+
max_results=5,
168+
search_context_size="medium",
169+
),
170+
)
171+
],
172+
stream=False,
173+
)
174+
```
175+
176+
The SDK also supports OpenRouter's web-search plugin via `components.WebSearchPlugin(id="web", ...)` for request shapes that accept `plugins`.
177+
127178
The same SDK client can also be used to make asynchronous requests by importing asyncio.
128179

129180
```python

tests/test_web_search_tools.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from openrouter import components
2+
3+
4+
def test_chat_request_supports_openrouter_web_search_server_tool():
5+
request = components.ChatRequest(
6+
messages=[{"role": "user", "content": "What changed in AI today?"}],
7+
tools=[
8+
components.OpenRouterWebSearchServerTool(
9+
type="openrouter:web_search",
10+
parameters=components.WebSearchConfig(
11+
max_results=5,
12+
search_context_size="medium",
13+
),
14+
)
15+
],
16+
)
17+
18+
assert request.model_dump(mode="json", exclude_unset=True)["tools"] == [
19+
{
20+
"type": "openrouter:web_search",
21+
"parameters": {"max_results": 5, "search_context_size": "medium"},
22+
}
23+
]
24+
25+
26+
def test_responses_request_supports_openrouter_web_search_server_tool():
27+
request = components.ResponsesRequest(
28+
input="What changed in AI today?",
29+
tools=[
30+
components.WebSearchServerToolOpenRouter(
31+
type="openrouter:web_search",
32+
parameters=components.WebSearchServerToolConfig(
33+
max_results=5,
34+
search_context_size="medium",
35+
),
36+
)
37+
],
38+
)
39+
40+
assert request.model_dump(mode="json", exclude_unset=True)["tools"] == [
41+
{
42+
"type": "openrouter:web_search",
43+
"parameters": {"max_results": 5, "search_context_size": "medium"},
44+
}
45+
]
46+
47+
48+
def test_request_plugins_support_web_search_plugin():
49+
request = components.ChatRequest(
50+
messages=[{"role": "user", "content": "What changed in AI today?"}],
51+
plugins=[components.WebSearchPlugin(id="web", max_results=5)],
52+
)
53+
54+
assert request.model_dump(mode="json", exclude_unset=True)["plugins"] == [
55+
{"id": "web", "max_results": 5}
56+
]

0 commit comments

Comments
 (0)