Aklman · Library

08 / 第八章

无人值守 · exec、SDK、CI 与定时任务.

到这里,派活还都要你亲手发一句话。这一章把那句话也自动化:codex exec 让它在脚本里无人值守地跑一次,JSONL 事件流和 JSON Schema 约束的结构化输出让脚本能直接消费结果;SDK 把同一台引擎装进你的 TypeScript 或 Python 程序;openai/codex-action 让它长在 GitHub CI 里;定时任务让它按日程自己开工。无人时的规矩也在这一章:exec 默认只读、越界即停,hooks 在生命周期的固定时点执行你的脚本 —— 且每条 hook 都要你审过、按哈希信任过才许跑。


到这里,派活还都要你亲手发一句话 —— 打开一个面、说清一件活、看它跑。这一章把那句话也自动化:让 Codex 在脚本里无人值守地跑一次,长进你自己的程序,守在每个 PR 上,按日程半夜上班。这是「不守着做完」的极限形态:活不在你这台机器、不在你醒着的时候完成。也因此,这一章的另一半讲规矩 —— 它跑得越自动,边界越要在出发前写死。

I

codex exec:让那句话进脚本.

把交互会话变成一条 Unix 命令,靠的是 codex exec:跑完就退,进度走 stderr、最终消息走 stdout,天然能接进管道。1注 1OpenAI Codex 文档 · Non-interactive mode —— codex exec 从脚本里跑 Codex,不开交互界面;进度走 stderr,最终消息走 stdout,便于管道。默认只读沙箱,要改文件加 --sandbox workspace-write。--json 让 stdout 变 JSONL 事件流(thread.started / turn.completed / item.* 等);--output-schema schema.json 让最终响应符合 JSON Schema,-o 写最终消息到文件。可 codex exec resume --last 续跑。要求在 Git 仓库里跑(--skip-git-repo-check 可绕过);CODEX_API_KEY 仅 exec 支持。截至 2026-07-17。它把 Codex 从「一个你打开的应用」变成「一个脚本里的工序」:
# 把构建日志灌进去,要一句根因
cat build-error.txt | codex exec "一句话解释这次构建失败的根因"
 
# 结构化输出:按 schema 约束,写最终 JSON 到文件
codex exec "列出 src/api 里的全部路由" \
  --output-schema ./routes.schema.json \
  -o ./routes.json
 
# 要它改文件:默认只读,得显式放开
codex exec --sandbox workspace-write "修好失败的那条测试"

灌上下文、要结构化结果;默认只读,要改文件才放开

三个细节是无人化的关键。--json 让 stdout 变成 JSONL 事件流,脚本能逐条读它干了什么;--output-schema 更进一步,让最终响应符合你给的 JSON Schema,脚本直接消费结构化字段、不用解析散文。1注 1OpenAI Codex 文档 · Non-interactive mode —— codex exec 从脚本里跑 Codex,不开交互界面;进度走 stderr,最终消息走 stdout,便于管道。默认只读沙箱,要改文件加 --sandbox workspace-write。--json 让 stdout 变 JSONL 事件流(thread.started / turn.completed / item.* 等);--output-schema schema.json 让最终响应符合 JSON Schema,-o 写最终消息到文件。可 codex exec resume --last 续跑。要求在 Git 仓库里跑(--skip-git-repo-check 可绕过);CODEX_API_KEY 仅 exec 支持。截至 2026-07-17。还有一条安全默认:exec 默认是只读沙箱 —— 要它改文件,必须显式 --sandbox workspace-write1注 1OpenAI Codex 文档 · Non-interactive mode —— codex exec 从脚本里跑 Codex,不开交互界面;进度走 stderr,最终消息走 stdout,便于管道。默认只读沙箱,要改文件加 --sandbox workspace-write。--json 让 stdout 变 JSONL 事件流(thread.started / turn.completed / item.* 等);--output-schema schema.json 让最终响应符合 JSON Schema,-o 写最终消息到文件。可 codex exec resume --last 续跑。要求在 Git 仓库里跑(--skip-git-repo-check 可绕过);CODEX_API_KEY 仅 exec 支持。截至 2026-07-17。第 9 章说的「回归集用 codex exec 重跑、拿 JSON 对一对」,零件就是这几个 flag。它还要求在 Git 仓库里跑,防止无人时的破坏性改动无从回滚。1注 1OpenAI Codex 文档 · Non-interactive mode —— codex exec 从脚本里跑 Codex,不开交互界面;进度走 stderr,最终消息走 stdout,便于管道。默认只读沙箱,要改文件加 --sandbox workspace-write。--json 让 stdout 变 JSONL 事件流(thread.started / turn.completed / item.* 等);--output-schema schema.json 让最终响应符合 JSON Schema,-o 写最终消息到文件。可 codex exec resume --last 续跑。要求在 Git 仓库里跑(--skip-git-repo-check 可绕过);CODEX_API_KEY 仅 exec 支持。截至 2026-07-17。

