dsh-model-fold:DSH 的 ZCode 式模型選擇器

前言

在 DeepSeek Harness(DSH)裏寫 composer 時,右下角模型選擇器是高頻入口:換 provider、換模型、調推理等級,往往在一兩次點擊裏完成。內置選擇器的交互與 ZCode composer 不一致時, muscle memory 會打架——菜單展開方向、子菜單相對主菜單的位置、鍵盤在面板間怎麼收放,都和你在 ZCode 裏習慣的不一樣。

dsh-model-fold 是社區客戶端插件,由 KKYZD 維護,分類爲「客戶端」。它不改 DSH 源碼,通過 conversation.input.model 槽位接管 composer 的模型位,把交互對齊 ZCode:提供方菜單向上展開、模型子菜單開在側面、支持推理等級選擇與完整鍵盤導航。目錄頁見 SkillHub,源碼與說明見 GitHub。

這是什麼

一句話:dsh-model-fold 用 ZCode composer 選擇器的交互模式,替換 DSH composer 右下角的模型選擇器。

實現上它是獨立客戶端插件,註冊在 DSH 插件體系的 single 槽位 conversation.input.model 上。內置模型選擇器默認優先級爲 0,本插件使用 priority: -1 完成遮蔽——這是註冊表自身的選舉機制,不是對 DSH 的 monkey-patch。選擇仍走同一個 ModelDirectory 實例的 directory.select(...),因此在 composer 裏切換模型,/model 彈窗會同步;反之亦然。

核心功能

下面介紹 README 中已覈實的行爲,均可在安裝後於 composer 右下角觸發器上體驗。

觸發器與標籤

觸發器顯示當前模型與當前推理等級,格式爲 模型名 · 等級名(等級在 caption 弱化色);帶 14px 小 chevron(↓)。字號、行高與 ZCode 對齊(--ui-font-size: 14px、32px 行高)。

提供方菜單與子面板

點擊或鍵盤打開後,提供方菜單向上展開,右對齊錨在觸發器上方,並考慮右緣與底緣碰撞。每個有模型的提供方一行,行尾有向右 chevron(›);當前模型所屬的提供方帶 ✓,不展開也能看到「我在哪」。

懸停、點擊或按 → 可打開模型子面板:優先開在菜單右側,右側空間不足時翻到左側;垂直方向按 ZCode/Radix 規則——子面板第一行與所懸停的提供方行對齊,底部溢出時整體上移,過高則釘在頂部並內部滾動。長目錄在面板內滾動。

選擇模型後菜單關閉,觸發器標籤立即更新。

推理等級

菜單底部(分隔線之下)有「推理等級」行,顯示當前等級;懸停、點擊或 → 打開等級子面板。等級來自當前模型的 reasoning.efforts(如 Off/Low/High/Max 等);無默認等級的模型多一項「Default」。當前等級帶 ✓。選擇新等級等於以當前 provider/model 加新 reasoningEffort 重新提交,語義與內置座位一致;選當前等級則僅關閉。模型不帶 reasoning 元數據時該行不出現。

鍵盤導航

  • ↑ / ↓:在當前面板(提供方菜單或子面板)內移動焦點
  • →:打開聚焦行(提供方或推理等級)的子面板並聚焦第一行
  • ← / Esc:收回子面板回到所在行
  • Esc(菜單級):關閉整個選擇器並把焦點還給觸發器

錯誤與空態

目錄加載失敗時,菜單內顯示錯誤與重試按鈕;目錄爲空時顯示空態。

已知邊界

  • 隻影響 composer 的模型位。/model 命令彈窗走 commandUi 的 popupSelect,是另一套渲染,本插件不改它。
  • ZCode 的視覺徽標(如 vision 標籤)未照搬——DSH 目錄數據裏沒有對應字段。
  • 若內置選擇器未來改用不同優先級註冊,遮蔽可能失效(界面退回內置樣式,一般不會報錯)。

