mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-01-09 16:18:30 +00:00
Enhance EventListener with singleton pattern and color configuration
- Implement singleton pattern for EventListener to ensure single instance - Add default color configuration using EMITTER_COLOR from constants - Modify log method calls to use default color and remove redundant color parameters - Improve initialization logic to prevent multiple initializations
This commit is contained in:
@@ -4,3 +4,4 @@ DEFAULT_SCORE_THRESHOLD = 0.35
|
|||||||
KNOWLEDGE_DIRECTORY = "knowledge"
|
KNOWLEDGE_DIRECTORY = "knowledge"
|
||||||
MAX_LLM_RETRY = 3
|
MAX_LLM_RETRY = 3
|
||||||
MAX_FILE_NAME_LENGTH = 255
|
MAX_FILE_NAME_LENGTH = 255
|
||||||
|
EMITTER_COLOR = "bold_blue"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ from pydantic import PrivateAttr
|
|||||||
|
|
||||||
from crewai.telemetry.telemetry import Telemetry
|
from crewai.telemetry.telemetry import Telemetry
|
||||||
from crewai.utilities import Logger
|
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.base_event_listener import BaseEventListener
|
||||||
|
|
||||||
from .agent_events import AgentExecutionCompletedEvent, AgentExecutionStartedEvent
|
from .agent_events import AgentExecutionCompletedEvent, AgentExecutionStartedEvent
|
||||||
@@ -33,14 +34,22 @@ from .tool_usage_events import (
|
|||||||
|
|
||||||
|
|
||||||
class EventListener(BaseEventListener):
|
class EventListener(BaseEventListener):
|
||||||
|
_instance = None
|
||||||
_telemetry: Telemetry = PrivateAttr(default_factory=lambda: Telemetry())
|
_telemetry: Telemetry = PrivateAttr(default_factory=lambda: Telemetry())
|
||||||
logger = Logger(verbose=True)
|
logger = Logger(verbose=True, default_color=EMITTER_COLOR)
|
||||||
color = "bold_blue"
|
|
||||||
|
def __new__(cls):
|
||||||
|
if cls._instance is None:
|
||||||
|
cls._instance = super().__new__(cls)
|
||||||
|
cls._instance._initialized = False
|
||||||
|
return cls._instance
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
if not hasattr(self, "_initialized") or not self._initialized:
|
||||||
self._telemetry = Telemetry()
|
super().__init__()
|
||||||
self._telemetry.set_tracer()
|
self._telemetry = Telemetry()
|
||||||
|
self._telemetry.set_tracer()
|
||||||
|
self._initialized = True
|
||||||
|
|
||||||
# Crew Events: kickoff, test, train
|
# Crew Events: kickoff, test, train
|
||||||
def setup_listeners(self, crewai_event_bus):
|
def setup_listeners(self, crewai_event_bus):
|
||||||
@@ -49,7 +58,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"🚀 Crew '{event.crew_name}' started",
|
f"🚀 Crew '{event.crew_name}' started",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
self._telemetry.crew_execution_span(source, event.inputs)
|
self._telemetry.crew_execution_span(source, event.inputs)
|
||||||
|
|
||||||
@@ -60,7 +68,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"✅ Crew '{event.crew_name}' completed",
|
f"✅ Crew '{event.crew_name}' completed",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@crewai_event_bus.on(CrewKickoffFailedEvent)
|
@crewai_event_bus.on(CrewKickoffFailedEvent)
|
||||||
@@ -68,7 +75,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"❌ Crew '{event.crew_name}' failed",
|
f"❌ Crew '{event.crew_name}' failed",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@crewai_event_bus.on(CrewTestStartedEvent)
|
@crewai_event_bus.on(CrewTestStartedEvent)
|
||||||
@@ -83,7 +89,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"🚀 Crew '{event.crew_name}' started test",
|
f"🚀 Crew '{event.crew_name}' started test",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@crewai_event_bus.on(CrewTestCompletedEvent)
|
@crewai_event_bus.on(CrewTestCompletedEvent)
|
||||||
@@ -91,7 +96,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"✅ Crew '{event.crew_name}' completed test",
|
f"✅ Crew '{event.crew_name}' completed test",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@crewai_event_bus.on(CrewTestFailedEvent)
|
@crewai_event_bus.on(CrewTestFailedEvent)
|
||||||
@@ -99,7 +103,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"❌ Crew '{event.crew_name}' failed test",
|
f"❌ Crew '{event.crew_name}' failed test",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@crewai_event_bus.on(CrewTrainStartedEvent)
|
@crewai_event_bus.on(CrewTrainStartedEvent)
|
||||||
@@ -107,7 +110,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"📋 Crew '{event.crew_name}' started train",
|
f"📋 Crew '{event.crew_name}' started train",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@crewai_event_bus.on(CrewTrainCompletedEvent)
|
@crewai_event_bus.on(CrewTrainCompletedEvent)
|
||||||
@@ -115,7 +117,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"✅ Crew '{event.crew_name}' completed train",
|
f"✅ Crew '{event.crew_name}' completed train",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@crewai_event_bus.on(CrewTrainFailedEvent)
|
@crewai_event_bus.on(CrewTrainFailedEvent)
|
||||||
@@ -123,7 +124,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"❌ Crew '{event.crew_name}' failed train",
|
f"❌ Crew '{event.crew_name}' failed train",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@crewai_event_bus.on(TaskStartedEvent)
|
@crewai_event_bus.on(TaskStartedEvent)
|
||||||
@@ -134,7 +134,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"📋 Task started: {source.description}",
|
f"📋 Task started: {source.description}",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@crewai_event_bus.on(TaskCompletedEvent)
|
@crewai_event_bus.on(TaskCompletedEvent)
|
||||||
@@ -146,7 +145,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"✅ Task completed: {source.description}",
|
f"✅ Task completed: {source.description}",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
source._execution_span = None
|
source._execution_span = None
|
||||||
|
|
||||||
@@ -161,7 +159,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"❌ Task failed: {source.description}",
|
f"❌ Task failed: {source.description}",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@crewai_event_bus.on(AgentExecutionStartedEvent)
|
@crewai_event_bus.on(AgentExecutionStartedEvent)
|
||||||
@@ -169,7 +166,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"🤖 Agent '{event.agent.role}' started task",
|
f"🤖 Agent '{event.agent.role}' started task",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@crewai_event_bus.on(AgentExecutionCompletedEvent)
|
@crewai_event_bus.on(AgentExecutionCompletedEvent)
|
||||||
@@ -177,7 +173,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"✅ Agent '{event.agent.role}' completed task",
|
f"✅ Agent '{event.agent.role}' completed task",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Flow Events
|
# Flow Events
|
||||||
@@ -188,7 +183,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"🌊 Flow Created: '{event.flow_name}'",
|
f"🌊 Flow Created: '{event.flow_name}'",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@crewai_event_bus.on(FlowStartedEvent)
|
@crewai_event_bus.on(FlowStartedEvent)
|
||||||
@@ -199,7 +193,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"🤖 Flow Started: '{event.flow_name}'",
|
f"🤖 Flow Started: '{event.flow_name}'",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@crewai_event_bus.on(FlowFinishedEvent)
|
@crewai_event_bus.on(FlowFinishedEvent)
|
||||||
@@ -207,7 +200,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"👍 Flow Finished: '{event.flow_name}'",
|
f"👍 Flow Finished: '{event.flow_name}'",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@crewai_event_bus.on(MethodExecutionStartedEvent)
|
@crewai_event_bus.on(MethodExecutionStartedEvent)
|
||||||
@@ -215,7 +207,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"🤖 Flow Method Started: '{event.method_name}'",
|
f"🤖 Flow Method Started: '{event.method_name}'",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@crewai_event_bus.on(MethodExecutionFailedEvent)
|
@crewai_event_bus.on(MethodExecutionFailedEvent)
|
||||||
@@ -223,7 +214,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"❌ Flow Method Failed: '{event.method_name}'",
|
f"❌ Flow Method Failed: '{event.method_name}'",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@crewai_event_bus.on(MethodExecutionFinishedEvent)
|
@crewai_event_bus.on(MethodExecutionFinishedEvent)
|
||||||
@@ -231,7 +221,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"👍 Flow Method Finished: '{event.method_name}'",
|
f"👍 Flow Method Finished: '{event.method_name}'",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Tool Usage Events
|
# Tool Usage Events
|
||||||
@@ -240,7 +229,6 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"🤖 Tool Usage Started: '{event.tool_name}'",
|
f"🤖 Tool Usage Started: '{event.tool_name}'",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@crewai_event_bus.on(ToolUsageFinishedEvent)
|
@crewai_event_bus.on(ToolUsageFinishedEvent)
|
||||||
@@ -248,7 +236,7 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"✅ Tool Usage Finished: '{event.tool_name}'",
|
f"✅ Tool Usage Finished: '{event.tool_name}'",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
#
|
||||||
)
|
)
|
||||||
|
|
||||||
@crewai_event_bus.on(ToolUsageErrorEvent)
|
@crewai_event_bus.on(ToolUsageErrorEvent)
|
||||||
@@ -256,7 +244,7 @@ class EventListener(BaseEventListener):
|
|||||||
self.logger.log(
|
self.logger.log(
|
||||||
f"❌ Tool Usage Error: '{event.tool_name}'",
|
f"❌ Tool Usage Error: '{event.tool_name}'",
|
||||||
event.timestamp,
|
event.timestamp,
|
||||||
color=self.color,
|
#
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,11 @@ from crewai.utilities.printer import Printer
|
|||||||
class Logger(BaseModel):
|
class Logger(BaseModel):
|
||||||
verbose: bool = Field(default=False)
|
verbose: bool = Field(default=False)
|
||||||
_printer: Printer = PrivateAttr(default_factory=Printer)
|
_printer: Printer = PrivateAttr(default_factory=Printer)
|
||||||
|
default_color: str = Field(default="bold_yellow")
|
||||||
|
|
||||||
def log(self, level, message, color="bold_yellow"):
|
def log(self, level, message, color=None):
|
||||||
|
if color is None:
|
||||||
|
color = self.default_color
|
||||||
if self.verbose:
|
if self.verbose:
|
||||||
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
self._printer.print(
|
self._printer.print(
|
||||||
|
|||||||
Reference in New Issue
Block a user