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
羽毛球分组比赛记分
小程序二维码

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

小夜