前言¶
在 DeepSeek Harness(DSH)里跑长会话时,上下文压缩是常见路径:官方 compaction-basic 会重放整段对话前缀去调摘要模型,本意是复用 provider 的 warm prefix cache。DeepSeek 的前缀缓存按思考档位(reasoningEffort / output_config.effort)分桶——同前缀、同档位才能命中;换了档位,cache_read_input_tokens 会归零,整段上下文按未缓存价重算。
官方压缩路径从会话请求头里只取了 provider / model,把 reasoningEffort 丢掉了;缺失档位由 LLM 层用适配器默认值补上。于是会话跑在 max 等非默认档位时,每次压缩都可能落到另一个缓存桶,长前缀反复全价计费。下面介绍社区插件 dsh-compaction-effort-inherit:在压缩请求上继承会话当前思考档位,零依赖、不修改官方插件文件。
这是什么¶
dsh-compaction-effort-inherit 由 rezon-aki 维护,归类为模型推理相关 DSH 插件。它只做一件事:当 DSH 发起 purpose: 'compaction' 的 LLM 流式调用时,把档位对齐到「上一个真正发出去的会话请求」所用的 reasoningEffort,使压缩摘要与主对话落在同一 DeepSeek 前缀缓存桶。
插件不写文件、不写设置、不加工具、没有客户端资源;卸载即净。许可证为 MIT,格式为 DSH bundle(cordis.patch.yml)。
问题从哪来:档位进缓存键¶
维护者在 README 中给出直接打 api.deepseek.com/anthropic(model deepseek-flash)的实测:同一段全新前缀,只改 output_config.effort 时,换档后 cacheRead 为 0(全量 miss);同档再次请求则大量 cacheRead(hit)。max_tokens 改变不影响命中(第 8 行仍 hit)。结论:档位进缓存键,每个档位各自留桶、互不干扰。
在真实 DSH 压缩路径(ctx.llm.stream + purpose: 'compaction')上,装插件前会话档位为 max 时 input 约 8030、cacheRead 0(MISS);装之后同会话 cacheRead 约 7552(HIT)。high 会话也能读到对应桶(约 7808 hit)。卸载后再次 MISS。第三行说明档位来自会话自身,而非写死某一值。
核心功能¶
- 仅拦截压缩调用:监听
llm/stream(global: true)。options.purpose !== 'compaction'时直接next(),主对话、子 agent、会话标题不受影响。 - 继承会话档位:从
ctx.sessions.get(sessionId)?.requestHeader?.()读取档位(与 agent-loop 解析规则一致:请求头带adapterDefaults.reasoningEffort: true时双方忽略该字段),若得到有效值则原地写入options.reasoningEffort。 - fail-open:监听体整体 try/catch,异常时放行,不阻断压缩。
- 不碰官方插件:不 patch、不包装、不改
compaction-basic配置;挂点与dsh-session-title、dsh-session-checkpoint-policy、dsh-llm/invariant同类 seam。 - 零依赖、零构建:手写 ESM,无运行时依赖,无构建步骤。仓库内
npm test为 7 条判定用例(node –test)。
实现要点(摘自 README):cordis 的 next 不接受参数,必须原地改 options,返回 next({ ...options }) 静默无效。若压缩配置了另一套 summarizationProvider/Model,继承档位可能不被目标模型支持(跨路由需自行评估)。
安装与启用¶
插件以当前 DSH 进程权限运行;安装前建议在 GitHub 查看源码与 MIT 许可证。社区目录页:skillhub.cn/plugins/rezon-aki/dsh-compaction-effort-inherit(独立站点,与 DeepSeek / 幻方无官方从属关系)。
方式一:DSH 插件面板 —— 侧栏 →「插件」→「添加插件」,填写:
github:rezon-aki/dsh-compaction-effort-inherit
方式二:命令行:
dsh plugin --profile web add github:rezon-aki/dsh-compaction-effort-inherit
装完重启 profile。
卸载:
dsh plugin --profile web remove dsh-compaction-effort-inherit
兼容性(见 package.json):DSH >=0.1.7-rc.2,profile 为 web;README 写明仅验证过 DSH 0.1.7-rc.2 + profile web。
典型用法¶
无额外配置项。安装并重启 profile 后,长会话在触发上下文压缩时自动沿用当前会话思考档位,无需改压缩策略或 maxTokens。
插件核心逻辑等价于(摘自 README):
ctx.on('llm/stream', (options, next) => {
if (options.purpose !== 'compaction') return next()
try {
const effort = inheritEffort(options, ctx.sessions.get(options.sessionId)?.requestHeader?.())
if (effort !== undefined) options.reasoningEffort = effort
} catch { /* fail open */ }
return next()
}, { global: true })
设计细节见仓库 docs/DESIGN.md;实测步骤与数字来源见 docs/ACCEPTANCE.md。
适用场景与注意¶
适合谁:使用 DeepSeek(经 DSH)且会话常设非默认思考档位(如 max)、又依赖 compaction-basic 做上下文压缩的开发者。当会话显式档位等于适配器默认档位(例如默认 high)时,压缩与主对话本就在同桶,可观测收益较小。
边界(README 原文):
- 不改变压缩行为本身:摘要区间、保留策略、
maxTokens都不动。 - 不处理
session-title:适配器对其强制off,且无复用前缀。 - 跨 summarization 路由时档位可能无效。
DSH 生态理念是「一切皆插件」;本插件是对官方压缩路径与 DeepSeek 分桶缓存之间缝隙的小补丁,星标与版本以 GitHub 为准(当前 package 版本 0.1.0)。
结尾¶
经过上面的步骤,在已验证的 DSH 版本与 web profile 下,安装 dsh-compaction-effort-inherit 即可让压缩摘要请求与会话共用同一思考档位,避免长前缀在每次压缩时被当作新桶全价重算。目录与源码:
- 目录页:https://www.skillhub.cn/plugins/rezon-aki/dsh-compaction-effort-inherit
- GitHub:https://github.com/rezon-aki/dsh-compaction-effort-inherit