为什么 OpenCode 上下文没到 100% 就被压缩了?
· 4 min read
TUI 右下角才显示 60%、70%,自动 compact 突然就触发了——这是用 OpenCode 最高频的困惑。原因不止一个,按可能性从高到低排:
- 给输出 token 预留 buffer:TUI 显示 80% 触发压缩,真正留给"历史"的安全位可能只有 50% 左右。
- Tool calls 占空间:一次
Bash输出几百行、一次大文件读取直接干到 10k+ tokens,这才是隐形杀手。 - Provider 实际限制比标称小:qwen3.7-plus 在 OpenCode 上硬卡 200k(issue #30838),即使模型标称 1M。
- Compaction 循环 bug:issue #29450 报过一句话烧光 200k 的 case,先升级 / 换 provider 再说。
- 手动控制:用
/compact自己把握时机,/compact 50保留最近 50 条消息不压。
用 OpenCode 一段时间,几乎每个人都问过同一个问题:TUI 右下角的上下文百分比才 60%、70%,怎么突然就被压缩了?
这个问题的答案不是单一的——OpenCode 显示的百分比、模型的 context window、自动 compact 的触发条件是三件不同的事情,下面把它们拆开讲。
1. 给输出 token 预留 buffer(最常见)
一次完整的请求 = 输入历史 + 模型输出 + tool calls。OpenCode 算"还能不能塞下"时,必须把预想的输出长度也算进去,否则半句话截断就是事故。
所以 TUI 显示 80% 触发压缩,真正留给"历史"的安全位可能只有 50% 左右——剩下 30% 全是给"还没发生的输出"留的 buffer。
这是设计,不是 bug。任何 coding agent 都是这么算的(Anthropic API、Cursor、Copilot 同理),只是不显式告诉你预留了多少。