Installa
Strumenta
session_id e agent_id. Gli ambiti vincolano l’identità su variabili di contesto e ogni chiamata di evento la legge di nuovo, quindi non devi mai passare gli id attraverso le tue funzioni.
Tutti e tre funzionano sia con async with che con with.
L’annidamento di agenti costruisce l’albero. parent_id e profondità sono calcolati dalla stack:
Come un ambito si chiude
agent() gestisce le eccezioni per te:
agent_end, perché il dashboard chiude lo span a agent_end e qualsiasi cosa dopo è attribuita a nulla. Una cancellazione non è un fallimento, quindi le esecuzioni cancellate non inquinano la superficie degli errori. L’eccezione è sempre lanciata di nuovo: un ambito non inghiotte mai.
I metodi evento
Quindici metodi in sei famiglie. La maggior parte viene in coppia — emetti l’apertura, poi la chiusura, e l’SDK misura l’intervallo tra loro.Esempio
Un ciclo di chiamata di strumenti contro l’API di OpenAI, senza framework di agenti:docs/manual/examples/.
Thread e async
Le variabili di contesto si propagano nei task asyncio automaticamente. Non si propagano nei nuovi thread, perché un thread inizia con un contesto vuoto.propagate(), gli eventi del worker generano un TypeError che nomina la correzione anziché atterrare su nessuna sessione. È intenzionale: un evento senza sessione è saltato dall’ingest e restituito 200, che è il fallimento silenzioso che il livello di identità esiste per prevenire.
Strumenta un framework senza un adapter
Ogni framework di agenti ti dà le stesse tre giunzioni. Mappale e hai una traccia completa — i quattro adapter forniti non fanno nulla di più che questo.Racchiudi l'esecuzione
Racchiudi ogni strumento
Accoppia ogni chiamata di modello
Perché non c'è un adapter AutoGen
Perché non c'è un adapter AutoGen
autogen-corenon è stata mantenuta dal settembre 2025.- AG2 non espone un punto di registrazione a livello di processo equivalente agli hook degli altri framework, quindi strumentarlo significa avvolgere ogni agente ad ogni sito di costruzione.
Approfondisci
Come la registrazione funziona effettivamente. Niente di tutto ciò è necessario per iniziare.Che aspetto ha una registrazione, per framework
Che aspetto ha una registrazione, per framework
- LangGraph
- CrewAI
- LlamaIndex
- Pydantic AI
- Agenti personalizzati
Come una sessione inizia e termina
Come una sessione inizia e termina
session_id.Lo stato è derivato dalla forma della traccia:agent_end per te, e in fase di teardown chiudono qualsiasi cosa ancora aperta e la contrassegnano come incompleta — un’esecuzione arrestata si assesta come done con un gap visibile anziché stare sospesa.interrupt() di LangGraph mette in pausa l’esecuzione, lo span radice rimane deliberatamente aperto, e la chiamata ripresa lo chiude. Entrambe le chiamate sono una sessione.Identità: session_id, agent_id, e chi li conia
Identità: session_id, agent_id, e chi li conia
session_id e agent_id sono opzionali in ogni metodo evento. Omessi, si risolvono dall’ambito che li racchiude:TypeError che nomina la correzione anziché emettere un evento senza sessione, che l’ingest salterebbe mentre restituisce 200.Gli ambiti vincolano l’identità su variabili di contesto. Queste si propagano nei task asyncio automaticamente ma non nei nuovi thread — avvolgi un worker in failproofai_sdk.propagate().Chi conia quale id
Come gli adapter risolvono session_id
La prima corrispondenza vince:- Un
session_idesplicito - Metadati per-chiamata
- L’ambito
session()che lo racchiude - Metadati del framework
- L’id di esecuzione proprio del framework
Mantieni agent_id a bassa cardinalità
È la sfaccettatura primaria su ogni superficie del dashboard, e una colonna LowCardinality(String). Un valore per-esecuzione degrada la colonna e riempie il dropdown del filtro con un’entry per esecuzione.Gli adapter difendono quella colonna per te:fw_agent_id / fw_run_id, dove rimane interrogabile senza essere una sfaccettatura.Tipi di evento, raggruppati — e quale framework registra cosa
Tipi di evento, raggruppati — e quale framework registra cosa
human_pause e human_interrupt descrivono una persona che agisce sull’agente, che nessun framework segnala — emettili tu stesso.Coppie, correlazione e durata
Coppie, correlazione e durata
Regole di correlazione
- Riutilizza lo stesso
tool_call_id,hook_id,pause_id, oinput_idper l’evento di completamento corrispondente. - L’SDK calcola
duration_mspertool_result,hook_completed,agent_resume, ehuman_input. Passarlo a questi metodi generaValueError. duration_msè accettato sumodel_response, perché solo il chiamante conosce la vera latenza del provider. Deve essere un intero — un float generaValueErroral sito di chiamata, perché il server legge la colonna come un intero senza segno a 32 bit e memorizzerebbe NULL per qualsiasi cosa diversa.- Le chiavi di correlazione sono scoped per genere e sessione, quindi una chiamata di strumento e un hook possono condividere un id in sicurezza, e due sessioni contemporanee possono riutilizzare gli stessi id senza collisioni. Non sono scoped per agente: una coppia aperta sotto un agente e chiusa sotto un altro ancora si correla, che è il caso ordinario nei framework multi-agente.
request_idaccoppiamodel_requestconmodel_response. Senza di esso, gli eventi di modello si abbinano in ordine per agente, quindi le chiamate contemporanee si abbinano male.- Una coppia divisa tra processi ancora si correla a valle, ma l’SDK non può calcolarne la durata in-processo.
- La mappa in sospeso contiene al massimo 10.000 avviamenti e elimina l’entry più vecchia quando è piena.
Cosa c'è nel pacchetto, e come instrument() trova il tuo framework
Cosa c'è nel pacchetto, e come instrument() trova il tuo framework
failproofai-sdk installa tutto, tutti e quattro gli adapter inclusi. Gli extra tirano il framework, non l’adapter.import failproofai_sdk è contrattualmente zero-dipendenza, applicato da un test che installa la wheel costruita con --no-deps e un altro che prova che nessun framework raggiunge sys.modules.sys.modules, non l’elenco dei pacchetti installati, quindi un framework che hai installato ma mai importato non è strumentato e non è mai importato per tuo conto. Per vedere cosa è collegato:instrument("crewai") su una macchina senza CrewAI non genera. Registra un avviso e restituisce (), quindi un framework mancante non fa mai cadere un processo che strumenta anche altri.L’avviso porta il sottostante ImportError, e quel messaggio nomina il comando di installazione esatto — così la correzione è nei tuoi log, non nascosta.FAILPROOFAI_SDK_STRICT=1 affinché generi al contrario. Quel flag è letto una sola volta e cachato, quindi esportalo prima che il tuo processo inizi anziché impostarlo mid-run.Come gli eventi raggiungono Cloud
Come gli eventi raggiungono Cloud
.tmp per primo, poi fsync, poi un rename atomico:.jsonl, quindi non può mai leggere un file scritto a metà. Lo stem porta un timestamp, id processo e numero di sequenza, quindi due processi che flushano nello stesso millisecondo non possono collisioni. La coda è limitata a 10.000 eventi; passato questo i più vecchi sono scartati e registrati.Il daemon spedisce i tuoi batch. Non li apre o li riscrive.ls corre il collector e mostra una frazione di ciò che hai emesso — indistinguibile da un SDK che non ha registrato nulla.Per confermare che gli eventi effettivamente atterrano, controlla il dashboard. Per osservare lo spool riempirsi, ferma prima il daemon.Quando la strumentazione fallisce
Quando la strumentazione fallisce
try e tutto ciò che l’SDK fa accade al di fuori di esso.FAILPROOFAI_SDK_STRICT=1 per rendere un fallimento ingoiato rumoroso.Problemi comuni
Uno span non finisce mai
Uno span non finisce mai
model_request senza model_response, o un tool_use senza tool_result. Usa gli ambiti, che garantiscono la coppia anche quando il corpo genera. Se chiami i metodi evento direttamente, usa try e finally.Passare duration_ms genera ValueError
Passare duration_ms genera ValueError
tool_result, hook_completed, agent_resume, e human_input. È accettato su model_response, perché solo tu conosci la vera latenza del provider, e deve essere un intero.Gli eventi da un thread di worker generano TypeError
Gli eventi da un thread di worker generano TypeError
failproofai_sdk.propagate(). Vedi Thread e async.Un campo extra è scomparso o ha sovrascritto qualcosa
Un campo extra è scomparso o ha sovrascritto qualcosa
model o outcome lo sovrascriverebbe e cambierebbe una colonna memorizzata. Spazianomina i tuoi; gli adapter usano un prefisso fw_.Il filtro dell'agente ha migliaia di entry
Il filtro dell'agente ha migliaia di entry
agent_id è una sfaccettatura a bassa cardinalità e ci hai messo un id di esecuzione. Usa un nome di ruolo o nodo e metti l’id reale in un campo di payload.
