数据截至 (上游 commit e71bb83dcfdf)
三阶段主线与 CLI 编排
30 秒导读: RA.Aid 把"让 AI 改一个大项目"拆成研究 → 规划 → 实现三个阶段。 但关键洞察是:这三个阶段不是主函数里一个
if a then b then c的线性流水线——main()只启动了研究阶段,后面两个阶 段是研究 agent 自己调用一个工具把规划 agent"喊"出来、 规划 agent 又调用工具把实现 agent 喊出来。阶段之间不直接传参,而是各自把产物写进 SQLite, 下一个 agent 再从库里读。本章带你画出这张完整的阶段流转图。
本章只讲骨架与编排。create_agent 内部怎么选 ReAct / CIAYN 后端 → 见 02;
SQLite 记忆的 schema 与 formatter → 见 03;单个工具的实现 → 见 04;
重试、模型回退、Token 裁剪 → 见 05。
1. 这是什么(零基础也能懂)
一句话定义: RA.Aid 是一个跑在终端里的自主编码 agent——你给它一句任务(比如"给这个项目加上 JWT 登录"),它会先摸清代码库、再列实现计划、再动手改文件,像一个会自己分步骤干活的实习工程师。
为什么要分三个阶段? 直接让一个模型"边看代码边改"很容易失控:它还没搞清项目结构就动手,改错 一堆文件。RA.Aid 的设计哲学是先想清楚再动手,于是把工作切成三段,每一段用不同的工具集约束 模型的能力边界:
| 阶段 | 白话职责 | 这一阶段模型只被允许做什么 |
|---|---|---|
| 研究(Research) | 摸清项目:读文件、跑只读命令、记笔记 | 读、搜、记笔记——默认不能改文件 |
| 规划(Planning) | 把大任务拆成一条条可执行的子任务 | 继续读,外加"把某个子任务派出去实现" |
| 实现(Implementation) | 真正动手改代码、跑命令 | 读 + 改文件 + 跑命令 + 标记完成 |
用起来什么样: 一条命令就跑完整个三阶段:
# 默认模式:研究 → 规划 → 实现,一路跑到底
ra-aid -m "给用户模块加上邮箱验证"
# 只研究,不改任何东西(适合"帮我看看这个 bug 出在哪")
ra-aid -m "为什么登录接口偶尔 500?" --research-only
# 研究 + 出计划就停,不实现(把计划留给人 review)
ra-aid -m "重构支付模块" --research-and-plan-only
一句话直觉: 把它想成一家小作坊的三个工位——调研员先把料摸清写成报告,工头照报告排出 工单,工人照工单一件件干。三个工位之间不当面交接,而是把报告和工单都贴在同一块公告板上 (那块公告板就是 SQLite 数据库),下一个工位上工时自己去公告板上看。
2. 顶层全景(它大概怎么转)
2.1 先看一次默认任务的完整流转
怎么读这张图: 从上到下是时间顺序;main() 只负责到"启动研究阶段"为止,再往下的两次阶段
转移(虚线箭头)是 agent 在运行中主动调用工具触发的,不是主函数写死的。
$ ra-aid -m "任务"
│
▼
┌─────────────────────────────────────────────┐
│ main() __main__.py:1106 │
│ ① parse_arguments 解析参数 │
│ ② DatabaseManager + 各 Repository 初始化 │
│ ③ config_repository 写入所有开关/模型配置 │
│ ④ build_status 打印状态面板 │
│ ⑤ 按模式分发 ↓ │
└─────────────────────────────────────────────┘
│
│ (默认模式)
▼
┌─────────────────────────────────┐
│ 研究阶段 run_research_agent │ 产物写入 SQLite:
│ 装配研究工具集 → create_agent │ ├─ emit_research_notes(研究笔记)
│ → run_agent_with_retry │ └─ emit_key_facts / snippets(关键事实/片段)
└─────────────────────────────────┘
┆ 模型调用 request_implementation 工具(默认模式才有这把工具)
┆ tools/agent.py:561
▼
┌──────────── ─────────────────────┐
│ 规划阶段 run_planning_agent │ 从 SQLite 读回研究笔记/事实,
│ 装配规划工具集 → create_agent │ 拼进 planning 提示词
└─────────────────────────────────┘
┆ 模型对**每个子任务**调用 request_task_implementation 工具
┆ tools/agent.py:390
▼
┌─────────────────────────────────┐ ← 一个子任务一个实现 agent,
│ 实现阶段 run_task_implementation │ 可被调用多次
│ 装配实现工具集(含改文件工具) │ 产物:直接改文件 + task_completed
└─────────────────────────────────┘