Volume 2 · Chapter 28

Web 能力:搜索与抓取的另一个三件套

web seam 与 15 页的 shell 完全同构:WebRuntime(Definition)+ 搜索/抓取 provider + tool-web(Consumer)。搜索后端可换(DeepSeek 搜索、Perplexity、Exa)——这就是 seam 的「换 provider 不改 consumer」在另一个域的重演。

(卷一连接点) 15 页 seam 模板 · 14 页工具流水线 → 本域:web / web-fetch-http / web-search-deepseek / tool-web / web-search-perplexity / web-search-exa → (回心脏) tool-web 的结果走 13/14 页调度与流水线

示例本次示例:模型搜一条信息

示例轨迹 28-1 · web_search 的完整路径
# 模型:web_search({query:'deepseek-harness 最新版本'})
# → tool-web(inject=['tools','web','systemPrompt'])执行
# → ctx.web 解析到 web-search-deepseek provider(DeepSeek 搜索 API)
# → API key 按请求经 credentials(31 页)解析——不缓存进 config
# → 搜索结果条目 → tool/result → 13/14 页流水线 → 模型引用结果回答
# 换 provider:cordis.patch.yml 换 web-search-exa / web-search-perplexity
#   → tool-web 一行不改(15 页 seam 结论的又一实例)
来源:28 页 §3 + 31 页凭据
示例轨迹 28-2 · 抓取与搜索的分工
# 搜索给了标题+摘要,模型想看全文 → web_fetch({url})
# → web-fetch-http provider(inject=['web']):HTTP GET + 正文提取
# → 截断到上限(防超大页面撑爆上下文,28 页易错点)
# → 结果进 13/14 页流水线
# 两段式:搜索发现 URL,抓取取正文——与 22 页 subagent 的 spawn/fork 一样的「正交分工」
来源:28 页 §3

§1挂载条目

  • web → @deepseek-ai/dsh-web——运行时(Definition)
  • web-search-deepseek → dsh-web-search-deepseek(565 行)——DeepSeek 搜索后端
  • tool-web → dsh-tool-web(1008 行)——模型可见的搜索/抓取工具
  • 可选挂载:web-fetch-http(476 行,HTTP 抓取 provider)、web-search-perplexity(296 行)、web-search-exa(303 行)

§2包文件地图

包规模角色
packages/web/web/—Service Definition:WebRuntime extends Service(src/index.ts:74)——搜索/抓取契约
packages/web/web-search-deepseek/4 文件 / 565 行Provider:DeepSeek 搜索 API
packages/web/web-fetch-http/4 文件 / 476 行Provider:HTTP 抓取——inject = ['web'](src/index.ts:31)
packages/web/tool-web/5 文件 / 1008 行Consumer:inject = ['tools', 'web', 'systemPrompt'](src/index.ts:24)

§3机制:搜索与抓取的分工

  1. 搜索(search):provider 调搜索 API(DeepSeek 搜索 / Perplexity / Exa),返回结果条目。
  2. 抓取(fetch):provider 抓取 URL 正文——web-fetch-http 是本地 HTTP 实现。
  3. 消费:tool-web 把两者合成模型可见的工具(web_search/web_fetch),结果经 13/14 页的调度与流水线。

与 15 页 shell 对照读:完全同一套三件套骨架,只是「能力」从执行命令换成了访问网络。读到这里,你已经有能力不看文档猜出任何新 seam 的结构。

§4关键代码

packages/web/web/src/index.tsWeb 运行时74
74export class WebRuntime extends Service {
packages/web/tool-web/src/index.ts工具的三依赖24
24export const inject = ['tools', 'web', 'systemPrompt']
74

web 的 Definition。与 ShellExecutor(15 页)的唯一区别是能力内容——结构一模一样。

24

inject 数组与 tool-bash(17 页 31 行)逐项对应:tools(注册)、能力本体(web)、systemPrompt(schema 进提示词)。缺 shellEnv 是因为网络工具不需要环境事实。

§5易错点

搜索 provider 的凭证从哪来?与 llm adapter 一样走 credentials seam(31 页)——provider 不硬编码 key,按请求解析。这保持了「provider 可替换、配置可热更新」。

抓取内容的信任边界:web 内容是外部输入,进入工具结果前要考虑大小截断与编码(类似 16 页的 tail-keep 问题)——超大页面会撑爆上下文。