dsh-model-tidy
一个让 DeepSeek Harness 的模型选择器保持整洁的插件——决定哪些模型出现、给它们起你认得的名字、按你觉得顺手的顺序排列,并保住厂商标注的计费倍率。附带可选的可用性检测,随时确认某个模型现在还通不通。

它解决的问题
装两三个 provider 插件,模型菜单就变成一堵墙。一条免费车道、一个工作台 App、两个自己配的网关,转眼三十来项——大多数你根本不会选,还有几个是同一模型走了不同渠道的近似重复项。
模型选择器是做决定的地方,不是仓库。它应该只摆你真正在用的那几个,用你认得的名字,按你定义好的顺序。
它做什么
安装后,DSH 设置里会出现「模型整理」分区。模型按来源渠道分组,每个渠道一张卡片,每一项各带一个开关:
┌─ WorkBuddy ───────── 8/12 ─ [恢复默认排序] [隐藏全部] [显示全部] ─┐
│ ▲▼ Auto ●─── │
│ ▲▼ GLM-5.3 · x0.79 ●─── │
│ ▲▼ GLM-5.2 · x0.79 · 夜间折扣 ● [改备注] ───● │
│ ▲▼ Grok-4.7 · x1.90 ───● │
└────────────────────────────────────────────────────────────────┘
┌─ our-free-model ─── 6/6 ── [恢复默认排序] [隐藏全部] [显示全部] ─┐
│ ▲▼ Kilo Auto Free ●─── │
└────────────────────────────────────────────────────────────────┘
- 每个模型一个开关:关掉即从模型选择器消失,打开即回来。
- 上/下箭头:渠道卡片与其内部模型都能用箭头调整先后顺序(图标
▲▼)。 - 备注名:给模型起个你认得的名字,选择器就以它显示;厂商的计费后缀会原样留在末尾。
- 搜索:按模型名、渠道或备注名过滤。
- 渠道级批量:一键隐藏或显示某个渠道的全部模型。
- 全局显示 / 隐藏:两个按钮作用于整个目录。
- 可用性检测:逐个确认当前显示的模型现在还通不通,每行一个状态点。
- 恢复:一个按钮清空全部备注,另一个让全部模型回来。
自定义排序(模型)
每个模型左侧有一对箭头,用来调整它在所属渠道内的先后顺序。排序是显式保存的:调完重启 DSH、换一台机器同步配置,顺序都还在。
- 只影响排列,不影响可见性:排过序的模型被隐藏后,它的位置记在保存的顺序里;重新显示时回到原来的位置。
- 新模型排在你排过的那些之后:渠道以后上架新模型,不会插进你精心安排的那一段中间。
- 搜索时可以继续排序:筛选状态下点箭头,交换的是当前可见的相邻两项,所以点一下就能看到变化;被筛掉的模型保持它自己的相对位置。
- 一键回退:渠道头的「恢复默认排序」清掉该渠道的自定义顺序,回到目录原本的排列。
自定义排序(渠道)
每个渠道卡片头部也有一对箭头,可以把常用的渠道调到最上面。渠道顺序独立存储(providerOrder),与会话无关,重启后仍然生效。
- 只重排你动过的:你从未移动过的渠道、以及之后新注册的渠道,都保持它们原有的位置、排在最后。
- 与内部排序互不干扰:移动渠道不影响每个渠道内部的模型顺序。
- 一键回退:控制区顶部的「恢复渠道默认顺序」回到 harness 自带的渠道排列。
可用性检测
模型选择器只会告诉你「有这些模型」,不会告诉你它们现在通不通。装了几个 provider 之后,一个已经停用的模型或一条失效的网关路由并不会自动消失。
点「检测可用性」,会弹出一个确认框——因为这会消耗少量 token——说明将对当前显示的模型逐个发一次极小的请求(只要求回一个字)。之后每一行出现一个状态点:
- 绿 = 可用
- 红 = 不可用(悬停或点击可见延迟与失败原因)
- 黄 = 正在检测
- 灰 = 未检测
检测在宿主侧进行(模型调用只存在于宿主),前端把模型分批交给一条 loopback 专用路由,后端以受限并发池(宽度 4、单模型 8 秒超时)逐个探测,结果按原顺序返回到对应行。可以随时停止;已隐藏的模型不会被检测,结果只存在内存里——可用性是「当下这一刻」的事实,不会存成下次的陈旧结论。
改备注不会弄丢倍率
厂商把计费倍率拼在模型的显示名里——GLM-5.3 · x0.79——因为 harness 的模型目录没有倍率字段。直接替换这个名字(大多数改名的做法)会把倍率一并丢掉。
本插件按厂商自己的分隔符切开名字,并保留后半段:
| 选择器里显示的名字 | |
|---|---|
| 厂商原名 | GLM-5.3 · x0.79 |
| 改备注为「GLM 便宜」 | GLM 便宜 · x0.79 |
| 带促销标签时改备注 | GLM 便宜 · x0.79 · 夜间折扣 |
| 本身没有倍率的模型 | 自动 ← 不会多出分隔符 |
隐藏一个模型不会让它跑位
被隐藏的模型不在目录里(harness 会把它过滤掉),所以它的行只能靠保存下来的信息重建。顺理成章地把行追加到末尾,会让它一被隐藏就跳到分组底部。本插件记住每一行首次出现的位置,所以隐藏五个里的第三个,它仍然排在第三。
它刻意不做的事
整理是显示层的决定,绝不是配置改动。
- 不重写你的渠道配置。隐藏列表、备注表与排序记录都只存在本插件自己的设置命名空间里。
- 正在使用某模型的会话不受影响——路由按模型 id 走,改的只是显示名。
- 卸载插件后列表完全恢复原样。
- 渠道新上架的模型默认可见。本插件记录的是「要隐藏什么、要改什么名、要排什么序」,从不是「要显示什么」。
覆盖范围
开关作用于所有模型来源,不限于手工配置的渠道。插件过滤的是 harness 自己的目录枚举——ctx.llm.listModels 与 ctx.llm.listProviders,也就是每个界面都会读的那一份列表。其他插件通过 ctx.llm.registerAdapter 注册的模型、以及 llm-pi-ai 下声明的渠道,都落在这一份列表里,因此都被覆盖。
行按 渠道 + 模型 作键,所以同一模型名经两条路由进来仍是两行独立控制:workbuddy/gemini-3.8-flash 与 gemini/gemini-3.8-flash 是不同的上游服务,各有各的开关和备注。
安装
dsh plugin --profile <你的 profile> add dsh-model-tidy
然后重新打开 DSH Web GUI,设置导航里会出现「模型整理」。
可用性检测需要宿主开启 Web 服务;不支持的环境照常能用整理功能,只是不会有检测按钮。
开发
无需构建:两半都以 harness 直接加载的原始文件形式发布。宿主半是 ES 模块;浏览器半是 window.__ModuleLoader__.load 工厂——客户端模块系统调用的格式。
npm test
一次跑完十三套测试:目录过滤器、倍率后缀切分、浏览器半行为、备注后缀抓取、行序保持、模型自定义排序、渠道自定义排序、排序与渲染、可用性检测、检测提速、检测渲染、渲染结构,以及与另一个包装同一个方法的插件共存。
npm run check:packaging 校验客户端依赖声明指向的包在 harness 中真实存在。
兼容性
针对 DSH 0.2.0-rc.2 开发。要求 DSH >= 0.2.0-rc.1——该版本起设置层才提供本插件分区写入所用的 configForms 服务。
许可证
MIT
No comments yet. Be the first to write one.