用 dsh-model-router 给 DeepSeek Harness 做模型路由和成本面板

前言

DeepSeek Harness(dsh)把智能体循环做成「一切皆插件」:模型、工具、界面槽位都可以挂上去。日常用网页界面写代码时,会话里往往混着两类请求:一类是「这个报错是什么意思」「继续」这种短问,一类是改架构、读大文件、跑多步工具的重活。如果全程走主模型,简单问答也会吃前缀缓存和推理预算;如果全程走便宜模型,复杂任务又容易掉质量。

社区插件 dsh-model-router 做的是中间这一层:先判断这一步是不是简单问题,简单的用 flash 直答,重活仍走主模型;主模型短暂故障时可以降级重试一次;输入框下方再挂一块 token / 缓存命中 / 估算成本面板。本文按插件目录页、GitHub 仓库 README / package.json / 源码交叉核对后整理。

社区插件目录(https://deepseek-harness-plugin.com)是独立站点,和 DeepSeek / 幻方没有官方从属关系,不要把它当成官方应用商店。GitHub 上还有另一个同名仓库 superboy911/dsh-model-router,做的是关键词路由和隔离生图,和本文介绍的不是同一个插件。

这是什么

dsh-model-router 是一款面向 DeepSeek Harness 网页界面的界面增强插件,由 tianji-qingtian 维护,许可证 MIT,主要语言 JavaScript。目录页收录于 2026-08-12,分类为「界面增强」。仓库 package.json 当前版本为 0.8.1,GitHub 最新 Release 也是 v0.8.1(2026-08-14)。插件声明的客户端平台是 web,需要挂到 web profile 才能看到面板。

它解决三件事:

  • 简单问题不要进主模型:零前缀 flash 作答,不碰主会话的前缀缓存。
  • 瞬时故障不要整轮失败:限流、服务端错误、超时、空响应时降到便宜模型再试一次。
  • 用量要能看见:按会话折叠真实适配器 token,并按模型档位估一个带 的费用。

Harness 官方仓库写明当前仍是 developer preview,不兼容变更是预期内的。插件 README 也提醒:升级 harness 后,伪造 step 包络这一段值得复查。

核心功能

便宜模型裁判路由

请求先走 agent/pre-step 瀑布。明显的重活(强关键词或超长文本)直接进主模型,不加额外延迟。其余请求会做一次零前缀 flash 裁判:只输出 SIMPLEAGENTIC 一个词,上限 64 token,并关掉思考。裁判会带上上一条 assistant 回复,用来识别「它 / 这个 / 继续」这类依赖上下文的追问,避免把追问误判成可以无上下文直答。

便宜 / 强模型对不是写死的,运行时从 llm.listModels 的目录里按 id 匹配:

  • 便宜候选:flash|chat|mini|turbo|haiku|lite|air|nano
  • 强候选:pro|reasoner|opus|sonnet|max|ultra|premium|r1

原生 DeepSeek 适配器下,文档写的配对是 deepseek-v4-flashdeepseek-v4-pro

回答前先问,再直答

v0.8.0 起,auto 模式下命中 SIMPLE 不会立刻作答,而是弹出 harness 自带的问题 UI,让用户选:

  • ⚡ 快速回答(flash):更快、成本更低
  • 主模型回答:走正常智能体流程

选主模型、关掉弹窗、子代理会话,或没有问题 UI 时,都会回退到正常流程。问题文案跟随提问语言(中 / 英)。

用户选快速回答后,插件拒绝当前步骤,用便宜模型做一次零前缀单次流式调用,再把问答写进会话日志(伪造 step/startassistant/messagestep/end 包络)。界面上看起来仍是普通一问一答,答案前缀带 ⚡ 快速回答 / Quick answer · 标记。主模型不参与这一轮,也不会产生子代理会话、relay 卡片或 toast,主会话的模型和前缀缓存保持不动。

Auto / 关闭 与故障降级

快速回答可以按会话开关,三处入口做同一件事:

  • 输入框下方面板的 Auto / 关闭
  • 斜杠命令 /router auto/router off
  • 模型可见工具 route_model(参数 tierauto | off

没有「按请求指定模型」的配置项。auto/off 状态由会话投影从 command/run 事件折叠,重启后仍保持;瞬时故障降级标记是进程本地的,harness 退出即丢。

降级只覆盖这些瞬时错误:RATE_LIMITSERVERTIMEOUTEMPTY_RESPONSE。命中后把该轮标成降级,返回 { kind: 'retry' },重试进入 agent/request 时落到便宜模型,每轮最多一次。其余错误交给 provider 自己的重试策略。

另外,agent/request 在没有路由决策时会把模型拉回 agent 配置默认值,避免伪造 header 或重启后的陈旧持久化 header 粘住。

输入框下方的用量面板

面板挂在 conversation.composer.dock,中英文案走 harness 的 locale 服务。内容包括:

  • Auto / 关闭开关
  • 当前模型
  • miss/out/cache%/≈$ 一行
  • QA×N 快速回答计数(每次直答会短暂高亮)
  • 分模型用量明细

数字来自会话投影 modelRouter,折叠 request/headercommand/runassistant/message 事件。用的是适配器上报的真实 token(输入 / 输出 / 缓存读 / 缓存写 / 推理),不是前端自己估的调用次数。投影可重放,冷启动会话也能出数。安装前已经写进日志的历史也会被计入,这是文档写明的预期行为。

成本是档位估算,单位 USD / 百万 token,写在 src/index.js 顶部:

const PRICE_TABLE = [
  { test: CHEAP_RE, input: 0.27, output: 1.10, cacheHit: 0.07 },
  { test: STRONG_RE, input: 0.55, output: 2.19, cacheHit: 0.14 },
]

面板数字始终带 。缓存命中按缓存价计,不按输入价。harness 的 TokenUsage 字段是不相交的:inputTokens 已经去掉缓存读(DeepSeek 上报 prompt_tokens = hit + miss,适配器把命中扣掉了),所以面板显示 miss … · cache N%,命中率是 hit / (hit + miss)。文档说健康的长对话通常在 90% 以上。价格表可以改成自己账号的实际报价。

安装与启用

目录页给出的安装命令是:

dsh plugin add github:tianji-qingtian/dsh-model-router

dsh CLI 需要在 PATH 上。如果之前只用 npx 跑过 harness,会报 command not found: dsh。仓库 README 的前置步骤是先全局安装:

npm install -g @deepseek-ai/dsh

也可以用 pnpm add -g @deepseek-ai/dsh(全局 bin 目录要在 PATH 上),或把后面的命令都加上 npx @deepseek-ai/dsh 前缀。

这个插件的客户端声明是 web 平台。仓库 README 建议装进 web profile,并固定 Release tag。README 示例仍写 #v0.7.2,仓库当前最新 Release 是 v0.8.1(含「快速回答前先问用户」)。可复现安装建议钉最新 tag:

dsh plugin --profile web add "github:tianji-qingtian/dsh-model-router#v0.8.1"
dsh --profile web

add 只改 profile 文件,运行中的实例不会热加载。重启后,输入框下方应出现 ⚡Router 面板;宿主半场加载完成后会注册 /routerroute_model。可在 Settings → Plugins 里确认列表中有 dsh-model-router

目录页也提示:如需可复现安装,可写成 github:tianji-qingtian/dsh-model-router#commit。某个会话里可能还跑着一个同名的动态原型(只活在当前进程),和装进 profile 的 bundle 不是一回事,harness 退出即消失。

插件以当前 dsh 进程的权限运行,安装时可能执行代码。装之前应阅读仓库源码和 MIT 许可证。

典型用法

装好并重启 web profile 之后,可以按下面的顺序验证。

  1. 打开网页界面,看输入框下方是否出现 ⚡Router 面板。开关应能在 Auto 和关闭之间切换。
  2. 保持 Auto,发一条自包含的短问题,例如「Python 里 listtuple 有什么区别」。裁判判成 SIMPLE 时会弹出 ⚡ 快速回答(flash) / 主模型回答。选快速后,回复应带 ⚡ 快速回答 标记,面板上的 QA×N 会加一。
  3. 再发「继续展开第二点」这类追问。按文档设计,裁判能看到上一条回复,这类依赖上下文的问题应走主模型,而不是无上下文直答。
  4. 用斜杠命令显式开关:
/router auto
/router off

参数只能是 autooff,写错会返回 usage: /router auto|off

  1. 也可以让模型调 route_model,参数 tier 同样是 autooff。工具返回里会带当前模式,以及目录里解析到的便宜模型 id。
  2. 看面板上的 miss/out/cache%/≈$ 和分模型明细。长会话里 cache 命中率如果长期很低,优先检查是不是每次都在换模型或清上下文,而不是先改价格表。

适用场景与注意事项

比较适合这些情况:

  • 主要在 DeepSeek Harness 网页界面里干活,希望简单问答走 flash,重构 / 多工具任务仍走主模型。
  • 想在输入框旁边看到本会话的 token、缓存命中和估算费用,而不是事后去账单页对账。
  • 偶尔碰到限流、超时、空响应,希望该轮自动降到便宜模型再试一次,而不是整段对话停住。

使用前要注意:

  • 客户端平台是 web。只跑终端 TUI、不启网页界面时,装了也看不到 dock 面板。
  • package.json 要求 Node.js ^22.19.0 || >=24.0.0,并声明对 @deepseek-ai/cordisdsh-commandsdsh-llmdsh-session 等包的 peer 依赖。harness 升级后如果这些包对不上,需要对照 Release 再装一次。
  • 直答会把伪造 step 包络写进会话日志,这是插件和 harness 耦合最深的部分。官方 harness 仍在 developer preview,升级后应复查快速回答是否还符合会话不变量。
  • 面板费用是档位估算,不是账单。改 PRICE_TABLE 才能贴近自己的报价。
  • 插件以当前 dsh 进程权限运行。安装前检查 https://github.com/tianji-qingtian/dsh-model-router 的源码和许可证;不要把目录页当成官方背书。

小结

dsh-model-router 把「简单问题 flash 直答、瞬时故障降级、会话用量可视化」收进 DeepSeek Harness 的网页输入框下方。路由决策发生在 agent/pre-step,费用数字来自可重放的会话投影,开关只有 auto / off,没有额外的按请求模型配置。

目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-model-router/

GitHub:https://github.com/tianji-qingtian/dsh-model-router

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

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

小夜