前言¶
在 DSH 裏切換模型時,輸入框右下角通常只顯示「模型 · 推理強度」,看不出這條模型背後走的是官方 DeepSeek 路由、你自己建的 API 路由,還是某個連接器插件提供的一方模型。當多個插件各自注冊供應商時,還可能出現同一條座位上重複畫供應商的情況。下面介紹的插件解決的就是這兩個問題:把當前模型的供應商補在「模型 · 推理強度」前面,並且對已經被其他插件接管的供應商自動讓位。
這個插件是什麼¶
dsh-provider-show 是 MosCloud 維護的 DSH 客戶端插件,版本 0.1.1,許可證 MIT,零外部依賴。它在 DSH 輸入框右下角的「模型 · 推理強度」前面補上當前模型所屬的供應商。對於已被其他插件接管的供應商(例如 WorkBuddy),插件識別後不顯示,整行與沒裝這個插件時保持一致。
核心功能¶
- 在「模型 · 推理強度」左側補上供應商顯示名,例如
DeepSeek Account。 - 供應商已被第三方插件接管時,插件不再畫自己的芯片,避免重複。
- 新會話尚未做模型選擇時,顯示部署默認模型所屬的供應商;發出第一條消息或切一次模型後,改由該會話自己的選擇決定。
- 供應商顯示名默認取目錄裏的
displayName,可通過shortNames縮短。 - 歸屬判定與文案選擇是純函數,Host 與 Client 共用一份實現。
安裝與啓用¶
在 DSH 客戶端執行安裝命令,<你的-profile> 替換爲實際使用的 profile:
dsh plugin --profile <你的-profile> add dsh-provider-show
也可以在插件管理頁的「添加插件」裏填包名或 GitHub 倉庫地址。安裝後必須刷新頁面,因爲客戶端模塊是新增的,不刷新不會加載。
從源碼開發時改用本地目錄,改動即時生效:
dsh plugin --profile <你的-profile> add /path/to/dsh-provider-show
卸載通過插件管理頁,或從 profile 的插件清單移除。README 提到 npm 12 會留下一個 0.0.0-stage 佔位版本(339 字節),是其暫存發佈機制的產物;latest 指向真正的發佈版本,安裝不受影響。
配置¶
配置寫在 profile 的 cordis.patch.yml 的插件條目下。每項都有默認值,但一處配置會替換整個 config 對象,所以只寫需要改的鍵:
- id: dsh-provider-show
name: dsh-provider-show
config:
enabled: true # 總開關,默認 true
shortNames: # 供應商短名,覆蓋目錄裏的顯示名
volcano-api: 火山
overrides: # 強制某個供應商的處置
some-connector-provider: third-party # 讓位給接管它的插件
another-provider: mine # 即使探測說被接管也顯示
noisy-provider: hide # 不顯示,但不聲稱被別人接管
coreNamespaces: # 宿主自有的 settings 命名空間,宿主升級可擴展
- llm-pi-ai
- llm-deepseek
- llm-deepseek-account
歸屬判定規則¶
「是否已被第三方插件接管」由 Host 半讀取 LLM 目錄後判定,優先級自上而下:
| 順序 | 規則 | 結果 |
|---|---|---|
| 1 | overrides[providerId] 顯式配置 |
third-party 讓位 / mine 顯示 / hide 不顯示 |
| 2 | settingsNs 不在 coreNamespaces 內 |
判定爲已被插件接管,讓位 |
| 3 | 目錄裏查不到,或目錄不可讀 | 判定爲未知,照常顯示(fail-open) |
settingsNs 是「註冊該 provider 的 Loader entry id」:
llm-pi-ai:你在設置裏自建的 API 路由,例如火山、OpenRouter 或任何 OpenAI 兼容服務。llm-deepseek/llm-deepseek-account:官方 DeepSeek 兩條路由。- 其他任何值:某個插件用自己的 entry id 註冊的,例如
dsh-connect-workbuddy。
第 3 條選 fail-open,是因爲漏顯只是信息不全,而誤判會讓所有供應商都不顯示。默認通道若被第三方插件接管,仍然讓位。
架構¶
| 文件 | 職責 |
|---|---|
lib/ownership.js |
歸屬判定與文案選擇,純函數、零 import,Host/Client 共用 |
lib/index.js |
Host 半:讀 LLM 目錄 → 決策 → 只讀路由 GET /plugins/dsh-provider-show/providers |
lib/client.js |
Client 半:註冊 conversation.input.right,讀 Host 文檔並渲染 |
分層原則是:瀏覽器看不到的運行時事實(settingsNs)在 Host 決策,客戶端只消費結論,規則只有一份實現。設計取捨見 docs/design.md。
開發與驗證¶
npm test # 單元 + 行爲測試(純 Node,不需要 DSH 運行時)
npm run check # 語法檢查 + 靜態校驗 + 全部測試
scripts/verify.mjs 的每項檢查都對應一條只在運行時才容易暴露的規則:manifest 完整性、圖標合法性、locale 非佔位文案、客戶端不 import Harness Client 包、樣式只用主題 token 且有寬度上界、路由是隻讀 GET 且由 scope.effect 持有、歸屬規則只有一份實現、排版度量與宿主一致且禁止位移補償。零外部依賴,所以 CI 沒有安裝步驟,乾淨 checkout 直接跑同一套檢查,運行環境爲 Node 22 / 24。
適用場景與注意¶
適合需要在多供應商環境裏快速識別當前模型來源的 DSH 使用者,也適合要參考「讓位」機制做同類客戶端插件的開發者。插件以當前 dsh 進程權限運行,安裝前應先檢查源碼與許可證。
已知限制如下:
- 芯片會讓模型名更早摺疊爲圖標(
max-width: 140px,宿主按整行寬度判定摺疊)。 conversation.input.activity展開整行時,宿主會隱藏整組standardControls,芯片隨之隱藏。- 供應商顯示名默認取目錄裏的
displayName,想更短就配shortNames。 - 判定依賴第三方插件用自有
settingsNs註冊 provider;若某插件複用核心命名空間,請用overrides顯式標註。 - 只讀路由僅接受本頁同源請求;它是
/plugins/下的 exact 路由,優先級高於客戶端模塊的/plugins前綴路由,兩者不衝突。
小結¶
dsh-provider-show 用一份在 Host 做決策、Client 只消費的歸屬規則,在輸入框補齊當前模型的供應商,同時對已被接管的供應商保持沉默,避免重複顯示。它維護在 GitHub:https://github.com/MosCloud/dsh-provider-show ,社區目錄頁:https://www.skillhub.cn/plugins/MosCloud/dsh-provider-show 。