ADK Studio
Entorno de desarrollo visual para crear agentes de IA mediante arrastrar y soltar.
Descripción general
ADK Studio proporciona una interfaz de bajo código para diseñar, probar e implementar agentes de IA creados con ADK-Rust. Cree visualmente flujos de trabajo complejos con múltiples agentes y, después, compílelos en código Rust listo para producción.

Instalación
# Install from crates.io (self-contained binary)
cargo install adk-studio
# Or build from source
cargo build --release -p adk-studio
Inicio rápido
# Start the studio server
adk-studio
# Open in browser
open http://localhost:3000
Opciones de CLI
| Opción | Descripción | Predeterminado |
|---|---|---|
--port, -p | Puerto del servidor | 3000 |
--host, -h | Dirección de enlace | 127.0.0.1 |
--dir, -d | Directorio de proyectos | ~/.local/share/adk-studio/projects |
--static, -s | Directorio para sobrescribir archivos estáticos | (incrustado) |
# Bind to all interfaces for remote access
adk-studio --host 0.0.0.0 --port 8080
# Custom projects directory
adk-studio --dir ./my-projects
Tutorial paso a paso
Sigue este recorrido para crear tu primer agente de IA en ADK Studio.
Paso 1: Crear un proyecto nuevo
Haz clic en el botón + Nuevo proyecto en la esquina superior derecha.

Introduce un nombre para tu proyecto (por ejemplo, «Proyecto de demostración») y haz clic en Crear.
Paso 2: Añadir un agente al lienzo
La barra lateral izquierda contiene la Paleta de agentes, con los tipos de agentes disponibles:
- Agente LLM: agente de IA individual basado en un modelo de lenguaje
- Secuencial: ejecuta los subagentes en orden
- Paralelo: ejecuta los subagentes simultáneamente
- Bucle: itera hasta que se cumpla la condición de salida
- Enrutador: dirige la ejecución a subagentes según la entrada
Debajo de la paleta de agentes, la Paleta de nodos de acciones proporciona 14 nodos programáticos que no son LLM para operaciones deterministas (solicitudes HTTP, consultas a bases de datos, ramificaciones, bucles, etc.). Consulta la Guía de nodos de acciones para obtener más información.
Haz clic en Agente LLM para añadirlo al lienzo.

Paso 3: Configurar el agente
Al seleccionar un agente, aparece el Panel de propiedades en el lado derecho. Aquí puedes configurar:
- Nombre: identificador del agente
- Modelo: proveedor y modelo de LLM (Gemini, OpenAI, etc.)
- Instrucciones: indicación del sistema para el agente

Paso 4: Añadir herramientas al agente
Desplázate hacia abajo en la barra lateral izquierda para encontrar la Paleta de herramientas:
- Función: función personalizada de Rust con editor de código
- MCP: servidor de Model Context Protocol
- Navegador: 46 acciones de automatización de WebDriver
- Búsqueda de Google: búsqueda web fundamentada
- Cargar artefacto: carga archivos en el contexto
Haz clic en una herramienta para añadirla a tu agente.

Paso 5: Compilar y probar
Haz clic en Compilar proyecto para compilar tu agente. Una vez compilado, usa el Panel de chat en la parte inferior para probar tu agente con conversaciones reales.

El chat admite:
- Respuestas de transmisión en directo de SSE
- Animaciones de ejecución del agente
- Panel de seguimiento de eventos para la depuración
Paso 6: Ver el código generado
Haz clic en Ver código para ver el código Rust listo para producción generado a partir de tu diseño visual.

Puedes copiar este código o usar Compilar para generar un proyecto Rust completo.
Funcionalidades
Tipos de agentes
| Agente | Descripción |
|---|---|
| LLM Agent | Agente único impulsado por un LLM |
| Secuencial | Ejecuta los subagentes en orden |
| Paralelo | Ejecutar subagentes simultáneamente |
| Bucle | Iterar hasta que se cumpla la condición de salida |
| Enrutador | Enrutar a subagentes según la entrada |
Nodos de acción
14 nodos programáticos que no son LLM para operaciones de flujo de trabajo deterministas. Consulta la Guía de nodos de acción para obtener todos los detalles.

