Instalación
llama-index-core 0.14.23 a 0.15. La versión 0.14.23 es la release donde el stream del workflow comenzó a incluir los eventos de agente tipados que este adaptador lee. Por debajo de esa versión, los nombres de los modelos y la estructura del agente desaparecen.
Instrumentación
async with como con with y producen eventos idénticos.
instrument() adjunta un manejador de eventos y un manejador de spans al dispatcher global de LlamaIndex. Juntos hacen visible el bucle del agente, no solo sus llamadas al modelo.
Conteo de tokens
FunctionAgent llama a astream_chat, y llama-index-llms-openai no envía stream_options={"include_usage": True} al hacer streaming. Por tanto, el proveedor nunca envía el chunk de uso y no hay nada que ninguna instrumentación pueda leer.
Este es un comportamiento upstream de LlamaIndex. Actívalo en tu LLM de forma explícita:
Las llamadas sin streaming (
llm.chat, llm.achat) reportan el uso sin ninguna configuración. Solo la ruta de streaming, que es la ruta predeterminada del agente, necesita esto.
Qué se registra
agent_id es el FunctionAgent.name cuando se define uno, y el nombre de la clase del workflow en caso contrario. Dentro de un AgentWorkflow, cada agente que toma un turno obtiene su propio span anidado bajo el workflow, por lo que una transferencia aparece como dos agentes en lugar de uno.
La salida de recuperación se resume en lugar de volcarse completa. Un retriever devuelve documentos, y almacenarlos en el payload introduciría tu corpus en el almacén de eventos una vez por consulta. En su lugar, se conservan el recuento, el rango de puntuaciones y fragmentos truncados.
Ejemplo
init_run, setup_agent, run_agent_step, parse_agent_output, call_tool y aggregate_tool_results. Son el propio bucle del framework, por lo que se registran como hooks en lugar de agentes, lo que mantiene agent_id con un significado claro.
Nombra tus spans
agent_id es el FunctionAgent.name cuando se define uno, y el nombre de la clase del workflow en caso contrario.
AgentWorkflow, ese nombre es también el que se usa para registrar cada transferencia:
agent_id indica qué agente realizó el trabajo y parent_id indica a qué workflow pertenecía. Un agente que devuelve el control más adelante abre un segundo turno en lugar de reabrir el primero.
Envuelve la ejecución para sobreescribirlo, o para agrupar varios agentes bajo un mismo padre:
agent_id con baja cardinalidad. Es la faceta principal en todas las vistas del dashboard, así que usa un rol o nombre de workflow, nunca un UUID ni una cadena generada por ejecución.
Controla la sesión
Este adaptador no tiene opciónsession_id. La sesión proviene del scope que la envuelve y, en caso contrario, se genera un uuid4().hex por cada ejecución del workflow:
Opciones
Humano en el bucle
Se captura cuando la espera ocurre dentro de una herramienta:ctx.wait_for_event en un paso de workflow normal no se captura. El runtime intercepta la interrupción antes de que llegue al dispatcher, por lo que el paso termina y se vuelve a ejecutar más tarde sin ninguna señal con la que identificar una pausa. El patrón FunctionAgent, que LlamaIndex documenta, espera dentro de una herramienta y se captura completamente.
Problemas comunes
Todos los conteos de tokens son nulos
Todos los conteos de tokens son nulos
Añade
additional_kwargs={"stream_options": {"include_usage": True}} a tu LLM. Consulta Conteo de tokens.El uso está disponible pero las columnas de tokens están vacías
El uso está disponible pero las columnas de tokens están vacías
LlamaIndex no tiene un campo de uso estándar. El adaptador prueba varias formas conocidas, y una integración que nombre sus contadores de forma diferente no coincidirá con ninguna de ellas.El dict sin procesar siempre se envía, así que revisa
usage en el payload para ver cómo los denominó tu proveedor.Un usage disponible junto a columnas de tokens vacías es intencionado — es preferible a mostrar un número incorrecto con confianza.La línea de tiempo está llena de setup_agent y parse_agent_output
La línea de tiempo está llena de setup_agent y parse_agent_output
Ese es el bucle de FunctionAgent, un conjunto por iteración. Filtra por nombre de hook en el dashboard. Estos tiempos de paso suelen ser la razón principal para usar este adaptador en lugar de uno solo de modelo.
No se registra nada
No se registra nada
Comprueba en este orden: que
instrument() se ejecutó antes de la ejecución; que hay un async with failproofai_sdk.session(): alrededor del await; que llama-index-core es 0.14.23 o más reciente; que FAILPROOFAI_SDK_STRICT=1 está definido, para que un hook degradado lance una excepción en lugar de ser silenciado.A continuación
Cómo funciona
Pares, ids, ciclo de vida de la sesión y entrega.
Leer una traza
Sigue la causalidad a través de la sesión que acabas de capturar.
Otros frameworks
LangGraph, CrewAI, Pydantic AI y agentes personalizados.

