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。

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

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

小夜