dsh-fk-search-tier:兩級搜索與抓取 failover 的 DSH 工作流插件

前言

在 DeepSeek Harness(DSH)裏,智能體要查資料通常走 ctx.web 的搜索與抓取能力。默認的 deepseek-official 搜索通道會把每次查詢當成一整輪模型調用,README 裏給出的實測約爲 9.6K input token,按 token 計費時成本偏高。社區裏也有多後端 failover 插件,但體量更大、配置更重。

dsh-fk-search-tier 由維護者 FuriousKinght 發佈,分類爲工作流,當前在 GitHub 上星標爲 0。它不改 DSH 本體,只通過純 ctx.web provider 註冊,把搜索做成「Tavily → DeepSeek Search API」兩層,抓取做成「DeepSeek Fetch API → 直連」兩層;第一層因額度、限流、錯誤或空結果失敗時自動切下一層,並帶額度感知的熔斷。若你只需要這條兩級鏈路而不是十幾個搜索後端,README 把它定位爲更輕的替代方案。

這是什麼

一句話:dsh-fk-search-tier 是 DSH 的 bundle 插件(package.json 版本 0.2.0,MIT 許可證),註冊 search-tier 與 fetch-tier 兩個 provider,在 Tavily 與 DeepSeek 官方 Search/Fetch API 之間做有序 failover,直連抓取作爲零成本兜底。

維護者與倉庫:FuriousKinght / GitHub。社區目錄頁:SkillHub 插件條目(獨立站點,與 DeepSeek / 幻方無官方從屬關係)。

核心功能

兩級搜索

默認順序 order: [tavily, deepseek]:

  1. Tavily:可無 key 使用 keyless 匿名檔;有 TAVILY_API_KEY 時走賬戶額度(README 寫明免費檔 1000 credits/月)。
  2. DeepSeek Search API:按次計費(README 寫明 5 元 / 1000 次成功請求,不按 token 燒搜索輪次)。

當上一層出現 429、額度耗盡、5xx、超時、空結果(failOnEmpty: true 時)等情況,會切到下一層;Tavily 正常返回時不會無故切到 DeepSeek,這是設計行爲。

兩級抓取

默認順序 fetchOrder: [deepseek-fetch, direct]:

  1. DeepSeek Fetch API:返回 Markdown 正文(README 給出 2026-10-17 實測:example.com 約 0.53s,GitHub 倉庫頁約 0.27s)。
  2. 直連抓取:fetch HTML 後轉純文本,無 API 成本;不解析 JS 渲染頁面。

熔斷與切換

搜索與抓取各有一套相同語義的熔斷器(配置項 breaker):

觸發條件 行爲 冷卻
429 / 402 / 文本含 insufficient、quota 該層開斷並切下一層 1 小時(quotaCooldownMs)
401 / 403 跳過該層,改配置可立刻恢復 無
5xx / 超時 / 網絡錯誤 窗口內累計達到 threshold(默認 3)纔開斷 60 秒(cooldownMs)
搜索返回 0 條 本次切下一層,不計入熔斷 無
deepseek 層缺 key 跳過 無

冷卻到期後半開探活,成功則閉合。

與模型側的契約

搜索只返回 sources(url、title、snippet 等),由 DSH 的 formatSearchOutput 組裝;DeepSeek 層優先用 summary 長摘要。抓取遵循 WebFetchResult:成功時 statusCode 爲 200,DeepSeek API 不報告目標頁真實 HTTP 狀態(README 列爲已知限制)。

診斷工具

插件註冊只讀工具 search_tier_status,可查看各層 hasKey、open、lastWinner 與熔斷狀態,用於確認 DEEPSEEK_API_KEY / TAVILY_API_KEY 是否被進程讀到。

安裝與啓用

安裝命令以 README 爲準,不要手工把插件目錄裏的 cordis.patch.yml 抄進 profile,否則會繞過 bundle 加載時序並可能出現 tool-web: waiting for web:

dsh plugin --profile desktop add <本包路徑或包名>

裝完後重啓 DSH。插件要求 Node >=20,peer 依賴 @deepseek-ai/cordis >=4.0.1 <5。

配置要點

密鑰不要寫在插件目錄

隨插件發佈的 cordis.patch.yml 不宜寫 apiKey。推薦用環境變量:

後端 環境變量
DeepSeek Search / Fetch DEEPSEEK_API_KEY
Tavily(可選) TAVILY_API_KEY

改環境變量後必須重啓 DSH。也可在 $DSH_HOME/profiles/<profile>/cordis.patch.yml 用同名 id: search-tier 整段覆蓋配置(私有文件可寫密鑰);profile 層覆蓋會替換插件自帶段,需把要保留的鍵一併寫上。

零密鑰最小用法

不配密鑰時:搜索走 Tavily keyless,抓取走直連。代價是沒有 DeepSeek 兜底,匿名檔限流時第二層不可用。

- id: search-tier
  name: dsh-fk-search-tier
  config:
    order: [tavily, deepseek]
    tavily: {}
    deepseek: {}

完整項包括 fetchOrder、timeoutMs、fetchTimeoutMs、failOnEmpty、breaker,以及 tavily.depth、deepseek.needContent、deepseek.fetchMaxBytes 等,見倉庫 README 的「完整配置項」一節。

與官方 provider 的關係

DSH 0.2.1-rc.2 起可內置 DeepSeek Search/Fetch,但 README 寫明官方不會自動回退到其他提供者。本插件顯式指定 searchProvider / fetchProvider 時可避免歧義;若同時打開官方開關,需注意是否出現 WEB_PROVIDER_AMBIGUOUS。

典型用法與自測

  1. 按上文安裝並配置密鑰或環境變量,重啓 DSH。
  2. 讓智能體調用 search_tier_status,確認 layers 裏 hasKey 與 open 符合預期。
  3. 正常使用 DSH 的聯網搜索與 WebFetch;失敗時觀察是否按順序 failover。

倉庫提供自測腳本:

node test/selftest.mjs

README 寫明 53 項斷言,含熔斷、契約、真實 Tavily keyless 與 DeepSeek Fetch 調用等。

適用場景與注意

適合誰:希望默認先用 Tavily(含免 key 檔)壓低成本,僅在失敗或空結果時用 DeepSeek Search;抓取優先乾淨 Markdown,失敗再直連兜底的工作流用戶。

使用前請知悉:

  • 插件以當前 DSH 進程權限運行,安裝前應自行審閱 源碼 與 MIT 許可證。
  • Tavily keyless 爲匿名檔,有速率限制且可能被官方調整;DeepSeek Search/Fetch 均按次計費。
  • 無圖形設置頁,改 YAML 後需重啓;與官方內置 provider 並存時要弄清最終生效的 provider。
  • README 對比 dsh-search-failover:本插件約 26 KB、僅 2 個搜索後端,但包含抓取 failover 與 DeepSeek 新 Search/Fetch API。

結尾

dsh-fk-search-tier 把「搜索 Tavily → DeepSeek」和「抓取 DeepSeek Fetch → 直連」收成一條可配置、帶熔斷的 ctx.web 鏈路,適合在 DSH「一切皆插件」的生態裏做輕量聯網工作流。目錄與倉庫:

  • https://www.skillhub.cn/plugins/FuriousKinght/dsh-fk-search-tier
  • https://github.com/FuriousKinght/dsh-fk-search-tier
羽毛球分组比赛记分
小程序二维码

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

小夜