DSH(DeepSeek Harness)的压缩引擎在 Web 设置页选择对话压缩总结器后,没有内置的故障转移机制。当总结调用被拒绝或因上下文超限失败时,整个压缩过程会直接报错,后续不会再尝试其他模型。此外,DSH 的固定字符估算(chars/4)与不同模型的实际分词结果存在偏差,可能导致一个对聊天模型来说合适的历史记录,对选定的总结器来说却超出了输入上限。
dsh-compaction-route 旨在解决上述问题。它是一个 DeepSeek Harness 插件,允许你在设置页为压缩总结器指定一个备用模型,当主模型无法处理历史记录时自动切换。
核心功能¶
该插件仅对 purpose === "compaction" 的请求生效,拦截 DSH 的 llm/stream 流水线。主要能力包括:
- 目标重写:将请求的目标重写为配置的“主模型”。
- 终端错误重试:如果主模型调用结束于终端错误块,自动在同一请求上尝试“备用模型”。
- 超大历史回退:为可能超出输入上限的重放历史提供兜底能力。
- 模型选择:从已安装的配置文件中读取可用模型列表。
安装与启用¶
安装过程无需构建步骤,插件挂载后无需重启应用。
Web UI 安装¶
- 打开设置页面。
- 进入 Plugins(插件)。
- 点击 Add plugin(添加插件)。
- 在输入框中填入插件规范:
github:643048695/dsh-compaction-route
- 按提示启用插件。安装后插入的行 ID 为
compaction-route,这也是配置页面的命名空间。
CLI 安装¶
dsh plugin --profile <profile> add github:643048695/dsh-compaction-route
配置¶
安装后,进入 Settings → Plugins → dsh-compaction-route → Configuration 进行配置。
| 配置项 | 说明 |
|---|---|
| Enable routing | 开启路由功能。关闭时,引擎行为与未安装插件时一致。 |
| Primary model | 首先尝试使用的总结器模型。 |
| Fallback model | 仅在主模型返回终端错误时尝试。留空则禁用备用功能。 |
| Reasoning effort | 压缩调用的推理力度,留空则使用提供商的默认值。 |
下拉菜单中的选项来源于 llm-pi-ai 配置命名空间,仅显示已安装在当前配置文件中的模型。配置项为易失性(volatile),修改后仅对下一次压缩生效,无需重启。
选择备用的前提:备用模型的有效窗口必须大于主模型的有效窗口。如果两者窗口大小相同或更小,选择备用模型无法解决问题,配置卡片会提示警告。
工作原理¶
插件拦截 llm/stream 水位线,针对压缩任务执行以下逻辑:
- 若请求的
purpose不为"compaction",直接放行,不做任何修改。 - 将目标重写为配置的 Primary 模型。
- 若 Primary 成功,返回其数据流。
- 若 Primary 结束于终端错误块,重新进入
ctx.llm.stream(),使用 Fallback 模型重试。 - 返回第一次成功的结果,或最后一次尝试的结果。
注:插件通过 WeakSet 追踪自身创建的调用对象,防止重试逻辑再次被拦截。
注意事项与兼容性¶
- 重试范围:仅在终端错误块时重试。若出现非终端错误(如中间态异常),按原行为处理,不触发备用。
- 取消优先:若请求被取消,不会触发重试。
- 仅影响压缩:插件仅修改
purpose === "compaction"的请求,聊天回合、子代理等其他任务不受影响。 - 日志记录:引擎自身的事件仍记录其配置的目标(
summarizationProvider/summarizationModel),而非插件的实际覆盖目标。若需日志一致性,需在引擎设置中将目标指向与插件相同的主模型。 - 兼容版本:兼容
@deepseek-ai/dsh0.1.7-rc.2 及 same-node 0.1.7 线。
总结¶
dsh-compaction-route 通过在压缩流水线中增加一层路由逻辑,解决了 DSH 压缩引擎单点故障的问题。当你面临长对话历史导致的压缩失败,且主模型无法处理时,配置一个具有更大上下文窗口的备用模型是有效的解决方案。
- GitHub 仓库: https://github.com/643048695/dsh-compaction-route
- 社区目录: https://www.skillhub.cn/plugins/643048695/dsh-compaction-route