Codex 配置不生效?config.toml 7 个常见原因排查

浏览:1次阅读
没有评论

Codex 配置不生效,多数不是 Codex 坏了,而是改错了文件、被更高优先级的配置覆盖,或者这项配置写在了不允许它生效的位置。按下面 7 个原因逐个排查,基本都能找到问题,每一条都对照了 OpenAI 官方的 Codex 配置文档。

Codex 配置不生效?config.toml 7 个常见原因排查插图
图片来源:OpenAI Codex 官方文档 Config basics

先搞清楚:Codex 会从哪些地方读配置

Codex CLI 和 IDE 插件共用同一套配置层。官方文档给出的读取顺序如下,越靠前优先级越高:

  1. 命令行参数和 --config(-c)覆盖
  2. 项目配置 .codex/config.toml:从项目根目录一路到当前工作目录,离当前目录越近越优先,而且只有受信任的项目才会加载
  3. 用 --profile 名称 选中的配置文件:~/.codex/ 名称.config.toml
  4. 用户配置:~/.codex/config.toml
  5. 工作区下发的云端托管配置(登录了企业工作区时才有)
  6. 系统配置:Unix 上是 /etc/codex/config.toml(存在时)
  7. 内置默认值

记住这张顺序表,下面大部分“不生效”的情况都能用它解释。

原因 1:改的不是 Codex 正在读的那个文件

Codex 的本地状态都放在 CODEX_HOME 下,默认是 ~/.codex。如果你(或某个脚本、某个中转工具)设置过 CODEX_HOME 环境变量,Codex 读的就是那个目录里的 config.toml,你改 ~/.codex/config.toml 自然没反应。

排查方法:

# macOS / Linux
echo $CODEX_HOME

# Windows PowerShell
echo $env:CODEX_HOME

输出为空,说明用的是默认的 ~/.codex(Windows 上一般是 C:\Users\ 你的用户名 \.codex)。在 IDE 插件里也可以点右上角齿轮,选 Codex Settings > Open config.toml,直接打开它正在用的文件。

原因 2:被更高优先级的配置覆盖了

比如你在 ~/.codex/config.toml 里写了 model = "xxx",但启动时带了 --model,或者项目目录里的 .codex/config.toml 也写了 model,那最终生效的是优先级更高的那个。

常见的“隐形覆盖”有三种:

  • 启动别名或脚本里带了 -c / --model 参数;
  • 仓库里有同事提交的 .codex/config.toml;
  • 公司电脑上有 /etc/codex/config.toml 或托管配置。

进入 Codex 后输入 /status 看一下当前实际使用的模型和设置,和你的预期对不上,就顺着上面的顺序往高优先级去找。斜杠命令的用法可以看 Codex CLI 斜杠命令大全。

原因 3:项目没有被信任,项目配置被跳过

出于安全考虑,Codex 只在项目受信任时 才加载项目里的 .codex/ 目录,包括 .codex/config.toml、项目级 hooks 和 rules。如果你在首次打开项目时选了不信任,这些都会被直接跳过,但用户级和系统级配置照常加载。

所以“全局配置有效、项目配置无效”,第一件事就是确认这个项目是不是被标记成了不受信任。

原因 4:在项目配置里写了不允许的键

这是最容易踩的坑,尤其是想“给某个项目单独接第三方 API”的时候。官方文档写明,项目级 .codex/config.toml 不能覆盖跟凭据、认证、通知和遥测相关的设置,下面这些键写在项目配置里会被 忽略,并在启动时打印警告:

  • openai_base_url、chatgpt_base_url
  • model_provider、model_providers
  • notify、otel
  • profile、profiles
  • apps_mcp_product_sku、experimental_realtime_ws_base_url

解决办法:把模型提供方、base URL 这类设置挪到用户级 ~/.codex/config.toml;想按场景切换,就用下面说的 profile 文件。第三方 API 的完整写法可以参考 Codex CLI 接入 API 教程。

