前言¶
在 DeepSeek Harness(DSH)里,web_search 依赖 ctx.web 这一接缝选定的搜索提供方。接缝的规则很硬:配置了某个 provider id 就只用那一个,失败就是失败;未配置 id 且多个提供方可用时会抛出 WEB_PROVIDER_AMBIGUOUS。没有内置的优先级链,也没有「第一个挂了换第二个」的回退。
若你同时配置了 Tavily 与 DeepSeek 原生搜索,或希望用多把 Tavily 密钥分摊免费额度,官方接缝本身做不到排序与轮换。dsh-web-search-plus(社区目录名:网页搜索++)由 polan-prologue 维护,分类为联网工具。它注册单一 provider web-search-plus,在内部串联 Tavily 与 DeepSeek 原生节点,并支持 Tavily 侧多密钥轮换与失败回退。
这是什么¶
dsh-web-search-plus 是 DSH 的网页搜索增强插件:在 Tavily 与 DeepSeek 原生搜索之间自由排序,前一个失败(或按配置把空结果视为失败)时自动尝试下一个;Tavily 侧最多 20 个密钥槽位轮换,遇 429 或额度用尽会冷却并切到下一槽。
DeepSeek 节点复用官方 provider 实例,密钥、账号 token、端点与用量限制仍来自 Settings → Web search,不重复实现上游逻辑。
调用关系可概括为:
web_search 工具
└─ ctx.web(固定为 web-search-plus)
├─ 1. Tavily → 在配置的密钥槽间轮换
└─ 2. DeepSeek native → 复用官方 provider 实例
核心功能¶
有序回退¶
在插件页 Priority 卡片中调整链顺序;第一个成功返回的节点 wins,后续不再调用。可通过 fallbackOnEmpty 决定「空结果」是否算作失败并继续链。
Tavily 多密钥与状态¶
最多 20 个 Tavily 密钥槽,按 tavilyKeyRefs 顺序轮换。限速(429)或配额耗尽的密钥进入冷却,链自动尝试下一槽。每个槽显示实时状态(ready / invalid / cooling down),当前使用的槽会标记。
Tavily keys 卡片支持保存、清除、移除、新增槽位、重置冷却;Status 卡片可一键查询各槽当前 plan 用量。
接管与交还¶
在 Plugins → 网页搜索++ 点击 Take over 后,接缝使用本插件的链。Hand back to official search 会把 web 行写回 deepseek-official,链不再被咨询。页面上的 Try one search 探测与真实接管状态一致,不会在接缝指向别处时误报链已执行。
密钥与 UI¶
密钥经 ctx.credentials 写入,不进 settings 文件、不进 snapshot 响应、不进日志。列表接口不返回密钥明文;需要时可经 eye 按钮通过仅 loopback、带 no-store 的路由单次 reveal 一个槽。管理路由仅接受 loopback,并对 Origin、Sec-Fetch-Site、写请求的 Content-Type 等做了约束。界面随 DSH 语言在中文/英文间切换。
链行为摘要¶
| 情况 | 结果 |
|---|---|
| 首节点成功 | 返回该结果,不调用后续节点 |
| 首节点抛错 | 记录原因,执行下一节点 |
| 节点未注册 | 记为 not registered,执行下一节点 |
| 调用方取消 | 立即传播,不会继续回退 |
| 全部失败 | WEB_SEARCH_CHAIN_EXHAUSTED,每个节点一行原因 |
安装与启用¶
需要 dsh 0.1.0 或更新版本。插件通过 ctx.web 接缝与 webServer 前缀路由工作;宿主过旧时不会注册并在日志中说明原因。Node 引擎要求 >=20(见 package 元数据)。
从 npm 安装(README 原文命令):
dsh plugin --profile desktop add dsh-web-search-plus
安装后刷新浏览器一次,打开 Plugins → 网页搜索++,点击 Take over。
若需固定 Git 标签而非 npm 发布版,README 给出:
dsh plugin --profile desktop add github:polan-prologue/dsh-web-search-plus#v0.1.2
配置与管理¶
选项写在 profile 的 cordis.patch.yml 插件行,也可在插件页四张卡片中编辑:Priority(顺序与是否启用链)、Tavily keys、Tavily options、Status(接管状态、可用性、探测搜索、用量查询)。无体验平台时会回退到内核 Built-in plugins 页。
| Key | 默认值 | 含义 |
|---|---|---|
priority |
[tavily, deepseek-official] |
链顺序 |
tavilyKeyRefs |
[TAVILY_API_KEY] |
凭证引用,轮换顺序 |
tavilyBaseURL |
https://api.tavily.com |
端点(自动追加 /search 与 /usage) |
tavilyMaxResults |
8 |
每次搜索结果数(1–20) |
tavilySearchDepth |
basic |
basic / fast / ultra-fast / advanced |
tavilyIncludeAnswer |
true |
是否向 Tavily 请求 LLM 摘要 |
tavilyTimeoutMs |
30000 |
单次请求超时 |
tavilyRateLimitCooldownMs |
60000 |
429 后冷却时间 |
fallbackOnEmpty |
false |
空结果是否视为失败并继续链 |
Tavily 免费档按账户计量,多密钥只有来自不同账户时才能分摊额度;advanced 深度消耗双倍 credits。接缝仍只选一个 provider id——本插件即该 id,排序是插件内部逻辑,不是接缝自带能力。部分构建上修改 web 行的 provider 需要重启宿主,页面会提示而非静默失败。
典型用法¶
- 安装插件并刷新浏览器。
- 在 Tavily keys 中配置一个或多个凭证引用(默认
TAVILY_API_KEY)。 - 在 Priority 中把 Tavily 与
deepseek-official拖到期望顺序;按需打开链总开关与fallbackOnEmpty(在配置或 Tavily options 相关项中)。 - 点击 Take over,在 Status 用 Try one search 验证链是否按预期工作;需要时用 fetch per-key usage 查看各 Tavily 槽用量。
- 不再使用链时,选择 Hand back to official search 交还官方搜索。
开发侧自测(README):
npm test # 238 个单元测试,无网络、无密钥
npm run test:live # 使用真实密钥做 live 搜索
适用场景与注意¶
适合:已在 DSH desktop profile 使用 web_search,希望 Tavily 与 DeepSeek 原生搜索可排序、可回退;或有多把 Tavily 密钥、需要在限速与额度之间自动切换的用户。
注意:
- 插件以当前 dsh 进程权限 运行,安装前请自行查看 GitHub 仓库 源码与 MIT 许可证。
- DSH 社区插件目录(如 SkillHub 条目)为独立生态站点,与 DeepSeek / 幻方无官方从属关系;「一切皆插件」是 DSH 的产品思路,本文介绍的是社区维护的联网工具类插件。
- Tavily 侧能力受 Tavily 账户与 API 策略约束;DeepSeek 原生节点行为随 Settings → Web search 与上游变更而变,本插件刻意复用官方实例以降低漂移。
结尾¶
dsh-web-search-plus 把 DSH 网页搜索从「接缝只能钉死一个提供方」扩展为「单 provider 内的 Tavily ↔ DeepSeek 优先级链 + Tavily 多密钥轮换」,并在插件页完成接管、交还与探测,密钥留在凭证域。