前言¶
DeepSeek Harness (DSH) 自带的上下文回收机制基于体积和模型摘要。当工具结果超过字符阈值时,中间部分会被截断;区域压缩则由模型撰写摘要来替代旧历史。前者无法区分“结果很大但依然需要”与“结果已过期”,后者容易引发摘要幻觉。
dsh-jev-prune 插件用 TypeSafe Jev 的结构化输出(noul / choice)替换了这两处的决策逻辑。遵循“模型不应生成的内容,模型就不会生成”的设计原则,它只决定保留或丢弃,不改变原始文本。区域压缩则使用代码生成的确定性回执,完全不含模型推理。
核心功能¶
该插件提供两层上下文压缩机制:
- 两层上下文压缩:同时处理结果修剪和回执压缩。
- 基于 Jev 结构化输出的结果修剪:判断每个工具结果是否仍被需要。
- 确定性回执压缩:在区域压缩中生成代码生成的回执,而非模型摘要。
- 保留原始文本:决策后的文本保持原样,不经过模型加工。
- 工具调用识别:支持对工具调用和结果进行匹配与管理。
工作原理¶
第一层:结果修剪¶
拦截点为 ctx.toolResultPruner.pruneSession。
DSH 默认逻辑是只要超过阈值就截断中间。该插件引入 Jev 判断:
* 需要的结果:无论多大,都不会被修剪。
* 已过期的结果:无论多小(除非短于 minCharsToPrune),都会被修剪。
* 无判断时:回退到 DSH 原有行为。
第二层:回执压缩¶
拦截点为 ctx.compaction.summarize 或 compactRegion。
DSH 默认逻辑是让模型阅读历史并写摘要。该插件将符合条件(见下文“门控”)的只读步骤移出表面。在并行批次中,仅替换符合条件的结果体为确定性回执。
确定性回执示例:
[已压缩 · 确定性回执] 原历史 s25–s27 是 1 次工具调用(共约 16489 字符输出),
为释放上下文已移出。以下为事实清单(工具名/入参/字符数/seq 由代码算出;模型原话逐字引用,不含任何推断):
· s25 模型原话(逐字引用):identifiers:把版本字符串拆成标识符。Next inc.js.
· s27 read:C:\Users\you\project\src\state.js → 16489 字符输出
原始事件仍完整保存在会话日志中(seqs 25–27)。需要内容时重跑相同命令/读取相同文件即可;本回执不含对内容的解释。
门控机制¶
默认策略保守,只有满足以下所有条件才会触发第二层压缩:
* 交集判断:结果需要性(result)和无副作用性(effect)均处于会话尾部的 compactQuantile 范围内。
* 工具白名单:工具不在 neverCompactTools 中(写类型调用被硬性排除)。
* 证据守卫:匹配 error / assert / fail / todo 的结果不移动。
* 长度限制:助手文本(text)或推理(reasoning)超过 maxStepTextChars / maxStepReasoningChars 不移动。
* 新鲜度:最尾部的 compactPreserveRecent 节点不移动。
* 平衡检查:两端需满足 DSH 工具配对平衡,跨度需节省至少 compactMinChars,回执长度需低于原始内容的 receiptMaxRatio。
依赖与安装¶
该插件依赖以下环境与库:
- Node.js:
^22.19.0 || >=24.0.0 - DSH Tools:
@deepseek-ai/dsh-tools(^0.1.5-rc.2 || ^0.2.0-rc.2) - Schemastery:
@deepseek-ai/schemastery(^3.18.2) - 许可证:MIT
安装时请确保环境版本符合上述要求。插件通过插件目录或 GitHub 仓库引入。