dsh-model-select-plus
对 DeepSeek Harness 网页端 模型选择弹窗(composer 左下角 conversation.input.model 座位)的信息增强式重写,打包为一个可安装、可发布到 npm 的 dsh 插件。
特性
- 单栏列表:模型按 provider 分组全部展开,行高 34px(与 DSH 原生菜单一致),卡片 360×440;没有折叠、没有 Tag 条、没有底部状态条。
- 思考等级外置:composer 里模型芯片右侧是独立的等级芯片,点开即选,立即生效;切换等级完全不用打开、也不用在列表里找当前模型。没有推理等级的模型不显示这个芯片。
- 当前行展开:只有当前模型向下展开 2 行描述,其余行保持 34px 基线;打开菜单时自动把当前模型滚到列表中间。
- 搜索:34px 单行搜索,按模型名 / 描述 / provider 过滤,带清除按钮;打开即自动聚焦。
- 收藏置顶:行尾星标(悬停出现)收藏,收藏项移动到顶部独立分组,并在行尾标出 provider;取消后回到原分组。收藏存于浏览器内存,刷新即重置。
- 分组标题:11px 吸顶,只在真正吸到顶部时铺底色,静态时是纯文字;不显示数量,也不可折叠。
- 选中态:6% 填充 + 行尾对勾 + 500 字重,不再用 10% 灰块(那读起来像禁用)。
- 触发按钮:模型芯片显示
供应商/模型,供应商 11px 次级色,超宽时先省略供应商、保住模型名;等级在旁边的独立芯片里。
- 键盘:模型列表里
↑ / ↓ 移动、Enter 选择、Esc 关闭;等级菜单同样支持 ↑ / ↓ 与 Esc。
打开时按触发按钮在视口内的剩余空间决定向上/向下弹,收敛高度并把左右夹在视口内;浅色与深色都走主题令牌(深色下分段控件的滑块改用 active 填充),所有图标为手绘 SVG,不用文字字符充当图标。
安装
把本包加进 dsh profile 的依赖即可(配合 dsh.bundle.patch 自动挂载 host / client 双侧):
# 在 dsh profile 目录里
pnpm add dsh-model-select-plus
# 或
npm i dsh-model-select-plus
重启 dsh web 后,composer 的模型选择框即被替换。
- Host 侧(exports
.)通过 cordis.patch.yml 挂载,向宿主 webserver 注册
GET /plugins/dsh-model-select-plus/api/catalog 与 POST /plugins/dsh-model-select-plus/api/select。
- Client 侧(exports
./client)由 dsh.client 注入加载,替换 conversation.input.model 占位(priority: -1)。
两个 API 都调用宿主的 ctx.sessionController——这是 0.1.2 里取代已删除 apiProxy.sessions 的 Remote 服务,modelCatalog() 列出当前可路由的模型目录,selectModel() 经 llm.resolveCallConfig 校验后设置会话 Agent 的实时选择引用并保存默认模型。
数据路径
浏览器 (client bundle)
└─ fetch /plugins/dsh-model-select-plus/api/{catalog,select}
└─ host plugin (ctx.webServer) → ctx.sessionController.{modelCatalog,selectModel}
(持久化插件避免动态插件的 harness/host 内建,采用与 plugin-dashboard 相同的 webserver+fetch 模式。)
开发
pnpm install # workspace 安装
pnpm run build # esbuild 打包 src/client.js → lib/client.cjs,并拷贝 host 到 lib/
pnpm run smoke # 校验 lib/ 产物
lib/ 为构建产物、已被 .gitignore 忽略;npm publish 会在 prepublishOnly 阶段自动构建。
发布到 npmjs
# 首次:登录
npm login
# 在包目录
npm publish
publishConfig 已设为 access: public + registry: https://registry.npmjs.org/。
License
MIT