dsh-model-tier/packages/dsh-model-tier

23Star3Fork1Issue0Watching

为 DSH 提供模型分档路由:按会话把辅助请求与子任务分流到轻量模型,主对话与复杂任务走强档,跨 provider 生效。

机审证据安装命令仓库已核验dsh-plugin Topic许可证READMEAI 百科

此插件是大仓库 biociao/dsh-science 的子包,星数与活跃度统计的是整个仓库。

语言
JavaScript
License
MIT
分支
main
dsh-plugindsh-plugins

安装

$ dsh plugin --profile web add dsh-model-tier

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

对话式安装

帮我安装 DeepSeek Harness 插件 biociao/dsh-science/packages/dsh-model-tier:先查看仓库 https://github.com/biociao/dsh-science.git 确认安全性,然后执行安装命令并验证插件加载成功。

把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。

一句话定位

为 DeepSeek Harness 提供的会话级模型分档路由插件:把会话里的辅助请求(标题/压缩)和子任务自动分流到轻量模型,把复杂任务升级到强档模型,主对话按档位方案走,每个档位可以指向不同 provider。

核心能力

  • 在会话模型选择器里注册虚拟 provider「智能分档」,把多个分档方案变成可选"模型",按会话 opt-in 启用路由,未选中的会话完全不受影响
  • 按请求类型自动决策档位:辅助请求(会话标题、压缩)走轻档,子任务走轻档,主对话走主力档
  • 按规则升级到强档:可选「最近用户消息超过 N 字符」「子代理链路深度 ≥ N」触发强档,把长输入与深链推理自动交给更强的模型
  • 可选 LLM 前置分类器:用一个小模型在结构规则之上把任务判为 light/default/strong,按 (sessionId, 消息哈希) 缓存,每轮只分类一次,失败/超时自动回落结构档位
  • 多方案预设 + 热重载:设置页可保存多套分档方案,配置文件按 mtime 热加载,无需重启 profile
  • 跨 provider 路由:三档可分别指向不同 provider/model,档位未配置时按 default → light → strong 顺序回落,再不行透传全局默认模型

技术实现

  • 语言: JavaScript(ESM,Node 内置模块)
  • 关键依赖: 零第三方依赖;仅用 node:fsnode:pathnode:osnode:url
  • 架构模式: 通过 ctx.llm.registerAdapter(["model-tier"], ...) 注册进程级虚拟 LLM 适配器;订阅 agent/request 事件做全局默认模型回退守卫;客户端通过 slots.inject 注入「设置页 section」与「聊天页底部 dock」
  • 入口文件: engines/model-tier.mjs(路由引擎,导出 name = "dsh-model-tier"inject = ["llm"])+ engines/model-tier-ui.mjs(设置页 HTTP 路由)+ client/model-tier-ui/src/index.js(设置页 + 路由读数 UI)

适用场景

希望同时使用不同 provider 的强模型(如 DeepSeek、智谱)和便宜/本地轻模型的用户,希望在同一个会话里自动按请求类型分流模型以节省 token 成本与延迟。适合多模型协作(如主力档用旗舰、辅助档用本地小模型、复杂档用推理强模型)的开发、研究与自动化工作流场景。Claude Code 用户迁移到 DSH 后可以无缝复用「小模型处理辅助请求」的分级思路。

前置依赖与兼容性

依赖最低版本说明
Node>= 18package.jsonengines.node 声明
DSH未声明package.json 中无 dsh 版本字段,按当前发布的 DSH 宿主运行
平台跨平台服务端无平台相关原生模块;客户端声明 dsh.client.platform: "web"
原生模块仅依赖 Node 内置模块(fs/path/os/url)

安装方式

dsh plugin --profile web add dsh-model-tier

配置项

配置类型说明默认值
tiers.strong对象强档 {provider, model, reasoningEffort?},用于复杂任务(深链子任务 / 超长输入)未配置 → 回落主力档
tiers.default对象主力档,被选中会话的主对话走此档未配置 → 回落轻档/强档
tiers.light对象轻档,用于辅助请求(标题/压缩)+ 子任务未配置 → 回落主力档
routing.auxiliary字符串数组视为辅助请求的 purpose 列表,自动走轻档["session-title", "compaction"]
routing.subagents字符串"light" 表示子任务路由到轻档;其它值不路由"light"
routing.subagentDepthStrong数字/null子代理 delegationDepth ≥ N 时升级到强档null(关闭)
routing.escalateOnChars数字/null最近一条用户消息文本长度 ≥ N(剥离 harness 注入的 <system-reminder> 段后)时升级到强档null(关闭)
routing.classify对象/nullLLM 前置分类器:true/{} 启用(缺省用轻档模型分类),或 {provider, model, timeoutMs?, maxChars?, maxTokens?} 显式指定;建议选非 thinking 模型null(关闭)
enabled布尔总开关:关闭后模型选择器不再出现「智能分档」true

