前言¶
DSH 的对话界面里,模型选择器只显示模型名。同时接了多个平台(例如 DeepSeek 账号、Trae 企业版)时,DeepSeek-V4-Flash 这类同名模型很难一眼分辨来自哪个平台,调用错了也只能回溯会话记录。
下面介绍 Menpengpeng 维护的 dsh-plugin-model-provider。它在模型选择弹层的「模型」行和输入框上方的模型按钮里,把模型所属平台名追加在模型名后面。它是纯界面装饰:下拉候选列表保持原样,也不改变实际请求。
这是什么¶
一句话定位:一个 DSH 客户端插件,把「模型 → 平台」映射渲染到界面上,不参与模型路由。
- 仓库:https://github.com/Menpengpeng/dsh-plugin-model-provider
- 目录页:https://www.skillhub.cn/plugins/Menpengpeng/dsh-plugin-model-provider
- 维护者:Menpengpeng
- 分类:模型推理
- 许可证:MIT
核心功能¶
README 给出的生效范围有三处:
| 位置 | 效果 |
|---|---|
| 输入框上方的模型按钮 | DeepSeek-V4.1-Flash(DeepSeek 账号) |
| 弹层「模型」行 | DeepSeek-V4.1-Flash(DeepSeek 账号) |
| 下拉候选列表每一项 | 保持原样,不带平台名 |
平台名用次要文字色、略小字号显示,不影响模型名本身的主视觉。
README 还说明:0.0.2 起改为纯 DOM 装饰,不再复刻官方 1017 徽标逻辑,该徽标已在较新的 DSH 宿主中移除。
实现方式¶
README 描述的几个要点:
- 不注册任何插槽。原因:
dsh-codex-subscription等插件会抢占conversation.input.model这个 single 插槽却不声明conversation.input.model.label子插槽,导致基于slots.inject的注册根本不执行;且该子插槽是 single,多个连接器会互相竞争。 - 包装
Response.prototype.json/text,从宿主自身的/api/session/modelCatalog响应里学习「模型 → 平台」映射。宿主连接层会缓存fetch引用,所以包装fetch无效。 - 打开模型菜单时,从分组标题与候选项文本补充学习,作为兜底。
- 用 CSS
::after+data-mp-platform属性追加平台名,不改 React 子节点,因此不会被 re-render 清掉。 - 平台名自动去除尾部括号限定词以避免双层括号;匹配时兼容
Hy4 · x0.29这类倍率后缀。
代价:依赖 .codexModelSelect* 这组 DOM 类名,宿主大改版时需同步调整选择器。
安装与启用¶
README 给出两种方式。方式一是 file 依赖,适合本地开发:
- 将本目录放到工作区或任意位置。
- 在 profile 目录(通常
~/.dsh/profiles/desktop/)下编辑package.json:
{
"dependencies": {
"dsh-plugin-model-provider": "file:/path/to/dsh-plugin-model-provider"
},
"dsh": {
"profile": {
"bundles": ["dsh-plugin-model-provider"]
}
}
}
- 在 profile 的
cordis.patch.yml末尾追加:
# 本地插件:在「模型」行与输入框上方的模型按钮里,模型名后追加平台名。
- insert:
- id: ui-model-provider-label
name: 'dsh-plugin-model-provider'
- 将插件复制到
~/.dsh/profiles/desktop/node_modules/dsh-plugin-model-provider/。 - 重启 DeepSeek Harness。
方式二是 dsh plugin add:
dsh plugin add /path/to/dsh-plugin-model-provider
README 提示:某些 DSH 版本的 dsh plugin add 存在文件锁问题(报 EPERM on package.json.lock),此时请改用方式一手动安装。
典型效果¶
README 给出的截图示例:
弹层:
模型 DeepSeek-V4-Flash(Trae 企业版) ›
推理等级 high ›
输入框上方按钮:
[DeepSeek-V4-Flash(Trae 企业版) ▾]
下拉候选列表:
DeepSeek-V4-Flash ← 不带平台名
gpt-6-sol
kimi-k3
兼容性¶
- DeepSeek Harness >= 0.2.1-rc.3
- React ^18.2.0
- 仅 Web 平台(
dsh.client.platform: "web")
package.json 中 version 为 0.0.2,private: true。文件结构为 package.json(插件清单)、cordis.patch.yml(bundle patch 声明)、lib/index.js(服务端入口,空 apply)、lib/client.js(浏览器侧组件)。
README 还提到编码约束:所有文件使用无 BOM 的 UTF-8。DSH 的 resolveMeta() 使用 JSON.parse(readFileSync(path, "utf8")) 读取 package.json,不去 BOM,带 BOM 会报 SyntaxError: Unexpected token '\uFEFF'。这与官方所有插件保持一致。
回退¶
删除 node_modules/dsh-plugin-model-provider/,从 profile package.json 的 dependencies 和 dsh.profile.bundles 移除本插件,删掉 cordis.patch.yml 末尾的 insert 段,重启即可恢复。
适用场景与注意¶
适合:同时接了多个模型平台、希望当前模型所属平台在界面上直接可见的 DSH 用户;以及想参考「绕开插槽抢占、改用 DOM 装饰」这种实现路径的插件开发者。
注意:插件以当前 DSH 进程权限运行,安装前应自行检查源码与许可证(MIT)。它只影响界面显示,不改变模型路由;平台名的准确性取决于宿主 /api/session/modelCatalog 的返回内容。另外它依赖 .codexModelSelect* 类名,宿主结构大改版时需要跟进调整。
DSH 的理念是「一切皆插件」。上面提到的目录页是独立的社区站点,与 DeepSeek / 幻方无官方从属关系。