@minniexcode/codex-switch 0.0.5 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.AI.md +5 -2
- package/README.md +44 -100
- package/dist/app/add-provider.js +28 -4
- package/dist/app/edit-provider.js +47 -19
- package/dist/app/export-providers.js +2 -2
- package/dist/app/get-current-profile.js +1 -1
- package/dist/app/get-status.js +10 -3
- package/dist/app/import-providers.js +15 -7
- package/dist/app/init-codex.js +68 -0
- package/dist/app/list-backups.js +1 -1
- package/dist/app/list-config-profiles.js +3 -2
- package/dist/app/list-providers.js +2 -1
- package/dist/app/remove-provider.js +2 -2
- package/dist/app/rollback-backup.js +1 -1
- package/dist/app/rollback-latest.js +1 -1
- package/dist/app/run-doctor.js +83 -6
- package/dist/app/run-mutation.js +2 -2
- package/dist/app/setup-codex.js +21 -12
- package/dist/app/show-config.js +11 -3
- package/dist/app/show-provider.js +1 -1
- package/dist/app/switch-provider.js +16 -9
- package/dist/cli/add-interactive.js +7 -104
- package/dist/cli/args.js +6 -135
- package/dist/cli/help.js +8 -313
- package/dist/cli/interactive.js +17 -225
- package/dist/cli/output.js +21 -6
- package/dist/cli/prompt.js +4 -106
- package/dist/cli.js +10 -404
- package/dist/commands/args.js +132 -0
- package/dist/commands/dispatch.js +16 -0
- package/dist/commands/handlers.js +460 -0
- package/dist/commands/help.js +120 -0
- package/dist/commands/registry.js +351 -0
- package/dist/commands/types.js +2 -0
- package/dist/domain/config.js +235 -21
- package/dist/domain/providers.js +16 -2
- package/dist/domain/setup.js +1 -0
- package/dist/infra/backup-repo.js +9 -206
- package/dist/infra/codex-cli.js +9 -126
- package/dist/infra/codex-paths.js +6 -67
- package/dist/infra/config-repo.js +59 -0
- package/dist/infra/fs-utils.js +8 -93
- package/dist/infra/lock-repo.js +4 -95
- package/dist/infra/providers-repo.js +8 -94
- package/dist/interaction/add-interactive.js +99 -0
- package/dist/interaction/interactive.js +289 -0
- package/dist/interaction/prompt.js +110 -0
- package/dist/runtime/codex-cli.js +130 -0
- package/dist/runtime/codex-probe.js +57 -0
- package/dist/runtime/types.js +2 -0
- package/dist/storage/auth-repo.js +160 -0
- package/dist/storage/backup-repo.js +210 -0
- package/dist/storage/codex-paths.js +71 -0
- package/dist/storage/config-repo.js +266 -0
- package/dist/storage/fs-utils.js +97 -0
- package/dist/storage/lock-repo.js +99 -0
- package/dist/storage/providers-repo.js +98 -0
- package/docs/Design/codex-switch-v0.0.5-design.md +32 -22
- package/docs/Design/codex-switch-v0.0.6-design.md +708 -0
- package/docs/Design/codex-switch-v0.0.7-design.md +862 -0
- package/docs/PRD/codex-switch-prd-v0.0.5-to-v0.1.0.md +227 -89
- package/docs/PRD/codex-switch-prd-v0.1.0.md +200 -226
- package/docs/PRD/codex-switch-prd.md +1 -1
- package/docs/Reference/codex-config-reference.md +604 -0
- package/docs/Reference/codex-config-reference.zh-CN.md +633 -0
- package/docs/cli-usage.md +78 -29
- package/docs/codex-switch-technical-architecture.md +73 -4
- package/docs/test-report-0.0.5.md +163 -0
- package/docs/test-report-0.0.7.md +118 -0
- package/docs/testing.md +151 -0
- package/package.json +1 -1
|
@@ -0,0 +1,633 @@
|
|
|
1
|
+
# Codex 配置参考整理
|
|
2
|
+
|
|
3
|
+
本文档基于 OpenAI 官方 Codex 配置文档整理,目标是把零散的键级 reference 和 advanced config 内容,重组为一份更适合日常查阅的参考手册。
|
|
4
|
+
|
|
5
|
+
它不是 OpenAI 官方原文,也不是逐段直译版。
|
|
6
|
+
|
|
7
|
+
整理来源:
|
|
8
|
+
|
|
9
|
+
- Advanced Configuration: https://developers.openai.com/codex/config-advanced
|
|
10
|
+
- Configuration Reference: https://developers.openai.com/codex/config-reference
|
|
11
|
+
|
|
12
|
+
本文档内容基于 2026-05-14 抓取的官方页面整理。
|
|
13
|
+
|
|
14
|
+
## 1. 这份文档覆盖什么
|
|
15
|
+
|
|
16
|
+
这份整理主要回答三类问题:
|
|
17
|
+
|
|
18
|
+
- Codex 会从哪些地方读取配置
|
|
19
|
+
- 实际最重要的配置族有哪些
|
|
20
|
+
- `config.toml` 和 `requirements.toml` 应该怎么理解和组合使用
|
|
21
|
+
|
|
22
|
+
它不会逐项穷举官方 reference 中的所有配置键,而是按主题分组,覆盖高频和结构性最强的内容。
|
|
23
|
+
|
|
24
|
+
## 2. 配置文件与本地状态位置
|
|
25
|
+
|
|
26
|
+
Codex 的本地状态目录由 `CODEX_HOME` 决定,默认值是:
|
|
27
|
+
|
|
28
|
+
```toml
|
|
29
|
+
~/.codex
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
在这个目录下,常见文件包括:
|
|
33
|
+
|
|
34
|
+
- `config.toml`:用户级本地配置
|
|
35
|
+
- `auth.json`:基于文件的认证信息
|
|
36
|
+
- 系统 keychain/keyring:支持的平台上也可能把认证存到操作系统凭证存储中
|
|
37
|
+
- `history.jsonl`:本地会话历史,前提是开启了 history persistence
|
|
38
|
+
- 其他缓存、日志和本地状态文件
|
|
39
|
+
|
|
40
|
+
官方文档把配置层大致分成三类:
|
|
41
|
+
|
|
42
|
+
- 用户级配置:`~/.codex/config.toml`
|
|
43
|
+
- 项目级配置:`<repo>/.codex/config.toml`
|
|
44
|
+
- 管理员强制约束:`requirements.toml`
|
|
45
|
+
|
|
46
|
+
## 3. 配置层级与优先级
|
|
47
|
+
|
|
48
|
+
Codex 允许多层配置叠加,日常最常见的是以下四层。
|
|
49
|
+
|
|
50
|
+
### 3.1 用户级配置
|
|
51
|
+
|
|
52
|
+
你的长期默认配置通常写在:
|
|
53
|
+
|
|
54
|
+
```toml
|
|
55
|
+
~/.codex/config.toml
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
适合放这里的内容包括:
|
|
59
|
+
|
|
60
|
+
- 默认模型
|
|
61
|
+
- approval policy
|
|
62
|
+
- sandbox mode
|
|
63
|
+
- provider 定义
|
|
64
|
+
- 通知
|
|
65
|
+
- telemetry / analytics
|
|
66
|
+
- shell 环境传递策略
|
|
67
|
+
|
|
68
|
+
### 3.2 项目级配置
|
|
69
|
+
|
|
70
|
+
Codex 支持在仓库里放:
|
|
71
|
+
|
|
72
|
+
```toml
|
|
73
|
+
<repo>/.codex/config.toml
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
官方文档给出的行为规则是:
|
|
77
|
+
|
|
78
|
+
- Codex 会从 project root 一路向当前工作目录方向查找 `.codex/config.toml`
|
|
79
|
+
- 路径上遇到的每一层 `.codex/config.toml` 都会加载
|
|
80
|
+
- 如果多个文件定义了同一个 key,离当前工作目录最近的那层优先
|
|
81
|
+
- 只有 trusted project 才会加载项目级 `.codex/` 配置
|
|
82
|
+
- 如果项目被标记为 untrusted,Codex 会忽略项目级 config、hooks 和 rules
|
|
83
|
+
- 项目级配置中的相对路径,是相对于包含该 `config.toml` 的 `.codex/` 目录解析的
|
|
84
|
+
|
|
85
|
+
相关 key:
|
|
86
|
+
|
|
87
|
+
- `project_root_markers`
|
|
88
|
+
- `projects.<path>.trust_level`
|
|
89
|
+
- `project_doc_max_bytes`
|
|
90
|
+
- `project_doc_fallback_filenames`
|
|
91
|
+
|
|
92
|
+
### 3.3 命令行一次性覆盖
|
|
93
|
+
|
|
94
|
+
如果你只想临时改某次运行,不必修改 `config.toml`。
|
|
95
|
+
|
|
96
|
+
官方建议:
|
|
97
|
+
|
|
98
|
+
- 有专门 flag 的场景优先用专门 flag,比如 `--model`
|
|
99
|
+
- 需要覆盖任意 key 时用 `-c` / `--config`
|
|
100
|
+
|
|
101
|
+
官方示例:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
codex --model gpt-5.4
|
|
105
|
+
codex --config model='"gpt-5.4"'
|
|
106
|
+
codex --config sandbox_workspace_write.network_access=true
|
|
107
|
+
codex --config 'shell_environment_policy.include_only=["PATH","HOME"]'
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
这里有两个非常重要的点:
|
|
111
|
+
|
|
112
|
+
- `--config` 的值按 TOML 解析,不是 JSON
|
|
113
|
+
- 支持 dot notation 设置嵌套 key
|
|
114
|
+
- 如果某个值无法按 TOML 解析,Codex 会把它当成字符串
|
|
115
|
+
|
|
116
|
+
### 3.4 Profiles
|
|
117
|
+
|
|
118
|
+
Profile 是命名好的配置覆盖集合,定义在 `config.toml` 里。
|
|
119
|
+
|
|
120
|
+
官方行为:
|
|
121
|
+
|
|
122
|
+
- 定义在 `[profiles.<name>]`
|
|
123
|
+
- 通过 `codex --profile <name>` 选择
|
|
124
|
+
- 顶层 `profile = "<name>"` 可以设置默认 profile
|
|
125
|
+
- profiles 目前还是 experimental
|
|
126
|
+
- Codex IDE extension 目前不支持 profile
|
|
127
|
+
- profile 可以覆盖 `model_catalog_json`
|
|
128
|
+
|
|
129
|
+
核心 key:
|
|
130
|
+
|
|
131
|
+
- `profile`
|
|
132
|
+
- `profiles.<name>.*`
|
|
133
|
+
- `profiles.<name>.model_catalog_json`
|
|
134
|
+
- `profiles.<name>.model_instructions_file`
|
|
135
|
+
- `profiles.<name>.web_search`
|
|
136
|
+
- `profiles.<name>.windows.sandbox`
|
|
137
|
+
- 以及 profile 级别的 analytics、reasoning、personality、service tier、oss provider 等配置
|
|
138
|
+
|
|
139
|
+
示例:
|
|
140
|
+
|
|
141
|
+
```toml
|
|
142
|
+
model = "gpt-5.4"
|
|
143
|
+
approval_policy = "on-request"
|
|
144
|
+
profile = "deep-review"
|
|
145
|
+
|
|
146
|
+
[profiles.deep-review]
|
|
147
|
+
model = "gpt-5-pro"
|
|
148
|
+
model_reasoning_effort = "high"
|
|
149
|
+
approval_policy = "never"
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## 4. `config.toml` 主题整理
|
|
153
|
+
|
|
154
|
+
### 4.1 模型、推理强度与输出风格
|
|
155
|
+
|
|
156
|
+
这一组配置决定 Codex 用什么模型,以及模型“想得多不多、说得长不长”。
|
|
157
|
+
|
|
158
|
+
常用 key:
|
|
159
|
+
|
|
160
|
+
- `model`:当前模型,例如 `gpt-5.5`
|
|
161
|
+
- `model_reasoning_effort`:`minimal | low | medium | high | xhigh`
|
|
162
|
+
- `model_reasoning_summary`:`auto | concise | detailed | none`
|
|
163
|
+
- `model_verbosity`:`low | medium | high`
|
|
164
|
+
- `model_context_window`:上下文窗口大小
|
|
165
|
+
- `model_auto_compact_token_limit`:自动压缩 history 的 token 阈值
|
|
166
|
+
- `service_tier`:`flex | fast`
|
|
167
|
+
- `personality`:`none | friendly | pragmatic`
|
|
168
|
+
- `plan_mode_reasoning_effort`:Plan mode 的推理强度覆盖
|
|
169
|
+
|
|
170
|
+
官方特别说明:
|
|
171
|
+
|
|
172
|
+
- `model_reasoning_effort` 只对支持的 Responses API 模型生效
|
|
173
|
+
- `model_verbosity` 只对走 Responses API 的 provider 生效
|
|
174
|
+
- Chat Completions provider 会忽略 `model_verbosity`
|
|
175
|
+
|
|
176
|
+
### 4.2 Web search
|
|
177
|
+
|
|
178
|
+
Codex 把 web search 做成了顶层配置,而不是附属开关。
|
|
179
|
+
|
|
180
|
+
核心 key:
|
|
181
|
+
|
|
182
|
+
- `web_search`:`disabled | cached | live`
|
|
183
|
+
|
|
184
|
+
官方行为:
|
|
185
|
+
|
|
186
|
+
- 默认值是 `"cached"`
|
|
187
|
+
- cached 模式使用 OpenAI 维护的索引,不直接抓取实时网页
|
|
188
|
+
- 如果使用 `--yolo` 或其他 full-access sandbox 组合,默认值会变成 `"live"`
|
|
189
|
+
- `"live"` 适合需要最新信息的场景
|
|
190
|
+
- `"disabled"` 会直接移除这个工具能力
|
|
191
|
+
|
|
192
|
+
旧的 `features.web_search`、`features.web_search_cached`、`features.web_search_request` 仍然存在,但官方 reference 已经把它们视为过时入口,推荐直接使用顶层 `web_search`。
|
|
193
|
+
|
|
194
|
+
### 4.3 Providers 与 API 路由
|
|
195
|
+
|
|
196
|
+
Codex 把“当前使用哪个 provider”和“provider 怎么定义”拆开了。
|
|
197
|
+
|
|
198
|
+
核心 key:
|
|
199
|
+
|
|
200
|
+
- `model_provider`
|
|
201
|
+
- `model_providers.<id>`
|
|
202
|
+
- `model_providers.<id>.base_url`
|
|
203
|
+
- `model_providers.<id>.env_key`
|
|
204
|
+
- `model_providers.<id>.env_key_instructions`
|
|
205
|
+
- `model_providers.<id>.http_headers`
|
|
206
|
+
- `model_providers.<id>.env_http_headers`
|
|
207
|
+
- `model_providers.<id>.query_params`
|
|
208
|
+
- `model_providers.<id>.request_max_retries`
|
|
209
|
+
|
|
210
|
+
自定义 provider 的认证方式包括:
|
|
211
|
+
|
|
212
|
+
- `env_key`
|
|
213
|
+
- `experimental_bearer_token`
|
|
214
|
+
- `model_providers.<id>.auth.*` 这种“命令返回 bearer token”的方式
|
|
215
|
+
|
|
216
|
+
官方倾向是:
|
|
217
|
+
|
|
218
|
+
- 优先使用 `env_key`
|
|
219
|
+
- 不推荐直接写死 bearer token
|
|
220
|
+
|
|
221
|
+
内置或保留 provider 行为:
|
|
222
|
+
|
|
223
|
+
- `openai`、`ollama`、`lmstudio` 是保留 id
|
|
224
|
+
- 这些 id 不能被自定义 provider 覆盖
|
|
225
|
+
- `amazon-bedrock` 是内置 provider,支持嵌套 AWS 配置
|
|
226
|
+
|
|
227
|
+
Bedrock 相关 key:
|
|
228
|
+
|
|
229
|
+
- `model_providers.amazon-bedrock.aws.profile`
|
|
230
|
+
- `model_providers.amazon-bedrock.aws.region`
|
|
231
|
+
|
|
232
|
+
### 4.3.1 `openai_base_url` 和自定义 provider 的区别
|
|
233
|
+
|
|
234
|
+
如果你只是想把内置 `openai` provider 指向公司网关、路由层或者某个数据驻留 endpoint,官方建议直接用:
|
|
235
|
+
|
|
236
|
+
```toml
|
|
237
|
+
openai_base_url = "https://us.api.openai.com/v1"
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
只有在你需要:
|
|
241
|
+
|
|
242
|
+
- 单独的 provider 身份
|
|
243
|
+
- 不同的认证逻辑
|
|
244
|
+
- 自定义请求头或 query 参数
|
|
245
|
+
|
|
246
|
+
时,才更适合定义新的 `model_providers.<id>`。
|
|
247
|
+
|
|
248
|
+
### 4.3.2 OSS 模式
|
|
249
|
+
|
|
250
|
+
Codex 支持通过 `--oss` 指向本地 open-source provider。
|
|
251
|
+
|
|
252
|
+
核心 key:
|
|
253
|
+
|
|
254
|
+
- `oss_provider`:`lmstudio | ollama`
|
|
255
|
+
|
|
256
|
+
如果传了 `--oss` 但没有显式指定 provider,Codex 会把 `oss_provider` 当默认本地 provider。
|
|
257
|
+
|
|
258
|
+
### 4.4 Approval policy 与 sandbox
|
|
259
|
+
|
|
260
|
+
这部分决定 Codex 什么时候暂停要你批准,以及子进程拥有什么本地访问能力。
|
|
261
|
+
|
|
262
|
+
核心 key:
|
|
263
|
+
|
|
264
|
+
- `approval_policy`
|
|
265
|
+
- `approvals_reviewer`
|
|
266
|
+
- `sandbox_mode`
|
|
267
|
+
- `sandbox_workspace_write.network_access`
|
|
268
|
+
- `sandbox_workspace_write.writable_roots`
|
|
269
|
+
- `sandbox_workspace_write.exclude_slash_tmp`
|
|
270
|
+
- `sandbox_workspace_write.exclude_tmpdir_env_var`
|
|
271
|
+
- `windows.sandbox`
|
|
272
|
+
- `windows.sandbox_private_desktop`
|
|
273
|
+
|
|
274
|
+
顶层 `approval_policy` 支持:
|
|
275
|
+
|
|
276
|
+
- `untrusted`
|
|
277
|
+
- `on-request`
|
|
278
|
+
- `never`
|
|
279
|
+
- granular 模式
|
|
280
|
+
|
|
281
|
+
granular 示例:
|
|
282
|
+
|
|
283
|
+
```toml
|
|
284
|
+
approval_policy = { granular = {
|
|
285
|
+
sandbox_approval = true,
|
|
286
|
+
rules = true,
|
|
287
|
+
mcp_elicitations = false,
|
|
288
|
+
request_permissions = true,
|
|
289
|
+
skill_approval = true
|
|
290
|
+
} }
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
granular 子项包括:
|
|
294
|
+
|
|
295
|
+
- `approval_policy.granular.sandbox_approval`
|
|
296
|
+
- `approval_policy.granular.rules`
|
|
297
|
+
- `approval_policy.granular.mcp_elicitations`
|
|
298
|
+
- `approval_policy.granular.request_permissions`
|
|
299
|
+
- `approval_policy.granular.skill_approval`
|
|
300
|
+
|
|
301
|
+
`sandbox_mode` 的官方值:
|
|
302
|
+
|
|
303
|
+
- `read-only`
|
|
304
|
+
- `workspace-write`
|
|
305
|
+
- `danger-full-access`
|
|
306
|
+
|
|
307
|
+
最核心的理解方式是:
|
|
308
|
+
|
|
309
|
+
- approval policy 决定“何时暂停等待批准”
|
|
310
|
+
- sandbox mode 决定“文件系统和网络边界”
|
|
311
|
+
|
|
312
|
+
### 4.5 命名权限配置(Named permission profiles)
|
|
313
|
+
|
|
314
|
+
除了直接设置 sandbox,Codex 还支持通过权限配置复用一组更细的本地访问策略。
|
|
315
|
+
|
|
316
|
+
相关 key:
|
|
317
|
+
|
|
318
|
+
- `default_permissions`
|
|
319
|
+
- `[permissions.<name>]`
|
|
320
|
+
|
|
321
|
+
内置 profile 名:
|
|
322
|
+
|
|
323
|
+
- `:read-only`
|
|
324
|
+
- `:workspace`
|
|
325
|
+
- `:danger-no-sandbox`
|
|
326
|
+
|
|
327
|
+
自定义 permissions profile 可以控制:
|
|
328
|
+
|
|
329
|
+
- `permissions.<name>.filesystem`
|
|
330
|
+
- `permissions.<name>.network.enabled`
|
|
331
|
+
- `permissions.<name>.network.mode`
|
|
332
|
+
- `permissions.<name>.network.domains`
|
|
333
|
+
- `permissions.<name>.network.proxy_url`
|
|
334
|
+
- `permissions.<name>.network.socks_url`
|
|
335
|
+
- `permissions.<name>.network.unix_sockets`
|
|
336
|
+
|
|
337
|
+
如果你需要的不是“全开/半开/只读”这种粗粒度策略,而是团队自己的精细规则,这一层会很有用。
|
|
338
|
+
|
|
339
|
+
### 4.6 Shell 环境变量传递策略
|
|
340
|
+
|
|
341
|
+
Codex 可以细粒度控制把哪些环境变量带给它启动的子进程。
|
|
342
|
+
|
|
343
|
+
主配置表:
|
|
344
|
+
|
|
345
|
+
```toml
|
|
346
|
+
[shell_environment_policy]
|
|
347
|
+
inherit = "none"
|
|
348
|
+
set = { PATH = "/usr/bin", MY_FLAG = "1" }
|
|
349
|
+
ignore_default_excludes = false
|
|
350
|
+
exclude = ["AWS_*", "AZURE_*"]
|
|
351
|
+
include_only = ["PATH", "HOME"]
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
关键 key:
|
|
355
|
+
|
|
356
|
+
- `shell_environment_policy.inherit`:`all | core | none`
|
|
357
|
+
- `shell_environment_policy.set`
|
|
358
|
+
- `shell_environment_policy.exclude`
|
|
359
|
+
- `shell_environment_policy.include_only`
|
|
360
|
+
- `shell_environment_policy.ignore_default_excludes`
|
|
361
|
+
- `shell_environment_policy.experimental_use_profile`
|
|
362
|
+
|
|
363
|
+
官方说明:
|
|
364
|
+
|
|
365
|
+
- 模式匹配是大小写不敏感的 glob
|
|
366
|
+
- 当 `ignore_default_excludes = false` 时,Codex 会先自动过滤包含 `KEY` / `SECRET` / `TOKEN` 的环境变量,再执行你的 include/exclude 规则
|
|
367
|
+
|
|
368
|
+
这部分的核心作用是:
|
|
369
|
+
|
|
370
|
+
- 避免 secret 泄漏给子进程
|
|
371
|
+
- 同时保留任务真正需要的 PATH、HOME、feature flag 或运行参数
|
|
372
|
+
|
|
373
|
+
### 4.7 指令文件、AGENTS.md 与项目文档发现
|
|
374
|
+
|
|
375
|
+
Codex 既支持直接替换内置指令,也支持从项目文档中读取指导信息。
|
|
376
|
+
|
|
377
|
+
相关 key:
|
|
378
|
+
|
|
379
|
+
- `model_instructions_file`
|
|
380
|
+
- `project_doc_max_bytes`
|
|
381
|
+
- `project_doc_fallback_filenames`
|
|
382
|
+
|
|
383
|
+
官方行为:
|
|
384
|
+
|
|
385
|
+
- `model_instructions_file` 会替代内置 instructions,而不是继续走 `AGENTS.md`
|
|
386
|
+
- Codex 会读取 `AGENTS.md` 及相关文件,并在会话第一轮注入有限量的项目指导
|
|
387
|
+
- `project_doc_max_bytes` 控制每个 `AGENTS.md` 最多读多少字节
|
|
388
|
+
- `project_doc_fallback_filenames` 允许在找不到 `AGENTS.md` 时尝试其他候选文件名
|
|
389
|
+
|
|
390
|
+
### 4.8 Hooks、agents 与 features
|
|
391
|
+
|
|
392
|
+
Codex 的 feature 面很大,但本地配置里最常见的还是下面这些。
|
|
393
|
+
|
|
394
|
+
常用 feature key:
|
|
395
|
+
|
|
396
|
+
- `features.codex_hooks`
|
|
397
|
+
- `features.codex_git_commit`
|
|
398
|
+
- `features.apps`
|
|
399
|
+
- `features.memories`
|
|
400
|
+
- `features.multi_agent`
|
|
401
|
+
- `features.personality`
|
|
402
|
+
- `features.shell_tool`
|
|
403
|
+
- `features.shell_snapshot`
|
|
404
|
+
- `features.fast_mode`
|
|
405
|
+
|
|
406
|
+
advanced config 明确把 hooks 归类为 experimental。
|
|
407
|
+
|
|
408
|
+
hooks 常见位置:
|
|
409
|
+
|
|
410
|
+
- `~/.codex/hooks.json`
|
|
411
|
+
- `~/.codex/config.toml`
|
|
412
|
+
- `<repo>/.codex/hooks.json`
|
|
413
|
+
- `<repo>/.codex/config.toml`
|
|
414
|
+
|
|
415
|
+
项目级 hooks 跟项目级 config 一样,也受 trusted project 约束。
|
|
416
|
+
|
|
417
|
+
### 4.9 通知与 TUI 配置
|
|
418
|
+
|
|
419
|
+
Codex 同时支持“外部通知命令”和“内置 TUI 通知”。
|
|
420
|
+
|
|
421
|
+
外部通知 key:
|
|
422
|
+
|
|
423
|
+
- `notify`:命令数组,Codex 会把 JSON payload 传给它
|
|
424
|
+
|
|
425
|
+
TUI 通知相关 key:
|
|
426
|
+
|
|
427
|
+
- `tui.notifications`
|
|
428
|
+
- `tui.notification_method`:`auto | osc9 | bel`
|
|
429
|
+
- `tui.notification_condition`:`unfocused | always`
|
|
430
|
+
|
|
431
|
+
其他常见 TUI key:
|
|
432
|
+
|
|
433
|
+
- `tui.animations`
|
|
434
|
+
- `tui.alternate_screen`
|
|
435
|
+
- `tui.status_line`
|
|
436
|
+
- `tui.terminal_title`
|
|
437
|
+
- `tui.theme`
|
|
438
|
+
- `tui.show_tooltips`
|
|
439
|
+
|
|
440
|
+
官方区分得很明确:
|
|
441
|
+
|
|
442
|
+
- `notify`:适合 webhook、桌面通知器、CI hook 或其他外部 side-channel
|
|
443
|
+
- `tui.notifications`:适合交互式终端 UI 的内置通知
|
|
444
|
+
|
|
445
|
+
### 4.10 History、引用链接与本地交互体验
|
|
446
|
+
|
|
447
|
+
history 相关 key:
|
|
448
|
+
|
|
449
|
+
- `history.persistence`:`save-all | none`
|
|
450
|
+
- `history.max_bytes`
|
|
451
|
+
|
|
452
|
+
官方行为:
|
|
453
|
+
|
|
454
|
+
- 本地历史默认保存在 `CODEX_HOME`
|
|
455
|
+
- `history.persistence = "none"` 可以关闭本地历史持久化
|
|
456
|
+
- 超过 `history.max_bytes` 后,Codex 会丢弃最旧记录并压缩文件
|
|
457
|
+
|
|
458
|
+
文件引用点击跳转相关 key:
|
|
459
|
+
|
|
460
|
+
- `file_opener`:`vscode | vscode-insiders | windsurf | cursor | none`
|
|
461
|
+
|
|
462
|
+
这个 key 用来控制 Codex 把文件引用改写成哪种编辑器 URI scheme,便于支持的终端或编辑器做可点击跳转。
|
|
463
|
+
|
|
464
|
+
### 4.11 Telemetry 与 analytics
|
|
465
|
+
|
|
466
|
+
Codex 把轻量 analytics 和完整 OpenTelemetry 输出分开了。
|
|
467
|
+
|
|
468
|
+
analytics 相关:
|
|
469
|
+
|
|
470
|
+
- `analytics.enabled`
|
|
471
|
+
|
|
472
|
+
OpenTelemetry 相关:
|
|
473
|
+
|
|
474
|
+
- `otel.environment`
|
|
475
|
+
- `otel.exporter`
|
|
476
|
+
- `otel.exporter.<id>.endpoint`
|
|
477
|
+
- `otel.exporter.<id>.headers`
|
|
478
|
+
- `otel.exporter.<id>.protocol`
|
|
479
|
+
- `otel.exporter.<id>.tls.*`
|
|
480
|
+
- `otel.log_user_prompt`
|
|
481
|
+
- `otel.metrics_exporter`
|
|
482
|
+
- `otel.trace_exporter`
|
|
483
|
+
- `otel.trace_exporter.<id>.*`
|
|
484
|
+
|
|
485
|
+
官方说明里几个比较关键的点:
|
|
486
|
+
|
|
487
|
+
- `otel.exporter = "none"` 表示 Codex 记录事件但不发送
|
|
488
|
+
- exporter 会异步 batch,并在退出时 flush
|
|
489
|
+
- 事件元数据包含 model、sandbox/approval 设置、CLI version、conversation id 等信息
|
|
490
|
+
- `otel.log_user_prompt` 需要显式打开,才会把原始用户输入导出到 OTEL
|
|
491
|
+
|
|
492
|
+
简单理解:
|
|
493
|
+
|
|
494
|
+
- `analytics.enabled` 更像一个“本机/本 profile 的总开关”
|
|
495
|
+
- `otel.*` 是真正接入可观测性系统时用的结构化配置
|
|
496
|
+
|
|
497
|
+
## 5. `requirements.toml`
|
|
498
|
+
|
|
499
|
+
`requirements.toml` 是管理员强制施加的配置约束层,主要针对用户不应自行绕开的安全敏感设置。
|
|
500
|
+
|
|
501
|
+
官方把它定义成“约束系统”,而不是普通便捷配置。
|
|
502
|
+
|
|
503
|
+
核心用途:
|
|
504
|
+
|
|
505
|
+
- 限制允许的 approval policy
|
|
506
|
+
- 限制允许的 sandbox mode
|
|
507
|
+
- 限制允许的 web search mode
|
|
508
|
+
- 钉死或禁用某些 features
|
|
509
|
+
|
|
510
|
+
官方明确点名的 key 族:
|
|
511
|
+
|
|
512
|
+
- `allowed_approval_policies`
|
|
513
|
+
- `allowed_approvals_reviewers`
|
|
514
|
+
- `allowed_sandbox_modes`
|
|
515
|
+
- `allowed_web_search_modes`
|
|
516
|
+
- `[features]`
|
|
517
|
+
- `features.<name>`
|
|
518
|
+
|
|
519
|
+
官方 reference 里明确举例的 feature 限制包括:
|
|
520
|
+
|
|
521
|
+
- `features.browser_use = false`
|
|
522
|
+
- `features.computer_use = false`
|
|
523
|
+
- `features.in_app_browser = false`
|
|
524
|
+
|
|
525
|
+
另外几个重要规则:
|
|
526
|
+
|
|
527
|
+
- 没写到的 feature key 默认不受约束
|
|
528
|
+
- 对 `web_search` 来说,`disabled` 永远是允许值
|
|
529
|
+
- 如果 `allowed_web_search_modes` 是空数组,效果基本等于只允许 `disabled`
|
|
530
|
+
|
|
531
|
+
官方也提到,企业环境下还可能存在 cloud-fetched requirements,具体优先级需要配合安全/管理文档一起看。
|
|
532
|
+
|
|
533
|
+
## 6. 可直接复用的配置片段
|
|
534
|
+
|
|
535
|
+
### 6.1 保守型日常默认配置
|
|
536
|
+
|
|
537
|
+
```toml
|
|
538
|
+
model = "gpt-5.5"
|
|
539
|
+
approval_policy = "on-request"
|
|
540
|
+
sandbox_mode = "workspace-write"
|
|
541
|
+
web_search = "cached"
|
|
542
|
+
profile = "daily"
|
|
543
|
+
|
|
544
|
+
[profiles.daily]
|
|
545
|
+
model_reasoning_effort = "medium"
|
|
546
|
+
service_tier = "flex"
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
### 6.2 通过代理访问 OpenAI
|
|
550
|
+
|
|
551
|
+
```toml
|
|
552
|
+
model = "gpt-5.5"
|
|
553
|
+
openai_base_url = "https://us.api.openai.com/v1"
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
这个方案适合“仍然想保留内置 `openai` provider 行为,只是换 base URL”。
|
|
557
|
+
|
|
558
|
+
### 6.3 使用自定义 provider 和环境变量认证
|
|
559
|
+
|
|
560
|
+
```toml
|
|
561
|
+
model = "gpt-5.4"
|
|
562
|
+
model_provider = "proxy"
|
|
563
|
+
|
|
564
|
+
[model_providers.proxy]
|
|
565
|
+
name = "OpenAI via team gateway"
|
|
566
|
+
base_url = "https://proxy.example.com/v1"
|
|
567
|
+
env_key = "OPENAI_API_KEY"
|
|
568
|
+
http_headers = { "X-Team" = "platform" }
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
### 6.4 最小暴露的 shell 环境策略
|
|
572
|
+
|
|
573
|
+
```toml
|
|
574
|
+
[shell_environment_policy]
|
|
575
|
+
inherit = "none"
|
|
576
|
+
include_only = ["PATH", "HOME"]
|
|
577
|
+
exclude = ["AWS_*", "AZURE_*"]
|
|
578
|
+
ignore_default_excludes = false
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
### 6.5 禁用本地历史
|
|
582
|
+
|
|
583
|
+
```toml
|
|
584
|
+
[history]
|
|
585
|
+
persistence = "none"
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
### 6.6 基础 OTEL 日志输出
|
|
589
|
+
|
|
590
|
+
```toml
|
|
591
|
+
[otel]
|
|
592
|
+
environment = "prod"
|
|
593
|
+
exporter = { otlp-http = {
|
|
594
|
+
endpoint = "https://otel.example.com/v1/logs",
|
|
595
|
+
protocol = "binary"
|
|
596
|
+
}}
|
|
597
|
+
log_user_prompt = false
|
|
598
|
+
```
|
|
599
|
+
|
|
600
|
+
### 6.7 管理员强制要求
|
|
601
|
+
|
|
602
|
+
```toml
|
|
603
|
+
allowed_approval_policies = ["on-request", "never"]
|
|
604
|
+
allowed_sandbox_modes = ["read-only", "workspace-write"]
|
|
605
|
+
allowed_web_search_modes = ["cached"]
|
|
606
|
+
|
|
607
|
+
[features]
|
|
608
|
+
browser_use = false
|
|
609
|
+
computer_use = false
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
## 7. 建议怎么用这份文档
|
|
613
|
+
|
|
614
|
+
适合用这份整理的场景:
|
|
615
|
+
|
|
616
|
+
- 想先理解 Codex 配置体系怎么分层
|
|
617
|
+
- 想快速找到某一类配置应该放在哪一层
|
|
618
|
+
- 想知道某个 key 族大概负责什么
|
|
619
|
+
|
|
620
|
+
需要回到官方 reference 的场景:
|
|
621
|
+
|
|
622
|
+
- 你要查某个冷门 key 的完整类型定义
|
|
623
|
+
- 你要看 provider auth、permissions、hooks、OTEL exporter 的完整嵌套 schema
|
|
624
|
+
- 你要确认 2026-05-14 之后新增的字段
|
|
625
|
+
- 你需要逐项对照所有支持的配置键
|
|
626
|
+
|
|
627
|
+
## 8. 这次整理里值得单独记住的更新点
|
|
628
|
+
|
|
629
|
+
- `experimental_instructions_file` 已经更名为 `model_instructions_file`
|
|
630
|
+
- `approval_policy = "on-failure"` 已被标记为过时
|
|
631
|
+
- 旧的 `features.web_search*` 开关已被顶层 `web_search` 替代
|
|
632
|
+
- profiles 目前仍然是 experimental
|
|
633
|
+
- Codex IDE extension 目前还不支持 profiles
|