Skip to main content
Um único adaptador serve para ambos. O LangGraph roda sobre o gerenciador de callbacks do langchain-core, então instrumentar um instrumento o outro.

Instalação

Para LangChain sem LangGraph, use 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.
O adaptador registra o que o framework entrega. Sem esse flag não há nada a registrar, e 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:
Para configurações multi-agente, aninhe os escopos. Cada worker se torna um span filho carregando parent_id:
Mantenha 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:
  1. instrument("langchain", session_id=...)
  2. config={"metadata": {"failproofai_sdk_session_id": ...}}
  3. O escopo failproofai_sdk.session() envolvente
  4. metadata["session_id"], metadata["conversation_id"], ou metadata["thread_id"]
  5. O id do run raiz
Ele nunca é gerado do zero, porque um id sintetizado divide um único run em várias sessões.

Opções

Defina 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:
De 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

create_react_agent propaga a exceção. Para que o modelo veja a falha e continue, construa o nó de ferramenta explicitamente:
A falha é registrada como um tool_result carregando um erro em ambos os casos. Isso apenas decide se o run sobrevive a ela.
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:
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.
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.
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.