视频加载失败

Codex 切换第三方模型不生效?

3327 字
17 分钟
Codex 切换第三方模型不生效?

〇、先建立两个基本认知#

0.1 Codex 的两个核心配置文件#

文件作用典型位置
config.toml决定使用哪个模型、走哪个 provider、接口协议C:\Users\<用户名>\.codex\config.toml(Windows)
auth.json认证方式(ChatGPT 官方登录或 API Key)同上目录

CC Switch 切换时需要同时改这两个文件,它有时只改了其中一个——这是至少一半”切换不生效”问题的根源。

如果安装时改过 Codex 的数据目录(例如 D:\codex-home),电脑上可能存在两份 config.toml。CC Switch 可能改了 C 盘那份,而 Codex 实际读取的是 D 盘那份。排查时先确认 Codex 真正在读哪个文件。

0.2 路由 vs 显示:两类问题必须分开#

  • 路由断了:请求根本送不出去(401/404/400/model-not-found)。这是配置或模型本身的问题。
  • 路由通了但桌面版不显示:CLI 里 /model 能看到模型、请求也正常,只是桌面版选择器看不见。这是显示问题(客户端过滤缺陷),有专门的绕行方案。

一条命令区分两者:在同一个文件夹打开终端运行 codex(CLI),输入 /model。

  • CLI 也失败 → 路由问题,看第三章。
  • CLI 成功、只有桌面版看不见 → 显示问题,看第二章。

一、30 秒快速诊断表#

