Skip to content
dsh.fish
Bundle

dsh-context-compressor

Context compression for small-context models on the DeepSeek Harness Web GUI: one click condenses the whole conversation into a few sentences, opens a fresh session in the same workspace, and re-injects the summary as the first message so a small model keeps working with a clean, compact context.

Source
qwert702
stars
1 stars
License
MIT
Updated
Updated 5 days ago

Readme

# 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`:

```yaml
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

Install

dsh plugin --profile web add github:qwert702/dsh-context-compressor#3fa2699db3d1318bc6ce1be026d939c318fce280

Profile: web

Source