前言¶
在 DSH 里切换模型时,输入框右下角通常只显示「模型 · 推理强度」,看不出这条模型背后走的是官方 DeepSeek 路由、你自己建的 API 路由,还是某个连接器插件提供的一方模型。当多个插件各自注册供应商时,还可能出现同一条座位上重复画供应商的情况。下面介绍的插件解决的就是这两个问题:把当前模型的供应商补在「模型 · 推理强度」前面,并且对已经被其他插件接管的供应商自动让位。
这个插件是什么¶
dsh-provider-show 是 MosCloud 维护的 DSH 客户端插件,版本 0.1.1,许可证 MIT,零外部依赖。它在 DSH 输入框右下角的「模型 · 推理强度」前面补上当前模型所属的供应商。对于已被其他插件接管的供应商(例如 WorkBuddy),插件识别后不显示,整行与没装这个插件时保持一致。
核心功能¶
- 在「模型 · 推理强度」左侧补上供应商显示名,例如
DeepSeek Account。 - 供应商已被第三方插件接管时,插件不再画自己的芯片,避免重复。
- 新会话尚未做模型选择时,显示部署默认模型所属的供应商;发出第一条消息或切一次模型后,改由该会话自己的选择决定。
- 供应商显示名默认取目录里的
displayName,可通过shortNames缩短。 - 归属判定与文案选择是纯函数,Host 与 Client 共用一份实现。
安装与启用¶
在 DSH 客户端执行安装命令,<你的-profile> 替换为实际使用的 profile:
dsh plugin --profile <你的-profile> add dsh-provider-show
也可以在插件管理页的「添加插件」里填包名或 GitHub 仓库地址。安装后必须刷新页面,因为客户端模块是新增的,不刷新不会加载。
从源码开发时改用本地目录,改动即时生效:
dsh plugin --profile <你的-profile> add /path/to/dsh-provider-show
卸载通过插件管理页,或从 profile 的插件清单移除。README 提到 npm 12 会留下一个 0.0.0-stage 占位版本(339 字节),是其暂存发布机制的产物;latest 指向真正的发布版本,安装不受影响。
配置¶
配置写在 profile 的 cordis.patch.yml 的插件条目下。每项都有默认值,但一处配置会替换整个 config 对象,所以只写需要改的键:
- id: dsh-provider-show
name: dsh-provider-show
config:
enabled: true # 总开关,默认 true
shortNames: # 供应商短名,覆盖目录里的显示名
volcano-api: 火山
overrides: # 强制某个供应商的处置
some-connector-provider: third-party # 让位给接管它的插件
another-provider: mine # 即使探测说被接管也显示
noisy-provider: hide # 不显示,但不声称被别人接管
coreNamespaces: # 宿主自有的 settings 命名空间,宿主升级可扩展
- llm-pi-ai
- llm-deepseek
- llm-deepseek-account
归属判定规则¶
「是否已被第三方插件接管」由 Host 半读取 LLM 目录后判定,优先级自上而下:
| 顺序 | 规则 | 结果 |
|---|---|---|
| 1 | overrides[providerId] 显式配置 |
third-party 让位 / mine 显示 / hide 不显示 |
| 2 | settingsNs 不在 coreNamespaces 内 |
判定为已被插件接管,让位 |
| 3 | 目录里查不到,或目录不可读 | 判定为未知,照常显示(fail-open) |
settingsNs 是「注册该 provider 的 Loader entry id」:
llm-pi-ai:你在设置里自建的 API 路由,例如火山、OpenRouter 或任何 OpenAI 兼容服务。llm-deepseek/llm-deepseek-account:官方 DeepSeek 两条路由。- 其他任何值:某个插件用自己的 entry id 注册的,例如
dsh-connect-workbuddy。
第 3 条选 fail-open,是因为漏显只是信息不全,而误判会让所有供应商都不显示。默认通道若被第三方插件接管,仍然让位。
架构¶
| 文件 | 职责 |
|---|---|
lib/ownership.js |
归属判定与文案选择,纯函数、零 import,Host/Client 共用 |
lib/index.js |
Host 半:读 LLM 目录 → 决策 → 只读路由 GET /plugins/dsh-provider-show/providers |
lib/client.js |
Client 半:注册 conversation.input.right,读 Host 文档并渲染 |
分层原则是:浏览器看不到的运行时事实(settingsNs)在 Host 决策,客户端只消费结论,规则只有一份实现。设计取舍见 docs/design.md。
开发与验证¶
npm test # 单元 + 行为测试(纯 Node,不需要 DSH 运行时)
npm run check # 语法检查 + 静态校验 + 全部测试
scripts/verify.mjs 的每项检查都对应一条只在运行时才容易暴露的规则:manifest 完整性、图标合法性、locale 非占位文案、客户端不 import Harness Client 包、样式只用主题 token 且有宽度上界、路由是只读 GET 且由 scope.effect 持有、归属规则只有一份实现、排版度量与宿主一致且禁止位移补偿。零外部依赖,所以 CI 没有安装步骤,干净 checkout 直接跑同一套检查,运行环境为 Node 22 / 24。
适用场景与注意¶
适合需要在多供应商环境里快速识别当前模型来源的 DSH 使用者,也适合要参考「让位」机制做同类客户端插件的开发者。插件以当前 dsh 进程权限运行,安装前应先检查源码与许可证。
已知限制如下:
- 芯片会让模型名更早折叠为图标(
max-width: 140px,宿主按整行宽度判定折叠)。 conversation.input.activity展开整行时,宿主会隐藏整组standardControls,芯片随之隐藏。- 供应商显示名默认取目录里的
displayName,想更短就配shortNames。 - 判定依赖第三方插件用自有
settingsNs注册 provider;若某插件复用核心命名空间,请用overrides显式标注。 - 只读路由仅接受本页同源请求;它是
/plugins/下的 exact 路由,优先级高于客户端模块的/plugins前缀路由,两者不冲突。
小结¶
dsh-provider-show 用一份在 Host 做决策、Client 只消费的归属规则,在输入框补齐当前模型的供应商,同时对已被接管的供应商保持沉默,避免重复显示。它维护在 GitHub:https://github.com/MosCloud/dsh-provider-show ,社区目录页:https://www.skillhub.cn/plugins/MosCloud/dsh-provider-show 。