×−+
设置与 config.toml第 7 课 · Codex 教程
第 7 课 · CONFIG

设置与 config.toml:
把常用选择写成默认值

做第 6 课的退款流程时,你也许每开一个对话都要把推理强度调高,每次 npm install 都要点一下允许。这种"每次都选一样"的东西,可以写进一个配置文件,变成默认值。桌面 App、命令行、编辑器扩展读的都是这一份。

约 35 分钟 11 节 · 5 个动手练习 章末测验 形式参考 luongnv89/claude-howto · 事实依据 OpenAI 官方文档
~/.codex/config.toml示意
# 我的默认值:三个入口都照这个来
model_reasoning_effort = "high"
sandbox_mode = "workspace-write"
web_search = "cached"

[features]
memories = true
入门先用起来 原理弄懂为什么 实战动手练 深入进阶与避坑

时间紧就先看"入门"和"实战":知道文件在哪、常用的几个键怎么写就够用了。"原理"讲清楚好几份配置打架时听谁的,配置"写了没生效"多半卡在这里。

01入门

一份配置,三个入口共用

config.toml 就像你留给 Codex 的一张"个人偏好卡":写一次,以后每次开工它都照着来。

用 /model、/reasoning 临时选官方说明它们只管当前这个对话。下次新开对话,又从默认值开始。
写进 config.toml变成默认值,以后每个新对话都从这里开始。需要的时候,照样可以在对话里临时改。

文件放在哪

最常用的是前两份:你自己的一份,项目里的一份。第三种 profile 文件是命令行用的。

文件管什么
用户配置
~/.codex/config.toml
你的个人默认值,所有项目都用。
项目配置
项目/.codex/config.toml
只对这个项目生效,可以提交到仓库,同事拉下来也有。只有你信任的项目才会加载它(第 5 节)。
profile 文件
~/.codex/名字.config.toml
一组可以"换挡"的设置,在命令行启动时用 --profile 名字 选(第 7 节)。

~ 是你的用户主目录。Windows 上的桌面 App 用的是 %USERPROFILE%\.codex。CLI 和 IDE 扩展会跟着环境变量 CODEX_HOME 走(第 8 节);桌面 App 以你的 App 为准。

三个入口是同一份

官方的说法:App 里的 Codex 和 IDE 扩展、CLI 继承同一套配置;常用的设置用 App 里的控件改,进阶的直接编辑 config.toml。IDE 扩展里可以从齿轮图标 → Codex Settings → Open config.toml 直接打开它。

TOML 只要会三样

config.toml 用的是 TOML 格式,比 JSON 好写。看懂下面这几行就够用了:

config.toml
# 井号开头是注释
model_reasoning_effort = "high"   # 键 = 值;文字要加双引号
web_search = "cached"

[sandbox_workspace_write]         # 方括号是"表",下面的键都属于它
network_access = true             # true / false 不加引号
  1. 键 = 值:文字值加双引号;true / false 和数字不加。
  2. [表名]:它下面的键都归这个表,一直到下一个 [...] 为止。所以上面那个 network_access,完整的名字是 sandbox_workspace_write.network_access。
  3. 不属于任何表的键,要写在所有 [表] 前面。官方的示例文件开头就这么提醒。写到某个表下面,它就被算成那个表里的键了(第 10 节有这个坑)。
02入门

App 里的设置,对应配置里的哪一项

常用的几项在 App 里点一下就行。想让它变成默认值,或者 App 里根本没有这个按钮,就写进 config.toml。

设置面板用 Cmd+,(Windows 上 Ctrl+,)打开,也可以从 App 菜单进。下面按"写在 config.toml 里的"和"App 自己的偏好"分开列。

