Compare commits

...

3 Commits

Author SHA1 Message Date
Joao Moura
c47ff15bf6 set tracing if user enables it 2025-09-18 17:01:52 -07:00
Joao Moura
270e0b6edd avoinding line breaking 2025-09-18 16:40:51 -07:00
Joao Moura
a0cbb5cfdb feat(tracing): enhance first-time trace display and auto-open browser 2025-09-18 16:37:48 -07:00
2 changed files with 72 additions and 12 deletions

View File

@@ -1,5 +1,8 @@
import logging import logging
import os
import uuid import uuid
import webbrowser
from pathlib import Path
from rich.console import Console from rich.console import Console
from rich.panel import Panel from rich.panel import Panel
@@ -14,6 +17,47 @@ from crewai.events.listeners.tracing.utils import (
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def _update_or_create_env_file():
"""Update or create .env file with CREWAI_TRACING_ENABLED=true."""
env_path = Path(".env")
env_content = ""
variable_name = "CREWAI_TRACING_ENABLED"
variable_value = "true"
# Read existing content if file exists
if env_path.exists():
with open(env_path, "r") as f:
env_content = f.read()
# Check if CREWAI_TRACING_ENABLED is already set
lines = env_content.splitlines()
variable_exists = False
updated_lines = []
for line in lines:
if line.strip().startswith(f"{variable_name}="):
# Update existing variable
updated_lines.append(f"{variable_name}={variable_value}")
variable_exists = True
else:
updated_lines.append(line)
# Add variable if it doesn't exist
if not variable_exists:
if updated_lines and not updated_lines[-1].strip():
# If last line is empty, replace it
updated_lines[-1] = f"{variable_name}={variable_value}"
else:
# Add new line and then the variable
updated_lines.append(f"{variable_name}={variable_value}")
# Write updated content
with open(env_path, "w") as f:
f.write("\n".join(updated_lines))
if updated_lines: # Add final newline if there's content
f.write("\n")
class FirstTimeTraceHandler: class FirstTimeTraceHandler:
"""Handles the first-time user trace collection and display flow.""" """Handles the first-time user trace collection and display flow."""
@@ -48,6 +92,12 @@ class FirstTimeTraceHandler:
if user_wants_traces: if user_wants_traces:
self._initialize_backend_and_send_events() self._initialize_backend_and_send_events()
# Enable tracing for future runs by updating .env file
try:
_update_or_create_env_file()
except Exception as e:
pass
if self.ephemeral_url: if self.ephemeral_url:
self._display_ephemeral_trace_link() self._display_ephemeral_trace_link()
@@ -108,9 +158,14 @@ class FirstTimeTraceHandler:
self._gracefully_fail(f"Backend initialization failed: {e}") self._gracefully_fail(f"Backend initialization failed: {e}")
def _display_ephemeral_trace_link(self): def _display_ephemeral_trace_link(self):
"""Display the ephemeral trace link to the user.""" """Display the ephemeral trace link to the user and automatically open browser."""
console = Console() console = Console()
try:
webbrowser.open(self.ephemeral_url)
except Exception as e:
pass
panel_content = f""" panel_content = f"""
🎉 Your First CrewAI Execution Trace is Ready! 🎉 Your First CrewAI Execution Trace is Ready!
@@ -123,7 +178,8 @@ This trace shows:
• Tool usage and results • Tool usage and results
• LLM calls and responses • LLM calls and responses
To use traces add tracing=True to your Crew(tracing=True) / Flow(tracing=True) ✅ Tracing has been enabled for future runs! (CREWAI_TRACING_ENABLED=true added to .env)
You can also add tracing=True to your Crew(tracing=True) / Flow(tracing=True) for more control.
📝 Note: This link will expire in 24 hours. 📝 Note: This link will expire in 24 hours.
""".strip() """.strip()
@@ -158,8 +214,8 @@ Unfortunately, we couldn't upload them to the server right now, but here's what
• Execution duration: {self.batch_manager.calculate_duration("execution")}ms • Execution duration: {self.batch_manager.calculate_duration("execution")}ms
• Batch ID: {self.batch_manager.trace_batch_id} • Batch ID: {self.batch_manager.trace_batch_id}
Tracing has been enabled for future runs! (CREWAI_TRACING_ENABLED=true added to .env)
The traces include agent decisions, task execution, and tool usage. The traces include agent decisions, task execution, and tool usage.
Try running with CREWAI_TRACING_ENABLED=true next time for persistent traces.
""".strip() """.strip()
panel = Panel( panel = Panel(

View File

@@ -138,13 +138,6 @@ class TraceBatchManager:
if not use_ephemeral if not use_ephemeral
else response_data["ephemeral_trace_id"] else response_data["ephemeral_trace_id"]
) )
console = Console()
panel = Panel(
f"✅ Trace batch initialized with session ID: {self.trace_batch_id}",
title="Trace Batch Initialization",
border_style="green",
)
console.print(panel)
else: else:
logger.warning( logger.warning(
f"Trace batch initialization returned status {response.status_code}. Continuing without tracing." f"Trace batch initialization returned status {response.status_code}. Continuing without tracing."
@@ -258,12 +251,23 @@ class TraceBatchManager:
if self.is_current_batch_ephemeral: if self.is_current_batch_ephemeral:
self.ephemeral_trace_url = return_link self.ephemeral_trace_url = return_link
# Create a properly formatted message with URL on its own line
message_parts = [
f"✅ Trace batch finalized with session ID: {self.trace_batch_id}",
"",
f"🔗 View here: {return_link}",
]
if access_code:
message_parts.append(f"🔑 Access Code: {access_code}")
panel = Panel( panel = Panel(
f"✅ Trace batch finalized with session ID: {self.trace_batch_id}. View here: {return_link} {f', Access Code: {access_code}' if access_code else ''}", "\n".join(message_parts),
title="Trace Batch Finalization", title="Trace Batch Finalization",
border_style="green", border_style="green",
) )
console.print(panel) if not should_auto_collect_first_time_traces():
console.print(panel)
else: else:
logger.error( logger.error(