最近在折腾 Codex 的人越来越多了,不光是拿它当终端里的 AI 编程助手,还有不少人为了省订阅费、换模型、切账号,把它接到第三方 API 上。结果就是——安装 5 分钟,排错两小时。尤其是涉及 ChatGPT 账号切换(比如个人号切 Plus 号、切 Team 号)或者接入第三方 API 的场景,各种报错一股脑全冒出来:cc switch local proxy failed while handling codex endpoint /responses、chatgpt需要一次性权限才能在你的电脑上运行、无法加载 config.toml、会话不可见……每一条都够让人头疼的。
这篇文章把我自己在 Codex 账号切换与第三方 API 接入过程中实际遇到、并且已经解决过的报错和会话问题汇总一遍,把排查思路、操作步骤、配置模板都写清楚。不管你是刚装好 Codex 就报错的新手,还是已经在用 CCSwitch、多 API 配置的熟手,只要遇到类似故障,按这个顺序排查基本都能搞定。
1. 先搞清楚:账号切换与第三方 API 为什么会搞出这么多事
1.1 需求都是从哪来的
先说清楚大家折腾的前提。Codex 这个 CLI 工具有两种使用路径,一种是直接用 ChatGPT 账号登录,走订阅账号里附带的模型额度;另一种是配置 OpenAI API Key 或者其他兼容的第三方 API,按 token 计费。两条路径各有利弊,很多人的真实情况是:账号不止一个(个人号、Plus 号、Team 号),或者希望把 Codex 接到 DeepSeek 这类更便宜的第三方模型上,于是就有了“切换”这个动作。
问题在于,Codex 的登录态、配置文件、会话存储是耦合在一起的。切换账号或者切换 API 时,只要有一条链路没理顺,终端里就会给你甩出一堆莫名其妙的报错。而且 Codex 本身迭代很快,不同版本对配置文件字段、模型名的解析方式也不一样,这就让排错难度直接上了一个台阶。
1.2 最常见的报错场景速查
我根据自己遇到的、以及帮朋友排查过的案例,把出现频率最高的几类报错整理成了下面这个表。你在终端里看到类似信息时,先对号入座,再往下找对应的解决方案,效率会高很多。
| 报错现象 | 通常在什么场景触发 | 问题核心指向 |
|---|---|---|
| cc switch local proxy failed while handling codex endpoint /responses | 用 CCSwitch 切换账号后,执行 codex 任务时 | 本地代理进程、端口、转发目标 |
| chatgpt需要一次性权限才能在你的电脑上运行 | 首次运行 Codex,或系统更新后再次运行 | 操作系统对终端的权限授予 |
| chatgpt 无法加载 config.toml,因此此对话串无法继续 | 配置了 model 或 provider 后启动会话 | config.toml 语法、model 字段 |
| the 'gpt-5.6-sol' model is not supported when using codex with a chatgpt acc | ChatGPT 账号登录状态下使用了不支持的模型 | 账号可用模型白名单与配置不匹配 |
| ccswitch 会话已过期 | 长时间未使用后,或切换账号后直接调用 | token 过期、认证信息失效 |
先记住一个原则:大多数报错都不是 Codex 本身坏了,而是配置和运行环境不匹配。所以排查时要冷静,一条一条拆,别一上来就卸载重装。卸载重装解决不了配置问题,只能浪费时间。
2. 核心机制先弄懂:认证、配置、会话是三件独立的事
很多人在排错时容易陷入一个误区,只要 Codex 出了状况就觉得是“配置坏了”,于是到处乱改。其实 Codex 在本地的工作方式可以拆成三个相对独立的部分:登录认证、配置文件、会话记录。把这三者的关系理清了,大部分报错的根因一眼就能看出来。
2.1 两种认证方式,行为完全不同
Codex 登录 ChatGPT 账号时,会在本地生成一个 auth.json 文件,里面存的是 OAuth token,后续所有请求都带着这个 token 去找 OpenAI 的接口。这种方式的优点是只要订阅账号有额度就能用,缺点是你只能在订阅允许的模型范围内选择。
另一种方式是 API Key。你可以通过环境变量注入,也可以在 config.toml 里指定某个 provider 的 env_key,让 Codex 去读取对应的 key。这种方式走的是标准的 OpenAI 兼容接口,能用的模型取决于这个 Key 所属服务商开放了哪些模型。第三方 API 基本都走这一条路。
这里有一个特别容易被忽视的点:认证方式和模型不是绑定的,但不同认证方式对模型的接受度不一样。你用 ChatGPT 账号登录时,如果 config.toml 里写了一个当前订阅档位不支持的模型名,Codex 会直接拒绝启动会话,报错信息里会明确提示该模型不支持。而用 API Key 时,只要服务商兼容列表里有这个名字,哪怕名字再冷门,Codex 也认。所以当你看到 model not supported 类型的报错时,先想想自己当前用的是哪种认证方式,再决定是改模型名还是换认证方式。
2.2 config.toml 除了 model,还在配什么
config.toml 是 Codex 的核心配置文件,默认放在用户目录下的 .codex 文件夹里。很多人只盯着 model 字段改,其实这个文件里还有几个字段同样关键,特别是切换第三方 API 时,任何一个对不上都会出问题。
一份典型的、同时支持 OpenAI 和第三方 provider 的 config.toml 大概长这样:
model = "gpt-5.6-sol" model_provider = "openai" [model_providers.openai] name = "OpenAI" base_url = "https://api.openai.com/v1" env_key = "OPENAI_API_KEY" wire_api = "responses" [model_providers.deepseek] name = "DeepSeek" base_url = "https://api.deepseek.com/v1" env_key = "DEEPSEEK_API_KEY" wire_api = "chat"注意看几个字段的含义:
model_provider指定当前默认使用哪个 provider,它的值要和下方[model_providers.xxx]的 xxx 对应。base_url是接口地址。OpenAI 官方走的是/v1,但 Codex 官方模型走的是 responses 协议接口;第三方 API 大多数只兼容 chat completions 协议。env_key是环境变量名。Codex 启动时会从这个环境变量里读 API Key,所以你需要确保这个环境变量在终端会话里是存在的。wire_api告诉 Codex 用哪套协议去发请求,可选值主要是responses和chat。这个字段填错,请求就会失败,而且失败得很隐蔽,不会直接告诉你协议不对,而是报各种 404、400 之类的 HTTP 错误。
我见过有人把 DeepSeek 的 provider 写成wire_api = "responses",结果怎么调都报错,改成chat之后立刻就能用了。第三方 API 基本都兼容 OpenAI 的 chat completions 格式,所以遇到不认识的 API 服务时,wire_api一般填chat最稳。
2.3 会话存储在哪,“不可见”到底是怎么回事
Codex 的会话记录默认存放在 ~/.codex/sessions 目录下,每个会话对应一个 jsonl 格式的文件,里面记录了你和 Codex 的完整交互内容。Codex 启动时通过扫描这个目录来展示历史会话列表。
搞清楚这个机制,你就明白“会话不可见”大概率不是会话丢了,而是 Codex 没找到、没权限读取,或者读错了目录。比如:
- HOME 环境变量变了,导致 Codex 去读的是另一个 .codex 目录。
- 切换账号工具(比如 CCswitch)在切换时改了 CODEX_HOME 或 HOME。
- 文件权限不对,当前用户读不了 sessions 目录。
- 目录存在但权限没问题,Codex 版本更新后会话格式不兼容。
所以遇到会话不可见,先别急着重装,按我后面的步骤去查存储目录和权限,多数情况下三两分钟就能找回来。
3. 高频报错逐项排查与修复:按这套流程走,能解决九成问题
这一节是全文的核心操作部分。我按实际排错的先后顺序来写,你遇到问题时就按这个顺序来,不要跳步。
3.1 cc switch local proxy failed while handling codex endpoint /responses
这个报错是 CCSwitch 用户的重灾区。先说 CCSwitch 是什么:它是个社区里的 Codex 账号/配置切换工具,核心原理是在本地启动一个代理服务,让 Codex 的所有请求都先走这个本地代理,再由代理转发到真实的后端。它的好处是切账号时不用频繁修改 config.toml,工具会帮你动态调整路由。
报错信息里的 "local proxy failed" 指的是本地代理在处理 /responses 这个端点时挂了。出问题的环节一般有三个:
第一,本地代理进程没有正常启动。CCSwitch 需要常驻后台才能转发请求,如果你切换完账号之后把代理进程关掉了,Codex 再发请求时自然找不到能转发的服务,直接报 local proxy failed。这种情况的处理很简单:重新打开 CCSwitch,确认状态栏显示代理已启动,最好再看一眼日志,确认没有启动报错。
第二,端口被占用或者 base_url 指向不对。CCSwitch 启动后会在本机监听一个端口,比如 http://127.0.0.1:8080。Codex 的 config.toml 里对应 provider 的 base_url 必须指向这个地址。如果 CCSwitch 更新后换了默认端口,但 config.toml 还是旧端口,同样会代理失败。
检查方式:
# 看本地端口是否在监听,把 8080 换成你实际配置的端口 lsof -i :8080 # 看 Codex 当前配置的 base_url cat ~/.codex/config.toml如果端口没在监听,就是代理没起来;如果监听了但 config.toml 里地址不对,就把 base_url 改成正确的。还有一个小概率情况是某个浏览器插件占用了同一个端口,导致 CCSwitch 起不来,这种直接把插件停掉即可。
第三,代理起来了、端口也对,但转发目标不可达。CCSwitch 切换账号后,代理内部有一个“当前选中的账号”的状态,如果这个账号的 token 失效了,代理转发过去就会得到 401 或 403,然后报给你一个 local proxy failed 的笼统错误。遇到这种情况,去 CCSwitch 里把当前账号退出重新登录一次,让 token 刷新,问题就能解决。
3.2 chatgpt需要一次性权限才能在你的电脑上运行
这个提示出现在首次运行 Codex,或者系统更新后再次运行时。它不是 Codex 的报错,而是操作系统的安全机制。Codex 是命令行工具,它需要读写配置文件、创建会话目录、执行一些辅助命令,这些操作会被系统视为“需要授权的行为”。
在 macOS 上,你需要在“系统设置 -> 隐私与安全性”里,找到对应的权限项(比如辅助功能、开发者工具),把终端应用或 Codex 相关程序勾选允许。有时候只弹窗点一次“允许”还不够,因为后续某些操作还会触发新的权限请求,需要重复授权。
在 Windows 上,常见的是 SmartScreen 拦截,提示“Windows 已保护你的电脑”。如果确认安装包来源可靠,点“更多信息 -> 仍要运行”即可。还有一种情况是 Windows 的 Defender 防火墙弹窗询问是否允许应用通过,这种要选“允许”,否则后面的网络请求会被拦住。
这里有两条实操经验。第一条,不要在弹窗出现时直接关掉终端,关掉后授权流程会中断,再次运行又会从头开始。第二条,如果你用的是终端工具(比如 iTerm、Windows Terminal)来跑 Codex,授权时要授权给“终端本身”,因为实际发起读写操作的是终端进程,不是某个独立的 Codex 图标。
3.3 无法加载 config.toml,请修复 model 字段
这个报错比较粗暴,Codex 直接告诉你 config.toml 有问题,而且点名了 model 字段。我遇到过的情况主要有三种。
第一种是 model 字段里的模型名写错了。比如你从网上复制了一段配置,里面写的模型名是 gpt-5.6-sol,但你的账号或 API 服务商根本不提供这个模型。Codex 解析不到合法的模型,就会拒绝继续。解决办法是把 model 改成实际可用的模型名,比如 API Key 方式下常见的 gpt-5.5-codex、第三方 API 的 deepseek-chat 等。
第二种是 model_provider 不匹配。config.toml 里 model 写的是一个名字,model_provider 写的是另一个名字,或者干脆没写 model_provider,Codex 默认去找 openai provider,结果 openai provider 的 base_url 或 env_key 又是空值,自然就会报错。
第三种是 TOML 语法坏了。加了注释后没换行、引号不配对、中括号写错位置,都会导致整个文件解析失败。检查 TOML 语法有个笨办法:把文件内容复制到在线 TOML 校验工具里跑一遍,语法错误一目了然。
从实际操作来看,修复 config.toml 时必须保持 model、model_provider、[model_providers.xxx] 三者之间的对应关系。我给你一个能跑通的最小配置做参照:
model = "deepseek-chat" model_provider = "deepseek" [model_providers.deepseek] name = "DeepSeek" base_url = "https://api.deepseek.com/v1" env_key = "DEEPSEEK_API_KEY" wire_api = "chat"改完之后,在终端里执行codex exec "ping"或者直接启动codex进入交互模式,看看报错是否消失。如果还有问题,大概率是环境变量没生效,记得重新加载 shell 配置或重开一个终端窗口。
3.4 the 'gpt-5.6-sol' model is not supported
这类的报错关键词是 "model is not supported",核心原因只有一个:你当前使用的认证方式不认这个模型。
ChatGPT 账号登录模式下,Codex 能用的模型受限于你的订阅档位。举个例子,如果你的账号只能使用某个档位的模型,但 config.toml 里写了更高档位的模型,Codex 就会报 not supported。这里不要和“配置写错”混淆,配置本身没错,只是账号权限不够。
处理办法有两种。第一种,把模型名改成当前账号支持的型号。不确定账号支持哪些模型,可以在登录状态下运行codex --help或查看官方文档,或者把 model 字段临时删掉,让 Codex 用默认值启动,看它默认选什么模型,那就说明那是当前账号支持的。
第二种,换用 API Key 方式。API Key 模式下,模型可用性由服务商决定,通常更灵活,第三方 API 尤其如此。如果你的诉求就是跑一个比较特殊的模型,从 ChatGPT 账号切到 API Key 是很常见的选择。
我个人的建议是:如果你想稳定地使用 Codex 的完整功能,主力账号用官方模型;如果你想跑特定第三方模型或者降低成本,就专门为第三方 API 单独开一个配置文件,不要和 ChatGPT 账号配置混在一起。混在一起的结果就是你永远在改来改去,改了模型忘了改 provider,改了 provider 又发现 base_url 错了。
3.5 ccswitch 会话已过期 / token 失效
这个报错的本质是认证信息过期。CCSwitch 里保存了多个账号的 token,但 token 不是永久的,长时间不用、密码修改、账号在其他设备登录都有可能让它失效。
排查步骤很简单:打开 CCSwitch,找到当前选中的账号,执行“重新登录”或“刷新登录状态”操作。登录完成后,再回到终端执行一次简单的 Codex 命令,比如codex exec "hello",看看还会不会报会话过期。
这里有个容易踩的坑:有些用户在 CCSwitch 里刷新了账号,但没有让 Codex 退出。Codex 本地缓存的还是旧的 token 信息,两者对不上,就会一直报错。正确的顺序是:
- 在终端执行
codex logout,清掉旧的登录态。 - 打开 CCSwitch,重新登录目标账号。
- 在终端执行
codex login,按提示完成新账号的登录。
这个“先退出、再登录”的顺序看着简单,但很多人就是跳过了第一步,结果排查了半天都没有头绪。token 失效类的问题,核心就是让 Codex 本地状态和 CCSwitch 的账号状态保持一致。
4. 会话不可见问题的完整排查与恢复方案
会话不可见跟前面那些直接报错还不一样,它不会打断你的操作,但会让你感觉“我之前的对话都白干了”。实际排查下来,大部分情况都是可以找回的,只有少数极端情况需要接受现实。
4.1 先判断“不可见”属于哪种表现
会话问题大致分三类:
- 打开 Codex 后,历史会话列表完全空白。
- 历史会话列表能显示,但点进去是空的,内容丢失。
- 切换账号后,之前账号的会话看不到了。
这三类的排查方向完全不同。列表空白,优先检查目录路径和权限。列表有但内容为空,优先检查会话文件是否损坏,或者是否被清空过。切换账号后看不到旧账号的会话,通常是因为不同账号的会话存储位置不同,或者切换工具改了存储路径。
4.2 存储目录与权限检查
不管属于哪一类,第一步都是先确认 Codex 当前实际使用的会话目录。Codex 支持通过环境变量改变配置目录,所以不能想当然地认为就在 ~/.codex 下。
执行下面这条命令,看看 Codex 到底在用什么路径:
echo $CODEX_HOME正常情况这个变量是空的,那么配置目录就是默认的 ~/.codex。如果这个变量有值,那 Codex 读的就是这个值对应的目录,你之前的会话文件可能都在另一个地方。
确认目录后,再检查 sessions 子目录:
ls -la ~/.codex/sessions/如果提示没有这个目录或权限不足,就手动创建并赋予权限:
mkdir -p ~/.codex/sessions chmod -R 700 ~/.codex权限设置为 700 是为了避免其他用户读你的会话内容,同时保证当前用户有完整的读写权限。这一步做完,重新启动 Codex,看看历史会话是否恢复。
4.3 切换工具导致的目录漂移
CCSwitch 这类工具在切换账号时,有时会顺手改动 HOME 或 CODEX_HOME 环境变量,特别是通过包装脚本启动 Codex 时,很容易把会话目录指到别处。你看到的现象就是“会话全没了”,但实际文件还在原地,只是 Codex 没去读。
解决办法是把会话文件找回默认目录。如果你的旧会话文件还在,只是路径不对,可以直接用 mv 把 sessions 目录移动到正确位置。
比如你发现真实会话在 /old/path/.codex/sessions,而 Codex 默认读 ~/.codex/sessions,那就:
mv /old/path/.codex/sessions ~/.codex/sessions这里我给个提醒:不要随便用 cp 复制完就完事,复制会让新旧两份文件并存,后续可能出现“同一个会话两个版本”的混乱局面。直接移动更干净,移动完之后再检查一遍 Codex 是否能正常读取。
4.4 什么时候该清理历史会话,怎么清理才安全
会话不可见问题解决完之后,很多人会顺便想清理一下历史会话,给 Codex “减重”。确实,长时间高频使用后,sessions 目录里积累的 jsonl 文件会越来越多,体积越来越大,导致 Codex 启动变慢、列表加载卡顿。
但清理时要分清文件作用。sessions 目录里是会话记录,删了对话记录就没了;同目录下可能还有配置文件相关的缓存,删错了会影响 Codex 运行。保险的做法是用 Codex 自己的命令来清理,而不是手动物理删除。
一个常见的问题行为是:直接用rm -rf ~/.codex/sessions把整个目录删掉。这样做虽然能让界面回到“全新状态”,但如果有没来得及导出或没备份的重要对话,就彻底找不回来了。建议先压缩备份:
tar -czf codex_sessions_backup.tar.gz ~/.codex/sessions备份完成后再决定是删全部还是只删特定日期的目录。 sessions 目录下通常按日期分了子目录,你可以只删除最早的那部分,保留最近一段时间的热点会话。
5. 环境变量、插件冲突与避坑清单
这一节放在最后,是因为它属于“平时没问题,一换环境就出事”的隐藏雷区。很多看起来莫名其妙的报错,追到根上都是环境变量残留或者工具互相干扰。
5.1 OPENAI_API_KEY 等环境变量污染的排查
Codex 的 API Key 模式依赖环境变量。当你用 ChatGPT 账号登录时,理论上不需要 API Key,但如果你的 shell 配置文件(比如 .zshrc、.bashrc)里已经 export 了 OPENAI_API_KEY,Codex 检测到这个变量后可能会优先走 API Key 逻辑,或者和账号登录状态产生冲突。
表现就是:你已经用 ChatGPT 账号登录成功了,但执行任务时还是报错,一会儿提示鉴权失败,一会儿提示模型不可用。排查方式很简单:
env | grep -i api_key看到输出里有 OPENAI_API_KEY 或 DEEPSEEK_API_KEY 等变量,就说明环境被污染了。如果你确信用的是 ChatGPT 账号登录,可以临时把变量置空再启动 Codex:
unset OPENAI_API_KEY codex如果这样就能正常运行,说明冲突确实存在。更彻底的方案是:检查 .zshrc 或 .bashrc 里有没有相关的 export 行,把这些变量按需注释掉。毕竟同时维护多个 key 时,环境变量混在一起很容易出问题。
5.2 浏览器插件与第三方 API 的兼容性问题
Codex 是纯命令行工具,它本身不依赖任何浏览器插件。但热词里有人提到“codex 第三方 api 不能用浏览器插件”,我排查过一个类似案例,最后发现是插件占用了本地端口。
有些浏览器代理类插件、网络加速类插件会在本机开启一个监听端口,端口号可能和 CCSwitch 默认端口撞上。CCSwitch 起不来,Codex 的请求自然就发不出去,表现就是“第三方 API 不能用”。还有的插件会修改系统级代理设置,导致 Codex 的请求走了不期望的路径。
遇到这种情况,先把浏览器里可能影响网络请求的插件停掉,然后重新启动 CCSwitch,再试 Codex。如果恢复正常,那就可以确定是插件干扰。后续要么换一个端口给 CCSwitch,要么在不需要的时候保持插件关闭。标签页级的浏览器插件一般不影响 Codex,重点排查会监听端口或修改代理的设置。
5.3 多配置文件的推荐实践
踩过这么多坑之后,我现在的做法很简单,也建议你照这个思路来:不要在一个 config.toml 里反复改来改去,而是给不同的使用场景准备不同的配置目录。
Codex 支持通过环境变量指定配置目录,所以可以准备这样一套结构:
~/.codex-def/config.toml # 默认或 ChatGPT 账号登录配置 ~/.codex-deepseek/config.toml # 第三方 API 配置需要切换时,用环境变量启动:
CODEX_HOME=~/.codex-deepseek codex这样做的好处是:每个配置目录完全独立,包括登录状态、会话记录、模型配置。切换不互相污染,报错也好定位。CCSwitch 适合快速切换账号,而多目录方案适合切换完全不同的使用场景,两者可以结合使用。
关于版本,Codex 更新频率很高,升级后如果发现某个模型突然不支持了,先看是不是版本和模型的兼容性问题。查看当前版本:
codex --version如果升级后问题不断,可以先回退到之前稳定的版本,等确认新版兼容性没问题再升上来。有时候一个问题折腾半天,最后发现是版本太新、配置字段已经被改掉了,这种只能等官方更新或改配置来适配。
最后再分享两个小技巧
这几轮折腾下来,我的体会是:Codex 本身很稳,大部分故障其实都源于配置和运行环境的不自洽。你只要记住几条原则——认证方式决定能用哪些模型、config.toml 里 model 和 provider 必须对应、会话文件不会轻易丢只是路径可能变了——大部分问题都能快速定位。
再补充一个实际能用上的小经验:如果你用 CCSwitch 频繁切换账号,建议每次切换后先在终端跑一条最简单的命令验证链路通不通,比如codex exec "ok",通了再开始正式干活,别等到写了一半代码才发现代理有问题。
还有一条关于会话文件的:Codex 的会话文件是纯文本 jsonl,如果你有重要的对话内容想保留,可以直接用文本工具打开文件复制关键段落,也可以写个简单脚本定期把 sessions 目录打包备份。这个操作不复杂,但真的能在“会话不可见”事故发生时救你一命。