dsh-exa: Exa Takes Over web_search and web_fetch for DSH

前言

DeepSeek Harness(DSH)里,智能体常用的联网入口是内置的 web_search 和 web_fetch。若你希望搜索与抓取统一走 Exa,并在同一套插件里按需打开 Exa 的深调研、带引用答案、代码上下文等能力,就需要把 web 层 provider 换成 Exa,而不是在对话里临时拼多个外部脚本。

下面介绍社区插件 dsh-exa(维护者 GoldenLoaf24h,GitHub:GoldenLoaf24h/dsh-exa)。它在 DSH 0.2.x 上把网络检索整体接到 Exa:内置的 web_search、web_fetch 由 Exa 提供,并额外暴露若干 exa_* 工具;分类上属于「联网工具」。目录页:skillhub.cn/plugins/GoldenLoaf24h/dsh-exa(社区站点,与 DeepSeek / 幻方无官方从属关系)。

这是什么

dsh-exa(当前 package 版本 0.1.0,MIT 许可证)的定位是:Exa web search and fetch for DeepSeek Harness —— 替换内置 web_search / web_fetch,并暴露 Exa 的高级检索能力。

两种接入方式在 README 里写得很清楚:

  • 配置了 EXA_API_KEY 时走 Exa REST API(https://api.exa.ai),全部能力可用。
  • 没有 key 时自动退到 Exa 托管 MCP(https://mcp.exa.ai/mcp),搜索、抓取、代码检索仍可用,无需额外配置;需要 key 的能力(如 exa_answer、exa_similar、exa_research、深度检索、结构化输出)会给出明确提示,而不是静默降级。

核心功能

接管 web_search / web_fetch

插件自带的 cordis.patch.yml 声明:

- id: web
  config:
    searchProvider: exa
    fetchProvider: exa

profile 自己的 patch 层在 bundle 层之后应用。若 profile 的 cordis.patch.yml 里也有 - id: web,会覆盖插件设置。要真正接管,需要把 profile 里对应段改成与 README 一致,例如:

- id: web
  name: "@deepseek-ai/dsh-web"
  config:
    searchProvider: exa
    fetchProvider: exa

工具一览

除常驻的 web_search、web_fetch 外,插件还注册 Exa 相关工具。README 中的默认与 token 成本如下(启动成本约 900 token):

工具 作用 默认 需要 key
web_search 内置搜索,Exa 接管 常驻 否
web_fetch 内置抓取,Exa 接管 常驻 否
exa_research 多来源深调研,可轮询 开 是
exa_answer 带引用的综合答案 开 是
exa_code_context 库与 API 的代码示例 开 否
exa_tools 按需开启 exa_search / exa_contents / exa_similar 常驻 否
exa_search 完整搜索参数(类型、分类、域名、日期等) 关 部分
exa_contents 按 URL 批量取正文、摘要、高亮 关 部分
exa_similar 找相似页面 关 是

三个 schema 较大的工具(exa_search、exa_contents、exa_similar,合计 3200+ token)默认不注册;需要域名/日期筛选或批量正文时,可由模型调用 exa_tools({ enable: ["search"] }) 等按需开启,开启后会保持到会话结束。不需要深调研时,也可用 exa_tools 的 disable 收起 research 等以节省 token。

配置页(热生效)

路径:设置 → 插件 → dsh-exa。保存后下一次请求即用新值,无需重启 DSH。

  • API Key:写入 DSH 凭证库(EXA_API_KEY),不写入普通配置文件;留空表示沿用已保存的 key。
  • 搜索 / 抓取默认值:影响 web_search、web_fetch 的默认行为;模型仍可通过 exa_search 等逐次覆盖。
  • 工具开关:控制各 exa_* 是否「启动即暴露」;改开关会清掉模型在本轮自行开/关的状态。
  • 连接:REST 地址、MCP 地址、单次请求超时。

API key 解析顺序(先命中者生效):配置里的 apiKey(字面量,不推荐)→ 凭证库 EXA_API_KEY → 环境变量 EXA_API_KEY(含 $DSH_HOME/.env、项目 .env 等)。

安装与启用

README 给出的安装示例为本地路径(开发/自托管场景):

dsh plugin --profile desktop add D:/workspace/dsh-exa/dsh-exa

安装后在插件页面启用 dsh-exa。若 profile 的 cordis.patch.yml 里写死了别的 search provider,需按上一节改为 exa。

运行环境要求(来自 package.json):dsh 版本 >=0.2.0 <0.3.0。

典型用法

  1. 零配置试用:不填 API Key,依赖托管 MCP 完成 web_search、web_fetch、exa_code_context 等无需 key 的能力。
  2. 全能力:在配置页或凭证库写入 EXA_API_KEY,即可使用 exa_answer、exa_research、exa_similar 等。
  3. 控 token:默认不暴露三个大 schema 工具;需要时再 exa_tools({ enable: ["search"] }),或在配置页预先打开对应开关。
  4. 开发自测(维护者脚本,需网络时用于 live 测试):
node test/offline.mjs   # 配置、工具 schema、keyless 参数转换、页面解析
node test/client.mjs    # 配置页挂载、快照、暂存与保存
node test/live.mjs      # 真实调用 Exa(需要网络)

适用场景与注意

适合谁:已在 DSH 0.2.x 上跑智能体、希望统一用 Exa 做联网检索与抓取,并偶尔需要 Exa 的调研/答案/代码上下文能力的开发者。

权限与安全:插件以当前 DSH 进程权限运行;安装前应阅读 仓库源码 与 MIT 许可证,自行判断是否接入生产环境。

已知边界(README):

  • Exa 不返回目标页 HTTP 状态码;抓取成功统一记为 200,失败抛出带原因的 WebError。
  • 无 key 时托管 MCP 有并发与频率限制,插件内做了串行化与退避重试。
  • 无 key 时无法使用 outputSchema、contents.extras、type: deep 等仅 REST 支持的参数,会明确报错。

结尾

dsh-exa 把 DSH 的联网层换成 Exa,并在同一插件里分层暴露工具:日常用 web_search / web_fetch 即可,复杂检索再通过 exa_tools 或配置页打开大 schema 工具。无 key 可先用 MCP 路径验证流程,需要深调研与结构化能力再配置 EXA_API_KEY。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye