dsh-context-compaction-optimizer
Verifieddsh-context-compaction-optimizer · v0.1.0 · Apache-2.0 · Web UI
DSH plugin: mark messages as invalid so an operator annotation digest steers what a compaction checkpoint absorbs. Cache-preserving: appends after the cached prefix, never rewrites history.
Install
dsh plugin add dsh-context-compaction-optimizer Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-context-compaction-optimizer
把一个回合标记为「无效」,让 DSH 压缩时不把它写进检查点——不删除会话里的任何东西。
压缩会把一段较早的对话总结成检查点并替换掉它。这一段里的所有内容都会被总结,包括那些本来就不值得记住的跑题、死胡同和粘贴进来的素材。本插件让操作者把这些交流标出来,并告诉摘要模型:把它们当作从未写过。
机制是标记,而不是删除。没有任何消息被移除、重排或改写,所以提供方的前缀缓存照样命中,一次压缩的开销与从前大致相同。
它不保证什么
在依赖它之前请先读这一段。这些是实测到的边界,不是免责声明。
- 排除不是绝对的。 检查点由语言模型按指令写出,而模型有时不遵守。实测中,一次被标记回合的内容全部消失,但一个顺带的 URL 残留了下来;另一次运行里,整个被标记的回合被当作未标记内容照常摘要。
- 失败有两种形态,哪一种出现无法预测。 一是排除根本不执行——整个回合被照常摘要(实测于被标内容占据会话实质的夹具)。二是排除执行了,但该回合的细节仍会漏出。漏出什么并不固定:当前渲染实测只漏出一个 URL 域名,而上一版渲染在同一夹具上漏出了整段识别结论(书名、译者、版本与四个链接)。两次都没有逐字泄漏正文。
- 因此,若某个回合的结论本身就是错的,不要指望排除能拦住它——它仍可能被检查点继承。
- 最近的一次交流永远不会被摘要。 DSH 会把最近的上下文逐字保留、不送进摘要器,所以标记保留尾部里的回合不会生效。面板会事前说明这一点,并在压缩之后报告哪些标记没有生效。
- 标记只改变压缩吸收什么。 它不改变压缩何时发生、覆盖哪一段,也不改变压缩算法。
安装
dsh plugin --profile <profile> add dsh-context-compaction-optimizer
本插件以真实 bundle 方式安装,通过包自带的 cordis.patch.yml 生效。不要再往你的 profile patch 里加一行挂载——那会加载两次宿主半侧、注册两个流监听器,并注入两次清单。
安装后需重启宿主:宿主半侧在进程启动时加载。
使用
标记
- 回复底部的快捷按钮——直接标记该回合。
- 会话标题栏的按钮——打开回合列表,查看并标记任意回合。列表一行一个回合,▸ 展开可见其全部中间步骤(只读)。
触发
- 自动——DSH 自行触发压缩时,标记自动生效。
- 手动——输入框敲
/cco-compact,或按面板底部的「确认压缩」。
标记本身不触发任何动作,只在压缩真正发生时生效。两个标记入口作用于同一个单位(回合),因此不会互相矛盾。
设置
位于 设置 → 插件 → 压缩优化器。
| 设置 | 默认 | 含义 |
|---|---|---|
| 将标注注入压缩 | 开 | 总开关。关闭后标记不产生任何效果。 |
| 将未标记的消息视为无效 | 关 | 把排除应用到没有任何标注的消息上。开启后,一段你从未标注过的会话会排除全部内容。 |
| 记录缓存核算 | 关 | 为每次压缩保留 token 与缓存命中读数,供诊断使用。 |
还有一个键可在 $DSH_HOME/settings.yaml 中设置,但没有开关——它在同一排除集合的两种内部门面之间选择,操作者没有任何可据以决定的信息:
context-compaction-optimizer:
digestFormat: spans # 或:anchors
工作原理
- 标注按消息存储(
sessionId+messageId)在 DSH 存储域中。标记一个回合就是对它所有消息的一次写入。 - 压缩发生时,插件在摘要请求中追加一份简短的清单,位置紧邻压缩指令之前。
- 该点之前的每条消息保持原有位置,因此提供方的前缀缓存照样命中。清单是唯一新增的未缓存输入——实测约等于它自身的长度。
- 清单以位置、角色与逐字开头指明被排除的消息,并要求模型把它们当作从未写过。
单位是回合:标注按消息存储,但呈现与操作以「你发一条 + agent 回答的全部」为单位——一个回合通常横跨几十条消息,逐条标记等于用十几次点击表达一个判断。
开发
npm test # 单元与契约测试;不依赖外部环境
npm run build # 产出 lib/index.js 与 lib/client.js
npm run smoke # 对运行中的宿主做实机挂载检查(默认 http://127.0.0.1:3080)
npm run measure # 从已有会话日志生成缓存 / 泄漏报告
npm test 无需构建、无需宿主。npm run smoke 需要宿主在跑,是安装后的验证步骤。
兼容性
- DSH
0.1.5-rc.*,Node.js 20+。 - 依赖 harness 的
llm/streamwaterfall 与 agent preset 花名册。 - 不替换也不子类化
compaction-basic;与官方压缩栈共存,对后端无耦合。
许可证
Apache-2.0——见 LICENSE。