dsh-reasoning-adapter:给自定义路由的模型补上推理档位

前言

DSH 的理念是「一切皆插件」,模型也是这样。官方目录里的路由自带推理元数据,打开模型选择器就能看到档位行;但如果你把模型加在中转站、自建网关或算力平台上,配置里通常只有 api、baseURL 和一串模型 id,DSH 不知道这些模型支持哪些推理档位、该往请求里发什么字段,于是档位行不显示。

手动去「模型设置」里打开推理开关,拿到的是通用的 off / low / medium / high。换成 GLM、Kimi、Claude 这类模型,要么档位缺,要么请求字段和服务端不一致,直接被拒。

下面介绍的 dsh-reasoning-adapter 就是补这一层的插件。它由 Hatiaa维护,分类是「模型推理」,当前版本 0.1.0,缺少 DSH 客户端的本地依赖,无需构建。装完即生效,不需要改配置。

核心能力

插件做了一件事:根据模型名认出厂商,填入这家模型真正接受的档位和对应的请求字段,再把结果写进你的 profile 配置,让「模型设置」页的推理开关自动打开。

它按「模型 id → 显示名 → 关键词模糊匹配 → 接口域名」的顺序识别厂商,容忍 claud、deepsek 这类拼写,也能认出 deepseek/deepseek-v4-pro 这种带前缀的 id 和 cl-op-5.5 这种中转站缩写。覆盖的厂商有 Claude、GPT、DeepSeek、GLM、Kimi、Qwen、Gemini、Grok、豆包、MiMo。

同一个模型走不同协议(api)时档位可能不同。README 里举了几个例子:

模型 id 路由协议 选择器档位 请求里发送
claude-opus-5.5、cl-op-5.5 anthropic-messages low / medium / high / xhigh / max thinking: {type: adaptive} + output_config.effort
DeepSeek-V4.1-Flash-1017 openai-completions off / low / high / max thinking + reasoning_effort,工具循环回放 reasoning_content
deepseek-v4.1-flash anthropic-messages off / high thinking: {type: enabled, budget_tokens}
GLM-5.3 openai-completions low / high / max thinking(Z.ai 格式)+ reasoning_effort
Kimi-K3.1-Pro-HighSpeed openai-completions low / high / max reasoning_effort,工具循环回放 reasoning_content
qwen3.8-max openai-completions low / medium / xhigh enable_thinking + reasoning_effort
gpt-6.1-sol openai-completions low / medium / high / xhigh / max reasoning_effort
gemini-3.5-flash openai-completions minimal / low / medium / high reasoning_effort
my-private-model 任意 不改动 —

全部 28 种组合(含线上值和 compat 字段)在 docs/levels.md 里,该表由代码生成,CI 校验它与代码一致。认不出的模型不会被改动:猜错档位会让请求直接失败,不如保持原样。官方目录路由也不在处理范围内,插件只处理同时写了 api 和 baseURL 的自定义路由。

安装与启用

需要 DeepSeek Harness 0.2.x,用 dsh --version 确认。插件声明了 engines.dsh: ^0.2.0-0,版本不符时 DSH 会拒绝安装。

# 桌面版
dsh plugin --profile desktop add dsh-reasoning-adapter
# Web 版
dsh plugin --profile web add dsh-reasoning-adapter

装好后重启 DSH。确认方式有两个:打开对话框的模型选择器,切到一个自定义路由的模型,看是否出现推理等级行;或者打开「设置 → 模型」,这些模型的推理开关应该已经打开,档位与上面的表一致。

工作方式

插件分两层工作:

  1. 运行时匹配。DSH 每次加载模型配置时,插件给自定义路由上的模型补上档位和 compat 字段。这一层只在内存里生效,不改文件,插件启用后选择器立刻出现档位。
  2. 写回配置。大约一秒后,插件通过 DSH 自带的配置编辑器(与「模型设置」页保存时走同一个接口:加锁、校验、失败回滚)把同样的档位写进 profile 配置。这样「模型设置」页的开关显示为打开,即使以后停用或卸载插件,档位也会保留。

新添加的模型或路由会在保存后自动匹配。不想让插件写配置文件,把 writeConfig 设为 false,只保留运行时匹配。

你的设置优先

插件按模型记录自己写过什么,记录在 <profile>/.dsh-reasoning-adapter/auto-match.json,用它判断哪些模型由你管理:

你做了什么 插件的处理
新加了一个模型 识别厂商,写入档位,开关自动打开
在「模型设置」里打开开关(生成了默认的 off/low/medium/high) 替换为该厂商的真实档位,之后由插件管理
手动改过某个模型的档位 视为你在管理,不再写入;你的档位原样使用,只补充你没写的 compat 字段
关掉了某个模型的开关 不再打开,选择器里也不显示这个模型的档位
删除了某个模型 清掉对应记录,之后重新添加会当作新模型

