首页
/ Open Interpreter 的 /init 命令解析:一条提示词如何自动生成 AGENTS.md 项目指南

Open Interpreter 的 /init 命令解析:一条提示词如何自动生成 AGENTS.md 项目指南

2026-09-06 16:54:34作者:卓艾滢Kingsley

本文解析 Open Interpreter(codex-rs 代码库)TUI 中 /init 斜杠命令的内置提示词模板 prompt_for_init_command.md:它的完整内容、逐条要求,以及该提示词如何被 include_str! 编译进二进制、经 slash_dispatch.rs 提交给模型、最终生成一份可被自动加载的 AGENTS.md。读完你能掌握:如何在终端里一键生成项目贡献指南,提示词模板的每条约束如何映射到生成行为,以及生成的 AGENTS.md 会被 core 层怎样发现、拼接和截断。

/init:一条命令生成 AGENTS.md

在 Open Interpreter 的 TUI 交互会话中,输入 /init 即可让模型检查当前仓库结构并起草一份名为 AGENTS.md 的贡献者指南(contributor guide)。该命令在命令弹窗中的描述是“create an AGENTS.md file with instructions for Open Interpreter”,见 slash_command.rs 中按产品名(Codex / Open Interpreter)动态切换的 description()

命令枚举 SlashCommand::Init 定义于 slash_command.rs,它有两个值得注意的行为属性:

  • 不支持内联参数supports_inline_args()slash_command.rs)中没有 Init,即 /init 只能裸写,不能写 /init <额外要求>
  • 任务进行中不可用available_during_task()SlashCommand::Init 返回 falseslash_command.rs),若 Agent 正在跑任务,dispatch 层会直接提示 '/init' is disabled while a task is in progress.,见 slash_dispatch.rsslash_command_blocked_by_active_task 与拦截分支。

提示词模板全文与逐条要求

/init 的全部“智能”都来自一个纯文本模板文件 prompt_for_init_command.md。它并不包含任何仓库特有信息,而是一份通用的、面向任意仓库的元提示词(meta-prompt),核心内容如下:

总目标:生成一个名为 AGENTS.md 的文件,作为该仓库的贡献者指南。写入前必须先检查当前工作目录是否已存在 AGENTS.md,若存在则不得覆盖或修改。目标是产出标题清晰、描述具体、可执行(actionable)的文档,并按需增删小节:与本仓库相关的章节要加,不适用的要删。

文档硬性要求(Document Requirements)

要求 说明
标题 文档标题固定为 “Repository Guidelines”
结构 使用 Markdown 标题(#、## 等)组织
篇幅 保持简洁,200–400 词为最优
语气 简短、直接、专业、教学式,且必须针对本仓库
示例 在有帮助处给出示例(命令、目录路径、命名模式)

推荐章节(Recommended Sections),模板给出了五个默认小节并允许自由扩展:

  1. Project Structure & Module Organization — 描述项目结构,包括源码、测试、资源文件各自放在哪里;
  2. Build, Test, and Development Commands — 列出构建、测试、本地运行的关键命令(如 npm testmake build),并逐一简述命令作用;
  3. Coding Style & Naming Conventions — 缩进规则、语言风格偏好、命名模式,以及项目使用的格式化/静态检查工具;
  4. Testing Guidelines — 测试框架、覆盖率要求、测试命名规范与运行方式;
  5. Commit & Pull Request Guidelines — 从 Git 历史中归纳的提交信息约定,以及 PR 要求(描述、关联 issue、截图等)。

模板最后还留了一个可选扩展位:如相关,可追加 “Security & Configuration Tips”、“Architecture Overview” 或 “Agent-Specific Instructions” 等章节。

这份模板的设计意图很明确:约束输出结构(固定章节骨架 + 标题)而放开输出内容(一切以仓库实际情况为准),并用“200–400 词”“不得覆盖已有文件”两条护栏防止模型生成臃肿文档或破坏用户已有配置。

源码级调用链:从 include_str! 到提交消息

模板文件以编译期字符串的方式嵌入了 TUI 二进制。在 slash_dispatch.rs 中:

SlashCommand::Init => {
    const INIT_PROMPT: &str = include_str!("../../prompt_for_init_command.md");
    self.submit_user_message(INIT_PROMPT.to_string().into());
}

调用链可以概括为四步:

  1. 用户在 composer 输入 /init 并回车,ChatComposer 将其解析为 InputResult::Command(SlashCommand::Init)
  2. ChatWidget::dispatch_commandslash_dispatch.rs)先做三道准入检查:side conversation 是否允许、review 模式下是否允许、任务是否进行中(/init 在此被拦截);
  3. 命中 SlashCommand::Init 分支后,include_str! 宏在编译期prompt_for_init_command.md 的全文读成 &'static str 常量(注意宏内相对路径 ../../ 是相对 slash_dispatch.rs 源文件位置,运行时不涉及文件 I/O);
  4. submit_user_message 把这段提示词当作一条普通用户消息投递给会话,于是模型在后续 turn 中按提示词要求检查仓库(读目录、看构建脚本、浏览 Git 历史)并写出 AGENTS.md

