先说结论

我在自己的 Windows 电脑 CHAIM01 上做了一次最小化实测:Codex Desktop 下发的模型目录中确实存在 gpt-5.6-sol-wm,它默认不显示在模型选择器里,而本次测试使用的当前账号可以直接请求。测试返回 WM_OK,进程退出码为 0。

这能证明两件事:

  1. gpt-5.6-sol-wm 不是手工编造的模型名,而是 Codex 客户端收到的真实模型条目;
  2. 至少在本次测试使用的账号和时间点,服务端接受了这个模型请求。

但要把结论说严谨:一次成功调用不能证明它永久免费,也不能证明长期高频使用不会计入限额。 Codex 返回了 token usage,却没有返回账户扣减前后的限额数据。能调用是实测结果,“无限且不消耗额度”仍需要更长时间的连续观察。

实测环境

本次测试没有安装来路不明的补丁,也没有复制或修改登录凭据。使用的是 Codex Desktop 自带的 CLI:

主机:CHAIM01
Codex CLI:0.147.0-alpha.6.6
模型:gpt-5.6-sol-wm
测试方式:临时会话、只读沙箱、禁用工具

Windows 上的 Codex Desktop 会把命令行程序放在用户的本地运行目录。具体版本目录可能随客户端升级改变,所以不要机械复制别人的完整路径。更稳的做法是先通过 Get-ChildItem 定位当前版本:

