前言¶
长会话是智能体开发里绕不开的问题:多轮工具调用、大量中间结果堆在上下文里,几轮之后窗口就满了。常见的做法是设一个阈值,触发后由系统自动摘要——模型本身没有发言权,压掉什么、保留什么全由外部规则决定。
dsh-asc 走的是另一条路:让模型自己决定何时压缩、压缩什么,并且每一次压缩都以持久会话日志替换事件的形式提交,可回放、可搜索、可逆。DSH 的理念是「一切皆插件」,压缩这件事同样可以插件化。下面介绍这个插件的定位、工作方式、安装步骤和注意事项。
这是什么¶
dsh-asc 全名 DeepSeek Harness Agentic Surface Compaction,是 DeepSeek Harness(下称 DSH)的上下文压缩插件,由 lmst2 维护,MIT 许可证。
它注册到 DSH 的 ctx.compaction 接口上,替代默认的 basic 压缩后端。核心思路是:压缩不是外部强加的规则,而是模型主动使用的一组工具。每次压缩都会作为日志中的替换事件(surfaceOp: replace)提交,原始内容保留在会话日志里,随时可以解压或全文搜索。
核心设计:模型自主与分层压缩¶
安装后插件在三个层面工作:
1、向系统提示词注入上下文管理纪律,包括判断规则、工具用法、分层压缩节奏,模型从第一轮对话起就主动管理上下文;
2、上下文使用率高时按需注入 nudge 提示。nudge 有节奏门控,迭代 nudge 还要求真实的 token 增长,不会每轮反复催促;
3、溢出或手动压缩时提供确定性降级——直接走 LLM 摘要,可选挂载上游修剪器时还会做工具结果修剪,不依赖模型配合。
分层压缩分三级:
1、T1 全细节:把已消耗的原始工作内容收进 checkpoint;
2、T2 提炼决策:把沉淀下来的 T1 内容提炼成决策;
3、T3 事实索引:把 T2 内容进一步收拢成事实索引。
摘要被复用得越多就越薄。每个 checkpoint 文本都带有主题和 Compaction id,当界面上已有的摘要指向需要的细节时,模型直接解压那一块;只有当没有任何可见摘要说明细节位置时才用 context_search;解压永远一层一层进行。
五个模型工具¶
插件向模型提供五个工具:
| 工具 | 用途 |
|---|---|
context_status |
查看上下文用量、分层 checkpoint、系统/对话组成、推荐区间、最近的 surface 节点 |
context_compress |
用自己写的 checkpoint 替换一段 surface 区间(支持批量、tool-call 对自动扩展、质量门控) |
context_decompress |
撤销一次压缩:原文回到 checkpoint 原来的位置(tier 感知;full: true 可到原始内容) |
context_recap |
不解压原文,重读 checkpoint 摘要 |
context_search |
对整份日志做全文搜索,包括已压缩的内容 |
压缩如何落地:事件溯源¶
底层基于事件溯源实现。一次压缩在日志里是一笔事务:
compaction/start → compaction/summary → replaced user/message → compaction/end
这带来四个性质:
1、无副作用状态文件——压缩只产生日志事件,不产生额外状态;
2、可逆——解压通过回放日志中被遮蔽的事件完成,并提交一笔原位替换事件;
3、可审计——谁压缩了什么、摘要全文、token 成本,全部记录在日志中;
4、可搜索——全量日志全文搜索覆盖已压缩的原始内容,压缩不会造成信息丢失。
安装与启用¶
前置条件:已安装 DeepSeek Harness(dsh CLI 可用);Node.js ^22.19 或 >=24。
从 npm 安装(推荐):
dsh plugin --profile <name> add dsh-asc
要使用比 npm 发布更新的提交,从 GitHub 安装:
dsh plugin --profile <name> add github:lmst2/dsh-asc
要修改插件本身或参与贡献,从源码构建:
git clone https://github.com/lmst2/dsh-asc.git
cd dsh-asc
pnpm install
pnpm build
dsh plugin --profile <name> add "link:$(pwd)"
dsh plugin 会把插件加入 profile,并根据包内的 dsh.bundle 声明自动启用,工具和系统提示词随 profile 一起加载。安装后需重启运行中的 DSH 服务。
接下来,在同一 profile 的 cordis.patch.yml 里禁用默认 basic 后端——ctx.compaction 同一时间只允许一个 provider:
- id: compaction-basic
disabled: true
还可以按需挂载运行时不变量检查和全文搜索后端:
- insert:
- id: dsh-asc-invariant # 运行时不变量检查(可选,推荐)
name: "dsh-asc/invariant"
- id: session-query-sqlite # context_search 全文后端(可选)
name: "@deepseek-ai/dsh-session-query-sqlite"
典型用法¶
经过上面的步骤,安装并重启后不需要额外配置。插件的运行循环是:把已消耗的原始工作收进 T1 checkpoint,把沉淀下来的 T1 内容提炼成 T2 决策,再把 T2 内容收进 T3 事实索引。
模型侧的典型动作:
1、用 context_status 查看当前用量和分层 checkpoint 分布;
2、用 context_compress 压缩不再需要原文的区间;
3、需要细节时优先解压对应 checkpoint;找不到线索时用 context_search 在全量日志里搜索;
4、用 context_recap 重读摘要而不解压原文。
适用场景与注意¶
适合的场景:
1、长会话、多轮工具调用的 DSH 使用者,上下文里堆满工具结果和中间输出;
2、希望压缩过程可审计、可回溯的团队——每次压缩的执行者和 token 成本都在日志里;
3、想自己控制压缩策略的开发者——从源码安装即可修改。
注意事项:
1、插件以当前 dsh 进程的权限运行,安装前请检查源码与许可证;
2、ctx.compaction 只允许一个 provider,必须先禁用 compaction-basic;
3、压缩内容不会丢失:原文保留在会话日志中,可随时解压或搜索;
4、许可证为 MIT;算法思想受 opencode-acp(AGPL)启发,仅使用其思想、未使用其源码,详见仓库中的 NOTICE 文件。
结尾¶
dsh-asc 的价值在于把压缩的判断权交给模型,同时用事件溯源保证每一步可回放、可搜索、可逆。如果你在 DSH 上跑长会话,值得一试。
插件收录在社区目录:https://www.skillhub.cn/plugins/lmst2/dsh-asc
源码仓库:https://github.com/lmst2/dsh-asc