也就是说,/init 没有特殊的工具调用或后端接口,它本质是把一段精心编写的系统级提示词伪装成用户输入——这也解释了为什么模板里要用第二人称祈使句(“Generate a file named AGENTS.md...”):这段文字是写给模型看的指令,而不是展示给用户的界面文案。

外层封装 handle_slash_command_dispatchslash_dispatch.rs)还会在 dispatch 之后记录本地历史条目,使 /init 可以被方向键回查,行为与普通提交一致。

生成的 AGENTS.md 会被怎样加载

/init 的价值不止于生成一份文档,而在于这份文档之后会被 core 层每个会话自动加载为模型可见的项目指令。加载逻辑集中在 agents_md.rs,关键机制如下:

发现顺序:先通过 project_root_markers(默认标记为 .git)从当前工作目录向上查找项目根,然后收集**从项目根向下到当前工作目录(含两端)**路径上的每一个 AGENTS.md,按“根 → cwd”的顺序拼接,且不会越过项目根向上继续查找(见 agents_md.rs 的模块文档注释)。多环境(multi-environment)场景下,拼接文本会为每个环境单独标注 for \<environment_id>` with root ([agents_md.rs](https://gitcode.com/GitHub_Trending/op/openinterpreter/blob/8e5d19bfcd705c3786c5641971dce5c2dc1aa64d/codex-rs/core/src/agents_md.rs?utm_source=gitcode_repo_files#L343-L386) 的 environment_labeled_text`)。

优先级与回退文件名:每个目录上依次尝试的候选文件名由 candidate_filenames 决定(agents_md.rs)——AGENTS.override.md 优先于 AGENTS.md,之后再是 project_doc_fallback_filenames 配置中列出的其他文件名。文档 docs/agents_md.md 还给出了全局层面的作用域表:全局指令位于 ~/.openinterpreter/AGENTS.md,可用 ~/.openinterpreter/AGENTS.override.md 做临时覆盖(删除即恢复)。

字节预算与截断:所有项目指令合计受 project_doc_max_bytes 限制,默认值为 32 KiB,定义于 config_toml.rsDEFAULT_PROJECT_DOC_MAX_BYTES,并经 config/mod.rs 落到运行时配置。read_agents_md 按“根 → cwd”顺序消耗预算,超出的文件会被 truncate 截断并打一条 project doc exceeds remaining budget; truncating 的 warning(agents_md.rs);project_doc_max_bytes = 0 时直接跳过加载。截断测试见 agents_md_tests.rs

把这两段拼起来看:/init 提示词要求 “200–400 词” 并非随手写的数字——一份 400 词左右的英文 Markdown 约 2.5 KiB,远低于 32 KiB 预算,因此按模板生成的 AGENTS.md 几乎不可能触发截断,这正是提示词约束与底层加载机制相互咬合的体现。

本仓库就有一份现成产物

本仓库根目录的 AGENTS.md 就是这类“仓库指南”文档的实例:它按章节列出了 codex-rs 工作区的构建/测试入口(Bazel 与 Cargo 双轨)、目录职责等约定,供 Agent 在此仓库工作时自动读取。配合 docs/agents_md.md 中的官方示例(Commands / Conventions / Cautions 三段式结构),可以看到实际落地的 AGENTS.md/init 模板推荐的五个章节高度同构——命令、风格、测试、注意事项各占一栏,篇幅短而具体。

文档 docs/agents_md.md 给出的使用建议与模板要求互为印证:“Good AGENTS.md files are short, specific, and durable. Put temporary task details in the prompt, not in project instructions.” 即:把稳定规则沉淀进文件,把一次性任务细节留在对话里。

实践要点与适用边界

  • 何时使用:新仓库、缺乏书面贡献指南的团队仓库,或者你希望把常用命令/目录约定固化、避免每次在 prompt 里重复时。在 TUI 中直接输入 /init,等模型完成后人工审校生成的 AGENTS.md,删掉不适用的章节、修正错误命令,再把它提交进版本库。
  • 不会覆盖:模板第一条即要求检查已存在的 AGENTS.md 并跳过,因此对已有指南的仓库重复执行 /init 是安全的(前提是模型遵循了指令)。
  • 时机限制:Agent 正在执行任务期间 /init 会被禁用,需等当前 turn 结束;它也不接受内联参数,需要额外要求时应等模型生成后再手动编辑文件。
  • 内容边界/init 只生成当前工作目录视角的指南;若仓库是 monorepo,core 层会沿“项目根 → cwd”加载多层 AGENTS.md,因此更精细的做法是在子目录追加更局部的 AGENTS.md,利用“越靠近 cwd 越优先/越相关”的拼接顺序细化局部约定。
  • 版本前提:以上行为以当前仓库的 TUI 实现为准——include_str! 内嵌意味着提示词修改后需重新编译 TUI 才会生效,它不受任何运行时配置文件影响。
登录后查看全文
热门项目推荐
相关项目推荐