Multi agente
Il Tree Agent supporta nativamente la gestione di più agenti. Questa caratteristica rende possibile organizzare flussi complessi in modo ordinato e implementare comportamenti personalizzati che sarebbero difficili da realizzare con un singolo agente.
Per aggiungere un agente è sufficiente inserire un nuovo nodo di tipo agent come figlio diretto del nodo root. Ogni agente è composto dall'intero sottoalbero che ha quel nodo agent come radice.
Il framework memorizza in modo indipendente, per ciascun agente, l'ultimo nodo eseguito e l'ultimo step concluso. Quando l'esecuzione si sposta su un agente diverso, l'agente di partenza rimane ibernato: il suo stato viene conservato e può essere ripreso in seguito.
Resume
Tramite la proprietà resume = True disponibile nell'oggetto restituito dalle callback after e before_run è possibile riprendere l'esecuzione di un agente dall'esatto punto in cui era rimasta, senza dover indicare esplicitamente il nodo. Il node_target in questo caso deve puntare al nodo agent del quale si vuole riprendere l'esecuzione.
Nel caso in cui si utilizza resume = True, il node_target deve necessariamente essere un nodo di tipo agent. Il nodo effettivo da eseguire viene individuato automaticamente in base allo stato memorizzato nell'agente.
Tramite le callback after e before_run è comunque possibile indicare un nodo presente in un agente diverso dall'attuale senza impostare resume = True. In quel caso l'esecuzione riparte forzatamente dal nodo e dallo step indicati, ignorando quelli memorizzati nell'agente.
Esempio: logica trasversale
Il meccanismo multi agente è particolarmente utile per implementare logiche che devono essere applicate trasversalmente rispetto all'agente principale, senza dover modificare la struttura interna di quest'ultimo.
Un esempio concreto è la gestione dei guardrail: se si vuole validare ogni messaggio dell'utente prima di elaborare la risposta, una soluzione efficace è implementare questa logica su un agente dedicato. Nella callback before_run si può dirottare ogni interazione verso l'agente di guardrail; al termine dell'esecuzione di quest'ultimo, tramite resume = True, si riprende l'esecuzione dell'agente principale dal punto esatto in cui era stata sospesa.
In questo modo l'agente principale rimane isolato e mantenibile, mentre la logica trasversale è concentrata in un posto solo.
Spostamento tra agenti
Lo spostamento tra nodi presenti in agenti distinti avviene in gran parte seguendo le stesse logiche applicate tra nodi dello stesso agente. Nello specifico esistono questi 5 meccanismi per spostarsi tra i nodi:
| Metodo | Supporta il multi agent | Descrizione |
|---|---|---|
Durante lo step explore | ⛔ | Automaticamente durante lo step explore il sistema si sposta nel nodo figlio più promettente se questo possiede dei chunk con similarità minima combinata sufficiente |
Durante il reach_anchor | ⛔ | Automaticamente in alcune circostanze ci si sposta sul nodo genitore |
Tramite after | ✅ | Manualmente tramite node_target restituito dalla callback after |
Tramite before_run | ✅ | Manualmente tramite node_target restituito dalla callback before_run |
Tramite fallback | ✅ | Manualmente tramite node_target restituito dalla callback fallback |
Come si può osservare, ad eccezione dei primi due metodi che si basano su relazioni di adiacenza nel grafo, tutti i metodi manuali permettono di indicare anche nodi appartenenti ad agenti distinti.