From e1c4947ec69149e3a316926e499a562d3c01da03 Mon Sep 17 00:00:00 2001 From: Lorenze Jay Date: Mon, 24 Feb 2025 11:28:33 -0800 Subject: [PATCH] feat: Add event handling for LLM call lifecycle events - Implement event listeners for LLM call events in EventListener - Add logging for LLM call start, completion, and failure events - Import and register new LLM-specific event types --- src/crewai/utilities/events/event_listener.py | 28 +++++++++++++++ src/crewai/utilities/events/llm_events.py | 36 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 src/crewai/utilities/events/llm_events.py diff --git a/src/crewai/utilities/events/event_listener.py b/src/crewai/utilities/events/event_listener.py index 0dcefcd3d..70b2953e3 100644 --- a/src/crewai/utilities/events/event_listener.py +++ b/src/crewai/utilities/events/event_listener.py @@ -4,6 +4,11 @@ from crewai.telemetry.telemetry import Telemetry from crewai.utilities import Logger from crewai.utilities.constants import EMITTER_COLOR from crewai.utilities.events.base_event_listener import BaseEventListener +from crewai.utilities.events.llm_events import ( + LLMCallCompletedEvent, + LLMCallFailedEvent, + LLMCallStartedEvent, +) from .agent_events import AgentExecutionCompletedEvent, AgentExecutionStartedEvent from .crew_events import ( @@ -253,5 +258,28 @@ class EventListener(BaseEventListener): # ) + # ----------- LLM EVENTS ----------- + + @crewai_event_bus.on(LLMCallStartedEvent) + def on_llm_call_started(source, event: LLMCallStartedEvent): + self.logger.log( + f"🤖 LLM Call Started: '{event.messages}'", + event.timestamp, + ) + + @crewai_event_bus.on(LLMCallCompletedEvent) + def on_llm_call_completed(source, event: LLMCallCompletedEvent): + self.logger.log( + f"✅ LLM Call Completed: '{event.response}'", + event.timestamp, + ) + + @crewai_event_bus.on(LLMCallFailedEvent) + def on_llm_call_failed(source, event: LLMCallFailedEvent): + self.logger.log( + f"❌ LLM Call Failed: '{event.error}'", + event.timestamp, + ) + event_listener = EventListener() diff --git a/src/crewai/utilities/events/llm_events.py b/src/crewai/utilities/events/llm_events.py new file mode 100644 index 000000000..ade8a84f4 --- /dev/null +++ b/src/crewai/utilities/events/llm_events.py @@ -0,0 +1,36 @@ +from enum import Enum +from typing import Any, Dict, List, Optional, Union + +from crewai.utilities.events.base_events import CrewEvent + + +class LLMCallType(Enum): + """Type of LLM call being made""" + + TOOL_CALL = "tool_call" + LLM_CALL = "llm_call" + + +class LLMCallStartedEvent(CrewEvent): + """Event emitted when a task starts""" + + type: str = "llm_call_started" + messages: Union[str, List[Dict[str, str]]] + tools: Optional[List[dict]] = None + callbacks: Optional[List[Any]] = None + available_functions: Optional[Dict[str, Any]] = None + + +class LLMCallCompletedEvent(CrewEvent): + """Event emitted when a task completes""" + + type: str = "llm_call_completed" + response: str + call_type: LLMCallType + + +class LLMCallFailedEvent(CrewEvent): + """Event emitted when a task fails""" + + error: str + type: str = "llm_call_failed"