紹介: Ralph
PRDの全項目が完了するまで動き続ける自律エージェントループです。Bashスクリプトは不要で、すべてADK-Rust内で実行されます。

ライブ ADK-Ralph v2 デモ
Ralphに小さな製品を1つ作らせる。
これは実際のRustバイナリを実行します。PRDエージェントは1つのユーザーストーリーを定義し、アーキテクトエージェントは設計とタスク計画を作成し、Ralphループエージェントは隔離されたワークスペースでプロジェクトを書き検証します。
01 · PRD Agent
製品を定義
02 · Architect Agent
システムを設計
03 · Ralph Loop Agent
構築と検証
1 つのプロジェクト · 3 回の実装反復 · 8 分制限 · 納品後に一時ファイルを削除
実際の実行はここに表示されます。
エージェントのフェーズ、ツールの動作、品質チェック、Ralphが返すファイルが表示されます。
アーキテクチャ 概要
ADK-Rustのネイティブループ機能を使い、すべてRustで構築
ループエージェント
中心となるオーケストレーターがタスクを巡回し、作業を委任して全体の進捗を追跡します。
ワーカーエージェント
絞り込んだコンテキストで個々のタスクを実行し、実装、テスト、コミットまで行います。
カスタムツール
Git、ファイル操作、品質チェック、PRD管理のためのネイティブADK-Rustツールです。
主な 機能
Ralphは、自律エージェント開発におけるADK-Rustの主要機能を示します
自律ループ
PRDの全項目が完了するまで継続実行します。Bashスクリプトを使わず、ループツールをネイティブ統合します。
マルチエージェント連携
ループエージェントがワーカーエージェントを統括します。各エージェントは役割に特化して効率よく作業します。
カスタムツール
Git、ファイル操作、品質チェック、PRD管理をすべてネイティブADK-Rustツールとして実装しています。
PRD駆動
ユーザーストーリー、受け入れ基準、合否追跡を含むJSONベースのタスク管理です。
品質ゲート
各コミット前にcargo check、test、clippy、fmtを自動実行します。
状態の永続化
Gitコミット、進捗ログ、AGENTS.mdの更新によって、完全なコンテキストと監査性を確保します。
実装 詳細
ADK-Rustの機能を活用した、明快で慣用的な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で自律エージェントをネイティブに構築するのでしょうか?
| 比較項目 | Bash | ネイティブ |
|---|---|---|
| 実装 | シェルスクリプト + ADK-Rust | 純粋なRust |
| 型安全性 | 実行時 | コンパイル時 |
| エラー処理 | 終了コード | Result<T, E> |
| 並行処理 | 逐次処理 | Async/await |
| ツール統合 | シェルコマンド | ネイティブADK-Rustツール |
| デバッグ | ログファイル | トレーシング + 構造化ログ |
| パフォーマンス | プロセス生成の負荷 | ゼロコスト抽象化 |
| メモリ安全性 | 手動管理 | コンパイラーが保証 |
| テスト | 統合テストのみ | 単体テスト + 統合テスト |
自分だけの Ralph を構築してみませんか?
完全なソースコードを確認し、ユースケースに合わせて変更するか、独自の自律エージェントシステムの参考にしてください。