langchain-core, por lo que instrumentar uno instrumenta el otro.
Instalación
failproofai-sdk[langchain].
Compatible con: langchain-core 1.4.7 a 2.0, langgraph 1.2 a 2.0. Fuera de ese rango, el adaptador se instala igualmente y emite una advertencia única.
Instrumentar
instrument() registra un tracer a través de langchain_core.tracers.context.register_configure_hook. LangChain lo inyecta en cada gestor de callbacks que construye, de modo que grafos, herramientas y modelos quedan capturados sin modificar ningún punto de llamada — incluidos los que están dentro de bibliotecas que no escribiste tú.
Qué se registra
Un nodo se convierte en un hook, no en un agente anidado.
agent_id es la faceta principal en todas las vistas del dashboard — promover retrieve, grade_documents y should_continue a agentes lo saturaría y etiquetaría la sesión según el nodo que se ejecutara primero.
Los spans de hook se renderizan igual y siguen ofreciendo una vista de latencia por nodo.
Nombra tus nodos como quieras. La ejecución de un nodo se identifica por su forma — una ejecución no hoja que lleva la etiqueta de paso propia de LangGraph — nunca por su nombre.
Nombrar un nodo con el nombre de lo que ejecuta solía hacer desaparecer los eventos de ese elemento. Ya no lo hace.
Streaming
.stream() y .astream() no emiten eventos por token. Se agrupan en el model_response de cierre:
Conteos de tokens en una respuesta en streaming
Es un asunto aparte y fácil de pasar por alto: OpenAI solo envía el uso en una respuesta en streaming cuando se le solicita.model_response llega sin conteos de tokens.
Ejemplo
Nombra tus spans
Por defecto, el span raíz toma el nombre propio del grafo. Envuélvelo para obtener la etiqueta que elijas:parent_id:
agent_id con baja cardinalidad. Usa un rol o nombre de nodo, nunca un UUID ni una cadena generada por ejecución.
Controla la sesión
El id de sesión se resuelve en este orden, ganando el primer match:instrument("langchain", session_id=...)config={"metadata": {"failproofai_sdk_session_id": ...}}- El contexto envolvente
failproofai_sdk.session() metadata["session_id"],metadata["conversation_id"], ometadata["thread_id"]- El id de la ejecución raíz
Opciones
capture_content=False para datos regulados. La estructura, tiempos, conteos de tokens, nombres de herramientas y resultados siguen registrándose; los cuerpos de los mensajes no.
include_chains aplica solo a ejecuciones anidadas. Un runnable que invoques en el nivel superior es la raíz de la sesión, por lo que se convierte en el span del agente en lugar de un par de hooks, y nombrarlo aquí no tiene efecto.
Human in the loop
interrupt() produce cuatro eventos, y ninguno de los dos pares es redundante:
human_wait a human_input se lleva el prompt y la respuesta (ambos se eliminan con capture_content=False, junto con las fuentes de documentos de recuperación — el conteo de documentos sobrevive). El par agent_pause a agent_resume es el único que registra el tiempo en pausa, por lo que sin él una espera humana de diez minutos se contabiliza como tiempo activo del agente. El span raíz permanece abierto durante el intervalo, manteniendo ambas llamadas en una sola sesión.
Problemas comunes
Una herramienta que lanza excepción aborta todo el grafo
Una herramienta que lanza excepción aborta todo el grafo
create_react_agent propaga la excepción. Para permitir que el modelo vea el fallo y continúe, construye el nodo de herramientas explícitamente:tool_result con error en cualquier caso. Esto solo decide si la ejecución sobrevive al error.Aparece un agente con el nombre de la clase del modelo en el trace
Aparece un agente con el nombre de la clase del modelo en el trace
Un
llm.invoke() directo fuera de cualquier grafo no tiene ejecución padre, por lo que abre un span raíz y emite su par de modelo dentro de él. El dashboard asigna las hojas a un agente abierto, así que el span es intencional. Nómbralo:Cada evento aparece dos veces
Cada evento aparece dos veces
Pasaste un handler de Failproof en
config={"callbacks": [...]} además de llamar a instrument(). Elimínalo. El configure hook ya cubre todos los gestores de callbacks del proceso.Las aprobaciones humanas se muestran como errores
Las aprobaciones humanas se muestran como errores
No es así. LangGraph lanza
GraphInterrupt por el mismo camino que una excepción real, por lo que cada pausa llega al tracer como un callback de error. Sin embargo, cualquier subclase de GraphBubbleUp se trata como flujo de control, así que una aprobación no genera un error en rojo.No se registra nada
No se registra nada
Verifica en este orden: que
instrument() se ejecutó antes del grafo; que hay un with failproofai_sdk.session(): alrededor de la llamada; que FAILPROOFAI_SDK_STRICT=1 está configurado, para que un hook degradado lance error en lugar de ser silenciado.Siguientes pasos
Cómo funciona
Pares, ids, ciclo de vida de sesión y entrega.
Leer un trace
Sigue la causalidad a través de la sesión que acabas de capturar.
Otros frameworks
CrewAI, LlamaIndex, Pydantic AI y agentes personalizados.

