Open Interpreter 非交互模式完全指南:用 `interpreter exec` 在脚本、CI 与流水线中驱动编码 Agent
interpreter exec 是 Open Interpreter 面向自动化场景提供的非交互执行入口:把一次完整的编码任务(分析 diff、修 bug、跑代码审查)以"单条命令 + 单次运行到结束"的方式交付,无需打开全屏 TUI。本文以仓库文档 docs/zh/exec.md 为主体骨架,结合 codex-rs/exec 的源码实现,讲解 exec 的输入方式、全部常用标志、JSON 事件协议、结构化输出、会话恢复、代码审查子命令,以及在 CI 中的落地模式。读完你可以在 shell 脚本、GitHub Actions 类流水线和本地自动化工具里稳定地驱动一个编码 Agent。
说明:本文命令按仓库中文文档统一写作
interpreter exec(如 docs/zh/cli-reference.md 所示),其底层实现位于本仓库codex-rs/execcrate,对应命令的内部 usage 字符串仍保留codex exec(见 exec 的 CLI 定义),两者指向同一套 exec 子命令。
一、什么是非交互模式
当你希望某个任务在不启动全屏 TUI 的情况下完整执行时,使用 interpreter exec:
interpreter exec "summarize the changes in the last commit"
这条命令会把"总结最近一次提交的变更"作为一个完整的回合交给 Agent 处理,进程在任务结束后自行退出。可读的最终答案会打印到 stdout;进度和诊断信息使用 stderr,除非你选择 JSON 输出。
这种 stdout/stderr 分离不是约定,而是被源码强制的契约。在 codex-rs/exec/src/lib.rs 顶部注释写得很明确:
在默认输出模式下,写入 stdout 的唯一内容必须是最终消息;在
--json模式下,stdout 必须是合法的 JSONL(每行一个事件);其余所有输出必须写到 stderr。
实现层面对应的约束是 crate 级 #![deny(clippy::print_stdout)],并在 run_main 的启动逻辑 中按是否开启 --json 选择两种事件处理器:默认的 EventProcessorWithHumanOutput(人类可读输出)与 EventProcessorWithJsonOutput(JSONL 输出)。诊断日志则交给 tracing 层写往 stderr,默认过滤级别为 error,可通过 RUST_LOG 环境变量调整(见 exec 的 stderr 过滤逻辑)。
这样的设计让 exec 天然适合被程序捕获:脚本只需要读取 stdout 拿到最终答案,把 stderr 当作旁路诊断。
二、prompt 的五种输入形态
interpreter exec 接收的提示文本来自多个来源,且支持组合。
1. 作为位置参数直接传入
interpreter exec "find one bug in src/parser.rs"
这是最直接的用法,适合命令较短、无需转义换行的场景。
2. 从 stdin 读取提示(- 哨兵)
cat task.md | interpreter exec -
显式使用 - 时,提示内容完全从 stdin 读取。对应源码中的 StdinPromptBehavior::Forced 分支,即"无条件把 stdin 当作 prompt"(见 codex-rs/exec/src/lib.rs)。
3. 把上下文通过管道并入提示
git diff | interpreter exec "explain this diff and flag risky changes"
当既提供了位置参数 prompt、stdin 又处于管道输入状态时,stdin 不会被当作独立的 prompt 覆盖,而是作为追加的上下文块合并进提示。CLI 参数注释把这一点写得很清楚:stdin 管道内容会作为 <stdin> 代码块追加(见 cli.rs 的 prompt 字段注释)。这是"给 Agent 喂 diff / 日志 / 报表"最常用的姿势,相当于把文本上下文交给模型后再下达指令。
4. 为第一个提示附加图片
interpreter exec -i screenshot.png "describe the UI problem"
-i/--image 是一个全局共享参数,支持一次传多张、并以逗号分隔(见 共享 CLI 参数 SharedCliOptions)。图片会先于文本被组装进首条用户输入:源码中将图片路径映射为 UserInput::LocalImage,随后再 push 文本输入(见 首条消息的组装逻辑)。
5. 恢复会话时继续追加输入
恢复(resume)子命令同样接受 prompt 与 -i 图片,见下文"恢复 Exec 工作"一节。
三、常用标志一览
以下是文档给出的常用标志总表(docs/zh/exec.md):
| 标志 | 用途 |
|---|---|
--json |
输出换行分隔的 JSON 事件。 |
--output-schema <file> |
要求最终答案符合 JSON Schema。 |
--output-last-message, -o <file> |
将最终的助手消息写入文件。 |
--color always|never|auto |
控制 ANSI 颜色。 |
--sandbox <mode> |
覆盖沙箱模式。 |
--ask-for-approval <mode> |
覆盖批准策略。 |
--profile <name> |
使用指定的配置文件。 |
--ephemeral |
不持久化会话记录。 |
--skip-git-repo-check |
允许在非 Git 仓库中运行。 |
--ignore-user-config |
跳过本次运行的用户配置。 |
--ignore-rules |
跳过 execpolicy 规则。 |
--verify |
在退出前额外运行一次完成检查。 |
--timeout <seconds> |
在运行期间发送剩余时间提醒。 |
逐个拆解其底层行为
结合 exec 的 clap 参数定义,这些标志大多是 global 全局参数,可放在 prompt 前后任意位置:
--json:把事件处理器切换为 JSONL 输出。该参数还有一个历史别名--experimental-json(见 cli.rs),自动化代码中两种写法都兼容。--output-schema <file>:指向一个 JSON Schema 文件路径,运行时解析后作为output_schema字段随turn/start请求一并发送,约束模型的最终响应结构。读取逻辑在 load_output_schema。--output-last-message, -o <file>:最终助手消息会被写入指定文件。该文件句柄会注入两种事件处理器(human / JSONL),便于脚本在主流程之外稳定取到最终答复,不受 stdout/stderr 重定向影响。--color:接受always/never/auto三值,枚举定义见 Color。auto(默认)会检测 stdout/stderr 各自是否接终端来决定是否输出 ANSI 颜色(见 颜色判定逻辑)。--sandbox <mode>:覆盖配置文件中的沙箱策略,例如 CI 里收敛为read-only(见SharedCliOptions的 sandbox_mode)。--ask-for-approval <mode>:覆盖批准策略。特别地,headless 模式默认会强制为"永不询问"(AskForApproval::Never),只在自动审查评审员(AutoReview)场景重建覆盖(见 overrides 组装)。--profile <name>:把$CODEX_HOME/<name>.config.toml作为一层配置叠加到基础用户配置之上,实现不同任务(如 code review 与日常开发)使用不同参数集。--ephemeral:本次会话不落盘,不会在会话存储中留下记录。--skip-git-repo-check:默认情况下,若不在 Git 仓库内运行,exec 会直接报错退出("Not inside a trusted directory and --skip-git-repo-check was not specified",见 lib.rs 的仓库检查)。--dangerously-bypass-approvals-and-sandbox(别名--yolo)开启时也会跳过该检查,因为它假定外部环境已自行沙箱化。--ignore-user-config:跳过$CODEX_HOME/config.toml的加载,但认证信息仍从CODEX_HOME读取(见 cli.rs)。--ignore-rules:不加载用户级与项目级的 execpolicy.rules文件,适用于无需规则约束的纯受信任务。--verify:在正常回合结束后再额外跑一次"完成检查"回合,用于长任务结束时核对结果是否达标。--timeout <seconds>:为超长运行设置倒计时,期间 Agent 会周期性地收到"剩余时间"提醒,从而主动收敛到可在时限内交付的方案。
更多共享参数(自动化高频搭配)
exec 还继承了整套共享 CLI 参数(定义于 shared_options.rs),包括:
-m, --model <model>:指定本次使用的模型;--oss/--local-provider <lmstudio|ollama>:切换到开源本地推理提供商;-C, --cd <DIR>:指定工作根目录(等价于在目标目录下执行);--add-dir <DIR>:在主工作区之外追加可写目录;--approve-for-me:把批准请求路由到自动评审(等价于使用workspace-write沙箱的自动审查,见 shared_options.rs)。
四、JSON 事件:把运行过程变成可消费的数据流
自动化场景请使用 --json:
interpreter exec --json "list the files this task would touch"
每一行都是一个 JSON 事件,表示进度、工具调用、文件更改、推理摘要或最终消息。由于 stdout 只承载 JSONL,配合 jq、流式解析器或按行读取即可在外部管道中重建整个执行过程。
事件协议类型
顶层事件是一个带 type 判别字段的枚举(见 exec_events.rs 的 ThreadEvent),当前实现包含:
| type | 含义 |
|---|---|
thread.started |
新线程启动,携带 thread_id——该 ID 可用来在之后 resume 恢复这条线程。 |
turn.started |
向模型发送新 prompt 后开启一个回合。 |
turn.completed |
回合完成,通常紧跟助手最终回复,事件内含 token usage。 |
turn.failed |
回合以错误结束,携带 error 信息。 |
item.started / item.updated / item.completed |
线程条目(item)的生命周期事件。 |
error |
事件流层面不可恢复的致命错误。 |
其中 turn.completed 携带的 usage 统计了 input_tokens、cached_input_tokens、cache_write_input_tokens、output_tokens 与 reasoning_output_tokens 等明细(见 Usage 结构),可用于成本核算与额度监控。
线程条目(item)通过内层 type 继续细分(ThreadItemDetails):agent_message(自然语言答复,或结构化输出模式下的 JSON 字符串)、reasoning(推理摘要)、command_execution(Agent 发起的命令执行及其退出码)、file_change(补丁应用结果)、以及 MCP 工具调用等。
消费示例
interpreter exec --json "list the files this task would touch" > events.jsonl
# 仅查看最终助手消息
jq 'select(.type == "agent_message") | .item.text' events.jsonl
# 查看回合的 token 用量
jq 'select(.type == "turn.completed") | .usage' events.jsonl
五、结构化输出:约束最终答案必须符合 JSON Schema
配合 --output-schema 使用模式文件,可以让 Agent 的最终输出直接变成程序可解析的结构化数据。先用一个 schema 文件描述期望的字段:
{
"type": "object",
"properties": {
"risk": { "type": "string" },
"recommended_fix": { "type": "string" }
},
"required": ["risk", "recommended_fix"]
}
interpreter exec --output-schema schema.json \
"inspect the current diff and return the highest risk"
开启结构化输出后,schema 会被封装进首回合请求(TurnStartParams.output_schema,见 lib.rs 的回合启动),模型的最终消息会以符合该 schema 的 JSON 字符串形式产出(agent_message 条目在结构化输出模式下承载 JSON,见 exec_events.rs 的注释说明)。
由于是纯 JSON Schema 约束而非代码层强校验,建议 schema 中的 required 字段设置完整、类型声明严格,并在下游使用 jq 或反序列化器做容错解析。若还需要把最终消息落盘供后续步骤读取,可与 -o/--output-last-message 组合使用。
六、恢复 Exec 工作:让长任务可以被续跑
非交互会话是持久化的,如果任务超时、中途中断,或你想让 Agent 在一个已理清上下文的会话里继续干活,可以用 resume 子命令(源码层面它经 thread/list + thread/resume 完成,见 lib.rs 的 resume 流程)。
继续最近的非交互会话:
interpreter exec resume --last "now apply the plan"
或恢复指定的会话 ID:
interpreter exec resume <SESSION_ID> "continue"
两个要点:
- 会话 ID 既可以是 UUID,也可以是线程名,UUID 优先级更高;省略 ID 时配合
--last自动选择最近记录的会话(见 ResumeArgs 定义)。 --last与位置参数存在特殊语义:当使用--last且没有显式 prompt 时,位置参数会被重新解释为 prompt 而不是会话 ID,因此exec resume --last "now apply the plan"中最后的字符串是下一步指令(该重解释逻辑在 cli.rs 的 From 实现 中完成)。
添加 --all 可搜索当前工作目录之外的会话。默认情况下会话搜索会按当前工作目录(cwd)过滤,跨目录续跑旧任务时必须加 --all。
七、来自 Exec 的审查:无 TUI 的自动代码审查
在不打开 TUI 的情况下运行代码审查,是 exec 子命令中与 resume 并列的另一个一等公民操作:
interpreter exec review --uncommitted
interpreter exec review --base main
interpreter exec review --commit abc123
三种目标选择(见 ReviewArgs):
| 参数 | 审查范围 | 互斥关系 |
|---|---|---|
--uncommitted |
已暂存 + 未暂存 + 未跟踪的全部变更 | 与 --base、--commit、prompt 互斥 |
--base <BRANCH> |
相对指定基准分支的全部变更 | 与 --uncommitted、--commit、prompt 互斥 |
--commit <SHA> |
某一次提交引入的变更 | 与 --uncommitted、--base、prompt 互斥 |
对于自定义审查指令,可传入文本或使用 - 从 stdin 读取:
interpreter exec review --uncommitted "focus on concurrency bugs and API misuse"
审查同样支持 --json、--sandbox 等全局参数。底层它会构造 ReviewRequest 并走 app-server 的 review/start 请求(见 lib.rs 的 Review 分支),审查内容与可读输出均与文档 auto-review 描述的能力一致。
八、CI 模式:流水线里的标准姿势
exec 就是为无头环境设计的。推荐的 CI 模式是:使用 API Key 认证,并保持沙箱范围窄,防止模型在审查/分析过程中改动仓库内容。
- name: Review patch
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
interpreter exec --json --sandbox read-only \
"review this pull request diff for regressions" \
< pr.diff > review.jsonl
这条命令的要点拆解:
OPENAI_API_KEY环境变量:headless 运行不使用交互式登录,通过 API Key 完成认证。exec 进程内会启用enable_codex_api_key_env读取环境变量(见 lib.rs 的启动参数)。--sandbox read-only:把模型可执行命令的沙箱收敛为只读。模型可以读源码、分析 diff,但无法写文件——在 CI 里,这是把"会写代码的 Agent"约束成"纯分析器"的关键开关。< pr.diff > review.jsonl:把 PR diff 通过 stdin 作为<stdin>上下文喂给提示(对应前面讲的管道输入),同时把结构化事件流落到review.jsonl,供后续步骤解析或归档。- 退出码:exec 会跟踪服务端上报的致命错误并以非零码退出,为自动化提供"失败可感知"的信号(见 lib.rs 的注释)。
审查类任务跑完后,最稳妥的取值姿势是 -o review-result.json + --output-schema 组合:先让审查结论以固定 JSON 结构返回并落盘,再用 jq 提取风险等级与建议,决定流水线是否继续。
九、实战建议与相关文档
综合源码与文档,把 exec 用好还有几条经验:
- 确认最终答案只从 stdout 读取:默认模式 stdout 只有最终消息;
--json模式 stdout 是纯 JSONL。任何进程级日志都走 stderr,不会污染你的捕获结果。 - 长任务优先
--json+-o:JSONL 保证中途进度可观测,-o保证最终消息在进程异常退出前也有副本落盘。 - 审查、编辑类任务主动收紧沙箱:
read-only(纯分析)与workspace-write(允许在工作区内改代码)分别对应"只读审查"与"允许修改"两类 CI 阶段。 - resume 语义注意
--last的位置参数重解释:--last后跟的字符串会被当作新 prompt 而非会话 ID。 - 跨目录续跑加
--all;脱离 Git 仓库运行加--skip-git-repo-check(或确认外部环境已沙箱化)。
interpreter exec 与仓库其他部分配合紧密,可继续阅读:
- 命令行全貌与其余子命令:docs/zh/cli-reference.md
- exec 内部 CLI/参数/子命令实现:codex-rs/exec/src/cli.rs、codex-rs/exec/src/lib.rs
- JSON 事件与 item 类型定义:codex-rs/exec/src/exec_events.rs
- 共享全局参数(模型、OSS、沙箱、目录等):codex-rs/utils/cli/src/shared_options.rs
- 沙箱模式与批准策略:docs/zh/sandbox.md、docs/zh/permissions.md
- execpolicy 规则(
--ignore-rules影响的加载项):docs/zh/execpolicy.md - 会话持久化与
resume/--ephemeral的行为边界:docs/zh/sessions.md - 自动代码审查(交互式
/review与 exec review 的关系):docs/zh/auto-review.md - GitHub Action 场景下的
interpreter exec --json用法:docs/zh/github-action.md
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0627
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00