--- tags: [web-search, bing, brave, 适配器模式, claude-code] create time: 2026-06-09 22:30 --- # WEB_SEARCH_TOOL — 网页搜索工具 ## 概述 WebSearchTool 让模型可以搜索互联网获取最新信息。原始实现仅支持 Anthropic API 服务端搜索,现已重构为适配器架构,支持 API / Bing / Brave 三种后端,确保任何 API 端点都能使用搜索功能。 > [!info] > 实现状态:适配器架构完成,支持 API / Bing / Brave 三种后端 > 核心工具,无 feature flag 门控(始终启用) ## 正文 ### 实现架构 #### 适配器模式 ```mermaid graph TD A["WebSearchTool.call()"] --> B["createAdapter() 适配器工厂"] B --> C["ApiSearchAdapter: Anthropic 官方 API 服务端搜索"] B --> D["BingSearchAdapter: Bing HTML 抓取 + 正则提取"] B --> E["BraveSearchAdapter: Brave LLM Context API"] C --> F["使用 web_search_20250305 server tool"] D --> G["直接抓取 Bing 搜索页 HTML"] E --> H["调用 Brave HTTPS GET 接口"] ``` #### 模块结构 | 模块 | 文件 | 说明 | |------|------|------| | 工具入口 | `packages/builtin-tools/src/tools/WebSearchTool/WebSearchTool.ts` | `buildTool()` 定义:schema、权限、执行、输出格式化 | | 工具 prompt | `packages/builtin-tools/src/tools/WebSearchTool/prompt.ts` | 搜索工具的系统提示词 | | UI 渲染 | `packages/builtin-tools/src/tools/WebSearchTool/UI.tsx` | 搜索结果的终端渲染组件 | | 适配器接口 | `packages/builtin-tools/src/tools/WebSearchTool/adapters/types.ts` | `WebSearchAdapter` 接口定义 | | 适配器工厂 | `packages/builtin-tools/src/tools/WebSearchTool/adapters/index.ts` | `createAdapter()` 工厂函数 | | API 适配器 | `packages/builtin-tools/src/tools/WebSearchTool/adapters/apiAdapter.ts` | 封装 `queryModelWithStreaming` 逻辑 | | Bing 适配器 | `packages/builtin-tools/src/tools/WebSearchTool/adapters/bingAdapter.ts` | Bing HTML 抓取 + 正则解析 | | Brave 适配器 | `packages/builtin-tools/src/tools/WebSearchTool/adapters/braveAdapter.ts` | Brave LLM Context API 适配 | #### 数据流 ```mermaid graph TD A["模型调用 WebSearchTool(query, allowed_domains, blocked_domains)"] --> B["validateInput 校验"] B --> C["createAdapter 选择后端"] C --> D["adapter.search(query, options)"] D --> E["onProgress query_update"] D --> F["axios.get search-engine-url"] F --> G["extractResults 按后端提取结果"] G --> H["客户端域名过滤 allowed/blocked"] H --> I["onProgress search_results_received"] I --> J["格式化为 markdown 链接列表返回给模型"] ``` ### Bing 适配器技术细节 #### 反爬绕过 使用 13 个 Edge 浏览器请求头(含 `Sec-Ch-Ua`、`Sec-Fetch-*` 等),避免 Bing 返回 JS 渲染的空页面。`setmkt=en-US` 参数强制美式英语市场,避免 IP 地理定位导致区域化结果。 #### URL 解码(`resolveBingUrl()`) Bing 返回的重定向 URL 格式:`bing.com/ck/a?...&u=a1aHR0cHM6Ly9...` - `u` 参数前 2 字符为协议前缀:`a1` = https,`a0` = http - 剩余部分为 base64url 编码的真实 URL - Bing 内部链接和相对路径被过滤返回 `undefined` #### 摘要提取(`extractSnippet()`) 三级降级策略: 1. `
` — Bing 的搜索摘要段落 2. `
` — 备选摘要位置 3. `