Codex 上下文窗口:怎么开到 100 万 token
Codex 出厂的上下文上限是按性能和成本调过的,不是模型的物理上限。想让它一次记住更多代码、更多命令输出、更长的对话历史,得自己把上限抬上去——以及知道抬上去要付出什么。
还没装 Codex?先看Codex 安装总教程。装完不知道怎么用,看Codex 使用教程。
三行配置直接抄
打开 ~/.codex/config.toml,把下面三行加进去。保存之后退出客户端重开,再新建一个会话——已经开着的会话不会跟着变。
~/.codex/config.toml
model = "gpt-5.6-sol"
model_context_window = 1000000
model_auto_compact_token_limit = 900000
模型名换成你实际要用的那个,窗口数字也要跟着换。
What each line does
三行分别在干什么
三行不是可以随便调换的等价设置:第一行决定天花板存不存在,第二行决定你要用到多高,第三行决定什么时候开始收拾旧对话。
为什么留两层余量
窗口比标称值低 5 万
防止实际计费口径和你算的不完全一致时直接撞墙。宁可少用一点,也不要在任务跑到一半时被截断。
压缩阈值再低 10 万
压缩历史这个动作本身要读旧内容、写摘要,也要吃 token。卡到窗口边缘才触发,压缩自己就没地方站了。
model
选模型
上下文窗口是模型自带的能力。模型本身不支持这么大的窗口,后面两行写多大都没有意义。
model_context_window
设定上下文预算
告诉 Codex 这次可以用多大的上下文,单位是 token。这是你给它划的上限,不是模型的物理上限。
model_auto_compact_token_limit
设定压缩触发点
用量到这个数就自动压缩历史。要留在窗口下面一截,给压缩动作本身留出余地。
The classic mistake
最容易踩的坑:写错位置就不生效
这三项必须放在配置文件的顶层,也就是文件里第一个方括号标题出现之前。TOML 的规则是:一旦出现方括号段落,后面所有的键都归这个段落管,直到下一个段落开始。
不生效
[某个段落]
some_key = "..."
# 这两行现在属于 [某个段落]
# 不是全局配置,Codex 读不到
model_context_window = 1000000
model_auto_compact_token_limit = 900000
生效
# 顶层,任何段落标题之前
model = "gpt-5.6-sol"
model_context_window = 1000000
model_auto_compact_token_limit = 900000
[某个段落]
some_key = "..."
如果你用 profile 把不同项目的配置分开管,那就在对应的 profile 段落里各写一份,顶层那份只作为默认值。写在顶层却期待某个 profile 生效,同样属于位置写错。
Try before you commit
只想试一次,不改默认值
命令行直接覆盖,退出这个会话就恢复原样。-c接的是同名配置项,写法和配置文件里一样。
建议的顺序
先用这条命令跑一天真实任务,确认体感和账单都能接受,再往配置文件里落。改默认值容易,改回来时你已经忘了原来是多少。
终端
codex -m gpt-5.6-sol \
-c model_context_window=1000000 \
-c model_auto_compact_token_limit=900000
Not working?
改完没生效,按顺序查这四件事
这个顺序是按出现频率排的。绝大多数「配置无效」最后都停在前两条,不必一上来就怀疑模型或账号有问题。
- 1
没重启客户端
改配置不会热加载。必须完全退出 Codex 客户端再重新打开,光保存文件不生效。
- 2
还在老会话里
重开之后要新建会话。接着聊之前那个会话,仍然按旧的上限走。
- 3
写进段落里了
这三行前面只要出现过方括号标题,它们就归那个段落管,全局配置读不到。
- 4
模型本身不支持
给一个 20 万窗口的模型配 100 万,多出来的部分并不存在,请求会被截断或直接报错。
What it costs
开大之后要付出什么
上下文不是越大越好。官方把默认值调小是有原因的,三笔账要一起算。
压缩机制不是缺陷,是设计。它主动扔掉噪音,让模型把注意力留给真正相关的内容。
每一轮请求都要把上下文里的内容重新送一遍。窗口塞到 90 万再问一句话,这一句话的成本远不是「一句话」的成本。
上下文越长,第一个字吐出来的等待越久,来回对话的体感会明显变钝。
超长上下文里塞满不相关的旧文件和旧命令输出,模型反而更容易被无关内容带偏。压缩机制存在的意义之一,就是主动扔掉噪音。
Decide first
什么时候值得开
先确认自己属于哪一类再动手。默认值确实是调过的,抬上去之前要有具体理由。
值得开
- 大型 monorepo,一次任务要横跨十几个包才看得明白
- 长时间的重构或迁移,中途丢掉早期约定就要返工
- 工具输出特别大:整份构建日志、大批测试报告需要一起看
不值得开
- 日常修 bug、写单个功能,默认窗口完全够用
- 只是怕它忘事:先把关键约定写进项目说明文件,让它每次都读到,比撑大窗口便宜得多
- 还没算过账:先按当前用量跑几天,确认真的撞到了上限再改
FAQ
Codex 上下文常见问题
Codex 的上下文窗口默认是多少?
Codex 出厂的上下文上限是按性能和成本调过的,通常小于模型本身支持的窗口,也会随版本调整。想知道当前默认值,以你所用版本的官方文档和客户端内显示为准,不要照抄别人截图里的数字。
改完 config.toml 没生效,最常见的原因是什么?
按顺序查四件事:一是没有完全退出客户端再重开;二是重开后仍在使用旧会话,需要新建会话;三是配置写到了某个方括号段落下面,不在文件顶层;四是所选模型本身不支持这么大的窗口。
上下文开大了会更费钱吗?
会。每一轮请求都要把上下文里已有的内容重新送一次,上下文越满,同样一句话的开销越高,首字响应也越慢。开大之前建议先用命令行参数试跑几天真实任务,确认账单和体感都能接受。
model_auto_compact_token_limit 设成多少合适?
设成比窗口低一截的数,不要贴着窗口写。压缩历史本身也要读旧内容、写摘要、消耗 token,卡在边缘才触发时压缩过程会没有余地。窗口 100 万时,压缩阈值取 90 万是一个稳妥的起点。
是不是所有模型都能开到 100 万 token?
不是。窗口大小由模型决定,配置文件只能在模型支持的范围内做限制,不能凭空扩大。换模型时先确认该模型官方记录的窗口,再按同样的思路往下留出余量。
只想试一次,不想改默认配置怎么办?
用命令行参数临时覆盖。启动 Codex 时带上 -m 指定模型、-c 指定同名配置项即可,退出这个会话就恢复原样,不会影响 config.toml 里的默认值。
Official references
本文依据与继续阅读
模型名称、上下文窗口大小和配置项都会随版本更新。文中的数字用于说明配置方法,实际数值请以你所用版本的官方文档和客户端内显示为准。
