Web Search
Foya 将 Web Search 与 Web Fetch 分成两个 Tool:
web_search根据查询返回有界结果列表;web_fetch读取一个已知 URL 的主要文本。
两者都需要 Network Approval,但使用不同的 Provider 和输入约束。
Search Route
标题链接搜索按以下顺序尝试:
- 当前语言 Provider 的 Native Web Search;
- 用户配置的 Default Search Provider;
- DuckDuckGo Lite Fallback。
Native Search 只有在 Provider 明确实现该能力时使用。调用失败或没有结果时,Router 继续尝试外部 Provider。
外部 Provider
标题链接当前支持:
| Kind | 要求 |
|---|---|
| Google Custom Search | API Key 与 Search Engine ID |
| Bing Web Search | API Key,可选 Endpoint |
| Baidu | 无 API Key,解析搜索 HTML |
| DuckDuckGo Lite | 内置无配置 Fallback |
Search Limit 默认为 5,最大为 10。返回结果统一为 Title、URL、Snippet、Source 和 Rank。
配置
标题链接Web Search 设置包含:
- 总开关;
- 默认 Provider ID;
- 多个 Provider 配置;
- 每项 Enabled;
- 对应凭证和 Endpoint。
配置保存在:
<data-dir>/web-search.json读取公共配置时会移除明文 API Key,只返回 has_api_key。
web_search
标题链接工具会:
- 校验 Query;
- 请求 Network Approval;
- 读取当前 Session 的 Model 与 Provider;
- 执行 Search Route;
- 标准化并限制结果数;
- 以 JSON 返回 Provider、Query 和 Results。
Search Tool 可与其他声明为并行安全的读取 Tool 同时执行。
web_fetch
标题链接Web Fetch 只接受 HTTP 和 HTTPS,并拒绝:
- 缺少 Host;
- 带用户信息的 URL;
- 解析到 Loopback;
- Private Address;
- Link-local;
- Multicast;
- Unspecified Address。
每次 Redirect 都重新验证目标,最多跟随 10 次。
内容处理
标题链接Web Fetch:
- 请求 Timeout 为 30 秒;
- 响应上限为 5 MiB;
- 只接受 Text、JSON、XML 或 HTML;
- 将 HTML 转换成有界可读文本;
- 保留绝对链接;
- 移除 Script、Style 和 Noscript;
- 最终文本限制为 200000 Bytes 和 2000 行。
网页内容作为 Tool Result 回灌模型,不具有指令权限。
SSRF 边界
标题链接Web Fetch 在建立连接前解析 DNS,并拒绝私有或保留地址。Redirect 目标也会校验。
这减少了 Agent 读取本机服务和内网 Metadata Endpoint 的风险,但不能替代完整网络 隔离:
- 公共域名的 DNS 记录可能变化;
- 外部代理可能执行额外访问;
- Provider Native Search 在 Provider 服务端运行;
- MCP Server 的网络行为不受 Web Fetch 校验控制。
与 Browser 的区别
标题链接Web Fetch 不执行 JavaScript、不保持 Cookie 会话,也不提供点击和输入。需要动态 交互时应使用 Browser Runtime。
当前边界
标题链接- Search Provider 结果依赖第三方服务质量。
- Baidu 和 DuckDuckGo 使用 HTML 解析,页面变化可能导致结果缺失。
- Web Fetch 不支持登录态页面。
- 当前没有通用 Robots 或站点抓取调度器。
- 凭证仍保存在本地配置文件中。