前言

DeepSeek Harness (DSH) 在使用原生 web-search 工具时,若存在多个 provider,会触发 WEB_PROVIDER_AMBIGUOUS 错误。240xu/dsh-websearch 作为一个原生插件,向 ctx.web 注册了唯一的 provider unified。它聚合了 11 个后端,并发执行搜索请求,合并结果并进行 URL 去重。即使部分后端宕机,只要有一个可用,搜索即可继续。

安装与启用

  1. 进入插件的 profile 目录:
   cd ~/.dsh/profiles/web
  1. 在 package.json 的 dependencies 中加入:
   "@240xu/dsh-websearch": "file:/path/to/@240xu/dsh-websearch"
  1. 安装依赖:
   pnpm install
  1. 修改 ~/.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 将请求和结果路由到主机的日志器,便于调试。