@zyfgood/dsh-web-search-tavily:把 DSH 的 web_search 后端换成 Tavily

前言

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 或既无内容又无标题的条目会被丢弃。

核心功能

  1. 省 DeepSeek 搜索配额:搜索不再每次占用一次 DeepSeek 云模型调用,改走 Tavily 独立配额。
  2. 多 key 轮换:apiKey 支持逗号分隔多个 key;遇 401/403/429/5xx 或传输错误时自动切下一个,成功后粘住当前 key;400 等坏请求直接失败。
  3. 零侵入挂载:仅通过 registerSearchProvider 注册,不改 DSH 上游文件。
  4. 密钥不落盘:apiKey 支持 env:VAR 引用;未配置时兜底读启动环境变量 TAVILY_API_KEY。
  5. 可取消与错误映射: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 生效。

方式二:手工挂载

适用于插件不在默认渠道、或需自定义路径的场景:

  1. 在 profile 的 package.json 中加入依赖与 bundle 列表(路径按实际替换)。
  2. 在 %USERPROFILE%/.dsh/.env(Linux/macOS 为 ~/.dsh/.env)写入 TAVILY_API_KEY=tvly-xxx。
  3. 编辑 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)

验证是否生效

  1. 启动日志中无 web-search-tavily 相关 warning 或 did not activate。
  2. 会话事件里不再出现 web/deepseek-search-llm-request。
  3. 调用 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 约束。

链接

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