II

SDK:同一台引擎,做成库.

脚本再长,也只是把命令串起来;要把 Codex 嵌进你自己的服务 —— 一个自动分诊 bug 的机器人、一个替客服读日志的后台 —— 用 Codex SDK 编程控制它。2注 2OpenAI Codex 文档 · Codex SDK —— 用 SDK 编程控制 Codex(嵌进 CI/CD、自建 agent、自家工具)。TypeScript:npm install @openai/codex-sdk,new Codex().startThread(),thread.run(prompt) 拿 result.finalResponse,resumeThread(id) 续跑。Python(beta):pip install openai-codex,Codex() / AsyncCodex() 经 app-server 控制,thread_start(model, sandbox) + run;Sandbox 预设 read_only / workspace_write / full_access 可按轮切。截至 2026-07-17。TypeScript 装 @openai/codex-sdk,一个 startThread() 就是一个带全套工具的对话,run(prompt) 拿结果、resumeThread(id) 续跑:
triage.ts
import { Codex } from "@openai/codex-sdk";
 
const codex = new Codex();
const thread = codex.startThread();
const result = await thread.run("诊断并修好 CI 里失败的用例,做一个计划");
console.log(result.finalResponse);

一个最小的 SDK 线程;Python 有对应的 openai-codex(beta)

Python(beta)装 openai-codex,Codex()AsyncCodex() 经 app-server 控制,还能按轮切 Sandbox 预设(read_only / workspace_write / full_access)—— 让「先改、再只读复审」这种两步走在代码里表达出来。2注 2OpenAI Codex 文档 · Codex SDK —— 用 SDK 编程控制 Codex(嵌进 CI/CD、自建 agent、自家工具)。TypeScript:npm install @openai/codex-sdk,new Codex().startThread(),thread.run(prompt) 拿 result.finalResponse,resumeThread(id) 续跑。Python(beta):pip install openai-codex,Codex() / AsyncCodex() 经 app-server 控制,thread_start(model, sandbox) + run;Sandbox 预设 read_only / workspace_write / full_access 可按轮切。截至 2026-07-17。CLI 和 SDK 怎么分工很清楚:交互开发、一次性活用 CLI;要嵌进 CI/CD、定制应用、生产自动化,用 SDK。这本书讲到这条线为止 —— 再往里,是《Agent 实战》整本书的地界。

III

长在 CI 和日程里.

第三种形态不属于任何一台机器。GitHub Action(openai/codex-action@v1)在 CI 里跑 Codex:它装好 CLI、为你的 OpenAI key 起一个 Responses API 代理、跑 codex exec;输入里有 prompt、model、sandbox、output-file,最终消息作输出给后续步骤。3注 3OpenAI Codex 文档 · Codex GitHub Action —— openai/codex-action@v1 在 GitHub Actions 里跑 Codex:安装 CLI、为 OpenAI key 起一个 Responses API 代理、跑 codex exec。输入含 prompt / prompt-file、codex-args、model / effort、sandbox、output-file,final-message 作输出。默认 safety-strategy: drop-sudo(跑前移除 sudo,保护内存里的 secrets);安全清单提醒:清洗来自 PR / commit / issue 的 prompt 输入以防注入。截至 2026-07-17。默认的 safety-strategy: drop-sudo 在跑前移除 sudo、保护内存里的 secrets,安全清单还专门提醒:来自 PR、commit、issue 的 prompt 输入要先清洗,防注入。3注 3OpenAI Codex 文档 · Codex GitHub Action —— openai/codex-action@v1 在 GitHub Actions 里跑 Codex:安装 CLI、为 OpenAI key 起一个 Responses API 代理、跑 codex exec。输入含 prompt / prompt-file、codex-args、model / effort、sandbox、output-file,final-message 作输出。默认 safety-strategy: drop-sudo(跑前移除 sudo,保护内存里的 secrets);安全清单提醒:清洗来自 PR / commit / issue 的 prompt 输入以防注入。截至 2026-07-17。 定时的活交给定时任务:在 ChatGPT 桌面应用或网页里建、在后台按日程跑(CLI / IDE 不提供管理界面,但能先把 prompt 试好)。4注 4OpenAI Codex 文档 · Scheduled tasks —— 在后台按日程跑任务;在 ChatGPT 桌面应用与网页的 Work / Codex 里创建管理(CLI / IDE 不提供管理界面,但能先准备测试 prompt)。standalone(每次新对话跑,支持 RRULE 自定义节奏)vs in-chat(回到同一对话、用它已有上下文,支持分钟级循环)。可跑在本地项目或 worktree。无人值守,用你的默认沙箱;组织策略允许时用 approval_policy = never。截至 2026-07-17。两种形态:standalone 每次开一个新对话、支持 RRULE 自定义节奏,适合独立的定期巡检;in-chat 回到同一对话、带着它已有的上下文,适合盯一件长活。可以跑在本地项目或 worktree,无人值守时用你的默认沙箱 —— 组织策略允许的话,用 approval_policy = never 全程不停下问。4注 4OpenAI Codex 文档 · Scheduled tasks —— 在后台按日程跑任务;在 ChatGPT 桌面应用与网页的 Work / Codex 里创建管理(CLI / IDE 不提供管理界面,但能先准备测试 prompt)。standalone(每次新对话跑,支持 RRULE 自定义节奏)vs in-chat(回到同一对话、用它已有上下文,支持分钟级循环)。可跑在本地项目或 worktree。无人值守,用你的默认沙箱;组织策略允许时用 approval_policy = never。截至 2026-07-17。夜间依赖巡检、晨会前的 PR 摘要,都是它的班次。

