- Home
- Plugins
- Sessions & Messages
- caopazi-compact
caopazi-compact
jiahaozhang516-svg/caopazi-compact
Compacts a session at 70% context and appends mechanically extracted anchors — first user message, hard requirements, paths, commands, error codes and unresolved items — to the summary; it reuses DSH built-in compaction-basic and adds a /compact-status command.
Install
dsh plugin --profile web add github:jiahaozhang516-svg/caopazi-compactREADME
caopazi-compact
在上下文达到 70% 时自动压缩,并用机械锚点保住关键对话。复用 DSH 原生的
compaction-basic,不引入第二个压缩器,也不替换 ctx.compaction。
它做了什么
-
策略:在 preset 配置解析时,把 preset 内嵌套的
compaction-basic行调到thresholdRatio: 0.7、retainRatio: 0.15,并强制auto: true。 -
锚点:在同一个隔离组里挂一个
augment行,包住引擎唯一公开的扩展点summarize()。等模型正常写完摘要后,把一段有上限的「必须保留」事实机械 追加到 checkpoint 末尾——不依赖模型是否愿意采纳:- 第一条用户消息(原始任务)逐字;
- 用户消息里的硬性要求/禁止/约定(正则抽取);
- 路径、命令、错误码、URL;
- 未完成事项;
- 上一份 checkpoint 的目标/约束/未完成三节。
摘要调用本身不改输入,provider 的 KV cache 和原生 prompt 都不受影响。
-
可见性:
/compact-status显示用量、阈值、剩余空间和上次压缩。
为什么不是新引擎
preset 的 compaction 组是 isolate: compaction 的,一个上下文只能有一个
ctx.compaction。再挂一个会冲突,/compact 也会找错对象。这里只改策略和摘要输入。
配置
参数写在包自己的 cordis.patch.yml(bundle patch)里;想覆盖时在 profile 的
cordis.patch.yml 里按 id 追加完整 config(patch 是整段替换,不是深合并)。
- insert:
- id: caopazi-compact
name: caopazi-compact
config:
thresholdRatio: 0.7 # 70%
retainRatio: 0.15 # 尾部逐字保留
anchors:
enabled: true
budgetTokens: 1500 # 锚点上限
# 可选:透传给 compaction-basic
# headroomTokens: 65536
# summarizationProvider: ai-hub
# summarizationModel: glm-5.3-flash
阈值按模型声明窗口计算:min(window × 0.7, window - 输出预留 - headroom)。
1M 窗口就是 70 万;如果实际可用窗口更小,应先改模型的 contextWindow。
安装
cp -r caopazi-compact "$DSH_HOME/profiles/ondevice/plugins/caopazi-compact"
cp -r caopazi-compact "$DSH_HOME/profiles/ondevice/node_modules/caopazi-compact"
把包名加进 profile 的 dependencies(file:./plugins/caopazi-compact),并把
caopazi-compact 放进 dsh.profile.bundles,位置在
@deepseek-ai/dsh-web-app 之后:
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"caopazi-compact"
]
顺序是硬约束:bundle patch 按 bundle 顺序应用,排在 web-app 之后才能用 id patch
命中已经插入的 preset-* 行。bundle patch 给四个 preset 加了
inject: [caopaziCompactReady]:preset 会等 overlay 把 internal/config 钩子注册
完、并发布这个服务之后,才解析自己的 config.plugins。
包里还有 caopazi-compact-fallback 行:主插件若没起来,它会在 15 秒后放行 preset,
退回原生 80%,不会卡死新建会话。
然后重启 DSHM。
回滚
从 dsh.profile.bundles 删掉 caopazi-compact 并重启。插件行和四条 gate 行都
在同一个 bundle patch 里,会一起消失,不会留下等不到的服务。插件自身没有持久
状态,压缩结果仍是普通的 compaction/* 会话事件。
测试
node --test test/anchors.test.mjs test/patch.test.mjs
Related plugins
billion-context
ranxianglei/billion-context
dsh-web-ui (dsh-chat-recovery)
zhu1090093659/dsh-web-ui
dsh-synapse
liangmianya/dsh-synapse
dsh-archive-manager
michengai/dsh-archive-manager