一个运行在本地的编码 Agent 如何把"模型 + 循环 + 工具 + 沙箱"组合成可靠的软件工程助手
基于 github.com/openai/codex(codex-rs)源码与官方文档
codex 交互式终端界面;codex exec 无头运行,适合脚本与 CI。
VS Code、Cursor 插件与 codex app,通过 app-server JSON-RPC 驱动。
chatgpt.com/codex,在云端容器中并行执行任务并生成 PR。
面向软件工程训练的 GPT 变体,擅长长时程工具调用与补丁编辑。
开源实现 codex-rs:由 TypeScript 迁移到 Rust,单一静态二进制,原生集成各平台沙箱。核心 codex-core 与 UI 完全解耦。
loop { let prompt = build_prompt(history, tools); let r = run_sampling_request(prompt).await; // 工具调用 → 执行 → 输出写回 history if token_limit_reached { run_auto_compact(); } if !r.needs_follow_up { break; } }
只要模型本轮发出任何工具调用,结果就必须回传给模型,因此 needs_follow_up = true,继续采样。模型只输出文本消息时循环自然结束。
源码:core/src/session/turn.rs · run_turn()
| 实体 | 含义 | 关键约束 |
|---|---|---|
Codex | 核心引擎,后台线程或独立进程运行 | 只通过 SQ / EQ 与 UI 通信 |
Session | 当前配置与状态:模型、cwd、策略、历史 | 同一时刻最多一个 Task;重新配置会中止执行 |
Task | 响应一次用户输入的完整工作 | 新输入或 Op::Interrupt 会终止它 |
Turn | 一次"采样 → 执行工具 → 回填"迭代 | 上一轮输出是下一轮输入;无输出则结束 |
Model | Responses API 或兼容 Provider | SSE / WebSocket 流式返回 ResponseItem |
来源:codex-rs/docs/protocol_v1.md。需要并行时,为每条工作线运行独立的 Thread 或子 Agent。
// 每次采样都是一次完整请求
instructions: <基础系统指令>
tools: [exec_command, apply_patch,
update_plan, view_image, mcp__*]
input: [
developer: <权限 / 沙箱说明>
user: <AGENTS.md 指令>
user: <environment_context>
...history (只追加)
user: "本次输入"
]
从 cwd 向上找到项目根(默认 .git),再从根到 cwd 逐层收集 AGENTS.md 并拼接,越靠近 cwd 优先级越高;再合并 ~/.codex/AGENTS.md。
静态前缀在前、历史在后,最大化 prompt cache 命中。配置变化以追加消息表达。请求默认无状态,推理以 encrypted_content 回传,兼容 ZDR。
UserTurn 用户输入 + 每轮上下文Interrupt 中断ExecApproval / PatchApproval 审批回复UserInputAnswer 回答提问Compact / Review / Shutdown
TurnStarted / TurnCompleteAgentMessageContentDelta 流式文本ExecApprovalRequest 请求审批ExecCommandBegin/End、PatchApplyBegin/EndTokenCount / Warning / Error
| 工具 | 作用 |
|---|---|
exec_command / write_stdin | unified_exec:基于 PTY 的命令执行,支持长驻进程与交互输入,输出头尾截断 |
apply_patch | 自定义 diff 语法(*** Begin Patch)增删改文件,Codex 的主要编辑方式 |
update_plan | 维护步骤与状态的任务计划,UI 显示为 TODO 列表 |
view_image / web_search | 附加本地图片;服务端执行的网页搜索 |
MCP 工具 / tool_search | rmcp-client 连接 MCP Server;工具多时延迟加载 schema |
request_user_input / 多 Agent | 结构化提问;派生子 Agent 并互相通信 |
arg0 分发:同一个 codex 二进制,argv[0]=codex-linux-sandbox 时变身沙箱 helper,argv[1]=--codex-run-as-apply-patch 时变身补丁工具。
| AskForApproval:何时问人 | |
|---|---|
untrusted | 除 execpolicy 允许的命令外都要审批 |
on-request | 默认;模型按需申请提权(on-failure 为别名) |
granular | 按类别细粒度开关 |
never | 从不询问,失败直接返回模型 |
| SandboxPolicy:系统允许做什么 | |
|---|---|
read-only | 全盘只读,默认断网 |
workspace-write | cwd 与 writable_roots 可写,.git/.codex 只读 |
danger-full-access | 无限制 |
external-sandbox | 已在容器内,全盘访问 |
再叠加 execpolicy(Starlark prefix_rule:allow / prompt / forbidden)与 network-proxy,形成纵深防御。
/usr/bin/sandbox-exec 加载动态生成的 SBPL profile:按可写根放开 file-write*,拒绝网络,保留偏好设置读取。
--ro-bind / / 默认只读,--bind 叠加可写根,受保护子路径重新只读;PR_SET_NO_NEW_PRIVS + seccomp 屏蔽网络与 io_uring。Landlock 为旧路径。
非提权模式用受限令牌;提权模式支持精确读写根与只读子目录。无法强制执行的策略 fail closed。
Approved、ApprovedForSession(会话缓存)、ApprovedExecpolicyAmendment(写入规则)、Denied、Abort。也可由 Guardian 自动审查代为决定。
untrusted:沙箱失败后自动请求无沙箱重试。on-request:不自动升级,拒绝信息返回模型,由模型带 require_escalated 显式申请审批。never:从不询问,失败直接交给模型处理。
model_auto_compact_token_limit 且仍需继续;采样前或切换小窗口模型时也会检查Compaction itemSUMMARY_PREFIX + 摘要 + 最近用户消息,重新插入初始上下文/compact 手动触发~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl,codex resume 重放恢复。
模型、Provider、策略默认值、MCP Servers、profiles、features。
工具决策来源、沙箱结果、采样耗时等指标。
Op::UserTurnTurnStartedexec_command: cargo testneeds_follow_up=trueapply_patch,自动批准写入require_escalated → 用户批准TurnComplete,rollout 落盘逐步动画演示见 codex-animation.html
cli 多功能入口arg0 二进制角色分发tui ratatui 界面exec 无头模式app-server JSON-RPC
session/turn.rs 主循环tasks/ regular · review · compactcontext_manager/ 历史compact*.rs 压缩agents_md.rs · client.rs
router.rs 解析分发registry.rs 注册表orchestrator.rs 审批沙箱parallel.rs 并行调用handlers/* 各工具实现
unified_exec/ PTY 进程apply-patch 补丁execpolicy Starlark 规则
sandboxing 策略转换linux-sandbox · bwrapnetwork-proxy
protocol 共享类型codex-mcp · rmcp-clientmodel-provider · ollama
SQ/EQ 让 TUI、IDE、App、MCP Server 共享同一个 core。
每个 Session 一次只跑一个 Task,避免并发编辑冲突。
规则 + 审批 + OS 沙箱 + 网络代理;不能强制执行就 fail closed。
最大化前缀缓存命中;无状态请求兼容 ZDR。
输出更短、更易审阅,UI 直接渲染 diff。
启动快、无运行时依赖,沙箱 helper 与补丁工具内置。
github.com/openai/codex:codex-rs 源码codex-rs/docs/protocol_v1.md:Session / Task / Turn 与 SQ/EQcodex-rs/core/README.md、linux-sandbox/README.md:沙箱实现codex-rs/execpolicy/README.md:命令策略语言developers.openai.com/codex:官方文档配套:Codex-架构原理详解.html · codex-animation.html