dsh-big-compact:超大会话压缩插件

前言

DeepSeek Harness(DSH)自带的压缩功能会将旧历史一次性塞进一个模型请求。当会话涨到几 MB 之后,中转会返回 404 model_not_found,/compact 只剩下一句 “Compaction could not produce a useful summary”。dsh-big-compact 在 llm/stream 瀑布上兜底,只在压缩请求超过阈值时接管,将其切成多块分别摘要、再合并成最终检查点;小会话与普通对话一律原样放行。

这是什么

dsh-big-compact 是一个超大会话压缩插件,由维护者 yezitotempeace 开发。它解决的是 DSH 自带压缩在处理超大上下文时会因请求体过大而被中转拒绝的问题。

插件设计参考了 billion-context:普通请求/小上下文不走它,只有大到本地压缩处理不了时才启用。

核心功能

触发条件(实时监测)

每次 llm/stream 都会用 ctx.tokenMeter.measure(session) 实测该会话当前上下文 tokens。压缩请求会先通过 ctx.llm.resolveModelInfo(provider, model) 读取模型声明的 contextWindow,计算出安全线(窗口 × 0.85)。如果实测上下文 > 安全线,或请求体 > 4 MB,就进入分块模式。

上下文占到 85% 时会打印一行预告:

上下文实时监测:… tokens,已达窗口 … 的 95%,下次压缩将分块

工作方式

在压缩请求进入 dsh 压缩引擎之前,插件会先实测上下文 / 解析窗口,再决定是否接管。

  • 未超线:next(),走 dsh 自带压缩(行为不变)
  • 超线:分块模式

分块模式的具体步骤如下:

  1. 历史消息按时间顺序装箱,每块默认 1.5 MB(chunkBytes)
  2. 每块发一个小请求,生成结构化要点,默认 max_tokens 6000,并发数为 3
  3. 各块摘要合并;合并后仍超线就再做一轮
  4. 合并摘要 + dsh 原始压缩指令发给模型,得到最终检查点
  5. 按 raw chunk 协议回放(text 块 + finish stop)给压缩引擎落盘

子请求的 purpose 是 compaction-chunk / compaction-final,不会再次触发插件(无递归)。

  • 空摘要算失败:某块返回空或少于 10 字时,自动重试并把输出预算翻倍(最多 20000 tokens),仍失败则二分再试(最多 2 层)
  • 整条链路失败时回放 finish{kind:'error'},/compact 会照常报错并写会话日志,不会静默

配置

配置文件位于 /root/.big-compact/config.json(不存在时用默认值):

字段 默认值 说明
thresholdBytes 4000000 请求体超过该字节数才接管(字节兜底)
maxContextTokens 0 0 = 按模型动态解析 contextWindow;>0 = 强制覆盖
contextFillRatio 0.85 实测上下文 > 模型窗口 × 该比例 就接管
chunkBytes 1500000 每块字节预算(UTF-8 字节)
chunkMaxTokens 6000 每块摘要的 max_tokens(重试时翻倍,上限 20000)
finalMaxTokens 8000 最终合并的 max_tokens
concurrency 3 分块请求并发数
retries 2 单块失败重试次数
maxMessageChars 200000 单条消息最多保留字符数(防一个巨大工具结果吃掉整块)
maxDepth 2 失败二分重试的最大深度
verbose true 是否打印每块进度

日志

在 /root/dsh-web.log 中搜索 [big-compact] 可见运行日志:

[big-compact] 已启用:窗口 按模型动态解析,安全线 85%,分块 1.43 MB,并发 3
[big-compact] 上下文实时监测:6464308 tokens,已达窗口 850000 的 760%(安全线 85%),下次压缩将分块
[big-compact] 超大压缩请求(上下文 6464308 tokens(实测)> 窗口 850000 × 0.85 = 722500)→ 分块模式
[big-compact] 压缩请求 23.13 MB,切成 9 块
[big-compact] 分块 1/9 完成(1.43 MB → 3621 字)
...
[big-compact] 压缩完成:9 块,用时 96.6s,摘要 3586 字

安装与启用

插件已注册进 profiles/web/package.json(依赖 + dsh.profile.bundles)并建立 node_modules/dsh-big-compact 链接。重启一次 web 生效(patchReload: startup)。

插件文件位于 /root/dsh-big-compact。

卸载

从 dependencies 与 dsh.profile.bundles 删掉 dsh-big-compact,删除 node_modules/dsh-big-compact 链接;重启 web。

测试

node test/unit.mjs          # 离线:分块、合并、拦截边界、空摘要重试、动态窗口、失败兜底
node test/live.mjs 12 3     # 真机联调:12 MB 合成压缩请求 → 分块 → 合并(直连中转)

已知限制

  • 分块摘要是有损的:每块只保留要点,细节以原会话日志为准
  • 依赖中转能接受单块 1.5 MB 的请求;若某个中转更严格,把 chunkBytes 调小即可
  • 只处理 purpose === 'compaction' 的请求;普通对话不拦截

适用场景与注意

插件以当前 dsh 进程权限运行。安装前应检查源码与许可证。

结尾

dsh-big-compact 在 DSH 自带压缩无法处理的超大上下文场景中提供兜底能力,通过实时监测、分块摘要和重试机制,保证压缩流程不会因请求体过大而中断。安装与配置简单,日志完整,适合需要处理超长会话的 DSH 用户。

  • 插件目录页:https://www.skillhub.cn/plugins/yezitotempeace/dsh-big-compact
  • GitHub:https://github.com/yezitotempeace/dsh-big-compact
羽毛球分组比赛记分
小程序二维码

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

Xiaoye