设置与 config.toml:
把常用选择写成默认值
做第 6 课的退款流程时,你也许每开一个对话都要把推理强度调高,每次 npm install 都要点一下允许。这种"每次都选一样"的东西,可以写进一个配置文件,变成默认值。桌面 App、命令行、编辑器扩展读的都是这一份。
# 我的默认值:三个入口都照这个来 model_reasoning_effort = "high" sandbox_mode = "workspace-write" web_search = "cached" [features] memories = true
时间紧就先看"入门"和"实战":知道文件在哪、常用的几个键怎么写就够用了。"原理"讲清楚好几份配置打架时听谁的,配置"写了没生效"多半卡在这里。
一份配置,三个入口共用
config.toml 就像你留给 Codex 的一张"个人偏好卡":写一次,以后每次开工它都照着来。
/model、/reasoning 临时选官方说明它们只管当前这个对话。下次新开对话,又从默认值开始。文件放在哪
最常用的是前两份:你自己的一份,项目里的一份。第三种 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 好写。看懂下面这几行就够用了:
# 井号开头是注释 model_reasoning_effort = "high" # 键 = 值;文字要加双引号 web_search = "cached" [sandbox_workspace_write] # 方括号是"表",下面的键都属于它 network_access = true # true / false 不加引号
键 = 值:文字值加双引号;true/false和数字不加。[表名]:它下面的键都归这个表,一直到下一个[...]为止。所以上面那个network_access,完整的名字是sandbox_workspace_write.network_access。- 不属于任何表的键,要写在所有
[表]前面。官方的示例文件开头就这么提醒。写到某个表下面,它就被算成那个表里的键了(第 10 节有这个坑)。
App 里的设置,对应配置里的哪一项
常用的几项在 App 里点一下就行。想让它变成默认值,或者 App 里根本没有这个按钮,就写进 config.toml。
设置面板用 Cmd+,(Windows 上 Ctrl+,)打开,也可以从 App 菜单进。下面按"写在 config.toml 里的"和"App 自己的偏好"分开列。
sandbox_mode = "workspace-write"approval_policy = "on-request"approval_policy 不写默认就是 on-request;写明了反而会盖过"标成 untrusted 的项目一律先问"(第 5 节)。approvals_reviewer = "auto_review"sandbox_mode = "danger-full-access"approval_policy = "never"/model、/reasoningmodelmodel_reasoning_effort/model、/reasoning 只改当前对话;要每个新对话都这样,写配置。App 里叫 Light 的那一档,在命令行和配置里叫 low。[mcp_servers.名字][features] memories = true[sandbox_workspace_write]network_accessfalse:命令要联网就停下来问你。想在某个项目里默认放开,写进项目配置(第 6 节演练)。web_search"cached",结果来自 OpenAI 维护的缓存索引;"disabled" 关掉。personality"Follow-up behavior"是 Codex 工作时你再发消息,是插话还是排队(第 2 课)。IDE 扩展里对应的是编辑器设置 chatgpt.followUpQueueMode,它也不写进 config.toml。
最常用的六个键
大多数人的 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"。 |
想让计划模式想得更深、平时又不用那么高?还有一个键 plan_mode_reasoning_effort,只管计划模式。不写的话,计划模式用它自带的默认值。
命令能联网、网页搜索用 "live",都会让 Codex 更容易读到不可信的内容,被里面藏的指令带偏(提示注入,第 3 课)。建议只给真正需要的项目开,写进项目配置,而不是写进对所有项目生效的用户配置。
练一练:这件事该改哪里
6 个场景,每个选一个最合适的地方。有的答案不用动配置文件。
好几份配置打架时,听谁的
同一个键可能写在好几个地方。Codex 从第 1 层往下找,第一个写了值、而且算数的那一层说了算。改改每一层的值,再关掉"项目已信任"看看。
第 1 层和第 3 层都要在命令行里启动时带上(第 7 节)。第 5 层要你登录的工作区下发了才有,第 6 层要电脑上有这个文件才有,个人电脑上这两层通常是空的。
项目配置的三条规矩
- 只在信任的项目里加载。没信任的项目,整个项目的
.codex/层都跳过:项目配置、项目里的 hooks、rules 一起不加载;你的用户配置和系统配置照常加载。 - 可以有好几份,越近越优先。Codex 从项目根目录一路找到当前目录,每个
.codex/config.toml都读;同一个键写了好几次,离当前目录最近的那份赢。里面写的相对路径,按它所在的那个.codex/文件夹来算。 - 有些键写在项目里不算数。会改变"请求发到哪、用哪个模型提供方、凭据怎么给、通知和遥测跑什么命令、选哪个 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" 会覆盖这条,所以想要这个效果,就别在配置里写审批策略。
演练:把默认值写进配置
接着第 6 课的退款流程:先把默认推理强度写进你的用户配置,再给 order-admin 加一份项目配置,让它的命令可以联网。中途有几处要你拿主意,"允许"和"拒绝"都可以点。
画面为教学示意:对话内容、路径和提交号是虚构的,"要信任 order-admin 吗?"卡片也是示意;配置键、加载规则、.codex 文件夹存在后才受保护,与官方文档一致。
换挡和临时改:profile 与 -c
这两样都在命令行(CLI)里用:profile 是一组存好的"换挡"设置,-c 只改这一次。官方只写了在命令行里怎么选它们,App 里平时用不上,先知道有这回事,第 14 课会用到。
profile:存一组设置,要用时再选
比如你想要一个"深度审查"档:推理强度高、只读、有事就问。把和平时不一样的几项单独存成一个文件:
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。
功能开关和环境变量
[features] 是一排开关,打开可选的或还在试验的功能。环境变量管的是"这台电脑、这个终端"的事,比如 Codex 的家目录在哪。
[features] 与成熟度
[features] memories = true # 打开实验功能 Memories hooks = false # 关掉钩子
不写的键就是默认值。命令行里 codex --enable 名字 临时打开;终端界面里的 /experimental 可以勾选实验功能,选择会存进配置,重启后生效。
| 键 | 默认 | 成熟度 | 做什么 |
|---|---|---|---|
memories | false | 实验 | Memories,把以前对话里有用的东西带到新对话(第 5 课) |
network_proxy | false | 实验 | 命令联网时,只放行你列出的域名(第 9 节有例子) |
prevent_idle_sleep | false | 实验 | 任务运行时不让电脑睡眠 |
goals | true | 稳定 | 持久目标 /goal(第 6 课) |
hooks | true | 稳定 | 钩子(第 10 课) |
fast_mode | true | 稳定 | Fast 速度档 |
multi_agent | true | 稳定 | 子代理协作(第 12 课) |
apps | true | 稳定 | App(连接器)集成 |
web_search | true | 已废弃 | 旧开关,改用顶层的 web_search |
web_search_cached | false | 已废弃 | 旧开关,相当于 web_search = "cached" |
web_search_request | false | 已废弃 | 旧开关,相当于 web_search = "live" |
环境变量
分工很简单:长期的设置写 config.toml;只在某个终端、某次自动化里用的,或者密钥、诊断开关,用环境变量。
| 变量 | 做什么 |
|---|---|
CODEX_HOME | Codex 的家目录,默认 ~/.codex。配置、登录信息、日志、会话、skills 都放在这里。设了的话,这个目录必须已经存在。 |
CODEX_SQLITE_HOME | SQLite 状态数据放哪,默认跟 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)。
换模型提供方、管理员限制和排查
默认连的是 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 直接报错退出。model_provider = "amazon-bedrock"(另一种端点用 "amazon-bedrock-runtime")。用 AWS 的凭据认证,不用 ChatGPT 登录。完整步骤看官方页面。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:
[sandbox_workspace_write]
network_access = true
[features.network_proxy]
enabled = true
domains = { "registry.npmjs.org" = "allow" }两个开关缺一不可:network_access 决定能不能联网,network_proxy 决定按名单过滤。只开后者,网络还是关的。它只管命令发出的请求,不过滤网页搜索、MCP 这些工具。
改了没生效?
写了项目配置,好像没加载
- 项目信任了吗?没信任,整个项目
.codex/层都跳过。 - 这个键是不是项目层改不了的那几个(第 5 节的名单)?
- 上面还有更高的层吗?比如命令行的
-c,或者离当前目录更近的另一份项目配置。
键写对了,还是没用
[表] 下面(第 10 节第 1 题)。再看有没有拼错:Codex 默认会悄悄忽略不认识的键,命令行用 --strict-config 启动能把它揪出来。还有一种可能是被管理员的 requirements.toml 挡住了。改完什么时候生效?
desktop.custom_file_handlers;命令行的 /experimental 也是重启后才生效。怎么看现在生效的是什么?
/status 显示对话 ID、上下文用量和额度,不显示配置来自哪一层。命令行里的 /status 能看到当前的模型、审批策略、可写目录;/debug-config 按优先级列出每一层(第 14 课)。配置文件写坏了会怎样?
approval_policy = "untrusted" 已退役,官方说它可能让客户端启动不了。改之前先备份一份,改坏了能换回去。IDE 扩展的设置也在这个文件里吗?
chatgpt. 开头的,比如插话还是排队、回车怎么发送)是编辑器设置,存在编辑器里,不写进 config.toml。练一练:这份配置哪里不对
6 小段配置,有的没问题,有的写错了位置、用了过时的写法,或者放错了文件。
小测验
8 道题,每题选完会立刻看到解析。
