Nodos de Acción
Nodos programáticos que no son LLM para operaciones de flujo de trabajo deterministas. Los nodos de acción complementan a los agentes LLM al manejar la transformación de datos, las integraciones de API, el flujo de control y la lógica de automatización.
Visión general
Los nodos de acción son visualmente distintos de los nodos de agente LLM: utilizan colores e iconos únicos para facilitar el escaneo de los flujos de trabajo. Cada tipo de nodo maneja una categoría específica de operación, desde solicitudes HTTP hasta consultas de bases de datos y ramificación condicional.
Todos los nodos de acción comparten un conjunto de propiedades estándar para el manejo de errores, el rastreo, el control de ejecución y el mapeo de E/S. Soportan la interpolación {{variable}} en campos de cadena y reciben automáticamente las salidas de los nodos predecesores.

Nodos disponibles
| Nodo | Icono | Color | Descripción |
|---|---|---|---|
| Disparador | 🎯 | Indigo | Punto de entrada del flujo de trabajo (manual, webhook, programación, evento) |
| HTTP | 🌐 | Blue | Realizar solicitudes HTTP a APIs externas |
| Establecer | 📝 | Purple | Definir y manipular variables de estado del flujo de trabajo |
| Transformar | ⚙️ | Pink | Transformar datos usando expresiones u operaciones integradas |
| Switch | 🔀 | Amber | Ramificación condicional basada en condiciones |
| Bucle | 🔄 | Emerald | Iterar sobre arreglos o repetir operaciones |
| Fusionar | 🔗 | Cyan | Combinar múltiples ramas de nuevo en un solo flujo |
| Esperar | ⏱️ | Gray | Pausar el flujo de trabajo por una duración o condición |
| Código | 💻 | Red | Ejecutar JavaScript personalizado en un entorno de ejecución aislado |
| Base de datos | 🗄️ | Teal | Operaciones de base de datos (PostgreSQL, MySQL, SQLite, MongoDB, Redis) |
| Correo electrónico | 📧 | Rose | Enviar correos electrónicos vía SMTP o monitorear vía IMAP |
| Notificación | 🔔 | Orange | Enviar a Slack, Discord, Teams o webhooks |
| RSS | 📡 | Lime | Monitorear feeds RSS/Atom para nuevas entradas |
| Archivo | 📁 | Sky | Operaciones de archivo en almacenamiento local o en la nube (S3, GCS, Azure) |
Propiedades Estándar
Cada nodo de acción hereda estas propiedades compartidas:
Identidad
| Propiedad | Tipo | Descripción |
|---|---|---|
id | string | Identificador único |
name | string | Nombre a mostrar |
description | string? | Descripción opcional del tooltip |
Manejo de Errores
| Modo | Comportamiento |
|---|---|
stop | Detener flujo de trabajo en caso de error (predeterminado) |
continue | Registrar error y proceder al siguiente nodo |
retry | Reintentar con un conteo configurable (1-10) y retardo (ms) |
fallback | Usar un valor de respaldo en caso de error |
Trazado
| Propiedad | Tipo | Descripción |
|---|---|---|
enabled | boolean | Habilitar trazas de ejecución detalladas |
logLevel | none | error | info | debug | Verbosidad del registro |
Control de Ejecución
| Propiedad | Tipo | Descripción |
|---|---|---|
timeout | number | Tiempo de espera en ms (predeterminado: 30000) |
condition | string? | Saltar nodo si la expresión se evalúa como falsa |
Mapeo de Entrada/Salida
| Propiedad | Tipo | Descripción |
|---|---|---|
inputMapping | Record<string, string>? | Mapear campos de estado a entradas de nodo |
outputKey | string | Clave donde el resultado se almacena en el estado del flujo de trabajo |
Referencia de Nodos
Nodo Disparador 🎯
Punto de entrada del flujo de trabajo. Cada flujo de trabajo comienza con un nodo Trigger. Consulta la Guía de Triggers dedicada para obtener todos los detalles.
| Tipo de Trigger | Descripción |
|---|---|
| Manual | Iniciado por el usuario a través de la entrada del chat |
| Webhook | Punto final HTTP (POST/GET) con autenticación opcional |
| Programación | Programación basada en Cron con soporte de zona horaria |
| Evento | Eventos de sistemas externos con filtrado JSONPath |
Nodo HTTP 🌐
Realiza solicitudes HTTP a APIs externas con manejo completo de autenticación, encabezados, cuerpo y respuesta.
Configuración:
| Propiedad | Tipo | Descripción |
|---|---|---|
method | GET, POST, PUT, PATCH, DELETE | Método HTTP |
url | string | URL con {{variable}} interpolación |
auth | object | Autenticación (none, bearer, basic, api_key) |
headers | Record<string, string> | Cabeceras de solicitud |
body | object | Cuerpo (none, json, form, raw) |
response | object | Manejo de respuesta (json, text, binary) con extracción JSONPath opcional |
rateLimit | object? | Limitación de velocidad (solicitudes por ventana) |
Ejemplo:
{
"type": "http",
"name": "Fetch User Data",
"method": "GET",
"url": "https://api.example.com/users/{{userId}}",
"auth": {
"type": "bearer",
"bearer": { "token": "{{API_TOKEN}}" }
},
"headers": { "Accept": "application/json" },
"body": { "type": "none" },
"response": { "type": "json", "jsonPath": "$.data" },
"errorHandling": { "mode": "retry", "retryCount": 3, "retryDelay": 1000 },
"mapping": { "outputKey": "userData" }
}
Establecer Nodo 📝
Define y manipula variables de estado del flujo de trabajo. Admite valores literales, expresiones y secretos.
Configuración:
| Propiedad | Tipo | Descripción |
|---|---|---|
mode | set, merge, delete | Operación de variable |
variables | Variable[] | Lista de variables a establecer |
envVars | object? | Cargar desde el archivo .env con filtro de prefijo opcional |
Tipos de variable: string, number, boolean, json, expression
Las variables marcadas isSecret: true se enmascaran en los registros y la interfaz de usuario.
Nodo de Transformación ⚙️
Transforma datos usando expresiones u operaciones incorporadas.
Tipos de transformación:
| Tipo | Descripción |
|---|---|
jsonpath | Expresión JSONPath |
jmespath | Expresión JMESPath |
template | Plantilla de cadena con interpolación |
javascript | Expresión JavaScript |
Operaciones integradas: pick, omit, rename, flatten, sort, unique
Objetivos de coerción de tipo: string, number, boolean, array, object
Nodo Switch 🔀
Ramificación condicional con múltiples puertos de salida. Cada condición se asigna a un puerto de salida independiente en el nodo.

