dsh-context-compressor
压缩dsh web的上下文
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 18, 2026
- Updated
- Aug 18, 2026
Introduction
📦 dsh-context-compressor
DeepSeek Harness Web UI 自动上下文压缩插件
Token 使用量达到模型最大上下文的 60% 时,自动将老旧对话浓缩为摘要,释放上下文空间,对话永不中断。
TypeScript · ESM · Zero 运行时硬依赖 · 手机 / 电脑通用
✨ 特性
- 全自动触发:每次 Agent 交互前的 pre-request 钩子自动检查 Token 用量
- 60% 智能阈值:达到模型最大上下文(默认 128K)的 60% 触发压缩(可配置)
- 防过早压缩:会话轮次 ≥ 10 才压缩(
minConversationTurns可配) - 保守压缩:只压缩「第 3 条起、最早 30%」的老旧非系统对话,保留最近 70% 消息;system 消息永不参与
- 模型摘要:
deepseek-chat生成核心事实摘要,失败自动回退gpt-4o-mini - UI 提示:压缩后插入
📦 上下文已自动压缩,释放了约X% Token空间 - Token 进度条:插件面板实时显示当前 Session 的 Token 使用进度
- 绝不中断对话:压缩失败(如 API 超时)只记录日志并提示「自动压缩暂时不可用」,主流程不受影响
🚀 安装
手机 Termux 和电脑都用同一个 GitHub 链接,即装即用、无需构建:
手机(Termux)
dsh plugin --profile web add https://github.com/vkxkzsp769-cloud/dsh-context-compressor.git
电脑(web + tui 可同时装)
# 需先安装 dsh:npm install -g @deepseek-ai/dsh
dsh plugin --profile web add https://github.com/vkxkzsp769-cloud/dsh-context-compressor.git
dsh plugin --profile tui add https://github.com/vkxkzsp769-cloud/dsh-context-compressor.git
说明:
- 从 GitHub 拉取即装即用,不需要下载文件、不需要构建;
- web 与 tui 是两个独立环境,要哪个装哪个,可同时装;
- 重启界面后日志出现
[Compressor] 已激活: 阈值=60% ...即安装成功。
⚙️ 配置
| 配置键 | 默认值 | 说明 |
|---|---|---|
enabled | true | 总开关 |
thresholdRatio | 0.6 | Token 使用率达到该比例触发压缩 |
minConversationTurns | 10 | 最小会话轮次,防过早压缩 |
maxContextTokens | 128000 | 模型最大上下文(tokens) |
compressRatio | 0.3 | 压缩区域比例(压缩最早 30%,保留最近 70%) |
keepSystemMessages | true | system 消息永不参与压缩 |
model | deepseek-chat | 摘要主模型 |
fallbackModel | gpt-4o-mini | 主模型失败时的备用模型 |
apiBaseUrl | '' | OpenAI 兼容端点;留空自动选择(deepseek / gpt) |
apiKey | '' | API Key;留空读取 DEEPSEEK_API_KEY / OPENAI_API_KEY |
summaryPrompt | 内置中文 Prompt | 摘要指令(200 字核心事实) |
summaryMaxChars | 200 | 摘要输出上限(字符) |
requestTimeoutMs | 30000 | 摘要请求超时 |
minCompressionIntervalMs | 300000 | 两次压缩最小间隔(冷却) |
tokenizer | tiktoken | tiktoken(BPE)或 heuristic(len/4 估算) |
uiEnabled | true | 是否插入 UI 通知与进度条 |
🔧 工作原理
pre-request 钩子
│
├─ 读取会话历史 + Token 用量
├─ 用量 ≥ 60%? ── 否 → 跳过(每次仍刷新进度条)
├─ 轮次 ≥ 10? ── 否 → 跳过
├─ 冷却期内? ── 是 → 跳过
├─ 定位区域:索引 ≥2 的早期非系统消息(最早 30%)
├─ 摘要:deepseek-chat(失败回退 gpt-4o-mini)
├─ 替换:[start..end] → 1 条 role=system 摘要
└─ UI:📦 通知 + 刷新 Token 进度条
🧩 目录结构
dsh-context-compressor/
├── package.json # 插件元数据(含 dsh.bundle / dsh.client 官方声明)
├── manifest.json # 便携式插件清单
├── cordis.patch.yml # DSH 层栈注册
├── AGENTS.md # 60% 自动压缩终端规则(dsh-agent-instructions 加载)
├── src/
│ ├── index.ts # 生命周期:activate / deactivate + apply
│ ├── config.ts # 配置类型、默认值、校验
│ ├── compressor.ts # 核心压缩算法
│ ├── dsh-api.ts # DSH API 模拟适配层(含 TODO 替换指引)
│ ├── tokens.ts # Token 计数(tiktoken + 回退)
│ ├── llm.ts # 摘要适配器(OpenAI 兼容 + 本地模拟)
│ ├── ui.ts # UI 桥(通知 + Token 进度数据)
│ └── client/ # 浏览器端(进度条面板 + 通知渲染)
├── scripts/smoke.mjs # 端到端冒烟脚本
└── tests/ # node:test 单元测试
🛠 开发
npm install # 安装开发依赖(tiktoken 可选)
npm run build # 编译宿主端 + 客户端
npm test # 构建 + 单元测试(12 项)
npm run smoke # 端到端冒烟
依赖极简:宿主端核心零运行时硬依赖;
tiktoken为可选依赖,缺失时自动回退启发式估算。
🤝 适配 DSH 真实 API
核心压缩逻辑只依赖 src/dsh-api.ts 的 DshApi 接口。接入真实 DSH 时按 README 中的「DSH API 替换指南」替换即可,压缩算法无需改动(getSessionHistory → ctx.sessions、getTokenCount → ctx.tokenMeter、replaceMessages → 会话 surface 区间替换、摘要 → ctx.llm.stream() 等)。
📄 License
MIT