写在 config.toml 里的(App、CLI、IDE 扩展共用)
权限控件 · Ask for approval输入框下面,默认档
sandbox_mode = "workspace-write"approval_policy = "on-request"
在项目文件夹里自己干,越界先问你(第 3 课)。approval_policy 不写默认就是 on-request;写明了反而会盖过"标成 untrusted 的项目一律先问"(第 5 节)。
Approve for me设置里叫 Auto-review
同上,再加approvals_reviewer = "auto_review"
边界不变,越界的请求交给自动审查替你判断。
Full access不设限
sandbox_mode = "danger-full-access"approval_policy = "never"
没有沙箱、也不问你。官方标为高风险,不推荐。
模型与推理强度控件输入框下面;还有 /model、/reasoning
modelmodel_reasoning_effort
/model、/reasoning 只改当前对话;要每个新对话都这样,写配置。App 里叫 Light 的那一档,在命令行和配置里叫 low。
/fast 速度档第 6 课
service_tier = "fast"[features] fast_mode = true
更快,也更耗额度。倍率见专题 A。
Settings 里的 MCP第 9 课
[mcp_servers.名字]
在 App 里加的服务器也写进 config.toml,所以 CLI 和 IDE 扩展一起用上。
Settings > Personalization > Enable memories第 5 课
[features] memories = true
同一件事的两种开法。实验 默认关。
一次次弹出来的联网批准官方没写 App 里有对应的开关
[sandbox_workspace_write]network_access
默认 false:命令要联网就停下来问你。想在某个项目里默认放开,写进项目配置(第 6 节演练)。
网页搜索本地对话默认开;官方没写 App 里有对应的开关
web_search
默认 "cached",结果来自 OpenAI 维护的缓存索引;"disabled" 关掉。
Personalization 里的默认个性Friendly / Pragmatic / None
personality
文档前后说法不一致:设置页和配置页还在介绍它,但更新说明里写着 Friendly、Pragmatic 已经不再改变回复风格。以你的 App 为准,本课不展开。
App 自己的偏好
Settings > General > Permissions第 3 课
没有对应的键
只决定权限菜单里出现哪几档,不会替你选。本地配置或组织要求不允许的档位,会显示为不可选。
外观、快捷键、通知、Follow-up behavior、Git 设置
文档没列对应的键
官方只在 App 的设置页里介绍它们。在 App 里改就好。

"Follow-up behavior"是 Codex 工作时你再发消息,是插话还是排队(第 2 课)。IDE 扩展里对应的是编辑器设置 chatgpt.followUpQueueMode,它也不写进 config.toml。

03入门

最常用的六个键

大多数人的 config.toml 只有几行。下面这个拼装器按你的选择生成配置,再告诉你它会带来什么。

写到哪
推理强度model_reasoning_effort
权限sandbox_mode · approval_policy
命令可以联网network_access
网页搜索web_search

推理强度能选哪几档,取决于你用的模型;这里只列了常见的几个。

