Back to home@qwert702

dsh-context-compressor

No description

Stars
0
Language
JavaScript
Created
Aug 20, 2026
Updated
Aug 20, 2026
GitHub repo

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 或自动压缩;
  • 想要"干净的新会话 + 几句摘要" → 用本插件的「压缩」按钮。

工作原理

  1. 点击「压缩」→ 浏览器调 POST /api/dsh-context-compressor/compress,带上当前 sessionId
  2. host 端从会话事件日志取 surface,最新优先回放到字符上限(maxInputChars,超出丢最旧),接上压缩指令,用会话自身的 system + tools + 前缀调 ctx.llm.stream()
  3. 模型输出中文要点摘要。host 端新建同 cwd 会话(parentSession 指向原会话),把「前言 + <compacted-summary>摘要</compacted-summary>」作为第一条 user 消息 append 进去并 flush 落盘。
  4. 浏览器刷新会话列表 → 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.cjsnode 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