langchain-core, então instrumentar um instrumento o outro.
Instalação
failproofai-sdk[langchain].
Suportado: langchain-core 1.4.7 a 2.0, langgraph 1.2 a 2.0. Fora desse intervalo, o adaptador ainda instala e emite um aviso uma vez.
Instrumentar
instrument() registra um tracer através do langchain_core.tracers.context.register_configure_hook. O LangChain o injeta em cada gerenciador de callbacks que constrói, então grafos, ferramentas e modelos são capturados sem alterar nenhum ponto de chamada — incluindo os que estão dentro de bibliotecas que você não escreveu.
O que é registrado
Um nó se torna um hook, não um agente aninhado.
agent_id é a faceta principal em todas as superfícies do dashboard — promover retrieve, grade_documents e should_continue a agentes afogaria isso e rotularia a sessão com o nome do nó que aconteceu de rodar primeiro.
Spans de hook são renderizados da mesma forma e ainda oferecem uma visão de latência por nó.
Nomeie seus nós como quiser. O run de um nó é identificado pela sua forma — um run não-folha carregando a própria tag de step do LangGraph — nunca pelo seu nome.
Nomear um nó com o nome da coisa que ele executa costumava fazer os eventos dessa coisa desaparecerem. Isso não acontece mais.
Streaming
.stream() e .astream() não emitem eventos por token. Eles são consolidados no model_response de fechamento:
Contagens de tokens em uma resposta em streaming
Assunto separado e fácil de perder: a OpenAI só envia o uso em uma resposta em streaming quando solicitado.model_response chega sem contagens de tokens.
Exemplo
Nomeie seus spans
Por padrão, o span raiz usa o próprio nome do grafo. Envolva-o para obter um rótulo de sua escolha:parent_id:
agent_id com baixa cardinalidade. Use um papel ou nome de nó, nunca um UUID ou uma string gerada por run.
Controle a sessão
O id de sessão é resolvido nesta ordem, vencendo o primeiro match:instrument("langchain", session_id=...)config={"metadata": {"failproofai_sdk_session_id": ...}}- O escopo
failproofai_sdk.session()envolvente metadata["session_id"],metadata["conversation_id"], oumetadata["thread_id"]- O id do run raiz
Opções
capture_content=False para dados regulamentados. Estrutura, tempos, contagens de tokens, nomes de ferramentas e resultados ainda são registrados; os corpos das mensagens não são.
include_chains se aplica apenas a runs aninhados. Um runnable invocado no nível superior é a raiz da sessão, então se torna o span do agente em vez de um par de hook, e nomeá-lo aqui não tem efeito.
Humano no loop
interrupt() produz quatro eventos, e nenhum par é redundante:
human_wait a human_input carrega o prompt e a resposta (ambos são removidos com capture_content=False, assim como fontes de documentos de retrieval — a contagem de documentos sobrevive). De agent_pause a agent_resume é o único par que alimenta o tempo em pausa, então sem ele uma espera humana de dez minutos é contabilizada como tempo ativo do agente. O span raiz permanece aberto durante o intervalo, mantendo ambas as chamadas em uma única sessão.
Problemas comuns
Uma ferramenta que lança exceção aborta o grafo inteiro
Uma ferramenta que lança exceção aborta o grafo inteiro
create_react_agent propaga a exceção. Para que o modelo veja a falha e continue, construa o nó de ferramenta explicitamente:tool_result carregando um erro em ambos os casos. Isso apenas decide se o run sobrevive a ela.Um agente nomeado com o nome da classe do modelo aparece no trace
Um agente nomeado com o nome da classe do modelo aparece no trace
Um
llm.invoke() direto fora de qualquer grafo não tem run pai, então abre um span raiz e emite seu par de modelo dentro dele. O dashboard parenteia folhas a um agente aberto, então o span é intencional. Nomeie-o:Cada evento aparece duas vezes
Cada evento aparece duas vezes
Você passou um handler Failproof em
config={"callbacks": [...]} além de chamar instrument(). Remova-o. O configure hook já cobre todos os gerenciadores de callback no processo.Aprovações humanas aparecem como erros
Aprovações humanas aparecem como erros
Não aparecem. O LangGraph lança
GraphInterrupt pelo mesmo caminho que uma exceção real, então toda pausa chega ao tracer como um callback de erro. Qualquer subclasse de GraphBubbleUp é tratada como fluxo de controle em vez disso, então uma aprovação não pinta um erro vermelho.Nada é registrado
Nada é registrado
Verifique nesta ordem:
instrument() foi executado antes do grafo; há um with failproofai_sdk.session(): em torno da chamada; FAILPROOFAI_SDK_STRICT=1 está definido, para que um hook degradado lance em vez de ser engolido silenciosamente.Próximos passos
Como funciona
Pares, ids, ciclo de vida da sessão e entrega.
Leia um trace
Siga a causalidade pela sessão que você acabou de capturar.
Outros frameworks
CrewAI, LlamaIndex, Pydantic AI e agentes customizados.

