Instalação
Instrumentação
session_id e agent_id. Os escopos vinculam identidade em variáveis de contexto e cada chamada de evento a lê de volta, então você nunca precisa passar ids pelas suas funções.
Os três funcionam com async with assim como com with.
Aninhar agentes constrói a árvore. parent_id e profundidade são calculados a partir da pilha:
Como um escopo é fechado
agent() trata exceções para você:
agent_end, porque o dashboard fecha o span em agent_end e qualquer coisa depois disso não é atribuída a nada. Um cancelamento não é uma falha, então execuções canceladas não poluem a superfície de erros. A exceção sempre é relançada: um escopo nunca a engole.
Os métodos de evento
Quinze métodos em seis famílias. A maioria vem em pares — você emite o abridor, depois o fechador, e o SDK mede o span entre eles.Exemplo
Um loop de chamada de ferramentas contra a API da OpenAI, sem framework de agentes:docs/manual/examples/.
Threads e async
Variáveis de contexto se propagam automaticamente para tarefas asyncio. Elas não se propagam para novas threads, porque uma thread começa com um contexto vazio.propagate(), os eventos do worker lançam um TypeError indicando a correção, em vez de serem associados a nenhuma sessão. Isso é intencional: um evento sem sessão é ignorado pelo ingest e respondido com 200, que é a falha silenciosa que a camada de identidade existe para evitar.
Instrumentar um framework sem adaptador
Todo framework de agentes oferece as mesmas três costuras. Mapeie-as e você terá um trace completo — os quatro adaptadores fornecidos não fazem nada além disso.Delimite a execução
Delimite cada ferramenta
Emparelhe cada chamada de modelo
Por que não há adaptador para AutoGen
Por que não há adaptador para AutoGen
autogen-corenão é mantido desde setembro de 2025.- O AG2 não expõe nenhum ponto de registro global equivalente aos hooks dos outros frameworks, então instrumentá-lo significa envolver cada agente em cada local de construção.
Indo mais fundo
Como a gravação realmente funciona. Nada disso é necessário para começar.Como uma gravação se parece, por framework
Como uma gravação se parece, por framework
- LangGraph
- CrewAI
- LlamaIndex
- Pydantic AI
- Custom agents
Como uma sessão começa e termina
Como uma sessão começa e termina
session_id.O status é derivado da forma do trace:agent_end para você, e no encerramento fecham tudo que ainda estiver aberto e marcam como incompleto — uma execução com crash se resolve como done com uma lacuna visível, em vez de ficar pendente.interrupt() do LangGraph pausa a execução, o span raiz permanece aberto deliberadamente, e a chamada de retomada o fecha. Ambas as chamadas são uma única sessão.Identidade: session_id, agent_id e quem os gera
Identidade: session_id, agent_id e quem os gera
session_id e agent_id são opcionais em todo método de evento. Quando omitidos, são resolvidos a partir do escopo envolvente:TypeError indicando a correção, em vez de emitir um evento sem sessão, que o ingest ignoraria enquanto responderia 200.Os escopos vinculam identidade em variáveis de contexto. Essas se propagam automaticamente para tarefas asyncio, mas não para novas threads — envolva um worker em failproofai_sdk.propagate().Quem gera qual id
Como adaptadores resolvem session_id
O primeiro match vence:- Uma opção
session_idexplícita - Metadados por chamada
- O escopo
session()envolvente - Metadados do framework
- O próprio id de execução do framework
Mantenha agent_id com baixa cardinalidade
É a faceta principal em toda superfície do dashboard, e uma coluna LowCardinality(String). Um valor por execução degrada a coluna e preenche o dropdown de filtros com uma entrada por execução.Os adaptadores protegem essa coluna para você:fw_agent_id / fw_run_id, onde permanece consultável sem ser uma faceta.Tipos de evento, agrupados — e o que cada framework registra
Tipos de evento, agrupados — e o que cada framework registra
human_pause e human_interrupt descrevem uma pessoa agindo sobre o agente, o que nenhum framework sinaliza — emita-os você mesmo.Pares, correlação e duração
Pares, correlação e duração
Regras de correlação
- Reutilize o mesmo
tool_call_id,hook_id,pause_idouinput_idpara o evento de conclusão correspondente. - O SDK calcula
duration_msparatool_result,hook_completed,agent_resumeehuman_input. Passá-lo nesses métodos lançaValueError. duration_msé aceito emmodel_response, porque apenas quem chama conhece a latência real do provedor. Deve ser um inteiro — um float lançaValueErrorno ponto de chamada, porque o servidor lê a coluna como um inteiro sem sinal de 32 bits e armazenaria NULL para qualquer outro valor.- Chaves de correlação têm escopo por tipo e sessão, então uma chamada de ferramenta e um hook podem compartilhar um id com segurança, e duas sessões concorrentes podem reutilizar os mesmos ids sem colisão. Elas não têm escopo por agente: um par aberto sob um agente e fechado sob outro ainda correlaciona, que é o caso comum em frameworks multi-agente.
request_idemparelhamodel_requestcommodel_response. Sem ele, eventos de modelo são emparelhados em ordem por agente, então chamadas concorrentes se desemparelham.- Um par dividido entre processos ainda correlaciona no downstream, mas o SDK não pode calcular sua duração em processo.
- O mapa pendente armazena no máximo 10.000 inícios e remove a entrada mais antiga quando cheio.
O que há no pacote e como instrument() encontra seu framework
O que há no pacote e como instrument() encontra seu framework
failproofai-sdk instala tudo, incluindo os quatro adaptadores. Os extras instalam o framework, não o adaptador.import failproofai_sdk é contratualmente de dependência zero, verificado por um teste que instala o wheel compilado com --no-deps e outro que prova que nenhum framework alcança sys.modules.sys.modules, não a lista de pacotes instalados, então um framework que você tem instalado mas nunca importou não é instrumentado e nunca é importado em seu nome. Para ver o que está conectado:instrument("crewai") em uma máquina sem CrewAI não lança exceção. Registra um aviso e retorna (), então um framework ausente nunca derruba um processo que também instrumenta outros.O aviso carrega o ImportError subjacente, e essa mensagem indica o comando exato de instalação — então a correção está nos seus logs, não oculta.FAILPROOFAI_SDK_STRICT=1 para que ele lance uma exceção em vez disso. Essa flag é lida uma vez e armazenada em cache, então exporte-a antes de seu processo iniciar em vez de defini-la durante a execução.Como os eventos chegam ao Cloud
Como os eventos chegam ao Cloud
.tmp primeiro, depois fsync, depois um rename atômico:.jsonl, então nunca pode ler um arquivo parcialmente escrito. O nome do arquivo carrega um timestamp, id de processo e número de sequência, então dois processos fazendo flush no mesmo milissegundo não podem colidir. A fila tem capacidade máxima de 10.000 eventos; além disso, descarta os mais antigos e registra um log.O daemon envia seus lotes. Ele não os abre nem os reescreve.ls compete com o collector e mostra uma fração do que você emitiu — indistinguível de um SDK que não gravou nada.Para confirmar que os eventos realmente chegaram, verifique o dashboard. Para observar o spool enchendo, pare o daemon primeiro.Quando a instrumentação falha
Quando a instrumentação falha
try e tudo que o SDK faz acontece fora dele.FAILPROOFAI_SDK_STRICT=1 para tornar uma falha engolida visível.Problemas comuns
Um span nunca termina
Um span nunca termina
model_request sem model_response, ou um tool_use sem tool_result. Use os escopos, que garantem o par mesmo quando o corpo lança uma exceção. Se você chamar os métodos de evento diretamente, use try e finally.Passar duration_ms lança ValueError
Passar duration_ms lança ValueError
tool_result, hook_completed, agent_resume e human_input. É aceito em model_response, porque apenas você conhece a latência real do provedor, e deve ser um inteiro.Eventos de uma thread worker lançam TypeError
Eventos de uma thread worker lançam TypeError
failproofai_sdk.propagate(). Veja Threads e async.Um campo extra desapareceu ou sobrescreveu algo
Um campo extra desapareceu ou sobrescreveu algo
model ou outcome, o sobrescreveria e alteraria uma coluna armazenada. Use um namespace nos seus; os adaptadores usam o prefixo fw_.O filtro de agentes tem milhares de entradas
O filtro de agentes tem milhares de entradas
agent_id é uma faceta de baixa cardinalidade e você colocou um id de execução nela. Use um nome de role ou nó e coloque o id real em um campo de payload.