| Nodo | Descripción |
|---|---|
| Disparador 🎯 | Punto de entrada del flujo de trabajo (manual, webhook, programación, evento) |
| HTTP 🌐 | Realiza solicitudes de HTTP a APIs externos |
| Establecer 📝 | Definir y manipular variables de estado del flujo de trabajo |
| Transformar ⚙️ | Transformar datos con expresiones u operaciones integradas |
| Cambiar 🔀 | Ramificación condicional basada en condiciones |
| Bucle 🔄 | Iterar sobre matrices o repetir operaciones |
| Fusionar 🔗 | Combinar varias ramas en un único flujo |
| Esperar ⏱️ | Pausar el flujo de trabajo durante un período o hasta que se cumpla una condición |
| Código 💻 | Ejecutar JavaScript personalizado en un entorno de ejecución aislado |
| Base de datos 🗄️ | Operaciones de base de datos (PostgreSQL, MySQL, SQLite, MongoDB, Redis) |
| Correo electrónico 📧 | Enviar mediante SMTP o supervisar mediante IMAP |
| Notificación 🔔 | Enviar a Slack, Discord, Teams o webhooks |
| RSS 📡 | Supervisar feeds de RSS/Atom |
| Archivo 📁 | Operaciones de archivo en almacenamiento local o en la nube |
Activadores
Los flujos de trabajo comienzan con un nodo Activador. Consulta la Guía de activadores para obtener todos los detalles.

