OpenRouter 推出 openrouter:web_search 与 openrouter:web_fetch 服务端工具
Consistent Web Search and Fetch Across Every Model
OpenRouter 发布 openrouter:web_search 和 openrouter:web_fetch 两个服务端工具,任何支持工具调用的模型都能在请求中调用,由 OpenRouter 在服务端执行并返回结果,无需客户端实现。
原文给出跨模型统一的搜索与抓取工具定义,读者可据此判断多模型切换时的工具适配成本。
推出 openrouter:web_search 和 openrouter:web_fetch,这两个新工具可供任何模型在请求期间调用。当模型决定使用其中一个时,OpenRouter 会在服务端执行它,并将结果返回给模型,无需任何客户端实现。
- Web Search:一个用于代理式搜索的工具,每次请求可搜索 0 到 N 次,让模型自行选择查询内容和时机。
- Web Fetch:一个用于从任意 URL 检索完整页面内容的工具。常用于检索搜索过程中找到的页面。
现在就在 chatroom 中点击工具图标
试用,并阅读文档了解 API 详情。
换模型,无需换工具
每个模型提供商都有自己内置的网页搜索工具,且 schema 各不相同。切换模型或提供商时,你就得重写搜索结果的定义、配置和解析方式。而且你也不一定能获得相同的行为,如果你需要严格强制屏蔽某些域名之类的功能,这可能会带来问题。
这些新的服务端工具为你提供了一种统一的方式来启用搜索和抓取。只需指定一次 {"type": "openrouter:web_search"},工具定义、调用和结果格式在所有支持工具调用的模型上都保持一致。如果你还希望搜索行为也完全一致,可以指定 Exa 或 Parallel 这样的提供商,这样无论请求路由到 GPT-5.5、Claude 还是 Kimi,返回给模型的结果都保持一致。
{
"model": "openai/gpt-5.5",
"messages": [{ "role": "user", "content": "What happened in tech news today?" }],
"tools": [
{ "type": "openrouter:web_search" },
{ "type": "openrouter:web_fetch" }
]
}Web Search
网页搜索支持四种引擎:
| 引擎 | 工作方式 | 定价 |
|---|---|---|
| Auto(默认) | 如果提供商支持则使用原生,否则使用 Exa | 视情况而定 |
| Native | 提供商内置的搜索(OpenAI、Anthropic、Google、xAI、Perplexity) | 提供商定价 |
| Exa | 将搜索传递给 Exa,并从你的 OpenRouter 额度中扣费 | 每次请求 $0.005。包含最多 10 条结果,之后每条额外结果 $0.001。 |
| Parallel | 将搜索传递给 Parallel,并从你的 OpenRouter 额度中扣费 | 每次请求 $0.005。包含最多 10 条结果,之后每条额外结果 $0.001。 |
每种引擎各有优势。原生搜索与提供商的模型紧密集成。Exa 和 Parallel 增加了可配置的结果上下文大小(search_context_size),而原生引擎会忽略这一点。大多数引擎支持域名过滤(allowed_domains、excluded_domains)。
你可以在 chatroom UI 中或通过 API 进行配置:
{
"type": "openrouter:web_search",
"parameters": {
"engine": "exa",
"max_results": 5,
"search_context_size": "high",
"allowed_domains": ["arxiv.org", "nature.com"]
}
}代理循环中的并行搜索
当模型需要跨来源比较信息时,它可以在单次请求中发起多次搜索。像“比较排名前 3 的云 GPU 提供商的定价”这样的问题,可能会在模型综合出答案之前触发三次独立的搜索,每次使用不同的查询。

使用 max_total_results 来限制一次请求中所有搜索的累计结果数。这能让成本和上下文用量保持可预测:
{
"type": "openrouter:web_search",
"parameters": {
"max_results": 5,
"max_total_results": 15
}
}一旦达到上限,模型会收到一条消息说明已达到限制,而不是再执行一次搜索。
Web Fetch
网页抓取让模型能够从 URL 检索完整页面内容,并支持五种引擎。
| 引擎 | 工作方式 | 定价 |
|---|---|---|
| Auto(默认) | 如果支持则使用原生,否则使用 Exa | 视情况而定 |
| Native | 提供商内置的抓取 | 提供商定价 |
| OpenRouter | 由 OpenRouter 直接进行 HTTP 抓取 | 免费 |
| Exa | 内容提取并输出干净的 markdown | 每次抓取 $0.001 |
| Parallel | 通过 Parallel 的 extract API 进行高质量内容提取 | 每次抓取 $0.001 |
将 Exa、Parallel 或 OpenRouter 指定为引擎可确保所有模型具有一致的抓取行为,包括能够使用 allowed_domains 和 blocked_domains 限制模型可以抓取哪些 URL。原生提供商的抓取能力各不相同,因此如果你需要这些参数在多个模型间都被遵守,请选择这些引擎之一。
使用 max_content_tokens 来限制模型接收的内容量(适用于会占用你上下文窗口的大型页面):
{
"type": "openrouter:web_fetch",
"parameters": {
"engine": "openrouter",
"max_content_tokens": 50000,
"allowed_domains": ["docs.example.com", "api.example.com"],
"blocked_domains": ["internal.example.com"]
}
}从 Web Search 插件迁移
到目前为止,模型只能通过 web search 插件进行搜索,该插件无论模型实际需要什么,每次请求都只执行一次搜索。模型无法决定何时搜索、搜索什么,或者是否搜索。
要迁移,请将请求体中的 plugins 替换为 tools:
之前(插件):
"plugins": [{ "id": "web" }]之后(服务器工具):
"tools": [{ "type": "openrouter:web_search" }]服务器工具让模型自行决定何时搜索以及搜索频率。有一点需要注意:服务器工具需要支持工具调用的模型。如果你当前的模型不支持工具,你需要切换到支持工具的模型,或者继续使用插件。
我们创建了一份迁移指南,其中包含完整细节。
来源:OpenRouter Blog · openrouter.ai