1. Codex 长上下文为什么总在关键时刻被压缩
如果你最近在用 Codex 处理大仓库重构、几十页 PDF 需求文档、或者跨十几个文件的调用链分析,大概率遇到过这种情况:聊到一半,模型突然开始"忘事",前面确认过的接口签名、目录结构、命名约定全被压缩掉了,你不得不重新贴一遍上下文。这不是模型变笨了,而是默认的上下文窗口和自动压缩阈值在起作用。
Codex 里 GPT-5.6 这类模型默认上下文窗口大约 235K,一旦接近这个量级,系统就会触发自动压缩(auto compact),把历史对话摘要化。压缩本身做得不错,但信息丢失是客观存在的,尤其是代码这种对精确性要求极高的内容,一个字段名被摘要成"某个配置项",后面生成的代码就可能跑偏。
解决办法是显式打开 1M 上下文,并把自动压缩阈值往后推。这两个动作都落在~/.codex/config.toml里,对应两个参数:model_context_window和model_auto_compact_token_limit。这篇就围绕这两个值怎么填、填完怎么验证、以及怎么通过 TaoToken 统一 Key 通道接进来,给一套可以直接抄的配置。
适合人群:需要在长文档、大仓库场景下保持连续推理的开发者;已经在用 Codex 但被压缩打断过思路的人;想统一管理多个模型 API Key 的团队。
2. 动手前先把 TaoToken 通道准备好
Codex 本身是客户端,真正干活的是背后的模型 API。如果你直接用官方通道,Key 分散、额度难管、切换模型要改一堆环境变量。我习惯用 TaoToken 做统一入口,一个 Key 打通对话、编码、Agent 几类调用,配置里只维护一个 base_url 和一个 api_key,换模型只改 model 字段。
TaoToken 的 API 地址是https://taotoken.net/api,注意这个地址不带任何查询参数,直接作为 OpenAI 兼容的 base_url 使用。官网在https://taotoken.net/?utm_source=taotoken_aicg_blog_end,注册和查看额度都在那边。
具体要准备的东西:
第一,一个 TaoToken 的 API Key。登录后进控制台,在 API Keys 页面创建一个,复制出来形如sk-开头的字符串。这个 Key 就是后面 config.toml 里要填的凭证。
第二,确认你要用的模型名。Codex 配置里model字段填的是模型标识,比如gpt-5.6-sol这类。TaoToken 的模型列表在文档里能查到,模型对话页面也能直接试。
第三,把 base_url 指向 TaoToken。Codex 支持自定义 provider,配置里加一段[model_providers.taotoken],把base_url设成https://taotoken.net/api,env_key指向你存放 Key 的环境变量名。
提示:Key 不要硬编码进 config.toml 明文里,用环境变量引用更安全。Codex 读取的是环境变量名,不是 Key 本身。
这一步做完,你就有了一条稳定的 API 通道,接下来所有上下文参数的调整都在这条通道上生效。
3. config.toml 完整骨架与两个关键参数取值
先找到配置文件。Mac 上打开终端:
open ~/.codex/config.tomlWindows 在 PowerShell 里:
notepad $env:USERPROFILE\.codex\config.toml如果文件不存在,手动创建.codex目录再建config.toml即可。Mac 下.codex是隐藏目录,在 Finder 里按shift + command + .可以显示隐藏文件。
下面是一份可以直接抄的骨架,重点看model_context_window和model_auto_compact_token_limit两行:
# ~/.codex/config.toml model = "gpt-5.6-sol" model_provider = "taotoken" # 模型上下文窗口阈值:1M,即 100 万 token model_context_window = 1000000 # 触发自动压缩的阈值:90 万 token model_auto_compact_token_limit = 900000 [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "chat"两个参数的取值逻辑要说清楚,不然填错反而更糟。
model_context_window是告诉 Codex"这个模型能吃下多少 token"。默认 235K 是保守值,改成 1000000 就是显式声明 1M 窗口。这个值不能超过模型真实支持的上限,GPT-5.6 系列支持 1M,所以填 1000000 是安全的。填大了不会报错,但超出真实能力时请求会被服务端拒绝。
model_auto_compact_token_limit是"占用到多少就开始压缩"。默认值比较靠前,聊到 20 万左右就可能触发。Tibo 推荐的 90 万是个平衡点:留出 10 万 token 的缓冲给系统提示、工具调用返回和下一轮生成,既尽量晚触发压缩,又不会因为顶到 100 万上限导致请求失败。
| 参数 | 默认量级 | 建议值 | 作用 |
|---|---|---|---|
| model_context_window | 235000 | 1000000 | 声明模型窗口上限 |
| model_auto_compact_token_limit | 约 200000 | 900000 | 推迟自动压缩触发点 |
如果你处理的文档特别长,可以把压缩阈值再往后挪到 950000,但缓冲只剩 5 万,风险是单轮生成较长时容易触顶。我的建议是先用 900000 跑一段时间,观察/status里的占用曲线再微调。
环境变量那边,把 Key 写进 shell 配置:
export TAOTOKEN_API_KEY="sk-你的key"Windows PowerShell 用:
$env:TAOTOKEN_API_KEY = "sk-你的key"想持久化就写进~/.zshrc或系统环境变量面板。
4. 验证 1M 上下文是否真的生效
配置改完,重启 Codex 让 config.toml 重新加载。然后随便提一个问题,比如让它读一个长文件,接着输入斜杠命令:
/status这个命令会显示当前会话的上下文占用情况。如果配置生效,你会看到窗口上限显示为 1M 量级,而不是之前的 235K。实际占用可能显示 800 多 K,因为系统提示、工具定义、历史消息本身会占掉一百多 K,这是正常的,不代表配置没生效。
再做一个更直接的验证:连续追问,观察压缩是否被推迟。以前聊到 20 万 token 左右就会看到"上下文已压缩"的提示,现在应该能撑到接近 90 万才触发。你可以用一段长文本反复追问细节,比如贴一份 5 万字的接口文档,然后问第 37 个接口的鉴权方式,看它能不能准确回答而不需要你重新贴。
如果/status里窗口还是 235K,检查三件事:config.toml 是否在正确的.codex目录下;model字段是否指向支持 1M 的模型;重启是否彻底(有些终端会话会缓存旧配置)。
验证通过后,长文档场景的体验会有明显变化。以前需要分三次贴的代码库,现在一次贴完还能保持前后引用一致。代价是 token 消耗速度变快,1M 窗口意味着单次请求可能烧掉几十万 token,额度掉得比短上下文快得多,这点要有心理预期。
5. 配置不生效与常见报错排查
报错一:model_context_window exceeds model limit
说明你填的值超过了模型真实支持的上限。检查model字段是不是写成了不支持 1M 的型号,或者把 1000000 误写成了 10000000。改回 1000000 再试。
报错二:请求返回 401 或invalid api key
TaoToken 通道的 Key 没读到。确认env_key里写的环境变量名和实际 export 的名字一致,注意大小写。在终端里echo $TAOTOKEN_API_KEY看有没有输出。如果输出为空,说明环境变量没生效,重新 source 一下 shell 配置。
报错三:connection refused或超时
base_url写错了。TaoToken 的 API 地址是https://taotoken.net/api,不要多加斜杠或路径。注意这个地址不带查询参数,直接作为 base_url 使用。
现象四:配置改了但/status没变化
最常见的原因是改错了文件。Codex 读的是用户目录下的~/.codex/config.toml,不是项目目录里的。另外 TOML 对缩进和段落顺序敏感,[model_providers.taotoken]这段要放在顶层,不要嵌在其他表下面。改完用cat ~/.codex/config.toml确认内容正确。
现象五:压缩仍然频繁触发
检查model_auto_compact_token_limit是不是被其他配置覆盖了。有些版本里项目级配置会覆盖用户级配置,如果你在项目目录下也有.codex/config.toml,以项目级的为准。把两个参数都写进项目级配置再试。
注意:1M 上下文不是免费的。窗口越大,单次请求的 token 消耗越高,尤其是把整个仓库塞进去的时候。建议按需开启,日常小任务用默认窗口更省额度。
6. 把 Key 和通道固定下来,后续只调参数
配置这件事一次做对,后面就省心了。我的做法是把 TaoToken 的 Key 放在环境变量里,config.toml 只引用变量名,这样换 Key 不用改配置文件。模型和上下文参数则按场景分两套:日常用默认窗口,遇到大仓库分析再切到 1M 配置。
如果你还没建 Key,去控制台创建一个,地址是https://taotoken.net/api-keys,创建后复制出来填进环境变量。接入细节和字段说明在文档里,https://taotoken.net/doc有完整的 provider 配置示例。想先试试模型对话效果,可以直接在https://taotoken.net/chat里发几条消息,确认通道通了再落到 Codex 配置。
长期跑编码任务和 Agent 的话,Coding Plan 那条线更适合,https://taotoken.net/coding-plan里有套餐说明,配合 1M 上下文能把大仓库连续推理的体验拉满。配置本身不复杂,难的是把 Key 管理、通道选择、上下文参数这三件事分开维护,别混在一起改。分开之后,调窗口就只是改两个数字的事。