Documentazione

Controllo di flusso

Filtri, routing, loop, parallelismo — per governare i percorsi di esecuzione.

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) oppure OR tra le condizioni.
  • Operatori — equals / not_equals, contains / not_contains, starts_with, ends_with, regex, is_empty / is_not_empty, confronti numerici gt / gte / lt / lte, appartenenza a un elenco in / 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 filter a 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.