三档全部未配置时,模型选择器不出现任何分档方案,因此示例配置可安全随包发布,不会污染不期望 provider 的环境。

常见问题

Q: 这个插件和 Claude Code 的 Opus/Sonnet/Haiku 策略是什么关系?

A: 是同一思路的 DSH 落地版:在同一会话内自动把辅助请求(标题/压缩)和子任务分流到轻量档,主对话走主力档,复杂任务按规则升级到强档,对应到 Claude Code 的 smallModel/--model-small 与任务复杂度判断。

Q: 安装后所有会话都会被自动分档吗?

A: 不会。插件只在会话模型选择器里注册一个虚拟 provider「智能分档」,需要在每个会话里手动选中「智能分档 / 某方案」才会启用路由,未选中的会话完全不受影响(按会话 opt-in,无全局路由)。

Q: 配置文件存在哪里?改了需要重启吗?

A: 写入 $DSH_HOME/model-tier.json(默认 ~/.dsh/model-tier.json)。路由引擎按文件 mtime 缓存,改动即热生效,无需重启 profile 或重开会话。

Q: LLM 前置分类器 (routing.classify) 是必须的吗?

A: 不是。它是可选增强项:开启后,每次用户提问或子任务派发前会用一个小模型把任务判为 light/default/strong,覆盖结构档位。缺省用轻档模型分类,失败/超时/乱答自动回落到结构档位(不会阻塞主请求)。

Q: 分类器目标能用 thinking 模型吗?

A: 不建议。thinking 模型的推理内容同样消耗 maxTokens 额度(默认 512,可用 maxTokens 调大),实测曾出现 thinking 占满额度、输出空字符串拿不到分类词的情况,README 明确建议选非 thinking 模型。

Q: 和 dsh-science 是什么关系?

A: dsh-model-tier 是 dsh-science 的配套包。安装 dsh-science 会自动带上 dsh-model-tier 作为依赖;但它本身完全独立,可在任何 profile 单独 dsh plugin add dsh-model-tier 使用。

上手难度

入门 — 配置只涉及三档 provider/model 的 YAML,写入 yaml 后即可在模型选择器看到「智能分档」分组并在会话里启用;进阶功能(分类器、深链升级)有清晰开关和默认值。

已知问题与限制

  • 选择窗口竞态(已知限制):由于平台会把「会话模型选择」持久化为全局默认模型,引擎用 agent/request 监听做 best-effort 回退;但在「选中方案」到「下一次请求」之间的极短时间窗口内新建的会话仍会继承分档方案(来源:README.zh.md:48-49engines/model-tier.mjs:651-681
  • 跨档位 thinking 兼容:当历史中混入其它档位(非 thinking / 无推理捕获)产生的工具调用助手消息,而目标档位是 DeepSeek 这类要求回传 reasoning_content 的 thinking 模型时,会触发 400 INVALID_REQUEST。引擎会自动给缺失推理块的消息补占位推理内容并透明重试一次(产生 warn 日志,但只重试一次,不重放已产出的内容;来源:engines/model-tier.mjs:344-369
  • 分类器缓存上限 200 项:按 (sessionId, 消息哈希) 缓存分类结果,超过上限按插入顺序淘汰旧项,长会话密集场景下偶发重复分类属正常(来源:engines/model-tier.mjs:318-323
  • 轻档模型推理等级:档位显式 reasoningEffort 会原样转发;选择器的推理等级仅在目标模型声明支持时才转发,否则会被宿主以 UNSUPPORTED_REASONING_EFFORT 硬失败,轻档模型通常不支持推理,标题/压缩等辅助请求会随之静默回退(来源:engines/model-tier.mjs:622-639
  • 未配置档位的方案不上线:若设置页保存的方案三档都未配置完整 provider/model,对应档位会按 TIER_FALLBACK 顺序回落,最终仍无目标时会抛错「无可用模型」(来源:engines/model-tier.mjs:294-303engines/model-tier.mjs:597-606

收录徽章

Listed on deepseek-plugin.org
[![Listed on deepseek-plugin.org](https://img.shields.io/badge/listed_on-deepseek--plugin.org-007EC6)](https://deepseek-plugin.org/plugins/biociao/dsh-science/packages/dsh-model-tier)

把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。

返回插件目录