Documentación

Control de flujo

Filtros, enrutamiento, bucles, paralelismo — para gobernar las rutas de ejecución.

Más allá de los agentes y los operadores, betool proporciona nodos de control para estructurar la lógica de un pipeline.

Filtro

Un nodo filter es una puerta determinista: la ejecución continúa hacia los nodos aguas abajo si se cumplen sus condiciones; si no, la rama se detiene ahí.

Configuración:

  • Condiciones — cada una con la forma {campo, operador, valor}. El campo es un selector en el flujo (exchange.intent, webhook.payload.type…); el valor es una cadena, admite plantillas.
  • Combinador — AND (por defecto) u OR entre las condiciones.
  • Operadores — equals / not_equals, contains / not_contains, starts_with, ends_with, regex, is_empty / is_not_empty, comparaciones numéricas gt / gte / lt / lte, pertenencia a una lista in / not_in (valores separados por comas). Un operador desconocido se rechaza al guardar.

Uso típico: eliminar el ruido antes de los costes de LLM aguas abajo — ignorar los correos cuyo from esté en una lista de bloqueo, o los webhooks cuyo type != "order.created".

Router

Un nodo router envía la ejecución hacia una de sus rutas con nombre. La decisión la toma un LLM a partir de un prompt de enrutamiento y del contexto que compones — para enrutar según una intención, una categoría, un tono.

Configuración:

  • Prompt — la instrucción de clasificación.
  • Rutas — para cada nombre de ruta, el subgrafo que se ejecuta. Cada ruta declarada debe estar cableada; si no, se rechaza la publicación.
  • Modelo — posibilidad de dedicar un LLM ligero al enrutamiento (tiering) para controlar el coste y la latencia.

Para un enrutamiento estrictamente determinista (valor exacto de un campo, estado HTTP), prefiere nodos filter colocados en paralelo: el predicado es entonces mecánico, no interpretado.

Bucle (foreach)

Un nodo foreach itera sobre una colección. Configuración:

  • items — el selector de la lista sobre la que iterar.
  • as — el nombre local del elemento actual.
  • max — límite de iteraciones (por defecto 10): por encima, la lista se trunca y el evento se registra.
  • collect — (opcional) la clave donde acumular los resultados de cada iteración.
  • max_per_minute — (opcional) cadencia máxima, para espaciar las iteraciones cuando el cuerpo del bucle llama a una API que limita el caudal. 0 (por defecto) = sin límite.

En cada vuelta, el subgrafo interno se ejecuta sobre el elemento actual.

El límite max es tu salvaguarda de coste: una lista inesperada de 10 000 elementos nunca disparará 10 000 ejecuciones.

Paralelo

Un nodo parallel ejecuta varios subgrafos de forma concurrente y espera a que todos hayan terminado antes de continuar. Útil para consultar varias fuentes independientes (una búsqueda en el CRM + una lectura de agenda) sin sumar las latencias.

Buenas prácticas

  • Filtra pronto. Cada exchange que atraviesa un agente cuesta tokens; un filter aguas arriba no cuesta nada.
  • Mantén el enrutamiento legible. Un router con 12 rutas es señal de que hacen falta dos niveles de clasificación en lugar de una lógica condensada.
  • Limita los bucles anidados. Un bucle dentro de un bucle multiplica los costes. Prefiere transformar la colección aguas arriba.