dsh-compaction-effort-inherit:压缩时沿用会话思考档位,保住 DeepSeek 前缀缓存

前言

在 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。第三行说明档位来自会话自身,而非写死某一值。

核心功能

  1. 仅拦截压缩调用:监听 llm/stream(global: true)。options.purpose !== 'compaction' 时直接 next(),主对话、子 agent、会话标题不受影响。
  2. 继承会话档位:从 ctx.sessions.get(sessionId)?.requestHeader?.() 读取档位(与 agent-loop 解析规则一致:请求头带 adapterDefaults.reasoningEffort: true 时双方忽略该字段),若得到有效值则原地写入 options.reasoningEffort。
  3. fail-open:监听体整体 try/catch,异常时放行,不阻断压缩。
  4. 不碰官方插件:不 patch、不包装、不改 compaction-basic 配置;挂点与 dsh-session-title、dsh-session-checkpoint-policy、dsh-llm/invariant 同类 seam。
  5. 零依赖、零构建:手写 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
羽毛球分组比赛记分
小程序二维码

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

小夜