~/.codex/config.toml
这份配置会

    六个键一览

    键常见取值管什么
    model模型名默认用哪个模型。不写就用推荐模型;具体名字变得快,看专题 A。
    model_reasoning_effort"low" "medium" "high" "xhigh" …推理强度。越高想得越久、用的 token 越多。能选哪几档看模型和客户端。
    approval_policy"on-request" "never"什么时候停下来问你。交互时用 on-request,无人值守才用 never。不写时按项目信任来定;显式写了 on-request,标成 untrusted 的项目就不再一律先问你(第 5 节)。
    sandbox_mode"read-only" "workspace-write" "danger-full-access"命令能碰哪些文件:只读 / 项目里可写 / 不设限。
    [sandbox_workspace_write]
    network_access
    true false在 workspace-write 下,命令能不能联网。默认 false。
    web_search"cached" "indexed" "live" "disabled"网页搜索怎么取结果。默认 "cached";用 Full access 这类不设沙箱的设置时,默认变成 "live"。
    给第 6 课的 /plan 单独设强度

    想让计划模式想得更深、平时又不用那么高?还有一个键 plan_mode_reasoning_effort,只管计划模式。不写的话,计划模式用它自带的默认值。

    联网和实时搜索,别一口气全开

    命令能联网、网页搜索用 "live",都会让 Codex 更容易读到不可信的内容,被里面藏的指令带偏(提示注入,第 3 课)。建议只给真正需要的项目开,写进项目配置,而不是写进对所有项目生效的用户配置。

    04实战

    练一练:这件事该改哪里

    6 个场景,每个选一个最合适的地方。有的答案不用动配置文件。

    05原理

    好几份配置打架时,听谁的

    同一个键可能写在好几个地方。Codex 从第 1 层往下找,第一个写了值、而且算数的那一层说了算。改改每一层的值,再关掉"项目已信任"看看。

      试试:清空第 2 层;关掉"已信任";给第 1 层填一个值。

      第 1 层和第 3 层都要在命令行里启动时带上(第 7 节)。第 5 层要你登录的工作区下发了才有,第 6 层要电脑上有这个文件才有,个人电脑上这两层通常是空的。

      项目配置的三条规矩

      1. 只在信任的项目里加载。没信任的项目,整个项目的 .codex/ 层都跳过:项目配置、项目里的 hooks、rules 一起不加载;你的用户配置和系统配置照常加载。
      2. 可以有好几份,越近越优先。Codex 从项目根目录一路找到当前目录,每个 .codex/config.toml 都读;同一个键写了好几次,离当前目录最近的那份赢。里面写的相对路径,按它所在的那个 .codex/ 文件夹来算。
      3. 有些键写在项目里不算数。会改变"请求发到哪、用哪个模型提供方、凭据怎么给、通知和遥测跑什么命令、选哪个 profile"的键,项目配置改不了。Codex 会忽略它们,启动时给出警告:openai_base_url、chatgpt_base_url、apps_mcp_product_sku、model_provider、model_providers、notify、profile、profiles、experimental_realtime_ws_base_url、otel。这些写在用户配置里。
      信任记在哪

      在配置文件里,信任写在用户配置的这一项。App 里点的信任是不是也记在这里、在哪点"信任",文档没写,以你的 App 为准:

      [projects."/Users/you/order-admin"]
      trust_level = "trusted"   # 或 "untrusted"

      第 3 课说过:刚 clone 下来的陌生仓库,先看过里面的 .codex/ 再信任。标成 "untrusted" 后,项目配置不再加载;如果你没有另外写 approval_policy,这个项目的命令还会一律先问你(规则放行的除外)。显式写了 approval_policy = "on-request" 会覆盖这条,所以想要这个效果,就别在配置里写审批策略。

      06实战

      演练:把默认值写进配置

      接着第 6 课的退款流程:先把默认推理强度写进你的用户配置,再给 order-admin 加一份项目配置,让它的命令可以联网。中途有几处要你拿主意,"允许"和"拒绝"都可以点。

      画面为教学示意:对话内容、路径和提交号是虚构的,"要信任 order-admin 吗?"卡片也是示意;配置键、加载规则、.codex 文件夹存在后才受保护,与官方文档一致。

      07深入

      换挡和临时改:profile 与 -c

      这两样都在命令行(CLI)里用:profile 是一组存好的"换挡"设置,-c 只改这一次。官方只写了在命令行里怎么选它们,App 里平时用不上,先知道有这回事,第 14 课会用到。

      profile:存一组设置,要用时再选

      比如你想要一个"深度审查"档:推理强度高、只读、有事就问。把和平时不一样的几项单独存成一个文件:

      ~/.codex/deep-review.config.toml
      model_reasoning_effort = "high"
      sandbox_mode = "read-only"
      approval_policy = "on-request"
      终端(命令行)
      codex --profile deep-review
      codex exec --profile deep-review "审一下这次改动"
      • 它是第 3 层:盖在用户配置上面、项目配置下面。所以只写和平时不一样的几项就行,其他的照用户配置。
      • 文件名就是 profile 的名字,只能用字母、数字、- 和 _。
      • 文件里直接写顶层的键,不要再套一层 [profiles.deep-review]。

      -c:只改这一次

      终端(命令行)
      codex -c model_reasoning_effort='"high"'
      codex -c sandbox_workspace_write.network_access=true
      codex --enable memories      # 等于 -c features.memories=true
      • -c 和 --config 是一回事,是第 1 层,优先级最高,只管这一次运行。
      • 值按 TOML 解析,所以文字值写成 '"high"':里面的双引号是给 TOML 的,外面的单引号防止 shell 把它拆开。解析不了的,Codex 就当成一段文字。
      • 表里的键用点号连起来写,比如 sandbox_workspace_write.network_access。
      • 有专门参数的优先用专门参数:--model、--sandbox、--profile、--search。
      查"到底是哪一层说了算"

      命令行里输入 /debug-config,会按优先级列出每一层配置和管理员的限制。用 --strict-config 启动,拼错或不认识的键会直接报错,而不是被悄悄忽略。这两个都是命令行的功能。

      旧教程对照

      [profiles.名字] 表 + profile = "名字":0.134 版起不再读取。改成独立文件 ~/.codex/名字.config.toml,用 --profile 名字 选,并把 config.toml 里旧的表和选择器删掉。

      approval_policy = "untrusted":已退役,留着甚至可能让客户端启动不了。只读又要交互,写 sandbox_mode = "read-only" 加 approval_policy = "on-request";想让某个项目的命令几乎都问你,删掉 approval_policy,把那个项目标成 trust_level = "untrusted"。

      approval_policy = "on-failure":已废弃 交互用 "on-request",无人值守用 "never"。

      [features] 里的 web_search、web_search_cached、web_search_request:已废弃 改用顶层的 web_search = "cached" / "live" 等。

      experimental_instructions_file:改名为 model_instructions_file。

      08深入

      功能开关和环境变量

      [features] 是一排开关,打开可选的或还在试验的功能。环境变量管的是"这台电脑、这个终端"的事,比如 Codex 的家目录在哪。

      [features] 与成熟度

      ~/.codex/config.toml
      [features]
      memories = true    # 打开实验功能 Memories
      hooks = false      # 关掉钩子

      不写的键就是默认值。命令行里 codex --enable 名字 临时打开;终端界面里的 /experimental 可以勾选实验功能,选择会存进配置,重启后生效。

      官方列出的开关(节选,含配置参考里的实验开关)
      键默认成熟度做什么
      memoriesfalse实验Memories,把以前对话里有用的东西带到新对话(第 5 课)
      network_proxyfalse实验命令联网时,只放行你列出的域名(第 9 节有例子)
      prevent_idle_sleepfalse实验任务运行时不让电脑睡眠
      goalstrue稳定持久目标 /goal(第 6 课)
      hookstrue稳定钩子(第 10 课)
      fast_modetrue稳定Fast 速度档
      multi_agenttrue稳定子代理协作(第 12 课)
      appstrue稳定App(连接器)集成
      web_searchtrue已废弃旧开关,改用顶层的 web_search
      web_search_cachedfalse已废弃旧开关,相当于 web_search = "cached"
      web_search_requestfalse已废弃旧开关,相当于 web_search = "live"
      实验
      不稳定,官方可能改掉或移除。用的话风险自担。
      Beta
      适合广泛试用,大体完整,细节可能按反馈调整。
      稳定
      完整支持,行为和配置长期保持一致。
      已废弃
      为了兼容还能用,但不推荐,以后可能移除。尽早迁走。

      环境变量

      分工很简单:长期的设置写 config.toml;只在某个终端、某次自动化里用的,或者密钥、诊断开关,用环境变量。

      变量做什么
      CODEX_HOMECodex 的家目录,默认 ~/.codex。配置、登录信息、日志、会话、skills 都放在这里。设了的话,这个目录必须已经存在。
      CODEX_SQLITE_HOMESQLite 状态数据放哪,默认跟 CODEX_HOME 一样。
      CODEX_API_KEY给非交互的 Codex(比如 codex exec)一个 API key,CI 里用(第 14 课)。
      CODEX_CA_CERTIFICATE公司网络会拦截 HTTPS 时,指向你们的根证书(PEM)。优先于 SSL_CERT_FILE。
      RUST_LOG日志详细程度:error、warn、info、debug、trace。排查问题时用。

      官方列出读取 CODEX_HOME 的是 CLI、IDE 扩展、app-server 和安装脚本。在 WSL 里用 CLI 时,它默认用 Linux 的家目录,不和 Windows 上的 App 共享配置;想共享,把 CODEX_HOME 指到 Windows 那边的 .codex(专题 B)。

      09深入

      换模型提供方、管理员限制和排查

      默认连的是 OpenAI 自己的服务(提供方叫 openai)。官方支持几种换法,都写在你的用户配置里。第三方中转服务不在官方支持范围内,本教程不讲。

      openai_base_url:只换地址公司让请求走自己的代理或路由,或者用开了数据驻留(data residency)的 API 项目:改这一个地址就行,不用新建提供方。
      [model_providers.名字]:自定义提供方写上地址 base_url、从哪个环境变量读密钥 env_key,再用 model_provider = "名字" 选中。openai、ollama、lmstudio 是内置的名字,不能拿来自定义。
      --oss:本机的开源模型(命令行)连本机的 Ollama 或 LM Studio。用 oss_provider = "ollama"(或 "lmstudio")设默认;都没设的话,交互式 CLI 会问你选哪个,codex exec 直接报错退出。
      Amazon Bedrock内置提供方,写 model_provider = "amazon-bedrock"(另一种端点用 "amazon-bedrock-runtime")。用 AWS 的凭据认证,不用 ChatGPT 登录。完整步骤看官方页面。
      ~/.codex/config.toml(只换地址)
      openai_base_url = "https://us.api.openai.com/v1"
      写在项目配置里没用

      openai_base_url、model_provider、model_providers 都在"项目层改不了"的名单里(第 5 节)。写进项目的 .codex/config.toml,Codex 会忽略并在启动时警告。

      管理员的 requirements.toml

      公司电脑上,管理员可以放一份 requirements.toml。它不在那 7 层里:7 层给的是"默认值",它给的是"不准"。比如不许 approval_policy = "never"、不许 danger-full-access、限定网页搜索的模式、限定能开哪些 MCP 服务器。不管你在哪一层写了被禁止的值,客户端都会换成一个允许的值,并提醒你。权限菜单里不可选的档位,也可能是它限制的。

      进阶:只放行 npm 的域名

      第 6 节给 order-admin 打开了联网,但那是"想连哪就连哪"。想只放行 npm 的仓库,可以再加实验功能 network_proxy:

      order-admin/.codex/config.toml
      [sandbox_workspace_write]
      network_access = true
      
      [features.network_proxy]
      enabled = true
      domains = { "registry.npmjs.org" = "allow" }

      两个开关缺一不可:network_access 决定能不能联网,network_proxy 决定按名单过滤。只开后者,网络还是关的。它只管命令发出的请求,不过滤网页搜索、MCP 这些工具。

      改了没生效?

      写了项目配置,好像没加载
      1. 项目信任了吗?没信任,整个项目 .codex/ 层都跳过。
      2. 这个键是不是项目层改不了的那几个(第 5 节的名单)?
      3. 上面还有更高的层吗?比如命令行的 -c,或者离当前目录更近的另一份项目配置。
      键写对了,还是没用
      先看它是不是被写到了某个 [表] 下面(第 10 节第 1 题)。再看有没有拼错:Codex 默认会悄悄忽略不认识的键,命令行用 --strict-config 启动能把它揪出来。还有一种可能是被管理员的 requirements.toml 挡住了。
      改完什么时候生效?
      官方没有逐个写明每个键什么时候重新读取。稳妥的做法:改完开一个新对话再试。个别设置官方写明要重启 App,比如给"Open in"菜单加自定义编辑器的 desktop.custom_file_handlers;命令行的 /experimental 也是重启后才生效。
      怎么看现在生效的是什么?
      App 里的 /status 显示对话 ID、上下文用量和额度,不显示配置来自哪一层。命令行里的 /status 能看到当前的模型、审批策略、可写目录;/debug-config 按优先级列出每一层(第 14 课)。
      配置文件写坏了会怎样?
      不认识的键默认被忽略,所以大多数笔误只是"没效果"。但有的旧值会出大问题:approval_policy = "untrusted" 已退役,官方说它可能让客户端启动不了。改之前先备份一份,改坏了能换回去。
      IDE 扩展的设置也在这个文件里吗?
      分两层。模型、推理强度、权限、沙箱、MCP 这些是 Codex 的设置,存在 config.toml;扩展自己的行为(chatgpt. 开头的,比如插话还是排队、回车怎么发送)是编辑器设置,存在编辑器里,不写进 config.toml。
      10实战

      练一练:这份配置哪里不对

      6 小段配置,有的没问题,有的写错了位置、用了过时的写法,或者放错了文件。

      11检验

      小测验

      8 道题,每题选完会立刻看到解析。