安裝與啓用

DSH 版本要求 >= 0.2.0-rc.1(README 註明在 0.2.0-rc.2 上測試)。package.json 中 engines.node 爲 >=20。許可證爲 MIT(npm 包版本 1.0.0)。

發佈到 npm 後,或在 DSH 插件面板裏直接填包名,執行:

dsh plugin --profile desktop add dsh-model-fold

本地開發時,在本插件目錄下執行(將路徑換成你的絕對路徑):

dsh plugin --profile desktop add "link:<本目錄絕對路徑>"

安裝後 package.json 的 dsh.profile.bundles 會新增一行 dsh-model-fold。宿主插件行在 DSH 重啓後生效;改 lib/client.js 後同樣需要重啓 DSH(遷移到 ~/.dsh/plugins/ 後,宿主 HMR 通常不再捕獲此處變更,重啓是可靠路徑)。

卸載:

dsh plugin --profile desktop remove dsh-model-fold

移除後 single 槽位選舉自動回落到內置模型選擇器,無需其他清理;插件不修改 DSH 安裝目錄或 asar。

典型用法

安裝並重啓 DSH 後,在 composer 輸入區右下角找到模型觸發器(顯示 模型 · 推理等級)。

  1. 鼠標:點擊觸發器 → 在上方的提供方列表中選 provider → 在右側(或左側)子面板中選模型;需要改推理等級時,在提供方菜單底部的「推理等級」行打開子面板並選擇。
  2. 鍵盤:聚焦觸發器後打開菜單 → 用 ↑/↓ 選提供方 → → 進入模型列表 → Enter 確認模型;改等級時聚焦「推理等級」行再 → 進入等級面板。
  3. 與 /model 配合:在 composer 用本插件換模型後,可通過 /model 彈窗覈對是否已同步;在彈窗中的變更也會反映到 composer 觸發器標籤。

維護者在 README 中提供了本地自檢命令(開發插件時可參考,普通用戶不必運行):

node tools/verify.cjs
node tools/validate.cjs <本目錄>
node tools/discover.cjs <profile cordis.yml> dsh-model-fold
node tools/smoke.cjs <本目錄>
node tools/election.cjs

對帶 --remote-debugging-port=9222 啓動的 DSH 做端到端驗證時:

node tools/cdp-probe.cjs --reload --capture errors.json
node tools/cdp-probe.cjs --eval tools/e2e-picker.js

適用場景與注意

適合誰:日常在 DSH desktop composer 裏切換模型,且更習慣 ZCode 式「向上主菜單 + 側面子菜單 + 鍵盤閉環」的開發者;需要頻繁調整 reasoningEffort 且希望與內置提交語義一致的用戶。

生態說明:DSH 社區插件目錄(如 SkillHub)是獨立站點,與 DeepSeek / 幻方無官方從屬關係;安裝包來自維護者發佈的 npm 或你指定的本地 link,不是「官方應用商店」一鍵 curated 列表。

安全與權限:客戶端插件在當前 DSH 進程權限下運行,可參與 UI 注入與槽位選舉。安裝前應閱讀 GitHub 倉庫 源碼與 MIT 許可證,確認來源與行爲符合你的環境策略。README 未提供獨立配置項文件;行爲由槽位註冊與共享 ModelDirectory 決定。

結尾

dsh-model-fold 把 composer 模型位換成 ZCode 式交互:向上展開的提供方菜單、側面模型子面板、推理等級行與完整鍵盤導航,且不碰 DSH 源碼、卸載即可回退內置選擇器。若你主要在 composer 右下角完成選模,而不是依賴 /model 彈窗的 UI,這個插件值得試裝。

  • 目錄頁:https://www.skillhub.cn/plugins/KKYZD/dsh-model-fold
  • GitHub:https://github.com/KKYZD/dsh-model-fold
羽毛球分组比赛记分
小程序二维码

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

小夜