dsh-compaction-fit:让 DSH 上下文压缩在本地 OpenAI 兼容网关上跑完

前言

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 即可启用默认配置。

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 预算。超预算时:

  1. 先按字符上限截断超长工具结果、assistant 文本、reasoning 和工具参数;
  2. 仍不够则按「工具调用 + 结果」整组省略中间历史,在组边界插入省略说明;
  3. 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 配置即可。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye