Skip to main content

Instalação

Suportado: crewai 1.13 a 2.0. A versão 1.13 foi a que adicionou started_event_id e normalizou o uso de tokens — ambos os quais o adaptador utiliza para parear eventos e reportar tokens.

Instrumentação

instrument() registra um listener no barramento de eventos de nível de módulo do CrewAI e inscreve um handler por classe de evento. Nada na sua crew, agentes, tarefas ou ferramentas é alterado.

O que é registrado

Uma tarefa não emite nada intencionalmente. Uma tarefa do CrewAI é um subconjunto da execução do agente que a executa; emitir ambos duplicaria cada linha e os renderizaria como irmãos. O id e o nome da tarefa são carregados nos próprios eventos do agente. Operações de memória e conhecimento são registradas como ferramentas, nomeadas pela camada que acessam, para que apareçam ao lado das suas ferramentas reais e você possa comparar a latência. Em uma crew hierárquica, o aninhamento é o que torna o trace legível:
O CrewAI associa uma execução delegada ao evento de ferramenta delegate_work_to_coworker, não diretamente ao gerente, então o adaptador segue esse link. Sem ele, cada agente aparece como irmão de todos os outros e a estrutura de delegação se perde.

Exemplo

A transição entre agentes fica visível no trace: o span do analyst fecha, o span do writer abre, e ambos ficam dentro de um único span crew.

Nomeie seus spans

agent_id vem de Agent(role=...), o que o torna uma faceta legível no dashboard.
agent_id é uma coluna de baixa cardinalidade. Um papel que contenha um id de execução ou timestamp a degrada para todas as consultas que qualquer pessoa execute. Se um papel parecer um id, o adaptador o rejeita e coloca o valor real em um campo de payload.

Controle a sessão

Resolvido nesta ordem, prevalecendo a primeira correspondência:
  1. instrument("crewai", session_id=...)
  2. O escopo failproofai_sdk.session() envolvente
  3. Um uuid4().hex gerado automaticamente, uma vez por crew ou flow
Envolva o kickoff para controlar por execução:

Opções

session_id é a única opção que este adaptador lê. Prompts e completions são sempre registrados, truncados ao limite de payload.

Human in the loop

O CrewAI possui duas superfícies de human-in-the-loop, e ambas são registradas com os mesmos quatro eventos. @human_feedback em um método de flow passa pelo barramento de eventos do CrewAI: o runtime emite um evento antes de aguardar uma pessoa e outro após a resposta. Task(human_input=True) não. Ele chama input() dentro do próprio provedor de entrada do CrewAI e não emite nenhum evento, portanto o adaptador envolve esse provedor diretamente — sem isso, toda a espera humana ficaria invisível e seria contabilizada como tempo ativo do agente. De qualquer forma, você obtém:
O par agent_pause / agent_resume é o único que alimenta o tempo pausado. Sem ele, uma espera humana de dez minutos é contabilizada como dez minutos de tempo ativo do agente.
O CrewAI não define um id de correlação em nenhum dos eventos de human-feedback, portanto o adaptador os emparelha pelo nome do flow e do método, recorrendo à pausa mais recentemente aberta como fallback. Isso é válido porque um prompt de console bloqueia. Se você implementar um provedor de feedback concorrente, defina request_id em ambos os eventos.
Como o caminho Task(human_input=True) é um wrapper em torno do provedor de entrada do CrewAI — e não uma assinatura de evento —, ele é restaurado no uninstrument() e repropaga qualquer exceção que input() lance, incluindo KeyboardInterrupt, sem alterações.

Problemas comuns

Um role contém um UUID, timestamp ou sufixo por execução. Use um papel humano estável e coloque o id específico da execução na descrição da tarefa.
O barramento de eventos é assíncrono, e kickoff() retorna antes que os últimos handlers sejam executados. Esvazie-o primeiro:
Isso é uma característica do CrewAI, não do SDK.
agent_end força o fechamento de pausas abertas, mas não de ferramentas ou modelos; portanto, uma execução que falha dentro de uma chamada de ferramenta deixa aquele span aberto. O encerramento normal fecha tudo que ainda estiver aberto e o marca como incompleto. Apenas um SIGKILL o deixa pendente, porque nada mais consegue executar.
Verifique nesta ordem: instrument() foi chamado antes de kickoff(); há um with failproofai_sdk.session(): ao redor; crewai é 1.13 ou mais recente; FAILPROOFAI_SDK_STRICT=1 está definido, para que um hook degradado lance uma exceção em vez de ser silenciado.

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

LangGraph, LlamaIndex, Pydantic AI e agentes customizados.