ADK-Rustによる完全なネイティブ実装

紹介: Ralph

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

ライブ ADK-Ralph v2 デモ

Ralphに小さな製品を1つ作らせる。

これは実際のRustバイナリを実行します。PRDエージェントは1つのユーザーストーリーを定義し、アーキテクトエージェントは設計とタスク計画を作成し、Ralphループエージェントは隔離されたワークスペースでプロジェクトを書き検証します。

01 · PRD Agent

製品を定義

1

02 · Architect Agent

システムを設計

2

03 · Ralph Loop Agent

構築と検証

3

1 つのプロジェクト · 3 回の実装反復 · 8 分制限 · 納品後に一時ファイルを削除

Ralph実行
リアルプロセス · ストリーミング

実際の実行はここに表示されます。

エージェントのフェーズ、ツールの動作、品質チェック、Ralphが返すファイルが表示されます。

アーキテクチャ 概要

ADK-Rustのネイティブループ機能を使い、すべて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の更新によって、完全なコンテキストと監査性を確保します。

実装 詳細

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 を構築してみませんか?

完全なソースコードを確認し、ユースケースに合わせて変更するか、独自の自律エージェントシステムの参考にしてください。