Codex 做一个大型项目做到一半,突然开始忘记前面改过的文件;你刚刚解释过的架构,它又重新问一遍;终端里还多了一句:上下文已经被压缩。

这时候很多人会想到一个问题:

如果把 Codex 的上下文窗口从 272K 改成 372K,是不是就能让它记住更多代码?

答案没有那么简单。

本文针对 Codex CLI 0.146.0 做一次实验,尝试把 GPT-5.6-Sol 的本地模型元数据调整到 372000,并解释这项配置到底改变了什么、没有改变什么,以及如何验证它是否真的有用。

先给结论:

这不是模型升级,也不是让服务端凭空获得更大的上下文能力。它修改的是 Codex 客户端读取到的模型元数据和上下文预算。是否真正可用,最终要看服务端能不能接受这么大的请求。

Codex 上下文窗口的三层限制

一、当前 Codex CLI 的默认值

先确认本机版本:

codex --version

本文实测版本:

codex-cli 0.146.0

再查看当前模型目录:

codex debug models

GPT-5.6-Sol 的默认元数据类似这样:

{
  "slug": "gpt-5.6-sol",
  "context_window": 272000,
  "max_context_window": 272000,
  "effective_context_window_percent": 95,
  "multi_agent_version": "v2"
}

因此默认有效窗口大约是:

272000 × 95% = 258400

这里的 95% 并不是模型的原始限制,而是 Codex 为系统提示词、工具调用和模型输出预留空间后,认为可以用于输入的比例。

二、372000 和 353400 分别是什么?

实验配置将本地模型目录中的窗口改成:

{
  "context_window": 372000,
  "max_context_window": 372000,
  "effective_context_window_percent": 95
}

于是得到:

372000 × 95% = 353400

这几个字段需要分开理解:

字段示例值含义
context_window372000模型元数据中的原始窗口
max_context_window372000客户端允许配置到的最大窗口
effective_context_window_percent95预留系统、工具和输出空间后的比例
有效窗口353400372000 × 95%

272K 与 372K 上下文窗口对比

需要注意:

353400 是 Codex 客户端计算出来的有效窗口,不等于服务端模型一定支持 353400 tokens。

三、它到底能解决什么问题?

如果任务经常接近上下文上限,这项配置可能带来一些帮助:

  • 长时间运行的 Codex 任务可以保留更多历史信息;
  • 大型代码仓库分析时,可以一次读取更多文件;
  • 长日志排查时,较晚触发上下文压缩;
  • 多轮重构任务中,模型不必过早重新建立项目背景。

但它不会改变:

  • GPT 模型本身的推理能力;
  • 模型的代码能力;
  • 服务端真实上下文上限;
  • 不同任务之间的永久记忆;
  • 模型理解超长内容时的注意力分配。

更准确的表述是:

它可能扩大 Codex 的“上下文预算”,但不会扩大模型的“理解能力”。

如果你的普通任务只使用几万 tokens,那么修改后基本感觉不到差别。

四、为什么要同时修改 max_context_window

Codex 客户端通常会把运行时配置和模型元数据的最大值进行比较:

最终窗口 = min(配置值, max_context_window)

如果只在 config.toml 中写:

model_context_window = 372000

但模型目录仍然是:

"max_context_window": 272000

那么 372000 可能会被客户端限制回 272000。

因此实验需要同时调整模型目录中的两个窗口字段。

五、开始前的注意事项

这是一项实验性配置,建议先确认:

  • 使用的是 Codex CLI 0.146.0 或相近版本;
  • 已经备份 config.toml
  • 已经备份模型目录文件;
  • 知道自己使用的是官方服务还是兼容模型网关;
  • 不要在生产任务中直接测试;
  • 不要把 API Key、Cookie、Token 或私有代码发到截图和评论区。

