前言¶
DeepSeek Harness(DSH)在会话过长时会走上下文压缩:把历史压成摘要再继续对话。官方路径里常有 dsh-compaction-basic 负责发起摘要请求。若你用的是自建或第三方的 OpenAI 兼容反代(Qoder、WorkBuddy、AutoClaw 等),实际 context 窗口和 adapter 声明值经常不一致;harness 侧 token meter 又按约 4 字符/token 估算,中文和 JSON 容易被低估数倍。摘要请求既不裁剪也不重试,容易被上游以 prompt 过长拒绝,整条压缩链路失败。
另一类问题来自 pi-ai:当响应以 stop 结束且 input + cacheRead 超过 adapter 声明的 contextWindow 时,会不看内容是否已到齐,直接抛出「context overflow」类诊断。压缩摘要几乎总是以 stop 结束,成功摘要会被丢弃;普通对话的最终回答也可能被同样误判毁掉。
下面介绍社区插件 dsh-compaction-fit(维护者 warter666):在 llm/stream 中间层做摘要前按真实 token 预算裁剪、上游真拒绝时缩小预算重试,并纠正 pi-ai 的静默溢出误判。它不修改 harness、不碰 app.asar、不改会话日志;被省略的原文仍完整留在 session log 里。
这是什么¶
dsh-compaction-fit 是 DSH 的 compaction 中间件:面向 purpose: 'compaction' 的摘要请求做 CJK 感知的 prompt 裁剪与 shrink-and-retry;同时可修复 pi-ai 把「已完整到达的回答」误判为上下文溢出的情况。插件仅挂在 llm/stream 上,通过 package.json 里的 dsh.bundle.patch 在安装时自动并入 cordis.patch.yml,无需手工改 profile patch 即可启用默认配置。
- 目录页:skillhub.cn/plugins/warter666/dsh-compaction-fit
- 源码与文档:github.com/warter666/dsh-compaction-fit
- 许可证:MIT(版本 0.1.0,见仓库
package.json)
DSH 生态主张「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。
它针对的两类故障¶
摘要超出上游真实限制¶
dsh-compaction-basic 会把待压缩历史整段塞进摘要请求。meter 低估 token、网关实际窗口小于或大于声明值时,请求被顶回,压缩失败,原始报错直接暴露给用户。
pi-ai 静默溢出误判¶
上游响应已是完整 stop,但 pi-ai 仍伪造 pi-ai detected context overflow for model "..."。压缩场景下每次成功摘要都可能被丢弃;非压缩的最终文本回答同样受影响。
核心能力¶
摘要前裁剪(trim)¶
对 purpose: 'compaction' 请求用 CJK 感知估算器衡量 token 预算。超预算时:
- 先按字符上限截断超长工具结果、assistant 文本、reasoning 和工具参数;
- 仍不够则按「工具调用 + 结果」整组省略中间历史,在组边界插入省略说明;
- system、首组(通常是上一个 checkpoint)和最近若干组始终保留。
消息按组处理:assistant 的 tool-call 与紧随其后的 tool 结果为一组,不会被拆开。超长工具参数会被替换为合法 JSON 占位对象(含 _compaction_fit_truncated 等字段),避免上游 JSON 校验失败。字符上限分多轮逐步收紧;仍不够则扩大被省略的中间段。
缩小重试(retryOnPromptTooLong)¶
上游返回 CONTEXT_WINDOW_EXCEEDED 或 prompt too long 一类错误,且尚未产出任何内容时,按 shrinkRatio 几何缩小预算重发,最多 maxRetries 次。已经流出的内容不会被撤回重试。
纠正伪造溢出(suppressFabricatedOverflow)¶
仅当上游诊断措辞符合 pi-ai 伪造特征、没有 status/requestId、且流里已有内容时,把 finish 改回 stop 并保留回答。真实上游拒绝(无内容、上游原文消息)不会被吞掉。默认 suppressScope: all 也覆盖普通请求,因为同一误判会毁掉非压缩回答;可设为 compaction 仅作用于摘要。
安装与启用¶
在 DSH 市场(Discover)搜索 dsh-compaction-fit 安装,或执行:
dsh plugin --profile web add dsh-compaction-fit
安装时 cordis.patch.yml 会作为 bundle 层自动并入。装完需重启 DSH(市场热安装除外)。
环境要求(仓库 README 已实测):
- Node:
^22.19.0 || >=24.0.0 - DSH
0.2.1-rc.2(cordis~4.0.5);其他 0.2.x 请以llm/stream的 chunk 形状为准
插件以当前 DSH 进程权限运行。安装前建议在 GitHub 阅读源码与 MIT 许可证,确认行为符合你的网关与合规要求。
配置要点¶
默认值随包 patch 下发,可在自己的 cordis.patch.yml 里按 id compaction-fit 追加覆盖层(同 id 后层覆盖前层)。
| 键 | 默认 | 说明 |
|---|---|---|
trim |
true |
对 compaction 请求做预算裁剪 |
suppressFabricatedOverflow |
true |
纠正 pi-ai 伪造溢出 |
suppressScope |
all |
all 或 compaction |
retryOnPromptTooLong |
true |
真拒绝时缩小重试 |
maxRetries |
2 |
最多重试次数 |
shrinkRatio |
0.5 |
每次重试预算乘以该系数 |
contextRatio |
0.9 |
未 pin 时预算公式中的窗口比例 |
safetyTokens |
8192 |
安全余量 |
maxOutputReserveTokens |
32768 |
输出预留上限 |
minBudgetTokens / maxBudgetTokens |
16000 / 1000000 |
预算夹取 |
minRetryBudgetTokens |
4000 |
重试预算下限 |
keepHeadGroups |
2 |
省略中间段时额外保留的开头组数 |
budgets |
空 | provider/model → prompt token 预算 |
未 pin 的模型会用 max(声明 contextWindow, 本进程观察到的最大成功 prompt) 估容量,再套 contextRatio、输出预留与安全余量。观察值来自正常完成的 usage 分片,进程重启后从声明窗口重新计。若网关实际窗口远大于声明值,建议在 budgets 里 pin 该网关实际接受过的 prompt 大小;写过大仍会真拒绝,再由插件缩半重试。
典型覆盖示例:
- id: compaction-fit
config:
budgets:
"qoder/deepseek-flash": 650000
观察与排错¶
调试时可查看 trace 日志(桌面端 info 日志可能被过滤):
%TEMP%\dsh-compaction-fit.trace.log
启动时会写 apply called;首次命中 compaction 请求写 intercepting llm/stream,之后可能出现 trimmed ...、suppressed fabricated overflow ... 或 retrying ... after: ...。trace 只记录路由、token 估算和错误摘要,不记录消息正文。
适用场景与限制¶
适合:在本地或自建 OpenAI 兼容网关上长期使用 DSH 压缩;摘要常因 prompt 过长失败,或 pi-ai 误报 overflow 导致成功回答被丢。
注意:
- 预算为启发式估算,非上游 tokenizer 精确值;靠
safetyTokens、contextRatio留余量。 - 中间历史被省略后,本次摘要不含那部分细节;原始事件仍在 session log,但不会回到模型上下文。
- 不处理图片 offload(可配合
dsh-compaction-image-offload);不拆分单个不可分单元里剩余的超大块。 - 裁剪与重试仅针对
purpose: 'compaction';伪造溢出纠正默认覆盖所有请求。
结尾¶
经过上面的步骤,你可以在不动 harness 本体的情况下,让 compaction 摘要更贴近网关真实限制,并在 pi-ai 误报时保留已到齐的回答。需要安装与默认配置时,用市场或 dsh plugin --profile web add dsh-compaction-fit;需要 pin 窗口或调 retry 策略时,在 cordis.patch.yml 里覆盖 compaction-fit 配置即可。