对于已关闭或手动设置过的模型,「设置 → 模型」里每个自定义路由的卡片下方有一块「推理等级(dsh-reasoning-adapter)」,旁边有 用插件档位覆写 按钮:点一下,插件立即把该厂商的档位写进配置,开关重新打开,此后这个模型重新由插件管理;鼠标悬停在按钮上可以看到将要写入的档位。一条路由上有多个这样的模型时,还会出现 全部交回插件。识别不出厂商的模型没有这个按钮,请先用 overrides 指定厂商;writeConfig: false 时这块只显示状态,不提供按钮。

配置

默认配置适合大多数情况。需要调整时,编辑 ~/.dsh/profiles/<profile>/cordis.patch.yml,添加一条按 id 覆盖的配置(不要另写一条 insert),只写需要改的项:

- id: reasoning-adapter
  config:
    writeConfig: false
选项 默认值 说明
enabled true 总开关
writeConfig true 是否把匹配结果写进 profile 配置
replaceSettingsTemplate true 是否把「模型设置」开关生成的默认档位替换成厂商真实档位
fixCompat true 是否补充 compat 字段(adaptive thinking、reasoning_content 回放、非 OpenAI 厂商用 system 而不是 developer 角色等)
keepCommonLevels false 设为 true 后,厂商缺少的 low / medium / high 也会显示,并映射到最接近的真实档位
defaultEffort high 路由默认档位。只有该路由所有模型都支持这一档时才设置,且只在运行时生效,不写进配置
anthropicAdaptiveVendors [] 声明哪些厂商的 Anthropic 兼容接口支持 adaptive thinking(如 [deepseek, glm]),这些厂商在该协议下会获得更多档位
overrides {} 针对单个模型的规则

overrides

键是 glob(* 通配,不区分大小写),匹配 路由/模型id 或 模型id,按顺序取第一条命中的规则:

- id: reasoning-adapter
  config:
    overrides:
      # 认不出的模型:指定厂商,档位和字段按该厂商规则生成
      "my-relay/my-llm": { vendor: deepseek }
      # 直接写死档位和 compat
      "*my-model*": { reasoningEfforts: { off: null, high: high }, compat: { thinkingFormat: qwen } }
      # 不让插件处理这个模型
      "some-relay/some-model": { skip: true }

vendor 可选值:claude、openai、deepseek、glm、kimi、qwen、gemini、grok、doubao、mimo、minimax。

排查

插件把诊断信息写到 ~/.dsh/profiles/<profile>/.dsh-reasoning-adapter/status.json(每个 profile 单独一份):reports 记录每个模型识别出的厂商、依据(id / 显示名 / 模糊匹配 / 域名)、档位、补充的 compat;models 记录 DSH 实际提供给选择器的档位和默认档位;match 记录写回配置的结果。wrote: true 表示这次写入了,reason: "already matched" 表示配置已经一致、无需写入,其他 reason 是失败原因,此时档位仍由运行时匹配提供。提 issue 时附上这个文件,能加快定位。

卸载

dsh plugin --profile <profile> remove dsh-reasoning-adapter

已经写进配置的档位会保留,模型继续按这些档位工作。如果不需要,在「设置 → 模型」里关掉对应开关即可。插件的记录目录 ~/.dsh/profiles/<profile>/.dsh-reasoning-adapter/ 可以直接删除。

验证情况

作者在 DSH 0.2.1-rc.5(Windows)上,通过两个中转站对 11 个模型做了实测:每个模型以默认档位完成一次带工具调用的往返,同时抓取请求体检查推理字段。openai-completions 侧的 DeepSeek V4.1 Flash、GLM-5.3、GLM-5.3-FlashX、Kimi K3.1 推理字段正确、reasoning_content 正确回放、system 消息以 system 角色发送;anthropic-messages 侧的 Claude(Opus / Sonnet 5.5、Fable 5.1,adaptive + output_config.effort)和 DeepSeek V4 Pro / V4.1 Flash(budget_tokens)也通过。Qwen、Gemini、Grok、豆包、MiMo,以及经 openai-completions 访问 GPT/Claude 的规则,依据 DSH 内置模型目录的元数据编写,未实测。如果你实际使用中发现档位不对,可以提 issue 或 PR。

适用场景与注意

适合在 DSH 里使用中转站、自建网关、算力平台等自定义路由,并且希望在选择器里直接切推理等级的人。插件以当前 dsh 进程权限运行,安装前应检查源码与许可证。许可证是 MIT,作者是 HatiaaYu;开发无需构建、没有运行时依赖,测试用 Node 内置测试运行器(Node 20+),npm test 跑单元测试,npm run check 做语法检查加单元测试,npm run matrix 根据 rules.js 重新生成 docs/levels.md。新加厂商或修正档位的步骤见仓库里的 CONTRIBUTING.md。

小结

这个插件的价值是把「认识模型」的活儿从 DSH 内核侧移到插件侧:你只管在路由里加模型,档位和请求字段由插件按厂商规则补齐,并且写回配置,停用插件后档位仍在。目录页在 https://www.skillhub.cn/plugins/Hatiaa/dsh-reasoning-adapter ,源码在 https://github.com/Hatiaa/dsh-reasoning-adapter 。

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

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

小夜