langchain-core, quindi strumentare uno significa strumentare anche l’altro.
Installazione
failproofai-sdk[langchain].
Supportati: langchain-core dalla versione 1.4.7 a 2.0, langgraph dalla versione 1.2 a 2.0. Al di fuori di questo intervallo l’adattatore si installa comunque e avvisa una sola volta.
Strumentazione
instrument() registra un tracer attraverso langchain_core.tracers.context.register_configure_hook. LangChain lo injetta in ogni gestore di callback che crea, quindi grafi, tool e modelli vengono catturati senza modificare alcun sito di chiamata — inclusi quelli dentro librerie che non hai scritto.
Cosa viene registrato
Un nodo diventa un hook, non un agente annidato.
agent_id è la facet principale in ogni superficie del dashboard — promuovere retrieve, grade_documents e should_continue ad agenti creerebbe confusione, etichettando la sessione in base a qualunque nodo si esegua per primo.
Gli span hook vengono renderizzati allo stesso modo e ti forniscono comunque una vista della latenza per nodo.
Nomina i tuoi nodi come preferisci. L’esecuzione di un nodo è identificata dalla sua forma — un’esecuzione non-leaf che porta il proprio tag di step di LangGraph — mai dal suo nome.
Nominare un nodo in base a ciò che esegue causava la scomparsa degli eventi di quel elemento. Non succede più.
Streaming
.stream() e .astream() non emettono eventi per token. Si incorporano nel model_response di chiusura:
Conteggi token su una risposta in streaming
È una questione separata e facile da trascurare: OpenAI invia l’utilizzo solo su una risposta in streaming quando richiesto.model_response arriva senza conteggi di token.
Esempio
Nomina i tuoi span
Per impostazione predefinita lo span radice prende il nome del grafo stesso. Racchiudilo per ottenere un’etichetta a tua scelta:parent_id:
agent_id con bassa cardinalità. Usa un ruolo o un nome di nodo, mai un UUID o una stringa per-esecuzione.
Controlla la sessione
L’id della sessione viene risolto in questo ordine, il primo match vince:instrument("langchain", session_id=...)config={"metadata": {"failproofai_sdk_session_id": ...}}- Lo scope
failproofai_sdk.session()che lo circonda metadata["session_id"],metadata["conversation_id"], ometadata["thread_id"]- L’id di esecuzione radice
Opzioni
capture_content=False per dati regolamentati. Struttura, tempi, conteggi token, nomi di tool e risultati vengono comunque registrati; i corpi dei messaggi no.
include_chains si applica solo alle esecuzioni annidate. Un runnable che invochi a livello superiore è la radice della sessione, quindi diventa lo span dell’agente piuttosto che una coppia di hook, e nominarlo qui non ha effetto.
Uomo nel ciclo
interrupt() produce quattro eventi, e nessuna coppia è ridondante:
human_wait a human_input porta il prompt e la risposta (entrambi vengono scartati sotto capture_content=False, insieme alle fonti dei documenti di recupero — il numero di documenti sopravvive). agent_pause a agent_resume è l’unica coppia che comunica il tempo di pausa, quindi senza di essa un’attesa umana di dieci minuti viene addebitata come tempo di agente attivo. Lo span radice rimane aperto durante il gap, mantenendo entrambe le chiamate in una sessione.
Problemi comuni
Un tool che lancia un'eccezione interrompe l'intero grafo
Un tool che lancia un'eccezione interrompe l'intero grafo
create_react_agent propaga l’eccezione. Per far sì che il modello veda il fallimento e continui, costruisci il nodo tool esplicitamente:tool_result che contiene un errore comunque. Questo decide solo se l’esecuzione sopravvive.Un agente nominato dopo la classe del modello appare nella traccia
Un agente nominato dopo la classe del modello appare nella traccia
Un
llm.invoke() diretto al di fuori di qualsiasi grafo non ha esecuzione padre, quindi apre uno span radice ed emette la sua coppia di modelli al suo interno. Il dashboard assegna le foglie a un agente aperto, quindi lo span è intenzionale. Nominalo:Ogni evento appare due volte
Ogni evento appare due volte
Hai passato un handler Failproof in
config={"callbacks": [...]} e hai anche chiamato instrument(). Rimuovilo. L’hook di configurazione copre già ogni gestore di callback nel processo.Le approvazioni umane si mostrano come errori
Le approvazioni umane si mostrano come errori
Non è così. LangGraph lancia
GraphInterrupt attraverso lo stesso percorso di un’eccezione reale, quindi ogni pausa raggiunge il tracer come callback di errore. Qualsiasi sottoclasse di GraphBubbleUp è invece trattata come flusso di controllo, quindi un’approvazione non dipinge un errore rosso.Nulla viene registrato
Nulla viene registrato
Controlla in questo ordine:
instrument() è stato eseguito prima dell’esecuzione del grafo; c’è un with failproofai_sdk.session(): intorno alla chiamata; FAILPROOFAI_SDK_STRICT=1 è impostato, quindi un hook degradato solleva un’eccezione invece di essere inghiottito.Passaggi successivi
Come funziona
Coppie, id, ciclo di vita della sessione e consegna.
Leggi una traccia
Segui la causalità attraverso la sessione che hai appena catturato.
Altri framework
CrewAI, LlamaIndex, Pydantic AI e agenti personalizzati.

