前言¶
在 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。流程是:
- 遍历配置里声明的每个
providers(含手写 patch 层); - 用
credentials.resolve(apiKeyEnv)取密钥,请求<baseURL>/models; - 对「上游与目录都有、但目录还缺档位」的模型,写回
reasoningEfforts; - 在按钮下方列出写了哪些模型、从什么变到什么,以及被跳过的值。
某个供应商请求失败只会单独报错,不会阻塞其他供应商。客户端插件(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):
- 工具默认
dryRun=true;界面为显式点击,写完展示差异。 - 只写入 DSH 词表:
off / minimal / low / medium / high / xhigh / max;未知值只报告。 - 保留已有 wire 拼写(如
max: ultra),与设置界面规则一致。 - 上游未广告的模型跳过并在报告中说明。
- 默认加性合并(只增不减);
replace需显式开启。 - 凭据仅经
credentials.resolve使用,不落盘、不打印。 - 只更新
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 / 幻方无官方从属关系。