dsh-compact-tuner
在输入框上方调当前对话的上下文压缩参数:触发比例和保留量。
为什么需要它
DSH 的自动压缩由 @deepseek-ai/dsh-compaction-basic 驱动,两个参数只存在于 preset 配置里:
thresholdRatio:thresholdTokens = min(窗口 × 比例, 窗口 − 输出预留 − headroom), 测得的totalTokens越过它就压缩;retainTokens:压缩时原样保留的尾部 token 预算。resolveCompactSpec要求它严格小于阈值, 否则直接抛错。
两者都是全局的:改一次要重启,且对所有对话一视同仁。但长任务和短问答需要的策略不同—— 有的想晚点压、保住单轮完整性,有的想早点压、省窗口;压缩后保留多少尾部,决定接下来几步 还记不记得上下文。
现有插件里,dsh-compaction-threshold 和 dsh-compact-control 只调阈值;
@tivility/dsh-compaction-window 覆盖阈值和保留量,但它替换 compaction 后端、
要求改 preset 里的压缩行,也没有界面。这个插件补的是:两个参数都能调、在会话里直接调、
不换后端。
安装
dsh plugin --profile desktop add dsh-compact-tuner
重启 DSH。也可以从侧栏「插件」页搜索安装。
preset 隔离时补一行
DSH 0.2 的 preset 常用 isolate: { compaction: true } 给每个 preset 独立引擎,
bundle patch 只能插根层。在自己的 preset 的 compaction group 里加:
- id: compact-tuner-engine
name: dsh-compact-tuner
config:
role: engine
根层那条(面板、命令、HTTP 接口)由插件自带。不加这一行,面板显示「未启用」。
用法
点输入框上方的「压缩 xx%」,面板两个页签:
| 页签 | 取值 | 对应配置 |
|---|---|---|
| 触发比例 | 20% / 25% / 35% / 自定义 5%–95% / 跟随默认 | thresholdRatio |
| 保留量 | 8k / 20k / 40k / 自定义 1k–200k token / 跟随默认 | retainTokens |
改动只影响当前对话,下一步生效;新对话回到默认值。
命令:
/compact-ratio 查看当前对话的比例
/compact-ratio 0.25 设为 25%
/compact-ratio default 清除覆盖
实现
装饰 ctx.compaction 的 compactIfNeeded:调用前换入带覆盖的配置副本,在引擎的同步前缀
结束后还原。没有覆盖、不是压力触发、或引擎不可用时,直接调用原方法。
已知行为
- 只作用于压力触发的压缩;上下文溢出后的恢复不保留尾部,这是后端行为。
- 保留量 ≥ 阈值时后端抛
retainTokens must be less than threshold;插件捕获后回退到 按比例计算的默认尾部,并在compact-ratio.health.json记一条,日志里也有一条 warn。 - 模型级
modelPolicies里显式写的保留策略优先于面板设置。
存储
~/.dsh/storages/compact-ratio.json,纯本地,不上传。
开发
index.js + client.js 两个文件,无构建、无运行时依赖。改完重启宿主,
浏览器半侧刷新页面即可。
许可
MIT。