Contrôle de flux
Au-delà des agents et opérateurs, betool fournit des nœuds de contrôle pour structurer la logique d'un pipeline.
Filtre
Un nœud filter est une porte déterministe : l'exécution continue vers les nœuds aval si ses conditions sont satisfaites, sinon la branche s'arrête là.
Configuration :
- Conditions — chacune de la forme
{champ, opérateur, valeur}. Le champ est un sélecteur dans le flux (exchange.intent,webhook.payload.type…) ; la valeur est une chaîne, templatable. - Combinateur —
AND(défaut) ouORentre les conditions. - Opérateurs —
equals/not_equals,contains/not_contains,starts_with,ends_with,regex,is_empty/is_not_empty, comparaisons numériquesgt/gte/lt/lte, appartenance à une listein/not_in(valeurs séparées par des virgules). Un opérateur inconnu est refusé à l'enregistrement.
Utilisation typique : éliminer le bruit avant les coûts LLM downstream — ignorer les emails dont le from est dans une blacklist, ou les webhooks dont type != "order.created".
Routeur
Un nœud router envoie l'exécution vers une de ses routes nommées. La décision est prise par un LLM à partir d'un prompt de routage et du contexte que vous composez — pour router selon une intention, une catégorie, un ton.
Configuration :
- Prompt — la consigne de classement.
- Routes — pour chaque nom de route, le sous-graphe à exécuter. Chaque route déclarée doit être câblée, sinon la publication est refusée.
- Modèle — possibilité de dédier un LLM léger au routage (tiering) pour maîtriser coût et latence.
Pour un routage strictement déterministe (valeur exacte d'un champ, statut HTTP), préférez des nœuds filter posés en parallèle : le prédicat est alors mécanique, pas interprété.
Boucle (foreach)
Un nœud foreach itère sur une collection. Configuration :
items— le sélecteur de la liste sur laquelle itérer.as— le nom local de l'élément courant.max— plafond d'itérations (défaut 10) : au-delà, la liste est tronquée et l'événement journalisé.collect— (optionnel) la clé où accumuler les résultats de chaque itération.max_per_minute— (optionnel) cadence maximale, pour espacer les itérations quand le corps de boucle appelle une API qui plafonne le débit.0(défaut) = aucune limite.
À chaque tour, le sous-graphe interne s'exécute sur l'élément courant.
Le plafond max est votre garde-fou de coût : une liste inattendue de 10 000 éléments ne déclenchera jamais 10 000 exécutions.
Parallèle
Un nœud parallel exécute plusieurs sous-graphes en concurrence et attend qu'ils aient tous terminé avant de continuer. Utile pour interroger plusieurs sources indépendantes (une recherche CRM + une lecture d'agenda) sans additionner les latences.
Bonnes pratiques
- Filtrez tôt. Chaque exchange qui traverse un agent coûte des tokens ; un
filteren amont ne coûte rien. - Gardez le routage lisible. Un routeur à 12 routes est le signe qu'il faut deux étages de classification plutôt qu'une logique condensée.
- Limitez les boucles imbriquées. Une boucle dans une boucle multiplie les coûts. Préférez transformer la collection en amont.