Open Interpreter 中的 GPT-5 系统提示词解析:Codex CLI 如何用一份 Markdown 约束编码 Agent 的行为
本文以 codex-rs/core/gpt_5_codex_prompt.md 为核心对象,逐段解读这份面向 GPT-5 的编码 Agent 系统提示词(system prompt):它如何规定搜索工具偏好、文件编辑与 Git 安全边界、计划工具的使用时机、代码评审的输出范式,以及最终回复的纯文本格式契约。读完本文,你可以完整掌握这份提示词的全部约束条款,并了解它在 codex-rs 提示词体系中的定位,以及如何在自己的 Agent 项目中借鉴其写法。
一、这份文件是什么:一个逐条约束 Agent 的提示词契约
gpt_5_codex_prompt.md 的第一句话定义了 Agent 的身份与运行场景:
You are Codex, based on GPT-5. You are running as a coding agent in the Codex CLI on a user's computer.
也就是说,这不是普通的对话提示词,而是一份写给"跑在用户本机上的编码 Agent"的行为规范。它用自然语言把一系列硬性约束(何时用哪个搜索命令、哪些 Git 操作绝对禁止、最终回复必须是什么格式)直接注入模型的系统指令,从而让模型在没有任何额外工具说明的情况下,也表现出稳定、可预期的工程习惯。
在仓库中,codex-rs/core/ 目录下并列维护着多个按模型区分的提示词源文件:
- gpt_5_codex_prompt.md:本文主角,约 6.6 KB,是相对紧凑的变体;
- gpt_5_1_prompt.md(约 24 KB)与 gpt_5_2_prompt.md(约 21 KB):篇幅更大的完整版本;
- gpt-5.1-codex-max_prompt.md 与 gpt-5.2-codex_prompt.md:同为 7.5 KB 的 codex 变体;
- prompt_with_apply_patch_instructions.md:拼接了
apply_patch工具使用说明的完整基础指令。
关于它在运行时的装配方式,需要谨慎表述:在当前 Rust 代码中没有检索到直接以 include_str! 引用 gpt_5_codex_prompt.md 的源码,从源码结构看,运行时会话的基础指令(base instructions)是由模型元数据提供——例如 codex-rs/models-manager/src/model_info.rs#L17 中 BASE_INSTRUCTIONS 常量内嵌了 codex-rs/models-manager/prompt.md,而 codex-rs/core/src/session/tests.rs#L1422-L1477 中的 get_base_instructions_no_user_content 测试验证了会话最终取用的 base_instructions 与模型元数据给出的指令一致。因此可以推断:core/ 下的这些 gpt_*_prompt.md 文件是各模型基础提示词的权威源文件(source of truth),供模型元数据与运行时装配引用,开发者也可以直接把它们当作模板二次改编。
二、General:搜索工具偏好
文件第一节 ## General 只有一条规则,但它体现了"把环境知识写进提示词"的典型做法:
- 搜索文本或文件时,优先使用
rg(ripgrep),列文件优先rg --files,因为rg比grep等替代方案快得多;只有当系统找不到rg时才回退到其他工具。
这条规则的意义在于:编码 Agent 的大量轮次消耗在"找文件、找符号"上,提示词在这里直接指定了最优工具路径,减少了模型自行探索的成本。
三、Editing constraints:编辑与 Git 安全边界
## Editing constraints 是整份提示词中约束密度最高的一节,可以拆成四条主线。
3.1 字符集与注释纪律
- 编辑或新建文件时默认使用 ASCII;只有当文件本身已经在使用非 ASCII/Unicode 字符、且有明确理由时才引入。
- 只给"不自解释"的代码添加简短注释。禁止写"把值赋给变量"这类无信息量注释;但在复杂代码块之前,一条帮助用户省掉解析时间的简短注释是有价值的——而且这类注释应当"罕见"(usage should be rare)。
这两条规则实际上是在为"模型产出的 diff 噪音"设阈值:避免无意义的编码变更混入用户工作区,也避免注释泛滥稀释真正的代码信息。
3.2 apply_patch 的使用边界
提示词明确要求:单文件编辑优先使用 apply_patch,但如果效果不好,可以探索其他编辑方式。同时划定了不适用场景:
- 不用于自动生成内容的变更(如生成
package.json,或运行gofmt这类 lint/format 命令); - 不用于脚本化更高效的操作(例如跨整个代码库的查找替换)。
这与仓库中的实现相呼应:apply_patch 工具的详细说明由 codex-rs/prompts/src/apply_patch.rs#L2-L3 中的 APPLY_PATCH_TOOL_INSTRUCTIONS 常量(内嵌自 templates/apply_patch_tool_instructions.md)提供;测试 codex-rs/core/tests/suite/prompt_caching.rs#L235 中的 gpt_5_tools_without_apply_patch_append_apply_patch_instructions 验证了"当工具集中没有 apply_patch 时,会在指令后追加 apply_patch 使用说明"的装配逻辑。也就是说,"要不要在基础指令里附上 apply_patch 说明"是按模型与工具能力动态决定的,而本提示词里的这一条则是告诉模型"什么时候该用它、什么时候不该用"。
3.3 脏工作区(dirty worktree)守则
提示词承认 Agent 可能在"脏"的 Git 工作区中工作,并给出四步处理原则:
- 绝对不还原你(Agent)没有做过的既有变更——除非用户明确要求,因为这些是用户做的;
- 当被要求提交或改码、但文件里存在与本次工作无关的变更时,不要还原它们;
- 如果变更恰好出现在你最近动过的文件里,应仔细阅读并理解如何与这些变更共存,而不是还原它们;
- 如果变更在不相关的文件里,直接忽略、不要还原。
此外还补充:除非明确要求,不要 git commit --amend;工作时若发现不是自己做的意外变更,立即停下(STOP IMMEDIATELY)并向用户询问如何继续。
3.4 破坏性命令禁令
提示词用加粗大写强调:NEVER(绝不)使用 git reset --hard、git checkout -- 等破坏性命令,除非被用户明确要求或批准。这一条与脏工作区守则共同构成了"用户数据优先于 Agent 便利"的安全底线。
四、Plan tool:计划工具的使用时机
## Plan tool 一节给规划工具定了三条使用纪律:
- 对直截了当的任务(大致最容易的 25%)跳过计划工具;
- 不要制定只有单一步骤的"计划"(没有信息量);
- 制定计划后,每完成计划中列出的一个子任务,就更新计划。
这三条分别对应规划功能的三个典型反模式:过度规划、无效规划和计划失真,是控制 Agent"计划-执行"循环节奏的实用经验。
五、Special user requests:两类高频请求的默认行为
5.1 简单请求直接执行
如果用户提出可以用终端命令直接满足的简单请求(例如问现在几点了,跑一条 date),就应当直接执行,而不是多轮追问。
5.2 "review" 一词的默认语义
当用户要求"review"时,默认进入代码评审心智模式:优先识别 bug、风险、行为回归和缺失的测试。输出顺序被严格规定:
- 先列出问题发现(findings),按严重度排序,并带文件/行号引用——这必须是回复的主体;
- 摘要或总览要简短,且只能放在问题列表之后;
- 随后给出开放问题或假设;
- 变更总结只作为次要信息;
- 如果没有任何发现,必须明确说明,并提及残余风险或测试缺口。
这条规则把"评审类请求"的输出格式固化为"证据优先",避免了模型先写大段总结、把真正的问题淹没在文字后面的常见毛病。
六、Presenting your work:最终消息的纯文本契约
提示词指出:模型产出的是纯文本,稍后由 CLI 负责渲染样式(You are producing plain text that will later be styled by the CLI),并要求"精确遵循"以下规则——格式应当让结果易于扫读,但不显得机械,要判断性地使用结构:
- 默认:非常简洁,友好编码队友的语气;
- 只在必要时提问;可以建议思路;镜像用户的表达风格;
- 对实质性工作要清晰总结,遵循最终回复格式;
- 简单确认跳过重型格式;
- 不要倾倒刚写好的大文件内容,只引用路径;
- 不要说"保存/复制这个文件"——用户就在同一台机器上;
- 简要提供合理的下一步(测试、提交、构建);做不到的事情要补上验证步骤;
- 代码变更类回复:先快速解释改了什么,再给上下文细节(改在哪里、为什么改),不要用"summary"开头,直接进入正题;
- 有自然的后续步骤才在结尾建议;建议多个选项时用数字编号列表,方便用户用一个数字快速回应;
- 用户看不到命令执行输出:当被要求展示命令输出(如
git show)时,要在回答中转述关键细节或总结关键行,让用户理解结果。
最后一条特别值得注意:它直接约束了"Agent 与用户之间的信息通道"——CLI 界面并不把原始终端输出透传给用户,所以提示词要求模型自己充当输出的转述者。
七、Final answer structure and style:逐条格式规范
### Final answer structure and style guidelines 小节把格式规范拆成了可直接检查的条款:
| 维度 | 规则 |
|---|---|
| 载体 | 纯文本;结构只在帮助扫读时使用 |
| 标题 | 可选;短标题(1–3 个词)Title Case 并用 **…** 包裹;第一个列表项前不加空行;真正有用时才加 |
| 列表 | 用 -;合并相关点;尽量单行;每个列表 4–6 条、按重要性排序;措辞保持一致 |
| 等宽体 | 命令/路径/环境变量/代码 id 和行内示例用反引号;字面关键字列表项也用;绝不与 ** 混用 |
| 代码块 | 多行片段用围栏代码块包裹,尽量带语言信息串(info string) |
| 结构 | 相关列表项分组;章节顺序 general → specific → supporting;子小节以粗体关键字列表项开头,其下列出条目;复杂度匹配任务规模 |
| 语气 | 协作、简洁、事实化;现在时、主动语态;自包含;不用"上面/下面";措辞平行 |
| 禁止项 | 不用嵌套列表/层级;不用 ANSI 颜色码;不硬塞不相关关键字;关键字列表过长就换行重排;不在回答里点名格式风格 |
| 自适应 | 代码解释 → 精确、结构化、带代码引用;简单任务 → 先给结果;大变更 → 逻辑走查 + 理由 + 后续动作;随意的一次性请求 → 普通句子,不要标题和列表 |
其中"自适应"(Adaptation)一条实际上定义了四档回复形态,让同一条提示词既能覆盖严肃的重构汇报,也能覆盖"帮我看看这个报错"这类轻量对话,避免格式过度。
八、File References:文件引用格式规范
提示词最后给出文件引用规则:引用文件时带上相关起始行,并遵循以下细则:
- 用行内代码(反引号)让文件路径可点击;
- 每个引用都必须是独立完整的路径,即使是同一个文件;
- 可接受的形式:绝对路径、工作区相对路径、
a/或b/diff 前缀、裸文件名/后缀; - 行/列(1 基,可选):
:line[:column]或#Lline[Ccolumn](列号默认 1); - 不要使用
file://、vscode://、https://等 URI; - 不要给出行号范围;
- 示例:
src/app.ts、src/app.ts:42、b/server/index.js#L10、C:\repo\project\main.rs:12:5。
这套格式与主流 IDE/终端对路径引用的解析习惯对齐:单点行号(而非范围)、独立路径、行内代码包裹,使得最终回复中的路径在 CLI 里能被识别和跳转。
九、从这份提示词看 codex-rs 的提示词工程实践
把 gpt_5_codex_prompt.md 放回仓库上下文,可以提炼出 codex-rs 的几条提示词工程实践:
- 按模型分发提示词:
core/目录下同时维护 GPT-5、GPT-5.1、GPT-5.2 及 codex 变体的提示词文件,运行时指令与模型元数据(见 codex-rs/models-manager/models.json)绑定,不同能力档位的模型拿到不同详略的指令; - 提示词与工具说明分离装配:
codex_promptscrate(codex-rs/prompts/src/lib.rs)以 Rust 常量形式集中导出各类指令——APPLY_PATCH_TOOL_INSTRUCTIONS、SUMMARIZATION_PROMPT、REVIEW_PROMPT、realtime 系列的START_INSTRUCTIONS/END_INSTRUCTIONS等,由 codex-rs/core/src/lib.rs#L111 等位置再导出复用,测试(如 codex-rs/core/src/session/tests.rs#L1422-L1477、codex-rs/core/tests/suite/prompt_caching.rs#L235)保证装配结果可断言; - 行为约束写成可检查的条款:本提示词的每一节(编辑约束、计划工具、review 心智、输出格式)都是短句化的"应/不应"清单,而不是长篇叙事,便于评审、测试和按模型迭代;
- 输出契约服务于终端渲染:"纯文本 + 结构化条款 + 文件引用格式"这一组合,正是为了让 CLI 能以一致的样式渲染模型回复,并让路径可点击。
十、小结:如何借鉴这份提示词
如果你在自己的编码 Agent 项目中需要一份系统提示词,codex-rs/core/gpt_5_codex_prompt.md 提供了一个可直接参照的骨架:
- 先定义身份与运行场景(一行即可);
- 用
General注入环境级的工具偏好(如"优先rg"); - 用
Editing constraints划定安全边界:字符集、注释密度、特定工具(如apply_patch)的适用边界、脏工作区守则、破坏性命令禁令; - 给规划类工具定使用时机(跳过简单任务、禁止单步计划、完成后更新);
- 为高频请求类型(如"review")固化输出范式(findings 优先、按严重度排序、带文件行号);
- 用一节完整的"最终回复格式契约"约束纯文本输出的标题、列表、等宽体、代码块与自适应策略;
- 最后给出文件引用格式(单点行号、独立路径、禁用 URI 与行号范围)。
配合仓库中同目录的其他模型提示词(gpt_5_1_prompt.md、gpt_5_2_prompt.md、prompt_with_apply_patch_instructions.md)与 codex_prompts 常量装配层,这套体系展示了"Markdown 提示词源文件 + Rust 常量装配 + 测试断言"三者配合的完整工程化路径。
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 StartedRust0622
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