Implémentation entièrement native avec ADK-Rust

Découvrez Ralph

Une boucle d'agents autonome qui s'exécute jusqu'à ce que tous les éléments du PRD soient terminés. Aucun script Bash n'est nécessaire : tout s'exécute dans ADK-Rust.

Démo en direct ADK-Ralph v2

Donner à Ralph un petit produit à construire.

Cela exécute le vrai binaire Rust. L'agent PRD définit une user story, l'agent Architect crée le design et le plan de tâches, et l'agent Ralph Loop écrit et vérifie le projet dans un espace de travail isolé.

01 · PRD Agent

Définir le produit

1

02 · Architect Agent

Concevoir le système

2

03 · Ralph Loop Agent

Construire et vérifier

3

Un projet · trois itérations d'implémentation · limite de huit minutes · fichiers temporaires supprimés après livraison

Exécution Ralph
processus réel · diffusé

L'exécution réelle apparaîtra ici.

Vous verrez les phases de l'agent, l'activité des outils, les contrôles qualité et les fichiers que Ralph retourne.

Architecture générale

Entièrement construit en Rust avec les capacités de boucle natives d'ADK-Rust

Agent en boucle
Orchestrateur
Agent exécutant
Exécuteur de tâches
Outil PRD
Gestionnaire de tâches
Outil Git
Gestion de versions
Outil de test
Contrôle qualité
1

Agent en boucle

L'orchestrateur principal parcourt les tâches, délègue le travail et suit l'avancement global.

2

Agent exécutant

Exécute chaque tâche avec un contexte ciblé. Implémente, teste et enregistre les modifications.

3

Outils personnalisés

Outils ADK-Rust natifs pour Git, les fichiers, les contrôles qualité et la gestion du PRD.

Capacités principales

Ralph présente les capacités d'ADK-Rust pour développer des agents autonomes

🔄

Boucle autonome

Exécution continue jusqu'à la fin de tous les éléments du PRD. Intégration native des outils de boucle, sans script Bash.

🤖

Coordination multi-agent

L'agent en boucle orchestre les agents exécutants. Chaque agent se spécialise dans son rôle pour gagner en efficacité.

🛠️

Outils personnalisés

Git, opérations sur les fichiers, contrôles qualité et gestion du PRD : tout est conçu comme des outils ADK-Rust natifs.

📋

Piloté par le PRD

Gestion des tâches en JSON avec récits utilisateur, critères d'acceptation et suivi des résultats.

Contrôles qualité

Vérification automatique avec cargo check, test, clippy et fmt avant chaque commit.

💾

Persistance de l'état

Les commits Git, les journaux de progression et les mises à jour d'AGENTS.md assurent une mémoire complète et la traçabilité.

Implémentation détaillée

Un code Rust clair et idiomatique qui exploite toutes les capacités d'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)
    }
}

Structure du projet

Une organisation modulaire qui sépare agents, outils et modèles afin de faciliter la maintenance et l'extension.

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

Natif contre Bash

Pourquoi construire des agents autonomes directement en Rust plutôt que de les orchestrer avec des scripts shell ?

AspectBashNatif
ImplémentationScript shell + ADK-RustRust pur
Sûreté des typesÀ l'exécutionÀ la compilation
Gestion des erreursCodes de sortieResult<T, E>
ConcurrenceSéquentielAsync/await
Intégration des outilsCommandes shellOutils ADK-Rust natifs
DébogageFichiers journauxTraçage + journaux structurés
PerformancesCoût de création des processusAbstractions sans surcoût
Sécurité mémoireGestion manuelleGarantie par le compilateur
TestsTests d'intégration uniquementTests unitaires et d'intégration

Prêt à créer votre propre version de Ralph ?

Explorez le code source complet, adaptez-le à votre cas d'usage ou utilisez-le comme point de départ pour vos propres systèmes d'agents autonomes.