Skip to main content

Installazione

Supportato: crewai dalla 1.13 alla 2.0. La 1.13 è la versione che ha aggiunto started_event_id e normalizzato l’utilizzo dei token, entrambi elementi su cui l’adapter si basa per abbinare gli eventi e segnalare i token.

Strumentazione

instrument() registra un listener sul bus degli eventi a livello di modulo di CrewAI e sottoscrive un gestore per ogni classe di evento. Nulla cambia nel tuo equipaggio, agenti, compiti o strumenti.

Cosa viene registrato

Un compito non emette nulla di proposito. Un compito CrewAI è un sottoinsieme dell’esecuzione dell’agente che lo esegue, quindi emettere entrambi comporterebbe il raddoppio di ogni riga e li renderebbe fratelli. L’id e il nome del compito viaggiano invece sugli eventi dell’agente stesso. Le operazioni di memoria e conoscenza vengono registrate come strumenti, denominati dalla superficie che colpiscono, in modo che vengano visualizzate accanto ai tuoi veri strumenti dove puoi confrontare la loro latenza. Su un equipaggio gerarchico, l’annidamento è ciò che rende la traccia leggibile:
CrewAI rende genitore un’esecuzione delegata sull’evento strumento delegate_work_to_coworker, non direttamente sul manager, quindi l’adapter segue quel collegamento. Senza di esso ogni agente risulta fratello di ogni altro e la struttura della delega viene persa.

Esempio

Il passaggio è visibile nella traccia: lo span analyst si chiude, lo span writer si apre, e entrambi si trovano all’interno di uno span crew.

Nomina i tuoi span

agent_id proviene da Agent(role=...), che è quello che lo rende una sfaccettatura leggibile del dashboard.
agent_id è una colonna a bassa cardinalità. Un ruolo contenente un id di esecuzione o un timestamp lo degrada per ogni query che chiunque esegue. Se un ruolo sembra un id, l’adapter lo rifiuta e mette il valore reale in un campo del payload.

Controlla la sessione

Risolto in questo ordine, il primo risultato vince:
  1. instrument("crewai", session_id=...)
  2. L’ambito failproofai_sdk.session() che lo racchiude
  3. Un uuid4().hex generato, una volta per equipaggio o flusso
Avvolgi il kickoff per controllarlo per ogni esecuzione:

Opzioni

session_id è l’unica opzione che questo adapter legge. I prompt e i completamenti vengono sempre registrati, troncati al budget del payload.

Ciclo umano nel ciclo

CrewAI ha due superfici di ciclo umano nel ciclo, e entrambe vengono registrate come i medesimi quattro eventi. @human_feedback su un metodo di flusso passa attraverso il bus degli eventi di CrewAI: il runtime emette un evento prima di bloccarsi su una persona e un altro dopo la risposta. Task(human_input=True) no. Chiama input() all’interno del provider di input di CrewAI e non emette alcun evento, quindi l’adapter avvolge quel provider direttamente — senza di esso l’intera attesa umana era invisibile e fatturata come tempo attivo dell’agente. In entrambi i casi ottieni:
Da agent_pause a agent_resume è l’unica coppia che alimenta il tempo di pausa. Senza di essa, un’attesa umana di dieci minuti viene fatturata come dieci minuti di tempo attivo dell’agente.
CrewAI non imposta alcun id di correlazione su nessun evento di feedback umano, quindi l’adapter li abbina in base al nome del flusso e del metodo, tornando alla pausa aperta più di recente. Questo è valido perché un prompt della console blocca. Se costruisci un provider di feedback concorrente, imposta request_id su entrambi gli eventi.
Poiché il percorso Task(human_input=True) è un wrapper attorno al provider di input di CrewAI piuttosto che una sottoscrizione di evento, viene ripristinato su uninstrument() e ri-genera qualsiasi cosa input() generi, KeyboardInterrupt incluso, invariato.

Problemi comuni

Un role contiene un UUID, un timestamp o un suffisso per esecuzione. Usa un ruolo umano stabile e metti l’id specifico dell’esecuzione nella descrizione del compito.
Il bus degli eventi è asincrono e kickoff() ritorna prima che gli ultimi gestori vengano eseguiti. Svuotalo prima:
Questa è una proprietà di CrewAI, non dell’SDK.
agent_end forza la chiusura delle pause aperte ma non degli strumenti o dei modelli, quindi un’esecuzione che muore dentro una chiamata di strumento lascia quello span aperto. Lo spegnimento normale chiude tutto ciò che è ancora aperto e lo contrassegna come incompleto. Solo un SIGKILL lo lascia in sospeso, perché nulla può essere eseguito.
Verifica in questo ordine: instrument() è stato eseguito prima di kickoff(); c’è un with failproofai_sdk.session(): attorno; crewai è versione 1.13 o più recente; FAILPROOFAI_SDK_STRICT=1 impostato, quindi un hook degradato genera un’eccezione anziché essere ingoiato.

Avanti

Come funziona

Coppie, id, ciclo di vita della sessione e consegna.

Leggi una traccia

Segui la causalità attraverso la sessione che hai appena acquisito.

Altri framework

LangGraph, LlamaIndex, Pydantic AI e agenti personalizzati.