Skip to content

Commit e67695d

Browse files
committed
feat: print llm tool usage in console
1 parent f921377 commit e67695d

File tree

2 files changed

+77
-14
lines changed

2 files changed

+77
-14
lines changed

src/crewai/utilities/events/event_listener.py

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from typing import Any, Dict
33

44
from pydantic import Field, PrivateAttr
5-
5+
from crewai.llm import LLM
66
from crewai.task import Task
77
from crewai.telemetry.telemetry import Telemetry
88
from crewai.utilities import Logger
@@ -283,27 +283,43 @@ def on_method_execution_failed(source, event: MethodExecutionFailedEvent):
283283

284284
@crewai_event_bus.on(ToolUsageStartedEvent)
285285
def on_tool_usage_started(source, event: ToolUsageStartedEvent):
286-
self.formatter.handle_tool_usage_started(
287-
self.formatter.current_agent_branch,
288-
event.tool_name,
286+
if isinstance(source, LLM):
287+
self.formatter.handle_llm_tool_usage_started(
288+
event.tool_name,
289+
)
290+
else:
291+
self.formatter.handle_tool_usage_started(
292+
self.formatter.current_agent_branch,
293+
event.tool_name,
289294
self.formatter.current_crew_tree,
290295
)
291296

292297
@crewai_event_bus.on(ToolUsageFinishedEvent)
293298
def on_tool_usage_finished(source, event: ToolUsageFinishedEvent):
294-
self.formatter.handle_tool_usage_finished(
295-
self.formatter.current_tool_branch,
296-
event.tool_name,
297-
self.formatter.current_crew_tree,
298-
)
299+
if isinstance(source, LLM):
300+
self.formatter.handle_llm_tool_usage_finished(
301+
event.tool_name,
302+
)
303+
else:
304+
self.formatter.handle_tool_usage_finished(
305+
self.formatter.current_tool_branch,
306+
event.tool_name,
307+
self.formatter.current_crew_tree,
308+
)
299309

300310
@crewai_event_bus.on(ToolUsageErrorEvent)
301311
def on_tool_usage_error(source, event: ToolUsageErrorEvent):
302-
self.formatter.handle_tool_usage_error(
303-
self.formatter.current_tool_branch,
304-
event.tool_name,
305-
event.error,
306-
self.formatter.current_crew_tree,
312+
if isinstance(source, LLM):
313+
self.formatter.handle_llm_tool_usage_error(
314+
event.tool_name,
315+
event.error,
316+
)
317+
else:
318+
self.formatter.handle_tool_usage_error(
319+
self.formatter.current_tool_branch,
320+
event.tool_name,
321+
event.error,
322+
self.formatter.current_crew_tree,
307323
)
308324

309325
# ----------- LLM EVENTS -----------

src/crewai/utilities/events/utils/console_formatter.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ class ConsoleFormatter:
1717
current_lite_agent_branch: Optional[Tree] = None
1818
tool_usage_counts: Dict[str, int] = {}
1919
current_reasoning_branch: Optional[Tree] = None # Track reasoning status
20+
current_method_branch: Optional[Tree] = None
21+
current_llm_tool_tree: Optional[Tree] = None
2022

2123
def __init__(self, verbose: bool = False):
2224
self.console = Console(width=None)
@@ -426,6 +428,51 @@ def update_method_status(
426428
self.print()
427429
return method_branch
428430

431+
def get_llm_tree(self, tool_name: str):
432+
text = Text()
433+
text.append(f"🔧 Using {tool_name} from LLM available_function", style="yellow")
434+
435+
tree = self.current_flow_tree or self.current_crew_tree
436+
437+
if tree:
438+
tree.add(text)
439+
440+
return tree or Tree(text)
441+
442+
def handle_llm_tool_usage_started(
443+
self,
444+
tool_name: str,
445+
):
446+
tree = self.get_llm_tree(tool_name)
447+
self.add_tree_node(tree, "🔄 Tool Usage Started", "green")
448+
self.print(tree)
449+
self.print()
450+
return tree
451+
452+
def handle_llm_tool_usage_finished(
453+
self,
454+
tool_name: str,
455+
):
456+
tree = self.get_llm_tree(tool_name)
457+
self.add_tree_node(tree, "✅ Tool Usage Completed", "green")
458+
self.print(tree)
459+
self.print()
460+
461+
def handle_llm_tool_usage_error(
462+
self,
463+
tool_name: str,
464+
error: str,
465+
):
466+
tree = self.get_llm_tree(tool_name)
467+
self.add_tree_node(tree, "❌ Tool Usage Failed", "red")
468+
self.print(tree)
469+
self.print()
470+
471+
error_content = self.create_status_content(
472+
"Tool Usage Failed", tool_name, "red", Error=error
473+
)
474+
self.print_panel(error_content, "Tool Error", "red")
475+
429476
def handle_tool_usage_started(
430477
self,
431478
agent_branch: Optional[Tree],

0 commit comments

Comments
 (0)