前言¶
在 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_searchprovider,注册 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。
核心功能¶
- 一次
web_search,双引擎并行:同时请求 DeepSeek 与 Exa。 - 排序:双源都命中的 URL 优先,其余按 reciprocal-rank(RRF)排序;去重时保留信息更完整的标题与摘要。
- 可用性:一侧超时或失败时,另一侧仍可返回结果,整次搜索不因单腿失败而整体失败。
- 足迹:不增加额外工具、不打包 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。
优先级(高到低):
deepseekApiKey/exaApiKey(插件 config)- credentials 服务(
DEEPSEEK_API_KEY/EXA_API_KEY) - 进程环境变量
只配置其中一侧密钥时,搜索会 降级为仅使用该引擎;两侧都有则走完整混合检索。
典型用法与验证¶
对 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.webprovider,维护者另有独立 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