安装以及更新
安装
npm i -g @openai/codex
更新
npm i -g @openai/codex@latest
概念
沙盒
沙盒是让 Codex 能够自主运行而不给予其无限制访问您机器权限的边界。当 Codex 在 Codex 应用、IDE 扩展或 CLI 中运行本地命令时,这些命令会在受限环境中运行,而不是默认拥有完全访问权限。
该环境定义了 Codex 能够自主执行的操作,例如可以修改哪些文件以及命令是否可以使用网络。当任务保持在这些边界内时,Codex 可以持续运行而无需等待确认。当需要超越这些边界时,Codex 将回退到审批流程。
这里要特别强调一下沙盒中的环境是什么。严格来说,沙盒里面没有一个特定的环境,只要是Codex可以访问的目录下有虚拟环境,那么Codex就可以执行这个虚拟环境(也就是使用这个虚拟环境)。
同时注意,即使是workspace-write,Codex也可以访问常见的虚拟环境目录。
只不过如果没有给Codex对应的写权限的话,Codex是不能够安装依赖的,所以不用担心他会破坏环境。
当然更好的方法是使用conda create --prefix /path/ro/project/envs/env_name --clone env_name来复制一个虚拟环境到当前项目的目录下,然后让Codex在里面进行操作
审批
沙盒和审批是协同工作的不同控制机制。沙盒定义技术边界,而审批策略决定在何时 Codex 必须在跨越这些边界前停止并请求许可。
受信任项目
一个项目受信任的话,根目录下面的.codex/config.toml会参与配置解析,否则的话不会。
在~/.codex/config.toml中(或更低优先级的配置文件中)用projects.<path>.trust_level设置受信任项目
项目根目录
默认情况下,从当前目录开始往上找,找到的第一个包含.git的目录。
可以在配置文件中自定义
配置
配置文件
解析优先级
--config覆盖- Profile
- 项目配置文件:
.codex/config.toml,按从项目根目录到当前工作目录的顺序排列(最近的优先;仅限受信任项目) - 用户配置:
~/.codex/config.toml - 系统配置(如果存在):Unix 上的
/etc/codex/config.toml - 内置默认设置
注意,解析优先级越高的,会在更后面读取,然后直接覆盖之前读取的配置文件的值
配置文件选项
所有可选字段见官方文档
沙盒级别
read-only:Codex 可以检查文件,但未经批准无法编辑文件或执行命令。workspace-write: Codex 可以读取文件、在工作区内进行编辑,并在此边界内执行常规本地命令。这是本地工作的默认低摩擦模式。- 工作区包含当前目录和类似
/tmp的临时目录 - 项目下的
.git,.codex和.agent三个目录及其子目录是保护目录,写之前仍然要询问
- 工作区包含当前目录和类似
danger-full-access:Codex 在不受沙盒限制的情况下运行。这将移除文件系统和网络边界,仅应在希望 Codex 拥有完全访问权限时使用。
审批级别
-
untrusted:Codex 在运行不在其信任集合中的命令前会询问。 -
on-request: Codex 默认在沙盒内运行,当需要超出该边界时会进行提示。 -
never:Codex 不会在审批提示处停止。 -
--ask-for-approval never或-a never:禁用审批提示,遇到超出权限的操作直接不做
网络搜索
注意区分两种访问网络:Codex 直接访问网络和沙盒中的命令访问网络。
Codex 无论如何都有访问网络的权限的,这里讲的是否禁止网络搜索指的是后者
- Codex 直接访问网络
Codex 自带一个官方网页搜索工具。对于 Codex CLI 中的本地任务,Codex 默认启用网页搜索,并从网页搜索缓存中提供结果。该缓存是 OpenAI 维护的网页结果索引,因此缓存模式返回预索引结果,而不是获取实时页面。cached:缓存结果live:实时网页disabled:关闭网络搜索
- 沙盒的命令访问网络
默认的workspace-write沙盒模式会保持命令网络访问关闭,除非您在配置中启用它:[sandbox_workspace_write] network_access = true
运行日志
覆盖 Codex 写入本地日志文件的路径:log_dir = "/absolute/path/to/codex-logs"
也可以通过 CLI 进行设置:codex -c log_dir=./.codex-log
官方没有给出这个日志中具体有哪些字段,还有个遥测1和遥测2,没事就别用吧
功能
https://developers.openai.com/codex/config-basic#feature-flags
项目根目录标志
project_root_markers = [".git", ".hg", ".sl"]
模型提供商
model = "gpt-5.1"
model_provider = "proxy"
[model_providers.proxy]
name = "OpenAI using LLM proxy"
base_url = "http://proxy.example.com"
env_key = "OPENAI_API_KEY" # 这个不是直接替换成API KEY,而是在终端设置名为OPENAI_API_KEY的环境变量
# 切换提供商会导致会话历史记录变换,此时可以使用 codex resume session_id 来强制恢复
[model_providers.ollama]
name = "Ollama"
base_url = "http://localhost:11434/v1"
[model_providers.mistral]
name = "Mistral"
base_url = "https://api.mistral.ai/v1"
env_key = "MISTRAL_API_KEY"
根据需要添加请求头或者请求参数:
[model_providers.example]
http_headers = { "X-Example-Header" = "example-value" }
env_http_headers = { "X-Example-Features" = "EXAMPLE_FEATURES" }
request_max_retries = 4
stream_max_retries = 10
stream_idle_timeout_ms = 300000
shell 环境变量继承
控制Codex在创建子进程的时候是否继承当前终端的环境变量,以及继承哪些环境变量
[shell_environment_policy]
inherit = "none"
set = { PATH = "/usr/bin", MY_FLAG = "1" }
ignore_default_excludes = false
exclude = ["AWS_*", "AZURE_*"]
include_only = ["PATH", "HOME"]
具体字段的含义见官方文档
可点击引用
Codex 可以将文件引用渲染为可点击的链接。配置 file_opener 以选择 Codex 使用的 URI 方案:file_opener = "vscode" # or cursor, windsurf, vscode-insiders, none
通知
当出现某一类事件的时候,Codex如何通知
notify:将脚本放置在磁盘上的某个位置,并将 notify 指向该脚本。示例tui.notifications:通知哪些类型的事件tui.notification_method:通知的方式
实例配置
model = "gpt-5.4"
model_reasoning_effort = "xhigh"
personality = "none"
approval_policy = "never"
sandbox_mode = "workspace-write" # 这种配置的作用是沙盒里面随便造(除了受保护的路径),但是不允许做任何出沙盒的操作;最理想的应该是沙盒里面随便造,但是做出沙盒的操作需要询问(我目前没有发现这种配置,看起来对的配置都有bug);如果胆子大可以直接full-access
[sandbox_workspace_write]
network_access = true # 网络搜索除了在明确会使用到这个功能的时候再开,否则Codex会乱搜索
writable_roots = [
"..."
] # 如果需要让Codex读写工作区之外的目录就添加这个
web_search = "live" # 网络搜索除了在明确会使用到这个功能的时候再开,否则Codex会乱搜索
[features]
multi_agent = true
use_legacy_landlock = true # 兼容开关,在默认新沙箱出问题时强行切回“老 Landlock”路径,保持 Codex 命令执行不受阻
[tui]
status_line = ["model-with-reasoning", "current-dir", "project-root", "git-branch", "context-usage", "five-hour-limit", "weekly-limit", "codex-version", "session-id"]
notifications = ["approval-requested", "agent-turn-complete"]
notification_method = "auto"
[agents]
max_threads = 6 # 最多开多少个子代理,默认6
max_depth = 1 # 子代理嵌套的最大深度(也就是子代理开子代理)
规则
使用规则控制 Codex 可以在沙盒外运行哪些命令(但是我感觉现阶段应该用不到)
创建
- 在
./codex/rules/下创建一个.rules文件(例如~/.codex/rules/default.rules) - 添加规则(语法见下)
- 重启 Codex
字段
支持以下字段:
pattern(必需):一个非空列表,用于定义要匹配的命令前缀。每个元素可以是:- 字面量字符串(例如 `"pr"`` )。
- 字面量列表(例如
["view", "list"]),用于匹配该参数位置的备选项。
decision(默认为"allow"):当规则匹配时采取的操作。当多个规则匹配时,Codex 会应用限制性最强的决定(forbidden>prompt>allow)。allow:在沙盒外执行命令,不进行提示。prompt:每次匹配调用前进行提示。forbidden:阻止请求,不进行提示。
justification(可选):该规则的非空、人类可读的原因。Codex 可能会在批准提示或拒绝消息中显示它。当你使用forbidden时,应在理由中酌情包含推荐的替代方案(例如, "Use \rg而不是grep。)match和not_match(默认为[]):Codex 加载规则时验证的示例。使用这些示例可在规则生效前捕获错误。
示例
# Prompt before running commands with the prefix `gh pr view` outside the sandbox.
prefix_rule(
# The prefix to match.
pattern = ["gh", "pr", "view"],
# The action to take when Codex requests to run a matching command.
decision = "prompt",
# Optional rationale for why this rule exists.
justification = "Viewing PRs is allowed with approval",
# `match` and `not_match` are optional "inline unit tests" where you can
# provide examples of commands that should (or should not) match this rule.
match = [
"gh pr view 7888",
"gh pr view --repo openai/codex",
"gh pr view 7888 --json title,body,comments",
],
not_match = [
# Does not match because the `pattern` must be an exact prefix.
"gh pr --repo openai/codex view 7888",
],
)
特殊情况
- 某些工具会将多个 shell 命令封装为单个调用,例如:
["bash", "-lc", "git add . && rm -rf /"],对于这类命令,Codex 处理的是真正起作用的字符串(比如"git add . && rm -rf /"),而会忽略表面文本(比如bash -lc)。更详细的内容
Hooks
在 Codex 生命周期中运行确定性脚本
启动
Hooks 在 config.toml 中处于功能标志之后:
[features]
codex_hooks = true
Codex 在活动配置层旁边发现 hooks.json,比如说:~/.codex/hooks.json和<repo>/.codex/hooks.json
如果存在多个 hooks.json 文件,Codex 会加载所有匹配的钩子。更高优先级的配置层不会替换更低优先级的钩子。
结构
钩子分为三个层级:
- Hook 事件:在Codex的生命周期中,存在若干人为定义的 Hook 事件
- 匹配器:当 Hook 事件发生的时候,是否执行对应的处理器
- 处理器:如果某个 Hook 事件发生并且匹配成功,那么处理器就会通过标准输入接收到一个JSON对象,处理器根据输入执行脚本,执行完毕之后会通过标准输出一个JSON对象给Codex
Hook 事件
- 会话开始:一个会话开始的时候,可以是
/new,/resume或者/clear - 工具使用前:Codex 调用任何工具之前
- 工具使用后:Codex 调用任何工具之后
- 用户提交提示时:字面意思
- 停止:Codex 停止回答的时候(不是会话结束的时候)
匹配器
用matcher 字段来判断当一个 Hook 事件发生的时候,执行器是否启动
需要注意的地方:
- 使用
"*"、""或完全省略matcher以匹配所有支持事件的发生 - 同一事件的多个匹配钩子会同时启动,因此一个钩子无法阻止另一个匹配钩子的启动
- Codex 可以调用很多种工具,但是对于
PreToolUse和PostToolUse来说,当前仅支持Bash触发执行器(也就是matcher的值只能是Bash,其他的无效)
处理器
输入
每个钩子通过标准输入接收一个 JSON 对象
- 公共输入:
字段 类型 说明 session_idstring 当前会话或线程 ID。 transcript_pathstring | null 会话记录文件的路径(如有)。 cwdstring 本次会话的工作目录 hook_event_namestring 当前钩子事件 modelstring 当前模型标识符 turn_id回合id(一个会话有多个回合; StartSession不可用) - 特殊输入
- 会话开始
source:当前会话是如何启动的(/new还是/resume)
- 工具使用前
字段 类型 说明 turn_idstring Codex 特定扩展。活跃 Codex 轮次 ID tool_namestring 当前始终为 Bashtool_use_idstring 工具调用 ID tool_input.commandstring Codex 即将运行的 Shell 命令 - 工具使用后
字段 类型 说明 turn_idstring Codex 特定扩展。活跃 Codex 轮次 ID tool_namestring 当前始终为 Bashtool_use_idstring 工具调用 ID tool_input.commandstring Codex 刚刚运行的 Shell 命令 tool_responseJSON value 工具输出有效载荷。通常是一个 JSON 字符串。 - 用户提交提示时
字段 类型 说明 turn_idstring Codex 特定扩展。活跃 Codex 轮次 ID promptstring 用户即将发送的提示 - 回答结束时
字段 类型 说明 turn_idstring Codex 特定扩展。活跃 Codex 轮次 ID stop_hook_activeboolean 此轮次是否已被 stop继续last_assistant_messagestring | null 如果可用,最新的助手消息文本
- 会话开始
输出
Codex 通过纯文本或者 JSON 对象(下面用.来表示JSON字典的嵌套结构)接收钩子的输出
-
公共输出
字段 作用 continue如果 false,将钩子运行标记为已停止(PreToolUse不支持)stopReason记录为停止原因 ( PreToolUse不支持)systemMessage在 UI 或事件流中向用户显示的警告 suppressOutput今日已解析但尚未实现( PreToolUse和PostToolUse不支持) -
特殊输出
- 会话开始
- 纯文本:额外的开发者上下文添加
hookSpecificOutput.additionalContext:额外的开发者上下文
- 工具使用前
hookSpecificOutput.permissionDecision:是否执行这个工具调用hookSpecificOutput.permissionDecisionReason:是否执行的原因
- 工具使用后
decision:是否将工具执行结果给Codex看reason:如果不将工具执行结果给Codex看,那么Codex会看到的内容hookSpecificOutput.additionalContext:作为额外的开发者上下文添加
- 用户提交提示时
- 纯文本:额外的开发者上下文添加
hookSpecificOutput.additionalContext:额外的开发者上下文decision:是否将用户提示给大模型看reason:如果不把用户提示给大模型看,那么大模型不会执行,同时给用户呈现的话
- 停止
decision:是否自动发送reason作为下一轮次的提示信息reason:自动发送的下一轮次的提示信息(可能有多个匹配的钩子,此时优先选择continue不为False的钩子)
- 会话开始
注意事项
- 对于仓库级别的钩子,建议从项目根目录解析,而非使用诸如
.codex/hooks/...的相对路径(也就是说写成"command": "python3 \"$(git rev-parse --show-toplevel)/.codex/hooks/policy.py\""而不是"command": "python3 .codex/hooks/policy.py"),这是因为 Codex 可能从子目录启动,而基于项目根目录的路径能确保钩子位置稳定。
示例文件
{
"hooks": {
"SessionStart": [
{
"matcher": "startup|resume",
"hooks": [
{
"type": "command",
"command": "python3 ~/.codex/hooks/session_start.py",
"statusMessage": "Loading session notes"
}
]
}
],
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "/usr/bin/python3 \"$(git rev-parse --show-toplevel)/.codex/hooks/pre_tool_use_policy.py\"",
"statusMessage": "Checking Bash command"
}
]
}
],
"PostToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "/usr/bin/python3 \"$(git rev-parse --show-toplevel)/.codex/hooks/post_tool_use_review.py\"",
"statusMessage": "Reviewing Bash output"
}
]
}
],
"UserPromptSubmit": [
{
"hooks": [
{
"type": "command",
"command": "/usr/bin/python3 \"$(git rev-parse --show-toplevel)/.codex/hooks/user_prompt_submit_data_flywheel.py\""
}
]
}
],
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "/usr/bin/python3 \"$(git rev-parse --show-toplevel)/.codex/hooks/stop_continue.py\"",
"timeout": 30
}
]
}
]
}
}
说明:
timeout以秒为单位。如果省略timeout,Codex 将使用 600 秒。statusMessage是可选的。- 命令将以会话工作目录作为工作目录执行。
- 完整Schema
AGENTS.md
为 Codex 提供额外指令和项目上下文
设置
# ~/.codex/config.toml
project_doc_fallback_filenames = ["TEAM_GUIDE.md", ".agents.md"]
project_doc_max_bytes = 65536
project_doc_fallback_filenames代表的是除了AGENTS.overide.md和AGENTS.md之外,还有哪些文件在项目范围中可以被加载(顺序是严格的,比如TEAM_GUIDE.md的优先级比.agents.md高)project_doc_max_bytes代表的是所有加载的上下文的最大大小
加载
每次启动会话的时候,Codex都会以下面的顺序加载指令(注意子代理也会加载哦):
- 全局范围:
- 在 Codex 主目录中(默认为
~/.codex,除非设置了CODEX_HOME环境变量),Codex 会读取AGENTS.override.md(如果存在);否则,Codex 会读取AGENTS.md - 仅使用第一个非空文件
- 在 Codex 主目录中(默认为
- 项目范围:
- 从项目根目录开始,Codex 会向下遍历到当前的工作目录。如果 Codex 无法找到项目根目录,则仅检查当前目录
- 在路径上的每个目录中,它会检查
AGENTS.override.md,然后检查AGENTS.md,再检查project_doc_fallback_filenames中的任何备用名称。会跳过空文件 - 每个目录最多包含一个文件
- 加载过程中,Codex 会从根目录向下连接文件,用空行将它们分隔
验证
直接问Codex"Summarize the current instruction."即可
MCP(未读)
codex_apps是内置的一个MCP,负责把这些已安装的插件暴露给 Codex 使用
插件(未读)
插件包含技能、APP集成和MCP服务器
可以安装Github这个插件,还是挺有用的
Skills
结构
Codex 通过开放标准和可选元数据来构建技能
开放标准
可选元数据
添加 agents/openai.yaml(agents与SKILL.md同级) 以在 Codex 应用中配置 UI 元数据、设置调用策略并声明工具依赖,从而在使用该技能时获得更无缝的体验。
interface:
display_name: "Optional user-facing name"
short_description: "Optional user-facing description"
icon_small: "./assets/small-logo.svg"
icon_large: "./assets/large-logo.png"
brand_color: "#3B82F6"
default_prompt: "Optional surrounding prompt to use the skill with"
policy:
allow_implicit_invocation: false # 当 false 时,Codex 不会根据用户提示隐式调用该技能;显式 $skill 调用仍然有效。
dependencies:
tools:
- type: "mcp"
value: "openaiDeveloperDocs"
description: "OpenAI Docs MCP server"
transport: "streamable_http"
url: "https://developers.openai.com/mcp"
激活技能
- 显式调用:在提示中直接包含技能。在 CLI/IDE 中,运行
/skills或输入$来提及技能 - 隐式调用:当您的任务与技能
description匹配时,Codex 可以选择该技能。
存放技能
Codex 从仓库、用户、管理和系统位置读取技能。如果两个技能共享相同的 name ,Codex 不会合并它们;两者均可出现在技能选择器中。
| 范围 | 位置 | 建议用途 |
|---|---|---|
REPO |
$CWD/.agents/skills |
如果你在仓库或代码环境中,团队可以提交与工作文件夹相关的技能。例如,仅与某个微服务或模块相关的技能。 |
REPO |
$CWD/../.agents/skills |
如果您所在的仓库包含嵌套文件夹,组织可以将与父文件夹中共享区域相关的技能签入其中。 |
REPO |
$REPO_ROOT/.agents/skills |
如果您位于具有嵌套文件夹的仓库中,组织可以签入适用于仓库所有用户的技能。这些技能作为根技能,可在仓库的任意子文件夹中使用。 |
USER |
$HOME/.agents/skills |
用于整理适用于用户的技能,这些技能可在用户可能工作的任何仓库中应用。 |
ADMIN |
/etc/codex/skills |
用于 SDK 脚本、自动化,以及检查每台机器上每个用户可用的默认管理员技能。 |
SYSTEM |
随 OpenAI Codex 捆绑提供 | 适用于广大用户的实用技能,例如 skill-creator 和 plan skills。每个人在开始使用 Codex 时均可使用。 |
启用或者禁用技能
使用 ~/.codex/config.toml 中的 [[skills.config]] 条目来禁用技能而不删除它:
[[skills.config]]
path = "/path/to/skill/SKILL.md"
enabled = false
子代理
启动
只有在Prompt中明确要求时,Codex 才会生成子代理
管理
- 在 CLI 中使用
/agent以切换活动代理。 - 可直接让 Codex 引导正在运行的子代理、停止它,或关闭已完成的代理
内置代理
Codex 内置代理:
- default : 通用备用智能体。
- worker :专注于执行的实现与修复智能体。
- explorer :读操作密集型代码库探索代理。
自定义
与config.toml的联系
要自定义智能体,在 ~/.codex/agents/ 或 .codex/agents/ 下添加独立的 TOML 文件
由于子代理本质上是新开了一个会话,所以除了name,description等接下来会提到的字段,这个会话的配置的其他字段都跟config.toml相同。字段默认继承父会话的config.toml,如果自定义则覆盖
Codex 在生成子代理时也会重新应用父代理的实时运行时覆盖(也就是命令行的配置,比如--sandbox),即使所选的自定义代理文件设置了不同的默认值(因为实时运行时覆盖的优先级更高)
审批
在交互式 CLI 会话中,即使正在查看主线程,批准请求也可能从非活动代理线程出现。批准覆盖层会显示源线程标签,您可以在批准、拒绝或回复请求前按 o 打开该线程。
在非交互式流程中,或当运行无法显示新的批准请求时,需要新批准的操作将失败,Codex 会将错误反馈给父工作流。
全局设置
在config.toml中,有对子代理的全局设置,比如
[agents]
max_threads = 6 # 最多开多少个子代理,默认6
max_depth = 1 # 子代理嵌套的最大深度(也就是子代理开子代理),默认1
如果自定义智能体名称与内置智能体(例如 explorer )匹配,则自定义智能体优先。
局部设置
| 字段 | 类型 | 必需 | 用途 |
|---|---|---|---|
name |
string | 是 | Codex 在生成或引用此智能体时使用的智能体名称(Codex 靠这个字段来唯一标识子代理的类型) |
description |
string | 是 | 对此智能体的描述 |
developer_instructions |
string | 是 | 定义智能体行为的核心指令。 |
nickname_candidates |
string[] | 否 | 显示代理活动出现时的昵称(当运行同一自定义代理的多个实例并希望 UI 显示不同的标签而非重复相同代理名称时,此功能尤为有用) |
下面是一个示例:
name = "reviewer"
description = "PR reviewer focused on correctness, security, and missing tests."
developer_instructions = """
Review code like an owner.
Prioritize correctness, security, behavior regressions, and missing test coverage.
"""
nickname_candidates = ["Atlas", "Delta", "Echo"]
功能
交互式模式,功能标志(讲的是features这个命令的作用是将配置文件中的某些配置选项直接写到配置文件中),代码审查(这个配合视频一起使用,与他人合作仓库的时候非常有用;目前自动审查好像有点问题,但是可以使用@codex review来手动触发;后台似乎不会显示用量,不知道为什么;似乎有专门的审查提示词,没办法使用中文回复;github一定要同时授权installed github apps和authorized github apps;chatgpt网页版可以直接告诉他访问我的github的哪一个仓库,私有的也可以;撤销的话两种apps也要一起撤销掉;还是直接使用网页版chatgpt进行审查吧,已经开了一个项目了),按Tab将Codex的命令补全命令行选项
斜杠命令
/debug-config:检查输出的配置层顺序(优先级最低优先)、开关状态和策略来源/copy:复制模型的最新输出/ps:查看后台终端。后台终端就是像Copilot那样可能开多个终端/compact:压缩对话/diff:查看Git diff(查看的仓库是从当前工作目录往上找,找到的第一个Git仓库)/init:生成AGENTS.md/agent:切换代理线程
新功能
0.118.0
- 给自定义模型提供方接入认证时,不再只能把固定不变的密钥/token 写在
config.toml或环境变量里了;现在可以让 Codex 在运行时主动去拿一个“短时有效”的 Bearer Token,并在它快过期或已经失效时自动刷新。
0.121.0
- 有个跟devcontainer开发的更新,好像是说在容器环境里面使用Codex需要知道的
- 有个跟memory相关的更新,但是官方文档没有讲memory相关的内容,然而
codex-rs/core/config.schema.json里面说明在config.toml文件中的[features]下面的确有memory这个字段,不知道是干什么的
Bug
0.120.0
- 使用
/status的时候,可能会显示没有加载AGENTS.md,但是实际上是加载了的(问Codex“Summarize the current instructions.”即可)



所有评论(0)