你看到的现象实际的问题跳转
切完模型重启 Codex,还是显示 GPT-5.5config.toml 与 auth.json 没同步,或改错了路径的那份问题 1
选择器只显示 “Custom”,没有模型名模型内联设置、缺少目录元数据(正常现象,能用)问题 5
模型名称位置显示空白[model_providers.xxx] 下缺 name 字段问题 6
CLI 的 /model 能列出,桌面版没有桌面版客户端过滤缺陷(issue #19694)问题 7
选择器下拉列表整个是空的目录缺失或格式错误(旧版 CC Switch)问题 8
发图片直接报错,之后纯文字也报错DeepSeek API 不支持图片输入,污染了会话历史问题 2
Key 明明正确却报 401Key 夹带空格、不可见字符或乱码问题 3
每个请求都 404wire_api = "chat" 已废弃,或网关无 /responses 端点问题 9
切回 GPT-5.5 后依然显示国产模型auth.json 残留 api-key 模式,或 config.toml 残留 provider问题 4
切换后会话记录消失、插件变灰认证体系切换导致(非数据丢失,新版已改善)问题 10
启动时打印 provider 被忽略的警告provider 写在了项目级 .codex/config.toml问题 11
配置全对但列表还是旧的或空的models_cache.json 缓存过期问题 12

二、切换类问题(改了不生效 / 改不回来)#

问题 1:切完模型重启 Codex,还是显示 GPT-5.5#

典型报错(CLI 中):

{"type":"error","status":400,"error":{"type":"invalid_request_error",
"message":"The 'deepseek-v4-flash' model is not supported when using Codex with a ChatGPT account."}}

根因:CC Switch 只改了 config.toml 和 auth.json 中的一个;或者改的是另一路径下的副本。于是 Codex 检测到”ChatGPT 账号登录态与第三方模型名”不匹配,直接拒绝。

排查步骤:

  1. 确认 Codex 实际读取的配置目录(默认 %USERPROFILE%\.codex\,改过安装路径的找对应目录)。
  2. 打开该目录的 config.toml,检查是否包含 model = "deepseek-v4-flash" 之类的模型行和 [model_providers.custom] 配置块。
  3. 打开同目录的 auth.json,检查 auth_mode 是否已从 chatgpt 变为 api-key 模式。
  4. 两处只改了一处 → 把没改的那份补齐,或从备份恢复后重新操作。

修复(推荐用备份恢复):

  • CC Switch 每次改配置前会自动备份,文件名带时间戳,如 config.toml.bak.20260602121223。
  • 找到切换前的正确备份,两个文件一起覆盖回去,再在 CC Switch 里重新操作一遍。
  • 有 Claude Code、opencode 等本地 agent 的话,可以把两个文件路径交给它,让它对比差异并修复,效率高于手动翻阅。

问题 4:切回 GPT-5.5 后依然显示国产模型#

根因:与问题 1 同源。禁用了 DeepSeek,但 auth.json 仍停留在 api-key 模式,或 config.toml 里残留 [model_providers.custom] 配置。

修复:

  1. 用 CC Switch 的备份(或自己手动备份的)把 config.toml 和 auth.json 同时恢复到切换之前的状态。
  2. 重启 Codex,重新登录 ChatGPT 账号。
  3. 恢复后插件、历史会话会一起回来。

问题 10:切换模型后会话记录全没了、插件变灰#

这不是 bug,也不是数据丢失。 切换模型等于换了一套认证体系,Codex 将其识别为新用户,旧会话和插件暂时不可见。

  • CC Switch 升级到 v3.16.1 及以上版本后,切回原模型的流程已修复:切回 GPT-5.5 且配置恢复正确,会话记录、插件全部原样回来。
  • 实操建议:切到国产模型前,重要会话内容先复制出来另存一份;用完切回即可,不必担心。

三、请求类问题(路由断了)#

问题 2:能用了,但一发图片就报错#

典型报错:

CC Switch local proxy failed while handling Codex endpoint /responses.
Provider: DeepSeek; model: deepseek-v4-flash; upstream_status: HTTP 400;
cause: Failed to deserialize the JSON body into the target type:
messages[6]: unknown variant `image_url`, expected `text`

根因:部分模型不支持图片输入,与 CC Switch 和你的配置都无关。

需要特别注意的一点:一旦某会话里发过图片报错,该会话后续纯文字也会持续报错——因为 Codex 每次都会把含图片的历史消息一起发给 API。

问题 3:API Key 明明正确,却报 401#

典型报错:unexpected status 401 Unauthorized: Incorrect API key provided: sk-bb527*****0175

根因:CC Switch 输入框的已知问题——复制粘贴进去的 Key 可能夹带首尾空格、不可见字符,甚至保存时出现乱码,肉眼无法分辨。

修复(注意顺序):

  1. 先关掉 Codex。
  2. 在 CC Switch 里删除该供应商的 API Key。
  3. 重新去服务商后台重新复制一次 Key,粘贴保存。
  4. 再打开 Codex。
  5. 仍不行就手动输入 Key,以彻底排除剪贴板问题。

问题 9:启动报错,或每个请求都 404#

根因:wire_api = "chat"。wire_api 决定 Codex 与网关之间使用的接口协议。Codex 在 2026 年 2 月移除了旧的 chat/completions 路径,responses 现在是唯一合法取值(也是默认值);或者你的网关根本没有 /responses 端点。

修复:

[model_providers.custom]
wire_api = "responses"
base_url = "https://你的网关地址/v1" # 以 /v1 结尾,末尾不带斜杠
  • 网关必须在 {base_url}/responses 暴露 OpenAI 兼容的 Responses 端点。只支持 /chat/completions 的网关会让每个请求 404——表面像模型问题,实际是协议不匹配。
  • 顺带检查:base_url 末尾多一个斜杠或路径写错,会导致连接频繁被重置。

附:其他伪装成显示问题的路由错误#

症状真正原因修复
每个请求 401(手写配置场景)配了 env_key 但环境变量从未导出在系统环境变量或 shell 配置中设置对应 Key
模型能跑但返回错误的输出目录里的 slug 与 provider 实际模型 ID 不一致slug 改为与发送给 provider 的字符串逐字符一致
调用网关返回 model-not-found模型字符串写错核对服务商后台的模型 ID,不要凭猜测填写

四、显示类问题(路由通了,桌面版看不见)#

问题 5:选择器只显示 “Custom”,没有模型名#

根因:只在 config.toml 里内联写了 model = "xxx",没有模型目录,选择器没有可展示的元数据。

结论:这是正常现象,不用修。 请求会正常发往你的模型。如果不在乎下拉列表的显示效果,到此处即可停止排查。

问题 6:模型名称位置显示空白#

根因:[model_providers.custom] 配置块下缺少 name 字段(Windows 上 CC Switch 偶尔写入不完整)。

修复:手动补上,重启 Codex:

[model_providers.custom]
name = "deepseek" # 该字段控制界面显示名称
base_url = "https://api.deepseek.com"
wire_api = "responses"

name 的值可自定义,填写自己能识别的名称即可(“deepseek”、“qwen” 均可)。

问题 7:CLI 的 /model 能列出模型,桌面版选择器没有#

根因:Codex 桌面版的客户端过滤缺陷(openai/codex issue #19694,2026-04-26 提交,截至目前未关闭)。app-server 的 model/list 端点正常返回了你的模型,但桌面版渲染层在到达下拉列表前把本地配置的条目丢弃了。后端知道你的模型,前端拒绝显示,改配置无法修复。

修复(按顺序):

修复 A——内联模型绕行(永远管用,最先做):

# %USERPROFILE%\.codex\config.toml(用户级,不是项目文件夹里)
model = "moonshotai/kimi-k2.7-code"
model_provider = "custom"
[model_providers.custom]
name = "myprovider"
base_url = "https://你的网关/v1"
env_key = "MY_API_KEY"
wire_api = "responses"

彻底退出 Codex 桌面版再重开。选择器显示 “Custom” 无妨,请求都会发往正确模型。换模型只需改 model 那一行字符串。

修复 B——加模型目录,让选择器显示真名:在 config.toml 顶部加 model_catalog_json 指向一个 JSON 文件。model_catalog_json 即模型目录配置项,用于向选择器提供模型的展示名称、上下文长度等元数据。

model_catalog_json = "C:/Users/你/.codex/my-models.json"

最小目录条目:

{
"models": [
{
"slug": "moonshotai/kimi-k2.7-code",
"display_name": "Kimi K2.7 Code",
"description": "Coding model via gateway",
"context_window": 262000,
"max_context_window": 262000,
"supported_in_api": true,
"visibility": "list",
"priority": 1
}
]
}

slug 必须等于发给 provider 的模型字符串。目录只在启动时读取一次,改动后必须重启桌面版。

问题 8:选择器下拉列表整个是空的#

根因:早于 v3.16.5 的 CC Switch 生成的目录格式与 Codex 选择器期望的不一致(cc-switch issue #3668),路由正常但 /model 返回空。

修复:

  1. 升级 CC Switch 到 v3.16.5 或更高版本——该版本会为使用原生 Responses 端点(apiFormat: "openai_responses")的供应商生成 ~/.codex/cc-switch-model-catalog.json。
  2. 升级后必须把每个原生 provider 重新保存一次——目录只在保存时重新生成,旧 provider 不会自动迁移。
  3. 验证目录已生成(Windows PowerShell):
Terminal window
Get-Content "$env:USERPROFILE\.codex\cc-switch-model-catalog.json" | Select-String -Pattern '"slug":[^,]*'
# 如果输出为空,回 CC Switch 重新保存该 provider 后再查

v3.16.5 的两个注意点:

  • 目录生成与”本地路由”开关已解耦:无论本地路由是否开启,原生 Responses 供应商都会生成目录;Chat 格式供应商仍走代理转换。
  • 少数国产模型(MiMo、LongCat、MiniMax、Qwen3-Coder)的网关不支持 OpenAI 内置 web_search,v3.16.5 默认对它们关闭该工具以避免 400 报错——这些模型的网络搜索不可用,属于预期行为,不是故障。

问题 11:启动时打印 provider 被忽略的警告#

根因:model_provider / model_providers 写在了项目级 .codex/config.toml(某个仓库目录里)。provider 定义只在用户级 %USERPROFILE%\.codex\config.toml 生效,项目级的会被忽略并打印警告。

修复:在 Windows PowerShell 中检查 provider 到底写在哪个文件:

Terminal window
Select-String -Path "$env:USERPROFILE\.codex\config.toml",".\.codex\config.toml" -Pattern "model_providers"

把 [model_providers.*] 配置块和 model_provider = "..." 挪到 %USERPROFILE%\.codex\config.toml,项目级配置只保留仓库专属内容(如指令文件)。

问题 12:配置全对,但列表还是旧的或空的#

根因:%USERPROFILE%\.codex\models_cache.json 缓存过期。切换 provider 或编辑目录后它不总会重新同步。

修复:删掉 models_cache.json,下次启动会强制重建。在断定目录本身出错之前,先试这一招。


五、通用排查流程(一张图记住)#

桌面版看不到模型 / 切换不生效
│
▼
终端运行 codex(CLI),输入 /model
│
┌────┴────┐
CLI 也失败 CLI 正常、只有桌面版不行
│ │
▼ ▼
路由问题 显示问题(#19694 过滤)
检查: 处理:
· config/auth · 修复 A:内联 model 绕行
两文件是否 · 修复 B:补 model_catalog_json
同步且路径对 · CC Switch 升 v3.16.5+
· wire_api= 并逐个重新保存 provider
responses
· Key 无空格 仍不行:
乱码 · 删 models_cache.json
· base_url · 检查 name 字段
以 /v1 结尾

验证模型真正加载的可靠方法:不要只看选择器(其本身存在过滤缺陷),在更下层验证——

  1. CLI 里 /model 能列出 → 目录和 provider 都正确;
  2. 用密钥对网关直接请求 {base_url}/responses → 确认路由本身能解析;
  3. 用网关的话,在网关的请求日志面板确认模型路由命中了预期后端。

六、操作规范与预防(比修复更重要)#

  1. 任何切换前先手动备份 config.toml 和 auth.json。CC Switch 虽会自动备份(.bak.时间戳),自己再存一份作为额外保险。
  2. 操作顺序要求:先关 Codex → 改配置 → 再开 Codex。顺序反了,很多”不生效”就是这么来的。
  3. CC Switch 保持最新版。v3.16.1 修复了切换后会话丢失,v3.16.5 修复了目录格式。很多坑在新版本已经不存在,具体版本号和修复内容以官方发布说明为准。
  4. 切换三种场景速查:
    • 官方 → 国产:关 Codex → CC Switch 加供应商填 Key → 设置里开路由总开关和 Codex 路由 → 启用供应商 → 开 Codex。
    • 国产 → 官方:关 Codex → 禁用供应商 → 关路由 → 开 Codex 重新登录(配置乱了就用备份恢复)。
    • 国产 A → 国产 B:关 Codex → 直接启用新供应商(旧的自动禁用)→ 开 Codex,路由不用动。
  5. 善用本地 agent 排查:把 config.toml、auth.json 和备份文件交给 Claude Code 或 opencode,让它对比差异并修复,比手动翻阅文件效率更高。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Codex 切换第三方模型不生效?
https://blog.youzhiqing.com/posts/cc-switch-codex-troubleshooting/
作者
莜之箐
发布于
2026-08-22
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
莜之箐
Hello, I'm Firefly.
公告
欢迎来到我的博客!这是一则示例公告。
分类
标签
最新动态
站点统计
文章
15
分类
7
标签
50
总字数
33,237
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.16.3
文章许可
CC BY-NC-SA 4.0