From a2a6f87a59234c7f7526df34a32f1258fe443d21 Mon Sep 17 00:00:00 2001 From: Lucas Gomide Date: Thu, 29 May 2025 15:09:14 -0300 Subject: [PATCH] feat: print llm tool usage in console --- src/crewai/utilities/events/event_listener.py | 44 ++++++++++++------ .../events/utils/console_formatter.py | 46 +++++++++++++++++++ 2 files changed, 76 insertions(+), 14 deletions(-) diff --git a/src/crewai/utilities/events/event_listener.py b/src/crewai/utilities/events/event_listener.py index e147e9606..52c042321 100644 --- a/src/crewai/utilities/events/event_listener.py +++ b/src/crewai/utilities/events/event_listener.py @@ -2,7 +2,7 @@ from io import StringIO from typing import Any, Dict from pydantic import Field, PrivateAttr - +from crewai.llm import LLM from crewai.task import Task from crewai.telemetry.telemetry import Telemetry from crewai.utilities import Logger @@ -283,27 +283,43 @@ class EventListener(BaseEventListener): @crewai_event_bus.on(ToolUsageStartedEvent) def on_tool_usage_started(source, event: ToolUsageStartedEvent): - self.formatter.handle_tool_usage_started( - self.formatter.current_agent_branch, - event.tool_name, + if isinstance(source, LLM): + self.formatter.handle_llm_tool_usage_started( + event.tool_name, + ) + else: + self.formatter.handle_tool_usage_started( + self.formatter.current_agent_branch, + event.tool_name, self.formatter.current_crew_tree, ) @crewai_event_bus.on(ToolUsageFinishedEvent) def on_tool_usage_finished(source, event: ToolUsageFinishedEvent): - self.formatter.handle_tool_usage_finished( - self.formatter.current_tool_branch, - event.tool_name, - self.formatter.current_crew_tree, - ) + if isinstance(source, LLM): + self.formatter.handle_llm_tool_usage_finished( + event.tool_name, + ) + else: + self.formatter.handle_tool_usage_finished( + self.formatter.current_tool_branch, + event.tool_name, + self.formatter.current_crew_tree, + ) @crewai_event_bus.on(ToolUsageErrorEvent) def on_tool_usage_error(source, event: ToolUsageErrorEvent): - self.formatter.handle_tool_usage_error( - self.formatter.current_tool_branch, - event.tool_name, - event.error, - self.formatter.current_crew_tree, + if isinstance(source, LLM): + self.formatter.handle_llm_tool_usage_error( + event.tool_name, + event.error, + ) + else: + self.formatter.handle_tool_usage_error( + self.formatter.current_tool_branch, + event.tool_name, + event.error, + self.formatter.current_crew_tree, ) # ----------- LLM EVENTS ----------- diff --git a/src/crewai/utilities/events/utils/console_formatter.py b/src/crewai/utilities/events/utils/console_formatter.py index 876fb1452..bcf12caaf 100644 --- a/src/crewai/utilities/events/utils/console_formatter.py +++ b/src/crewai/utilities/events/utils/console_formatter.py @@ -17,6 +17,7 @@ class ConsoleFormatter: current_lite_agent_branch: Optional[Tree] = None tool_usage_counts: Dict[str, int] = {} current_reasoning_branch: Optional[Tree] = None # Track reasoning status + current_llm_tool_tree: Optional[Tree] = None def __init__(self, verbose: bool = False): self.console = Console(width=None) @@ -426,6 +427,51 @@ class ConsoleFormatter: self.print() return method_branch + def get_llm_tree(self, tool_name: str): + text = Text() + text.append(f"🔧 Using {tool_name} from LLM available_function", style="yellow") + + tree = self.current_flow_tree or self.current_crew_tree + + if tree: + tree.add(text) + + return tree or Tree(text) + + def handle_llm_tool_usage_started( + self, + tool_name: str, + ): + tree = self.get_llm_tree(tool_name) + self.add_tree_node(tree, "🔄 Tool Usage Started", "green") + self.print(tree) + self.print() + return tree + + def handle_llm_tool_usage_finished( + self, + tool_name: str, + ): + tree = self.get_llm_tree(tool_name) + self.add_tree_node(tree, "✅ Tool Usage Completed", "green") + self.print(tree) + self.print() + + def handle_llm_tool_usage_error( + self, + tool_name: str, + error: str, + ): + tree = self.get_llm_tree(tool_name) + self.add_tree_node(tree, "❌ Tool Usage Failed", "red") + self.print(tree) + self.print() + + error_content = self.create_status_content( + "Tool Usage Failed", tool_name, "red", Error=error + ) + self.print_panel(error_content, "Tool Error", "red") + def handle_tool_usage_started( self, agent_branch: Optional[Tree],