dsh-compaction-policy:把 DSH 上下文压缩触发点交还给你

前言

DeepSeek Harness(DSH)在对话变长时会自动压缩(condense)较早的历史,用摘要换上下文空间。对上下文窗口明显小于约 330k token 的模型,内置策略往往会在界面上的上下文环还显得「半空」时就触发压缩,而且压缩后几步内可能再次触发,形成反复压缩。

改配置文件通常帮不上忙:在 DSH 0.2 里,压缩策略嵌在每个 agent preset 里,preset 是整包定义,单改某个字段要么改不动,要么整包替换并锁死 preset、跟不上 DSH 更新。dsh-compaction-policy 由社区维护者 zyd232 发布,分类属于「记忆」相关能力:不改磁盘上的配置,而是在 DSH 运行时调整压缩引擎的触发条件,并可按 provider / model 分别设置。

这是什么

dsh-compaction-policy 是一款 DSH 插件,核心作用是推迟「过早」的自动上下文压缩,并把「何时开始压缩」的阈值放到你可控的参数上(默认仍接近 DSH 习惯的 80% 窗口占比)。它只改变何时触发压缩;压缩后保留多少历史、摘要怎么写,仍由 DSH 自带的 compaction 后端决定。紧急恢复(请求过长被拒后的处理)和手动 /compact 不受影响。

DSH 生态强调「一切皆插件」;SkillHub 等目录是社区站点,与 DeepSeek / 幻方无官方从属关系。

为什么内置策略会「提前」压缩

每步请求前,DSH 会估算下一请求的 token 量,并与如下触发线比较:

trigger = min(window × 0.8, window − output reserve − 65536)

其中 window 是 DSH 所知的模型上下文长度,output reserve 是为模型回复预留的 token,65536 是 DSH 固定留出的安全边距。窗口较小时,减固定 65536 往往比「80% 窗口」更紧,实际触发点会远低于 80%。README 给出的对照示例如下(具体数值以官方文档为准):

Context window DSH 实际触发约 80% 约为
128k ~62k (49%) 102k
150k ~84k (56%) 120k
256k ~190k (74%) 205k
1M ~678k (68%) 800k

若你主要使用约 1M 级超大窗口,内置行为已接近 80%,通常不必装本插件。

核心功能

插件在运行时包装各 agent preset 的 compaction 服务逻辑,行为要点如下:

  1. 上下文占用低于你配置的触发线时,插件直接返回「无需压缩」,DSH 原生的提前检查不会按旧公式抢先动手。
  2. 达到或超过触发线时,决策交回 DSH,与未装插件时一致。
  3. 插件内部出错时会自动让路,会话表现与未安装相同,避免拖垮会话。
  4. Settings 侧栏增加 Compaction policy / 上下文压缩策略 面板(随 DSH 语言设置,含中文),修改后立即生效,无需重启;每项可 restore default。

安装与启用

安装命令须使用你实际运行的 profile(桌面端常用 desktop,dsh web 常用 web,或自定义 profile 名)。安装后必须重启 DSH——插件列表仅在启动时加载;无需新开对话,已有对话下一步即可生效。

dsh plugin --profile <your profile> add github:zyd232/dsh-compaction-policy

卸载:

dsh plugin --profile <your profile> remove dsh-compaction-policy

版本说明(摘自 README):已在 DSH 0.2.1-rc.2 上验证;package.json 中 dsh.verifiedWith 同为该版本,兼容声明为 >=0.2.0-rc.2。更早于 0.2.0-rc.2 的 DSH 不支持(0.2 才有 per-preset compaction 引擎)。若插件对你当前版本无效果,属于设计的降级行为而非崩溃,可向仓库 issue 附上 dsh --version 输出。

判断是否加载成功:Settings 中出现压缩策略入口;实际上下文环应能越过以往「半满就掉」的位置,压缩发生时的请求占比应接近你设的 Trigger ratio。

典型用法与配置

打开 Settings,在左侧找到 Compaction policy。主要字段如下:

字段 默认值 含义
Enable on 关闭则恢复 DSH 原生压缩行为
Routes * 生效路由:provider 或 provider/model,逗号或空格分隔;* 表示全部
Trigger ratio 0.8 达到窗口该比例时触发压缩(0.8 即 80%)
Output reserve (tokens) 24576 为模型回复预留的 token;DSH 内置为 65536,调低此项是缓解「过早触发」的关键

选型建议(来自 README):

  • Trigger ratio:一般保持 0.8;极小窗口可试 0.7 多留余量。
  • Output reserve:设为「你 realistically 预期的最长回复 + 少量 slack」;常见聊天与编码 16384–32768 多够用,写超长文件可适当加大;过小可能导致回复无处安放、请求被拒。
  • Routes:仅对部分 provider 生效时可收窄,例如 llama-cpp、ollama、openai,或 ollama/* 覆盖该 provider 下全部模型。

默认 reserve 24576 时,对窗口大于约 123k 的模型,触发线可稳定落在窗口的 80% 附近。

验证是否按新策略工作:查看 session log 中的 compaction 记录;或在压缩前一刻用「请求 token ÷ 模型 window」估算,应接近你的 ratio,而非旧的 ~50% 一带。

适用场景与注意

更适合谁

  • 本地或小上下文 hosted 模型(窗口明显小于约 330k token)。
  • 上下文环常在「看起来还空」时被压缩,且压缩后几步内反复发生。

局限与风险

  • 只移动触发点,不定制摘要内容与保留策略。
  • 窗口过小、连系统提示与 tool schema 都放不下时,DSH 本就不会配置主动压缩,插件也不强行干预。
  • 实现依赖 DSH 内部 API(如 agentPresets.serviceFor(…, 'compaction') 与 compactIfNeeded);未来 DSH 若改接口,插件可能暂时失效直至更新。
  • 插件在当前 dsh 进程权限下运行,安装前请自行审阅 GitHub 源码 与仓库中的许可证(LICENSE),再决定是否用于生产环境。

结尾

若你的主要痛点是「DSH 太早把对话压成摘要」,而不是「摘要写得不好」,dsh-compaction-policy 提供一条不锁死 preset、不改全局配置文件的运行时路径:按路由调节触发比例与 output reserve,把压缩时机拉回你期望的窗口占比附近。

  • 目录页:https://www.skillhub.cn/plugins/zyd232/dsh-compaction-policy
  • GitHub:https://github.com/zyd232/dsh-compaction-policy
羽毛球分组比赛记分
小程序二维码

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

Xiaoye