Visão Geral
O CrewAI oferece um sistema de eventos poderoso que permite escutar e reagir a diversos eventos que ocorrem durante a execução do seu Crew. Esse recurso possibilita a criação de integrações personalizadas, soluções de monitoramento, sistemas de log ou qualquer outra funcionalidade que precise ser acionada com base nos eventos internos do CrewAI.Como Funciona
O CrewAI utiliza uma arquitetura de event bus para emitir eventos ao longo do ciclo de vida da execução. O sistema de eventos é construído a partir dos seguintes componentes:- CrewAIEventsBus: Um event bus singleton que gerencia o registro e emissão de eventos
- BaseEvent: Classe base para todos os eventos do sistema
- BaseEventListener: Classe base abstrata para criar listeners de evento personalizados
O CrewAI AMP fornece o recurso Prompt Tracing, que aproveita o sistema de eventos para rastrear, armazenar e visualizar todos os prompts, respostas e metadados associados. Isso proporciona poderosas capacidades de depuração e transparência nas operações dos seus agentes.
Com o Prompt Tracing você pode:

- Visualizar o histórico completo de todos os prompts enviados ao seu LLM
- Monitorar o uso de tokens e custos
- Depurar falhas de raciocínio dos agentes
- Compartilhar sequências de prompts com sua equipe
- Comparar diferentes estratégias de prompts
- Exportar rastreamentos para compliance e auditoria
Criando um Listener de Evento Personalizado
Para criar um listener de evento personalizado, você precisa:- Criar uma classe que herde de
BaseEventListener - Implementar o método
setup_listeners - Registrar handles para os eventos de seu interesse
- Instanciar seu listener no arquivo apropriado
Registrando Corretamente Seu Listener
Apenas definir sua classe de listener não é suficiente. É necessário criar uma instância dela e garantir que ela seja importada na sua aplicação. Isso garante que:- Os event handlers estejam registrados no event bus
- A instância do listener permaneça em memória (não seja coletada pelo garbage collector)
- O listener esteja ativo quando os eventos forem emitidos
Opção 1: Importar e Instanciar no Seu Crew ou Implementação de Flow
O mais importante é criar uma instância do seu listener no arquivo onde seu Crew ou Flow está definido e executado:Para Aplicações Baseadas em Crew
Crie e importe seu listener no início do arquivo de implementação do seu Crew:Para Aplicações Baseadas em Flow
Crie e importe seu listener no início do arquivo de implementação do seu Flow:Opção 2: Criar um Pacote para Seus Listeners
Para uma abordagem mais estruturada, especialmente se houver múltiplos listeners:- Crie um pacote para seus listeners:
- Em
my_custom_listener.py, defina sua classe de listener e crie uma instância:
- Em
__init__.py, importe as instâncias dos listeners para garantir seu carregamento:
- Importe seu pacote de listeners no arquivo do seu Crew ou Flow:
Tipos de Eventos Disponíveis
O CrewAI fornece uma ampla variedade de eventos para escuta:Eventos de Crew
- CrewKickoffStartedEvent: Emitido quando um Crew inicia a execução
- CrewKickoffCompletedEvent: Emitido quando um Crew conclui a execução
- CrewKickoffFailedEvent: Emitido quando um Crew falha ao concluir a execução
- CrewTestStartedEvent: Emitido ao iniciar o teste de um Crew
- CrewTestCompletedEvent: Emitido ao concluir o teste de um Crew
- CrewTestFailedEvent: Emitido ao falhar no teste de um Crew
- CrewTrainStartedEvent: Emitido ao iniciar o treinamento de um Crew
- CrewTrainCompletedEvent: Emitido ao concluir o treinamento de um Crew
- CrewTrainFailedEvent: Emitido ao falhar no treinamento de um Crew
- CrewTestResultEvent: Emitido quando um resultado de teste de Crew está disponível. Contém a pontuação de qualidade, duração da execução e modelo utilizado.
Eventos de Agent
- AgentExecutionStartedEvent: Emitido quando um Agent inicia a execução de uma tarefa
- AgentExecutionCompletedEvent: Emitido quando um Agent conclui a execução de uma tarefa
- AgentExecutionErrorEvent: Emitido quando um Agent encontra um erro durante a execução
- LiteAgentExecutionStartedEvent: Emitido quando um LiteAgent inicia a execução. Contém as informações do agente, ferramentas e mensagens.
- LiteAgentExecutionCompletedEvent: Emitido quando um LiteAgent conclui a execução. Contém as informações do agente e a saída.
- LiteAgentExecutionErrorEvent: Emitido quando um LiteAgent encontra um erro durante a execução. Contém as informações do agente e a mensagem de erro.
- AgentEvaluationStartedEvent: Emitido quando uma avaliação de agente é iniciada. Contém o ID do agente, papel do agente, ID da tarefa opcional e número da iteração.
- AgentEvaluationCompletedEvent: Emitido quando uma avaliação de agente é concluída. Contém o ID do agente, papel do agente, ID da tarefa opcional, número da iteração, categoria da métrica e pontuação.
- AgentEvaluationFailedEvent: Emitido quando uma avaliação de agente falha. Contém o ID do agente, papel do agente, ID da tarefa opcional, número da iteração e mensagem de erro.
Eventos de Task
- TaskStartedEvent: Emitido ao iniciar a execução de uma Task
- TaskCompletedEvent: Emitido ao concluir a execução de uma Task
- TaskFailedEvent: Emitido ao falhar na execução de uma Task
- TaskEvaluationEvent: Emitido quando uma Task é avaliada
Eventos de Uso de Ferramentas
- ToolUsageStartedEvent: Emitido ao iniciar a execução de uma ferramenta
- ToolUsageFinishedEvent: Emitido ao concluir a execução de uma ferramenta
- ToolUsageErrorEvent: Emitido quando ocorre erro na execução de uma ferramenta
- ToolValidateInputErrorEvent: Emitido ao ocorrer erro de validação de entrada na ferramenta
- ToolExecutionErrorEvent: Emitido quando ocorre erro na execução de uma ferramenta
- ToolSelectionErrorEvent: Emitido ao ocorrer erro na seleção de uma ferramenta
Eventos de MCP
- MCPConnectionStartedEvent: Emitido ao iniciar a conexão com um servidor MCP. Contém o nome do servidor, URL, tipo de transporte, timeout de conexão e se é uma tentativa de reconexão.
- MCPConnectionCompletedEvent: Emitido ao conectar com sucesso a um servidor MCP. Contém o nome do servidor, duração da conexão em milissegundos e se foi uma reconexão.
- MCPConnectionFailedEvent: Emitido quando a conexão com um servidor MCP falha. Contém o nome do servidor, mensagem de erro e tipo de erro (
timeout,authentication,network, etc.). - MCPToolExecutionStartedEvent: Emitido ao iniciar a execução de uma ferramenta MCP. Contém o nome do servidor, nome da ferramenta e argumentos da ferramenta.
- MCPToolExecutionCompletedEvent: Emitido quando a execução de uma ferramenta MCP é concluída com sucesso. Contém o nome do servidor, nome da ferramenta, resultado e duração da execução em milissegundos.
- MCPToolExecutionFailedEvent: Emitido quando a execução de uma ferramenta MCP falha. Contém o nome do servidor, nome da ferramenta, mensagem de erro e tipo de erro (
timeout,validation,server_error, etc.). - MCPConfigFetchFailedEvent: Emitido quando a obtenção da configuração de um servidor MCP falha (ex.: o MCP não está conectado na sua conta, erro de API ou falha de conexão após a configuração ser obtida). Contém o slug, mensagem de erro e tipo de erro (
not_connected,api_error,connection_failed).
Eventos de Knowledge
- KnowledgeRetrievalStartedEvent: Emitido ao iniciar recuperação de conhecimento
- KnowledgeRetrievalCompletedEvent: Emitido ao concluir recuperação de conhecimento
- KnowledgeQueryStartedEvent: Emitido ao iniciar consulta de conhecimento
- KnowledgeQueryCompletedEvent: Emitido ao concluir consulta de conhecimento
- KnowledgeQueryFailedEvent: Emitido ao falhar consulta de conhecimento
- KnowledgeSearchQueryFailedEvent: Emitido ao falhar consulta de busca de conhecimento
Eventos de Guardrail do LLM
- LLMGuardrailStartedEvent: Emitido ao iniciar validação dos guardrails. Contém detalhes do guardrail aplicado e tentativas.
- LLMGuardrailCompletedEvent: Emitido ao concluir validação dos guardrails. Contém detalhes sobre sucesso/falha na validação, resultados e mensagens de erro, se houver.
- LLMGuardrailFailedEvent: Emitido quando a validação do guardrail falha. Contém a mensagem de erro e o número de tentativas.
Eventos de Flow
- FlowCreatedEvent: Emitido ao criar um Flow
- FlowStartedEvent: Emitido ao iniciar a execução de um Flow
- FlowFinishedEvent: Emitido ao concluir a execução de um Flow
- FlowPausedEvent: Emitido quando um Flow é pausado aguardando feedback humano. Contém o nome do flow, ID do flow, nome do método, estado atual, mensagem exibida ao solicitar feedback e lista opcional de resultados possíveis para roteamento.
- FlowPlotEvent: Emitido ao plotar um Flow
- MethodExecutionStartedEvent: Emitido ao iniciar a execução de um método do Flow
- MethodExecutionFinishedEvent: Emitido ao concluir a execução de um método do Flow
- MethodExecutionFailedEvent: Emitido ao falhar na execução de um método do Flow
- MethodExecutionPausedEvent: Emitido quando um método do Flow é pausado aguardando feedback humano. Contém o nome do flow, nome do método, estado atual, ID do flow, mensagem exibida ao solicitar feedback e lista opcional de resultados possíveis para roteamento.
Eventos de Human In The Loop
- FlowInputRequestedEvent: Emitido quando um Flow solicita entrada do usuário via
Flow.ask(). Contém o nome do flow, nome do método, a pergunta ou prompt exibido ao usuário e metadados opcionais (ex.: ID do usuário, canal, contexto da sessão). - FlowInputReceivedEvent: Emitido quando a entrada do usuário é recebida após
Flow.ask(). Contém o nome do flow, nome do método, a pergunta original, a resposta do usuário (ouNonese expirou), metadados opcionais da solicitação e metadados opcionais da resposta do provedor (ex.: quem respondeu, ID do thread, timestamps). - HumanFeedbackRequestedEvent: Emitido quando um método decorado com
@human_feedbackrequer entrada de um revisor humano. Contém o nome do flow, nome do método, a saída do método exibida ao humano para revisão, a mensagem exibida ao solicitar feedback e lista opcional de resultados possíveis para roteamento. - HumanFeedbackReceivedEvent: Emitido quando um humano fornece feedback em resposta a um método decorado com
@human_feedback. Contém o nome do flow, nome do método, o texto bruto do feedback fornecido pelo humano e a string de resultado consolidada (se emit foi especificado).
Eventos de LLM
- LLMCallStartedEvent: Emitido ao iniciar uma chamada LLM
- LLMCallCompletedEvent: Emitido ao concluir uma chamada LLM
- LLMCallFailedEvent: Emitido ao falhar uma chamada LLM
- LLMStreamChunkEvent: Emitido para cada chunk recebido durante respostas em streaming do LLM
- LLMThinkingChunkEvent: Emitido quando um chunk de pensamento/raciocínio é recebido de um modelo de pensamento. Contém o texto do chunk e ID de resposta opcional.
Eventos de Memória
- MemoryQueryStartedEvent: Emitido quando uma consulta de memória é iniciada. Contém a consulta, limite e threshold de pontuação opcional.
- MemoryQueryCompletedEvent: Emitido quando uma consulta de memória é concluída com sucesso. Contém a consulta, resultados, limite, threshold de pontuação e tempo de execução da consulta.
- MemoryQueryFailedEvent: Emitido quando uma consulta de memória falha. Contém a consulta, limite, threshold de pontuação e mensagem de erro.
- MemorySaveStartedEvent: Emitido quando uma operação de salvamento de memória é iniciada. Contém o valor a ser salvo, metadados e papel do agente opcional.
- MemorySaveCompletedEvent: Emitido quando uma operação de salvamento de memória é concluída com sucesso. Contém o valor salvo, metadados, papel do agente e tempo de salvamento.
- MemorySaveFailedEvent: Emitido quando uma operação de salvamento de memória falha. Contém o valor, metadados, papel do agente e mensagem de erro.
- MemoryRetrievalStartedEvent: Emitido quando a recuperação de memória para um prompt de tarefa é iniciada. Contém o ID da tarefa opcional.
- MemoryRetrievalCompletedEvent: Emitido quando a recuperação de memória para um prompt de tarefa é concluída com sucesso. Contém o ID da tarefa, conteúdo da memória e tempo de execução da recuperação.
- MemoryRetrievalFailedEvent: Emitido quando a recuperação de memória para um prompt de tarefa falha. Contém o ID da tarefa opcional e mensagem de erro.
Eventos de Raciocínio
- AgentReasoningStartedEvent: Emitido quando um agente começa a raciocinar sobre uma tarefa. Contém o papel do agente, ID da tarefa e número da tentativa.
- AgentReasoningCompletedEvent: Emitido quando um agente finaliza seu processo de raciocínio. Contém o papel do agente, ID da tarefa, o plano produzido e se o agente está pronto para prosseguir.
- AgentReasoningFailedEvent: Emitido quando o processo de raciocínio falha. Contém o papel do agente, ID da tarefa e mensagem de erro.
Eventos de Observação
- StepObservationStartedEvent: Emitido quando o Planner começa a observar o resultado de um passo. Disparado após cada execução de passo, antes da chamada LLM de observação. Contém o papel do agente, número do passo e descrição do passo.
- StepObservationCompletedEvent: Emitido quando o Planner finaliza a observação do resultado de um passo. Contém se o passo foi concluído com sucesso, informações-chave aprendidas, se o plano restante ainda é válido, se é necessário um replanejamento completo e refinamentos sugeridos.
- StepObservationFailedEvent: Emitido quando a chamada LLM de observação falha. O sistema continua o plano por padrão. Contém a mensagem de erro.
- PlanRefinementEvent: Emitido quando o Planner refina descrições de passos futuros sem replanejamento completo. Contém o número de passos refinados e os refinamentos aplicados.
- PlanReplanTriggeredEvent: Emitido quando o Planner dispara um replanejamento completo porque o plano restante foi considerado fundamentalmente incorreto. Contém o motivo do replanejamento, contagem de replanejamentos e número de passos concluídos preservados.
- GoalAchievedEarlyEvent: Emitido quando o Planner detecta que o objetivo foi alcançado antecipadamente e os passos restantes serão ignorados. Contém o número de passos restantes e passos concluídos.
Eventos A2A (Agent-to-Agent)
Eventos de Delegação
- A2ADelegationStartedEvent: Emitido quando a delegação A2A é iniciada. Contém a URL do endpoint, descrição da tarefa, ID do agente, ID do contexto, se é multiturn, número do turno, metadados do agent card, versão do protocolo, informações do provedor e ID da skill opcional.
- A2ADelegationCompletedEvent: Emitido quando a delegação A2A é concluída. Contém o status de conclusão (
completed,input_required,failed, etc.), resultado, mensagem de erro, ID do contexto e metadados do agent card. - A2AParallelDelegationStartedEvent: Emitido quando a delegação paralela para múltiplos agentes A2A é iniciada. Contém a lista de endpoints e a descrição da tarefa.
- A2AParallelDelegationCompletedEvent: Emitido quando a delegação paralela para múltiplos agentes A2A é concluída. Contém a lista de endpoints, contagem de sucessos, contagem de falhas e resumo dos resultados.
Eventos de Conversação
- A2AConversationStartedEvent: Emitido uma vez no início de uma conversação multiturn A2A, antes da primeira troca de mensagens. Contém o ID do agente, endpoint, ID do contexto, metadados do agent card, versão do protocolo e informações do provedor.
- A2AMessageSentEvent: Emitido quando uma mensagem é enviada ao agente A2A. Contém o conteúdo da mensagem, número do turno, ID do contexto, ID da mensagem e se é multiturn.
- A2AResponseReceivedEvent: Emitido quando uma resposta é recebida do agente A2A. Contém o conteúdo da resposta, número do turno, ID do contexto, ID da mensagem, status e se é a resposta final.
- A2AConversationCompletedEvent: Emitido uma vez ao final de uma conversação multiturn A2A. Contém o status final (
completedoufailed), resultado final, mensagem de erro, ID do contexto e número total de turnos.
Eventos de Streaming
- A2AStreamingStartedEvent: Emitido quando o modo streaming é iniciado para delegação A2A. Contém o ID da tarefa, ID do contexto, endpoint, número do turno e se é multiturn.
- A2AStreamingChunkEvent: Emitido quando um chunk de streaming é recebido. Contém o texto do chunk, índice do chunk, se é o chunk final, ID da tarefa, ID do contexto e número do turno.
Eventos de Polling e Push Notification
- A2APollingStartedEvent: Emitido quando o modo polling é iniciado para delegação A2A. Contém o ID da tarefa, ID do contexto, intervalo de polling em segundos e endpoint.
- A2APollingStatusEvent: Emitido em cada iteração de polling. Contém o ID da tarefa, ID do contexto, estado atual da tarefa, segundos decorridos e contagem de polls.
- A2APushNotificationRegisteredEvent: Emitido quando um callback de push notification é registrado. Contém o ID da tarefa, ID do contexto, URL do callback e endpoint.
- A2APushNotificationReceivedEvent: Emitido quando uma push notification é recebida do agente A2A remoto. Contém o ID da tarefa, ID do contexto e estado atual.
- A2APushNotificationSentEvent: Emitido quando uma push notification é enviada para uma URL de callback. Contém o ID da tarefa, ID do contexto, URL do callback, estado, se a entrega foi bem-sucedida e mensagem de erro opcional.
- A2APushNotificationTimeoutEvent: Emitido quando a espera por push notification expira. Contém o ID da tarefa, ID do contexto e duração do timeout em segundos.
Eventos de Conexão e Autenticação
- A2AAgentCardFetchedEvent: Emitido quando um agent card é obtido com sucesso. Contém o endpoint, nome do agente, metadados do agent card, versão do protocolo, informações do provedor, se foi do cache e tempo de busca em milissegundos.
- A2AAuthenticationFailedEvent: Emitido quando a autenticação com um agente A2A falha. Contém o endpoint, tipo de autenticação tentada (ex.:
bearer,oauth2,api_key), mensagem de erro e código de status HTTP. - A2AConnectionErrorEvent: Emitido quando ocorre um erro de conexão durante a comunicação A2A. Contém o endpoint, mensagem de erro, tipo de erro (ex.:
timeout,connection_refused,dns_error), código de status HTTP e a operação sendo tentada. - A2ATransportNegotiatedEvent: Emitido quando o protocolo de transporte é negociado com um agente A2A. Contém o transporte negociado, URL negociada, fonte de seleção (
client_preferred,server_preferred,fallback) e transportes suportados pelo cliente/servidor. - A2AContentTypeNegotiatedEvent: Emitido quando os tipos de conteúdo são negociados com um agente A2A. Contém os modos de entrada/saída do cliente/servidor, modos de entrada/saída negociados e se a negociação foi bem-sucedida.
Eventos de Artefatos
- A2AArtifactReceivedEvent: Emitido quando um artefato é recebido de um agente A2A remoto. Contém o ID da tarefa, ID do artefato, nome do artefato, descrição, tipo MIME, tamanho em bytes e se o conteúdo deve ser concatenado.
Eventos de Tarefa do Servidor
- A2AServerTaskStartedEvent: Emitido quando a execução de uma tarefa do servidor A2A é iniciada. Contém o ID da tarefa e ID do contexto.
- A2AServerTaskCompletedEvent: Emitido quando a execução de uma tarefa do servidor A2A é concluída. Contém o ID da tarefa, ID do contexto e resultado.
- A2AServerTaskCanceledEvent: Emitido quando a execução de uma tarefa do servidor A2A é cancelada. Contém o ID da tarefa e ID do contexto.
- A2AServerTaskFailedEvent: Emitido quando a execução de uma tarefa do servidor A2A falha. Contém o ID da tarefa, ID do contexto e mensagem de erro.
Eventos de Ciclo de Vida do Contexto
- A2AContextCreatedEvent: Emitido quando um contexto A2A é criado. Contextos agrupam tarefas relacionadas em uma conversação ou workflow. Contém o ID do contexto e timestamp de criação.
- A2AContextExpiredEvent: Emitido quando um contexto A2A expira devido ao TTL. Contém o ID do contexto, timestamp de criação, idade em segundos e contagem de tarefas.
- A2AContextIdleEvent: Emitido quando um contexto A2A fica inativo (sem atividade pelo threshold configurado). Contém o ID do contexto, tempo de inatividade em segundos e contagem de tarefas.
- A2AContextCompletedEvent: Emitido quando todas as tarefas em um contexto A2A são concluídas. Contém o ID do contexto, total de tarefas e duração em segundos.
- A2AContextPrunedEvent: Emitido quando um contexto A2A é podado (deletado). Contém o ID do contexto, contagem de tarefas e idade em segundos.
Estrutura dos Handlers de Evento
Cada handler de evento recebe dois parâmetros:- source: O objeto que emitiu o evento
- event: A instância do evento, contendo dados específicos do evento
BaseEvent e incluem:
- timestamp: O horário em que o evento foi emitido
- type: Identificador do tipo do evento
CrewKickoffCompletedEvent inclui os campos crew_name e output.
Uso Avançado: Handlers Escopados
Para lidar temporariamente com eventos (útil para testes ou operações específicas), você pode usar o context managerscoped_handlers:
Casos de Uso
Listeners de evento podem ser usados para várias finalidades:- Log e Monitoramento: Monitore a execução do seu Crew e registre eventos importantes
- Analytics: Colete dados sobre o desempenho e comportamento do seu Crew
- Depuração: Configure listeners temporários para debugar problemas específicos
- Integração: Conecte o CrewAI a sistemas externos como plataformas de monitoramento, bancos de dados ou serviços de notificação
- Comportamento Personalizado: Dispare ações personalizadas com base em eventos específicos
Boas Práticas
- Mantenha Handlers Leves: Handlers de eventos devem ser leves e evitar operações bloqueantes
- Tratamento de Erros: Implemente tratamento de erros adequado nos event handlers para evitar que exceções afetem a execução principal
- Limpeza: Se seu listener alocar recursos, garanta o devido fechamento/liberação
- Escuta Seletiva: Escute apenas eventos que realmente precisa tratar
- Testes: Teste seus listeners de evento isoladamente para garantir que se comportam conforme esperado
