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) uORentre las condiciones. - Operadores —
equals/not_equals,contains/not_contains,starts_with,ends_with,regex,is_empty/is_not_empty, comparaciones numéricasgt/gte/lt/lte, pertenencia a una listain/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
filteraguas 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.