用 Search Router 为 AI Agent 搭建统一网页搜索入口
AI Agent 在编写代码、回答问题时,往往需要实时获取网络信息。但为 Agent 接入搜索引擎并非易事——Google 自定义搜索 API 有每日限额,Bing 需要单独注册,不同搜索引擎的返回格式各异,还要处理 API 密钥管理、速率限制、故障切换等一系列问题。
Search Router 正是一个为此而生的工具:它提供了一个统一的搜索 API 端点,后接多个搜索引擎并自动做结果聚合,同时提供了 MCP 支持,AI Agent 开箱即用就能获得实时网页搜索能力。
Search Router 是什么
Search Router 是一个搜索路由层,它位于 AI Agent 与多个搜索引擎之间。你只需向一个 API 发送查询,Search Router 会自动将请求分发到配置中的搜索引擎(Google、Bing、DuckDuckGo 等),聚合结果并以统一的 JSON 格式返回。
它的核心组件包括:
- Search Router API(托管服务):接收查询请求,路由到各搜索引擎,返回结构化结果
- simple-search(开源参考应用):一个基于 FastAPI + Jinja 的元搜索服务,展示如何集成 Search Router
- MCP 支持:提供 MCP Server 模式,AI Agent 可通过 MCP 协议直接使用
为何 AI Agent 需要搜索路由
大多数 AI Agent 框架(Claude Code、Cursor、Codex 等)都支持工具调用(tool calling),但内置的搜索能力通常只绑定单一搜索引擎。实践中会遇到几个痛点:
- API 密钥分散:每个后端服务需要单独注册和配置密钥,团队合作时密钥管理变得复杂
- 无故障切换:单一搜索引擎若超时或限流,整个查询就会失败
- 结果格式不统一:不同搜索引擎返回的数据结构不同,Agent 需要为每家编写专门的解析逻辑
- 无缓存层:同一查询短时间内重复执行,浪费 API 调用配额
Search Router 通过一个统一的入口解决了这些问题。
快速上手:本地运行 simple-search
Search Router 提供了一个开源参考应用 simple-search,你可以在本地通过 Docker 运行它:
git clone https://github.com/search-router/simple-search.git cd simple-search docker compose up
启动后访问 http://localhost:8000,就能看到一个带暗色/亮色主题的搜索界面。即使没有配置任何 API 密钥,系统也会自动使用确定性 mock 数据,让开发和测试流程不依赖外部服务。
import httpx
response = httpx.post("http://localhost:8000/search", json={
"query": "AI Agent 工具调用最佳实践",
"engines": ["google", "bing", "duckduckgo"],
"max_results": 10
})
results = response.json()
for r in results["results"]:
print(f"[{r['engine']}] {r['title']}")
print(f" {r['url']}")
print(f" {r['snippet']}")
为 AI Agent 接入 Search Router
Search Router 的 MCP 支持让集成变得非常简单。以 Claude Code 为例,只需在 MCP 配置中添加一个 server 定义:
{
"mcpServers": {
"search-router": {
"command": "python",
"args": ["-m", "search_router_mcp"],
"env": {
"SEARCH_ROUTER_API_KEY": "your-api-key"
}
}
}
}
配置完成后,AI Agent 就能通过 MCP 工具调用 web_search,搜索流程变成:
User: "帮我查一下最近的 MCP Server 新动态" → Agent 调用 search-router 的 web_search(query="MCP Server 2026 新动态") → Search Router 转发查询到 Google + Bing + DuckDuckGo → 聚合结果返回给 Agent → Agent 基于搜索结果撰写回答
这种架构的另一个好处是插件化:你可以通过 search_service.backends 入口点添加自定义搜索引擎适配器,无需修改核心代码。
from search_service.backends import BaseSearchBackend
class MyCustomEngine(BaseSearchBackend):
name = "my_engine"
async def search(self, query: str, max_results: int = 10):
# 实现自定义搜索引擎的调用逻辑
return [{"title": "...", "url": "...", "snippet": "..."}]
实用配置技巧
缓存优化
Search Router 支持 Redis 缓存,建议在生产环境中启用:
services:
redis:
image: redis:7-alpine
ports:
- "6379:6379"
search:
image: search-router/simple-search
environment:
- REDIS_URL=redis://redis:6379/0
- CACHE_TTL=300 # 5分钟缓存
缓存配合电路断路器(circuit breaker)可以有效降低 API 调用成本:当某个搜索引擎连续失败时自动降级到其他引擎,等待恢复窗口后再重新尝试。
本地开发零配置
对于本地开发,Search Router 最实用的设计是无密钥 mock 模式。当未配置 API 密钥时,后端自动切换到确定性 mock 实现,返回预设的搜索结果。这意味着:
- 新团队成员克隆仓库即可
docker compose up - CI 环境中无需配置密钥即可运行集成测试
- 前端 UI 开发不依赖外部服务的可用性
总结
Search Router 解决了 AI Agent 接入网页搜索时的一个核心痛点:多引擎管理、故障切换和结果格式统一。对个人开发者,它降低了接入搜索的配置成本;对团队,它提供了一个可共享的搜索路由层,配合 Redis 缓存和 circuit breaker,在成本和可靠性之间取得了良好的平衡。
如果你正在为 AI Agent 搭建搜索能力,不妨从 docker compose up 开始——几分钟就能拥有一个统一搜索入口。