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.

Flujo de trabajo de nodos de acción

Nodos disponibles

NodoIconoColorDescripción
Disparador🎯IndigoPunto de entrada del flujo de trabajo (manual, webhook, programación, evento)
HTTP🌐BlueRealizar solicitudes HTTP a APIs externas
Establecer📝PurpleDefinir y manipular variables de estado del flujo de trabajo
Transformar⚙️PinkTransformar datos usando expresiones u operaciones integradas
Switch🔀AmberRamificación condicional basada en condiciones
Bucle🔄EmeraldIterar sobre arreglos o repetir operaciones
Fusionar🔗CyanCombinar múltiples ramas de nuevo en un solo flujo
Esperar⏱️GrayPausar el flujo de trabajo por una duración o condición
Código💻RedEjecutar JavaScript personalizado en un entorno de ejecución aislado
Base de datos🗄️TealOperaciones de base de datos (PostgreSQL, MySQL, SQLite, MongoDB, Redis)
Correo electrónico📧RoseEnviar correos electrónicos vía SMTP o monitorear vía IMAP
Notificación🔔OrangeEnviar a Slack, Discord, Teams o webhooks
RSS📡LimeMonitorear feeds RSS/Atom para nuevas entradas
Archivo📁SkyOperaciones 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

PropiedadTipoDescripción
idstringIdentificador único
namestringNombre a mostrar
descriptionstring?Descripción opcional del tooltip

Manejo de Errores

ModoComportamiento
stopDetener flujo de trabajo en caso de error (predeterminado)
continueRegistrar error y proceder al siguiente nodo
retryReintentar con un conteo configurable (1-10) y retardo (ms)
fallbackUsar un valor de respaldo en caso de error

Trazado

PropiedadTipoDescripción
enabledbooleanHabilitar trazas de ejecución detalladas
logLevelnone | error | info | debugVerbosidad del registro

Control de Ejecución

PropiedadTipoDescripción
timeoutnumberTiempo de espera en ms (predeterminado: 30000)
conditionstring?Saltar nodo si la expresión se evalúa como falsa

Mapeo de Entrada/Salida

PropiedadTipoDescripción
inputMappingRecord<string, string>?Mapear campos de estado a entradas de nodo
outputKeystringClave 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 TriggerDescripción
ManualIniciado por el usuario a través de la entrada del chat
WebhookPunto final HTTP (POST/GET) con autenticación opcional
ProgramaciónProgramación basada en Cron con soporte de zona horaria
EventoEventos 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:

PropiedadTipoDescripción
methodGET, POST, PUT, PATCH, DELETEMétodo HTTP
urlstringURL con {{variable}} interpolación
authobjectAutenticación (none, bearer, basic, api_key)
headersRecord<string, string>Cabeceras de solicitud
bodyobjectCuerpo (none, json, form, raw)
responseobjectManejo de respuesta (json, text, binary) con extracción JSONPath opcional
rateLimitobject?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:

PropiedadTipoDescripción
modeset, merge, deleteOperación de variable
variablesVariable[]Lista de variables a establecer
envVarsobject?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:

TipoDescripción
jsonpathExpresión JSONPath
jmespathExpresión JMESPath
templatePlantilla de cadena con interpolación
javascriptExpresió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.

Panel de propiedades del Switch

Configuración:

PropiedadTipoDescripción
evaluationModefirst_match | all_matchDetener en la primera coincidencia o evaluar todas
conditionsSwitchCondition[]Lista de condiciones con puertos de salida
defaultBranchstring?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:

TipoDescripción
forEachIterar sobre un array del estado
whileBucle mientras la condición es verdadera
timesRepetir 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:

ModoComportamiento
wait_allEspera a todas las ramas entrantes
wait_anyContinúa cuando la primera rama se completa
wait_nContinú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:

TipoDescripción
fixedEsperar una duración fija (ms, s, m, h)
untilEsperar hasta una marca de tiempo específica
webhookEsperar un webhook entrante
conditionSondear 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:

PropiedadTipoDescripción
languagejavascript, typescriptLenguaje de código
codestringCódigo a ejecutar
sandboxobjectLímites de seguridad (red, sistema de archivos, memoria, tiempo)

Valores predeterminados del sandbox:

LímitePor defecto
Acceso a la redfalse
Acceso al sistema de archivosfalse
Límite de memoria128 MB
Límite de tiempo5000 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 DatosDriverCaracterísticas
PostgreSQLsqlx (postgres)Pool asíncrono, consultas parametrizadas, fila a JSON
MySQLsqlx (mysql)Pool asíncrono, consultas parametrizadas, fila a JSON
SQLitesqlx (sqlite)Pool asíncrono, consultas parametrizadas, fila a JSON
MongoDBmongodbBSON nativo, find/insert/update/delete
RedisredisGET, 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.

NodoCrateQué Genera
HTTPreqwestSolicitudes HTTP asíncronas con autenticación, cabeceras, cuerpo, extracción JSONPath
Databasesqlx / mongodb / redisPools de conexiones, consultas parametrizadas, comandos Redis
Emaillettre / imapEnvío SMTP con TLS; monitorización IMAP con filtros de búsqueda
Codeboa_engineEjecución de JavaScript incrustado con el estado del grafo como objeto input
SetnativeAsignación de variables (literal, expresión, secreto)
TransformnativeMapear, filtrar, ordenar, reducir, aplanar, agrupar, seleccionar, fusionar, plantilla
MergenativeCombinació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 →

Nodos de Acción - Documentación ADK-Rust | ADK-Rust