Switch, loops y condicionales
AIFlows introduce nodos de control de flujo expresivos que superan el binario true/false de BotV2.
Switch (ramificación múltiple)
Evalúa una expresión o el valor de una variable y enruta a una route específica.
{
"kind": "switch",
"expression": "{{category}}",
"cases": [
{ "value": "ventas", "route": "node_sales" },
{ "value": "soporte", "route": "node_support" },
{ "value": "facturacion", "route": "node_billing" }
],
"default": "node_fallback"
}
El validador exige que cada value sea único y que default exista si hay casos abiertos.
Loops (iteración acotada)
Dos variantes:
Loop sobre colección
{
"kind": "loop",
"mode": "forEach",
"collection": "{{items}}",
"itemVar": "item",
"body": { "node": "node_process_item" },
"maxIterations": 1000,
"maxDurationMs": 30000
}
Loop while
{
"kind": "loop",
"mode": "while",
"condition": "{{hasMore}}",
"body": { "node": "node_fetch_next" },
"maxIterations": 500
}
Cotas anti-runaway
Todo loop declara obligatoriamente:
maxIterations(límite duro de iteraciones).maxDurationMs(tiempo máximo de pared).
Si se alcanza una cota, el loop termina con outcome capped y se registra en la traza. Nunca se queda iterando indefinidamente.
Condicionales clásicos (if/else)
Siguen existiendo como nodos simples:
{
"kind": "if",
"condition": "{{user.tier == 'premium'}}",
"then": "node_premium",
"else": "node_basic"
}
La condición se evalúa con el mismo motor de expresiones que el resto del sistema.
Redirección
redirect permite saltar a otro nodo del grafo sin importar la posición:
{ "kind": "redirect", "target": "node_payment_success" }
Útil para implementar go-to controlados. El validador verifica que target exista y no genere ciclos infinitos.
Validación de ciclos
Antes de publicar un flujo, el motor ejecuta el validador de integridad (doc-iaflows/10-VALIDATION-RULES.md) que detecta:
- Ciclos entre nodos sin
waitintermedio. - Loops sin cotas.
- Switches sin caso
default. - Redirecciones que cierran el grafo prematuramente.
Si el validador rechaza, el grafo no se puede publicar hasta corregir.