完全基于 ADK-Rust 的原生实现

认识 Ralph

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

ADK-Ralph v2 现场演示

给 Ralph 一个小型产品去构建。

这运行真实的 Rust 二进制文件。PRD 代理定义一个用户故事,架构师代理创建设计和任务计划,Ralph Loop 代理在隔离工作区编写并验证项目。

01 · PRD Agent

定义产品

1

02 · Architect Agent

设计系统

2

03 · Ralph Loop Agent

构建并验证

3

一个项目 · 三次实施迭代 · 八分钟限制 · 交付后删除临时文件

Ralph 执行
真实流程 · 流式传输

真实运行将在此显示。

您将看到代理阶段、工具活动、质量检查以及 Ralph 返回的文件。

架构 概览

完全使用 Rust 构建,并采用 ADK-Rust 的原生循环能力

循环智能体
协调器
工作智能体
任务执行器
PRD 工具
任务管理器
Git 工具
版本控制
测试工具
质量检查
1

循环智能体

主协调器循环处理任务、分派工作并跟踪整体进度。

2

工作智能体

在聚焦的上下文中执行单项任务,并完成实现、测试和提交。

3

自定义工具

用于 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 工具
调试日志文件追踪 + 结构化日志
性能创建进程的开销零成本抽象
内存安全手动管理由编译器保证
测试仅集成测试单元测试 + 集成测试

准备构建你自己的 Ralph 吗?

浏览完整源代码,根据你的用例进行调整,或将其作为构建自主智能体系统的参考。