前言¶
在 DeepSeek Harness(dsh)裏跑智能體時,模型供應商(provider)的名字會出現在 profile 補丁、無頭 overlay、以及「模型供應商」頁的配置裏。這幾處若不同步,桌面端可能一切正常,而命令行、定時任務或值班輪一啓動就退出,終端裏常見:
dsh: NO_ADAPTER: no adapter registered for provider "acme"
這類問題往往難查:overlay 是最後一層補丁,某插件把「桌面當前選中的模型」寫進 overlay,但對應 profile 里根本沒有該 provider 的定義,進程直接退出,連報告都寫不出來。下面介紹社區插件 dsh-provider-hub(維護者 xuanbaon,分類:模型推理):在 設置 → 供應商中心 一頁看清引用與定義是否一致,並支持一鍵補齊或批量換供應商。
這是什麼¶
dsh-provider-hub 是給 DSH 增加的一頁設置 UI,核心目標是弄清「模型提供商」在三處的狀態,並把不一致補齊。
| 位置 | 誰在寫 |
|---|---|
profiles/<name>/cordis.patch.yml 裏的 agent-default-model |
模型選擇器裏選中的那一項 |
~/.dsh/<狀態目錄>/headless-overlay.yml |
插件每輪重寫(值班輪、定時任務等) |
同一 patch 裏的 llm-pi-ai.providers |
「模型供應商」頁裏的定義 |
插件數據與代碼分離,默認目錄爲 <DSH_HOME>/provider-hub/(DSH_HOME 默認 ~/.dsh),可用 DSH_PROVIDER_HUB_DATA 覆蓋。許可證 MIT,當前 package 版本 1.2.0。
核心功能¶
面板上的四個動作¶
| 動作 | 做什麼 | 數據來源 |
|---|---|---|
| 掃描對話 | 每個會話最後一次實際用的 provider/model,並按 provider 彙總 | storages/session_projcache/sessions/*.json 的 modelSelection.lastUsed |
| 掃描插件與配置 | 誰引用了哪個 provider,按「該 profile 自己有沒有定義」判定狀態 | profile patch、插件 overlay、插件 patch、config.json |
| 換供應商 | 在面板選「從 A → 換成 B(+模型)」,把所有寫着 A 的地方一起改掉,並把 B 的定義補進還缺它的 profile | profile patch、overlay、config.json |
| 一鍵同步(補定義) | 先出計劃(不寫盤),確認後把別處已定義的 provider 原樣追加進引用了它卻沒定義的 profile | profiles/<name>/cordis.patch.yml |
換供應商與補定義方向不同:
- 補定義:配置引用了 A,但本 profile 沒有 A 的定義 → 把定義搬過來,針對
NO_ADAPTER。 - 換供應商:不想再用 A,改用 B → 把
provider: A改成provider: B,並補上 B 的定義;只改選擇,不刪 A 的定義。
判定口徑¶
「懸空」按該 profile 自己有沒有定義算,不看別的 profile。桌面 profile 註冊了某 provider,不代表 headless 那一輪的配置裏也有。
| 判定 | 含義 | 你能做什麼 |
|---|---|---|
| 正常 | 內置供應商(deepseek-official、deepseek-account)或本 profile 已定義 |
— |
| 懸空·可補 | 別處有定義、本 profile 沒有 | 點「一鍵同步」 |
| 僅運行時 | 靜態配置裏沒有,運行時註冊表裏有 | 一般不用管 |
| 缺定義 | 哪兒都沒有 | 先去「模型供應商」頁配一次 |
掃描範圍只針對 agent-default-model 條目裏的 provider:,避免把子代理、工具提供方等誤報爲模型供應商。
寫入與安全¶
換供應商與補定義共用規則:寫前自檢(解析失敗或目標未達成則放棄)、寫前備份 *.bak-provider-hub-<時間>、同目錄臨時文件再 rename 原子替換、單文件失敗不影響其它文件;行號對不上則拒改並要求重新掃描。
補定義只追加到 llm-pi-ai.providers 末尾,冪等。換供應商支持批量與引用表逐行「換」(按 file + line 鎖定);插件生成的 headless-overlay.yml 可能被下一輪重寫,頁面會單獨提醒。改完 patch 需重啓 DSH 才生效(loader 不熱讀 cordis.patch.yml)。
安裝與啓用¶
插件目錄需放在 DSH 能解析到的位置,並在 profile 的 package.json 裏登記依賴與 bundle:
{
"dependencies": { "dsh-provider-hub": "^1.0.0" },
"dsh": { "profile": { "bundles": ["dsh-provider-hub"] } }
}
本地開發可用目錄聯接(Windows mklink /J、macOS ln -s)鏈到 profiles/<name>/node_modules/dsh-provider-hub,改完重啓 DSH。
重啓 DSH 後生效。
目錄頁:https://www.skillhub.cn/plugins/xuanbaon/dsh-provider-hub
源碼:https://github.com/xuanbaon/dsh-provider-hub
典型用法¶
設置頁流程¶
- 打開 設置 → 供應商中心。
- 使用「掃描對話」「掃描插件與配置」查看會話實際用法與引用狀態。
- 對「懸空·可補」項使用 一鍵同步:先看計劃,確認後再寫盤。
- 若要整體從供應商 A 遷到 B,用 換供應商;只需改一處引用時,用引用表每行右側的「換」。
命令行等價(DSH 未開時)¶
與設置頁補定義邏輯相同,僅預演或真寫:
node tests/sync.mjs # 只看計劃
node tests/sync.mjs --apply # 真寫(先備份)
在插件源碼目錄下也可使用 package 腳本:
npm run sync
npm run sync:apply
HTTP 接口(排查與自動化)¶
本機同源訪問,例如健康檢查:
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:5488/dsh-provider-hub/health
401 表示路由已掛且在鑑權,404 表示未掛上。補定義:POST /dsh-provider-hub/sync,body {apply:false} 預演、{apply:true} 寫盤。換供應商:POST /dsh-provider-hub/rewrite,字段見 README 路由表。
適用場景與注意¶
適合經常在 桌面 + headless(定時、值班、CLI) 混用 DSH、且 profile / 插件較多、provider 引用分散的開發者。插件以當前 dsh 進程權限讀寫配置與數據目錄,安裝前應自行查看源碼與 MIT 許可證,確認符合你的環境策略。
已知邊界包括:只掃一層 node_modules/*/cordis.patch.yml;overlay 歸屬 profile 爲推斷;老會話無 modelSelection 顯示「未記錄」;不做熱更新。若設置頁出現「接口沒有掛上(HTTP 404)」,可查看 ~/.dsh/provider-hub/logs/provider-hub.log;v1.0.0 若未聲明 export const inject = ['webServer'] 會導致全 404,需 1.0.1+。
社區目錄 skillhub.cn 爲獨立站點,與 DeepSeek / 幻方無官方從屬關係;DSH 生態理念是「一切皆插件」,本插件是其中面向模型推理配置的一類工具。
結尾¶
dsh-provider-hub 把 provider 的「會話在用誰、配置引用了誰、誰缺定義」集中到供應商中心,用掃描、補定義與換供應商三條線減少 NO_ADAPTER 類故障。需要進一步瞭解安裝與 API 細節時,可參考 SkillHub 目錄頁 與 GitHub 倉庫 README。