Codex 上下文只用了 55% 就自动压缩:原因与解决办法
返回博客
文章codexagente de programaçãodev toolstroubleshooting

Codex 上下文只用了 55% 就自动压缩:原因与解决办法

Mafra2026年10月18日阅读约 4 分钟

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,498788,399784,800
#53913,500k 窗口255,367(54%)200,147455,514450,000

同一 issue 下 2026年10月15日 至 17日 的其他报告显示,在 56%、65% 和 66% 时就开始压缩,包括 Codex CLI 0.163.0。全部使用 gpt-6.1-sol,推理强度为 high 或更高。

流程图:Codex 因历史推理被重复计算而在离上限很远时压缩;调低推理强度,在长任务前用 /compact 手动压缩;不想中途被打断,就开启回合结束时压缩
从症状到解决办法:三步加一个分支。

如何确认是这个问题?

三个信号同时出现:进度条远低于 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 则在你决定时运行。

喜欢这篇文章吗?
把知识分享给你的朋友。
// 继续阅读

相关文章