dsh-context-compressor
No description
- Stars
- 0
- Language
- JavaScript
- Created
- Aug 20, 2026
- Updated
- Aug 20, 2026
Introduction
dsh-context-compressor
小模型上下文压缩插件,面向 DeepSeek Harness Web GUI。
上下文一长、小上下文模型就装不下——点一下会话标题栏的「压缩」按钮:插件把整段对话总结成几句话,新建一个同工作区的会话,把摘要作为第一条消息注入,然后自动切过去继续聊。原对话原样保留在侧边栏,一个字都不丢。
一键安装:
dsh plugin --profile web add <仓库或本地路径>例如本地路径:
dsh plugin --profile web add D:\CBN-HT\Desktop\AI编程\dsh插件\dsh-context-compressor装完重启 harness(dsh web)、刷新页面,会话标题栏右侧会出现「压缩」按钮。
功能
- 一键压缩:标题栏「压缩」→ 内联确认「压缩后新建会话继续?」→ 自动完成并切换。
- 几句话的摘要:摘要请求让模型把对话压成紧凑中文要点(3~10 条、每条一句话),关键信息(路径、命令、函数名、错误信息、数字、决定、用户偏好)原样保留——新会话上下文极小,小模型轻松装下。
- 新建会话继续:新会话与原文同工作区、继承 agentPreset、
parentSession指向原会话(侧边栏里嵌套显示来源),标题自动带上「· 续」;原会话作为完整历史保留,可随时回去翻。 - 摘要当背景、不当指令:注入消息带
<compacted-summary>标记和"已建立背景"前言,模型把它当作既有上下文直接续接,不会当成新任务去执行。 - 复用会话自身模型:摘要请求走 harness 的
ctx.llm,跟随会话路由的 provider/model;回放保留会话自身的 system + tools + 消息前缀,命中提供方 KV 缓存(同一会话连续压缩基本不重复烧输入钱)。 - 不碰 API key、不改写原会话:key 只存在于服务器,由 harness 凭据服务解析;原会话事件日志只读。
与内置压缩的关系
harness 自带 compaction-basic(自动按上下文阈值压缩 + /compact 命令),那是原地压缩:保留最近尾部,把更早的对话替换成一条结构化 checkpoint 消息。
本插件是另一条路径:整段对话压成几句话 → 开新会话注入。适合上下文窗口很小、连结构化 checkpoint 都嫌长的模型(比如自定义的小模型)。两者不冲突,可以同时装:
- 想要"原地瘦身、接着聊" → 用内置的
/compact或自动压缩; - 想要"干净的新会话 + 几句摘要" → 用本插件的「压缩」按钮。
工作原理
- 点击「压缩」→ 浏览器调
POST /api/dsh-context-compressor/compress,带上当前sessionId。 - host 端从会话事件日志取 surface,最新优先回放到字符上限(
maxInputChars,超出丢最旧),接上压缩指令,用会话自身的 system + tools + 前缀调ctx.llm.stream()。 - 模型输出中文要点摘要。host 端新建同 cwd 会话(
parentSession指向原会话),把「前言 +<compacted-summary>摘要</compacted-summary>」作为第一条 user 消息 append 进去并 flush 落盘。 - 浏览器刷新会话列表 →
open()切到新会话 → 标题加「· 续」。原会话不动。
新会话第一条消息会由用户手动发送;发消息时 harness 自动为该会话创建 agent(懒恢复),摘要随历史一起进入上下文。
设置(可选)
在 ~/.dsh/settings.yaml 添加命名空间 dsh-context-compressor:
dsh-context-compressor:
enabled: true # 总开关
maxInputChars: 20000 # 回放字符上限(超出时丢弃最旧消息)
maxTokens: 2048 # 摘要输出 token 预算
summarizationProvider: '' # 留空 = 跟随会话路由的 provider/model
summarizationModel: ''
不配置即用以上默认值。summarizationProvider / summarizationModel 需成对填写(例如 asdf / qwen38),用于覆盖"跟随会话模型"的默认行为。
仓库布局
lib/index.js— 插件 host 半区:设置命名空间 +POST /api/dsh-context-compressor/compress路由(回放 → 摘要 → 新建会话 → 注入 → flush)。lib/client.js— 浏览器半区:conversation.session.header.actions链式条目(「压缩」按钮 + 内联确认 + 切换新会话 + 标题续接)。test/smoke.cjs—node test/smoke.cjs:host 路由全路径(禁用/坏请求/会话不存在/忙/空/成功/摘要失败)+ client 注册与 SSR 渲染断言 +compressRequest请求断言。
已知限制
- 手动触发:只提供按钮,不自动触发。需要按上下文阈值自动压缩的话,harness 内置
compaction-basic已经做了,直接配置即可。 - 忙时拒绝:模型正在回复(open turn)或该会话已有压缩进行中时,路由返回
busy,按钮显示失败并可重试。 - 摘要跟随会话路由模型:如果会话从没发过消息(没有 request header),且未配置
summarizationProvider/Model,压缩会失败——本会话能点按钮说明肯定有历史,正常不会触发。 - 跨会话不迁移临时状态:新会话只有摘要里的内容,未落进摘要的临时变量/中间结论不会自动带过去;摘要质量决定续接质量。
- 浏览器半区手动维护:
lib/client.js为手写 bundle(与 dsh-auto-translate 同一技术路线),不经过构建步骤;改动后直接生效,冒烟测试兜底。
License
MIT