前言¶
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。確認方式有兩個:打開對話框的模型選擇器,切到一個自定義路由的模型,看是否出現推理等級行;或者打開「設置 → 模型」,這些模型的推理開關應該已經打開,檔位與上面的表一致。
工作方式¶
插件分兩層工作:
- 運行時匹配。DSH 每次加載模型配置時,插件給自定義路由上的模型補上檔位和 compat 字段。這一層只在內存裏生效,不改文件,插件啓用後選擇器立刻出現檔位。
- 寫回配置。大約一秒後,插件通過 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 。