最近折腾 GLM-5.3 接 Codex 的人明显变多了,光 config.toml 加载失败这一个报错,我在不同群里就见了七八回。很多人卡住的点其实不在模型本身,而是没搞明白 Codex、config.toml、Codex++ 这三者的协作关系。这篇教程直接把这套链路从头到尾走一遍:怎么装、怎么配、怎么在 Codex++ 里跑起来,以及那些高频报错到底怎么定位。
先把结论放在最前面,方便你带着主线看下文:整条链路的核心就一句话——Codex 读 config.toml,config.toml 里指明用哪个模型、去哪个地址、拿哪把钥匙,Codex++ 只是把这一切包了一层图形界面。只要 config.toml 写对,剩下的事都好办。接下来我按实际动手的顺序,把每一步掰开讲清楚。
1. 折腾之前先把三样东西搞清楚
1.1 Codex 是个终端里的编码智能体,不是网页版聊天窗
很多人第一次接触 Codex,会误以为它跟 ChatGPT 网页版一样,是一个对话框。实际上 Codex 是一个跑在终端里的命令行工具,安装之后你在项目目录下敲一个codex,它会自己读你的项目文件、看 git 状态、规划要改哪些文件、动手写代码,甚至执行命令、跑测试、提交改动。
它的工作方式更像一个"驻场程序员":你把任务描述给它,它自己去调研代码库,然后一步一步完成。既然是终端工具,它的所有行为都受配置驱动,这就是 config.toml 存在的意义。Codex 原生支持的是 OpenAI 自己的模型,但它的底层设计留了一个口子——通过model_providers配置,可以把它指向任何兼容的模型服务地址。GLM-5.3 接入 Codex,本质上就是把这个口子打开,告诉 Codex"去智谱的接口拿模型"。
1.2 config.toml 是 Codex 的"遥控器"
config.toml 在 Codex 里的地位,相当于遥控器上的所有按键。它决定了三件事:用哪个模型、模型服务在哪、用什么方式验证身份。默认路径在用户目录下的.codex文件夹里,macOS 和 Linux 是~/.codex/config.toml,Windows 是%USERPROFILE%\.codex\config.toml。
和它同目录的还有一个auth.json,专门存登录凭证。理解这两个文件的分工很重要:config.toml 说"我要连智谱的 GLM-5.3",auth.json 负责回答"你凭什么连"。如果两边对不上,就会出现各种错配报错,尤其是历史对话恢复时,Codex 会严格按照当时创建的配置去解析,配置一旦被改过,这条对话串就续不上了。后面第 5 节我会专门展开这个坑。
1.3 Codex++ 是壳,不是另一个 Codex
Codex++ 是社区做的桌面图形界面封装。它解决的是纯终端操作的门槛问题:不用背命令、不用记参数,打开软件选个目录就能开始对话,还带历史会话管理、界面汉化、模型切换的可视化选项。
但这里必须强调一个关键认知:Codex++ 不是另一个独立的 Codex。它底层调用的还是 Codex 命令行,读的还是同一个~/.codex/config.toml。这带来一个好处——你在命令行里熟悉的配置知识,在 Codex++ 里完全通用;但也带来一个常见的误解——很多人以为 Codex++ 自己有独立的配置中心,结果在软件里改了半天没用,其实改的就是同一个文件。遇到问题先回命令行验证,往往比在图形界面里瞎点效率高得多。
2. 安装与准备环节最容易忽视的细节
2.1 Codex CLI 的三条安装路线
Codex 的安装方式有好几种,我按推荐程度排一下:
- npm 安装:
npm install -g @openai/codex,适合前端或者本来就装了 Node 环境的机器,更新也方便,一条命令搞定。 - Homebrew 安装:macOS 用户执行
brew install codex,跟系统包管理走,卸载干净。 - 直接下载二进制:从 GitHub Releases 里下载对应系统的压缩包,解压后放到 PATH 目录里。适合不想装 Node 的环境。
装完第一件事是验证版本:终端里敲codex --version,能打出版本号就说明装好了。这里有个小提醒:如果你之前装过其他版本的 Codex 或者用过测试版,建议先看下版本号,新版对model_providers的字段校验更严格,老配置里一些宽松写法可能直接报错。后面遇到"昨天还能用今天突然报错"的情况,先想想是不是自动更新把版本换了。
2.2 Codex++ 桌面版装好之后先别急着开
Codex++ 分桌面版和网页版,日常本地开发用桌面版。Windows 和 macOS 都有对应的安装包,下载后按常规流程装。这里我建议装完之后先不要急着双击打开,因为第一次启动它会自动创建~/.codex目录,如果你机器上没有这个目录,它生成的默认配置里 model 指向的还是 OpenAI 官方模型,没有 API Key 的情况下第一次对话必然报错。
更省事的顺序是:先装 Codex CLI,再手动把 GLM 的配置写好,最后才启动 Codex++。这样图形界面一打开,读到的就是一份已经可用的配置,能省掉一轮"软件里报错→去命令行查→回来重试"的往返。另外 Windows 用户注意一点:desktop 版启动时会拉起一个后台进程负责跟 Codex CLI 通信,第一次运行如果防火墙弹窗问是否允许,记得允许,否则后面会卡在"正在重新连接"的转圈界面。
2.3 智谱 API Key 与模型标识
接入 GLM-5.3 之前,你需要去智谱开放平台创建一个 API Key。创建完之后你会拿到一串sk-开头的密钥。这个 Key 相当于你调用模型资源的门票,务必放好,别贴到公开仓库里。
模型标识也要提前确认清楚。GLM 系列现在常见的两个标识是glm-5.3和glm-5.3-flash。前者是完整版,推理能力强,适合复杂编码任务;后者是小参数快速版,响应快、成本低,适合简单问答和轻量任务。Codex 配置里的model字段必须填服务端能识别的准确标识,填错一个字都会直接报模型不存在。
拿到 Key 之后,先做一个最简单的连通性验证,避免把问题带进 Codex 配置里。在终端设置环境变量,然后直接调用接口:
export ZHIPU_API_KEY="sk-你的密钥" curl https://open.bigmodel.cn/api/paas/v4/chat/completions \ -H "Authorization: Bearer $ZHIPU_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"glm-5.3","messages":[{"role":"user","content":"你好"}]}'能返回一段正常的 JSON 回复,说明 Key 有效、模型标识正确、网络到服务端通顺,接下来就可以放心配置 Codex 了。这一步很多人跳过,结果后面 Codex 报错时,得先花时间排除到底是 Key 的问题还是配置的问题,白折腾。
3. config.toml 接入 GLM-5.3:逐字段拆解与完整模板
3.1 配置文件的位置与基本层级
Codex 读取配置的顺序是固定的:全局配置在~/.codex/config.toml,项目目录下还可以放.codex/config.toml做局部覆盖。日常接 GLM 只需要动全局那份。TOML 的格式跟 INI 有点像,但要求更严格:键值对、表头、字符串引号都有规范,一个中文字符串忘了加引号,或者表头写错位置,整个文件就会加载失败。
配置文件里分两个层级:顶层是全局设置,比如model和model_provider,直接写在文件开头;[model_providers.xxx]开头的是表,每个表定义一个可用的模型服务商,里面可以写地址、写协议类型、写环境变量名。Codex 启动时会先把所有 provider 表读进来,再用顶层的model_provider字段去定位应该用哪一张表。这个"顶层引用 + 表定义"的结构,是后面排查各种报错的钥匙。
3.2 一套可以直接抄的配置模板
下面是我实测可用的最小配置,你只需替换自己的 API Key 环境变量即可:
model = "glm-5.3" model_provider = "glm" [model_providers.glm] name = "GLM" base_url = "https://open.bigmodel.cn/api/paas/v4" env_key = "ZHIPU_API_KEY" wire_api = "chat"逐行解释一下:
model:告诉 Codex 用哪个模型,填glm-5.3或glm-5.3-flash,必须和 provider 服务端认可的标识完全一致。model_provider:这里的值必须和下面表格的名字严格匹配。你写glm,下面就必须有[model_providers.glm]这个表头,大小写也要一致。name:给这个 provider 起的显示名,纯粹给人看的,Codex++ 的界面里会用到。base_url:模型服务的基础地址,Codex 会把路径补全后发起请求。国内智谱开放平台用的是 OpenAI Chat 兼容协议,填到/api/paas/v4即可,不要带末尾的/,也不要拼上/chat/completions,那部分 Codex 会自己处理。env_key:Codex 会从这个环境变量名里读取 API Key,运行时自动拼到请求头里。wire_api:协议类型,chat表示走 OpenAI Chat Completions 兼容协议。
写完之后,把环境变量配置到你的 shell 配置里(macOS/Linux 加进~/.zshrc或~/.bashrc,Windows 用setx ZHIPU_API_KEY "sk-xxx"写用户环境变量),然后开一个新的终端窗口,让变量生效。
3.3 wire_api 到底怎么选
wire_api是接入时要重点决策的字段,它的取值决定了 Codex 用哪种协议跟服务端说话。目前主流就三种:
| 端点支持的协议 | wire_api 取值 | 典型场景 |
|---|---|---|
| OpenAI Responses API 原生协议 | responses | OpenAI 官方端点或完全兼容 Responses 的服务 |
| OpenAI Chat Completions 兼容协议 | chat | 大多数兼容 OpenAI 格式的模型服务,智谱国内端点属于此类 |
| Anthropic Messages 协议 | anthropic | 走 Anthropic 兼容格式的端点 |
很多教程只给结论不解释原因,这里说下内在逻辑:Codex 本身是为 OpenAI 的 Responses 协议设计的,但为了兼容第三方模型,它把协议层做成了可插拔。chat协议是最通用的,因为市面上的兼容服务绝大多数实现的是 Chat Completions 格式,智谱的 v4 接口就是这种。如果你用的是智谱国际端点 z.ai,那边可能同时提供 Anthropic 兼容格式,wire_api可以按实际情况填anthropic。拿不准的时候,先用 curl 分别试两种路径,看哪个能返回正常响应,再定配置,这是最笨也最可靠的办法。
3.4 API Key 放环境变量还是 auth.json
Codex 有两种身份模式:官方账号登录模式和 API Key 模式。env_key指向环境变量,就是典型的 API Key 模式,适合第三方模型服务。而auth.json里存的是 OpenAI 官方登录态,当配置里没有env_key或者 provider 被标记为需要官方认证时,Codex 才会去读它。
这里有个很隐蔽的坑:如果机器上之前登录过 OpenAI 账号,auth.json里残留了 token,Codex 可能优先尝试官方认证,导致自定义 provider 不被采纳。所以接入 GLM 时,建议把auth.json里的内容清掉,只保留环境变量这一条身份通道。不要删文件本身,Codex 启动时会自动创建它,你只需确保里面没有多余的登录态即可。另外,如果你的 Codex 版本比较旧,可能还需要在[model_providers.glm]表里加一行requires_openai_auth = false,强制跳过官方登录校验;新版一般会根据有没有env_key自动判断。
4. Codex++ 可视化接入与第一次对话验证
4.1 GUI 里配置 provider 的通用套路
Codex++ 这类桌面封装,界面虽然各不相同,但配置 provider 的逻辑几乎是一致的:设置里会有一个"模型服务商"或"Provider"的区域,里面要么让你直接编辑 config.toml,要么给你表单让你填名称、地址、模型。我建议在 GUI 里优先找"打开配置文件"这类入口,直接编辑文本。表单式填写虽然看着方便,但字段名跟你熟悉的 config.toml 不一定一一对应,填错还不好排查。
如果你用的 Codex++ 版本支持多 provider 管理,那就把 GLM 作为一个独立 provider 加上,模型填glm-5.3,服务商选自定义,API Key 填环境变量名ZHIPU_API_KEY。它的界面会显示当前生效的模型名称,确认显示的是 GLM-5.3 而不是某个 OpenAI 模型,再继续下一步。这一步是很多人的认知盲区:图形界面里显示的模型,其实就是从 config.toml 的model字段读出来的,界面改了配置,本质还是在改文件。
4.2 第一次启动前的检查清单
我每次在新环境接入之前,都会花两分钟过一遍这个清单,能过滤掉八成低级报错:
codex --version能正常输出版本号,CLI 本体可用。echo $ZHIPU_API_KEY能看到 Key 的前缀,环境变量已经注入到当前会话。- curl 直连模型接口返回正常 JSON,服务端侧没有问题。
- config.toml 里
model_provider的值和[model_providers.glm]的表头完全一致。 base_url末尾没有多余的斜杠或路径。auth.json中没有残留的 OpenAI 登录态。
Windows 用户额外确认一件事:环境变量是在启动 Codex++ 之前就设置好的,因为 desktop 版启动后拉起的子进程只能继承启动那一刻的环境变量,你先开软件再设变量,软件里读不到。改完setx之后,一定要完全退出 Codex++ 再重开,不是关窗口,是退到托盘后彻底结束进程。
4.3 跑通之后长什么样
当你第一次在 Codex++ 里发出一条任务指令,比如"分析当前项目的目录结构",正常情况下它会先显示模型加载信息,然后开始读项目文件,再给出它的理解和计划。你可以接着问一句"你现在使用的是什么模型",它会回答自己是 GLM-5.3——这一步能直观确认模型确实切换成功了,而不只是界面显示换了名字。
还有一个值得做的验证:让它修改一个测试文件,比如创建一个hello.txt并写入一行文字。如果这个操作成功,说明 Codex 的 Agent 核心链路(读文件、写文件、执行动作)在 GLM 上跑通了。到这里,接入工作就算基本完成。后面遇到任何异常,记住一个原则:先在终端里跑同样的操作,看 CLI 的原始输出,再回到 GUI 排查,别在图形界面里反复开关软件。
5. 高频报错排查链路:照着报错文本逆推根因
5.1 "无法加载 config.toml"与历史对话无法继续
这个报错最常见,英文版是can't load config.toml, so this thread can't resume. fix config.toml:model provider ...,中文界面会显示"因此此对话串无法继续。请修复 config.toml:model"。它的完整排查链路是这样的:
第一步,先在终端直接敲codex看原始报错。GUI 会把错误信息包装一遍,可能丢掉关键字段。终端里能看到更完整的提示,尤其是它指出哪一行配置有问题。
第二步,打开~/.codex/config.toml,重点检查三处:TOML 语法是否正确(字符串有没有引号、表头是否对齐);顶层model_provider引用的名字是否真实存在对应的[model_providers.xxx]表;模型名是否写成了服务端不认识的字符串。我见过最多的原因是,用某些切换工具改过配置后留下一个半截 provider 名,比如报错里提示providercusto...``,说明有人把custom写了一半,工具崩溃时没写完。
第三步,看auth.json是否还在认证旧账号。如果你之前用 OpenAI 账号登录过,后来切换成 GLM 的 API Key 模式但没清登录态,Codex 恢复历史对话时会拿着旧的身份去请求新的模型服务,自然失败。
第四步,如果你动了配置导致历史对话打不开,而且不在乎那几条旧对话,直接删掉.codex/sessions或对应会话目录重开即可。如果对话很重要,就把配置恢复到创建那条对话时的状态,再尝试恢复。
5.2 "model is not supported when using codex with a chatgpt account"
这个报错出现的场景很典型:你明明在 config.toml 里配好了glm-5.3,但启动时报错说某个模型在使用 ChatGPT 账号时不受支持。这句话的关键在最后半句——with a chatgpt account。
Codex 的官方账号登录模式,对模型列表是有白名单限制的。你用自己的 ChatGPT 账号登录时,Codex 只允许你使用账号权限范围内的官方模型;当你强行把model改成第三方模型,它就直接拒绝。
解决方案很明确:放弃账号登录模式,改用 API Key 模式。把 config.toml 里的 provider 配置成带env_key的形式,清掉auth.json里的登录态,然后重启。这样 Codex 不再校验模型白名单,而是把你配置的模型名原样发给服务端,由智谱端来判断模型是否存在。记住一个判断原则:只要你在用第三方模型服务,身份模式就必须是 API Key,而不是 ChatGPT 账号。
5.3 cc-switch 切换失败拖垮整个配置
cc-switch 是社区里用来在多个 Codex/Cline 配置之间快速切换的小工具,比如在 OpenAI、DeepSeek、GLM 之间一键切换。它的原理是把你保存的多套 provider 配置写回到config.toml。这个工具本身没毛病,但它有一个致命场景:如果切换的瞬间,Codex 进程还在运行,两边同时在读写同一个文件,就可能写出半份配置。
典型的报错是切换时提示在codex endpoint /responses这一步失败,后面跟一串 provider 相关提示。出现这种报错,先别急着重新切换,按这个顺序处理:先彻底退出 Codex 和 Codex++,确保没有进程占用配置文件;然后检查 config.toml 是不是被写坏了,看有没有不完整的表头或残留的旧 provider 段;如果工具做过配置备份,直接恢复备份;没备份就手动把配置改回你前面验证过的那套 GLM 模板。
另外有一个关联坑:cc-switch 切换后,Codex 的历史对话打不开。原因是历史会话在创建时绑定的是当时的model_provider名字,切换工具把 provider 表改名了,Codex 找不回原来的 provider 定义,于是拒绝恢复。这种情况要么把配置切回去,要么调整model_provider指向现有表。我的建议是:切换工具只在你确定要长期换模型的场景用,日常调试还是手动改配置文件最可控。
5.4 打不开、反复重连、端点无响应
最后一类问题跟模型配置无关,属于环境问题。表现为:Codex++ 打开后一直"正在重新连接",或者发消息后长时间无响应,最后报端点错误。
先验证端点连通性,用前面那串 curl 命令直连模型接口。如果 curl 正常而 Codex 报错,问题大概率在环境变量注入,检查 Codex++ 启动进程是否能拿到ZHIPU_API_KEY。如果 curl 超时或连接失败,那是本机到服务端的网络问题,检查 DNS 解析、防火墙规则,Windows 用户尤其要注意首次运行时防火墙是否拦截了后台进程。
再说端口占用。Codex++ 这类桌面应用通常会起一个本地端口供界面和 CLI 通信,如果端口被占用,就会反复重连。处理方式是把软件彻底退出,查到占用端口的进程并结束,再重启。macOS 下可以用lsof -i :端口号查,Windows 用netstat -ano | findstr 端口号。整体思路就是:先区分是模型服务端的问题,还是本机进程环境的问题,一条条排除,不要每次都删配置重来,那样既耗时也找不到根因。
6. 实操之后的几点经验补丁
6.1 GLM-5.3 与 GLM-5.3-flash 怎么分工
我实际用下来,这两个模型在 Codex 里的分工差异还是挺明显的。GLM-5.3 适合复杂的多轮编码任务,比如分析一个陌生仓库、重构模块、跨多个文件改动,它的推理深度和上下文理解明显更扎实;GLM-5.3-flash 则适合快速问答、生成代码片段、解释报错信息这类轻量场景,响应速度快,token 消耗也低。
在 Codex 里长时间跑 Agent 任务的时候,我倾向直接用 GLM-5.3,因为 Codex 会自主规划多步骤操作,每一步都可能影响后续判断,模型能力弱了容易跑偏。如果你只是把 Codex 当高级问答工具用,那 flash 更划算。切换模型很简单,只改 config.toml 里的model一行即可,model_provider不用动。
6.2 备份和切换的日常习惯
接入一次 GLM 后,强烈建议把这份配置存成模板文件,别每次重新敲。我自己的习惯是在~/.codex/下放一个config.toml.glm.bak,每次要从别的 provider 切回 GLM 时直接复制覆盖:
cp ~/.codex/config.toml.glm.bak ~/.codex/config.toml切到其他 provider 之前,也养成先备份当前配置的习惯。我在踩过一次"切换工具写坏配置、又没备份、只能凭记忆重写"的坑之后,就再也没省过这一步。如果你愿意多花几分钟,还可以把配置模板放进 dotfiles 仓库管理起来,换新机器时一分钟还原环境。
6.3 多人协作时配置怎么管
如果你在团队里推广这套接入方案,有个关键点:绝不能让每个人各自手敲 config.toml,那样一定会出现五花八门的报错。正确做法是维护一份公共模板,模板里不含任何人的 API Key,每个人只需要把env_key指向自己的环境变量。这样每个人的配置文件内容一致,只有环境变量里的 Key 不同,排查问题时有统一的参照。
另外建议把模型标识和 base_url 写进团队的说明文档,因为智谱的接口参数偶尔会有调整,一旦服务端改了什么,公共模板统一更新,所有团队成员同步即可,不用一个一个去通知。
最后再分享一个我自己的小习惯:日常调试模式下,维持model = "glm-5.3-flash",因为响应快、迭代调参方便;确认逻辑没问题后,再切回glm-5.3跑正式任务。这套"快模型调试、强模型执行"的搭配,在 Codex 里尤其好用,既省钱又不耽误事。希望这篇折腾笔记能帮你把 GLM-5.3 顺顺当当地跑进 Codex 里。