DEEPSEEK HARNESS · PLUGIN · v0.2.0

网关报了六档强度, 模型选择器里却是空的

供应商在 /v1/models 里写着 supported_reasoning_levels, 而 DSH 的发现契约没有这一格——于是刚加进来的模型选不到思考强度。 这个插件读上游、写目录:dry-run 先看差异,点一下写回。

dsh — sync_reasoning_levels
YOU

把新加的模型补齐思考强度,先别写,给我看看会改什么

DSH

工具默认就是 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)
YOU

就这样,写回去

DSH

写回走的是 configEditor——和设置界面同一条路径:

◈applied: catalog updatedWROTE 2 ↑ 只动 reasoningEfforts,不动密钥/地址/其它模型
7 LEVELS
只写 DSH 认识的档
1 CLICK
设置页一次点击
0 SURPRISE
默认加性合并
// WHY THIS EXISTS

缺口只有一环,但正好卡在最后一格

不是供应商没报,也不是 DSH 没有概念——是发现契约里没有放它的地方。

01

发现契约没有 reasoning 槽位

LlmDiscoveredModel = { id, name?, contextWindow?, maxTokens?, inputModalities? } ——即使供应商在 /v1/models 里报了能力,DSH 也搬不进来。

02

能力只有一条入口

LlmResolvedModelInfo.reasoning 来自适配器自报或目录声明(reasoningEfforts), 而网关通常不替每个模型写声明。

03

于是选择器空着

像 magpie 这样已经提供 supported_reasoning_levels 的网关, 新加的模型依旧没有任何档位可选——只能手写 YAML。

供应商 /v1/models supported_reasoning_levels dsh-effort-sync 读→差→写 模型目录 reasoningEfforts 模型选择器 出现强度档位
// TWO SURFACES

同一个内核,两个入口

工具给 agent 用,按钮给人用;逻辑同一份(lib/sync.js)。

GUI 设置 → 模型 · 页尾

「同步推理等级」按钮

加完模型,滚到页尾点一下:读每个声明了 providers 的供应商, 把上游公布、目录里还缺的档位补齐,并把写了什么直接列在按钮下方。

TOOL sync_reasoning_levels

给 agent 的干跑工具

默认 dryRun: true,只报告差异;要落地就显式 dryRun=false。 参数还有 provider / only / noneMapsToOff / replace。

provider限定某个供应商(默认全部声明的)
dryRun默认 true,只报告不写
only只同步指定模型 id
noneMapsToOff是否把上游的 none 映射成 off(默认不猜)
replace用上游列表替换声明(默认加性合并)
// EVIDENCE

差别长这样

没有魔法,就是一次集合补齐:保留你已有的映射,加入上游公布的档位,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 要显式开启。

// DESIGNED TO NOT SURPRISE YOU

安全设计

写配置这件事,宁可啰嗦一点。

  • 默认不写:工具 dry-run 先行;按钮是显式点击,写完把差异回报给你。
  • 只写 DSH 认识的档:词表固定 off / minimal / low / medium / high / xhigh / max。
  • 保留既有 wire 拼写:max: ultra 这类的映射不会被覆盖。
  • 加性优先:只增不减,掉档位这种不可逆动作必须显式 replace。
  • 不动上游没广告的模型:查不到就原样跳过,并在报告里说明。
  • 不碰凭据:只经 credentials.resolve(apiKeyEnv) 取值,不落盘、不打印。
  • 不整块改写供应商:只写 models,并按字段把下层已有的密钥/地址补全,不会写空。
  • 单点故障不扩散:某个供应商读不通,只单独报告,不阻断其它写入。
已知边界

上游标 reasoning: false 的模型,插件不会替你写 reasoningEfforts: false(那会让选择器消失,属于行为变更)——只在报告里提示你手工决定。

// INSTALL

三步装上

本地插件,装进 profile;带 client 半步,需要重启一次 DSH。

  1. 01

    打包

    pnpm pack

    沙箱里 pnpm pack 会被拒的话,用仓库自带的 tools/pack.mjs(纯 Node 直出 npm 格式 tgz)。

  2. 02

    装进 DSH

    设置 → 插件 → 安装 tarball

    或让 agent 用 plugin_manager install_bundle 装那个 .tgz。

  3. 03

    重启 DSH

    host 半是热加载的,client 半要重启才挂载——重启后设置 → 模型页尾就会出现按钮。 升级务必 bump 版本号:DSH 按 generation 路径缓存已加载的 ESM。

CI rehearsal completed / success

仓库自带离线自测:假 ctx + 假上游,走真实 HTTP 打自己那条路由,断言 dry-run 零写入、 写入结构与拼写、幂等、以及各种错误路径。云端 Actions 也跑同一份。

node rehearsal.mjs

给下一个模型,省掉手写 YAML

MIT 开源 · 无遥测 · 读写都走 DSH 自己的正规路径