前言¶
DeepSeek Harness(DSH)里,智能体要通过 ctx.web 做联网搜索时,默认会走内置的 web-search-deepseek:它调用公网 api.deepseek.com 上的 web_search_20250305 工具,并且必须配置一把有效的公网 DeepSeek API key。实际部署里,对话模型经常走内网网关,公网 key 失效或未配置时,搜索只会返回 HTTP 401,对话里表现为「搜不了网」。社区插件 dsh-web-search-tavily(维护者 liufeicc,分类:联网工具)把 Tavily 接到同一套 web 接缝上,默认 keyless,不注册账号、不写 API key 也能先试;需要稳定用量时再切到官方免费 key,配置不必改代码路径。
这是什么¶
dsh-web-search-tavily 是 Tavily 的 WebSearchProvider 实现:只负责搜索,网页抓取仍由内置 http 的 fetchProvider 承担。它替换的是依赖公网 DeepSeek API key 的内置搜索 provider,而不是整包重写 ctx.web。
| 项目 | 说明 |
|---|---|
| 目录页 | https://www.skillhub.cn/plugins/liufeicc/dsh-web-search-tavily |
| 源码 | https://github.com/liufeicc/dsh-web-search-tavily |
| 包名 | @local/dsh-web-search-tavily(本地 link: 引用) |
| 许可证 | MIT(见仓库 package.json) |
插件在 DSH 进程内以当前 profile 的权限运行;安装前建议自行浏览源码与许可证。
为什么需要它:内置搜索与 keyless 路径¶
内置 web-search-deepseek 在鉴权失败时典型报错为:
DeepSeek API error (HTTP 401): Authentication Fails
本插件走 Tavily API。官方提供 keyless 通道,请求时加上请求头即可,返回 schema 与带 key 时一致:
X-Tavily-Access-Mode: keyless
官方将 keyless 定位为 exploration / light use,有速率上限;触顶后注册免费 key(README 写明约 1000 credits/月、无需信用卡),把 accessMode 改为 api-key 并配置 key,无需改插件业务代码。
核心功能¶
搜索接缝¶
- 实现 DSH
WebSearchProvider,对接searchProvider: tavily。 - 单次结果条数、搜索深度、超时等可在 profile 的插件
config里调节(见下节)。 - 返回的
content摘要截断到 600 字符,避免占满上下文;需要正文可继续用web_fetch(须保留fetchProvider: http)。
超时与取消(两道保险)¶
DSH 的 timeout-policy 是协作式:只 abort 一个 AbortSignal,下游未接力时会一直挂起。本插件合并调用方信号与本地硬超时:
AbortSignal.any([callerSignal, AbortSignal.timeout(timeoutMs)])
callerSignal:用户点停止,或工具层 60s 预算;AbortSignal.timeout(...):插件本地上限(默认timeoutMs20000)。
README 记载:取消约 513ms 返回 WEB_ABORTED;1s 硬超时约 1023ms 返回 WEB_PROVIDER_ERROR。即使上层取消链路断了,单次搜索也会在 timeoutMs 内结束并返回明确错误。
已知限制(README)¶
- keyless 有速率上限,官方未给具体数字;高频请用免费 key。
- 仅搜索,不实现抓取;
web_fetch依赖内置 http provider。
配置项¶
在 profile 的 cordis.patch.yml 里,给插件行写 config(字段以 README 为准):
| 字段 | 默认值 | 说明 |
|---|---|---|
accessMode |
keyless |
keyless 或 api-key |
apiKey |
— | 正式 key;仅 api-key 模式 |
apiKeyEnv |
TAVILY_API_KEY |
apiKey 未配置时从该环境变量读取 |
baseURL |
https://api.tavily.com |
可指向代理或自建网关 |
searchDepth |
basic |
basic = 1 credit/次;advanced = 2 credits/次 |
timeoutMs |
20000 |
本地硬超时(毫秒) |
maxResults |
8 |
单次搜索来源上限 |
安装与启用¶
官方 README 未提供 dsh plugin add github:... 一类命令,而是 本地目录 + link: 依赖 + Cordis patch。下面步骤与仓库一致,路径请换成你的环境。
-
将仓库放到固定目录,例如
$HOME/data/claude-workspace/dsh/dsh-web-search-tavily/。 -
在 profile 的
package.json增加依赖(路径改为绝对路径):
"@local/dsh-web-search-tavily": "link:/absolute/path/to/dsh-web-search-tavily"
- 在 profile 的
cordis.patch.yml末尾追加:
- insert:
- id: web-search-tavily
name: '@local/dsh-web-search-tavily'
- id: web
config:
searchProvider: tavily
fetchProvider: http
- id: web 表示覆盖整行、config 整体替换。searchProvider 与 fetchProvider 都要写全;只写 searchProvider 会抹掉 fetchProvider,连带 web_fetch 失效。
- profile 若为
patchReload: live,改完 patch 即热加载,无需重启 dsh。
peer 依赖与插件目录里的 node_modules¶
插件 import @deepseek-ai/schemastery 与 @deepseek-ai/dsh-web。profile 通过 link: 引用时,pnpm 不会在插件目录安装 peer,Node 从插件真实路径向上解析可能 ERR_MODULE_NOT_FOUND。仓库说明:在插件目录用符号链接指向 $DSH_HOME/profiles/node_modules/@deepseek-ai/ 下的对应包;换 DSH_HOME 或升级 DSH 后若报错,重建链接即可。
典型用法¶
启用后,智能体侧仍通过 DSH 统一的 web 工具使用搜索,无需为 Tavily 单独写调用代码。运维侧常见做法是:
- 先用默认
accessMode: keyless验证接缝与超时行为; - 遇到速率限制时,注册 Tavily 免费 key,设
accessMode: api-key,配置apiKey或环境变量TAVILY_API_KEY; - 内网需出网代理时,调整
baseURL; - 对实时性要求高的任务,酌情调小
timeoutMs,并确认取消能较快得到WEB_ABORTED。
摘要被截断时,对命中 URL 再发起 web_fetch(依赖上节保留的 fetchProvider: http)。
适用场景与注意¶
适合谁: 已用 DSH 做智能体或自动化,聊天模型走内网或不想维护公网 DeepSeek key,但仍需要联网检索;愿意用社区「一切皆插件」方式改 profile,而不是改 DSH 核心。
注意:
- 插件与 profile 同进程、同权限;安装前核对 GitHub 源码与 MIT 许可证。
- 社区目录站点(如 skillhub.cn)与 DeepSeek / 幻方无官方从属关系,本文档描述的是社区维护的联网工具插件,非官方应用商店条目。
- GitHub 公开星标为 0(截至撰写时线索);功能事实以 README 与
package.json为准。
结尾¶
dsh-web-search-tavily 把 Tavily 接到 DSH 的 ctx.web 搜索接缝:默认 keyless、可渐进升级到 API key,并用 AbortSignal.any 补上本地硬超时,缓解「点停止仍转圈」这类协作取消断链问题。按 README 完成 link: 安装与 cordis.patch.yml 后,即可在不依赖公网 DeepSeek 搜索 key 的前提下恢复联网检索。
- 目录页:https://www.skillhub.cn/plugins/liufeicc/dsh-web-search-tavily
- 源码:https://github.com/liufeicc/dsh-web-search-tavily