ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Codex config.toml 配置全解析:字段、报错与第三方模型接入

2026/9/19 13:25:26 拓冰建站 浏览量
Codex config.toml 配置全解析:字段、报错与第三方模型接入 周末帮一个朋友排查 Codex 启动即报错的问题日志里反复出现cant load config.toml。打开他的~/.codex/config.toml第一行就写着model gpt-5.6-sol——这个模型名明显是从某篇教程里复制来的Codex 根本不认。改回model gpt-5之后立刻恢复正常。这个场景我见过太多次了。Codex 作为命令行 AI 编程工具安装本身不算难真正让人卡住的往往是那个藏在~/.codex目录下的config.toml。它决定了你用哪个模型、走哪个 API 地址、命令执行需不需要你批准甚至是接入 DeepSeek 这类第三方模型的关键入口。网上关于这个文件的资料大多是官方文档的翻译字段讲得干巴巴的遇到报错还是不知道怎么查。这篇文章不打算复读官方文档而是把config.toml的每个字段、每条高频报错的排查链路按我实际用下来的经验拆开讲一遍。不管你是刚装上 Codex 的新手还是已经被各种报错折磨过的老手应该都能从中找到能直接抄作业的部分。1. config.toml 在配置体系里的位置这几层关系先理清楚1.1 文件在哪、什么时候被读取~/.codex/config.toml是 Codex CLI 的主配置文件路径中的~代表当前用户的主目录。在 Windows 上就是C:\Users\你的用户名\.codex\config.toml。这个文件不是安装时自动生成的吗准确说是第一次运行 Codex 时生成的安装包本身只负责把可执行文件放好配置目录是运行时才建立的。我第一次看这个目录的时候里面其实不止一个文件。完整的~/.codex目录大致长这样~/.codex/ ├── config.toml ├── auth.json ├── sessions/ │ ├── 2025-01-15-abcdef123456.json │ └── ... └── logs/ ├── codex-tui.log ├── codex-exec.log └── ...config.toml主配置所有模型、权限、网络相关的设置都在这里。auth.json登录凭据codex login写入的 token 就存这个文件。sessions/每次对话的历史会话记录Codex 能接着聊靠的就是它。logs/运行日志排查问题时的第一手资料。有个细节容易被忽略ChatGPT 桌面端在恢复 Codex 会话时读的也是同一个config.toml。网上那句chatgpt cant load config.toml, so this thread cant resume说的就是桌面端加载这个文件失败导致会话无法继续。所以这个文件不只是 CLI 在用桌面端也在用配坏了影响面比想象中大。读取时机方面Codex 每次启动都会重新解析一遍config.toml不存在改完要重启守护进程这种说法。但是有一点要注意如果同时开着多个终端会话已经跑起来的那个会话不会重新读取配置新配置只对之后启动的会话生效。这个现象经常被误认为配置改了不生效其实是没开新会话。1.2 配置优先级默认值、配置文件、环境变量、命令行参数我明明在 config.toml 里写了model gpt-5为什么跑起来还是别的模型这类问题的根源八成是没搞清楚配置优先级。Codex 的配置来源从低到高大致是优先级配置来源例子低内置默认值默认模型、默认审批策略中低config.toml 文件model gpt-5中高环境变量OPENAI_API_KEY、CODEX_HOME高命令行参数codex --model gpt-5命令行参数优先级最高其次是环境变量再次才是配置文件。这意味着如果你的 shell 里导出了OPENAI_API_KEY而 config.toml 里又把某个第三方 provider 的env_key指向了同一个变量实际生效的 key 可能会让你摸不着头脑。另外还有一个容易被忽略的变量CODEX_HOME。它可以改变整个配置目录的位置比如CODEX_HOME/tmp/codex-test codex就会去/tmp/codex-test目录找配置。这个变量在测试多套配置时特别好用不用动你正式的~/.codex就能起一个完全隔离的 Codex 环境。我排查问题时的标准操作就是先设一个临时的CODEX_HOME看默认配置能不能跑通再逐步把配置一项项拷过来定位是哪一行出了问题。2. 顶层字段逐个拆model、sandbox_mode、approval_policy 和那些调试开关2.1 model 与 model_provider模型名写错的典型翻车现场model是 config.toml 里最基础、也最容易写错的字段。它指定 Codex 默认使用的模型名支持在启动时用--model参数临时覆盖。model gpt-5model_provider则指定这个模型由哪个服务商提供。Codex 默认内置了 OpenAI 的 provider所以最简配置只需要写model一行就够了。配置文件里的 provider 定义在[model_providers.xxx]段落下这部分后面单独讲。热搜索里那条the gpt-5.6-sol model is not supported when using codex with a...报错就是模型名写错或者说模型与当前配置方式不匹配的典型案例。gpt-5.6-sol这个名称既不是 OpenAI 官方模型名也不是任何已接入 provider 支持的模型Codex 或上游 API 会直接拒绝。我自己踩过的坑是某次从同事的配置里复制了一个模型名忘了他的版本和我的不一样结果启动时报了一串看不懂的错。后来养成了一个习惯——不确定模型名时先去对应服务商的模型列表页确认或者直接跑codex看启动后的默认行为不要在配置里猜。还有一点值得注意Codex 有个机制当配置里写的模型名在当前 provider 下不可用时会回退或直接报错。不同版本的 Codex 对非知名模型的处理方式不一样有的版本允许你把任意名字透传给 API让上游去校验有的版本会在本地就拦下来。所以遇到 model 相关报错第一件事是确定你用的 Codex 版本再判断报错来自本地校验还是上游 API。2.2 sandbox_moderead-only、workspace-write、danger-full-access 的边界sandbox_mode控制 Codex 执行命令时的文件系统访问范围属于安全相关的高危配置sandbox_mode workspace-write三个模式的区别很直观read-onlyCodex 只能读不能写适合复盘代码、生成建议、做代码审查。想改文件会失败需要手动批准或者切模式。workspace-write只允许在启动 Codex 时所在的工作目录内做修改。这是我最常用的模式既能写代码又不会让它跑到项目外乱动。danger-full-access完整的系统访问权限Codex 可以改任何文件、执行任何命令包括rm -rf。用生活化的话说read-only是只准看不准摸workspace-write是只能在房间里折腾danger-full-access是整个房子都归你管拆了承重墙后果自负。我的建议非常直接日常开发用workspace-write只有在跑一些明确需要全局安装依赖的脚本时才临时切到danger-full-access用完立刻切回来。别图省事长期挂着最高权限。Codex 的定位是辅助工具权限边界越清晰出事故的概率越低。2.3 approval_policy命令执行的审批策略sandbox_mode管的是能不能碰approval_policy管的是要不要问你[approval_policy] mode on-requestmode有三个取值unconstrained所有命令自动批准全程无打扰。适合完全信任脚本内容的场景但一般不建议。on-request默认模式。Codex 执行敏感命令比如写文件、装依赖、跑脚本前会弹确认你同意才继续。never永远不批准Codex 只会生成命令或计划不会实际执行。适合只想让它出方案、不想让它动手的场景。on-request模式下还可以配allow_patterns和deny_patterns用正则表达式精确控制哪些命令自动放行、哪些命令坚决拦截[approval_policy] mode on-request allow_patterns [^npm test$, ^pytest ] deny_patterns [^rm -rf /, ^git push --force, ^sudo ]这里有个细节值得注意deny_patterns的优先级高于allow_patterns也就是说一条命令同时命中两个列表时会按拒绝处理。我配置 deny 列表时习惯把高危操作全塞进去比如强制推送、删库、sudo 提权宁可多几步手动确认也不想哪天手滑让 Codex 帮我清理磁盘。2.4 autoupdate 与 verbose平时不起眼、排障时救命的开关autoupdate true verbose falseautoupdate控制 Codex 是否自动检查新版本。默认开如果你在隔离环境或者希望版本完全可控可以关掉。verbose才是真正值得重视的开关。平时false就行一旦遇到诡异问题把它改成true然后重新跑一次Codex 会输出大量内部日志。更完整的日志在~/.codex/logs/目录下包括 TUI 界面的日志和执行命令的日志。我之前排查auth token is unavailable的问题时就是靠codex-exec.log里的完整错误栈定位到是 auth.json 权限不对而不是 token 本身失效了。日志文件的轮转也是值得注意的点Codex 会定期清理历史日志但排查问题时最好先备份一份当前日志再复现避免现场被覆盖。3. model_providers 才是 config.toml 的精华接 DeepSeek、换网关都靠它3.1 Provider 结构name、base_url、env_key、wire_api很多教程只教你改model没告诉你真正决定Codex 能不能接上某个 API的是[model_providers.xxx]这一段。它的结构类似这样[model_providers.deepseek] name DeepSeek base_url https://api.deepseek.com/v1 env_key DEEPSEEK_API_KEY wire_api chat逐个解释nameprovider 的显示名称随便起给你自己看的。base_urlAPI 地址。Codex 会往这个地址后面拼路径发请求。注意不同的wire_api拼的路径不一样这个后面细说。env_key指定从哪个环境变量读取 API key。比如env_key DEEPSEEK_API_KEYCodex 启动时会去读DEEPSEEK_API_KEY这个环境变量作为鉴权凭证。wire_api请求协议格式responses或chat这是最容易配错的一项。定义好 provider 之后再通过顶层的model_provider字段指定要用哪个model deepseek-chat model_provider deepseek这里有个常见的思维误区很多人以为第三方模型的 key 可以直接写进配置文件。实际上 Codex 的设计思路是 key 从环境变量走配置文件里只放变量名。这么设计的好处是配置文件可以进版本库、可以分享给别人key 却不会泄露。我强烈建议不要把 API key 明文写进 config.toml一个不小心 git push 出去别人的损失就是你的损失。3.2 接入 DeepSeek 的完整配置与验证步骤DeepSeek 是目前最热门的第三方接入目标之一配置其实很固定。以 DeepSeek 官方 API 为例完整步骤如下。第一步设置环境变量。在 Linux/macOS 的 shell 里export DEEPSEEK_API_KEYsk-你的keyWindows PowerShell 里$env:DEEPSEEK_API_KEYsk-你的key第二步写入配置文件。编辑~/.codex/config.toml把内容改成下面这样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如果正常进入对话界面说明配置生效了。随便问一句用一句话说明你现在能做什么看它怎么回答。如果启动时提示模型不存在或 API 返回 404先去 DeepSeek 的模型列表页确认当前可用的模型名。不同时期 DeepSeek 提供的模型名会变化比如对话模型和推理模型用的就是不同的名字写错任何一个都会触发 model not supported 一类的报错。接入其他兼容 OpenAI 协议的服务商比如各种国内大模型平台、私有化部署的网关思路完全一样照着 DeepSeek 的模板换成对应服务的base_url、env_key、wire_api和模型名就行。90% 的兼容 API 走wire_api chat都能通。3.3 wire_api 究竟选哪个responses 和 chat 的区别wire_api是新手最容易忽略却最影响成败的字段。它决定了 Codex 用哪种协议格式和上游通信。responsesOpenAI 新的 Responses APIbase_url后面拼的是/responses路径。Codex 对 OpenAI 官方 API 默认用这个功能最全支持工具调用、推理过程等。chat传统的 Chat Completions API路径是/chat/completions。绝大多数第三方模型服务商兼容的是这个因为它就是当年 OpenAI 开放的标准格式。如果配错了比如上游只支持 chat 格式你却写了wire_api responses请求打到/responses路径上轻则 404重则返回一堆格式不兼容的报错。反过来也一样。我判断wire_api的唯一标准是看服务商文档里写的是兼容 OpenAI Chat 接口还是支持 Responses API。绝大多数第三方写的都是前者那就不假思索选chat。还有一个小技巧Codex 自带几个常见的 provider 定义你可以在配置里覆盖它们。比如想改官方 OpenAI 的入口地址可以直接写[model_providers.openai] name OpenAI base_url https://api.openai.com/v1 env_key OPENAI_API_KEY wire_api responses某些内部网关会要求自定义base_url这时候覆盖内置 provider 比新建一个更省事因为 Codex 对openai这个名字有一些内置的特殊处理覆盖它兼容性最好。4. 热搜索榜上的高频报错我把逐条排查链路走了一遍4.1 cant load config.toml从文件本身找原因这条报错在 CLI 和 ChatGPT 桌面端都出现过完整描述通常是cant load config.toml, so this thread cant resume或中文版的无法加载 config.toml。既然是加载失败根因集中在三个地方。第一TOML 语法错误。这是最常见的原因。TOML 对格式要求比较严格字符串该加引号没加、数组用逗号分隔却写了中文逗号、[section]段落的括号拼错都会导致解析失败。我之前见过一个案例同事在某行配置后面多打了个中文字符Codex 直接拒绝加载整个文件。排查语法问题有个可靠的办法用 Python 自带的 tomllib 解析一遍Python 3.11python3 -c import tomllib; tomllib.load(open(/home/你的用户名/.codex/config.toml, rb))没有任何输出就说明语法没问题报错则会明确告诉你第几行出了问题。第二文件权限不对。Codex 对配置文件的权限比较敏感。如果文件是 root 所有或者权限过宽比如 777某些情况下会拒绝读取或提示不安全。正常情况下~/.codex/config.toml应该是当前用户所有权限 600 或 644 都可以。排查命令ls -l ~/.codex/config.toml如果所有者不对用chown改回来如果担心权限问题直接chmod 600 ~/.codex/config.toml。第三文件编码问题。在 Windows 上尤其常见。用记事本编辑过配置文件后文件可能被保存成带 BOM 的 UTF-8或者干脆是 GBK 编码Codex 解析时直接失败。建议用 VS Code、Notepad 这类能明确控制编码的编辑器统一保存为 UTF-8 无 BOM。排查流程总结下来就三步先看语法再看权限最后看编码。我在实际排查中遇到的大多数问题都倒在第一步。4.2 model is not supported模型名与运行环境的错位热搜索里那条the gpt-5.6-sol model is not supported when using codex with a...报错本质是模型名和不支持的运行环境组合撞在了一起。触发它的情况主要有几种配置文件里写了当前 Codex 版本不认识、或者当前账号/套餐用不了的模型名。模型名是网上教程里抄来的而那个教程针对的是不同的服务商或不同的版本。第三方 provider 的模型名写错比如服务商已经下线了某个模型但配置里还在用。排查思路很直接先绕过配置文件验证模型名本身是否可用。比如怀疑是模型名的问题可以在启动时临时指定codex --model gpt-5如果命令行指定的模型能跑通说明问题出在配置文件里写错了名字。改配置不改别的。如果是第三方服务商直接去对方文档确认当前可用的模型名。DeepSeek 这类服务商的模型列表是动态变化的旧教程里的模型名很可能已经过期。记住一个原则模型名以服务商当前文档为准不以任何人的配置为准。4.3 auth token is unavailable认证链路断在了哪一环这条报错的排查价值很高因为它的根因不止一种。Codex 的认证分两条链路。用 OpenAI 官方服务时codex login会生成一个 token 存到~/.codex/auth.json用第三方 provider 时靠的是环境变量里的 API key。先说官方链路。auth token is unavailable 最常见的原因就是 auth.json 不存在或内容损坏。排查ls -l ~/.codex/auth.json cat ~/.codex/auth.json如果文件不存在重新登录codex login如果文件存在但报错依旧先确认文件是否有完整的 JSON 结构一个access_token或id_token字段具体看版本再确认当前用户有没有读写权限。有时候系统清理工具会把这类隐藏目录的临时文件删掉或者锁住也会出现诡异行为。再说第三方链路。如果你已经配好了 DeepSeek却还是报 auth token 相关错误基本可以确定是环境变量没生效。在同一个终端里执行echo $DEEPSEEK_API_KEY如果输出为空说明环境变量没设置。另一个隐蔽的坑是在配置了第三方 provider 之后Codex 可能仍然要求一个 OpenAI 的登录态具体表现因版本而异。出现这种情况时检查你用的 Codex 版本对应的 provider 配置要求看是否需要额外的字段来跳过 OpenAI 认证或者干脆跑一次codex login补一个官方登录态。4.4 关于 cc switch local proxy failed while handling codex endpoint /responses 的排查这条报错在热搜索里出现得很频繁说的是本地某个转发组件在处理/responses请求时失败了。从报错字面看请求已经到了本地转发这一层但转发过程没能完成。我排查这类问题的顺序是这样的。第一步确认系统的代理相关环境变量。在终端里执行env | grep -i proxy如果存在HTTP_PROXY、HTTPS_PROXY、ALL_PROXY这类变量并且指向的地址当前不可用比如公司代理本身在维护、或者地址写错了就会导致本地程序无法正常转发 HTTPS 请求。可以临时把代理变量清空做一次对照测试unset HTTP_PROXY HTTPS_PROXY ALL_PROXY codex注意这只是在临时验证验证完记得恢复因为有些网络环境确实需要代理才能访问外网清空后可能连不上 API。第二步排查端口冲突。Codex 桌面端或某些集成环境会在本地监听一个回环地址端口如果这个端口被其他程序占用转发就会失败。Windows 上可以用netstat -ano | findstr 端口号查看谁占用了端口。第三步看日志。把~/.codex/logs/下最新的日志文件打开搜索报错时间点附近的内容重点看有没有connection refusedtimeoutcertificate这类关键词它们能直接指向问题类型。第四步如果以上都查不出问题重启相关应用让本地转发组件重新初始化。这类本地转发组件挂在后台偶发性的初始化失败并不少见重启通常能解决六成以上的偶发问题。5. 可以直接抄作业的配置模板日常开发、第三方模型、扩展工具三套方案5.1 官方 OpenAI 日常使用模板如果你主力用的是 OpenAI 官方服务这套配置够用且相对安全model gpt-5 model_provider openai sandbox_mode workspace-write autoupdate true verbose false [approval_policy] mode on-request deny_patterns [^rm -rf, ^git push --force, ^sudo ]这套配置的特点是模型用当前可用的最新版工作目录内可写高危命令要经过确认强制推送和删库操作直接拉黑。适合绝大多数日常编码场景。如果你发现gpt-5这个名字在你的账户下不可用去官方文档确认当前支持的模型名替换即可。模型名本身就是会迭代的东西配置里写死一个版本是正常操作但当它失效时要有意识去更新。5.2 第三方模型以 DeepSeek 为例模板第三方模型的核心思路是用model_providers自定义服务商我再给一套更完整的模板model deepseek-chat model_provider deepseek sandbox_mode workspace-write [approval_policy] mode on-request [model_providers.deepseek] name DeepSeek base_url https://api.deepseek.com/v1 env_key DEEPSEEK_API_KEY wire_api chat配套的环境变量设置前面已经写过把DEEPSEEK_API_KEY导出到当前 shell 环境即可。Windows 用户注意PowerShell 里设置的环境变量只对当前窗口有效关掉窗口就没了如果不想每次重新设置可以用setx写入用户级环境变量setx DEEPSEEK_API_KEY sk-你的key用 setx 之后要新开一个终端才生效。5.3 用 MCP 服务器扩展 Codex 的能力config.toml里还藏着一块很多人没用起来的功能MCPModel Context Protocol服务器配置。它能让 Codex 调用外部工具比如读写本地文件系统的特定目录、查数据库、调用内部服务。MCP 服务器配置的格式是固定的[mcp_servers.filesystem] command npx args [-y, modelcontextprotocol/server-filesystem, /path/to/workspace] [mcp_servers.custom] command python args [/path/to/server.py] env { API_KEY xxx }command和args指定如何启动这个 MCP 服务器env可以给它传递环境变量。配置好之后Codex 会在启动时自动拉起对应的 MCP 服务器对话中就能调用这些工具。这里有个关键认知配置文件的路径决定了 MCP 的生效范围。放在~/.codex/config.toml里是全局生效放在某个项目里的.codex/config.toml则只对该项目生效。项目级配置和全局配置会合并项目级优先。如果你想给某个仓库单独挂一个数据库工具就在仓库根目录建.codex文件夹把 MCP 配置放进去不会影响其他项目。6. 我踩过的坑和最终建议6.1 改完不生效最常见的三个原因第一个原因之前说过是没开新会话。Codex 的配置在会话启动时读取已经跑起来的会话不会热加载。改完配置退出当前会话重新codex才是正确的验证姿势。第二个原因改错了文件。如果你在某个项目目录下执行codex而这个项目下有.codex/config.toml那么项目级配置会和全局配置合并并且项目级字段覆盖全局字段。你以为自己在~/.codex/config.toml里改的是最终生效的值实际上被项目级的同名配置覆盖了。遇到配置没生效先检查当前目录有没有.codex子目录ls -la .codex第三个原因环境变量在作祟。比如OPENAI_API_KEY指向了一个旧 key而配置文件里用的是env_key OPENAI_API_KEY你改的是配置文件但 key 本身来自环境变量改配置当然没用。排查时把相关环境变量打出来看一眼env | grep -iE OPENAI|DEEPSEEK|CODEX这一步能过滤掉大量伪配置问题。6.2 安全相关的几条红线配置文件的本质是一份信任状告诉 Codex 可以用什么权限、走谁的 API。有几点我吃了亏之后才真正重视起来。第一API key 永远不进配置文件。env_key指向环境变量这是设计好的安全路径不要为了图方便直接写api_key sk-...之类的字样。真要临时测试用完立刻删。第二~/.codex目录的权限要收紧。这个目录里有auth.json里面是登录 token一旦泄露等于别人能用你的账号。在 Linux/macOS 上可以执行chmod 700 ~/.codex chmod 600 ~/.codex/auth.json第三除非明确知道自己要做什么否则不要把approval_policy设成unconstrained。Codex 的定位是辅助工具不是无人值守机器人保留一层人的确认既是对代码库负责也是对自己负责。6.3 一点个人习惯我现在维护配置的方式很简单~/.codex/config.toml只放日常通用的内容比如模型、权限、审批策略每个项目的特殊配置放到项目里的.codex/config.toml。这样换电脑或者重装系统时把全局配置拷过去就能恢复基础环境项目相关的配置跟着仓库走不会丢。排查配置问题时我的顺序固定是先看日志~/.codex/logs/确认报错来源再用临时CODEX_HOME起一个干净环境测试默认配置能否跑通最后用二分法把配置项一批批加回去定位到具体的罪魁祸首。这套流程看起来很笨但对付那些奇怪的、跟版本相关的配置兼容问题比瞎猜高效得多。