Skip to main content
Un unico adattatore serve entrambi. LangGraph viene eseguito sul gestore di callback di langchain-core, quindi strumentare uno significa strumentare anche l’altro.

Installazione

Per LangChain senza LangGraph, usa 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.
L’adattatore registra ciò che il framework gli consegna. Senza quel flag non c’è nulla da registrare, e 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:
Per configurazioni multi-agente, annida gli scope. Ogni worker diventa uno span figlio che porta parent_id:
Mantieni 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:
  1. instrument("langchain", session_id=...)
  2. config={"metadata": {"failproofai_sdk_session_id": ...}}
  3. Lo scope failproofai_sdk.session() che lo circonda
  4. metadata["session_id"], metadata["conversation_id"], o metadata["thread_id"]
  5. L’id di esecuzione radice
Non viene mai generato da zero, perché un id sintetizzato dividerebbe un’esecuzione su più sessioni.

Opzioni

Imposta 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

create_react_agent propaga l’eccezione. Per far sì che il modello veda il fallimento e continui, costruisci il nodo tool esplicitamente:
Il fallimento viene registrato come tool_result che contiene un errore comunque. Questo decide solo se l’esecuzione sopravvive.
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:
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.
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.
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.