Codex 的上下文指示器显示只用了 55%,窗口还剩将近一半,但任务进行到一半还是出现了 Compacting...。这不是错觉:决定是否压缩的计数器和界面显示的数字不是同一个,而在这个计数器里,模型之前的推理被算了两次。
本文说明差异从哪里来、如何识别这种情况,以及现在可以做哪些配置,让压缩不再在工作中途打断你。所有内容均于 2026年10月18日 在 openai/codex 仓库的 rust-v0.163.0 标签(当前稳定版)和 main 分支源码中核对。
为什么 Codex 在上下文只用了 55% 时就压缩?
因为压缩计数器在服务器已报告的总量之上,又加了一份对历史推理的估算,而这个总量本身已经包含了这些推理。结果在进度条远未填满时就超过了上限。
摘自 codex-rs/core/src/context_manager/history.rs:
if server_reasoning_included {
last_tokens.saturating_add(items_after_last_model_generated_tokens)
} else {
last_tokens
.saturating_add(self.get_non_last_reasoning_items_tokens())
.saturating_add(items_after_last_model_generated_tokens)
}
只有当服务器通过 x-reasoning-included 头告知推理已计入总量时,Codex 才会跳过这份估算。在 issue #53913 公布的复现中,连接和响应元数据里都没有这个头。没有它,之前每一轮的加密推理条目都会按内容长度估算,再加一次。
计数被放大了多少
下表数字由 issue 作者自行重建,加总恰好落在触发压缩的位置:
| 案例 | 进度条显示 | 重复加入的估算 | 压缩计数器 | 上限 |
|---|---|---|---|---|
| #53309,配置 1M 窗口 | 459,164(约 55%) | 324,498 | 788,399 | 784,800 |
| #53913,500k 窗口 | 255,367(54%) | 200,147 | 455,514 | 450,000 |
同一 issue 下 2026年10月15日 至 17日 的其他报告显示,在 56%、65% 和 66% 时就开始压缩,包括 Codex CLI 0.163.0。全部使用 gpt-6.1-sol,推理强度为 high 或更高。

如何确认是这个问题?
三个信号同时出现:进度条远低于 90% 就开始压缩,会话很长,推理强度为 high 或更高。查看版本和推理强度:
codex --version
grep -E 'model_reasoning_effort|model_auto_compact_token_limit|model_context_window' ~/.codex/config.toml
对话越长、强度越高,积累的推理条目越多,被重复计算的部分就越大。短会话或低强度几乎感觉不到这个问题。
调高 model_auto_compact_token_limit 能解决吗?
不能。配置值会被限制在上下文窗口的 90%,所以填更大的数字也不会把触发点往后推。摘自 codex-rs/protocol/src/openai_models.rs:
let context_limit = self
.resolved_context_window()
.map(|context_window| (context_window * 9) / 10);
...
config_limit.map_or(context_limit, |limit| std::cmp::min(limit, context_limit))
有一份报告(#54825)一直试到 64 位整数的最大值,实际上限仍是 90%。config.toml 里也没有关闭自动压缩的选项。
如何绕过 Codex 的过早压缩?
可以减少重复计算,并自己决定压缩发生的时机。以下三项调整,从最简单到最精细。
1. 调低推理强度
估算值随保存的推理大小增长,所以每次回复的推理越少,重复计算就越少。在 ~/.codex/config.toml 中:
model_reasoning_effort = "medium"
也可以用 /model 只在当前会话中切换。只在需要的阶段用 high,不要整段对话都用。
2. 在合适的停顿处手动压缩
自动压缩最糟的情况是落在长任务中间。在提出大改动之前,先运行:
/compact
由你选择时机,任务开始时上下文里只有摘要,被打断的概率随之下降。
3. 开启回合结束时压缩
Codex 有一个选项,会在最终回复之后、你处于两个任务之间时进行压缩,而不是等到工作中途的触发点:
model_post_turn_compact_threshold_percent = 70
该值是触发这次压缩的可用窗口百分比,范围 0 到 100。设为 0 或不设置即关闭。它使用同一个被放大的计数器,所以并不修正计数;改变的是时机:压缩发生在停顿时,而不是下一个任务中途。
官方修复什么时候发布?
尚未发布。issue #53309 自 2026年10月12日 起一直处于打开状态,截至 10月18日,添加估算的同一段代码仍在 main 分支上,也没有 OpenAI 关联的修复 PR。请关注该 issue,修复进入稳定版后,再把推理强度调回原来的水平。
压缩之前,值得先看看到底是什么占满了上下文。在 Verboo Code 中,/context 会显示出来,/compact 则在你决定时运行。



