前言¶
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 不受影响。
- 维护者:zyd232
- 社区目录:SkillHub 插件页
- 源码与文档:GitHub — zyd232/dsh-compaction-policy
- 当前 package 版本:
0.1.2(以仓库为准)
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 服务逻辑,行为要点如下:
- 上下文占用低于你配置的触发线时,插件直接返回「无需压缩」,DSH 原生的提前检查不会按旧公式抢先动手。
- 达到或超过触发线时,决策交回 DSH,与未装插件时一致。
- 插件内部出错时会自动让路,会话表现与未安装相同,避免拖垮会话。
- 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