发现契约没有 reasoning 槽位
LlmDiscoveredModel = { id, name?, contextWindow?, maxTokens?, inputModalities? }
——即使供应商在 /v1/models 里报了能力,DSH 也搬不进来。
供应商在 /v1/models 里写着 supported_reasoning_levels,
而 DSH 的发现契约没有这一格——于是刚加进来的模型选不到思考强度。
这个插件读上游、写目录:dry-run 先看差异,点一下写回。
把新加的模型补齐思考强度,先别写,给我看看会改什么
工具默认就是 dry-run。读到 magpie 的 /v1/models,差异如下:
provider=magpie dryRun=true upstream=103 catalog=4
magpie / cc/gpt-6-luna: max -> low,medium,high,xhigh,max
skipped: none
magpie / never-advertised: not advertised by the provider (left untouched)
note: levels reported but not written: none (pass noneMapsToOff=true)
就这样,写回去
写回走的是 configEditor——和设置界面同一条路径:
不是供应商没报,也不是 DSH 没有概念——是发现契约里没有放它的地方。
LlmDiscoveredModel = { id, name?, contextWindow?, maxTokens?, inputModalities? }
——即使供应商在 /v1/models 里报了能力,DSH 也搬不进来。
LlmResolvedModelInfo.reasoning 来自适配器自报或目录声明(reasoningEfforts),
而网关通常不替每个模型写声明。
像 magpie 这样已经提供 supported_reasoning_levels 的网关,
新加的模型依旧没有任何档位可选——只能手写 YAML。
工具给 agent 用,按钮给人用;逻辑同一份(lib/sync.js)。
加完模型,滚到页尾点一下:读每个声明了 providers 的供应商,
把上游公布、目录里还缺的档位补齐,并把写了什么直接列在按钮下方。
默认 dryRun: true,只报告差异;要落地就显式 dryRun=false。
参数还有 provider / only / noneMapsToOff / replace。
provider限定某个供应商(默认全部声明的)dryRun默认 true,只报告不写only只同步指定模型 idnoneMapsToOff是否把上游的 none 映射成 off(默认不猜)replace用上游列表替换声明(默认加性合并)没有魔法,就是一次集合补齐:保留你已有的映射,加入上游公布的档位,DSH 不认识的值只报告。
| 模型 | 之前 | 之后 | 备注 |
|---|---|---|---|
group/smart-split |
(无声明) | low · high | 上游只报两档,就只补两档 |
cc/gpt-6-luna |
max (wire: ultra) | low · medium · high · xhigh · max | 已有拼写保留,缺的补上 |
cc/deepseek/…-flash |
(无声明) | off · low · medium · high · xhigh · max | 含 off:可显式关掉思考 |
never-advertised |
(无声明) | 原样不动 | 上游没广告的模型不猜 |
上游的 none |
— | 跳过并提示 | 是否映射成 off 由你决定 |
实测(本机 magpie):上游 103 个模型,目录里 4 个;供应商报的档位常是上游能力的
保守子集——所以默认只增不减,replace 要显式开启。
写配置这件事,宁可啰嗦一点。
max: ultra 这类的映射不会被覆盖。replace。credentials.resolve(apiKeyEnv) 取值,不落盘、不打印。models,并按字段把下层已有的密钥/地址补全,不会写空。
上游标 reasoning: false 的模型,插件不会替你写
reasoningEfforts: false(那会让选择器消失,属于行为变更)——只在报告里提示你手工决定。
本地插件,装进 profile;带 client 半步,需要重启一次 DSH。
pnpm pack
沙箱里 pnpm pack 会被拒的话,用仓库自带的 tools/pack.mjs(纯 Node 直出 npm 格式 tgz)。
设置 → 插件 → 安装 tarball
或让 agent 用 plugin_manager install_bundle 装那个 .tgz。
host 半是热加载的,client 半要重启才挂载——重启后设置 → 模型页尾就会出现按钮。 升级务必 bump 版本号:DSH 按 generation 路径缓存已加载的 ESM。
仓库自带离线自测:假 ctx + 假上游,走真实 HTTP 打自己那条路由,断言 dry-run 零写入、 写入结构与拼写、幂等、以及各种错误路径。云端 Actions 也跑同一份。
node rehearsal.mjs
MIT 开源 · 无遥测 · 读写都走 DSH 自己的正规路径