IV

无人时的规矩:hooks 与信任.

交互会话里,审批弹窗是最后的安全网;无人值守时没有这张网 —— 边界要前置。第 4 章那套沙箱、审批、规则照样在;这一章再加一层 hooks:把你的脚本注入 agentic 循环的固定时点(工具调用前后、会话结束、收工时),用来记录对话、拦下贴出的 API key、收工前跑一遍校验。5注 5OpenAI Codex 文档 · Hooks —— 把你的脚本注入 agentic 循环(记录对话、拦贴出的 API key、自动生成记忆、收工时跑校验)。配 hooks.json 或 config.toml 的 [hooks],位置 ~/.codex/ 与项目 .codex/(信任项目才加载)。事件含 PreToolUse、PermissionRequest、PostToolUse、UserPromptSubmit、Stop、SubagentStart / Stop、SessionStart。JSON 进 stdin;matcher 按工具名过滤(Bash、apply_patch / Edit|Write、mcp__*)。关键:非托管命令 hook 必须先经你审阅、按当前哈希信任过才许跑,改了就重新标记待审;/hooks 里审阅与信任。GA 于 2026-05,[features] hooks = true 默认。截至 2026-07-17。配在 hooks.jsonconfig.toml[hooks] 里,事件有 PreToolUse、PostToolUse、Stop、SessionStart 这些,matcher 按工具名筛。5注 5OpenAI Codex 文档 · Hooks —— 把你的脚本注入 agentic 循环(记录对话、拦贴出的 API key、自动生成记忆、收工时跑校验)。配 hooks.json 或 config.toml 的 [hooks],位置 ~/.codex/ 与项目 .codex/(信任项目才加载)。事件含 PreToolUse、PermissionRequest、PostToolUse、UserPromptSubmit、Stop、SubagentStart / Stop、SessionStart。JSON 进 stdin;matcher 按工具名过滤(Bash、apply_patch / Edit|Write、mcp__*)。关键:非托管命令 hook 必须先经你审阅、按当前哈希信任过才许跑,改了就重新标记待审;/hooks 里审阅与信任。GA 于 2026-05,[features] hooks = true 默认。截至 2026-07-17。 动手 · 把一件活送出你的视线:
01

把一个重复检查做成 codex exec 一行

挑你每周手动做的一个检查(错字、日志异常、路由清单),写成 codex exec,加 --output-schema 让结果能被脚本消费,挂进 package.json 或 Makefile。
02

给团队仓库装上 GitHub Action

配 openai/codex-action@v1 在 PR 上跑一次小活,把 API key 放进 secrets、safety-strategy 保持 drop-sudo,看它从触发到留言走完全程。
03

设一个夜班定时任务,先确认 hook 在跑

用定时任务给明早设一个巡检,出发前在 /hooks 里确认你的校验 hook 已被信任 —— 无人时,规矩必须先于活出发。

活可以不在你眼前跑, 规矩必须先于它出发.

The work can run out of sight; the rules must leave before it does.

Aklman Library

讨论

讨论.

评论区初始化中…