如果服务端真实上限低于 372000,本地配置不会改变服务端限制,可能出现:

  • context length exceeded
  • 请求被服务端拒绝;
  • 部分上下文被截断;
  • 任务运行时间变长;
  • 配额消耗增加;
  • Codex 在长任务中途失败。

六、备份 Codex 配置

Windows PowerShell 示例:

$codexHome = if ($env:CODEX_HOME) {
    $env:CODEX_HOME
} else {
    Join-Path $HOME ".codex"
}

if (-not (Test-Path -LiteralPath $codexHome)) {
    throw "找不到 Codex 配置目录:$codexHome"
}

$backupDir = Join-Path `
    $codexHome `
    ("backups\context-window-" + (Get-Date -Format "yyyyMMdd-HHmmss"))

New-Item -ItemType Directory -Path $backupDir -Force | Out-Null

foreach ($name in @("config.toml", "custom_models.json")) {
    $source = Join-Path $codexHome $name

    if (Test-Path -LiteralPath $source) {
        Copy-Item `
            -LiteralPath $source `
            -Destination (Join-Path $backupDir $name) `
            -ErrorAction Stop
    }
}

Write-Host "备份完成:$backupDir"

如果当前还没有 custom_models.json,不要直接创建一个只有几行字段的不完整 JSON 文件。后面应该从当前模型目录生成完整文件。

七、生成自定义模型目录

当前模型目录是一个完整 JSON 对象,结构类似:

{
  "models": [
    {
      "slug": "gpt-5.6-sol"
    }
  ]
}

可以先读取当前目录,再只修改 Sol 对象:

$codexHome = if ($env:CODEX_HOME) {
    $env:CODEX_HOME
} else {
    Join-Path $HOME ".codex"
}

$catalogPath = Join-Path $codexHome "custom_models.json"
$catalog = codex debug models | ConvertFrom-Json

$solModels = @(
    $catalog.models |
    Where-Object { $_.slug -eq "gpt-5.6-sol" }
)

if ($solModels.Count -ne 1) {
    throw "没有找到唯一的 gpt-5.6-sol 模型对象"
}

$sol = $solModels[0]
$sol.context_window = 372000
$sol.max_context_window = 372000
$sol.effective_context_window_percent = 95

$json = $catalog | ConvertTo-Json -Depth 50
$utf8NoBom = New-Object -TypeName System.Text.UTF8Encoding -ArgumentList $false
[System.IO.File]::WriteAllText($catalogPath, $json, $utf8NoBom)

Write-Host "已生成:$catalogPath"

保存后检查文件是否存在:

Test-Path "$HOME\.codex\custom_models.json"

结果应为:

True

八、修改 config.toml

打开:

~/.codex/config.toml

在顶层加入或调整:

model = "gpt-5.6-sol"
model_context_window = 372000
model_catalog_json = "~/.codex/custom_models.json"

model_context_window 必须位于顶层,不要放进不确定的配置段中。

model_catalog_json 必须指向真实存在的完整模型目录文件。如果文件路径错误,Codex 可能无法正常启动。

这类字段属于比较底层、版本敏感的配置。当前 Codex CLI 0.146.0 可以读取自定义模型目录,但未来版本可能改变字段名称或加载方式。

九、验证本地模型目录

重新打开终端,执行:

codex debug models

也可以只查看 Sol:

$catalog = codex debug models | ConvertFrom-Json

$catalog.models |
    Where-Object { $_.slug -eq "gpt-5.6-sol" } |
    Select-Object `
        slug,
        context_window,
        max_context_window,
        effective_context_window_percent

如果自定义目录加载成功,应看到类似:

slug          context_window max_context_window effective_context_window_percent
----          -------------- ------------------- --------------------------------
gpt-5.6-sol          372000             372000                              95

这只能证明:

Codex 客户端读取了新的本地模型元数据。

它还不能证明服务端真的支持 353400 tokens。

Codex 上下文窗口配置验证流程

十、验证真实长任务

新建一个 Codex 任务,不要继续使用旧任务。

旧任务可能已经在启动时加载了旧模型元数据。

在新任务中观察:

task_started.model_context_window
token_count.info.model_context_window

如果显示:

353400

说明 Codex 运行时采用了新的有效窗口。

但真正的服务端验证,还要观察:

  • 长任务是否正常完成;
  • 第一次上下文压缩发生在哪一轮;
  • 是否出现 context length exceeded
  • 是否发生内容截断;
  • 任务耗时是否明显增加;
  • 输出质量是否下降;
  • 是否消耗更多配额。

建议使用同一个代码仓库、同一个任务和同一个模型,分别测试默认配置与实验配置。

指标默认配置实验配置
原始上下文窗口272000372000
有效窗口258400353400
第一次压缩轮次待记录待记录
最大 token 使用量待记录待记录
任务耗时待记录待记录
是否报错待记录待记录

十一、95% 不一定是自动压缩阈值

还需要区分“有效窗口”和“自动压缩阈值”。

有效窗口:372000 × 95% = 353400

但自动压缩可能在达到有效硬上限之前触发。在某些版本中,如果没有单独设置 auto_compact_token_limit,自动压缩阈值可能按原始窗口的比例推导,例如:

372000 × 90% = 334800

所以:

353400 是客户端计算出的有效窗口,不代表 Codex 一定会等到 353400 才开始压缩。

具体行为需要结合当前版本的任务日志验证。

十二、如何回滚

关闭 Codex 后,恢复备份文件:

Copy-Item `
    -LiteralPath "$HOME\.codex\backups\你的备份目录\config.toml" `
    -Destination "$HOME\.codex\config.toml" `
    -Force

如果备份了 custom_models.json,也一并恢复。

或者删除实验配置:

model_context_window = 372000
model_catalog_json = "~/.codex/custom_models.json"

然后重启 Codex,再执行:

codex debug models

确认模型目录恢复到默认值:

context_window: 272000
max_context_window: 272000

十三、常见问题

修改后仍然显示 272000,怎么办?

依次检查:

  1. custom_models.json 是否存在;
  2. JSON 是否能正常解析;
  3. model_catalog_json 路径是否正确;
  4. 是否修改了 gpt-5.6-sol 对象;
  5. 是否完全退出并重启 Codex;
  6. 当前任务是否实际使用了 Sol;
  7. 是否被远程模型目录覆盖。

为什么配置成 372000 后仍然自动压缩?

可能原因包括:

  • 自动压缩阈值早于有效硬上限;
  • 当前任务还包含大量系统提示词和工具输出;
  • 模型目录没有真正加载;
  • 服务端使用了更低的上下文限制;
  • 当前版本的压缩策略由其他字段控制。

为什么出现 context length exceeded

这通常表示客户端认为可以发送这么多内容,但服务端真实上限更低。

此时应该回滚配置,而不是继续提高数值。

这会让 Codex 变得更聪明吗?

不会。

它不会改变模型参数、推理能力或代码质量,最多让 Codex 在一次长任务中保留更多上下文。

会不会增加消耗?

可能会。更大的上下文通常意味着更高的输入 token 消耗、更长的请求时间、更大的网络传输量和更高的失败风险。

十四、最终结论

这项配置有一定价值,但需要正确理解。

它不是:

  • 模型升级;
  • 无限上下文;
  • 永久记忆;
  • 智力增强;
  • 服务端限制突破。

它更接近:

修改 Codex CLI 本地模型元数据,尝试让客户端使用更大的上下文预算。

对于大型代码仓库、长时间运行的 Agent 任务、频繁触发上下文压缩的用户,这种调整可能有帮助。

但对于普通短任务,基本没有明显收益。

在 Codex CLI 0.146.0 中:

默认:272000 × 95% = 258400
实验:372000 × 95% = 353400

最终是否真正有效,必须通过长任务和服务端错误日志验证,而不能只看本地配置文件里的数字。

相关源码