Oltre agli agent e agli operatori, betool fornisce nodi di controllo per strutturare la logica di una pipeline.
Filtro
Un nodo filter è una porta deterministica: l'esecuzione prosegue verso i nodi a valle se le sue condizioni sono soddisfatte, altrimenti il ramo si ferma lì.
Configurazione:
- Condizioni — ciascuna nella forma
{campo, operatore, valore}. Il campo è un selettore nel flusso (exchange.intent,webhook.payload.type…); il valore è una stringa, che supporta i template. - Combinatore —
AND(predefinito) oppureORtra le condizioni. - Operatori —
equals/not_equals,contains/not_contains,starts_with,ends_with,regex,is_empty/is_not_empty, confronti numericigt/gte/lt/lte, appartenenza a un elencoin/not_in(valori separati da virgole). Un operatore sconosciuto viene rifiutato al salvataggio.
Uso tipico: eliminare il rumore prima dei costi LLM a valle — ignorare le email il cui from è in una blacklist, o i webhook il cui type != "order.created".
Router
Un nodo router invia l'esecuzione verso una delle sue route con nome. La decisione è presa da un LLM a partire da un prompt di routing e dal contesto che componi — per instradare in base a un'intenzione, una categoria, un tono.
Configurazione:
- Prompt — l'istruzione di classificazione.
- Route — per ogni nome di route, il sottografo da eseguire. Ogni route dichiarata deve essere collegata, altrimenti la pubblicazione viene rifiutata.
- Modello — possibilità di dedicare un LLM leggero al routing (tiering) per tenere sotto controllo costi e latenza.
Per un routing strettamente deterministico (valore esatto di un campo, stato HTTP), preferisci nodi filter disposti in parallelo: il predicato è allora meccanico, non interpretato.
Loop (foreach)
Un nodo foreach itera su una collezione. Configurazione:
items— il selettore della lista su cui iterare.as— il nome locale dell'elemento corrente.max— limite di iterazioni (predefinito 10): oltre, la lista viene troncata e l'evento registrato.collect— (facoltativo) la chiave in cui accumulare i risultati di ogni iterazione.max_per_minute— (facoltativo) cadenza massima, per distanziare le iterazioni quando il corpo del loop chiama un'API che limita il throughput.0(predefinito) = nessun limite.
A ogni iterazione, il sottografo interno viene eseguito sull'elemento corrente.
Il limite max è la tua protezione sui costi: una lista inattesa di 10 000 elementi non innescherà mai 10 000 esecuzioni.
Parallelo
Un nodo parallel esegue più sottografi in concorrenza e attende che siano tutti terminati prima di proseguire. Utile per interrogare più sorgenti indipendenti (una ricerca CRM + una lettura del calendario) senza sommare le latenze.
Buone pratiche
- Filtra presto. Ogni exchange che attraversa un agent costa token; un
filtera monte non costa nulla. - Mantieni il routing leggibile. Un router con 12 route è il segnale che servono due livelli di classificazione piuttosto che una logica condensata.
- Limita i loop annidati. Un loop dentro un loop moltiplica i costi. Preferisci trasformare la collezione a monte.