dsh-plugin-model-provider:给模型名补上所属平台

前言

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 依赖,适合本地开发:

  1. 将本目录放到工作区或任意位置。
  2. 在 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"]
    }
  }
}
  1. 在 profile 的 cordis.patch.yml 末尾追加:
# 本地插件:在「模型」行与输入框上方的模型按钮里,模型名后追加平台名。
- insert:
    - id: ui-model-provider-label
      name: 'dsh-plugin-model-provider'
  1. 将插件复制到 ~/.dsh/profiles/desktop/node_modules/dsh-plugin-model-provider/。
  2. 重启 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 / 幻方无官方从属关系。

羽毛球分组比赛记分
小程序二维码

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

小夜