Implementación totalmente nativa en ADK-Rust

Conoce a Ralph

Un bucle de agentes autónomo que se ejecuta continuamente hasta completar todos los elementos del PRD. No necesita scripts de Bash: todo se ejecuta dentro de ADK-Rust.

Demostración en vivo de ADK-Ralph v2

Dale a Ralph un pequeño producto para construir.

Esto ejecuta el binario Rust real. El Agente PRD define una historia de usuario, el Agente Arquitecto crea el diseño y plan de tareas, y el Agente Ralph Loop escribe y verifica el proyecto en un espacio de trabajo aislado.

01 · PRD Agent

Definir el producto

1

02 · Architect Agent

Diseñar el sistema

2

03 · Ralph Loop Agent

Construir y verificar

3

Un proyecto · tres iteraciones de implementación · límite de ocho minutos · archivos temporales eliminados tras entrega

Ejecución Ralph
proceso real · transmitido

La ejecución real aparecerá aquí.

Verás fases del agente, actividad de herramientas, controles de calidad y los archivos que Ralph devuelve.

Arquitectura general

Construido íntegramente en Rust con las capacidades nativas de bucle de ADK-Rust

Agente de bucle
Orquestador
Agente trabajador
Ejecutor de tareas
Herramienta PRD
Gestor de tareas
Herramienta Git
Control de versiones
Herramienta de pruebas
Control de calidad
1

Agente de bucle

El orquestador principal recorre las tareas, delega el trabajo y supervisa el progreso general.

2

Agente trabajador

Ejecuta tareas individuales con un contexto específico. Implementa, prueba y confirma los cambios.

3

Herramientas personalizadas

Herramientas nativas de ADK-Rust para Git, operaciones con archivos, controles de calidad y gestión del PRD.

Principales capacidades

Ralph muestra las capacidades de ADK-Rust para desarrollar agentes autónomos

🔄

Bucle autónomo

Ejecución continua hasta completar todos los elementos del PRD. Integración nativa de herramientas de bucle sin scripts de Bash.

🤖

Coordinación multiagente

El agente de bucle coordina a los agentes trabajadores. Cada agente se especializa en su función para trabajar con mayor eficacia.

🛠️

Herramientas personalizadas

Git, operaciones con archivos, controles de calidad y gestión del PRD, todo creado como herramientas nativas de ADK-Rust.

📋

Guiado por el PRD

Gestión de tareas basada en JSON con historias de usuario, criterios de aceptación y seguimiento de resultados.

Controles de calidad

Verificación automática con cargo check, test, clippy y fmt antes de cada commit.

💾

Persistencia del estado

Los commits de Git, los registros de progreso y las actualizaciones de AGENTS.md proporcionan memoria completa y trazabilidad.

Implementación en detalle

Código Rust limpio e idiomático que aprovecha todas las capacidades de 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)
    }
}

Estructura del proyecto

Una organización modular que separa agentes, herramientas y modelos para facilitar el mantenimiento y la ampliación.

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

Nativo frente a Bash

¿Por qué crear agentes autónomos directamente en Rust en lugar de coordinarlos con scripts de shell?

AspectoBashNativo
ImplementaciónScript de shell + ADK-RustRust puro
Seguridad de tiposEn ejecuciónEn compilación
Gestión de erroresCódigos de salidaResult<T, E>
ConcurrenciaSecuencialAsync/await
Integración de herramientasComandos de shellHerramientas nativas de ADK-Rust
DepuraciónArchivos de registroTrazas + registros estructurados
RendimientoCoste de crear procesosAbstracciones de coste cero
Seguridad de memoriaGestión manualGarantizada por el compilador
PruebasSolo pruebas de integraciónPruebas unitarias y de integración

¿Listo para crear tu propio Ralph?

Explora el código fuente completo, adáptalo a tu caso de uso o úsalo como inspiración para tus propios sistemas de agentes autónomos.