认识 Ralph
一个持续运行的自主智能体循环,直到完成 PRD 中的所有事项。无需 Bash 脚本,一切都在 ADK-Rust 内运行。

ADK-Ralph v2 现场演示
给 Ralph 一个小型产品去构建。
这运行真实的 Rust 二进制文件。PRD 代理定义一个用户故事,架构师代理创建设计和任务计划,Ralph Loop 代理在隔离工作区编写并验证项目。
01 · PRD Agent
定义产品
02 · Architect Agent
设计系统
03 · Ralph Loop Agent
构建并验证
一个项目 · 三次实施迭代 · 八分钟限制 · 交付后删除临时文件
真实运行将在此显示。
您将看到代理阶段、工具活动、质量检查以及 Ralph 返回的文件。
架构 概览
完全使用 Rust 构建,并采用 ADK-Rust 的原生循环能力
循环智能体
主协调器循环处理任务、分派工作并跟踪整体进度。
工作智能体
在聚焦的上下文中执行单项任务,并完成实现、测试和提交。
自定义工具
用于 Git、文件操作、质量检查和 PRD 管理的原生 ADK-Rust 工具。
核心 能力
Ralph 展示了 ADK-Rust 开发自主智能体的主要能力
自主循环
持续执行,直到所有 PRD 事项完成。原生集成循环工具,无需 Bash 脚本。
多智能体协作
循环智能体协调多个工作智能体。每个智能体专注于自己的角色,从而提高效率。
自定义工具
Git、文件操作、质量检查和 PRD 管理全部作为原生 ADK-Rust 工具实现。
由 PRD 驱动
基于 JSON 的任务管理,包含用户故事、验收标准和通过/失败跟踪。
质量门禁
每次提交前自动运行 cargo check、test、clippy 和 fmt 验证。
状态持久化
Git 提交、进度日志和 AGENTS.md 更新提供完整的上下文与可审计性。
实现 细节
简洁、地道的 Rust 代码,充分利用 ADK-Rust 的各项能力
use serde::{Deserialize, Serialize};
use std::fs;
use anyhow::Result;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Prd {
pub project: String,
pub branch_name: String,
pub description: String,
pub user_stories: Vec<UserStory>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UserStory {
pub id: String,
pub title: String,
pub description: String,
pub acceptance_criteria: Vec<String>,
pub priority: u32,
pub passes: bool,
#[serde(default)]
pub notes: String,
}
impl Prd {
pub fn load(path: &str) -> Result<Self> {
let content = fs::read_to_string(path)?;
let prd: Prd = serde_json::from_str(&content)?;
Ok(prd)
}
pub fn save(&self, path: &str) -> Result<()> {
let content = serde_json::to_string_pretty(self)?;
fs::write(path, content)?;
Ok(())
}
pub fn get_next_task(&self) -> Option<&UserStory> {
self.user_stories
.iter()
.filter(|story| !story.passes)
.min_by_key(|story| story.priority)
}
pub fn mark_complete(&mut self, task_id: &str) -> Result<()> {
if let Some(story) = self.user_stories
.iter_mut()
.find(|s| s.id == task_id)
{
story.passes = true;
}
Ok(())
}
pub fn is_complete(&self) -> bool {
self.user_stories.iter().all(|story| story.passes)
}
pub fn stats(&self) -> (usize, usize) {
let complete = self.user_stories
.iter()
.filter(|s| s.passes)
.count();
let total = self.user_stories.len();
(complete, total)
}
}项目 结构
清晰的模块化结构将智能体、工具和模型分开,便于维护和扩展。
ralph/ ├── Cargo.toml # Ralph agent config ├── src/ │ ├── main.rs # Entry point │ ├── agents/ │ │ ├── mod.rs │ │ ├── loop_agent.rs # Main orchestrator │ │ └── worker_agent.rs # Task executor │ ├── tools/ │ │ ├── mod.rs │ │ ├── git_tool.rs # Git operations │ │ ├── file_tool.rs # File manipulation │ │ ├── test_tool.rs # Quality checks │ │ └── prd_tool.rs # PRD management │ └── models/ │ ├── prd.rs # PRD data structures │ └── config.rs # Configuration ├── prd.json # Task list └── progress.txt # Learnings log
原生实现与 Bash
为什么要直接使用 Rust 构建自主智能体,而不是通过 shell 脚本进行协调?
| 对比项 | Bash | 原生 |
|---|---|---|
| 实现 | Shell 脚本 + ADK-Rust | 纯 Rust |
| 类型安全 | 运行时 | 编译时 |
| 错误处理 | 退出码 | Result<T, E> |
| 并发 | 顺序执行 | Async/await |
| 工具集成 | Shell 命令 | 原生 ADK-Rust 工具 |
| 调试 | 日志文件 | 追踪 + 结构化日志 |
| 性能 | 创建进程的开销 | 零成本抽象 |
| 内存安全 | 手动管理 | 由编译器保证 |
| 测试 | 仅集成测试 | 单元测试 + 集成测试 |