Appearance
非交互模式 — 概念
Exec 模式架构
Exec 模式是 Codex 的非交互执行引擎(exec/src/lib.rs,约 1975 行),与 TUI 模式共享核心层但使用完全不同的交互模型:
Exec 与 TUI 的核心架构差异:
| 维度 | TUI 模式 | Exec 模式 |
|---|---|---|
| 入口 | tui::run_main() | exec::run_main() |
| 事件循环 | 持续运行,等待用户输入 | 单 turn 执行完毕即退出 |
| 输出方式 | Ratatui 即时渲染 | JSON/文本流式输出 |
| 交互请求 | 弹出对话框,等待用户 | 自动拒绝/自动处理 |
| 会话管理 | 支持恢复、分叉 | 支持恢复(--resume) |
| 适用场景 | 交互式编程 | CI/CD、自动化脚本 |
Exec 模式的 run_main() 执行流程:
- 解析 CLI 参数:
Clistruct 包含 prompt、model、config 覆盖等 - 加载配置:强制登录认证,初始化
CloudConfigBundle - 启动 App Server:创建 in-process app-server client(与 TUI 共享同一协议)
- 解析 prompt:从命令行参数或 stdin 获取用户指令
- 启动/恢复线程:
InitialOperation::UserTurn开始新 turn 或--resume恢复 - 运行事件循环:
EventProcessor处理所有事件直到 turn 完成 - 输出结果:通过
EventProcessorWithJsonOutput格式化为 JSON 或文本
Ephemeral 执行
Ephemeral 模式提供临时的执行环境,执行完毕即清理:
Ephemeral 的关键特征:
- 临时性:执行环境在任务完成后自动清理,不保留状态
- 隔离性:每次执行在独立的沙箱环境中运行
- 无状态:不依赖之前的执行状态(除非显式
--resume) - 自动化友好:适合 CI/CD 管道和批量任务处理
ThreadConfigSnapshot 中的 ephemeral 字段标识当前线程是否为临时模式:
rust
pub struct ThreadConfigSnapshot {
pub ephemeral: bool,
// ... 其他配置字段
}输出格式
Exec 模式支持两种输出格式,通过 EventProcessorWithJsonOutput 处理:
JSON 输出模式(--experimental-json)
每行一个 JSON 对象,包含不同的事件类型:
| 事件类型 | 说明 |
|---|---|
TurnStartedEvent | Turn 开始,包含 thread ID |
AgentMessageItem | 代理的文本消息 |
CommandExecutionItem | 命令执行(命令 + stdout/stderr) |
FileChangeItem | 文件修改(路径 + 变更内容) |
McpToolCallItem | MCP 工具调用 |
ReasoningItem | 推理过程 |
TurnCompletedEvent | Turn 完成,包含 Usage 统计 |
TurnFailedEvent | Turn 失败,包含错误信息 |
文本输出模式(默认)
人类可读的彩色文本输出,包含:
- 代理消息(纯文本)
- 命令执行结果(命令 + 输出)
- 文件修改摘要(修改的文件列表)
- 最终结果摘要
自动化安全策略
Exec 模式下的安全策略需要特别考虑,因为无法进行实时用户交互:
自动化安全的关键设计:
自动拒绝:所有
ServerRequest(审批、用户输入、MCP elicitation)在 exec 模式下自动拒绝。这确保了在没有人类监督的情况下,代理不会执行高风险操作。ExecPolicy 配置:通过 ExecPolicy 预定义允许的命令集合(
Decision::Allow),避免需要审批的命令。沙箱策略:使用更严格的 Sandbox 配置,限制文件系统和网络访问范围。
输出 Schema:
output_schema_path参数支持指定 JSON Schema,约束代理输出的结构。
相关概念
- Ephemeral — 临时执行环境
- ExecPolicy — 执行策略和权限控制
- Sandbox — 沙箱系统
- Agent Loop — 代理循环执行引擎
- App Server Protocol — Exec 与核心的通信协议