Una pipeline betool è un grafo di nodi che assembli nell'editor visuale. Ogni tipo di nodo dichiara lato server la propria configurazione e le chiavi che produce; l'editor valida il grafo e la configurazione prima di lasciarti pubblicare.
Anatomia di una pipeline
[Start]──▶[agent]──▶[router]──┬──▶[agent]
└──▶[webhook_action]
- Il nodo Start viene creato automaticamente con il modello; porta i ricevitori (canali di ingresso) che innescano la pipeline. Uno stesso Start può dichiararne più di uno.
- Ogni nodo a valle legge le chiavi prodotte dai nodi a monte nel contesto di esecuzione.
- Un router o dei filtri creano rami; ogni esecuzione lascia una traccia consultabile.
Concetti fondamentali
Chiave di flusso
Una chiave è un dato con nome che scorre tra i nodi. Esempio: un nodo agent può scrivere il suo output sotto exchange.intent, e un nodo a valle (filtro, router) testa questa chiave.
Ciò che un nodo produce è dichiarato dal suo contratto, in due forme:
- Chiave fissa (
fixed_key) — sempre la stessa, definita dal tipo di nodo (ad es.input.entry_kindper lo Start). - Chiave configurabile (
configurable_key) — scelta nella configurazione del nodo (ad es. la chiave di output di un agent).
Ciò che un nodo legge si imposta nella sua configurazione (il campo testato da un filtro, gli input di un agent…).
Contratto
Ogni tipo di nodo espone un contratto dichiarato lato server: i suoi campi di configurazione (tipo, valori consentiti, campi obbligatori, valori predefiniti) e le chiavi che produce. L'editor si basa su questo contratto per costruire il pannello di configurazione e validare ciò che inserisci.
Configurazione
Un nodo ha anche parametri statici (la sua configurazione) — ad esempio, per un nodo agent: il suo ruolo, la sua missione, i suoi tool, il suo modello LLM.
Segreti
I campi che il contratto di un nodo o di un ricevitore dichiara segreti (segreto HMAC di un webhook in entrata, token o password di una chiamata HTTP, token di accesso di una Pagina, segreto di una sotto-pipeline…) non vengono mai restituiti in chiaro una volta salvati: né all'editor, né dall'API, né agli strumenti MCP e agli agenti che leggono una pipeline, né nelle proposte.
Nell'inspector, un campo di questo tipo mostra « •••••• salvato — digita per sostituire »:
- lasciato vuoto, conserva il segreto salvato;
- un nuovo inserimento lo sostituisce;
- il pulsante Rimuovi lo cancella (per un segreto HMAC, la verifica della firma viene allora disattivata).
Copiare-incollare o duplicare un nodo non ricopia i suoi segreti: reinseriscili sulla copia.
Creare una pipeline
- Modelli → Nuovo — in betool, un modello contiene la tua pipeline.
- Il canvas si apre con un nodo Start. Configuralo per scegliere il canale o i canali di ingresso.
- Aggiungi nodi con il pulsante Aggiungi un nodo al passaggio del mouse su un collegamento, oppure con un clic destro su un nodo (Aggiungi un nodo prima / dopo), poi scegli il loro tipo nel catalogo dei moduli (ricerca per nome).
- Collega i nodi tra loro. La pipeline è un albero: ogni nodo ha un solo genitore.
- Clicca su un nodo per aprirne la configurazione nell'ispettore.
- Avvia un test — esegui la versione pubblicata su un payload inserito liberamente, in modalità reale o in Modalità simulazione (i nodi con effetto esterno vengono saltati).
- Pubblica — un messaggio di commit è obbligatorio; la pipeline viene validata, poi la nuova versione diventa quella eseguita dal runtime.
Versioning
Ogni pubblicazione crea una versione. Da Versioni, puoi:
- Confrontare una versione con lo stato corrente (nodi e collegamenti aggiunti, rimossi, modificati).
- Ricaricare una versione nell'editor (la bozza viene riscritta, senza pubblicare).
- Ripubblicare una versione precedente (rollback).
Dalla cronologia, un'esecuzione passata proveniente da un ricevitore può anche essere rieseguita sulla versione pubblicata, con un payload eventualmente modificato e in modalità simulazione se necessario.
Validazione
Alla pubblicazione, un validatore controlla il grafo:
- Bloccante — ciclo nel grafo; nodo con più genitori; uscita obbligatoria non collegata (il corpo di un loop
foreach, i figli di unparallel, ogni route dichiarata di unrouter); numero di Start errato; errori specifici di un tipo di nodo (ad es. ruolo o missione dell'agent inesistente). - Avviso (non bloccante) — nodo non raggiungibile dallo Start; scostamento di una configurazione esistente rispetto al contratto del suo nodo.
Durante la scrittura di una configurazione (editor, proposte, API), un valore al di fuori dei valori consentiti o un campo obbligatorio mancante vengono rifiutati, con la correzione attesa.
Di conseguenza, una pipeline pubblicata ha superato questi controlli strutturali. Gli errori rimanenti riguardano l'esecuzione (una chiamata API di terze parti che fallisce, un parsing inatteso).