dsh-compaction-pro
High-fidelity, faithful, bilingual, recursive compaction backend for DeepSeek Harness.
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 17, 2026
- Updated
- Aug 19, 2026
Introduction
dsh-compaction-pro
DeepSeek Harness 的高保真上下文压缩后端 ——
dsh-compaction-basic的无损升级替换。 保留官方全部压力/保留/token 计量策略,只把"摘要质量"这一环换掉。
它解决什么问题
长会话里 dsh 会触发上下文压缩(compaction),把早期对话压成一个 checkpoint。官方后端 dsh-compaction-basic 的摘要提示词是英文通用模板,有两个痛点:
- 丢精确值:数字、文件路径、命令串、错误串、标识符常被"整理"或改写 —— 对量化/编程 Agent 是致命的(一个版本号、一个股票代码、一条命令被改掉,下游就错了)。
- 只出英文:中文用户的会话被压成英文摘要,回读割裂。
dsh-compaction-pro 只改 summarize() 这一环(官方文档明确标注的唯一子类钩子),其余策略全部继承官方实现。
与官方 dsh-compaction-basic 对比
| 维度 | dsh-compaction-basic(官方唯一实现) | dsh-compaction-pro |
|---|---|---|
| 摘要提示词 | 英文通用模板 | 高保真模板:强制保留精确数值/路径/命令/标识符 |
| 语言 | 强制英文输出 | 跟随会话语言(中文会话→中文摘要,代码/标识符逐字保留) |
| 决策还原 | 仅"关键决策" | 决策 + 理由 + 被否决的替代方案(贴合真实推理方式) |
| 大区段处理 | 单次摘要,易在 maxTokens 处被截断 | 可选递归分块:先压每块、再合并,长会话不丢信息 |
| 工具结果 | 笼统保留 | 单列「关键工具输出」段(返回结构/重要返回值/文件片段) |
| 自定义 | 无 | customInstruction 可整段替换提示词 |
| 策略/保留/计量 | 官方实现 | 完全一致(继承自 BasicCompactionEngine) |
一句话:官方做"压得动",pro 做"压不歪"。
快速开始
方式 A:本地开发(无需构建、无需发布)
dsh 的 loader 直接加载 .ts 源文件(内部 transpile;官方 dev 用 node --import tsx)。
把下面这段加进你的 ~/.dsh/cordis.patch.yml(升级安全,重启自动重挂):
若你的 dsh 构建只认已编译 JS,先
npm run build再把name指向lib/index.js即可,其余不变。
- id: compaction-pro
name: 'C:/Users/<you>/dsh-plugins/dsh-compaction-pro/src/index.ts'
config:
faithful: true
recursive: true
summaryLanguage: auto
thresholdRatio: 0.8
retainRatio: 0.16
maxTokens: 8192
⚠️ 必做(否则 dsh 启动即崩):本插件与内置
dsh-compaction-basic都注册同一个ctx.compaction服务,二者不能同时启用。cordis 会在启动时抛"ctx.compaction already provided"类错误。请在同一个cordis.patch.yml里显式禁用 basic(下面两步放一起即可):
# 1) 禁用内置后端
- id: compaction-basic
disabled: true
# 2) 注册 pro 后端
- id: compaction-pro
name: 'C:/Users/<you>/dsh-plugins/dsh-compaction-pro/src/index.ts'
config:
faithful: true
recursive: true
summaryLanguage: auto
thresholdRatio: 0.8
retainRatio: 0.16
maxTokens: 8192
方式 B:从 npm 安装(推荐)
dsh plugin --profile web add dsh-compaction-pro
安装后,仍需在 ~/.dsh/profiles/web/cordis.patch.yml 里禁用内置
dsh-compaction-basic(见上方「⚠️ 必做」说明),否则两个 ctx.compaction
后端冲突、dsh 启动即崩。本插件已在 apply() 里打印启动自检横幅提示该冲突。
配置项
| 配置 | 类型 | 默认 | 含义 |
|---|---|---|---|
faithful | boolean | true | 强制保留精确数值/路径/命令/标识符,绝不改写 |
summaryLanguage | 'en' | 'zh' | 'auto' | 'auto' | 摘要语言;auto 跟随会话语言 |
recursive | boolean | true | 大区段先分块压、再合并,避免截断丢信息 |
chunkMessages | number | 40 | recursive 开启时每个分块的消息数 |
customInstruction | string | — | 整段替换内置摘要提示词 |
thresholdRatio | number | 0.8 | 上下文窗口的压缩触发比例(继承自官方) |
retainRatio | number | 0.16 | 保留近期尾部的比例(继承自官方) |
maxTokens | number | 8192 | 摘要生成上限(继承自官方) |
summarizationProvider / summarizationModel | string | '' | 留空则复用会话路由模型,否则钉死摘要模型 |
工作原理
BasicCompactionEngine (官方:压力/保留/token 计量 + 事务)
▲ extends
ProCompactionEngine (本插件:只重写 summarize() 钩子)
▲ 重写
proSummarize()
├─ 复用会话自身 system/tools/消息前缀 → ctx.llm.stream({ purpose: 'compaction' })
│ (前缀缓存复用,不失效 provider 热缓存)
├─ 追加高保真提示词(faithful + 双语 + 决策/理由 + 工具输出)
└─ recursive:区段过大时先分块压、再合并
- 注册为
ctx.compaction,取代内置后端;所有调用方(compactIfNeeded/compactNow//compact命令)无感切换。 - 摘要走
ctx.llm.stream()直连,可在llm/stream处统一拦截;abort/资源释放会中止进行中的摘要。
开发 & 构建
npm install # 安装 typescript / tsx(peer 由 dsh 运行时提供)
npm run typecheck # 类型检查(无产物)
npm run build # 产出 lib/(发布用)
本地联调:编辑 src/*.ts 后重启 dsh 即可(loader 直跑 .ts)。
⚠️ 开发陷阱(已踩,省你时间)
这些坑在官方文档里不会写,是实际对着已发布包类型定义踩出来的:
-
dsh-compaction-basic/src/summarizer子路径在已发布包里是死链接。 官方 README 暗示可以从…/src/summarizer拿SummarizationInput/SummaryResult, 但已发布的 npm 包只含lib/+lib/types/,没有src/;而且根入口@deepseek-ai/dsh-compaction-basic不 re-export 这两个类型。 所以消费者无论类型检查还是运行时都拿不到它们。本插件的解法:在src/types.ts里逐字镜像这两个类型(只依赖dsh-llm里确实导出的ContentBlock/Message/ToolSchema/TokenUsage),完全绕开死子路径。 -
schemastery v3 没有静态
literal/union工厂。z.literal('x')、z.union([...])会报Property 'literal' does not exist。 字符串枚举改用z.string()并在注释里写明取值集合;object/number/string/ boolean/array才是可用的静态工厂。 -
类型检查要对着真实 dsh 运行时类型做。
@deepseek-ai/*装在 dsh 自己的node_modules里。最稳的做法是把 dsh 运行时的@deepseek-ai作用域整坨拷进本插件的node_modules/@deepseek-ai(约 28MB), 再普通tsc解析即可,不必折腾paths/baseUrl的 Windows 绝对路径坑。 -
相对导入用
.ts扩展名 +allowImportingTsExtensions。import { x } from './foo.ts',配合tsconfig的allowImportingTsExtensions: true与noEmit: true(发布构建时再切到.js扩展名)。
当前验证状态
- ✅ 类型检查通过:对着真实 dsh 运行时类型(
@deepseek-ai/dsh-compaction-basic的BasicCompactionEngine、protected summarize()钩子签名、z.object配置形态)零报错。 这证明了继承关系、override签名、配置 schema 形状都正确。 - ✅ 运行时验证通过(2026-08-17):在真实 dsh web 实例(profile
web,端口 8787) 干净启动、零错误日志;dsh --profile web --dump-config确认compaction-pro作为唯一ctx.compaction提供方生效、compaction-basic已被禁用;浏览器实测/compact命令可发现并触发。 - ⚠️ 尚未端到端验证:摘要 LLM 的实际输出质量(faithful / 双语 / 递归分块)需要在
配好 API Key 的真实会话里跑一次
/compact才能确认。插件本身已确认正确加载与接管, 这一步不影响"它作为后端生效"的结论。
兼容性
- 测试版本:
dshv0.1.0-rc.6(DeepSeek Harness 开发者预览期)。 - API 稳定性警告:dsh 处于早期、官方明确会有 兼容性破坏性变更。本插件通过继承
BasicCompactionEngine并复用其内部实现细节(src/types.ts镜像了官方未导出的SummarizationInput/SummaryResult,构造函数需剥离 pro-only 配置键)。上游一旦改动 这两个内部契约,本插件可能静默失效或崩溃——届时请升级到对应的dsh-compaction-pro版本。README 的「开发陷阱」一节列出了全部已知耦合点,升级 dsh 后请优先核对。
许可证
MIT © dsh-compaction-pro contributors
标签:
deepseek-harness·dsh-plugin·compaction·context·summarization