用抽象类统一多搜索 API,错误返回而非抛异常
· 阅读需 5 分钟
在为客户构建 AI Agent 平台时遇到此问题:需要支持多个搜索提供商(Tavily、Serper、Brave、Bing),同时确保工具调用失败时不会中断 Agent 对话流程。
TL;DR
- 定义
SearchProvider抽象基类 +SearchResult数据模型,统一接口和输出格式 - 每个提供商继承基类,实现
search()方法,内部做响应字段映射 - 关键设计:错误时返回包含错误信息的
SearchResult对象,而非抛异常
问题现象
直接调用不同搜索 API 的问题:
# Tavily: POST 请求,results[].url
response = await client.post("https://api.tavily.com/search", ...)
# Serper: POST 请求,organic[].link
response = await client.post("https://google.serper.dev/search", ...)
# Brave: GET 请求,web.results[].description
response = await client.get("https://api.search.brave.com/res/v1/web/search", ...)
# Bing: GET 请求,webPages.value[].snippet
response = await client.get("https://api.bing.microsoft.com/v7.0/search", ...)
问题:
- 请求方式、认证头、响应结构各不相同
- 切换提供商需要改调用方代码
raise Exception会中断 AI Agent 的流式对话
根因
- 缺少抽象层:调用方直接依赖具体实现,违反依赖倒置原则
- 错误处理策略不统一:异常会沿调用栈向上传播,在流式场景下导致整个对话中断
对于 AI Agent 工具调用场景,Agent 需要根据错误信息决定是否重试、换用其他工具、或向用户说明情况——而不是直接崩溃。