| Activador | Descripción |
|---|---|
| Manual | Iniciado por el usuario mediante la entrada del chat |
| Webhook | HTTP endpoint con autenticación opcional |
| Programación | Temporización basada en Cron con zona horaria |
| Evento | Eventos de sistemas externos con filtrado mediante JSONPath |
Tipos de herramientas
| Herramienta | Descripción |
|---|---|
| Función | Función personalizada de Rust con editor de código |
| MCP | Servidor de Model Context Protocol |
| Navegador | 46 WebDriver acciones de automatización |
| Búsqueda de Google | Búsqueda web fundamentada |
| Cargar artefacto | Cargar archivos en el contexto |
Chat en tiempo real
Prueba los agentes directamente en el estudio:
- Respuestas de transmisión en directo de SSE
- Animaciones de ejecución del agente
- Panel de trazas de eventos para la depuración
- Persistencia de la memoria de la sesión
Generación de código
Convierte diseños visuales en código listo para producción:
- Ver código - Previsualiza el código Rust generado con resaltado de sintaxis
- Compilar - Genera un proyecto Rust completo
- Construir - Compila un ejecutable con resultados en tiempo real
- Ejecutar - Ejecuta el agente compilado
El botón Construir aparece automáticamente cuando el flujo de trabajo ha cambiado desde la última compilación.
Generación de código de nodos de acción
Los nodos de acción se compilan en código Rust listo para producción junto con los agentes LLM. Las dependencias se detectan automáticamente y se añaden al Cargo.toml generado.
| Nodo | Crate | Qué genera |
|---|---|---|
| HTTP | reqwest | Solicitudes asíncronas de HTTP con autenticación, cabeceras, cuerpo y extracción de JSONPath |
| Base de datos | sqlx / mongodb / redis | Grupos de conexiones, consultas parametrizadas, comandos de Redis |
| Correo electrónico | lettre / imap | SMTP enviar con TLS/auth/CC/CCO; supervisión IMAP con filtros de búsqueda |
| Código | boa_engine | Ejecución integrada de JavaScript con el estado del grafo como objeto input |
| Establecer | nativo | Asignación de variables (literal, expresión, secreto) |
| Transformar | nativo | Mapear, filtrar, ordenar, reducir, aplanar, agrupar, seleccionar, combinar, plantilla |
| Fusión | nativo | Combinación de ramas (waitAll, waitAny, append) |
Todos los nodos de acción admiten la interpolación de {{variable}} y reciben automáticamente las salidas de los nodos predecesores.
Bases de datos compatibles
| Base de datos | Controlador | Características |
|---|---|---|
| PostgreSQL | sqlx (postgres) | Grupo de conexiones asíncrono, consultas parametrizadas, mapeo de filas a JSON |
| MySQL | sqlx (mysql) | Grupo de conexiones asíncrono, consultas parametrizadas, mapeo de filas a JSON |
| SQLite | sqlx (sqlite) | Grupo de conexiones asíncrono, consultas parametrizadas, asignación de filas a JSON |
| MongoDB | mongodb | Controlador BSON nativo, operaciones de búsqueda/inserción/actualización/eliminación |
| Redis | redis | Comandos GET, SET, DEL, HGET, HSET, LPUSH, LRANGE |
Arquitectura
┌─────────────────────────────────────────────────────────────┐
│ ADK Studio UI │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Palette │ │ Canvas │ │ Properties │ │
│ │ - Agents │ │ ReactFlow │ │ - Name │ │
│ │ - Tools │ │ Workflow │ │ - Model │ │
│ │ │ │ Designer │ │ - Instructions │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼ HTTP/SSE
┌─────────────────────────────────────────────────────────────┐
│ ADK Studio Server │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Routes │ │ Codegen │ │ Storage │ │
│ │ /api/* │ │ Rust code │ │ Projects │ │
│ │ /chat │ │ generation │ │ File-based │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼ Build
┌─────────────────────────────────────────────────────────────┐
│ Generated Rust Project │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Cargo.toml + src/main.rs │ │
│ │ Uses: adk-rust, adk-agent, adk-model, etc. │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
API Puntos de conexión
Proyectos
| Punto de conexión | Método | Descripción |
|---|---|---|
/api/projects | GET | Enumerar todos los proyectos |
/api/projects | POST | Crear un proyecto nuevo |
/api/projects/:id | GET | Obtener detalles del proyecto |
/api/projects/:id | PUT | Actualizar proyecto |
/api/projects/:id | DELETE | Eliminar proyecto |
Generación de código
| Endpoint | Método | Descripción |
|---|---|---|
/api/projects/:id/codegen | POST | Generar código Rust |
/api/projects/:id/build | POST | Compilar proyecto |
/api/projects/:id/run | POST | Ejecutar el ejecutable compilado |
Chat
| Endpoint | Método | Descripción |
|---|---|---|
/api/chat | POST | Enviar mensaje (flujo de SSE) |
Activadores
| Endpointo | Método | Descripción |
|---|---|---|
/api/projects/:id/webhook/*path | POST, GET | Activador de webhook (asíncrono) |
/api/projects/:id/webhook-exec/*path | POST | Activador de webhook (síncrono, espera el resultado) |
/api/projects/:id/webhook-events | GET | SSE flujo para notificaciones de webhook |
/api/projects/:id/events | POST | Activador de eventos |
/api/sessions/:id/resume | POST | Reanudar el flujo de trabajo interrumpido (HITL) |
Variables de entorno
| Variable | Descripción | Obligatorio |
|---|---|---|
GOOGLE_API_KEY | Clave de API de Gemini | Para modelos de Gemini |
GEMINI_API_KEY | Clave de API de Gemini (alternativa) | Para modelos de Gemini |
OPENAI_API_KEY | clave de OpenAI API | Para modelos de OpenAI |
ANTHROPIC_API_KEY | clave de API de Anthropic | Para modelos Claude |
DEEPSEEK_API_KEY | clave de DeepSeek API | Para modelos de DeepSeek |
GROQ_API_KEY | clave de Groq API | Para modelos de Groq |
OLLAMA_HOST | Servidor de Ollama URL (predeterminado: http://localhost:11434) | Para modelos de Ollama |
ADK_DEV_MODE | Usar dependencias locales del espacio de trabajo | No |
RUST_LOG | Nivel de registro | No (predeterminado: info) |
Nota: Solo necesitas la clave API para los proveedores que utilicen tus agentes. ADK Studio detecta automáticamente el proveedor a partir del nombre del modelo y genera el código correcto.
Estructura del código generado
my-project/
├── Cargo.toml
└── src/
└── main.rs
El código generado se adapta a los proveedores utilizados en tu proyecto. ADK Studio detecta el proveedor a partir del nombre del modelo de cada agente y genera las importaciones correctas, la resolución de la clave API y los constructores del modelo.
Ejemplo de main.rs generado (Gemini):
use adk_model::gemini::GeminiModel;
// ...
let gemini_api_key = std::env::var("GOOGLE_API_KEY")
.or_else(|_| std::env::var("GEMINI_API_KEY"))
.expect("GOOGLE_API_KEY or GEMINI_API_KEY must be set");
let model = Arc::new(GeminiModel::new(&gemini_api_key, "gemini-3.7-flash")?);
Ejemplo con OpenAI:
use adk_model::openai::{OpenAIClient, OpenAIConfig};
// ...
let openai_api_key = std::env::var("OPENAI_API_KEY")
.expect("OPENAI_API_KEY must be set");
let model = Arc::new(OpenAIClient::new(OpenAIConfig::new(&openai_api_key, "gpt-5.6-terra"))?);
Ejemplo con Ollama (local, sin clave API):
use adk_model::ollama::{OllamaModel, OllamaConfig};
// ...
let model = Arc::new(OllamaModel::new(OllamaConfig::new("llama3.2"))?);
El Cargo.toml generado incluye automáticamente los indicadores de características adk-model correctos:
# Only Gemini
adk-model = { version = "2.1.0", default-features = false, features = ["gemini"] }
# Mixed providers (e.g., Gemini + Anthropic)
adk-model = { version = "2.1.0", default-features = false, features = ["gemini", "anthropic"] }
# Ollama only (no API key needed)
adk-model = { version = "2.1.0", default-features = false, features = ["ollama"] }
Código generado con nodos de acción
Cuando tu flujo de trabajo incluye nodos de acción, el código generado utiliza adk-graph para la orquestación del flujo de trabajo con cierres FunctionNode:
use adk_graph::prelude::*;
// HTTP action node → reqwest call
let http_node = FunctionNode::new("fetch_data", |ctx| async move {
let client = reqwest::Client::new();
let resp = client.get("https://api.example.com/data")
.bearer_auth(&ctx.get("API_TOKEN").unwrap_or_default())
.send().await
.map_err(|e| GraphError::NodeExecutionFailed {
node: "fetch_data".into(),
message: e.to_string(),
})?;
let body: serde_json::Value = resp.json().await?;
Ok(NodeOutput::new().with_update("apiData", body))
});
// Code action node → boa_engine JS execution
let code_node = FunctionNode::new("process", |ctx| async move {
let mut js_ctx = boa_engine::Context::default();
// Graph state injected as global `input` object
// User code executed in thread-isolated sandbox
Ok(NodeOutput::new().with_update("result", output))
});
Las dependencias detectadas automáticamente se añaden al Cargo.toml generado (reqwest, sqlx, mongodb, redis, lettre, imap, boa_engine).
Plantillas
Studio incluye plantillas prediseñadas:
- Asistente básico - Agente LLM simple
- Agente de investigación - Agente con Google Search
- Enrutador de soporte - Enrutamiento multiagente
- Asistente de código - Agente con herramientas de código
Colaboración en equipo: proyectos locales del repositorio
De forma predeterminada, ADK Studio almacena los proyectos en un directorio local del usuario
(~/.local/share/adk-studio/projects en Linux, ~/Library/Application Support/adk-studio/projects en macOS).
Esto funciona bien para el uso individual, pero los equipos que quieran controlar las versiones y compartir
los proyectos de Studio junto con su código fuente pueden utilizar en su lugar un directorio de proyectos local del repositorio.
Convención recomendada
Almacena los proyectos en .adk-studio/projects en la raíz de tu repositorio:
my-repo/
├── .adk-studio/
│ └── projects/ # Studio project JSON files
├── src/
├── Cargo.toml
└── .gitignore
Inicia Studio usando el directorio local del repositorio:
adk-studio --dir ./.adk-studio/projects
Recomendaciones para .gitignore
Decide qué confirmar según tu flujo de trabajo:
# Option A: Version-control project definitions, ignore build artifacts
.adk-studio/projects/*/build/
.adk-studio/projects/*/target/
# Option B: Ignore all Studio data (treat as local-only)
.adk-studio/
La opción A se recomienda para los equipos, ya que permite compartir diseños de agentes mientras se mantienen los resultados compilados fuera del control de versiones.
Consejos
- Cada miembro del equipo inicia Studio con la misma marca
--dirpara trabajar en proyectos compartidos. - Los archivos JSON del proyecto son la fuente de verdad; el código Rust generado se puede regenerar a partir de ellos.
- La ruta predeterminada local del usuario no se ve afectada; omitir
--dirsigue utilizando la ruta predeterminada del sistema.
Prácticas recomendadas
| Práctica | Descripción |
|---|---|
| Comienza de forma sencilla | Comienza con un solo agente LLM y añade complejidad |
| Prueba con frecuencia | Usa el panel de chat para validar el comportamiento |
| Revisar el código | Comprobar el código generado antes de implementarlo |
| Versionar proyectos | Almacenar proyectos en .adk-studio/projects para la colaboración en equipo |
| Usar plantillas | Comenzar con plantillas para patrones comunes |
Anterior: ← Memoria | Siguiente: Nodos de acción →