dsh-effort-sync:从供应商 /v1/models 同步推理等级到 DSH 模型目录

前言

在 DSH 里给网关或中转配好模型之后,模型选择器里有时仍看不到「思考强度」档位。常见原因不是密钥或 baseURL 配错,而是目录里的 reasoningEfforts 和供应商在 /v1/models 里声明的能力对不上:发现契约里没有推理相关字段,DSH 无法把上游档位自动搬进目录;而界面上的推理能力又主要依赖目录声明或适配器自报。像已在响应里提供 supported_reasoning_levels 的网关,加完模型后选择器仍可能为空档。

dsh-effort-sync(维护者 DC1024,GitHub:DC1024/dsh-effort-sync)读各供应商的 models 接口,把缺失的推理等级写回模型目录,走与设置界面相同的 configEditor 路径。社区目录 SkillHub 将其归类为「联网工具」;当前仓库星标为 0。下文按安装、界面与工具用法、安全边界说明可核对的事实。

这是什么

一句话:DSH 插件,把模型目录中的 reasoningEfforts 与供应商在 <baseURL>/models 上公布的能力对齐。

两个入口共用同一套逻辑:

  • 设置 → 模型 页尾部「同步推理等级」按钮:点击即写入(非 dry-run)。
  • 工具 sync_reasoning_levels:面向 agent,默认只报告差异、不写配置。

宣传页:https://dc1024.github.io/dsh-effort-sync/(源码在仓库 docs/)。目录页:https://www.skillhub.cn/plugins/DC1024/dsh-effort-sync。

为什么需要单独做同步

README 里归纳的契约缺口如下:

  • 发现模型类型 LlmDiscoveredModel 只有 id、name、contextWindow、maxTokens、inputModalities 等字段,没有推理档位槽位,因此 /v1/models 里的能力无法经发现流程进入目录。
  • 已解析模型的推理信息来自 LlmResolvedModelInfo.reasoning,依赖适配器或目录里的 reasoningEfforts。

插件补的是「读上游、写目录」这一段;不写凭据,不整块改写供应商配置。

界面按钮怎么用

按钮挂在官方扩展点 settings.models.footer(由 @deepseek-ai/dsh-client-ui-settings-models 声明),不替换自带 UI。流程是:

  1. 遍历配置里声明的每个 providers(含手写 patch 层);
  2. 用 credentials.resolve(apiKeyEnv) 取密钥,请求 <baseURL>/models;
  3. 对「上游与目录都有、但目录还缺档位」的模型,写回 reasoningEfforts;
  4. 在按钮下方列出写了哪些模型、从什么变到什么,以及被跳过的值。

某个供应商请求失败只会单独报错,不会阻塞其他供应商。客户端插件(dsh.client)侧需重启 DSH 后才会挂载;host 侧改动可热加载,配置写入即时生效。

工具 sync_reasoning_levels

先看会改什么(默认不写):

用 sync_reasoning_levels 看看会改什么         # dryRun 默认 true,只报告差异
用 sync_reasoning_levels 应用(dryRun=false)  # 真正写回配置

参数(与 README 一致):

参数 默认 说明
provider 全部 要同步的 provider key(如 magpie);不传则同步所有已声明供应商
dryRun true 只报告差异,不写(界面按钮相反:点击即写)
noneMapsToOff false 是否把上游 none 映射为 DSH 的 off(默认不猜)
only 全部 只同步指定模型 id
replace false 用上游列表替换目录声明(默认加性合并;替换有掉档风险)

安全设计与已知边界

设计要点(摘自 README):

  1. 工具默认 dryRun=true;界面为显式点击,写完展示差异。
  2. 只写入 DSH 词表:off / minimal / low / medium / high / xhigh / max;未知值只报告。
  3. 保留已有 wire 拼写(如 max: ultra),与设置界面规则一致。
  4. 上游未广告的模型跳过并在报告中说明。
  5. 默认加性合并(只增不减);replace 需显式开启。
  6. 凭据仅经 credentials.resolve 使用,不落盘、不打印。
  7. 只更新 models 项,从有效配置重建,避免把下层 apiKeyEnv/baseURL 写成空或丢模型。

两个边界:

  • 上游标 reasoning: false 时,插件不会自动写 reasoningEfforts: false(会改变选择器行为),只在报告中提示手工处理。
  • none 档是否映射为 off 由 noneMapsToOff 控制,默认不猜。

安装与启用

安装步骤以仓库 README 为准,不是 dsh plugin add github:... 一类命令:

pnpm pack        # 产出 dsh-effort-sync-<version>.tgz

然后在 DSH 中:设置 → 插件 → 安装该 tarball(或 plugin_manager install_bundle <tarball>),重启 DSH。package.json 当前版本为 0.2.0;升级需 bump 版本号,因 DSH 按 generation 路径缓存已加载的 ESM。许可证:MIT。

插件以当前 DSH 进程权限运行,会访问已配置供应商的 models 接口并修改本地模型目录配置;安装前请自行审阅源码与许可证。

适用场景

  • 已在中转或 OpenAI 兼容网关添加模型,但选择器没有思考强度选项,且供应商在 /v1/models 中公布了推理档位。
  • 希望 agent 在改配置前先 dryRun 预览差异,再 dryRun=false 应用。
  • 多供应商并存,需要逐个拉取并只补缺档、尽量不覆盖手写映射的场景。

不适合指望插件自动处理「上游明确不支持推理」的模型,或需要默认把 none 当成 off 且不愿显式开 noneMapsToOff 的场景。

结尾

dsh-effort-sync 解决的是目录 reasoningEfforts 与供应商 models 接口声明不一致的问题,提供设置页一键同步与 sync_reasoning_levels 工具两条路径,默认偏保守(加性合并、工具默认 dry-run)。DeepSeek Harness 生态强调「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。

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

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

Xiaoye