前言¶
DeepSeek Harness(DSH)在 ctx.web seam 上每次只解析一個 search provider,provider 也只有一個 model 字段,沒有失敗重試鏈。一旦上游出錯(HTTP 錯誤、沒有 web_search_tool_result 結果塊或返回空結果),整次搜索就失敗。new-api 的自動換渠道只在“同一個模型名有多個渠道”時生效,要麼在網關造別名,要麼在 harness 側做故障轉移。本插件選後者:保持網關上的官方模型名,通過順序嘗試多個後端,在任一後端失敗時自動切換到下一個,直到所有後端都失敗才報錯。
這是什麼¶
dsh-web-search-failover 是 DeepSeek Harness 的聯網工具類插件,由維護者 xingzoudefengye 提供。它註冊了一個 deepseek-failover provider,按順序嘗試一組搜索後端。當主後端失敗或返回空結果時,插件會自動切換到下一個後端,直到所有後端都嘗試完。插件通過 patch 自身禁用默認的 web-search-deepsearch 行,無需手動編輯 profile。插件本身純 JS、無構建步驟,依賴 DSH ≥ 0.2.1 與 Node ≥ 22。
核心功能¶
- 註冊
deepseek-failoverprovider,替換默認搜索 provider。 - 支持有序後端列表,第 0 個優先,後續爲備胎。
- 失敗判定:拋錯、成功但沒有 sources,但不處理
WEB_ABORTED(用戶取消)。 - 通過
backends配置項逐個構造 provider,每項獨立指定model、baseURL和apiKeyEnv。 - 通過
cordis.patch.ymlpatch 自身,禁用默認web-search-deepseek行。 - 插件無構建步驟,純 JS,不會觸發 pnpm 的
allowBuilds攔截。
安裝與啓用¶
前置條件:
- DSH ≥ 0.2.1
- Node ≥ 22,且
pnpm在 PATH 上 - 能訪問
https://codeload.github.com - 一個 OpenAI/Anthropic 兼容的搜索網關及其 API key
在 web profile 下安裝:
dsh plugin --profile web add github:xingzoudefengye/dsh-web-search-failover
Windows 上完全一樣:
dsh plugin --profile web add github:xingzoudefengye/dsh-web-search-failover
安裝後必須重啓 DSH(關掉 dsh web 的終端再重新起)。插件在 host 啓動時 import,不重啓不會生效。
Desktop 版 profile 名是 desktop,需要先完全退出應用再加:
dsh plugin --profile desktop add github:xingzoudefengye/dsh-web-search-failover
憑據配置¶
插件的 apiKeyEnv 指向一個憑據引用名,不是明文。把網關令牌寫入 harness 的憑據文件:
- macOS / Linux:
~/.dsh/.credentials.yaml - Windows:
%USERPROFILE%\.dsh\.credentials.yaml
示例:
refs:
NEWAPI_API_KEY: sk-...
該文件由 harness 的 credentials 插件注入,不需要寫系統環境變量。如果更習慣環境變量,可以把 apiKeyEnv 改成對應的變量名。
配置示例¶
在 profile 的 cordis.patch.yml 裏覆蓋 id: web-search-failover 的 config。插件默認順序爲 deepseek-v4-flash → claude-haiku-5-5,不覆蓋則按此走:
- id: web-search-failover
config:
providerId: deepseek-failover # ctx.web 選中的 provider 名,一般不用改
backends:
- { model: deepseek-v4-flash, baseURL: https://your-gateway/v1, apiKeyEnv: NEWAPI_API_KEY }
- { model: claude-haiku-5-5, baseURL: https://your-gateway/v1, apiKeyEnv: NEWAPI_API_KEY }
配置項說明:
| 鍵 | 默認 | 作用 |
|---|---|---|
providerId |
deepseek-failover |
註冊給 ctx.web 的 provider 名;bundle patch 裏 web.searchProvider 必須與它一致 |
backends |
— | 有序列表,第 0 個優先,其後都是備胎;每項 model / baseURL / apiKeyEnv 各自獨立 |
apiKeyEnv / baseURL / apiKey / apiVersion / maxTokens / maxUses |
見 lib/index.js 的 Config |
舊式單後端字段;用 backends 時不需要,插件按 backend 逐個構造 provider |
失敗判定:拋錯、或成功但沒有 sources。WEB_ABORTED(用戶取消)直接向上拋,不換後端。全部失敗才返回最後一個錯誤;如果所有後端都成功但確實沒結果,返回那個空結果。
驗證安裝¶
執行以下命令,應看到 searchProvider: deepseek-failover:
dsh --profile web --dump-config | grep -A3 "searchProvider"
PowerShell:
dsh --profile web --dump-config | Select-String -Pattern "searchProvider" -Context 0,3
再做一次真實搜索,網關日誌裏會出現主後端的模型名;只有主後端失敗時纔會多一條備用後端。
注意:插件自帶的 cordis.patch.yml 裏 baseURL 寫的是示例網關(http://43.133.21.227:3000/v1),請改成你自己的網關地址。
適用場景與注意¶
- 適合需要多個搜索後端、希望自動切換的場景,如主後端不穩定或需要混合使用不同模型進行搜索。
- 插件以當前 dsh 進程的權限運行,安裝前建議檢查源碼與許可證。
- 插件不處理
WEB_ABORTED,用戶取消不會觸發備用後端。 - 舊式單後端字段(
apiKeyEnv、baseURL等)在配置backends時不需要。
卸載¶
dsh plugin --profile web remove dsh-web-search-failover
然後重啓 DSH。bundle 的 patch 隨之失效,harness 原有的 web-search-deepsearch 行會恢復;如果你之前手工在 profile patch 裏刪過它,需要自己加回來。
同步到另一臺機器¶
邏輯全在插件裏,換機器不需要搬配置,但要滿足四件事:
- 裝插件:運行
dsh plugin add github:xingzoudefengye/dsh-web-search-failover。版本自動跟master最新提交,兩臺機器不必同 commit,但 harness 版本要一致(都 ≥ 0.2.1)。 - 憑據:
.credentials.yaml的refs:裏要有NEWAPI_API_KEY。 - 清掉舊的 provider 行:profile patch 裏若還有
- id: web-search-deepsearch,刪掉。 - 網關可達:
baseURL換成本機可訪問的地址。
排錯¶
| 現象 | 原因 | 處理 |
|---|---|---|
dsh plugin add 成功,但搜索行爲沒變 |
插件在 host 進程啓動時 import,進程裏的模塊不會熱替換 | 重啓 DSH(關掉 dsh web 再起) |
改了插件源碼(哪怕是 lib/index.js)也不生效 |
Node 的 ESM 緩存:已 import 的模塊不會重新執行 | 同上,重啓 host;GitHub 安裝還需先 dsh plugin add 重裝以拉新代碼 |
dsh plugin add 卡住或報網絡錯誤 |
拉的是 codeload.github.com 的 tarball,公司網絡/代理常攔 |
走代理,或把倉庫整目錄拷過去,依賴改成 file: 路徑後 pnpm install(插件無外部 npm 依賴,離線可裝) |
報 WEB_PROVIDER_UNAVAILABLE |
所有 backends 都 available() === false,通常是 apiKeyEnv 指向的引用沒有值 |
檢查 .credentials.yaml 的 refs: 裏有該鍵,且鍵名與 apiKeyEnv 完全一致 |
| 搜索一直是備用後端的模型 | 主後端失敗但未報錯(返回空結果也會觸發回落) | 看網關日誌確認主後端返回碼;密鑰額度、模型名拼寫是最常見原因 |
配置樹裏出現同一個 row id 衝突(web-search-deepsearch 被兩處同時聲明) |
profile patch 裏手工加過 id: web-search-deepsearch 的行,與 bundle patch 打架 |
刪掉 profile 裏那一行,插件自帶的 patch 已負責禁用它 |
開發¶
本倉庫是純 JS、無構建步驟。倉庫裏沒有 node_modules,直接 npm test 會因爲找不到 @deepseek-ai/* 的 peer 依賴而失敗 —— 先把本機已安裝的 harness 包鏈進來:
node scripts/dev-link.mjs # 探測 dsh 的安裝位置,鏈入 schemastery / dsh-web / dsh-web-search-deepseek 等
npm test # node --test
dev-link 依次探測:dsh 可執行文件所在的 npm 目錄、$DSH_HOME/profiles/<profile>、$DSH_HOME/profiles、$DSH_HOME,也可以用第一個參數或 DSH_PACKAGE_DIR 直接指定 @deepseek-ai/dsh-* 所在目錄。Windows 上用 junction,不需要管理員權限。
改完代碼在本地驗證,再裝到 profile:dsh plugin --profile web add <本倉庫絕對路徑> 走 link: 依賴,配合 dev-link 即可改完重啓 host 就看到效果。
生態背景¶
DeepSeek Harness 的理念是「一切皆插件」,社區目錄 SkillHub 與 DeepSeek / 幻方無官方從屬關係,僅作爲插件索引與展示。本插件遵循 MIT 許可證,由維護者 xingzoudefengye 維護。
相關插件¶
同作者、同一套安裝方式(dsh plugin add github:xingzoudefengye/<repo>):
- dsh-browser — 給 agent 一個可驅動的真實瀏覽器,側欄並排顯示
- dsh-compaction-local-handoff — 無模型的本地交接式壓縮
- dsh-project-memory — 有界、可提交進 git 的項目記憶
- dsh-resume-budget — 會話恢復時的輸入預算控制
- dsh-session-recall — 無模型、有界的會話史書
結語¶
本插件通過有序後端列表與自動切換機制,解決了 DeepSeek Harness 單一搜索 provider 失敗導致整次搜索失敗的問題,適合需要高可用搜索能力的場景。更多細節與源碼請參考:GitHub | SkillHub 目錄頁