前言¶
DeepSeek Harness (DSH) 在使用原生 web-search 工具时,若存在多个 provider,会触发 WEB_PROVIDER_AMBIGUOUS 错误。240xu/dsh-websearch 作为一个原生插件,向 ctx.web 注册了唯一的 provider unified。它聚合了 11 个后端,并发执行搜索请求,合并结果并进行 URL 去重。即使部分后端宕机,只要有一个可用,搜索即可继续。
安装与启用¶
- 进入插件的 profile 目录:
cd ~/.dsh/profiles/web
- 在
package.json的dependencies中加入:
"@240xu/dsh-websearch": "file:/path/to/@240xu/dsh-websearch"
- 安装依赖:
pnpm install
- 修改
~/.dsh/profiles/web/cordis.patch.yml,将dsh-web的searchProvider指向unified:
- id: web
name: '@deepseek-ai/dsh-web'
config:
searchProvider: unified
重启 dsh web 即可生效。
核心功能¶
- 唯一 Provider 注册:注册 id 为
unified的 provider,确保dsh-web选择规则不会触发WEB_PROVIDER_AMBIGUOUS。 - 并发 Fan-out 与合并:向所有启用的后端发起并发请求,使用
Promise.allSettled机制,单个后端失败不会阻塞整体搜索。 - URL 去重:在结果合并阶段进行 URL 去重,可选开启 URL+Title 聚合。
- 零配置后端:Exa、Parallel、DuckDuckGo、SearXNG 四个后端无需 API Key 即可使用。
- API Key 后端自动激活:在 DSH 设置面板或环境变量中配置 DeepSeek、Anthropic、OpenAI、Brave、Tavily、Serper、Mojeek 的 Key 后,对应后端自动激活。
后端列表¶
插件内置 11 个后端,分为无需 Key 和需 Key 两种:
- 无需 Key:
exa:流式 HTTP MCP,无 key。parallel:流式 HTTP MCP,无 key。ddg:HTML 抓取,零依赖。searxng:REST JSON 搜索,默认实例https://searx.be。
- 需 Key:
deepseek:使用 DeepSeek API。anthropic:使用 Anthropic API。openai:使用 OpenAI API。brave:使用 Brave API。tavily:使用 Tavily API。serper:使用 Serper API。mojeek:使用 Mojeek API。
配置与使用¶
- 全局设置:在
Settings → Unified Search中可配置并发数(默认 6)、单后端超时(默认 30s)、结果数(默认 8)等。 - 去重策略:支持
url(仅去重链接)和url+title(额外合并同标题转载)两种策略。 - 结果健康度:每次搜索结果尾部会附上
[websearch backends] ...日志,包含各后端的响应时间与状态,用于诊断。 - 环境变量:API Key 可通过环境变量读取,格式如
DEEPSEEK_API_KEY,也可通过 DSH 凭证服务配置。
注意事项¶
- 密钥缺失软失败:如果后端所需的 Key 缺失,该后端会以明确错误码软失败,不会阻塞其他后端。
- 本地可用性检查:
available()方法仅做本地配置检查(如 Key 是否存在),不联网探测后端可达性。 - SearXNG 实例:默认使用
https://searx.be,公共实例可用性随网络波动,可在设置中切换或自托管。 - 日志路由:每个后端通过
lib/util/log.js将请求和结果路由到主机的日志器,便于调试。