🎯 OpenCode插件系列: DCP(Dynamic Context Pruning)
类型: Token优化插件 代码库: https://github.com/Opencode-DCP/opencode-dynamic-context-pruning NPM包:
@tarquinen/opencode-dcp星标: 2.3k+ ⭐
1. 这是什么插件?
DCP (动态上下文剪枝) 是一个通过智能管理对话上下文来自动减少token消耗的插件。核心思想是在向LLM发送请求之前,从上下文中移除不再需要的旧工具输出。 ⚠️ 重要: 原始会话历史不会改变——DCP只是在发送请求前将剪枝的内容替换为占位符。
主要组件:
- Compress Tool — 模型用来高质量地总结旧对话的技术工具(比OpenCode的标准压缩更智能)。
- Deduplication — 删除重复的工具调用(相同工具、相同参数),只保留最新的。
- Purge Errors — 在一定轮次后(默认: 4轮)删除出错工具的大规模输入。
2. 有什么用?
在以下场景中使用它:
- ✅ 节省30-50%的tokens在长会话中
- ✅ 防止幻觉由过时上下文引起
- ✅ 智能控制上下文窗口大小
- ✅ 通过glob模式保护重要工具输出不被剪枝
- ✅ 手动压缩通过
/dcp compress - ✅ 监控token消耗通过
/dcp context和/dcp stats
技术特性:
- 范围模式 (默认) — 将对话的连续区域压缩为摘要
- 消息模式 (实验性) — 单独压缩单个消息
- 分层压缩 — 当新压缩与旧压缩重叠时,旧摘要会被合并到新摘要中(信息通过多层保存)
- 受保护工具 — 保护特定工具输出不被压缩(默认:
task,skill,todowrite,todoread,compress,batch,plan_enter,plan_exit,write,edit)
3. 怎么用?
简单安装
opencode plugin @tarquinen/opencode-dcp@latest --global
这会将插件自动安装到全局配置中。
或手动添加到 ~/.config/opencode/opencode.json:
{
"plugin": ["@tarquinen/opencode-dcp@latest"]
}
配置
创建 ~/.config/opencode/dcp.jsonc文件:
{
"$schema": "https://raw.githubusercontent.com/Opencode-DCP/opencode-dynamic-context-pruning/master/dcp.schema.json",
"enabled": true,
"debug": false,
// 压缩设置
"compress": {
"mode": "range", // 或 "message" (实验性)
"permission": "allow", // "allow" / "ask" / "deny"
"maxContextLimit": 100000, // 触发压缩的上下文上限
"minContextLimit": 50000, // 提示用户的最小限制
"nudgeFrequency": 5,
"protectUserMessages": false,
"protectedTools": []
},
// 自动策略
"strategies": {
"deduplication": {
"enabled": true,
"protectedTools": []
},
"purgeErrors": {
"enabled": true,
"turns": 4
}
}
}
可用的斜杠命令
| 命令 | 功能 |
|---|---|
| `/dcp` | 显示可用命令 |
| `/dcp context` | 显示当前会话的token分解 |
| `/dcp stats` | 所有会话的累积统计 |
| `/dcp sweep` | 从最后一条用户消息开始删除所有工具 |
| `/dcp sweep 10` | 仅删除最后10个工具 |
| `/dcp compress [focus]` | 运行一次压缩(可选指定内容) |
| `/dcp decompress |
恢复指定ID的压缩 |
| `/dcp recompress |
重新应用恢复的压缩 |
| `/dcp manual [on/off]` | 启用/禁用手动模式 |
对于小型模型:
如果使用GitHub Copilot模型或本地模型,请降低限制:
{
"compress": {
"maxContextLimit": "80%", // 模型上下文窗口的百分比
"minContextLimit": "25%",
"modelMaxLimits": {
"openai/gpt-5.3-codex": 120000,
"anthropic/claude-sonnet-4.6": "80%"
}
}
}
4. 什么时候用?
在以下场景使用:
- ✅ 进行长会话(超过一小时的工作)
- ✅ 在同一会话中读取大量文件
- ✅ 处理大型代码库如base-layer
- ✅ 使用按token付费的API(Anthropic、OpenAI)
- ✅ 注意到模型在长对话中"失去焦点"
- ✅ 工具报错并希望删除大输入
不要使用的场景:
- ❌ 处理简单短任务
- ❌ 使用按请求统一收费的提供商(如GitHub Copilot per-request)
- ❌ 使用统一定价的提供商(如Cerebras)
- ❌ 短会话中开销差异不大
⚠️ 重要注意事项
缓存的权衡:
- 没有DCP: 缓存命中率约 90%
- 有DCP: 缓存命中率约 85% 这意味着会损失一些缓存读取,但在长会话中会获得更大的token节省。
手动模式:
如果想100%控制剪枝,启用 manualMode:
{
"manualMode": {
"enabled": true,
"automaticStrategies": true // 只让dedup和purgeErrors运行
}
}