Get-ChildItem "$env:LOCALAPPDATA\OpenAI\Codex\bin" `
  -Filter codex.exe -File -Recurse

如果你另外安装了 Codex CLI,也可以直接运行:

codex --version

检查本地模型目录

Codex 的模型缓存通常位于:

%USERPROFILE%\.codex\models_cache.json

先确认文件存在:

$CodexHome = if ($env:CODEX_HOME) {
    $env:CODEX_HOME
} else {
    Join-Path $env:USERPROFILE '.codex'
}

$CachePath = Join-Path $CodexHome 'models_cache.json'
Test-Path -LiteralPath $CachePath

然后只读取目标条目:

$Catalog = Get-Content -Raw -LiteralPath $CachePath | ConvertFrom-Json
$Models = if ($Catalog.models) { @($Catalog.models) } else { @($Catalog) }

$Models |
  Where-Object slug -eq 'gpt-5.6-sol-wm' |
  Select-Object slug, visibility, supported_in_api, supported_reasoning_levels

CHAIM01 上读到的核心字段是:

slug             : gpt-5.6-sol-wm
visibility       : hide
supported_in_api : false

这里有两个容易混淆的概念:

  • visibility: hide 表示客户端默认不把它列在普通模型选择器中;
  • supported_in_api: false 是当前客户端缓存里记录的字段值;仅凭这个字段,不能进一步断言服务端的完整产品定位。

本地看见条目不代表账号一定有权限。最终是否可用,仍由服务端在请求时判断。

不改配置,先跑最小探针

不要一上来就改默认模型。先用一次临时、只读请求判断账号是否被服务端接受,失败也不会影响现有 Codex 配置。

如果 codex 已经在 PATH 中,可以运行:

codex --ask-for-approval never exec `
  --ignore-user-config `
  --ephemeral `
  --json `
  --skip-git-repo-check `
  -C $env:TEMP `
  --sandbox read-only `
  --model gpt-5.6-sol-wm `
  -c 'model_reasoning_effort="low"' `
  -c 'approval_policy="never"' `
  -c 'web_search="disabled"' `
  -c 'features.shell_tool=false' `
  -c 'features.multi_agent=false' `
  -c 'project_doc_max_bytes=0' `
  'Reply exactly WM_OK. Do not call any tool.'

这条命令刻意做了几层约束:

  • --ignore-user-config:不读取当前项目的个性化配置;
  • --ephemeral:使用临时会话;
  • --sandbox read-only:只读沙箱;
  • 禁用网页搜索、Shell 工具和多 Agent;
  • 使用最低推理档,只要求模型返回固定文本。

CHAIM01 的实际结果中包含:

{"type":"item.completed","item":{"type":"agent_message","text":"WM_OK"}}
{"type":"turn.completed","usage":{"input_tokens":15322,"output_tokens":6}}

最终退出码为 0。这说明服务端确实完成了本次 gpt-5.6-sol-wm 请求。

如果返回 model is not supported,说明当前账号没有访问权限。本地修改 JSON 只能改变显示状态,不能绕过服务端授权。若返回 401,优先检查 Codex 登录是否失效,不要去复制其他人的认证文件。

是否需要把隐藏模型改成可见

只为了使用模型,其实不必修改模型目录。命令行显式传入即可:

codex --model gpt-5.6-sol-wm

如果确实希望它出现在模型列表里,建议遵循三个原则:

  1. 不直接修改会被客户端刷新的原始缓存;
  2. 先备份,再从当前版本缓存生成独立副本;
  3. 只改目标模型的 visibility,并验证匹配数量必须恰好为一个。

下面是一段带保护检查的生成脚本。它解析 JSON 后精确定位目标对象,不用可能跨对象匹配的正则:

$CodexHome = if ($env:CODEX_HOME) {
    $env:CODEX_HOME
} else {
    Join-Path $env:USERPROFILE '.codex'
}

$Source = Join-Path $CodexHome 'models_cache.json'
$Target = Join-Path $CodexHome 'models_sol_wm_visible.json'
$Backup = "$Target.before-$(Get-Date -Format yyyyMMdd-HHmmss).bak"

if (-not (Test-Path -LiteralPath $Source)) {
    throw "找不到模型缓存:$Source"
}

if (Test-Path -LiteralPath $Target) {
    Copy-Item -LiteralPath $Target -Destination $Backup
}

$Catalog = Get-Content -Raw -LiteralPath $Source | ConvertFrom-Json
$Models = if ($Catalog.models) { @($Catalog.models) } else { @($Catalog) }
$WM = @($Models | Where-Object slug -eq 'gpt-5.6-sol-wm')

if ($WM.Count -ne 1) {
    throw "目标条目数量异常:$($WM.Count),停止修改。"
}

$WM[0].visibility = 'list'
$Json = $Catalog | ConvertTo-Json -Depth 100

[IO.File]::WriteAllText(
    $Target,
    $Json,
    [Text.UTF8Encoding]::new($false)
)

生成后,检查目标条目:

$CustomCatalog = Get-Content -Raw -LiteralPath $Target | ConvertFrom-Json
@($CustomCatalog.models | Where-Object slug -eq 'gpt-5.6-sol-wm') |
  Select-Object slug, visibility

然后才考虑在 config.toml 顶层增加:

model = "gpt-5.6-sol-wm"
model_catalog_json = "C:/Users/你的用户名/.codex/models_sol_wm_visible.json"
model_reasoning_effort = "max"

Windows 路径建议使用正斜杠,减少 TOML 转义问题。客户端升级后如果模型目录结构发生变化,应从新的缓存重新生成,不要长期复用旧副本。

关于“不扣额度”的判断

这部分必须和“能否调用”分开。

本次请求的响应明确给出了输入与输出 token 数量,说明服务端对本轮消耗进行了统计;但响应里没有账户剩余额度、扣减明细或计费结果。因此,单靠 WM_OK 只能证明权限与路由正常,不能推出以下结论:

  • 所有付费账号都可用;
  • 所有请求永久免费;
  • 高强度调用永远不会触发限制;
  • 隐藏模型的行为和名称长期不变。

更可靠的验证方式是:记录测试前后的官方 usage 状态,在相同账号上进行有限次数、不同时间段的对照测试,再观察限额提醒或消费明细是否变化。即使短期没有可见扣减,也可能只是统计延迟、独立限额池或内部路由策略,并不自动等于“无限”。

安全边界

这个测试不需要、也不应该做以下事情:

  • 复制别人的 auth.json、Cookie 或 Token;
  • 修改或伪造账号身份;
  • 下载不明来源的 Codex 补丁;
  • 为了验证模型而关闭 Windows 安全功能;
  • 把登录文件上传到网盘或发给第三方。

模型权限由账号和服务端决定。拿到别人的认证信息既不安全,也不能把不具备的权限稳定地“变出来”。

最后的判断

gpt-5.6-sol-wm 在 CHAIM01 上已实测调用成功,这一点没有悬念。它目前是一个被客户端隐藏、但服务端允许当前账号访问的 Codex 模型路由。

真正值得采用的路径不是急着修改默认配置,而是:

  1. 只读检查模型缓存;
  2. 用临时只读探针确认服务端权限;
  3. 成功后先通过 --model 显式使用;
  4. 确有长期需要,再制作可回滚的独立模型目录;
  5. 对“无限、不扣额度”等说法继续保留验证意识。

能调用,是本次实测结果;能用多久、如何计入限额,仍由服务端策略决定。把这两件事分开,才不会因为一个隐藏模型名,把技术验证做成自我说服。