Configuración:
| Propiedad | Tipo | Descripción |
|---|---|---|
evaluationMode | first_match | all_match | Detener en la primera coincidencia o evaluar todas |
conditions | SwitchCondition[] | Lista de condiciones con puertos de salida |
defaultBranch | string? | Puerto de salida cuando ninguna condición coincide |
Operadores de condición: eq, neq, gt, lt, gte, lte, contains, startsWith, endsWith, matches, in, empty, exists
Ejemplo:
{
"type": "switch",
"evaluationMode": "first_match",
"conditions": [
{ "id": "ok", "name": "Success", "field": "status", "operator": "eq", "value": "success", "outputPort": "success" },
{ "id": "err", "name": "Error", "field": "status", "operator": "eq", "value": "error", "outputPort": "error" }
],
"defaultBranch": "unknown"
}
Nodo de Bucle 🔄
Itera sobre arrays, repite un número fijo de veces o itera mientras se cumple una condición.
Tipos de bucle:
| Tipo | Descripción |
|---|---|
forEach | Iterar sobre un array del estado |
while | Bucle mientras la condición es verdadera |
times | Repetir N veces |
Ejecución paralela: Habilitar parallel.enabled con batchSize y delayBetween opcionales para iteración concurrente.
Agregación de resultados: Cuando results.collect es true, los resultados de la iteración se recopilan en un array bajo results.aggregationKey.
Nodo de Fusión 🔗
Combina múltiples ramas paralelas de nuevo en un solo flujo. Tiene múltiples puertos de entrada.
Modos de fusión:
| Modo | Comportamiento |
|---|---|
wait_all | Espera a todas las ramas entrantes |
wait_any | Continúa cuando la primera rama se completa |
wait_n | Continúa después de que N ramas se completen |
Estrategias de combinación: array, object, first, last
Tiempo de espera opcional con comportamiento continue o error.
Nodo de Espera ⏱️
Pausa la ejecución del flujo de trabajo.
Tipos de espera:
| Tipo | Descripción |
|---|---|
fixed | Esperar una duración fija (ms, s, m, h) |
until | Esperar hasta una marca de tiempo específica |
webhook | Esperar un webhook entrante |
condition | Sondear una condición a intervalos |
Nodo de Código 💻
Ejecuta JavaScript personalizado en un tiempo de ejecución aislado boa_engine. El estado del grafo se inyecta como el objeto global input.
Configuración:
| Propiedad | Tipo | Descripción |
|---|---|---|
language | javascript, typescript | Lenguaje de código |
code | string | Código a ejecutar |
sandbox | object | Límites de seguridad (red, sistema de archivos, memoria, tiempo) |
Valores predeterminados del sandbox:
| Límite | Por defecto |
|---|---|
| Acceso a la red | false |
| Acceso al sistema de archivos | false |
| Límite de memoria | 128 MB |
| Límite de tiempo | 5000 ms |
Nodo de Base de Datos 🗄️
Realiza operaciones de base de datos con pool de conexiones y consultas parametrizadas.
Bases de datos compatibles:
| Base de Datos | Driver | Características |
|---|---|---|
| PostgreSQL | sqlx (postgres) | Pool asíncrono, consultas parametrizadas, fila a JSON |
| MySQL | sqlx (mysql) | Pool asíncrono, consultas parametrizadas, fila a JSON |
| SQLite | sqlx (sqlite) | Pool asíncrono, consultas parametrizadas, fila a JSON |
| MongoDB | mongodb | BSON nativo, find/insert/update/delete |
| Redis | redis | GET, SET, DEL, HGET, HSET, LPUSH, LRANGE |
Las cadenas de conexión se tratan como secretos y se enmascaran en los registros.
Nodo de Correo Electrónico 📧
Enviar correos electrónicos vía SMTP o monitorear correos entrantes vía IMAP.
Modo de envío (SMTP):
- Soporte TLS/SSL
- Autenticación
- Destinatarios Para/CC/BCC
- Cuerpo en HTML o texto plano
- Interpolación
{{variable}}en el asunto y el cuerpo - Adjuntos de archivos desde el estado
Modo de monitoreo (IMAP):
- Selección de carpeta (por defecto: INBOX)
- Filtros: remitente, asunto, rango de fechas, solo no leídos
- Marcar como leído después de procesar
Nodo de Notificación 🔔
Envía notificaciones a plataformas de mensajería.
Canales: Slack, Discord, Microsoft Teams, webhook personalizado
Formatos de mensaje: texto plano, markdown, bloques específicos de la plataforma (Block Kit, Embeds, Adaptive Cards)
Nodo RSS 📡
Monitorea feeds RSS/Atom en busca de nuevas entradas.
- Intervalo de sondeo configurable
- Filtros por palabra clave, autor, categoría y fecha
- Seguimiento de elementos vistos para evitar duplicados
- Contenido completo opcional o solo resumen
Nodo de Archivo 📁
Operaciones de archivo en almacenamiento local o en la nube.
Operaciones: read, write, delete, list
Proveedores de nube: Amazon S3, Google Cloud Storage, Azure Blob Storage
Formatos de archivo: JSON, CSV, XML, texto, binario (con opciones de análisis de CSV para delimitador, encabezados, comillas)
Interpolación de Variables
Todos los campos de cadena en nodos de acción soportan la sintaxis {{variable}} para valores dinámicos:
https://api.example.com/users/{{userId}}
Bearer {{API_TOKEN}}
Hello {{user.name}}, your order {{orderId}} is ready.
Las variables se resuelven a partir del estado del flujo de trabajo en tiempo de ejecución. La notación de punto (user.name) accede a valores anidados.
Nodos Multi-Puerto
Dos tipos de nodos tienen recuentos de puertos dinámicos:
- Switch — un puerto de salida por condición, más un puerto predeterminado opcional
- Merge — múltiples puertos de entrada, uno por cada rama entrante
Estos puertos están representados visualmente en el nodo y se conectan a diferentes nodos de bajada/subida.
Generación de Código
Los nodos de acción se compilan a código Rust de producción junto con los LLM agents. Las dependencias se detectan automáticamente y se añaden al Cargo.toml generado.
| Nodo | Crate | Qué Genera |
|---|---|---|
| HTTP | reqwest | Solicitudes HTTP asíncronas con autenticación, cabeceras, cuerpo, extracción JSONPath |
| Database | sqlx / mongodb / redis | Pools de conexiones, consultas parametrizadas, comandos Redis |
lettre / imap | Envío SMTP con TLS; monitorización IMAP con filtros de búsqueda | |
| Code | boa_engine | Ejecución de JavaScript incrustado con el estado del grafo como objeto input |
| Set | native | Asignación de variables (literal, expresión, secreto) |
| Transform | native | Mapear, filtrar, ordenar, reducir, aplanar, agrupar, seleccionar, fusionar, plantilla |
| Merge | native | Combinación de ramas (waitAll, waitAny, append) |
Todo el código generado utiliza adk-graph FunctionNode closures con GraphError::NodeExecutionFailed para el manejo de errores.
Código generado de ejemplo (nodo HTTP):
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))
});
Código generado de ejemplo (nodo Code):
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))
});
Anterior: ← Studio | Siguiente: Triggers →