dsh-custom-search-fetch:用自建 SearXNG 与 Firecrawl 接管 Harness 联网后端

前言

在 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 指向上述自定义提供方。

  1. 搜索:对 SearXNG 发起 GET /search?format=json,按配置翻页直到凑够唯一 URL 或达到 searxngMaxPages。答案与 infobox 文本进入结果的 content,web_search 在来源列表上方展示;引擎部分失败时错误会点名引擎;无结果时若有拼写建议会作为 content 返回。
  2. 抓取:对 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。

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

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

小夜