统一网络搜索¶
WebSearch 类提供了统一的入口,将查询分发到任何已配置的搜索引擎。你可以让它自动选择最佳可用引擎,也可以指定特定引擎并启用优雅降级。
更新日志
未发布 — 新增统一 WebSearch 入口 (#88)
概览¶
- 自动模式:
engine="auto"按优先级顺序尝试已配置的引擎,返回第一个成功的结果 - 指定引擎:设置
engine="brave"(或其他引擎)进行确定性路由 - 降级模式:设置
fallback=True,指定引擎失败时自动降级到自动链 - 动态 Schema:
engine参数的可接受值在运行时收窄为仅包含已配置 API key 的引擎,LLM 客户端看到的 JSON schema 更精确 - 可配置优先级:通过
WEBSEARCH_PRIORITY环境变量覆盖默认引擎顺序
快速开始¶
from toolregistry_hub.websearch import WebSearch
ws = WebSearch()
# 自动选择最佳已配置引擎
results = ws.search("Python 3.13 新特性", max_results=5)
# 使用指定引擎
results = ws.search("机器学习", engine="tavily")
# 指定引擎 + 降级到自动链
results = ws.search("量子计算", engine="brave", fallback=True)
# 查看哪些引擎可用
print(ws.list_engines())
# {'brave': True, 'tavily': True, 'searxng': False, ...}
API 参考¶
WebSearch(priority)¶
初始化统一搜索封装。
参数:
priority(str, 可选): 逗号分隔的引擎名称优先级顺序。回退到WEBSEARCH_PRIORITY环境变量,再回退到默认顺序。
WebSearch.search(query, *, engine, fallback, max_results, timeout, **kwargs)¶
通过选定引擎执行网络搜索。
参数:
query(str): 搜索查询字符串engine(str): 使用的引擎。"auto"(默认)按优先级尝试已配置引擎。可选值:"brave"、"tavily"、"searxng"、"brightdata"、"scrapeless"、"serper"fallback(bool): 指定引擎不可用或失败时,False(默认)抛出错误;True降级到自动链max_results(int): 最大结果数(建议 1-20)。默认:5timeout(float): 单次请求超时秒数。默认:10.0**kwargs: 引擎特定参数,原样转发
返回: list[SearchResult]
异常:
ValueError: 未知引擎名称或空查询RuntimeError: 无可用引擎(自动模式),或指定引擎不可用且fallback=False
WebSearch.list_engines()¶
列出所有已知引擎及其配置状态。
返回: dict[str, bool] — 引擎名称到配置状态的映射
引擎优先级¶
默认优先级顺序(付费/高质量优先):
tavilybraveserperbrightdatascrapelesssearxng
通过环境变量覆盖:
或在构造时指定:
自动模式行为¶
当 engine="auto" 时:
- 按优先级顺序尝试引擎
- 跳过未配置的引擎(缺少 API key)
- 如果引擎返回空结果,尝试下一个
- 如果引擎抛出异常,尝试下一个
- 如果所有引擎都失败,抛出
RuntimeError并附带最后一个错误
降级行为¶
指定引擎并设置 fallback=True 时:
失败的引擎会从降级自动链中排除,避免重复尝试。
动态注解收窄¶
构造时,WebSearch 探测哪些引擎已配置,并动态收窄 engine 参数的类型注解。这意味着:
- IDE 自动补全显示完整菜单(所有引擎)
- LLM JSON schema(运行时生成)仅显示已配置的引擎
- 不同实例可以有不同的可用引擎
# 服务器设置了 BRAVE_API_KEY 和 TAVILY_API_KEY
ws = WebSearch()
# LLM 客户端看到: engine: Literal["auto", "brave", "tavily"]
# 而非完整的 7 引擎菜单
服务端模式¶
在服务端模式下,WebSearch 注册在 web/websearch 命名空间。6 个独立引擎工具标记为 deferred —— 可通过 discover_tools 发现,但不包含在初始 schema 中。这减少了 schema 大小,同时保持所有引擎可访问。