dsh-deepseek-exa-hybrid-search:DeepSeek 与 Exa 合并为单份 web_search 结果

前言

在 DSH(DeepSeek Harness)里,智能体通过内建 web_search 拉取联网结果。若你只接一个搜索后端,要么偏重某一家的索引风格,要么在业务层自己并发两家 API 再手工去重——而 ctx.web 每个能力只接受一个 provider id,内建合并多源的能力并不存在。单独再挂一个 MCP 工具可以补第二路搜索,但无法改写内建 web_search,也不会自动交回一份合并列表。

dsh-deepseek-exa-hybrid-search(维护者 zztdandan,分类:联网工具)以 search provider 方式替换 web_search 后端:一次调用并行请求 DeepSeek Search API 与 Exa,去重合并后返回单一结果列表,不新增工具名、不改变 Agent 侧的调用方式。

这是什么

  • 定位:DSH web_search provider,注册 id 为 hybrid2,接管 DeepSeek 搜索槽位(与 deepseek-official、deepseek-search-api 或未显式指定时的默认槽位相关;其他已显式指定的 provider 如 ddg 不受影响)。
  • 仓库:GitHub · 社区目录页
  • 许可:MIT(package.json 版本 1.0.0)

下面按安装、配置、行为与兼容说明可核对的操作步骤。

为何用 provider 而不是 MCP

README 中的设计说明:ctx.web 每个能力只能绑一个 provider,不能在内建层做多源合并。托管 MCP 可以加工具,但不能重写内建 web_search 或返回一份合并列表。因此合并逻辑放在 provider 内,直接调用两家 HTTP API。

核心功能

  1. 一次 web_search,双引擎并行:同时请求 DeepSeek 与 Exa。
  2. 排序:双源都命中的 URL 优先,其余按 reciprocal-rank(RRF)排序;去重时保留信息更完整的标题与摘要。
  3. 可用性:一侧超时或失败时,另一侧仍可返回结果,整次搜索不因单腿失败而整体失败。
  4. 足迹:不增加额外工具、不打包 client bundle,仅替换搜索 provider。

请求与合并细节(摘自 README):

  • DeepSeek:POST https://api.deepseek.com/v1/tools/search(结构化结果,无模型轮次)。
  • Exa:POST https://api.exa.ai/search(带 highlights)。
  • 重试:Exa 3 次、间隔预算 6 s;DeepSeek 2 次、8 s;300 ms 退避;总预算约 25 s。
  • 去重:对规范化 URL(去掉跟踪参数、hash、尾部斜杠)。
  • 摘要截断至 800 字符,便于手机端上下文长度。

安装与启用

在已配置 web profile 的环境下执行:

dsh plugin --profile web add dsh-deepseek-exa-hybrid-search

安装后需要 重启 DSH 引擎。插件会注册 hybrid2 并接管上述 DeepSeek 搜索槽位。

配置

两个明文配置项,可在 Settings → Plugins → dsh-deepseek-exa-hybrid-search → Settings(原生表单)填写,或写入 profile patch:

- id: web-search-hybrid
  config:
    deepseekApiKey: "sk-..."
    exaApiKey: "..."

设计上有意将密钥放在 profile patch 明文中,因此 dsh --dump-config、设置表单与配置备份中都会可见——勿分享 patch 或 config dump。

优先级(高到低):

  1. deepseekApiKey / exaApiKey(插件 config)
  2. credentials 服务(DEEPSEEK_API_KEY / EXA_API_KEY)
  3. 进程环境变量

只配置其中一侧密钥时,搜索会 降级为仅使用该引擎;两侧都有则走完整混合检索。

典型用法与验证

对 Agent 而言用法不变:继续调用内建 web_search 即可,由 provider 在后台完成双源查询与合并。

维护者在仓库中提供测试入口(需按 README 自行准备密钥):

node test/run.mjs            # 合并单元测试 +  live 双腿 + 缺 key 行为
node test/live-takeover.mjs  # 在真实 Cordis ctx.web 上检查槽位接管

Live 测试从 HYBRID_PATCH(默认本地 profile patch)或环境变量 DEEPSEEK_API_KEY / EXA_API_KEY 读取密钥。

环境与兼容

  • DSH 0.2.1-rc.4 及匹配的 @deepseek-ai/schemastery(peer:>=3.18.0 <4)。
  • Node.js >= 20(依赖原生 fetch、AbortSignal.any)。
  • 运行时除宿主 schemastery 外无额外 npm 依赖。

适用场景与注意

适合:希望在 DSH 内用单一 web_search 同时覆盖 DeepSeek 官方搜索工具能力与 Exa 检索,并要双源共识 URL 优先排序的开发者。

注意:

  • 插件以当前 dsh 进程权限 运行,安装前请自行审阅 源码与 MIT 许可证。
  • 密钥出现在配置转储中时需按运维规范保管 profile 与备份。
  • 若宿主无法安装 ctx.web provider,维护者另有独立 stdio MCP 项目 deepseek-exa-search-combine-mcp,逻辑类似但形态不同;选型按宿主能力区分即可。

DSH 社区插件目录(如 SkillHub)为独立生态站点,与 DeepSeek / 幻方无官方应用商店从属关系。

结尾

经过上面的步骤,你可以在 web profile 下用一条官方安装命令启用 hybrid2,配好 DeepSeek 与 Exa 密钥(或只配一侧做降级),在不改 Agent 工具面的前提下得到一份去重、双源优先的合并检索列表。详情与更新以仓库为准:

  • 目录页:https://www.skillhub.cn/plugins/zztdandan/dsh-deepseek-exa-hybrid-search
  • GitHub:https://github.com/zztdandan/dsh-deepseek-exa-hybrid-search
羽毛球分组比赛记分
小程序二维码

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

Xiaoye