Skip to main content

Instalación

Compatible con: 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

La API de agentes de LlamaIndex es asíncrona. Todos los scopes funcionan tanto con 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.
Sin un argumento adicional en tu LLM, cada contador de tokens en tu traza será nulo. Consulta Conteo de tokens a continuación.

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:
Medido en la misma ejecución y modelo: 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

El bucle del agente aparece en la traza como pares de hooks: 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.
En un AgentWorkflow, ese nombre es también el que se usa para registrar cada transferencia:
Así, 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:
Mantén 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ón session_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

Añade additional_kwargs={"stream_options": {"include_usage": True}} a tu LLM. Consulta Conteo de tokens.
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.
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.
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.