🎯 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只是在发送请求前将剪枝的内容替换为占位符。

主要组件:

  1. Compress Tool — 模型用来高质量地总结旧对话的技术工具(比OpenCode的标准压缩更智能)。
  2. Deduplication — 删除重复的工具调用(相同工具、相同参数),只保留最新的。
  3. 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运行
  }
}

许可证: AGPL-3.0


🔗 有用链接