Codex 配置不生效?config.toml 7 个常见原因排查插图1
图片来源:OpenAI Codex 官方文档 Advanced Configuration

原因 5:还在用旧的 [profiles.xxx] 写法

很多旧教程教的是在 config.toml 里写 [profiles. 名称] 表,再用 profile = "名称" 选中。官方文档说明:从 Codex 0.134.0 开始,--profile 不再读取 config.toml 里的 [profiles. 名称],顶层的 profile = "名称" 也不再支持。

新写法是每个 profile 单独一个文件,里面直接写顶层键,不要再套 [profiles. 名称]:

# ~/.codex/deep-review.config.toml
model_reasoning_effort = "medium"
approval_policy = "on-request"

使用时:

codex --profile deep-review

profile 文件叠加在用户配置之上,所以只需要写和基础配置不同的那几项。迁移完记得把旧的 [profiles. 名称] 表和 profile = "名称" 从 config.toml 里删掉。

原因 6:自定义模型提供方写法不对

接第三方 API 时,下面几种写法会导致配置看起来“没生效”:

  • 用了保留 ID:自定义提供方不能叫 openai、ollama、lmstudio。如果只是想让内置 OpenAI 提供方走代理或中转地址,官方建议直接设 openai_base_url,而不是新建 [model_providers.openai]。
  • 定义了提供方但没选中:写了 [model_providers.xxx],却没有在顶层写 model_provider = "xxx"。
  • 环境变量没设置:env_key = "OPENAI_API_KEY" 表示从这个环境变量读密钥,终端里没设这个变量,请求就会因认证失败报错。

一个正确的结构示例(地址和变量名换成你自己的):

model = "你的模型名"
model_provider = "proxy"

[model_providers.proxy]
name = "My proxy"
base_url = "https://proxy.example.com/v1"
env_key = "OPENAI_API_KEY"

原因 7:TOML 语法问题

TOML 有一个很隐蔽的规则:写在某个 [表头] 下面的键,都属于这个表,直到出现下一个表头。所以如果你把 model = "..." 写在 [model_providers.proxy] 或 [mcp_servers.xxx] 下面,它就不再是顶层的 model,自然不会生效。

正确做法是把 model、model_provider、approval_policy、sandbox_mode 这类顶层键放在文件最上面,所有 [表头] 放在它们后面。

用命令行临时覆盖时也要注意:--config 的值按 TOML 解析,字符串要带引号,例如:

codex --config model='"你的模型名"'
codex --config sandbox_workspace_write.network_access=true

常见报错与解决

启动时提示项目配置里的某个键被忽略

对照原因 4,把 model_provider、openai_base_url 等键从项目 .codex/config.toml 挪到 ~/.codex/config.toml。

设置了 approval_policy 或 sandbox_mode 但被改回去

公司管理的电脑上,管理员可能用 requirements.toml 强制限制某些取值,比如不允许 approval_policy = "never" 或 sandbox_mode = "danger-full-access"。这种情况本地配置改不了,需要找管理员。

approval_policy = "untrusted" 不生效

官方已经停止支持 "untrusted" 这个取值,可以改用 "on-request" 或 granular 写法。

MCP 服务器配置不生效

MCP 的写法和启用方式比较多,可以直接看 Codex 配置 MCP 教程。Windows 上沙箱相关的问题可以看 Codex Windows 沙箱 setup 失败解决方法。

FAQ

改完 config.toml 要重启 Codex 吗?

稳妥起见,改完后退出当前会话,重新运行 codex,再用 /status 确认。ChatGPT 桌面应用里的部分设置,官方文档也要求保存后重启应用。

CLI 和 IDE 插件的配置是分开的吗?

不是。官方文档说明,CLI 和 IDE 插件共用同一套配置层。

想让某个项目用不同模型,应该怎么写?

在项目里放 .codex/config.toml 写 model 即可(项目要受信任);但如果要换提供方或 base URL,只能写在用户配置或 profile 文件里。

信息来源

正文完
 0