dsh-provider-show:在输入框补齐当前模型的供应商

前言

在 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 。

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

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

小夜