前言¶
在 DeepSeek Harness(DSH)里,智能体常用的 web_search 和 web_fetch 默认走官方搜索与匿名 HTTP 抓取。若团队已有自建的 SearXNG 聚合搜索,或用 Firecrawl 做 Markdown 抓取,往往希望 Harness 继续暴露同名工具与引用格式,只把请求落到自己的服务上。自己 fork 工具链成本高;直接改 @deepseek-ai/dsh-web 又怕升级冲突。下面介绍社区插件 dsh-custom-search-fetch 如何通过 ctx.web 提供方接口替换后端,而不改写工具本身。
这是什么¶
dsh-custom-search-fetch 由 mercurynomercy 维护,分类为联网工具,当前 GitHub 星标为 0。插件不注册新工具,而是向 @deepseek-ai/dsh-web 注册搜索提供方 custom-searxng 与抓取提供方 custom-firecrawl,并通过 bundle 补丁把 searchProvider / fetchProvider 固定到二者。Harness 自带的 web_search、web_fetch 在输出格式、引用说明、按 preset 的可用性及超时策略上保持不变,仅后端 HTTP 目标改变。要求 DeepSeek Harness 版本 >=0.2.2-rc.1(插件包版本 0.2.0,许可证 MIT)。
工作原理¶
安装后,Cordis 会应用插件自带的 cordis.patch.yml,把 @deepseek-ai/dsh-web 指向上述自定义提供方。
- 搜索:对 SearXNG 发起
GET /search?format=json,按配置翻页直到凑够唯一 URL 或达到searxngMaxPages。答案与 infobox 文本进入结果的content,web_search在来源列表上方展示;引擎部分失败时错误会点名引擎;无结果时若有拼写建议会作为 content 返回。 - 抓取:对 Firecrawl 调用
POST /v2/scrape(或 v1),formats: ["markdown"],页面 Markdown 以text返回,标题作标题行;状态码与最终 URL 来自 Firecrawl 元数据。发送前与内置 HTTP 抓取相同:仅http(s)、URL 最长 2048、禁止内嵌凭据;Firecrawl 亦可将 PDF 等转为 Markdown。
移除插件会恢复 DeepSeek 默认搜索与匿名 HTTP 抓取。
安装与启用¶
在目标 profile 下执行 README 给出的安装命令:
dsh plugin --profile <profile> add github:mercurynomercy/dsh-custom-search-fetch
插件上架 dsh-market 或 Plugins 页面后,也可从目录安装。开发本地检出可用 dsh plugin --profile <profile> add link:$(pwd)(需先在仓库内 npm install)。
运行权限:插件与当前 DSH 进程同一权限访问你配置的 SearXNG / Firecrawl 地址;安装前请阅读 GitHub 源码 与 MIT 许可证。
配置¶
打开 Plugins → dsh-custom-search-fetch,README 下方的设置卡片分为 SearXNG search 与 Firecrawl fetch。保存会写入该 profile 的 cordis.patch.yml 并立即生效,无需重启。各字段可 Reset to default;非法值无法保存。firecrawlApiKey 为只写:界面初始为空,空白保存表示保留已存密钥。
也可手写 patch;带 id: dsh-custom-search-fetch 的行会整段替换配置,因此改一项也需写全已覆盖字段,例如:
- id: dsh-custom-search-fetch
config:
searxngBaseURL: http://localhost:8080
firecrawlBaseURL: http://localhost:3002
常用字段(默认值与含义以 README 为准):
| 字段 | 默认 | 含义 |
|---|---|---|
searxngBaseURL |
http://localhost:8080 |
SearXNG 根地址,不含 /search |
searxngMaxResults |
10 |
单次搜索条数(工具层 searchMaxResults 默认 8 会再封顶) |
searxngMaxPages |
2 |
为凑够结果最多请求的页数 |
searxngLanguage / searxngCategories / searxngEngines |
空 | 设置时原样传给 SearXNG |
searxngSafeSearch |
未设置 | 0 / 1 / 2;未设置则用实例 search.safe_search |
searxngTimeRange |
空 | day、week、month、year |
searxngTimeoutMs |
15000 |
单页请求超时 |
firecrawlBaseURL |
http://localhost:3002 |
Firecrawl API 根地址,不含 /v2 |
firecrawlApiVersion |
v2 |
v2 或 v1 scrape 端点 |
firecrawlApiKey |
空 | 明文密钥;自托管无鉴权可留空 |
firecrawlApiKeyEnv |
FIRECRAWL_API_KEY |
未设明文密钥时读取的环境变量名 |
firecrawlOnlyMainContent |
true |
去掉导航、页眉页脚 |
firecrawlTimeoutMs |
25000 |
Firecrawl scrape 超时 |
firecrawlMaxAgeMs |
0 |
仅 v2:可接受缓存的最大毫秒数;0 表示总是新鲜抓取 |
firecrawlMaxBodyChars |
100000 |
截断前返回的 Markdown 字符数 |
SearXNG 前置条件¶
未开启 JSON 格式时 SearXNG 会对插件请求返回 403。在 settings.yml 中启用:
search:
formats:
- html
- json
若实例限流开启,需放行 Harness 所在主机,或对其实例关闭限流,否则易出现 429。
超时关系¶
web_fetch 受 tool-web 的 fetchTimeoutMs 约束(默认 30 秒)。firecrawlTimeoutMs 应低于该值;若对慢页提高 Firecrawl 超时,需同步提高 tool-web 行上的 fetchTimeoutMs。
只切回其中一个后端¶
在 profile 的 cordis.patch.yml 中重写 web 行。例如保留 SearXNG 搜索、抓取改回内置匿名 HTTP:
- id: web
name: '@deepseek-ai/dsh-web'
config:
searchProvider: custom-searxng
fetchProvider: http
内置提供方 id 包括 deepseek-official(搜索)、http(抓取),以及 deepseek-search-api / deepseek-fetch-api。Web 设置页「Use the new Web Search API」开关也会改写该 web 行,且优先级高于本插件补丁。
冲突与错误¶
同一类提供方 id 必须唯一;若另一插件也注册 custom-searxng 或 custom-firecrawl,第二次注册会失败并报 WEB_DUPLICATE_PROVIDER。不要手工再插入 dsh-custom-search-fetch 行,bundle 补丁已包含。
常见 WebError:WEB_PROVIDER_ERROR 指明端点与修复方向;WEB_ABORTED 为取消;WEB_INVALID_URL / WEB_BLOCKED_URL 为 URL 被拒;清空 base URL 后提供方不可用,调用失败为 WEB_PROVIDER_CONFIGURED_UNAVAILABLE。
适用场景与注意¶
适合已在内网或本机部署 SearXNG、Firecrawl,并希望 Harness 智能体仍用标准 web_search / web_fetch 契约的团队。不适合不愿维护搜索/抓取服务、或必须与 DeepSeek 官方搜索 API 绑定的场景(此时应使用 Web 设置或对应内置提供方)。
社区插件目录(如 skillhub.cn)由生态维护,与 DeepSeek / 幻方无官方从属关系;选型时以仓库 README 与版本兼容性为准。
维护者提供的冒烟命令(需本地 SearXNG、Firecrawl 可达):
SEARXNG_URL=http://localhost:8080 FIRECRAWL_URL=http://localhost:3002 npm run smoke -- "query" https://example.com
结尾¶
经过上面的步骤,你可以在不大改智能体 preset 的前提下,把联网搜与抓指向自建 SearXNG 与 Firecrawl,同时保留 Harness 原有工具行为与错误模型。目录页:https://www.skillhub.cn/plugins/mercurynomercy/dsh-custom-search-fetch;源码与完整配置表:https://github.com/mercurynomercy/dsh-custom-search-fetch。