Codex Field GuideSOURCE EDITION · 2026.07源码 ↗
02 · GUIDED TRACE

从 Prompt 到 Patch

用一个小型 bug 修复贯穿任务理解、仓库探索、上下文构建、工具调用、补丁应用与验证。

一条看似简单的请求

假设用户说:

修复下载命令在服务器返回 429 时立即失败的问题,遵循仓库现有重试模式,并补测试。

这句话没有给出文件路径、框架或测试命令。可信的 Agent 不应直接猜代码,而要逐步降低不确定性。

DIAGRAMPrompt-to-Patch 决策漏斗
flowchart TD
P["自然语言目标"] --> I["加载指令<br/>AGENTS.md / config"]
I --> X["探索仓库<br/>rg / read / git"]
X --> H["形成局部假设<br/>重试入口 + 现有模式"]
H --> C["读取最小必要上下文"]
C --> D{"证据足够?"}
D -- 否 --> X
D -- 是 --> A["生成结构化 Patch"]
A --> T["运行目标测试"]
T --> R{"通过?"}
R -- 否 --> X
R -- 是 --> V["检查 diff 与更宽验证"]
V --> F["报告结果与边界"]
每个动作都应该减少一个关键不确定性,直到修改范围和验证方法足够清楚。

阶段一:把“目标”变成约束

Agent 首先应抽取:

  • 行为:429 不应立即失败;
  • 一致性:复用仓库已有重试模式;
  • 修改边界:下载命令及其测试;
  • 完成标准:新增回归测试,并通过相关检查;
  • 未知项:代码位置、重试策略、测试框架。

这不是隐藏的“神奇规划器”必然生成的一张完整计划。公开源码能确认的是:用户输入、项目指令、工具定义和历史会进入模型请求;模型随后逐步决定行动。

阶段二:先找地图,再读细节

典型探索会从低成本查询开始:

rg -n "429|retry|backoff" src tests
rg -n "download" src

模型可能先找到一个通用 retryWithBackoff,再定位下载路径的错误处理。此时它应该读取相邻实现、调用者和测试,而不是把整个仓库塞进 Context。

公开证据上的分析 这是基于 Codex 工具循环的教学示例,不是官方仓库中固定的搜索策略。模型会随任务、配置和仓库内容改变具体命令。

阶段三:请求如何被组装

在正式采样前,build_prompt 把以下要素组合起来:

  • 当前 Context 中的输入项;
  • 模型可见的工具定义;
  • 基础指令;
  • 是否支持并行工具;
  • 可选输出 schema。
01解决什么

模型需要足够信息做下一步,但无限加载仓库既昂贵又会稀释重点。

02如何工作

先用搜索定位,再读取相关片段;每次工具结果进入历史,动态补足证据。

03为何这样设计

按需检索比一次性注入更适合不断变化的本地仓库。

04源码落点

ContextManager 维护历史;build_prompt 取面向模型的历史和工具规格。

05取舍与失败

搜索词错误会遗漏关键代码;上下文压缩也可能损失细节,需要重新读取。

阶段四:从工具调用到真实补丁

模型不会直接写磁盘。它输出一个符合工具 schema 的调用,Runtime 经过 router 和 registry 选择 apply_patch handler。Handler 解析 patch、校验路径与上下文,再执行文件修改。

DIAGRAM从模型输出到磁盘修改
sequenceDiagram
participant M as Model
participant S as Stream handler
participant R as Tool router
participant O as Orchestrator
participant P as apply_patch
participant F as Filesystem
M->>S: function_call(apply_patch, patch)
S->>R: ToolCall
R->>O: ToolInvocation
O->>O: approval + sandbox decision
O->>P: execute
P->>P: parse + verify
P->>F: write selected files
F-->>P: result
P-->>M: structured tool output
Patch 是数据,Runtime 才是执行者。审批与沙箱位于模型和操作系统之间。

一个教学示意 patch 可能是:

*** Update File: src/download.ts
@@
-  if (!response.ok) throw new DownloadError(response.status);
+  if (response.status === 429) return retryWithBackoff(request, response);
+  if (!response.ok) throw new DownloadError(response.status);

阶段五:验证不是最后补一句

合理的验证顺序由窄到宽:

  1. 运行新增或最相关测试;
  2. 失败则读取完整错误并修正;
  3. 运行所属模块测试;
  4. 视风险运行 lint、类型检查或完整构建;
  5. 检查 git diff,确认没有意外改动。

每一步仍是 Agent Loop,而不是独立的“测试阶段”。测试失败会作为新的观察送回模型。

阶段六:报告已证实与未证实

最终消息至少回答:

  • 改了哪些文件和行为;
  • 运行了哪些验证,结果如何;
  • 哪些环境没有运行;
  • 是否存在待用户决定的取舍。

接下来深入这条链里最容易被低估的部分:Context 引擎

ESC
没有匹配章节。试试 “Context” 或 “Approval”。