前言¶
DeepSeek Harness(DSH)里,web_search 默认走 deepseek-official 搜索后端:每次搜索相当于一次完整的模型调用,会消耗 DeepSeek API 配额。若你更想单独控制搜索成本、或已有 Tavily 账号,可以把搜索后端切到 Tavily Search API——Tavily 免费档约 1000 credits/月,与模型配额分开计费。
下面介绍社区插件 @zyfgood/dsh-web-search-tavily(维护者 zyfgood),它通过 DSH 官方的 ctx.web provider 接口注册 tavily 搜索提供者,不修改 DSH 上游代码,模式与官方 dsh-web-search-exa、Perplexity 类插件一致。
这是什么¶
定位:DSH 联网工具插件,将 web_search 的搜索后端从 DeepSeek 云换成 Tavily API。
npm 包名:@zyfgood/dsh-web-search-tavily(profile 里插件行的 name: 必须写这个名字)。npm 上另有非 scope 包 dsh-web-search-tavily,由他人维护,与本插件无关。
兼容范围(来自 package.json):DSH >=0.2.0-rc.2 <0.3.0-0,在 DeepSeek Harness Desktop 0.2.0-rc.2 上验证通过;Node >=20。许可证 MIT。
工作机制¶
DSH 的 web 能力通过 provider seam(ctx.web.registerSearchProvider)扩展。本插件注册名为 tavily 的 provider(对 Tavily 发 POST /search,Bearer 密钥),并把 web 配置里的 searchProvider 设为 tavily:
web_search 工具 (dsh-tool-web)
→ ctx.web.search()
→ searchProvider: tavily # 本插件(默认原为 deepseek-official)
字段映射:Tavily results[].content → snippet,published_date → publishedAt;score 不移植。若开启 includeAnswer: true,Tavily 生成的 answer 映射到结果的 content。无 URL 或既无内容又无标题的条目会被丢弃。
核心功能¶
- 省 DeepSeek 搜索配额:搜索不再每次占用一次 DeepSeek 云模型调用,改走 Tavily 独立配额。
- 多 key 轮换:
apiKey支持逗号分隔多个 key;遇 401/403/429/5xx 或传输错误时自动切下一个,成功后粘住当前 key;400 等坏请求直接失败。 - 零侵入挂载:仅通过
registerSearchProvider注册,不改 DSH 上游文件。 - 密钥不落盘:
apiKey支持env:VAR引用;未配置时兜底读启动环境变量TAVILY_API_KEY。 - 可取消与错误映射:
AbortSignal映射为WEB_ABORTED;重定向与非 JSON 错误体以WebError形式返回。
安装与启用¶
插件以当前 DSH 进程权限运行;安装前建议在 GitHub 仓库 查看源码与 MIT 许可证。
方式一:CLI 安装(推荐)¶
安装前或重启 dsh web 前,在启动环境中设置 Tavily 密钥(例如 ~/.dsh/.env):
export TAVILY_API_KEY=tvly-xxx
DeepSeek Harness Desktop 用户的 profile 名为 desktop:
dsh plugin --profile desktop add @zyfgood/dsh-web-search-tavily
也可从 Git 渠道安装(仓库根即插件目录):
dsh plugin --profile <name> add "github:zyfgood/dsh-web-search-tavily#main&path:/"
包内自带 cordis.patch.yml(dsh.bundle.patch),CLI 安装时会自动插入插件行并把 web 的 searchProvider 设为 tavily。装完后重启 dsh web 生效。
方式二:手工挂载¶
适用于插件不在默认渠道、或需自定义路径的场景:
- 在 profile 的
package.json中加入依赖与 bundle 列表(路径按实际替换)。 - 在
%USERPROFILE%/.dsh/.env(Linux/macOS 为~/.dsh/.env)写入TAVILY_API_KEY=tvly-xxx。 - 编辑 profile 的
cordis.patch.yml(完整示例见仓库cordis.patch.example.yml):
- insert:
- id: web-search-tavily
name: '@zyfgood/dsh-web-search-tavily'
config:
apiKey: 'env:TAVILY_API_KEY'
- id: web
name: '@deepseek-ai/dsh-web'
config:
searchProvider: tavily
fetchProvider: http
注意:对 - id: web 的 config 是整键替换,覆盖时必须同时带上 fetchProvider: http,否则 web_fetch 会丢失。
配置项¶
| 配置项 | 类型 | 默认 | 说明 |
|---|---|---|---|
apiKey |
string | 兜底 $TAVILY_API_KEY |
支持 env:VAR;逗号分隔多 key;空则 provider 不可用 |
baseURL |
string | https://api.tavily.com |
可指向自建网关,/search 自动拼接 |
searchDepth |
basic | advanced |
basic |
advanced 为重排序,约 2 credits/次 |
maxResults |
number | Tavily 默认 | 请求未带 maxResults 时的默认条数 |
includeAnswer |
boolean | false |
是否返回 Tavily 生成的答案(写入结果 content) |
验证是否生效¶
- 启动日志中无
web-search-tavily相关 warning 或did not activate。 - 会话事件里不再出现
web/deepseek-search-llm-request。 - 调用
web_search时,标题、snippet、日期应符合 Tavily 返回口径。
常见问题¶
WEB_PROVIDER_UNAVAILABLE:TAVILY_API_KEY未设置,或apiKey为空;env:VAR引用的变量未设置时,插件会报错并指明变量名。WEB_PROVIDER_AMBIGUOUS:web 未固定searchProvider且存在多个可用 provider;确认 patch 里- id: web带有searchProvider: tavily。- 401 / invalid key:密钥无效;多 key 配置下会自动轮换,全部失效才最终报错。
- 切回 DeepSeek 官方搜索:将 web 的
searchProvider改回deepseek-official,或删除本插件的覆盖行以恢复 base bundle 默认。
适用场景与注意¶
适合:已在用 DSH 0.2.0-rc.2 系、希望搜索与模型配额分离、或需要 Tavily 的 searchDepth / 多 key 轮换能力的开发者。
注意:插件在社区目录 SkillHub 归类为「联网工具」,与 DeepSeek / 幻方无官方从属关系;安装与配置变更会作用于当前 profile 的 DSH 进程,请自行核对仓库版本(当前 npm 0.2.0)与 engines.dsh 约束。