前言¶
在 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]:
- Tavily:可無 key 使用 keyless 匿名檔;有
TAVILY_API_KEY時走賬戶額度(README 寫明免費檔 1000 credits/月)。 - DeepSeek Search API:按次計費(README 寫明 5 元 / 1000 次成功請求,不按 token 燒搜索輪次)。
當上一層出現 429、額度耗盡、5xx、超時、空結果(failOnEmpty: true 時)等情況,會切到下一層;Tavily 正常返回時不會無故切到 DeepSeek,這是設計行爲。
兩級抓取¶
默認順序 fetchOrder: [deepseek-fetch, direct]:
- DeepSeek Fetch API:返回 Markdown 正文(README 給出 2026-10-17 實測:example.com 約 0.53s,GitHub 倉庫頁約 0.27s)。
- 直連抓取:
fetchHTML 後轉純文本,無 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。
典型用法與自測¶
- 按上文安裝並配置密鑰或環境變量,重啓 DSH。
- 讓智能體調用
search_tier_status,確認layers裏hasKey與open符合預期。 - 正常使用 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