diff --git a/docs/en/concepts/cli.mdx b/docs/en/concepts/cli.mdx index 0e50054bc..dfde91a30 100644 --- a/docs/en/concepts/cli.mdx +++ b/docs/en/concepts/cli.mdx @@ -402,6 +402,77 @@ crewai config reset After resetting configuration, re-run `crewai login` to authenticate again. +### 14. Trace Management + +Manage trace collection preferences for your Crew and Flow executions. + +```shell Terminal +crewai traces [COMMAND] +``` + +#### Commands: + +- `enable`: Enable trace collection for crew/flow executions +```shell Terminal +crewai traces enable +``` + +- `disable`: Disable trace collection for crew/flow executions +```shell Terminal +crewai traces disable +``` + +- `status`: Show current trace collection status +```shell Terminal +crewai traces status +``` + +#### How Tracing Works + +Trace collection is controlled by checking three settings in priority order: + +1. **Explicit flag in code** (highest priority - can enable OR disable): + ```python + crew = Crew(agents=[...], tasks=[...], tracing=True) # Always enable + crew = Crew(agents=[...], tasks=[...], tracing=False) # Always disable + crew = Crew(agents=[...], tasks=[...]) # Check lower priorities (default) + ``` + - `tracing=True` will **always enable** tracing (overrides everything) + - `tracing=False` will **always disable** tracing (overrides everything) + - `tracing=None` or omitted will check lower priority settings + +2. **Environment variable** (second priority): + ```env + CREWAI_TRACING_ENABLED=true + ``` + - Checked only if `tracing` is not explicitly set to `True` or `False` in code + - Set to `true` or `1` to enable tracing + +3. **User preference** (lowest priority): + ```shell Terminal + crewai traces enable + ``` + - Checked only if `tracing` is not set in code and `CREWAI_TRACING_ENABLED` is not set to `true` + - Running `crewai traces enable` is sufficient to enable tracing by itself + + +**To enable tracing**, use any one of these methods: +- Set `tracing=True` in your Crew/Flow code, OR +- Add `CREWAI_TRACING_ENABLED=true` to your `.env` file, OR +- Run `crewai traces enable` + +**To disable tracing**, use any ONE of these methods: +- Set `tracing=False` in your Crew/Flow code (overrides everything), OR +- Remove or set to `false` the `CREWAI_TRACING_ENABLED` env var, OR +- Run `crewai traces disable` + +Higher priority settings override lower ones. + + + +For more information about tracing, see the [Tracing documentation](/observability/tracing). + + CrewAI CLI handles authentication to the Tool Repository automatically when adding packages to your project. Just append `crewai` before any `uv` command to use it. E.g. `crewai uv add requests`. For more information, see [Tool Repository](https://docs.crewai.com/enterprise/features/tool-repository) docs. diff --git a/lib/crewai/src/crewai/cli/cli.py b/lib/crewai/src/crewai/cli/cli.py index 2e6f5eaa9..a8f9571cc 100644 --- a/lib/crewai/src/crewai/cli/cli.py +++ b/lib/crewai/src/crewai/cli/cli.py @@ -493,5 +493,206 @@ def config_reset(): config_command.reset_all_settings() +@crewai.group() +def env(): + """Environment variable commands.""" + + +@env.command("view") +def env_view(): + """View tracing-related environment variables.""" + import os + from pathlib import Path + + from rich.console import Console + from rich.panel import Panel + from rich.table import Table + + console = Console() + + # Check for .env file + env_file = Path(".env") + env_file_exists = env_file.exists() + + # Create table for environment variables + table = Table(show_header=True, header_style="bold cyan", expand=True) + table.add_column("Environment Variable", style="cyan", width=30) + table.add_column("Value", style="white", width=20) + table.add_column("Source", style="yellow", width=20) + + # Check CREWAI_TRACING_ENABLED + crewai_tracing = os.getenv("CREWAI_TRACING_ENABLED", "") + if crewai_tracing: + table.add_row( + "CREWAI_TRACING_ENABLED", + crewai_tracing, + "Environment/Shell", + ) + else: + table.add_row( + "CREWAI_TRACING_ENABLED", + "[dim]Not set[/dim]", + "[dim]—[/dim]", + ) + + # Check other related env vars + crewai_testing = os.getenv("CREWAI_TESTING", "") + if crewai_testing: + table.add_row("CREWAI_TESTING", crewai_testing, "Environment/Shell") + + crewai_user_id = os.getenv("CREWAI_USER_ID", "") + if crewai_user_id: + table.add_row("CREWAI_USER_ID", crewai_user_id, "Environment/Shell") + + crewai_org_id = os.getenv("CREWAI_ORG_ID", "") + if crewai_org_id: + table.add_row("CREWAI_ORG_ID", crewai_org_id, "Environment/Shell") + + # Check if .env file exists + table.add_row( + ".env file", + "✅ Found" if env_file_exists else "❌ Not found", + str(env_file.resolve()) if env_file_exists else "N/A", + ) + + panel = Panel( + table, + title="Tracing Environment Variables", + border_style="blue", + padding=(1, 2), + ) + console.print("\n") + console.print(panel) + + # Show helpful message + if env_file_exists: + console.print( + "\n[dim]💡 Tip: To enable tracing via .env, add: CREWAI_TRACING_ENABLED=true[/dim]" + ) + else: + console.print( + "\n[dim]💡 Tip: Create a .env file in your project root and add: CREWAI_TRACING_ENABLED=true[/dim]" + ) + console.print() + + +@crewai.group() +def traces(): + """Trace collection management commands.""" + + +@traces.command("enable") +def traces_enable(): + """Enable trace collection for crew/flow executions.""" + from rich.console import Console + from rich.panel import Panel + + from crewai.events.listeners.tracing.utils import ( + _load_user_data, + _save_user_data, + ) + + console = Console() + + # Update user data to enable traces + user_data = _load_user_data() + user_data["trace_consent"] = True + user_data["first_execution_done"] = True + _save_user_data(user_data) + + panel = Panel( + "✅ Trace collection has been enabled!\n\n" + "Your crew/flow executions will now send traces to CrewAI+.\n" + "Use 'crewai traces disable' to turn off trace collection.", + title="Traces Enabled", + border_style="green", + padding=(1, 2), + ) + console.print(panel) + + +@traces.command("disable") +def traces_disable(): + """Disable trace collection for crew/flow executions.""" + from rich.console import Console + from rich.panel import Panel + + from crewai.events.listeners.tracing.utils import ( + _load_user_data, + _save_user_data, + ) + + console = Console() + + # Update user data to disable traces + user_data = _load_user_data() + user_data["trace_consent"] = False + user_data["first_execution_done"] = True + _save_user_data(user_data) + + panel = Panel( + "❌ Trace collection has been disabled!\n\n" + "Your crew/flow executions will no longer send traces.\n" + "Use 'crewai traces enable' to turn trace collection back on.", + title="Traces Disabled", + border_style="red", + padding=(1, 2), + ) + console.print(panel) + + +@traces.command("status") +def traces_status(): + """Show current trace collection status.""" + import os + + from rich.console import Console + from rich.panel import Panel + from rich.table import Table + + from crewai.events.listeners.tracing.utils import ( + _load_user_data, + is_tracing_enabled, + ) + + console = Console() + user_data = _load_user_data() + + table = Table(show_header=False, box=None) + table.add_column("Setting", style="cyan") + table.add_column("Value", style="white") + + # Check environment variable + env_enabled = os.getenv("CREWAI_TRACING_ENABLED", "false") + table.add_row("CREWAI_TRACING_ENABLED", env_enabled) + + # Check user consent + trace_consent = user_data.get("trace_consent") + if trace_consent is True: + consent_status = "✅ Enabled (user consented)" + elif trace_consent is False: + consent_status = "❌ Disabled (user declined)" + else: + consent_status = "⚪ Not set (first-time user)" + table.add_row("User Consent", consent_status) + + # Check overall status + if is_tracing_enabled(): + overall_status = "✅ ENABLED" + border_style = "green" + else: + overall_status = "❌ DISABLED" + border_style = "red" + table.add_row("Overall Status", overall_status) + + panel = Panel( + table, + title="Trace Collection Status", + border_style=border_style, + padding=(1, 2), + ) + console.print(panel) + + if __name__ == "__main__": crewai() diff --git a/lib/crewai/src/crewai/cli/settings/main.py b/lib/crewai/src/crewai/cli/settings/main.py index 83a50c2fe..a2e520101 100644 --- a/lib/crewai/src/crewai/cli/settings/main.py +++ b/lib/crewai/src/crewai/cli/settings/main.py @@ -1,3 +1,5 @@ +from datetime import datetime +import os from typing import Any from rich.console import Console @@ -5,6 +7,7 @@ from rich.table import Table from crewai.cli.command import BaseCommand from crewai.cli.config import HIDDEN_SETTINGS_KEYS, READONLY_SETTINGS_KEYS, Settings +from crewai.events.listeners.tracing.utils import _load_user_data console = Console() @@ -39,6 +42,42 @@ class SettingsCommand(BaseCommand): table.add_row(field_name, display_value, description) + # Add trace-related settings from user data + user_data = _load_user_data() + + # CREWAI_TRACING_ENABLED environment variable + env_tracing = os.getenv("CREWAI_TRACING_ENABLED", "") + env_tracing_display = env_tracing if env_tracing else "Not set" + table.add_row( + "CREWAI_TRACING_ENABLED", + env_tracing_display, + "Environment variable to enable/disable tracing", + ) + + # Trace consent status + trace_consent = user_data.get("trace_consent") + if trace_consent is True: + consent_display = "✅ Enabled" + elif trace_consent is False: + consent_display = "❌ Disabled" + else: + consent_display = "Not set" + table.add_row( + "trace_consent", consent_display, "Whether trace collection is enabled" + ) + + # First execution timestamp + if user_data.get("first_execution_at"): + timestamp = datetime.fromtimestamp(user_data["first_execution_at"]) + first_exec_display = timestamp.strftime("%Y-%m-%d %H:%M:%S") + else: + first_exec_display = "Not set" + table.add_row( + "first_execution_at", + first_exec_display, + "Timestamp of first crew/flow execution", + ) + console.print(table) def set(self, key: str, value: str) -> None: diff --git a/lib/crewai/src/crewai/crew.py b/lib/crewai/src/crewai/crew.py index cadd9d3b1..00bed8f01 100644 --- a/lib/crewai/src/crewai/crew.py +++ b/lib/crewai/src/crewai/crew.py @@ -27,6 +27,8 @@ from pydantic import ( model_validator, ) from pydantic_core import PydanticCustomError +from rich.console import Console +from rich.panel import Panel from typing_extensions import Self from crewai.agent import Agent @@ -39,8 +41,8 @@ from crewai.events.listeners.tracing.trace_listener import ( TraceCollectionListener, ) from crewai.events.listeners.tracing.utils import ( - is_tracing_enabled, - should_auto_collect_first_time_traces, + set_tracing_enabled, + should_enable_tracing, ) from crewai.events.types.crew_events import ( CrewKickoffCompletedEvent, @@ -280,8 +282,8 @@ class Crew(FlowTrackable, BaseModel): description="Metrics for the LLM usage during all tasks execution.", ) tracing: bool | None = Field( - default=False, - description="Whether to enable tracing for the crew.", + default=None, + description="Whether to enable tracing for the crew. True=always enable, False=always disable, None=check environment/user settings.", ) @field_validator("id", mode="before") @@ -311,17 +313,16 @@ class Crew(FlowTrackable, BaseModel): @model_validator(mode="after") def set_private_attrs(self) -> Crew: """set private attributes.""" - self._cache_handler = CacheHandler() event_listener = EventListener() # type: ignore[no-untyped-call] - if ( - is_tracing_enabled() - or self.tracing - or should_auto_collect_first_time_traces() - ): - trace_listener = TraceCollectionListener() - trace_listener.setup_listeners(crewai_event_bus) + # Determine and set tracing state once for this execution + tracing_enabled = should_enable_tracing(override=self.tracing) + set_tracing_enabled(tracing_enabled) + + # Always setup trace listener - actual execution control is via contextvar + trace_listener = TraceCollectionListener() + trace_listener.setup_listeners(crewai_event_bus) event_listener.verbose = self.verbose event_listener.formatter.verbose = self.verbose self._logger = Logger(verbose=self.verbose) @@ -1171,6 +1172,10 @@ class Crew(FlowTrackable, BaseModel): total_tokens=self.token_usage.total_tokens, ), ) + + # Finalization is handled by trace listener (always initialized) + # The batch manager checks contextvar to determine if tracing is enabled + return CrewOutput( raw=final_task_output.raw, pydantic=final_task_output.pydantic, @@ -1651,3 +1656,32 @@ class Crew(FlowTrackable, BaseModel): and able_to_inject ): self.tasks[0].allow_crewai_trigger_context = True + + def _show_tracing_disabled_message(self) -> None: + """Show a message when tracing is disabled.""" + from crewai.events.listeners.tracing.utils import has_user_declined_tracing + + console = Console() + + if has_user_declined_tracing(): + message = """Info: Tracing is disabled. + +To enable tracing, do any one of these: +• Set tracing=True in your Crew code +• Set CREWAI_TRACING_ENABLED=true in your project's .env file +• Run: crewai traces enable""" + else: + message = """Info: Tracing is disabled. + +To enable tracing, do any one of these: +• Set tracing=True in your Crew code +• Set CREWAI_TRACING_ENABLED=true in your project's .env file +• Run: crewai traces enable""" + + panel = Panel( + message, + title="Tracing Status", + border_style="blue", + padding=(1, 2), + ) + console.print(panel) diff --git a/lib/crewai/src/crewai/events/event_bus.py b/lib/crewai/src/crewai/events/event_bus.py index e7d6e279e..9fabace08 100644 --- a/lib/crewai/src/crewai/events/event_bus.py +++ b/lib/crewai/src/crewai/events/event_bus.py @@ -10,6 +10,7 @@ import atexit from collections.abc import Callable, Generator from concurrent.futures import Future, ThreadPoolExecutor from contextlib import contextmanager +import contextvars import threading from typing import Any, Final, ParamSpec, TypeVar @@ -288,8 +289,9 @@ class CrewAIEventsBus: if event_type is LLMStreamChunkEvent: self._call_handlers(source, event, level_sync) else: + ctx = contextvars.copy_context() future = self._sync_executor.submit( - self._call_handlers, source, event, level_sync + ctx.run, self._call_handlers, source, event, level_sync ) await asyncio.get_running_loop().run_in_executor( None, future.result @@ -346,8 +348,9 @@ class CrewAIEventsBus: if event_type is LLMStreamChunkEvent: self._call_handlers(source, event, sync_handlers) else: + ctx = contextvars.copy_context() sync_future = self._sync_executor.submit( - self._call_handlers, source, event, sync_handlers + ctx.run, self._call_handlers, source, event, sync_handlers ) if not async_handlers: return sync_future diff --git a/lib/crewai/src/crewai/events/listeners/tracing/first_time_trace_handler.py b/lib/crewai/src/crewai/events/listeners/tracing/first_time_trace_handler.py index 3d4a70dba..9b8e0d437 100644 --- a/lib/crewai/src/crewai/events/listeners/tracing/first_time_trace_handler.py +++ b/lib/crewai/src/crewai/events/listeners/tracing/first_time_trace_handler.py @@ -1,5 +1,4 @@ import logging -from pathlib import Path import uuid import webbrowser @@ -17,47 +16,6 @@ from crewai.events.listeners.tracing.utils import ( 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: """Handles the first-time user trace collection and display flow.""" @@ -96,20 +54,16 @@ class FirstTimeTraceHandler: if user_wants_traces: self._initialize_backend_and_send_events() - # Enable tracing for future runs by updating .env file - try: - _update_or_create_env_file() - except Exception: # noqa: S110 - pass - if self.ephemeral_url: self._display_ephemeral_trace_link() + else: + self._show_tracing_declined_message() - mark_first_execution_completed() + mark_first_execution_completed(user_consented=user_wants_traces) except Exception as e: self._gracefully_fail(f"Error in trace handling: {e}") - mark_first_execution_completed() + mark_first_execution_completed(user_consented=False) def _initialize_backend_and_send_events(self): """Initialize backend batch and send collected events.""" @@ -182,8 +136,13 @@ This trace shows: • Tool usage and results • LLM calls and responses -✅ 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. +✅ Tracing has been enabled for future runs! +Your preference has been saved. Future Crew/Flow executions will automatically collect traces. + +To disable tracing later, do any one of these: +• Set tracing=False in your Crew/Flow code +• Set CREWAI_TRACING_ENABLED=false in your project's .env file +• Run: crewai traces disable 📝 Note: This link will expire in 24 hours. """.strip() @@ -199,6 +158,32 @@ You can also add tracing=True to your Crew(tracing=True) / Flow(tracing=True) fo console.print(panel) console.print() + def _show_tracing_declined_message(self): + """Show message when user declines tracing.""" + console = Console() + + panel_content = """ +Info: Tracing has been disabled. + +Your preference has been saved. Future Crew/Flow executions will not collect traces. + +To enable tracing later, do any one of these: +• Set tracing=True in your Crew/Flow code +• Set CREWAI_TRACING_ENABLED=true in your project's .env file +• Run: crewai traces enable + """.strip() + + panel = Panel( + panel_content, + title="Tracing Preference Saved", + border_style="blue", + padding=(1, 2), + ) + + console.print("\n") + console.print(panel) + console.print() + def _gracefully_fail(self, error_message: str): """Handle errors gracefully without disrupting user experience.""" console = Console() @@ -218,8 +203,14 @@ Unfortunately, we couldn't upload them to the server right now, but here's what • Execution duration: {self.batch_manager.calculate_duration("execution")}ms • Batch ID: {self.batch_manager.trace_batch_id} -Tracing has been enabled for future runs! (CREWAI_TRACING_ENABLED=true added to .env) +✅ Tracing has been enabled for future runs! +Your preference has been saved. Future Crew/Flow executions will automatically collect traces. The traces include agent decisions, task execution, and tool usage. + +To disable tracing later, do any one of these: +• Set tracing=False in your Crew/Flow code +• Set CREWAI_TRACING_ENABLED=false in your project's .env file +• Run: crewai traces disable """.strip() panel = Panel( diff --git a/lib/crewai/src/crewai/events/listeners/tracing/trace_batch_manager.py b/lib/crewai/src/crewai/events/listeners/tracing/trace_batch_manager.py index 3571e45ab..bffa0d032 100644 --- a/lib/crewai/src/crewai/events/listeners/tracing/trace_batch_manager.py +++ b/lib/crewai/src/crewai/events/listeners/tracing/trace_batch_manager.py @@ -12,7 +12,10 @@ from crewai.cli.authentication.token import AuthError, get_auth_token from crewai.cli.plus_api import PlusAPI from crewai.cli.version import get_crewai_version from crewai.events.listeners.tracing.types import TraceEvent -from crewai.events.listeners.tracing.utils import should_auto_collect_first_time_traces +from crewai.events.listeners.tracing.utils import ( + is_tracing_enabled_in_context, + should_auto_collect_first_time_traces, +) from crewai.utilities.constants import CREWAI_BASE_URL @@ -107,6 +110,9 @@ class TraceBatchManager: ): """Send batch initialization to backend""" + if not is_tracing_enabled_in_context(): + return + if not self.plus_api or not self.current_batch: return @@ -243,7 +249,8 @@ class TraceBatchManager: def finalize_batch(self) -> TraceBatch | None: """Finalize batch and return it for sending""" - if not self.current_batch: + + if not self.current_batch or not is_tracing_enabled_in_context(): return None all_handlers_completed = self.wait_for_pending_events() diff --git a/lib/crewai/src/crewai/events/listeners/tracing/trace_listener.py b/lib/crewai/src/crewai/events/listeners/tracing/trace_listener.py index 462671141..f8cc43572 100644 --- a/lib/crewai/src/crewai/events/listeners/tracing/trace_listener.py +++ b/lib/crewai/src/crewai/events/listeners/tracing/trace_listener.py @@ -10,13 +10,14 @@ from crewai.cli.authentication.token import AuthError, get_auth_token from crewai.cli.version import get_crewai_version from crewai.events.base_event_listener import BaseEventListener from crewai.events.event_bus import CrewAIEventsBus -from crewai.events.utils.console_formatter import ConsoleFormatter from crewai.events.listeners.tracing.first_time_trace_handler import ( FirstTimeTraceHandler, ) from crewai.events.listeners.tracing.trace_batch_manager import TraceBatchManager from crewai.events.listeners.tracing.types import TraceEvent -from crewai.events.listeners.tracing.utils import safe_serialize_to_dict +from crewai.events.listeners.tracing.utils import ( + safe_serialize_to_dict, +) from crewai.events.types.agent_events import ( AgentExecutionCompletedEvent, AgentExecutionErrorEvent, @@ -80,6 +81,7 @@ from crewai.events.types.tool_usage_events import ( ToolUsageFinishedEvent, ToolUsageStartedEvent, ) +from crewai.events.utils.console_formatter import ConsoleFormatter class TraceCollectionListener(BaseEventListener): @@ -627,3 +629,35 @@ class TraceCollectionListener(BaseEventListener): "event": safe_serialize_to_dict(event), "source": source, } + + def _show_tracing_disabled_message(self) -> None: + """Show a message when tracing is disabled.""" + from rich.console import Console + from rich.panel import Panel + + from crewai.events.listeners.tracing.utils import has_user_declined_tracing + + console = Console() + + if has_user_declined_tracing(): + message = """Info: Tracing is disabled. + +To enable tracing, do any one of these: +• Set tracing=True in your Crew/Flow code +• Set CREWAI_TRACING_ENABLED=true in your project's .env file +• Run: crewai traces enable""" + else: + message = """Info: Tracing is disabled. + +To enable tracing, do any one of these: +• Set tracing=True in your Crew/Flow code +• Set CREWAI_TRACING_ENABLED=true in your project's .env file +• Run: crewai traces enable""" + + panel = Panel( + message, + title="Tracing Status", + border_style="blue", + padding=(1, 2), + ) + console.print(panel) diff --git a/lib/crewai/src/crewai/events/listeners/tracing/utils.py b/lib/crewai/src/crewai/events/listeners/tracing/utils.py index 9c5a30a05..13e26dacb 100644 --- a/lib/crewai/src/crewai/events/listeners/tracing/utils.py +++ b/lib/crewai/src/crewai/events/listeners/tracing/utils.py @@ -1,3 +1,4 @@ +from contextvars import ContextVar, Token from datetime import datetime import getpass import hashlib @@ -8,7 +9,7 @@ from pathlib import Path import platform import re import subprocess -from typing import Any +from typing import Any, cast import uuid import click @@ -23,7 +24,120 @@ from crewai.utilities.serialization import to_serializable logger = logging.getLogger(__name__) +_tracing_enabled: ContextVar[bool | None] = ContextVar("_tracing_enabled", default=None) + + +def should_enable_tracing(*, override: bool | None = None) -> bool: + """Determine if tracing should be enabled. + + This is the single source of truth for tracing enablement. + Priority order: + 1. Explicit override (e.g., Crew.tracing=True/False) + 2. Environment variable CREWAI_TRACING_ENABLED + 3. User consent from user_data + + Args: + override: Explicit override for tracing (True=always enable, False=always disable, None=check other settings) + + Returns: + True if tracing should be enabled, False otherwise. + """ + if override is True: + return True + if override is False: + return False + + env_value = os.getenv("CREWAI_TRACING_ENABLED", "").lower() + if env_value in ("true", "1"): + return True + + data = _load_user_data() + + if data.get("trace_consent", False) is not False: + return True + + return False + + +def set_tracing_enabled(enabled: bool) -> object: + """Set tracing enabled state for current execution context. + + Args: + enabled: Whether tracing should be enabled + + Returns: + A token that can be used with reset_tracing_enabled to restore previous value. + """ + return _tracing_enabled.set(enabled) + + +def reset_tracing_enabled(token: Token[bool | None]) -> None: + """Reset tracing enabled state to previous value. + + Args: + token: Token returned from set_tracing_enabled + """ + _tracing_enabled.reset(token) + + +def is_tracing_enabled_in_context() -> bool: + """Check if tracing is enabled in current execution context. + + Returns: + True if tracing is enabled in context, False otherwise. + Returns False if context has not been set. + """ + enabled = _tracing_enabled.get() + return enabled if enabled is not None else False + + +def _user_data_file() -> Path: + base = Path(db_storage_path()) + base.mkdir(parents=True, exist_ok=True) + return base / ".crewai_user.json" + + +def _load_user_data() -> dict[str, Any]: + p = _user_data_file() + if p.exists(): + try: + return cast(dict[str, Any], json.loads(p.read_text())) + except (json.JSONDecodeError, OSError, PermissionError) as e: + logger.warning(f"Failed to load user data: {e}") + return {} + + +def _save_user_data(data: dict[str, Any]) -> None: + try: + p = _user_data_file() + p.write_text(json.dumps(data, indent=2)) + except (OSError, PermissionError) as e: + logger.warning(f"Failed to save user data: {e}") + + +def has_user_declined_tracing() -> bool: + """Check if user has explicitly declined trace collection. + + Returns: + True if user previously declined tracing, False otherwise. + """ + data = _load_user_data() + if data.get("first_execution_done", False): + return data.get("trace_consent", False) is False + return False + + def is_tracing_enabled() -> bool: + """Check if tracing should be enabled. + + + Returns: + True if tracing is enabled and not disabled, False otherwise. + """ + # If user has explicitly declined tracing, never enable it + if has_user_declined_tracing(): + return False + return os.getenv("CREWAI_TRACING_ENABLED", "false").lower() == "true" @@ -213,36 +327,12 @@ def _get_generic_system_id() -> str | None: return None -def _user_data_file() -> Path: - base = Path(db_storage_path()) - base.mkdir(parents=True, exist_ok=True) - return base / ".crewai_user.json" - - -def _load_user_data() -> dict: - p = _user_data_file() - if p.exists(): - try: - return json.loads(p.read_text()) - except (json.JSONDecodeError, OSError, PermissionError) as e: - logger.warning(f"Failed to load user data: {e}") - return {} - - -def _save_user_data(data: dict) -> None: - try: - p = _user_data_file() - p.write_text(json.dumps(data, indent=2)) - except (OSError, PermissionError) as e: - logger.warning(f"Failed to save user data: {e}") - - def get_user_id() -> str: """Stable, anonymized user identifier with caching.""" data = _load_user_data() if "user_id" in data: - return data["user_id"] + return cast(str, data["user_id"]) try: username = getpass.getuser() @@ -263,8 +353,12 @@ def is_first_execution() -> bool: return not data.get("first_execution_done", False) -def mark_first_execution_done() -> None: - """Mark that the first execution has been completed.""" +def mark_first_execution_done(user_consented: bool = False) -> None: + """Mark that the first execution has been completed. + + Args: + user_consented: Whether the user consented to trace collection. + """ data = _load_user_data() if data.get("first_execution_done", False): return @@ -275,12 +369,13 @@ def mark_first_execution_done() -> None: "first_execution_at": datetime.now().timestamp(), "user_id": get_user_id(), "machine_id": _get_machine_id(), + "trace_consent": user_consented, } ) _save_user_data(data) -def safe_serialize_to_dict(obj, exclude: set[str] | None = None) -> dict[str, Any]: +def safe_serialize_to_dict(obj: Any, exclude: set[str] | None = None) -> dict[str, Any]: """Safely serialize an object to a dictionary for event data.""" try: serialized = to_serializable(obj, exclude) @@ -291,7 +386,9 @@ def safe_serialize_to_dict(obj, exclude: set[str] | None = None) -> dict[str, An return {"serialization_error": str(e), "object_type": type(obj).__name__} -def truncate_messages(messages, max_content_length=500, max_messages=5): +def truncate_messages( + messages: list[dict[str, Any]], max_content_length: int = 500, max_messages: int = 5 +) -> list[dict[str, Any]]: """Truncate message content and limit number of messages""" if not messages or not isinstance(messages, list): return messages @@ -308,9 +405,22 @@ def truncate_messages(messages, max_content_length=500, max_messages=5): def should_auto_collect_first_time_traces() -> bool: - """True if we should auto-collect traces for first-time user.""" + """True if we should auto-collect traces for first-time user. + + + Returns: + True if first-time user AND telemetry not disabled AND tracing not explicitly enabled, False otherwise. + """ if _is_test_environment(): return False + + # If user has previously declined, never auto-collect + if has_user_declined_tracing(): + return False + + if is_tracing_enabled_in_context(): + return False + return is_first_execution() @@ -355,7 +465,7 @@ def prompt_user_for_trace_viewing(timeout_seconds: int = 20) -> bool: result = [False] - def get_input(): + def get_input() -> None: try: response = input().strip().lower() result[0] = response in ["y", "yes"] @@ -377,6 +487,10 @@ def prompt_user_for_trace_viewing(timeout_seconds: int = 20) -> bool: return False -def mark_first_execution_completed() -> None: - """Mark first execution as completed (called after trace prompt).""" - mark_first_execution_done() +def mark_first_execution_completed(user_consented: bool = False) -> None: + """Mark first execution as completed (called after trace prompt). + + Args: + user_consented: Whether the user consented to trace collection. + """ + mark_first_execution_done(user_consented=user_consented) diff --git a/lib/crewai/src/crewai/events/utils/console_formatter.py b/lib/crewai/src/crewai/events/utils/console_formatter.py index 32aa8d208..b610207dc 100644 --- a/lib/crewai/src/crewai/events/utils/console_formatter.py +++ b/lib/crewai/src/crewai/events/utils/console_formatter.py @@ -1,3 +1,4 @@ +import threading from typing import Any, ClassVar from rich.console import Console @@ -27,6 +28,7 @@ class ConsoleFormatter: _pending_a2a_turn_number: int | None = None _a2a_turn_branches: ClassVar[dict[int, Tree]] = {} _current_a2a_agent_name: str | None = None + crew_completion_printed: ClassVar[threading.Event] = threading.Event() def __init__(self, verbose: bool = False): self.console = Console(width=None) @@ -47,13 +49,44 @@ class ConsoleFormatter: padding=(1, 2), ) + def _show_tracing_disabled_message_if_needed(self) -> None: + """Show tracing disabled message if tracing is not enabled.""" + from crewai.events.listeners.tracing.utils import ( + has_user_declined_tracing, + is_tracing_enabled_in_context, + ) + + if not is_tracing_enabled_in_context(): + if has_user_declined_tracing(): + message = """Info: Tracing is disabled. + +To enable tracing, do any one of these: +• Set tracing=True in your Crew/Flow code +• Set CREWAI_TRACING_ENABLED=true in your project's .env file +• Run: crewai traces enable""" + else: + message = """Info: Tracing is disabled. + +To enable tracing, do any one of these: +• Set tracing=True in your Crew/Flow code +• Set CREWAI_TRACING_ENABLED=true in your project's .env file +• Run: crewai traces enable""" + + panel = Panel( + message, + title="Tracing Status", + border_style="blue", + padding=(1, 2), + ) + self.console.print(panel) + def create_status_content( self, title: str, name: str, status_style: str = "blue", tool_args: dict[str, Any] | str = "", - **fields, + **fields: Any, ) -> Text: """Create standardized status content with consistent formatting.""" content = Text() @@ -92,7 +125,7 @@ class ConsoleFormatter: """Add a node to the tree with consistent styling.""" return parent.add(Text(text, style=style)) - def print(self, *args, **kwargs) -> None: + def print(self, *args: Any, **kwargs: Any) -> None: """Custom print that replaces consecutive Tree renders. * If the argument is a single ``Tree`` instance, we either start a @@ -208,11 +241,20 @@ class ConsoleFormatter: self.print_panel(content, title, style) + if status in ["completed", "failed"]: + self.crew_completion_printed.set() + + # Show tracing disabled message after crew completion + self._show_tracing_disabled_message_if_needed() + def create_crew_tree(self, crew_name: str, source_id: str) -> Tree | None: """Create and initialize a new crew tree with initial status.""" if not self.verbose: return None + # Reset the crew completion event for this new crew execution + ConsoleFormatter.crew_completion_printed.clear() + tree = Tree( Text("🚀 Crew: ", style="cyan bold") + Text(crew_name, style="cyan") ) @@ -497,7 +539,7 @@ class ConsoleFormatter: return method_branch - def get_llm_tree(self, tool_name: str): + def get_llm_tree(self, tool_name: str) -> Tree: text = Text() text.append(f"🔧 Using {tool_name} from LLM available_function", style="yellow") @@ -512,7 +554,7 @@ class ConsoleFormatter: self, tool_name: str, tool_args: dict[str, Any] | str, - ): + ) -> None: # Create status content for the tool usage content = self.create_status_content( "Tool Usage Started", tool_name, Status="In Progress", tool_args=tool_args @@ -528,7 +570,7 @@ class ConsoleFormatter: def handle_llm_tool_usage_finished( self, tool_name: str, - ): + ) -> None: tree = self.get_llm_tree(tool_name) self.add_tree_node(tree, "✅ Tool Usage Completed", "green") self.print(tree) @@ -538,7 +580,7 @@ class ConsoleFormatter: self, tool_name: str, error: str, - ): + ) -> None: tree = self.get_llm_tree(tool_name) self.add_tree_node(tree, "❌ Tool Usage Failed", "red") self.print(tree) @@ -1558,7 +1600,7 @@ class ConsoleFormatter: if branch_to_use is None and tree_to_use is not None: branch_to_use = tree_to_use - def add_panel(): + def add_panel() -> None: memory_text = str(memory_content) if len(memory_text) > 500: memory_text = memory_text[:497] + "..." diff --git a/lib/crewai/src/crewai/flow/flow.py b/lib/crewai/src/crewai/flow/flow.py index 42b36eb1f..9b9a5a930 100644 --- a/lib/crewai/src/crewai/flow/flow.py +++ b/lib/crewai/src/crewai/flow/flow.py @@ -26,14 +26,17 @@ from uuid import uuid4 from opentelemetry import baggage from opentelemetry.context import attach, detach from pydantic import BaseModel, Field, ValidationError +from rich.console import Console +from rich.panel import Panel from crewai.events.event_bus import crewai_event_bus from crewai.events.listeners.tracing.trace_listener import ( TraceCollectionListener, ) from crewai.events.listeners.tracing.utils import ( - is_tracing_enabled, - should_auto_collect_first_time_traces, + has_user_declined_tracing, + set_tracing_enabled, + should_enable_tracing, ) from crewai.events.types.flow_events import ( FlowCreatedEvent, @@ -452,7 +455,7 @@ class Flow(Generic[T], metaclass=FlowMeta): _router_paths: ClassVar[dict[FlowMethodName, list[FlowMethodName]]] = {} initial_state: type[T] | T | None = None name: str | None = None - tracing: bool | None = False + tracing: bool | None = None def __class_getitem__(cls: type[Flow[T]], item: type[T]) -> type[Flow[T]]: class _FlowGeneric(cls): # type: ignore @@ -464,13 +467,14 @@ class Flow(Generic[T], metaclass=FlowMeta): def __init__( self, persistence: FlowPersistence | None = None, - tracing: bool | None = False, + tracing: bool | None = None, **kwargs: Any, ) -> None: """Initialize a new Flow instance. Args: persistence: Optional persistence backend for storing flow states + tracing: Whether to enable tracing. True=always enable, False=always disable, None=check environment/user settings **kwargs: Additional state values to initialize or override """ # Initialize basic instance attributes @@ -488,13 +492,11 @@ class Flow(Generic[T], metaclass=FlowMeta): # Initialize state with initial values self._state = self._create_initial_state() self.tracing = tracing - if ( - is_tracing_enabled() - or self.tracing - or should_auto_collect_first_time_traces() - ): - trace_listener = TraceCollectionListener() - trace_listener.setup_listeners(crewai_event_bus) + tracing_enabled = should_enable_tracing(override=self.tracing) + set_tracing_enabled(tracing_enabled) + + trace_listener = TraceCollectionListener() + trace_listener.setup_listeners(crewai_event_bus) # Apply any additional kwargs if kwargs: self._initialize_state(kwargs) @@ -936,18 +938,13 @@ class Flow(Generic[T], metaclass=FlowMeta): ) self._event_futures.clear() - if ( - is_tracing_enabled() - or self.tracing - or should_auto_collect_first_time_traces() - ): - trace_listener = TraceCollectionListener() - if trace_listener.batch_manager.batch_owner_type == "flow": - if trace_listener.first_time_handler.is_first_time: - trace_listener.first_time_handler.mark_events_collected() - trace_listener.first_time_handler.handle_execution_completion() - else: - trace_listener.batch_manager.finalize_batch() + trace_listener = TraceCollectionListener() + if trace_listener.batch_manager.batch_owner_type == "flow": + if trace_listener.first_time_handler.is_first_time: + trace_listener.first_time_handler.mark_events_collected() + trace_listener.first_time_handler.handle_execution_completion() + else: + trace_listener.batch_manager.finalize_batch() return final_output finally: @@ -1381,3 +1378,32 @@ class Flow(Generic[T], metaclass=FlowMeta): ) structure = build_flow_structure(self) return render_interactive(structure, filename=filename, show=show) + + @staticmethod + def _show_tracing_disabled_message() -> None: + """Show a message when tracing is disabled.""" + + console = Console() + + if has_user_declined_tracing(): + message = """Info: Tracing is disabled. + +To enable tracing, do any one of these: +• Set tracing=True in your Flow code +• Set CREWAI_TRACING_ENABLED=true in your project's .env file +• Run: crewai traces enable""" + else: + message = """Info: Tracing is disabled. + +To enable tracing, do any one of these: +• Set tracing=True in your Flow code +• Set CREWAI_TRACING_ENABLED=true in your project's .env file +• Run: crewai traces enable""" + + panel = Panel( + message, + title="Tracing Status", + border_style="blue", + padding=(1, 2), + ) + console.print(panel) diff --git a/lib/crewai/tests/agents/test_agent.py b/lib/crewai/tests/agents/test_agent.py index 4fd1f3b5b..5bc9f3421 100644 --- a/lib/crewai/tests/agents/test_agent.py +++ b/lib/crewai/tests/agents/test_agent.py @@ -2148,7 +2148,7 @@ def test_agent_with_knowledge_with_no_crewai_knowledge(): mock_knowledge.query.assert_called_once() -@pytest.mark.vcr(record_mode="none", filter_headers=["authorization"]) +@pytest.mark.vcr(filter_headers=["authorization"]) def test_agent_with_only_crewai_knowledge(): mock_knowledge = MagicMock(spec=Knowledge) diff --git a/lib/crewai/tests/cassettes/TestTraceEnableDisable.test_no_http_calls_when_disabled_via_env.yaml b/lib/crewai/tests/cassettes/TestTraceEnableDisable.test_no_http_calls_when_disabled_via_env.yaml new file mode 100644 index 000000000..f6726847b --- /dev/null +++ b/lib/crewai/tests/cassettes/TestTraceEnableDisable.test_no_http_calls_when_disabled_via_env.yaml @@ -0,0 +1,125 @@ +interactions: +- request: + body: '{"messages":[{"role":"system","content":"You are Test Agent. Test backstory\nYour + personal goal is: Test goal\nTo give my best complete final answer to the task + respond using the exact following format:\n\nThought: I now can give a great + answer\nFinal Answer: Your final answer must be the great and the most complete + as possible, it must be outcome described.\n\nI MUST use these formats, my job + depends on it!"},{"role":"user","content":"\nCurrent Task: Say hello\n\nThis + is the expected criteria for your final answer: hello\nyou MUST return the actual + complete content as the final answer, not a summary.\n\nBegin! This is VERY + important to you, use the tools available and give your best Final Answer, your + job depends on it!\n\nThought:"}],"model":"gpt-4o-mini"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '768' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.109.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.109.1 + x-stainless-read-timeout: + - '600' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.10 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAA4xSTWvcMBC9+1cMOq/LrvcT30pCQ2hPPZW2wYylsa1EloQkZ7eE/e9F8nbtNCn0 + YvC8eU/vzcxLBsCkYCUw3mHgvVX5Db+TN40v1p+/HZ5Ot4/16VibL18Pt7v+O7JFZJj6kXj4w/rA + TW8VBWn0CHNHGCiqrva7dbHe7TfLBPRGkIq01oZ8Y/JeapkXy2KTL/f56nBhd0Zy8qyEHxkAwEv6 + Rp9a0ImVkLRSpSfvsSVWXpsAmDMqVhh6L31AHdhiArnRgXSyfg/aHIGjhlY+EyC00Tag9kdyAD/1 + J6lRwcf0X0JHSpm5lKNm8Bjj6EGpGYBam4BxHCnEwwU5X20r01pnav8XlTVSS99VjtAbHS36YCxL + 6DkDeEjjGV4lZtaZ3oYqmCdKz62261GPTVuZocUFDCagmtV328U7epWggFL52YAZR96RmKjTNnAQ + 0syAbJb6rZv3tMfkUrf/Iz8BnJMNJCrrSEj+OvHU5ige7b/arlNOhpkn9yw5VUGSi5sQ1OCgxlNi + /pcP1FeN1C056+R4T42ttitRHzbYYM2yc/YbAAD//wMA8psF7l0DAAA= + headers: + CF-RAY: + - 99f1539c6ee7300b-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Sat, 15 Nov 2025 19:59:01 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=iJ7DXHm9JEv8bD0KtW7kldOwGHzDHimj_krrUoVmeWE-1763236741-1.0.1.1-xHKDPJseB3CipXlmYujRzoXEH1migUJ0tnSBSv5GTUQTcz5bUrq4zOGEEP0EBmf.EovzlSffbmbTILOP0JSuiNfHJaGxv2e0zdL11mrf93s; + path=/; expires=Sat, 15-Nov-25 20:29:01 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=oxDuGA6GZmxAwFshfsuJX0CY15NqcsDWeNUCWzgKh8s-1763236741049-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '423' + openai-project: + - proj_xitITlrFeen7zjNSzML82h9x + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '442' + x-openai-proxy-wasm: + - v0.1 + x-ratelimit-limit-project-tokens: + - '150000000' + x-ratelimit-limit-requests: + - '30000' + x-ratelimit-limit-tokens: + - '150000000' + x-ratelimit-remaining-project-tokens: + - '149999830' + x-ratelimit-remaining-requests: + - '29999' + x-ratelimit-remaining-tokens: + - '149999832' + x-ratelimit-reset-project-tokens: + - 0s + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_40cbf724f6154e619aa343371e48c2e0 + status: + code: 200 + message: OK +version: 1 diff --git a/lib/crewai/tests/cassettes/TestTraceEnableDisable.test_no_http_calls_when_disabled_via_tracing_false.yaml b/lib/crewai/tests/cassettes/TestTraceEnableDisable.test_no_http_calls_when_disabled_via_tracing_false.yaml new file mode 100644 index 000000000..fa3124115 --- /dev/null +++ b/lib/crewai/tests/cassettes/TestTraceEnableDisable.test_no_http_calls_when_disabled_via_tracing_false.yaml @@ -0,0 +1,125 @@ +interactions: +- request: + body: '{"messages":[{"role":"system","content":"You are Test Agent. Test backstory\nYour + personal goal is: Test goal\nTo give my best complete final answer to the task + respond using the exact following format:\n\nThought: I now can give a great + answer\nFinal Answer: Your final answer must be the great and the most complete + as possible, it must be outcome described.\n\nI MUST use these formats, my job + depends on it!"},{"role":"user","content":"\nCurrent Task: Say hello\n\nThis + is the expected criteria for your final answer: hello\nyou MUST return the actual + complete content as the final answer, not a summary.\n\nBegin! This is VERY + important to you, use the tools available and give your best Final Answer, your + job depends on it!\n\nThought:"}],"model":"gpt-4o-mini"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '768' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.109.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.109.1 + x-stainless-read-timeout: + - '600' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.10 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAAwAAAP//jFLLbtswELzrKxY8W4VtyQ/oFgRtkUvRS3tpA4EmV9K2FEmQVGwj8L8X + pFxLSVMgFwHa2RnO7O5zBsBIsgqY6HgQvVX5vfhM98Vpf1x+LT82VGzoW3n+cj7J7+ZBsUVkmMMv + FOEv64MwvVUYyOgRFg55wKi62m2LdbHdlcsE9EaiirTWhrw0eU+a8vVyXebLXb7aX9mdIYGeVfAj + AwB4Tt/oU0s8sQqSVqr06D1vkVW3JgDmjIoVxr0nH7gObDGBwuiAOll/AG2OILiGlp4QOLTRNnDt + j+gAfupPpLmCu/RfQYdKmbmUw2bwPMbRg1IzgGttAo/jSCEer8jlZluZ1jpz8K+orCFNvqsdcm90 + tOiDsSyhlwzgMY1neJGYWWd6G+pgfmN6brUpRj02bWWGrq9gMIGrWX27WbyhV0sMnJSfDZgJLjqU + E3XaBh8kmRmQzVL/6+Yt7TE56fY98hMgBNqAsrYOJYmXiac2h/Fo/9d2m3IyzDy6JxJYB0IXNyGx + 4YMaT4n5sw/Y1w3pFp11NN5TY+vNSh72JW/4gWWX7A8AAAD//wMA4G7eUl0DAAA= + headers: + CF-RAY: + - 99f1539888ef2db2-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Sat, 15 Nov 2025 19:59:00 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=XfT4seD2vDCBhKUjM9OKFn5pKK0guvewRLCuULoZnBg-1763236740-1.0.1.1-zPAXYvNJ5nm4SdMpIaKFFAF1Uu_TTX1J6Pz3NhGjhY8GWCM13UtG2dg_4zqAf4ag.ZiOr0jBFi64qTdzWDsB8i4GpXeY0YJ_1WGwFIh21JY; + path=/; expires=Sat, 15-Nov-25 20:29:00 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=ggMXMo_t19yDC2ZcfQNnNeE8_tibkraG0hezFWQf3Xk-1763236740469-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '466' + openai-project: + - proj_xitITlrFeen7zjNSzML82h9x + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '485' + x-openai-proxy-wasm: + - v0.1 + x-ratelimit-limit-project-tokens: + - '150000000' + x-ratelimit-limit-requests: + - '30000' + x-ratelimit-limit-tokens: + - '150000000' + x-ratelimit-remaining-project-tokens: + - '149999832' + x-ratelimit-remaining-requests: + - '29999' + x-ratelimit-remaining-tokens: + - '149999832' + x-ratelimit-reset-project-tokens: + - 0s + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_d62131d777d34f568bd37dcf3ecc3749 + status: + code: 200 + message: OK +version: 1 diff --git a/lib/crewai/tests/cassettes/TestTraceEnableDisable.test_trace_calls_when_enabled_via_env.yaml b/lib/crewai/tests/cassettes/TestTraceEnableDisable.test_trace_calls_when_enabled_via_env.yaml new file mode 100644 index 000000000..89f7bdef1 --- /dev/null +++ b/lib/crewai/tests/cassettes/TestTraceEnableDisable.test_trace_calls_when_enabled_via_env.yaml @@ -0,0 +1,823 @@ +interactions: +- request: + body: '{"trace_id": "REDACTED_TRACE_ID", "execution_type": "crew", "user_identifier": + null, "execution_context": {"crew_fingerprint": null, "crew_name": "crew", "flow_name": + null, "crewai_version": "1.4.1", "privacy_level": "standard"}, "execution_metadata": + {"expected_duration_estimate": 300, "agent_count": 0, "task_count": 0, "flow_method_count": + 0, "execution_started_at": "2025-11-15T19:58:54.275699+00:00"}, "ephemeral_trace_id": + "REDACTED_EPHEMERAL_ID"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '488' + Content-Type: + - application/json + User-Agent: + - CrewAI-CLI/1.4.1 + X-Crewai-Organization-Id: + - REDACTED_ORG_UUID + X-Crewai-Version: + - 1.4.1 + method: POST + uri: https://app.crewai.com/crewai_plus/api/v1/tracing/ephemeral/batches + response: + body: + string: '{"id":"REDACTED_UUID","ephemeral_trace_id": "REDACTED_EPHEMERAL_ID","execution_type":"crew","crew_name":"crew","flow_name":null,"status":"running","duration_ms":null,"crewai_version":"1.4.1","total_events":0,"execution_context":{"crew_fingerprint":null,"crew_name":"crew","flow_name":null,"crewai_version":"1.4.1","privacy_level":"standard"},"created_at":"2025-11-15T19:58:54.413Z","updated_at":"2025-11-15T19:58:54.413Z","access_code": + "REDACTED_ACCESS_CODE","user_identifier":null}' + headers: + Connection: + - keep-alive + Content-Length: + - '515' + Content-Type: + - application/json; charset=utf-8 + Date: + - Sat, 15 Nov 2025 19:58:54 GMT + cache-control: + - no-store + content-security-policy: + - 'default-src ''self'' *.app.crewai.com app.crewai.com; script-src ''self'' + ''unsafe-inline'' *.app.crewai.com app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts + https://www.gstatic.com https://run.pstmn.io https://apis.google.com https://apis.google.com/js/api.js + https://accounts.google.com https://accounts.google.com/gsi/client https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css.map + https://*.google.com https://docs.google.com https://slides.google.com https://js.hs-scripts.com + https://js.sentry-cdn.com https://browser.sentry-cdn.com https://www.googletagmanager.com + https://js-na1.hs-scripts.com https://js.hubspot.com http://js-na1.hs-scripts.com + https://bat.bing.com https://cdn.amplitude.com https://cdn.segment.com https://d1d3n03t5zntha.cloudfront.net/ + https://descriptusercontent.com https://edge.fullstory.com https://googleads.g.doubleclick.net + https://js.hs-analytics.net https://js.hs-banner.com https://js.hsadspixel.net + https://js.hscollectedforms.net https://js.usemessages.com https://snap.licdn.com + https://static.cloudflareinsights.com https://static.reo.dev https://www.google-analytics.com + https://share.descript.com/; style-src ''self'' ''unsafe-inline'' *.app.crewai.com + app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts; img-src ''self'' data: + *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com https://dashboard.tools.crewai.com + https://cdn.jsdelivr.net https://forms.hsforms.com https://track.hubspot.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://www.google.com + https://www.google.com.br; font-src ''self'' data: *.app.crewai.com app.crewai.com; + connect-src ''self'' *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com + https://connect.useparagon.com/ https://zeus.useparagon.com/* https://*.useparagon.com/* + https://run.pstmn.io https://connect.tools.crewai.com/ https://*.sentry.io + https://www.google-analytics.com https://edge.fullstory.com https://rs.fullstory.com + https://api.hubspot.com https://forms.hscollectedforms.net https://api.hubapi.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://google.com/pagead/form-data/16713662509 + https://google.com/ccm/form-data/16713662509 https://www.google.com/ccm/collect + https://worker-actionkit.tools.crewai.com https://api.reo.dev; frame-src ''self'' + *.app.crewai.com app.crewai.com https://connect.useparagon.com/ https://zeus.tools.crewai.com + https://zeus.useparagon.com/* https://connect.tools.crewai.com/ https://docs.google.com + https://drive.google.com https://slides.google.com https://accounts.google.com + https://*.google.com https://app.hubspot.com/ https://td.doubleclick.net https://www.googletagmanager.com/ + https://www.youtube.com https://share.descript.com' + etag: + - W/"f189110ff0b9b1a9a6de911c8373b6cf" + expires: + - '0' + permissions-policy: + - camera=(), microphone=(self), geolocation=() + pragma: + - no-cache + referrer-policy: + - strict-origin-when-cross-origin + strict-transport-security: + - max-age=63072000; includeSubDomains + vary: + - Accept + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-permitted-cross-domain-policies: + - none + x-request-id: + - REDACTED_ORG_UUID + x-runtime: + - '0.050437' + x-xss-protection: + - 1; mode=block + status: + code: 201 + message: Created +- request: + body: '{"messages":[{"role":"system","content":"You are Test Agent. Test backstory\nYour + personal goal is: Test goal\nTo give my best complete final answer to the task + respond using the exact following format:\n\nThought: I now can give a great + answer\nFinal Answer: Your final answer must be the great and the most complete + as possible, it must be outcome described.\n\nI MUST use these formats, my job + depends on it!"},{"role":"user","content":"\nCurrent Task: Say hello\n\nThis + is the expected criteria for your final answer: hello\nyou MUST return the actual + complete content as the final answer, not a summary.\n\nBegin! This is VERY + important to you, use the tools available and give your best Final Answer, your + job depends on it!\n\nThought:"}],"model":"gpt-4o-mini"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '768' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.109.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.109.1 + x-stainless-read-timeout: + - '600' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.10 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAAwAAAP//jFJNj9MwEL3nV4x8blDTz1VuuyuoQHBYcUKwiqb2JDE4Hst2WtCq/x05 + 7TZZWCQukTJv3vN7M/OUAQitRAlCthhl50x+L3d64z887I6fLW/D22b+KRZ3t18ePu7sQcwSg/ff + ScZn1hvJnTMUNdszLD1hpKRabDfLxXKzXa4GoGNFJtEaF/MV5522Ol/MF6t8vs2Lmwu7ZS0piBK+ + ZgAAT8M3+bSKfooS5rPnSkchYEOivDYBCM8mVQSGoENEG8VsBCXbSHaw/h4sH0GihUYfCBCaZBvQ + hiN5gG/2nbZo4Hb4L6ElY3gq5anuA6Y4tjdmAqC1HDGNYwjxeEFOV9uGG+d5H/6gilpbHdrKEwa2 + yWKI7MSAnjKAx2E8/YvEwnnuXKwi/6DhuWK9POuJcSsTdHEBI0c0k/pmPXtFr1IUUZswGbCQKFtS + I3XcBvZK8wTIJqn/dvOa9jm5ts3/yI+AlOQiqcp5Ulq+TDy2eUpH+6+265QHwyKQP2hJVdTk0yYU + 1dib8ymJ8CtE6qpa24a88/p8T7Wr1oXa36ywxr3ITtlvAAAA//8DADWEgGFdAwAA + headers: + CF-RAY: + - 99f15376386adf9a-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Sat, 15 Nov 2025 19:58:55 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=9N8QMgVR0T8m_LdeyT4oWCaQR47O2ACGkH9wXpfPKl8-1763236735-1.0.1.1-8xseH3YJzZo2ypKXBqE14SRYMqgQ1HSsW4ayyXXngCD66TFqO2xnfd9OqOA3mNh8hmoRXr9SGuLn84hiEL95_w_RQXvRFQ.JQb7mFThffN4; + path=/; expires=Sat, 15-Nov-25 20:28:55 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=U_X_uM8Tk1B.1aiCr807RSOANcHTrF7LPQW1aUwSUCI-1763236735590-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '1083' + openai-project: + - proj_xitITlrFeen7zjNSzML82h9x + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '1098' + x-openai-proxy-wasm: + - v0.1 + x-ratelimit-limit-project-tokens: + - '150000000' + x-ratelimit-limit-requests: + - '30000' + x-ratelimit-limit-tokens: + - '150000000' + x-ratelimit-remaining-project-tokens: + - '149999830' + x-ratelimit-remaining-requests: + - '29999' + x-ratelimit-remaining-tokens: + - '149999832' + x-ratelimit-reset-project-tokens: + - 0s + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_51e6f28672744e42b0cf17b175e98cad + status: + code: 200 + message: OK +- request: + body: '{"events": [{"event_id": "REDACTED_EVENT_ID", "timestamp": + "2025-11-15T19:58:54.274122+00:00", "type": "crew_kickoff_started", "event_data": + {"timestamp": "2025-11-15T19:58:54.274122+00:00", "type": "crew_kickoff_started", + "source_fingerprint": null, "source_type": null, "fingerprint_metadata": null, + "task_id": null, "task_name": null, "agent_id": null, "agent_role": null, "crew_name": + "crew", "crew": null, "inputs": null}}, {"event_id": "REDACTED_EVENT_ID", + "timestamp": "2025-11-15T19:58:54.276149+00:00", "type": "task_started", "event_data": + {"task_description": "Say hello", "expected_output": "hello", "task_name": "Say + hello", "context": "", "agent_role": "Test Agent", "task_id": "REDACTED_TASK_ID"}}, + {"event_id": "REDACTED_EVENT_ID", "timestamp": "2025-11-15T19:58:54.277520+00:00", + "type": "agent_execution_started", "event_data": {"agent_role": "Test Agent", + "agent_goal": "Test goal", "agent_backstory": "Test backstory"}}, {"event_id": + "6ab5ba71-81ef-4aea-800a-a4e332976b23", "timestamp": "2025-11-15T19:58:54.277708+00:00", + "type": "llm_call_started", "event_data": {"timestamp": "2025-11-15T19:58:54.277708+00:00", + "type": "llm_call_started", "source_fingerprint": null, "source_type": null, + "fingerprint_metadata": null, "task_id": "REDACTED_TASK_ID", + "task_name": "Say hello", "agent_id": "REDACTED_AGENT_ID", + "agent_role": "Test Agent", "from_task": null, "from_agent": null, "model": + "gpt-4o-mini", "messages": [{"role": "system", "content": "You are Test Agent. + Test backstory\nYour personal goal is: Test goal\nTo give my best complete final + answer to the task respond using the exact following format:\n\nThought: I now + can give a great answer\nFinal Answer: Your final answer must be the great and + the most complete as possible, it must be outcome described.\n\nI MUST use these + formats, my job depends on it!"}, {"role": "user", "content": "\nCurrent Task: + Say hello\n\nThis is the expected criteria for your final answer: hello\nyou + MUST return the actual complete content as the final answer, not a summary.\n\nBegin! + This is VERY important to you, use the tools available and give your best Final + Answer, your job depends on it!\n\nThought:"}], "tools": null, "callbacks": + [""], + "available_functions": null}}, {"event_id": "REDACTED_EVENT_ID", + "timestamp": "2025-11-15T19:58:55.617486+00:00", "type": "llm_call_completed", + "event_data": {"timestamp": "2025-11-15T19:58:55.617486+00:00", "type": "llm_call_completed", + "source_fingerprint": null, "source_type": null, "fingerprint_metadata": null, + "task_id": "REDACTED_TASK_ID", "task_name": "Say hello", + "agent_id": "REDACTED_AGENT_ID", "agent_role": "Test Agent", + "from_task": null, "from_agent": null, "messages": [{"role": "system", "content": + "You are Test Agent. Test backstory\nYour personal goal is: Test goal\nTo give + my best complete final answer to the task respond using the exact following + format:\n\nThought: I now can give a great answer\nFinal Answer: Your final + answer must be the great and the most complete as possible, it must be outcome + described.\n\nI MUST use these formats, my job depends on it!"}, {"role": "user", + "content": "\nCurrent Task: Say hello\n\nThis is the expected criteria for your + final answer: hello\nyou MUST return the actual complete content as the final + answer, not a summary.\n\nBegin! This is VERY important to you, use the tools + available and give your best Final Answer, your job depends on it!\n\nThought:"}], + "response": "I now can give a great answer \nFinal Answer: hello", "call_type": + "", "model": "gpt-4o-mini"}}, {"event_id": + "6da05ee3-40a0-44d3-9070-58f83e91fb02", "timestamp": "2025-11-15T19:58:55.617749+00:00", + "type": "agent_execution_completed", "event_data": {"agent_role": "Test Agent", + "agent_goal": "Test goal", "agent_backstory": "Test backstory"}}, {"event_id": + "323a901f-c31a-4937-aa83-99f80a195ec9", "timestamp": "2025-11-15T19:58:55.617956+00:00", + "type": "task_completed", "event_data": {"task_description": "Say hello", "task_name": + "Say hello", "task_id": "REDACTED_TASK_ID", "output_raw": + "hello", "output_format": "OutputFormat.RAW", "agent_role": "Test Agent"}}, + {"event_id": "REDACTED_EVENT_ID", "timestamp": "2025-11-15T19:58:55.620199+00:00", + "type": "crew_kickoff_completed", "event_data": {"timestamp": "2025-11-15T19:58:55.620199+00:00", + "type": "crew_kickoff_completed", "source_fingerprint": null, "source_type": + null, "fingerprint_metadata": null, "task_id": null, "task_name": null, "agent_id": + null, "agent_role": null, "crew_name": "crew", "crew": null, "output": {"description": + "Say hello", "name": "Say hello", "expected_output": "hello", "summary": "Say + hello...", "raw": "hello", "pydantic": null, "json_dict": null, "agent": "Test + Agent", "output_format": "raw", "messages": [{"role": "''system''", "content": + "''You are Test Agent. Test backstory\\nYour personal goal is: Test goal\\nTo + give my best complete final answer to the task respond using the exact following + format:\\n\\nThought: I now can give a great answer\\nFinal Answer: Your final + answer must be the great and the most complete as possible, it must be outcome + described.\\n\\nI MUST use these formats, my job depends on it!''"}, {"role": + "''user''", "content": "''\\nCurrent Task: Say hello\\n\\nThis is the expected + criteria for your final answer: hello\\nyou MUST return the actual complete + content as the final answer, not a summary.\\n\\nBegin! This is VERY important + to you, use the tools available and give your best Final Answer, your job depends + on it!\\n\\nThought:''"}, {"role": "''assistant''", "content": "''I now can + give a great answer \\nFinal Answer: hello''"}]}, "total_tokens": 165}}], "batch_metadata": + {"events_count": 8, "batch_sequence": 1, "is_final_batch": false}}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '6047' + Content-Type: + - application/json + User-Agent: + - CrewAI-CLI/1.4.1 + X-Crewai-Organization-Id: + - REDACTED_ORG_UUID + X-Crewai-Version: + - 1.4.1 + method: POST + uri: https://app.crewai.com/crewai_plus/api/v1/tracing/ephemeral/batches/REDACTED_UUID/events + response: + body: + string: '{"events_created":8,"ephemeral_trace_batch_id": "REDACTED_BATCH_ID"}' + headers: + Connection: + - keep-alive + Content-Length: + - '86' + Content-Type: + - application/json; charset=utf-8 + Date: + - Sat, 15 Nov 2025 19:58:55 GMT + cache-control: + - no-store + content-security-policy: + - 'default-src ''self'' *.app.crewai.com app.crewai.com; script-src ''self'' + ''unsafe-inline'' *.app.crewai.com app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts + https://www.gstatic.com https://run.pstmn.io https://apis.google.com https://apis.google.com/js/api.js + https://accounts.google.com https://accounts.google.com/gsi/client https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css.map + https://*.google.com https://docs.google.com https://slides.google.com https://js.hs-scripts.com + https://js.sentry-cdn.com https://browser.sentry-cdn.com https://www.googletagmanager.com + https://js-na1.hs-scripts.com https://js.hubspot.com http://js-na1.hs-scripts.com + https://bat.bing.com https://cdn.amplitude.com https://cdn.segment.com https://d1d3n03t5zntha.cloudfront.net/ + https://descriptusercontent.com https://edge.fullstory.com https://googleads.g.doubleclick.net + https://js.hs-analytics.net https://js.hs-banner.com https://js.hsadspixel.net + https://js.hscollectedforms.net https://js.usemessages.com https://snap.licdn.com + https://static.cloudflareinsights.com https://static.reo.dev https://www.google-analytics.com + https://share.descript.com/; style-src ''self'' ''unsafe-inline'' *.app.crewai.com + app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts; img-src ''self'' data: + *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com https://dashboard.tools.crewai.com + https://cdn.jsdelivr.net https://forms.hsforms.com https://track.hubspot.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://www.google.com + https://www.google.com.br; font-src ''self'' data: *.app.crewai.com app.crewai.com; + connect-src ''self'' *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com + https://connect.useparagon.com/ https://zeus.useparagon.com/* https://*.useparagon.com/* + https://run.pstmn.io https://connect.tools.crewai.com/ https://*.sentry.io + https://www.google-analytics.com https://edge.fullstory.com https://rs.fullstory.com + https://api.hubspot.com https://forms.hscollectedforms.net https://api.hubapi.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://google.com/pagead/form-data/16713662509 + https://google.com/ccm/form-data/16713662509 https://www.google.com/ccm/collect + https://worker-actionkit.tools.crewai.com https://api.reo.dev; frame-src ''self'' + *.app.crewai.com app.crewai.com https://connect.useparagon.com/ https://zeus.tools.crewai.com + https://zeus.useparagon.com/* https://connect.tools.crewai.com/ https://docs.google.com + https://drive.google.com https://slides.google.com https://accounts.google.com + https://*.google.com https://app.hubspot.com/ https://td.doubleclick.net https://www.googletagmanager.com/ + https://www.youtube.com https://share.descript.com' + etag: + - W/"5763c4d7ea0188702ab3c06667edacb2" + expires: + - '0' + permissions-policy: + - camera=(), microphone=(self), geolocation=() + pragma: + - no-cache + referrer-policy: + - strict-origin-when-cross-origin + strict-transport-security: + - max-age=63072000; includeSubDomains + vary: + - Accept + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-permitted-cross-domain-policies: + - none + x-request-id: + - REDACTED_ORG_UUID + x-runtime: + - '0.085717' + x-xss-protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: '{"status": "completed", "duration_ms": 1545, "final_event_count": 8}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '68' + Content-Type: + - application/json + User-Agent: + - CrewAI-CLI/1.4.1 + X-Crewai-Organization-Id: + - REDACTED_ORG_UUID + X-Crewai-Version: + - 1.4.1 + method: PATCH + uri: https://app.crewai.com/crewai_plus/api/v1/tracing/ephemeral/batches/REDACTED_UUID/finalize + response: + body: + string: '{"id":"REDACTED_UUID","ephemeral_trace_id": "REDACTED_EPHEMERAL_ID","execution_type":"crew","crew_name":"crew","flow_name":null,"status":"completed","duration_ms":1545,"crewai_version":"1.4.1","total_events":8,"execution_context":{"crew_name":"crew","flow_name":null,"privacy_level":"standard","crewai_version":"1.4.1","crew_fingerprint":null},"created_at":"2025-11-15T19:58:54.413Z","updated_at":"2025-11-15T19:58:55.963Z","access_code": + "REDACTED_ACCESS_CODE","user_identifier":null}' + headers: + Connection: + - keep-alive + Content-Length: + - '517' + Content-Type: + - application/json; charset=utf-8 + Date: + - Sat, 15 Nov 2025 19:58:55 GMT + cache-control: + - no-store + content-security-policy: + - 'default-src ''self'' *.app.crewai.com app.crewai.com; script-src ''self'' + ''unsafe-inline'' *.app.crewai.com app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts + https://www.gstatic.com https://run.pstmn.io https://apis.google.com https://apis.google.com/js/api.js + https://accounts.google.com https://accounts.google.com/gsi/client https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css.map + https://*.google.com https://docs.google.com https://slides.google.com https://js.hs-scripts.com + https://js.sentry-cdn.com https://browser.sentry-cdn.com https://www.googletagmanager.com + https://js-na1.hs-scripts.com https://js.hubspot.com http://js-na1.hs-scripts.com + https://bat.bing.com https://cdn.amplitude.com https://cdn.segment.com https://d1d3n03t5zntha.cloudfront.net/ + https://descriptusercontent.com https://edge.fullstory.com https://googleads.g.doubleclick.net + https://js.hs-analytics.net https://js.hs-banner.com https://js.hsadspixel.net + https://js.hscollectedforms.net https://js.usemessages.com https://snap.licdn.com + https://static.cloudflareinsights.com https://static.reo.dev https://www.google-analytics.com + https://share.descript.com/; style-src ''self'' ''unsafe-inline'' *.app.crewai.com + app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts; img-src ''self'' data: + *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com https://dashboard.tools.crewai.com + https://cdn.jsdelivr.net https://forms.hsforms.com https://track.hubspot.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://www.google.com + https://www.google.com.br; font-src ''self'' data: *.app.crewai.com app.crewai.com; + connect-src ''self'' *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com + https://connect.useparagon.com/ https://zeus.useparagon.com/* https://*.useparagon.com/* + https://run.pstmn.io https://connect.tools.crewai.com/ https://*.sentry.io + https://www.google-analytics.com https://edge.fullstory.com https://rs.fullstory.com + https://api.hubspot.com https://forms.hscollectedforms.net https://api.hubapi.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://google.com/pagead/form-data/16713662509 + https://google.com/ccm/form-data/16713662509 https://www.google.com/ccm/collect + https://worker-actionkit.tools.crewai.com https://api.reo.dev; frame-src ''self'' + *.app.crewai.com app.crewai.com https://connect.useparagon.com/ https://zeus.tools.crewai.com + https://zeus.useparagon.com/* https://connect.tools.crewai.com/ https://docs.google.com + https://drive.google.com https://slides.google.com https://accounts.google.com + https://*.google.com https://app.hubspot.com/ https://td.doubleclick.net https://www.googletagmanager.com/ + https://www.youtube.com https://share.descript.com' + etag: + - W/"87272a0b299949ee15066ac5b6c288c8" + expires: + - '0' + permissions-policy: + - camera=(), microphone=(self), geolocation=() + pragma: + - no-cache + referrer-policy: + - strict-origin-when-cross-origin + strict-transport-security: + - max-age=63072000; includeSubDomains + vary: + - Accept + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-permitted-cross-domain-policies: + - none + x-request-id: + - REDACTED_ORG_UUID + x-runtime: + - '0.040548' + x-xss-protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: !!binary | + Ct8QCiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkSthAKEgoQY3Jld2FpLnRl + bGVtZXRyeRKcCAoQnBgYneZ/2zN+PxfURVYEhxIIl8jmYkveFbEqDENyZXcgQ3JlYXRlZDABOSBG + V8F3RngYQbD+XsF3RngYShkKDmNyZXdhaV92ZXJzaW9uEgcKBTEuNC4xShsKDnB5dGhvbl92ZXJz + aW9uEgkKBzMuMTIuMTBKLgoIY3Jld19rZXkSIgogZTU5ZjRhOTQ1MDMyOTJhYjg2NTVhODc4Nzlk + ZjNkMGVKMQoHY3Jld19pZBImCiRmNTFiYWY5YS0wOTliLTQ2ZjYtYTQxZS0zYjVkNTNmN2U3NzJK + OgoQY3Jld19maW5nZXJwcmludBImCiRlYTU0MGVkMC1mMmQxLTQwNDQtOGI5Zi1hNjI0MmY1NGYx + MjRKHAoMY3Jld19wcm9jZXNzEgwKCnNlcXVlbnRpYWxKEQoLY3Jld19tZW1vcnkSAhAAShoKFGNy + ZXdfbnVtYmVyX29mX3Rhc2tzEgIYAUobChVjcmV3X251bWJlcl9vZl9hZ2VudHMSAhgBSjsKG2Ny + ZXdfZmluZ2VycHJpbnRfY3JlYXRlZF9hdBIcChoyMDI1LTExLTE1VDE0OjU4OjU0LjI3MjkyMUrR + AgoLY3Jld19hZ2VudHMSwQIKvgJbeyJrZXkiOiAiMGMzZDYzYTY5MGUxM2Y1MTBkZTNjZDZkZmQz + MTgxNmIiLCAiaWQiOiAiNTQ4YzlkOWMtN2M4OS00NTcwLTg2MzUtMTU3OTc0ZDc1M2JlIiwgInJv + bGUiOiAiVGVzdCBBZ2VudCIsICJ2ZXJib3NlPyI6IGZhbHNlLCAibWF4X2l0ZXIiOiAyNSwgIm1h + eF9ycG0iOiBudWxsLCAiZnVuY3Rpb25fY2FsbGluZ19sbG0iOiAiIiwgImxsbSI6ICJncHQtNG8t + bWluaSIsICJkZWxlZ2F0aW9uX2VuYWJsZWQ/IjogZmFsc2UsICJhbGxvd19jb2RlX2V4ZWN1dGlv + bj8iOiBmYWxzZSwgIm1heF9yZXRyeV9saW1pdCI6IDIsICJ0b29sc19uYW1lcyI6IFtdfV1K/wEK + CmNyZXdfdGFza3MS8AEK7QFbeyJrZXkiOiAiMTdjYzlhYjJiMmQwYmIwY2RkMzZkNTNlMDUyYmEz + YTEiLCAiaWQiOiAiMGFjODNjNzktYmZiNS00MTc5LTk0NzAtMmI0OWIxNmUxM2I0IiwgImFzeW5j + X2V4ZWN1dGlvbj8iOiBmYWxzZSwgImh1bWFuX2lucHV0PyI6IGZhbHNlLCAiYWdlbnRfcm9sZSI6 + ICJUZXN0IEFnZW50IiwgImFnZW50X2tleSI6ICIwYzNkNjNhNjkwZTEzZjUxMGRlM2NkNmRmZDMx + ODE2YiIsICJ0b29sc19uYW1lcyI6IFtdfV16AhgBhQEAAQAAEpwEChA/Ny+I8Uec4bmw/hRH3QdM + Egj4Fl8kb84nDCoMVGFzayBDcmVhdGVkMAE5yF54wXdGeBhBwAZ5wXdGeBhKLgoIY3Jld19rZXkS + IgogZTU5ZjRhOTQ1MDMyOTJhYjg2NTVhODc4NzlkZjNkMGVKMQoHY3Jld19pZBImCiRmNTFiYWY5 + YS0wOTliLTQ2ZjYtYTQxZS0zYjVkNTNmN2U3NzJKOgoQY3Jld19maW5nZXJwcmludBImCiRlYTU0 + MGVkMC1mMmQxLTQwNDQtOGI5Zi1hNjI0MmY1NGYxMjRKLgoIdGFza19rZXkSIgogMTdjYzlhYjJi + MmQwYmIwY2RkMzZkNTNlMDUyYmEzYTFKMQoHdGFza19pZBImCiQwYWM4M2M3OS1iZmI1LTQxNzkt + OTQ3MC0yYjQ5YjE2ZTEzYjRKOgoQdGFza19maW5nZXJwcmludBImCiQ4NTBjZTAyMS1mYmMxLTRk + MzEtYTA3Ny0xZDVmNjMzOWMyY2VKOwobdGFza19maW5nZXJwcmludF9jcmVhdGVkX2F0EhwKGjIw + MjUtMTEtMTVUMTQ6NTg6NTQuMjcyODY4SjsKEWFnZW50X2ZpbmdlcnByaW50EiYKJDUzMWExMTg3 + LTZmOWEtNGNmMi1hYzMwLWUzZTczMWE4MzY5Y0oaCgphZ2VudF9yb2xlEgwKClRlc3QgQWdlbnR6 + AhgBhQEAAQAAEuEDChCrg6pKIgwTTkf7+bOsNaasEgjUfxiqLjY0BCoOVGFzayBFeGVjdXRpb24w + ATlwPXnBd0Z4GEHg9nIReEZ4GEouCghjcmV3X2tleRIiCiBlNTlmNGE5NDUwMzI5MmFiODY1NWE4 + Nzg3OWRmM2QwZUoxCgdjcmV3X2lkEiYKJGY1MWJhZjlhLTA5OWItNDZmNi1hNDFlLTNiNWQ1M2Y3 + ZTc3Mko6ChBjcmV3X2ZpbmdlcnByaW50EiYKJGVhNTQwZWQwLWYyZDEtNDA0NC04YjlmLWE2MjQy + ZjU0ZjEyNEouCgh0YXNrX2tleRIiCiAxN2NjOWFiMmIyZDBiYjBjZGQzNmQ1M2UwNTJiYTNhMUox + Cgd0YXNrX2lkEiYKJDBhYzgzYzc5LWJmYjUtNDE3OS05NDcwLTJiNDliMTZlMTNiNEo7ChFhZ2Vu + dF9maW5nZXJwcmludBImCiQ1MzFhMTE4Ny02ZjlhLTRjZjItYWMzMC1lM2U3MzFhODM2OWNKGgoK + YWdlbnRfcm9sZRIMCgpUZXN0IEFnZW50SjoKEHRhc2tfZmluZ2VycHJpbnQSJgokODUwY2UwMjEt + ZmJjMS00ZDMxLWEwNzctMWQ1ZjYzMzljMmNlegIYAYUBAAEAAA== + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '2146' + Content-Type: + - application/x-protobuf + User-Agent: + - OTel-OTLP-Exporter-Python/1.38.0 + method: POST + uri: https://telemetry.crewai.com:4319/v1/traces + response: + body: + string: "\n\0" + headers: + Content-Length: + - '2' + Content-Type: + - application/x-protobuf + Date: + - Sat, 15 Nov 2025 19:58:59 GMT + status: + code: 200 + message: OK +- request: + body: '{"events": [{"event_id": "REDACTED_EVENT_ID", "timestamp": + "2025-11-15T20:12:50.759077+00:00", "type": "crew_kickoff_started", "event_data": + {"timestamp": "2025-11-15T20:12:50.759077+00:00", "type": "crew_kickoff_started", + "source_fingerprint": null, "source_type": null, "fingerprint_metadata": null, + "task_id": null, "task_name": null, "agent_id": null, "agent_role": null, "crew_name": + "crew", "crew": null, "inputs": null}}, {"event_id": "REDACTED_EVENT_ID", + "timestamp": "2025-11-15T20:12:50.761789+00:00", "type": "task_started", "event_data": + {"task_description": "Say hello", "expected_output": "hello", "task_name": "Say + hello", "context": "", "agent_role": "Test Agent", "task_id": "REDACTED_TASK_ID"}}, + {"event_id": "REDACTED_EVENT_ID", "timestamp": "2025-11-15T20:12:50.762556+00:00", + "type": "agent_execution_started", "event_data": {"agent_role": "Test Agent", + "agent_goal": "Test goal", "agent_backstory": "Test backstory"}}, {"event_id": + "112efd06-87b7-4600-892f-3c96672571c6", "timestamp": "2025-11-15T20:12:50.762726+00:00", + "type": "llm_call_started", "event_data": {"timestamp": "2025-11-15T20:12:50.762726+00:00", + "type": "llm_call_started", "source_fingerprint": null, "source_type": null, + "fingerprint_metadata": null, "task_id": "REDACTED_TASK_ID", + "task_name": "Say hello", "agent_id": "REDACTED_AGENT_ID", + "agent_role": "Test Agent", "from_task": null, "from_agent": null, "model": + "gpt-4o-mini", "messages": [{"role": "system", "content": "You are Test Agent. + Test backstory\nYour personal goal is: Test goal\nTo give my best complete final + answer to the task respond using the exact following format:\n\nThought: I now + can give a great answer\nFinal Answer: Your final answer must be the great and + the most complete as possible, it must be outcome described.\n\nI MUST use these + formats, my job depends on it!"}, {"role": "user", "content": "\nCurrent Task: + Say hello\n\nThis is the expected criteria for your final answer: hello\nyou + MUST return the actual complete content as the final answer, not a summary.\n\nBegin! + This is VERY important to you, use the tools available and give your best Final + Answer, your job depends on it!\n\nThought:"}], "tools": null, "callbacks": + [""], + "available_functions": null}}, {"event_id": "REDACTED_EVENT_ID", + "timestamp": "2025-11-15T20:12:50.877587+00:00", "type": "llm_call_completed", + "event_data": {"timestamp": "2025-11-15T20:12:50.877587+00:00", "type": "llm_call_completed", + "source_fingerprint": null, "source_type": null, "fingerprint_metadata": null, + "task_id": "REDACTED_TASK_ID", "task_name": "Say hello", + "agent_id": "REDACTED_AGENT_ID", "agent_role": "Test Agent", + "from_task": null, "from_agent": null, "messages": [{"role": "system", "content": + "You are Test Agent. Test backstory\nYour personal goal is: Test goal\nTo give + my best complete final answer to the task respond using the exact following + format:\n\nThought: I now can give a great answer\nFinal Answer: Your final + answer must be the great and the most complete as possible, it must be outcome + described.\n\nI MUST use these formats, my job depends on it!"}, {"role": "user", + "content": "\nCurrent Task: Say hello\n\nThis is the expected criteria for your + final answer: hello\nyou MUST return the actual complete content as the final + answer, not a summary.\n\nBegin! This is VERY important to you, use the tools + available and give your best Final Answer, your job depends on it!\n\nThought:"}], + "response": "I now can give a great answer \nFinal Answer: hello", "call_type": + "", "model": "gpt-4o-mini"}}, {"event_id": + "430a26b3-c38b-4f75-8656-412124a6df95", "timestamp": "2025-11-15T20:12:50.877724+00:00", + "type": "agent_execution_completed", "event_data": {"agent_role": "Test Agent", + "agent_goal": "Test goal", "agent_backstory": "Test backstory"}}, {"event_id": + "a76bbe00-1cc7-44a8-9ec3-c4ed8fca948d", "timestamp": "2025-11-15T20:12:50.877830+00:00", + "type": "task_completed", "event_data": {"task_description": "Say hello", "task_name": + "Say hello", "task_id": "REDACTED_TASK_ID", "output_raw": + "hello", "output_format": "OutputFormat.RAW", "agent_role": "Test Agent"}}, + {"event_id": "REDACTED_EVENT_ID", "timestamp": "2025-11-15T20:12:50.879327+00:00", + "type": "crew_kickoff_completed", "event_data": {"timestamp": "2025-11-15T20:12:50.879327+00:00", + "type": "crew_kickoff_completed", "source_fingerprint": null, "source_type": + null, "fingerprint_metadata": null, "task_id": null, "task_name": null, "agent_id": + null, "agent_role": null, "crew_name": "crew", "crew": null, "output": {"description": + "Say hello", "name": "Say hello", "expected_output": "hello", "summary": "Say + hello...", "raw": "hello", "pydantic": null, "json_dict": null, "agent": "Test + Agent", "output_format": "raw", "messages": [{"role": "''system''", "content": + "''You are Test Agent. Test backstory\\nYour personal goal is: Test goal\\nTo + give my best complete final answer to the task respond using the exact following + format:\\n\\nThought: I now can give a great answer\\nFinal Answer: Your final + answer must be the great and the most complete as possible, it must be outcome + described.\\n\\nI MUST use these formats, my job depends on it!''"}, {"role": + "''user''", "content": "''\\nCurrent Task: Say hello\\n\\nThis is the expected + criteria for your final answer: hello\\nyou MUST return the actual complete + content as the final answer, not a summary.\\n\\nBegin! This is VERY important + to you, use the tools available and give your best Final Answer, your job depends + on it!\\n\\nThought:''"}, {"role": "''assistant''", "content": "''I now can + give a great answer \\nFinal Answer: hello''"}]}, "total_tokens": 165}}], "batch_metadata": + {"events_count": 8, "batch_sequence": 1, "is_final_batch": false}}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '6047' + Content-Type: + - application/json + User-Agent: + - CrewAI-CLI/1.4.1 + X-Crewai-Organization-Id: + - 73c2b193-f579-422c-84c7-76a39a1da77f + X-Crewai-Version: + - 1.4.1 + method: POST + uri: https://app.crewai.com/crewai_plus/api/v1/tracing/ephemeral/batches/REDACTED_EPHEMERAL_ID/events + response: + body: + string: '{"error":"Couldn''t find EphemeralTraceBatch with [WHERE \"ephemeral_trace_batches\".\"ephemeral_trace_id\" + = $1]","message":"Trace batch not found"}' + headers: + Connection: + - keep-alive + Content-Length: + - '148' + Content-Type: + - application/json; charset=utf-8 + Date: + - Sat, 15 Nov 2025 20:12:51 GMT + cache-control: + - no-store + content-security-policy: + - 'default-src ''self'' *.app.crewai.com app.crewai.com; script-src ''self'' + ''unsafe-inline'' *.app.crewai.com app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts + https://www.gstatic.com https://run.pstmn.io https://apis.google.com https://apis.google.com/js/api.js + https://accounts.google.com https://accounts.google.com/gsi/client https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css.map + https://*.google.com https://docs.google.com https://slides.google.com https://js.hs-scripts.com + https://js.sentry-cdn.com https://browser.sentry-cdn.com https://www.googletagmanager.com + https://js-na1.hs-scripts.com https://js.hubspot.com http://js-na1.hs-scripts.com + https://bat.bing.com https://cdn.amplitude.com https://cdn.segment.com https://d1d3n03t5zntha.cloudfront.net/ + https://descriptusercontent.com https://edge.fullstory.com https://googleads.g.doubleclick.net + https://js.hs-analytics.net https://js.hs-banner.com https://js.hsadspixel.net + https://js.hscollectedforms.net https://js.usemessages.com https://snap.licdn.com + https://static.cloudflareinsights.com https://static.reo.dev https://www.google-analytics.com + https://share.descript.com/; style-src ''self'' ''unsafe-inline'' *.app.crewai.com + app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts; img-src ''self'' data: + *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com https://dashboard.tools.crewai.com + https://cdn.jsdelivr.net https://forms.hsforms.com https://track.hubspot.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://www.google.com + https://www.google.com.br; font-src ''self'' data: *.app.crewai.com app.crewai.com; + connect-src ''self'' *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com + https://connect.useparagon.com/ https://zeus.useparagon.com/* https://*.useparagon.com/* + https://run.pstmn.io https://connect.tools.crewai.com/ https://*.sentry.io + https://www.google-analytics.com https://edge.fullstory.com https://rs.fullstory.com + https://api.hubspot.com https://forms.hscollectedforms.net https://api.hubapi.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://google.com/pagead/form-data/16713662509 + https://google.com/ccm/form-data/16713662509 https://www.google.com/ccm/collect + https://worker-actionkit.tools.crewai.com https://api.reo.dev; frame-src ''self'' + *.app.crewai.com app.crewai.com https://connect.useparagon.com/ https://zeus.tools.crewai.com + https://zeus.useparagon.com/* https://connect.tools.crewai.com/ https://docs.google.com + https://drive.google.com https://slides.google.com https://accounts.google.com + https://*.google.com https://app.hubspot.com/ https://td.doubleclick.net https://www.googletagmanager.com/ + https://www.youtube.com https://share.descript.com' + expires: + - '0' + permissions-policy: + - camera=(), microphone=(self), geolocation=() + pragma: + - no-cache + referrer-policy: + - strict-origin-when-cross-origin + strict-transport-security: + - max-age=63072000; includeSubDomains + vary: + - Accept + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-permitted-cross-domain-policies: + - none + x-request-id: + - 869cd156-577e-4f89-a822-0cd097bfb011 + x-runtime: + - '0.038867' + x-xss-protection: + - 1; mode=block + status: + code: 404 + message: Not Found +- request: + body: '{"status": "failed", "failure_reason": "Error sending events to backend"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '73' + Content-Type: + - application/json + User-Agent: + - CrewAI-CLI/1.4.1 + X-Crewai-Organization-Id: + - 73c2b193-f579-422c-84c7-76a39a1da77f + X-Crewai-Version: + - 1.4.1 + method: PATCH + uri: https://app.crewai.com/crewai_plus/api/v1/tracing/batches/REDACTED_EPHEMERAL_ID + response: + body: + string: '{"error":"bad_credentials","message":"Bad credentials"}' + headers: + Connection: + - keep-alive + Content-Length: + - '55' + Content-Type: + - application/json; charset=utf-8 + Date: + - Sat, 15 Nov 2025 20:12:51 GMT + cache-control: + - no-store + content-security-policy: + - 'default-src ''self'' *.app.crewai.com app.crewai.com; script-src ''self'' + ''unsafe-inline'' *.app.crewai.com app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts + https://www.gstatic.com https://run.pstmn.io https://apis.google.com https://apis.google.com/js/api.js + https://accounts.google.com https://accounts.google.com/gsi/client https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css.map + https://*.google.com https://docs.google.com https://slides.google.com https://js.hs-scripts.com + https://js.sentry-cdn.com https://browser.sentry-cdn.com https://www.googletagmanager.com + https://js-na1.hs-scripts.com https://js.hubspot.com http://js-na1.hs-scripts.com + https://bat.bing.com https://cdn.amplitude.com https://cdn.segment.com https://d1d3n03t5zntha.cloudfront.net/ + https://descriptusercontent.com https://edge.fullstory.com https://googleads.g.doubleclick.net + https://js.hs-analytics.net https://js.hs-banner.com https://js.hsadspixel.net + https://js.hscollectedforms.net https://js.usemessages.com https://snap.licdn.com + https://static.cloudflareinsights.com https://static.reo.dev https://www.google-analytics.com + https://share.descript.com/; style-src ''self'' ''unsafe-inline'' *.app.crewai.com + app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts; img-src ''self'' data: + *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com https://dashboard.tools.crewai.com + https://cdn.jsdelivr.net https://forms.hsforms.com https://track.hubspot.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://www.google.com + https://www.google.com.br; font-src ''self'' data: *.app.crewai.com app.crewai.com; + connect-src ''self'' *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com + https://connect.useparagon.com/ https://zeus.useparagon.com/* https://*.useparagon.com/* + https://run.pstmn.io https://connect.tools.crewai.com/ https://*.sentry.io + https://www.google-analytics.com https://edge.fullstory.com https://rs.fullstory.com + https://api.hubspot.com https://forms.hscollectedforms.net https://api.hubapi.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://google.com/pagead/form-data/16713662509 + https://google.com/ccm/form-data/16713662509 https://www.google.com/ccm/collect + https://worker-actionkit.tools.crewai.com https://api.reo.dev; frame-src ''self'' + *.app.crewai.com app.crewai.com https://connect.useparagon.com/ https://zeus.tools.crewai.com + https://zeus.useparagon.com/* https://connect.tools.crewai.com/ https://docs.google.com + https://drive.google.com https://slides.google.com https://accounts.google.com + https://*.google.com https://app.hubspot.com/ https://td.doubleclick.net https://www.googletagmanager.com/ + https://www.youtube.com https://share.descript.com' + expires: + - '0' + permissions-policy: + - camera=(), microphone=(self), geolocation=() + pragma: + - no-cache + referrer-policy: + - strict-origin-when-cross-origin + strict-transport-security: + - max-age=63072000; includeSubDomains + vary: + - Accept + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-permitted-cross-domain-policies: + - none + x-request-id: + - 1d74da02-f5f2-4bdc-8c9e-51bc9d3aff98 + x-runtime: + - '0.046789' + x-xss-protection: + - 1; mode=block + status: + code: 401 + message: Unauthorized +version: 1 diff --git a/lib/crewai/tests/cassettes/TestTraceEnableDisable.test_trace_calls_when_enabled_via_tracing_true.yaml b/lib/crewai/tests/cassettes/TestTraceEnableDisable.test_trace_calls_when_enabled_via_tracing_true.yaml new file mode 100644 index 000000000..e8d6fe931 --- /dev/null +++ b/lib/crewai/tests/cassettes/TestTraceEnableDisable.test_trace_calls_when_enabled_via_tracing_true.yaml @@ -0,0 +1,817 @@ +interactions: +- request: + body: '{"trace_id": "REDACTED_TRACE_ID", "execution_type": "crew", "user_identifier": + null, "execution_context": {"crew_fingerprint": null, "crew_name": "crew", "flow_name": + null, "crewai_version": "1.4.1", "privacy_level": "standard"}, "execution_metadata": + {"expected_duration_estimate": 300, "agent_count": 0, "task_count": 0, "flow_method_count": + 0, "execution_started_at": "2025-11-15T20:00:40.213233+00:00"}, "ephemeral_trace_id": + "REDACTED_EPHEMERAL_ID"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '488' + Content-Type: + - application/json + User-Agent: + - CrewAI-CLI/1.4.1 + X-Crewai-Organization-Id: + - REDACTED_ORG_UUID + X-Crewai-Version: + - 1.4.1 + method: POST + uri: https://app.crewai.com/crewai_plus/api/v1/tracing/ephemeral/batches + response: + body: + string: '{"id":"REDACTED_UUID","ephemeral_trace_id": "REDACTED_EPHEMERAL_ID","execution_type":"crew","crew_name":"crew","flow_name":null,"status":"running","duration_ms":null,"crewai_version":"1.4.1","total_events":0,"execution_context":{"crew_fingerprint":null,"crew_name":"crew","flow_name":null,"crewai_version":"1.4.1","privacy_level":"standard"},"created_at":"2025-11-15T20:00:40.347Z","updated_at":"2025-11-15T20:00:40.347Z","access_code": + "REDACTED_ACCESS_CODE","user_identifier":null}' + headers: + Connection: + - keep-alive + Content-Length: + - '515' + Content-Type: + - application/json; charset=utf-8 + Date: + - Sat, 15 Nov 2025 20:00:40 GMT + cache-control: + - no-store + content-security-policy: + - 'default-src ''self'' *.app.crewai.com app.crewai.com; script-src ''self'' + ''unsafe-inline'' *.app.crewai.com app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts + https://www.gstatic.com https://run.pstmn.io https://apis.google.com https://apis.google.com/js/api.js + https://accounts.google.com https://accounts.google.com/gsi/client https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css.map + https://*.google.com https://docs.google.com https://slides.google.com https://js.hs-scripts.com + https://js.sentry-cdn.com https://browser.sentry-cdn.com https://www.googletagmanager.com + https://js-na1.hs-scripts.com https://js.hubspot.com http://js-na1.hs-scripts.com + https://bat.bing.com https://cdn.amplitude.com https://cdn.segment.com https://d1d3n03t5zntha.cloudfront.net/ + https://descriptusercontent.com https://edge.fullstory.com https://googleads.g.doubleclick.net + https://js.hs-analytics.net https://js.hs-banner.com https://js.hsadspixel.net + https://js.hscollectedforms.net https://js.usemessages.com https://snap.licdn.com + https://static.cloudflareinsights.com https://static.reo.dev https://www.google-analytics.com + https://share.descript.com/; style-src ''self'' ''unsafe-inline'' *.app.crewai.com + app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts; img-src ''self'' data: + *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com https://dashboard.tools.crewai.com + https://cdn.jsdelivr.net https://forms.hsforms.com https://track.hubspot.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://www.google.com + https://www.google.com.br; font-src ''self'' data: *.app.crewai.com app.crewai.com; + connect-src ''self'' *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com + https://connect.useparagon.com/ https://zeus.useparagon.com/* https://*.useparagon.com/* + https://run.pstmn.io https://connect.tools.crewai.com/ https://*.sentry.io + https://www.google-analytics.com https://edge.fullstory.com https://rs.fullstory.com + https://api.hubspot.com https://forms.hscollectedforms.net https://api.hubapi.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://google.com/pagead/form-data/16713662509 + https://google.com/ccm/form-data/16713662509 https://www.google.com/ccm/collect + https://worker-actionkit.tools.crewai.com https://api.reo.dev; frame-src ''self'' + *.app.crewai.com app.crewai.com https://connect.useparagon.com/ https://zeus.tools.crewai.com + https://zeus.useparagon.com/* https://connect.tools.crewai.com/ https://docs.google.com + https://drive.google.com https://slides.google.com https://accounts.google.com + https://*.google.com https://app.hubspot.com/ https://td.doubleclick.net https://www.googletagmanager.com/ + https://www.youtube.com https://share.descript.com' + etag: + - W/"1dad6ea33b1bd62ea816884d05ca0842" + expires: + - '0' + permissions-policy: + - camera=(), microphone=(self), geolocation=() + pragma: + - no-cache + referrer-policy: + - strict-origin-when-cross-origin + strict-transport-security: + - max-age=63072000; includeSubDomains + vary: + - Accept + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-permitted-cross-domain-policies: + - none + x-request-id: + - REDACTED_ORG_UUID + x-runtime: + - '0.046518' + x-xss-protection: + - 1; mode=block + status: + code: 201 + message: Created +- request: + body: '{"messages":[{"role":"system","content":"You are Test Agent. Test backstory\nYour + personal goal is: Test goal\nTo give my best complete final answer to the task + respond using the exact following format:\n\nThought: I now can give a great + answer\nFinal Answer: Your final answer must be the great and the most complete + as possible, it must be outcome described.\n\nI MUST use these formats, my job + depends on it!"},{"role":"user","content":"\nCurrent Task: Say hello\n\nThis + is the expected criteria for your final answer: hello\nyou MUST return the actual + complete content as the final answer, not a summary.\n\nBegin! This is VERY + important to you, use the tools available and give your best Final Answer, your + job depends on it!\n\nThought:"}],"model":"gpt-4o-mini"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '768' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.109.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.109.1 + x-stainless-read-timeout: + - '600' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.10 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAAwAAAP//jFLLbtswELzrKxY8W4XlV1zfggBtekt76yMQVtRKoktxCZJKWgT+94KU + YyltCuQiQDs7w5ndfcoAhKrFAYTsMMje6vxGfjzykXdfzZe7z7eh54Jub77dvZf9vqjEIjK4OpIM + z6x3knurKSg2IywdYaCoWlzt1qv1br9ZJqDnmnSktTbkG857ZVS+Wq42+fIqL/ZndsdKkhcH+J4B + ADylb/RpavolDpC0UqUn77Elcbg0AQjHOlYEeq98QBPEYgIlm0AmWf8Ehh9BooFWPRAgtNE2oPGP + 5AB+mA/KoIbr9H+AjrTmuZSjZvAY45hB6xmAxnDAOI4U4v6MnC62NbfWceX/oopGGeW70hF6NtGi + D2xFQk8ZwH0az/AisbCOexvKwD8pPVds16OemLYyQ1dnMHBAPavvtotX9MqaAirtZwMWEmVH9USd + toFDrXgGZLPU/7p5TXtMrkz7FvkJkJJsoLq0jmolXyae2hzFo/1f22XKybDw5B6UpDIocnETNTU4 + 6PGUhP/tA/Vlo0xLzjo13lNjy21RV/sNNliJ7JT9AQAA//8DANqYTe5dAwAA + headers: + CF-RAY: + - 99f1560c3f5d4809-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Sat, 15 Nov 2025 20:00:41 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=h.tA2Rq1WhYqakfMp30WNbqx91S5jvXxlyjIW8bMhHY-1763236841-1.0.1.1-V.a.LzWhmsyvoXIFirG2pejIlbZ7BiLfwdlv6dDF.QddisjnkoYsgBPhVnxl.GwDFVDKymer1bQK_6vSoHBaQIcV4MJ7YayMl9lLs0.UcFM; + path=/; expires=Sat, 15-Nov-25 20:30:41 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=8Td_UnVGEcigZt.Nhy9rEFpaW9pgP0QJpdzFdEoktJk-1763236841097-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '563' + openai-project: + - proj_xitITlrFeen7zjNSzML82h9x + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '666' + x-openai-proxy-wasm: + - v0.1 + x-ratelimit-limit-project-tokens: + - '150000000' + x-ratelimit-limit-requests: + - '30000' + x-ratelimit-limit-tokens: + - '150000000' + x-ratelimit-remaining-project-tokens: + - '149999832' + x-ratelimit-remaining-requests: + - '29999' + x-ratelimit-remaining-tokens: + - '149999832' + x-ratelimit-reset-project-tokens: + - 0s + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_8e8e5bfc663840d68daf4ac70308eece + status: + code: 200 + message: OK +- request: + body: '{"events": [{"event_id": "REDACTED_EVENT_ID", "timestamp": "2025-11-15T20:00:40.210936+00:00", + "type": "crew_kickoff_started", "event_data": {"timestamp": "2025-11-15T20:00:40.210936+00:00", + "type": "crew_kickoff_started", "source_fingerprint": null, "source_type": null, + "fingerprint_metadata": null, "task_id": null, "task_name": null, "agent_id": + null, "agent_role": null, "crew_name": "crew", "crew": null, "inputs": null}}, + {"event_id": "REDACTED_EVENT_ID", "timestamp": "2025-11-15T20:00:40.213519+00:00", + "type": "agent_execution_started", "event_data": {"agent_role": "Test Agent", + "agent_goal": "Test goal", "agent_backstory": "Test backstory"}}, {"event_id": + "REDACTED_EVENT_ID", "timestamp": "2025-11-15T20:00:40.213671+00:00", "type": + "llm_call_started", "event_data": {"timestamp": "2025-11-15T20:00:40.213671+00:00", + "type": "llm_call_started", "source_fingerprint": null, "source_type": null, + "fingerprint_metadata": null, "task_id": "REDACTED_TASK_ID", "task_name": "Say + hello", "agent_id": "REDACTED_AGENT_ID", "agent_role": "Test Agent", "from_task": + null, "from_agent": null, "model": "gpt-4o-mini", "messages": [{"role": "system", + "content": "You are Test Agent. Test backstory\nYour personal goal is: Test + goal\nTo give my best complete final answer to the task respond using the exact + following format:\n\nThought: I now can give a great answer\nFinal Answer: Your + final answer must be the great and the most complete as possible, it must be + outcome described.\n\nI MUST use these formats, my job depends on it!"}, {"role": + "user", "content": "\nCurrent Task: Say hello\n\nThis is the expected criteria + for your final answer: hello\nyou MUST return the actual complete content as + the final answer, not a summary.\n\nBegin! This is VERY important to you, use + the tools available and give your best Final Answer, your job depends on it!\n\nThought:"}], + "tools": null, "callbacks": [""], "available_functions": null}}, {"event_id": "REDACTED_EVENT_ID", + "timestamp": "2025-11-15T20:00:41.117164+00:00", "type": "llm_call_completed", + "event_data": {"timestamp": "2025-11-15T20:00:41.117164+00:00", "type": "llm_call_completed", + "source_fingerprint": null, "source_type": null, "fingerprint_metadata": null, + "task_id": "REDACTED_TASK_ID", "task_name": "Say hello", "agent_id": "REDACTED_AGENT_ID", + "agent_role": "Test Agent", "from_task": null, "from_agent": null, "messages": + [{"role": "system", "content": "You are Test Agent. Test backstory\nYour personal + goal is: Test goal\nTo give my best complete final answer to the task respond + using the exact following format:\n\nThought: I now can give a great answer\nFinal + Answer: Your final answer must be the great and the most complete as possible, + it must be outcome described.\n\nI MUST use these formats, my job depends on + it!"}, {"role": "user", "content": "\nCurrent Task: Say hello\n\nThis is the + expected criteria for your final answer: hello\nyou MUST return the actual complete + content as the final answer, not a summary.\n\nBegin! This is VERY important + to you, use the tools available and give your best Final Answer, your job depends + on it!\n\nThought:"}], "response": "I now can give a great answer \nFinal Answer: + hello", "call_type": "", "model": "gpt-4o-mini"}}, + {"event_id": "1d32853b-04dd-49f1-9b0b-fca92a82ea0f", "timestamp": "2025-11-15T20:00:41.117412+00:00", + "type": "agent_execution_completed", "event_data": {"agent_role": "Test Agent", + "agent_goal": "Test goal", "agent_backstory": "Test backstory"}}, {"event_id": + "3af2dbb3-6117-4df1-9dc8-3b4cbc1bb689", "timestamp": "2025-11-15T20:00:41.117869+00:00", + "type": "task_completed", "event_data": {"task_description": "Say hello", "task_name": + "Say hello", "task_id": "REDACTED_TASK_ID", "output_raw": "hello", "output_format": + "OutputFormat.RAW", "agent_role": "Test Agent"}}, {"event_id": "REDACTED_EVENT_ID", + "timestamp": "2025-11-15T20:00:41.119050+00:00", "type": "crew_kickoff_completed", + "event_data": {"timestamp": "2025-11-15T20:00:41.119050+00:00", "type": "crew_kickoff_completed", + "source_fingerprint": null, "source_type": null, "fingerprint_metadata": null, + "task_id": null, "task_name": null, "agent_id": null, "agent_role": null, "crew_name": + "crew", "crew": null, "output": {"description": "Say hello", "name": "Say hello", + "expected_output": "hello", "summary": "Say hello...", "raw": "hello", "pydantic": + null, "json_dict": null, "agent": "Test Agent", "output_format": "raw", "messages": + [{"role": "''system''", "content": "''You are Test Agent. Test backstory\\nYour + personal goal is: Test goal\\nTo give my best complete final answer to the task + respond using the exact following format:\\n\\nThought: I now can give a great + answer\\nFinal Answer: Your final answer must be the great and the most complete + as possible, it must be outcome described.\\n\\nI MUST use these formats, my + job depends on it!''"}, {"role": "''user''", "content": "''\\nCurrent Task: + Say hello\\n\\nThis is the expected criteria for your final answer: hello\\nyou + MUST return the actual complete content as the final answer, not a summary.\\n\\nBegin! + This is VERY important to you, use the tools available and give your best Final + Answer, your job depends on it!\\n\\nThought:''"}, {"role": "''assistant''", + "content": "''I now can give a great answer \\nFinal Answer: hello''"}]}, "total_tokens": + 165}}], "batch_metadata": {"events_count": 7, "batch_sequence": 1, "is_final_batch": + false}}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '5723' + Content-Type: + - application/json + User-Agent: + - CrewAI-CLI/1.4.1 + X-Crewai-Organization-Id: + - REDACTED_ORG_UUID + X-Crewai-Version: + - 1.4.1 + method: POST + uri: https://app.crewai.com/crewai_plus/api/v1/tracing/ephemeral/batches/REDACTED_UUID/events + response: + body: + string: '{"events_created":7,"ephemeral_trace_batch_id": "REDACTED_BATCH_ID"}' + headers: + Connection: + - keep-alive + Content-Length: + - '86' + Content-Type: + - application/json; charset=utf-8 + Date: + - Sat, 15 Nov 2025 20:00:41 GMT + cache-control: + - no-store + content-security-policy: + - 'default-src ''self'' *.app.crewai.com app.crewai.com; script-src ''self'' + ''unsafe-inline'' *.app.crewai.com app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts + https://www.gstatic.com https://run.pstmn.io https://apis.google.com https://apis.google.com/js/api.js + https://accounts.google.com https://accounts.google.com/gsi/client https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css.map + https://*.google.com https://docs.google.com https://slides.google.com https://js.hs-scripts.com + https://js.sentry-cdn.com https://browser.sentry-cdn.com https://www.googletagmanager.com + https://js-na1.hs-scripts.com https://js.hubspot.com http://js-na1.hs-scripts.com + https://bat.bing.com https://cdn.amplitude.com https://cdn.segment.com https://d1d3n03t5zntha.cloudfront.net/ + https://descriptusercontent.com https://edge.fullstory.com https://googleads.g.doubleclick.net + https://js.hs-analytics.net https://js.hs-banner.com https://js.hsadspixel.net + https://js.hscollectedforms.net https://js.usemessages.com https://snap.licdn.com + https://static.cloudflareinsights.com https://static.reo.dev https://www.google-analytics.com + https://share.descript.com/; style-src ''self'' ''unsafe-inline'' *.app.crewai.com + app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts; img-src ''self'' data: + *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com https://dashboard.tools.crewai.com + https://cdn.jsdelivr.net https://forms.hsforms.com https://track.hubspot.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://www.google.com + https://www.google.com.br; font-src ''self'' data: *.app.crewai.com app.crewai.com; + connect-src ''self'' *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com + https://connect.useparagon.com/ https://zeus.useparagon.com/* https://*.useparagon.com/* + https://run.pstmn.io https://connect.tools.crewai.com/ https://*.sentry.io + https://www.google-analytics.com https://edge.fullstory.com https://rs.fullstory.com + https://api.hubspot.com https://forms.hscollectedforms.net https://api.hubapi.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://google.com/pagead/form-data/16713662509 + https://google.com/ccm/form-data/16713662509 https://www.google.com/ccm/collect + https://worker-actionkit.tools.crewai.com https://api.reo.dev; frame-src ''self'' + *.app.crewai.com app.crewai.com https://connect.useparagon.com/ https://zeus.tools.crewai.com + https://zeus.useparagon.com/* https://connect.tools.crewai.com/ https://docs.google.com + https://drive.google.com https://slides.google.com https://accounts.google.com + https://*.google.com https://app.hubspot.com/ https://td.doubleclick.net https://www.googletagmanager.com/ + https://www.youtube.com https://share.descript.com' + etag: + - W/"e539cd458f6386627ec23f6f6a46a996" + expires: + - '0' + permissions-policy: + - camera=(), microphone=(self), geolocation=() + pragma: + - no-cache + referrer-policy: + - strict-origin-when-cross-origin + strict-transport-security: + - max-age=63072000; includeSubDomains + vary: + - Accept + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-permitted-cross-domain-policies: + - none + x-request-id: + - REDACTED_ORG_UUID + x-runtime: + - '0.062954' + x-xss-protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: '{"status": "completed", "duration_ms": 1070, "final_event_count": 7}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '68' + Content-Type: + - application/json + User-Agent: + - CrewAI-CLI/1.4.1 + X-Crewai-Organization-Id: + - REDACTED_ORG_UUID + X-Crewai-Version: + - 1.4.1 + method: PATCH + uri: https://app.crewai.com/crewai_plus/api/v1/tracing/ephemeral/batches/REDACTED_UUID/finalize + response: + body: + string: '{"id":"REDACTED_UUID","ephemeral_trace_id": "REDACTED_EPHEMERAL_ID","execution_type":"crew","crew_name":"crew","flow_name":null,"status":"completed","duration_ms":1070,"crewai_version":"1.4.1","total_events":7,"execution_context":{"crew_name":"crew","flow_name":null,"privacy_level":"standard","crewai_version":"1.4.1","crew_fingerprint":null},"created_at":"2025-11-15T20:00:40.347Z","updated_at":"2025-11-15T20:00:41.423Z","access_code": + "REDACTED_ACCESS_CODE","user_identifier":null}' + headers: + Connection: + - keep-alive + Content-Length: + - '517' + Content-Type: + - application/json; charset=utf-8 + Date: + - Sat, 15 Nov 2025 20:00:41 GMT + cache-control: + - no-store + content-security-policy: + - 'default-src ''self'' *.app.crewai.com app.crewai.com; script-src ''self'' + ''unsafe-inline'' *.app.crewai.com app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts + https://www.gstatic.com https://run.pstmn.io https://apis.google.com https://apis.google.com/js/api.js + https://accounts.google.com https://accounts.google.com/gsi/client https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css.map + https://*.google.com https://docs.google.com https://slides.google.com https://js.hs-scripts.com + https://js.sentry-cdn.com https://browser.sentry-cdn.com https://www.googletagmanager.com + https://js-na1.hs-scripts.com https://js.hubspot.com http://js-na1.hs-scripts.com + https://bat.bing.com https://cdn.amplitude.com https://cdn.segment.com https://d1d3n03t5zntha.cloudfront.net/ + https://descriptusercontent.com https://edge.fullstory.com https://googleads.g.doubleclick.net + https://js.hs-analytics.net https://js.hs-banner.com https://js.hsadspixel.net + https://js.hscollectedforms.net https://js.usemessages.com https://snap.licdn.com + https://static.cloudflareinsights.com https://static.reo.dev https://www.google-analytics.com + https://share.descript.com/; style-src ''self'' ''unsafe-inline'' *.app.crewai.com + app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts; img-src ''self'' data: + *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com https://dashboard.tools.crewai.com + https://cdn.jsdelivr.net https://forms.hsforms.com https://track.hubspot.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://www.google.com + https://www.google.com.br; font-src ''self'' data: *.app.crewai.com app.crewai.com; + connect-src ''self'' *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com + https://connect.useparagon.com/ https://zeus.useparagon.com/* https://*.useparagon.com/* + https://run.pstmn.io https://connect.tools.crewai.com/ https://*.sentry.io + https://www.google-analytics.com https://edge.fullstory.com https://rs.fullstory.com + https://api.hubspot.com https://forms.hscollectedforms.net https://api.hubapi.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://google.com/pagead/form-data/16713662509 + https://google.com/ccm/form-data/16713662509 https://www.google.com/ccm/collect + https://worker-actionkit.tools.crewai.com https://api.reo.dev; frame-src ''self'' + *.app.crewai.com app.crewai.com https://connect.useparagon.com/ https://zeus.tools.crewai.com + https://zeus.useparagon.com/* https://connect.tools.crewai.com/ https://docs.google.com + https://drive.google.com https://slides.google.com https://accounts.google.com + https://*.google.com https://app.hubspot.com/ https://td.doubleclick.net https://www.googletagmanager.com/ + https://www.youtube.com https://share.descript.com' + etag: + - W/"de9bcb107d0382f1b309276d8fc39196" + expires: + - '0' + permissions-policy: + - camera=(), microphone=(self), geolocation=() + pragma: + - no-cache + referrer-policy: + - strict-origin-when-cross-origin + strict-transport-security: + - max-age=63072000; includeSubDomains + vary: + - Accept + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-permitted-cross-domain-policies: + - none + x-request-id: + - REDACTED_ORG_UUID + x-runtime: + - '0.045900' + x-xss-protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: !!binary | + Ct8QCiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkSthAKEgoQY3Jld2FpLnRl + bGVtZXRyeRKcCAoQvXQY4SQ+2Mlfdsll/QHJghII0Bd15ezW7r4qDENyZXcgQ3JlYXRlZDABOShe + q2uQRngYQZDhtWuQRngYShkKDmNyZXdhaV92ZXJzaW9uEgcKBTEuNC4xShsKDnB5dGhvbl92ZXJz + aW9uEgkKBzMuMTIuMTBKLgoIY3Jld19rZXkSIgogZTU5ZjRhOTQ1MDMyOTJhYjg2NTVhODc4Nzlk + ZjNkMGVKMQoHY3Jld19pZBImCiQ2NWVkNDMyNS02NTE4LTRiMzUtOGQ3OS02NzA2ZDc5OTY0YWVK + OgoQY3Jld19maW5nZXJwcmludBImCiQ1MmM5ODNiOC02OTcwLTQ2ZmMtYmQ1YS0wY2MwNzY1M2Rk + NDhKHAoMY3Jld19wcm9jZXNzEgwKCnNlcXVlbnRpYWxKEQoLY3Jld19tZW1vcnkSAhAAShoKFGNy + ZXdfbnVtYmVyX29mX3Rhc2tzEgIYAUobChVjcmV3X251bWJlcl9vZl9hZ2VudHMSAhgBSjsKG2Ny + ZXdfZmluZ2VycHJpbnRfY3JlYXRlZF9hdBIcChoyMDI1LTExLTE1VDE1OjAwOjQwLjIwOTg4NUrR + AgoLY3Jld19hZ2VudHMSwQIKvgJbeyJrZXkiOiAiMGMzZDYzYTY5MGUxM2Y1MTBkZTNjZDZkZmQz + MTgxNmIiLCAiaWQiOiAiYjE3OTNkNmYtN2Q4My00Y2YzLWE1NzQtNDE4ZGJkZWNmNzJmIiwgInJv + bGUiOiAiVGVzdCBBZ2VudCIsICJ2ZXJib3NlPyI6IGZhbHNlLCAibWF4X2l0ZXIiOiAyNSwgIm1h + eF9ycG0iOiBudWxsLCAiZnVuY3Rpb25fY2FsbGluZ19sbG0iOiAiIiwgImxsbSI6ICJncHQtNG8t + bWluaSIsICJkZWxlZ2F0aW9uX2VuYWJsZWQ/IjogZmFsc2UsICJhbGxvd19jb2RlX2V4ZWN1dGlv + bj8iOiBmYWxzZSwgIm1heF9yZXRyeV9saW1pdCI6IDIsICJ0b29sc19uYW1lcyI6IFtdfV1K/wEK + CmNyZXdfdGFza3MS8AEK7QFbeyJrZXkiOiAiMTdjYzlhYjJiMmQwYmIwY2RkMzZkNTNlMDUyYmEz + YTEiLCAiaWQiOiAiOTUyY2ZmYzItNjVjNi00ZGMzLTk0MjItMjJiNjk0ZWJjNDU0IiwgImFzeW5j + X2V4ZWN1dGlvbj8iOiBmYWxzZSwgImh1bWFuX2lucHV0PyI6IGZhbHNlLCAiYWdlbnRfcm9sZSI6 + ICJUZXN0IEFnZW50IiwgImFnZW50X2tleSI6ICIwYzNkNjNhNjkwZTEzZjUxMGRlM2NkNmRmZDMx + ODE2YiIsICJ0b29sc19uYW1lcyI6IFtdfV16AhgBhQEAAQAAEpwEChCNBcmqTbiktztgYNe6R2lF + EgiTrCx+R/HhAioMVGFzayBDcmVhdGVkMAE5uMi/a5BGeBhB+GTAa5BGeBhKLgoIY3Jld19rZXkS + IgogZTU5ZjRhOTQ1MDMyOTJhYjg2NTVhODc4NzlkZjNkMGVKMQoHY3Jld19pZBImCiQ2NWVkNDMy + NS02NTE4LTRiMzUtOGQ3OS02NzA2ZDc5OTY0YWVKOgoQY3Jld19maW5nZXJwcmludBImCiQ1MmM5 + ODNiOC02OTcwLTQ2ZmMtYmQ1YS0wY2MwNzY1M2RkNDhKLgoIdGFza19rZXkSIgogMTdjYzlhYjJi + MmQwYmIwY2RkMzZkNTNlMDUyYmEzYTFKMQoHdGFza19pZBImCiQ5NTJjZmZjMi02NWM2LTRkYzMt + OTQyMi0yMmI2OTRlYmM0NTRKOgoQdGFza19maW5nZXJwcmludBImCiQyMTM3NzZkZC04MDMwLTQ1 + ODYtYmI1MC02NjNiYjI0NjAwNWJKOwobdGFza19maW5nZXJwcmludF9jcmVhdGVkX2F0EhwKGjIw + MjUtMTEtMTVUMTU6MDA6NDAuMjA5ODQwSjsKEWFnZW50X2ZpbmdlcnByaW50EiYKJDVmMmJlOWQw + LTZiMjQtNDFiYy05YzQyLTI0ZjdlOTM3MjJjYkoaCgphZ2VudF9yb2xlEgwKClRlc3QgQWdlbnR6 + AhgBhQEAAQAAEuEDChBC+bce4EVDxB/d79LFgX4NEghWvN23SKW/0SoOVGFzayBFeGVjdXRpb24w + ATnYk8BrkEZ4GEHI1LihkEZ4GEouCghjcmV3X2tleRIiCiBlNTlmNGE5NDUwMzI5MmFiODY1NWE4 + Nzg3OWRmM2QwZUoxCgdjcmV3X2lkEiYKJDY1ZWQ0MzI1LTY1MTgtNGIzNS04ZDc5LTY3MDZkNzk5 + NjRhZUo6ChBjcmV3X2ZpbmdlcnByaW50EiYKJDUyYzk4M2I4LTY5NzAtNDZmYy1iZDVhLTBjYzA3 + NjUzZGQ0OEouCgh0YXNrX2tleRIiCiAxN2NjOWFiMmIyZDBiYjBjZGQzNmQ1M2UwNTJiYTNhMUox + Cgd0YXNrX2lkEiYKJDk1MmNmZmMyLTY1YzYtNGRjMy05NDIyLTIyYjY5NGViYzQ1NEo7ChFhZ2Vu + dF9maW5nZXJwcmludBImCiQ1ZjJiZTlkMC02YjI0LTQxYmMtOWM0Mi0yNGY3ZTkzNzIyY2JKGgoK + YWdlbnRfcm9sZRIMCgpUZXN0IEFnZW50SjoKEHRhc2tfZmluZ2VycHJpbnQSJgokMjEzNzc2ZGQt + ODAzMC00NTg2LWJiNTAtNjYzYmIyNDYwMDViegIYAYUBAAEAAA== + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '2146' + Content-Type: + - application/x-protobuf + User-Agent: + - OTel-OTLP-Exporter-Python/1.38.0 + method: POST + uri: https://telemetry.crewai.com:4319/v1/traces + response: + body: + string: "\n\0" + headers: + Content-Length: + - '2' + Content-Type: + - application/x-protobuf + Date: + - Sat, 15 Nov 2025 20:00:44 GMT + status: + code: 200 + message: OK +- request: + body: '{"events": [{"event_id": "6a66ce15-fdb3-490b-a09b-7724817d0116", "timestamp": + "2025-11-15T20:15:51.057965+00:00", "type": "crew_kickoff_started", "event_data": + {"timestamp": "2025-11-15T20:15:51.057965+00:00", "type": "crew_kickoff_started", + "source_fingerprint": null, "source_type": null, "fingerprint_metadata": null, + "task_id": null, "task_name": null, "agent_id": null, "agent_role": null, "crew_name": + "crew", "crew": null, "inputs": null}}, {"event_id": "15f2b75b-c7bb-48d1-8f61-faec2736da5d", + "timestamp": "2025-11-15T20:15:51.059954+00:00", "type": "task_started", "event_data": + {"task_description": "Say hello", "expected_output": "hello", "task_name": "Say + hello", "context": "", "agent_role": "Test Agent", "task_id": "bbb08fd7-2580-43a8-bc71-5e0c08c7cc61"}}, + {"event_id": "eb90a87c-523c-40d6-b996-01706cbf8844", "timestamp": "2025-11-15T20:15:51.061205+00:00", + "type": "agent_execution_started", "event_data": {"agent_role": "Test Agent", + "agent_goal": "Test goal", "agent_backstory": "Test backstory"}}, {"event_id": + "862c2b07-d82a-4f02-9c99-519292679a87", "timestamp": "2025-11-15T20:15:51.061443+00:00", + "type": "llm_call_started", "event_data": {"timestamp": "2025-11-15T20:15:51.061443+00:00", + "type": "llm_call_started", "source_fingerprint": null, "source_type": null, + "fingerprint_metadata": null, "task_id": "bbb08fd7-2580-43a8-bc71-5e0c08c7cc61", + "task_name": "Say hello", "agent_id": "82ee52ae-9eba-4648-877b-8cf2fc1624ae", + "agent_role": "Test Agent", "from_task": null, "from_agent": null, "model": + "gpt-4o-mini", "messages": [{"role": "system", "content": "You are Test Agent. + Test backstory\nYour personal goal is: Test goal\nTo give my best complete final + answer to the task respond using the exact following format:\n\nThought: I now + can give a great answer\nFinal Answer: Your final answer must be the great and + the most complete as possible, it must be outcome described.\n\nI MUST use these + formats, my job depends on it!"}, {"role": "user", "content": "\nCurrent Task: + Say hello\n\nThis is the expected criteria for your final answer: hello\nyou + MUST return the actual complete content as the final answer, not a summary.\n\nBegin! + This is VERY important to you, use the tools available and give your best Final + Answer, your job depends on it!\n\nThought:"}], "tools": null, "callbacks": + [""], + "available_functions": null}}, {"event_id": "fff5720d-9167-48cf-9196-9ee96f765688", + "timestamp": "2025-11-15T20:15:51.175710+00:00", "type": "llm_call_completed", + "event_data": {"timestamp": "2025-11-15T20:15:51.175710+00:00", "type": "llm_call_completed", + "source_fingerprint": null, "source_type": null, "fingerprint_metadata": null, + "task_id": "bbb08fd7-2580-43a8-bc71-5e0c08c7cc61", "task_name": "Say hello", + "agent_id": "82ee52ae-9eba-4648-877b-8cf2fc1624ae", "agent_role": "Test Agent", + "from_task": null, "from_agent": null, "messages": [{"role": "system", "content": + "You are Test Agent. Test backstory\nYour personal goal is: Test goal\nTo give + my best complete final answer to the task respond using the exact following + format:\n\nThought: I now can give a great answer\nFinal Answer: Your final + answer must be the great and the most complete as possible, it must be outcome + described.\n\nI MUST use these formats, my job depends on it!"}, {"role": "user", + "content": "\nCurrent Task: Say hello\n\nThis is the expected criteria for your + final answer: hello\nyou MUST return the actual complete content as the final + answer, not a summary.\n\nBegin! This is VERY important to you, use the tools + available and give your best Final Answer, your job depends on it!\n\nThought:"}], + "response": "I now can give a great answer \nFinal Answer: hello", "call_type": + "", "model": "gpt-4o-mini"}}, {"event_id": + "1ce38e05-20f8-4f6b-b303-720dbcbb73b2", "timestamp": "2025-11-15T20:15:51.175899+00:00", + "type": "agent_execution_completed", "event_data": {"agent_role": "Test Agent", + "agent_goal": "Test goal", "agent_backstory": "Test backstory"}}, {"event_id": + "dca0b4dd-dcfe-4002-9251-56cde6855f33", "timestamp": "2025-11-15T20:15:51.176016+00:00", + "type": "task_completed", "event_data": {"task_description": "Say hello", "task_name": + "Say hello", "task_id": "bbb08fd7-2580-43a8-bc71-5e0c08c7cc61", "output_raw": + "hello", "output_format": "OutputFormat.RAW", "agent_role": "Test Agent"}}, + {"event_id": "7e3993e7-e729-43a9-af63-b1429d0d2abc", "timestamp": "2025-11-15T20:15:51.177161+00:00", + "type": "crew_kickoff_completed", "event_data": {"timestamp": "2025-11-15T20:15:51.177161+00:00", + "type": "crew_kickoff_completed", "source_fingerprint": null, "source_type": + null, "fingerprint_metadata": null, "task_id": null, "task_name": null, "agent_id": + null, "agent_role": null, "crew_name": "crew", "crew": null, "output": {"description": + "Say hello", "name": "Say hello", "expected_output": "hello", "summary": "Say + hello...", "raw": "hello", "pydantic": null, "json_dict": null, "agent": "Test + Agent", "output_format": "raw", "messages": [{"role": "''system''", "content": + "''You are Test Agent. Test backstory\\nYour personal goal is: Test goal\\nTo + give my best complete final answer to the task respond using the exact following + format:\\n\\nThought: I now can give a great answer\\nFinal Answer: Your final + answer must be the great and the most complete as possible, it must be outcome + described.\\n\\nI MUST use these formats, my job depends on it!''"}, {"role": + "''user''", "content": "''\\nCurrent Task: Say hello\\n\\nThis is the expected + criteria for your final answer: hello\\nyou MUST return the actual complete + content as the final answer, not a summary.\\n\\nBegin! This is VERY important + to you, use the tools available and give your best Final Answer, your job depends + on it!\\n\\nThought:''"}, {"role": "''assistant''", "content": "''I now can + give a great answer \\nFinal Answer: hello''"}]}, "total_tokens": 165}}], "batch_metadata": + {"events_count": 8, "batch_sequence": 1, "is_final_batch": false}}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '6047' + Content-Type: + - application/json + User-Agent: + - CrewAI-CLI/1.4.1 + X-Crewai-Organization-Id: + - 73c2b193-f579-422c-84c7-76a39a1da77f + X-Crewai-Version: + - 1.4.1 + method: POST + uri: https://app.crewai.com/crewai_plus/api/v1/tracing/ephemeral/batches/REDACTED_EPHEMERAL_ID/events + response: + body: + string: '{"error":"Couldn''t find EphemeralTraceBatch with [WHERE \"ephemeral_trace_batches\".\"ephemeral_trace_id\" + = $1]","message":"Trace batch not found"}' + headers: + Connection: + - keep-alive + Content-Length: + - '148' + Content-Type: + - application/json; charset=utf-8 + Date: + - Sat, 15 Nov 2025 20:15:51 GMT + cache-control: + - no-store + content-security-policy: + - 'default-src ''self'' *.app.crewai.com app.crewai.com; script-src ''self'' + ''unsafe-inline'' *.app.crewai.com app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts + https://www.gstatic.com https://run.pstmn.io https://apis.google.com https://apis.google.com/js/api.js + https://accounts.google.com https://accounts.google.com/gsi/client https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css.map + https://*.google.com https://docs.google.com https://slides.google.com https://js.hs-scripts.com + https://js.sentry-cdn.com https://browser.sentry-cdn.com https://www.googletagmanager.com + https://js-na1.hs-scripts.com https://js.hubspot.com http://js-na1.hs-scripts.com + https://bat.bing.com https://cdn.amplitude.com https://cdn.segment.com https://d1d3n03t5zntha.cloudfront.net/ + https://descriptusercontent.com https://edge.fullstory.com https://googleads.g.doubleclick.net + https://js.hs-analytics.net https://js.hs-banner.com https://js.hsadspixel.net + https://js.hscollectedforms.net https://js.usemessages.com https://snap.licdn.com + https://static.cloudflareinsights.com https://static.reo.dev https://www.google-analytics.com + https://share.descript.com/; style-src ''self'' ''unsafe-inline'' *.app.crewai.com + app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts; img-src ''self'' data: + *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com https://dashboard.tools.crewai.com + https://cdn.jsdelivr.net https://forms.hsforms.com https://track.hubspot.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://www.google.com + https://www.google.com.br; font-src ''self'' data: *.app.crewai.com app.crewai.com; + connect-src ''self'' *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com + https://connect.useparagon.com/ https://zeus.useparagon.com/* https://*.useparagon.com/* + https://run.pstmn.io https://connect.tools.crewai.com/ https://*.sentry.io + https://www.google-analytics.com https://edge.fullstory.com https://rs.fullstory.com + https://api.hubspot.com https://forms.hscollectedforms.net https://api.hubapi.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://google.com/pagead/form-data/16713662509 + https://google.com/ccm/form-data/16713662509 https://www.google.com/ccm/collect + https://worker-actionkit.tools.crewai.com https://api.reo.dev; frame-src ''self'' + *.app.crewai.com app.crewai.com https://connect.useparagon.com/ https://zeus.tools.crewai.com + https://zeus.useparagon.com/* https://connect.tools.crewai.com/ https://docs.google.com + https://drive.google.com https://slides.google.com https://accounts.google.com + https://*.google.com https://app.hubspot.com/ https://td.doubleclick.net https://www.googletagmanager.com/ + https://www.youtube.com https://share.descript.com' + expires: + - '0' + permissions-policy: + - camera=(), microphone=(self), geolocation=() + pragma: + - no-cache + referrer-policy: + - strict-origin-when-cross-origin + strict-transport-security: + - max-age=63072000; includeSubDomains + vary: + - Accept + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-permitted-cross-domain-policies: + - none + x-request-id: + - 255abbea-b49c-4dcc-ade5-3e16fd59277d + x-runtime: + - '0.050642' + x-xss-protection: + - 1; mode=block + status: + code: 404 + message: Not Found +- request: + body: '{"status": "failed", "failure_reason": "Error sending events to backend"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '73' + Content-Type: + - application/json + User-Agent: + - CrewAI-CLI/1.4.1 + X-Crewai-Organization-Id: + - 73c2b193-f579-422c-84c7-76a39a1da77f + X-Crewai-Version: + - 1.4.1 + method: PATCH + uri: https://app.crewai.com/crewai_plus/api/v1/tracing/batches/REDACTED_EPHEMERAL_ID + response: + body: + string: '{"error":"bad_credentials","message":"Bad credentials"}' + headers: + Connection: + - keep-alive + Content-Length: + - '55' + Content-Type: + - application/json; charset=utf-8 + Date: + - Sat, 15 Nov 2025 20:15:51 GMT + cache-control: + - no-store + content-security-policy: + - 'default-src ''self'' *.app.crewai.com app.crewai.com; script-src ''self'' + ''unsafe-inline'' *.app.crewai.com app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts + https://www.gstatic.com https://run.pstmn.io https://apis.google.com https://apis.google.com/js/api.js + https://accounts.google.com https://accounts.google.com/gsi/client https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css.map + https://*.google.com https://docs.google.com https://slides.google.com https://js.hs-scripts.com + https://js.sentry-cdn.com https://browser.sentry-cdn.com https://www.googletagmanager.com + https://js-na1.hs-scripts.com https://js.hubspot.com http://js-na1.hs-scripts.com + https://bat.bing.com https://cdn.amplitude.com https://cdn.segment.com https://d1d3n03t5zntha.cloudfront.net/ + https://descriptusercontent.com https://edge.fullstory.com https://googleads.g.doubleclick.net + https://js.hs-analytics.net https://js.hs-banner.com https://js.hsadspixel.net + https://js.hscollectedforms.net https://js.usemessages.com https://snap.licdn.com + https://static.cloudflareinsights.com https://static.reo.dev https://www.google-analytics.com + https://share.descript.com/; style-src ''self'' ''unsafe-inline'' *.app.crewai.com + app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts; img-src ''self'' data: + *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com https://dashboard.tools.crewai.com + https://cdn.jsdelivr.net https://forms.hsforms.com https://track.hubspot.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://www.google.com + https://www.google.com.br; font-src ''self'' data: *.app.crewai.com app.crewai.com; + connect-src ''self'' *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com + https://connect.useparagon.com/ https://zeus.useparagon.com/* https://*.useparagon.com/* + https://run.pstmn.io https://connect.tools.crewai.com/ https://*.sentry.io + https://www.google-analytics.com https://edge.fullstory.com https://rs.fullstory.com + https://api.hubspot.com https://forms.hscollectedforms.net https://api.hubapi.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://google.com/pagead/form-data/16713662509 + https://google.com/ccm/form-data/16713662509 https://www.google.com/ccm/collect + https://worker-actionkit.tools.crewai.com https://api.reo.dev; frame-src ''self'' + *.app.crewai.com app.crewai.com https://connect.useparagon.com/ https://zeus.tools.crewai.com + https://zeus.useparagon.com/* https://connect.tools.crewai.com/ https://docs.google.com + https://drive.google.com https://slides.google.com https://accounts.google.com + https://*.google.com https://app.hubspot.com/ https://td.doubleclick.net https://www.googletagmanager.com/ + https://www.youtube.com https://share.descript.com' + expires: + - '0' + permissions-policy: + - camera=(), microphone=(self), geolocation=() + pragma: + - no-cache + referrer-policy: + - strict-origin-when-cross-origin + strict-transport-security: + - max-age=63072000; includeSubDomains + vary: + - Accept + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-permitted-cross-domain-policies: + - none + x-request-id: + - 7bbda7a6-5a8e-4dfc-bcef-fe9b8bff7532 + x-runtime: + - '0.042800' + x-xss-protection: + - 1; mode=block + status: + code: 401 + message: Unauthorized +version: 1 diff --git a/lib/crewai/tests/cassettes/TestTraceListenerSetup.test_first_time_user_trace_consolidation_logic.yaml b/lib/crewai/tests/cassettes/TestTraceListenerSetup.test_first_time_user_trace_consolidation_logic.yaml index 8a73e47fc..29a2f2ddf 100644 --- a/lib/crewai/tests/cassettes/TestTraceListenerSetup.test_first_time_user_trace_consolidation_logic.yaml +++ b/lib/crewai/tests/cassettes/TestTraceListenerSetup.test_first_time_user_trace_consolidation_logic.yaml @@ -1,30 +1,30 @@ interactions: - request: - body: '{"messages": [{"role": "system", "content": "You are Test Agent. Test backstory\nYour + body: '{"messages":[{"role":"system","content":"You are Test Agent. Test backstory\nYour personal goal is: Test goal\nTo give my best complete final answer to the task respond using the exact following format:\n\nThought: I now can give a great answer\nFinal Answer: Your final answer must be the great and the most complete as possible, it must be outcome described.\n\nI MUST use these formats, my job - depends on it!"}, {"role": "user", "content": "\nCurrent Task: Test task\n\nThis + depends on it!"},{"role":"user","content":"\nCurrent Task: Test task\n\nThis is the expected criteria for your final answer: test output\nyou MUST return the actual complete content as the final answer, not a summary.\n\nBegin! This is VERY important to you, use the tools available and give your best Final Answer, - your job depends on it!\n\nThought:"}], "model": "gpt-4o-mini", "stop": ["\nObservation:"]}' + your job depends on it!\n\nThought:"}],"model":"gpt-4o-mini"}' headers: accept: - application/json accept-encoding: - - gzip, deflate, zstd + - gzip, deflate connection: - keep-alive content-length: - - '812' + - '774' content-type: - application/json host: - api.openai.com user-agent: - - OpenAI/Python 1.93.0 + - OpenAI/Python 1.109.1 x-stainless-arch: - arm64 x-stainless-async: @@ -34,33 +34,37 @@ interactions: x-stainless-os: - MacOS x-stainless-package-version: - - 1.93.0 - x-stainless-raw-response: - - 'true' + - 1.109.1 x-stainless-read-timeout: - - '600.0' + - '600' x-stainless-retry-count: - '0' x-stainless-runtime: - CPython x-stainless-runtime-version: - - 3.12.9 + - 3.12.10 method: POST uri: https://api.openai.com/v1/chat/completions response: body: string: !!binary | - H4sIAAAAAAAAAwAAAP//jFLLbtswELzrKxY8W4WV+JHoVgR95NJD4UvaBgJDrSS2FJclV3bSwP9e - kHYsuU2BXghwZ2c4s8vnDEDoWpQgVCdZ9c7kNx+4v7vb7jafnrrPX25/vtObX48f1Q31m+uFmEUG - PXxHxS+sN4p6Z5A12QOsPErGqFqsl1fF4nJdzBPQU40m0lrH+YLyXludX8wvFvl8nRdXR3ZHWmEQ - JXzNAACe0xl92hofRQlJK1V6DEG2KMpTE4DwZGJFyBB0YGlZzEZQkWW0yfotWNqBkhZavUWQ0Ebb - IG3YoQf4Zt9rKw28TfcSNhgYaGA3nAl6bIYgYyg7GDMBpLXEMg4lRbk/IvuTeUOt8/QQ/qCKRlsd - usqjDGSj0cDkREL3GcB9GtJwlls4T73jiukHpueK5eKgJ8bdTNDLI8jE0kzqq/XsFb2qRpbahMmY - hZKqw3qkjjuRQ61pAmST1H+7eU37kFzb9n/kR0ApdIx15TzWWp0nHts8xq/7r7bTlJNhEdBvtcKK - Nfq4iRobOZjD/kV4Cox91WjbondeH35V46rlai6bFS6X1yLbZ78BAAD//wMAZdfoWWMDAAA= + H4sIAAAAAAAAAwAAAP//jFTBjhs3DL37K4i59DI2bHe9m/rWBCmQFkWLdlEgbQODK3FmlNWQU5Hj + 2A323wNpvGtvs4deBiM9PurxUdTnGUAVfLWFynVorh/i/I376X3bxHd//LJa/eZXt4F/bOjPn39d + /v72zb9VnRly95GcPbIWTvohkgXhCXaJ0ChnXd1cf7verDbr6wL04ilmWjvY/ErmfeAwXy/XV/Pl + zXz16sTuJDjSagt/zQAAPpdv1smeDtUWlvXjTk+q2FK1fQoCqJLEvFOhalBDtqo+g07YiIv0d8Dy + CRwytGFPgNBm2YCsnygB/M0/BMYI35f1Fm47AjoM5Iw8uBSMUkBoJIF1BE2JPXGDggkMSfbBE2R3 + EnXEmo8J3EjqMZsFwoWrY7ETEsVsW+bmbSM1MNT7Bdx2QSGwi6On/DP3NFgHyBiPGrTOVNojG9AB + cy+0BiaX3UlH8GhYA7IHFwlTriIiFwkK1qGBQ6P0eG6x6GAgzSRBRhtGWxQDMPSn6oh1TDTRaU/p + CKjZnELL6lHvc6iTPaVcVCdJxraLx6xWx2iBWwiTA72oATUNOSutYH/2qayLrYOohrtIC3h9hEbc + qDnFZKJOPgsTm9Zft0Q7GaMHFgPheISeyCbzB3KhCZc9vRsNMKoAHRyRP3V98qsGT72wWsJSgIuY + gh1rGBK5oEH45PQ0EsSkJ4/R+0SqpE/2fKOQ6J8xJOqz6ucXJR4Xl/c2UTMq5tnhMcYLAJnlpC1P + zIcT8vA0I1HaIcmd/odaNYGDdrtEqMJ5HtRkqAr6MAP4UGZxfDZe1ZCkH2xnck/luNXmaspXnZ+A + C3T16oSaGMYzsL5Z1y8k3HkyDFEvxrly6DryZ+p59nH0QS6A2UXZX8t5KfdUeuD2/6Q/A87RYOR3 + QyIf3POSz2GJPpan4uWwJ5uL4Eop7YOjnQVKuRWeGhzj9HBVelSjftcEbikNKUyvVzPsNtdLbK5p + s/mumj3MvgAAAP//AwAmD0HmywUAAA== headers: CF-RAY: - - 980b9e0c5fa516a0-SJC + - 99f2bc8f6f4dfab6-SJC Connection: - keep-alive Content-Encoding: @@ -68,14 +72,14 @@ interactions: Content-Type: - application/json Date: - - Wed, 17 Sep 2025 21:15:11 GMT + - Sun, 16 Nov 2025 00:05:27 GMT Server: - cloudflare Set-Cookie: - - __cf_bm=w6UZxbAZgYg9EFkKPfrSbMK97MB4jfs7YyvcEmgkvak-1758143711-1.0.1.1-j7YC1nvoMKxYK0T.5G2XDF6TXUCPu_HUs4YO9v65r3NHQFIcOaHbQXX4vqabSgynL2tZy23pbZgD8Cdmxhdw9dp4zkAXhU.imP43_pw4dSE; - path=/; expires=Wed, 17-Sep-25 21:45:11 GMT; domain=.api.openai.com; HttpOnly; + - __cf_bm=REDACTED; + path=/; expires=Sun, 16-Nov-25 00:35:27 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - - _cfuvid=ij9Q8tB7sj2GczANlJ7gbXVjj6hMhz1iVb6oGHuRYu8-1758143711202-0.0.1.1-604800000; + - _cfuvid=REDACTED; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None Strict-Transport-Security: - max-age=31536000; includeSubDomains; preload @@ -90,15 +94,15 @@ interactions: cf-cache-status: - DYNAMIC openai-organization: - - crewai-iuxna1 + - test-org openai-processing-ms: - - '462' + - '1493' openai-project: - - proj_xitITlrFeen7zjNSzML82h9x + - proj_test123 openai-version: - '2020-10-01' x-envoy-upstream-service-time: - - '665' + - '1733' x-openai-proxy-wasm: - v0.1 x-ratelimit-limit-project-tokens: @@ -108,11 +112,11 @@ interactions: x-ratelimit-limit-tokens: - '150000000' x-ratelimit-remaining-project-tokens: - - '149999830' + - '149999832' x-ratelimit-remaining-requests: - '29999' x-ratelimit-remaining-tokens: - - '149999830' + - '149999832' x-ratelimit-reset-project-tokens: - 0s x-ratelimit-reset-requests: @@ -120,7 +124,7 @@ interactions: x-ratelimit-reset-tokens: - 0s x-request-id: - - req_04536db97c8c4768a200e38c1368c176 + - req_test123 status: code: 200 message: OK diff --git a/lib/crewai/tests/cassettes/test_agent_moved_on_after_max_iterations.yaml b/lib/crewai/tests/cassettes/test_agent_moved_on_after_max_iterations.yaml index 47ec18041..5f7ee452a 100644 --- a/lib/crewai/tests/cassettes/test_agent_moved_on_after_max_iterations.yaml +++ b/lib/crewai/tests/cassettes/test_agent_moved_on_after_max_iterations.yaml @@ -1,6 +1,6 @@ interactions: - request: - body: '{"messages": [{"role": "system", "content": "You are test role. test backstory\nYour + body: '{"messages":[{"role":"system","content":"You are test role. test backstory\nYour personal goal is: test goal\nYou ONLY have access to the following tools, and should NEVER make up tools that are not listed here:\n\nTool Name: get_final_answer\nTool Arguments: {}\nTool Description: Get the final answer but don''t give it yet, @@ -11,29 +11,28 @@ interactions: object, enclosed in curly braces, using \" to wrap keys and values.\nObservation: the result of the action\n```\n\nOnce all necessary information is gathered, return the following format:\n\n```\nThought: I now know the final answer\nFinal - Answer: the final answer to the original input question\n```"}, {"role": "user", - "content": "\nCurrent Task: The final answer is 42. But don''t give it yet, - instead keep using the `get_final_answer` tool over and over until you''re told - you can give your final answer.\n\nThis is the expected criteria for your final - answer: The final answer\nyou MUST return the actual complete content as the - final answer, not a summary.\n\nBegin! This is VERY important to you, use the - tools available and give your best Final Answer, your job depends on it!\n\nThought:"}], - "model": "gpt-4o-mini", "stop": ["\nObservation:"]}' + Answer: the final answer to the original input question\n```"},{"role":"user","content":"\nCurrent + Task: The final answer is 42. But don''t give it yet, instead keep using the + `get_final_answer` tool over and over until you''re told you can give your final + answer.\n\nThis is the expected criteria for your final answer: The final answer\nyou + MUST return the actual complete content as the final answer, not a summary.\n\nBegin! + This is VERY important to you, use the tools available and give your best Final + Answer, your job depends on it!\n\nThought:"}],"model":"gpt-4.1-mini"}' headers: accept: - application/json accept-encoding: - - gzip, deflate, zstd + - gzip, deflate connection: - keep-alive content-length: - - '1501' + - '1464' content-type: - application/json host: - api.openai.com user-agent: - - OpenAI/Python 1.68.2 + - OpenAI/Python 1.109.1 x-stainless-arch: - arm64 x-stainless-async: @@ -43,36 +42,34 @@ interactions: x-stainless-os: - MacOS x-stainless-package-version: - - 1.68.2 - x-stainless-raw-response: - - 'true' + - 1.109.1 x-stainless-read-timeout: - - '600.0' + - '600' x-stainless-retry-count: - '0' x-stainless-runtime: - CPython x-stainless-runtime-version: - - 3.12.8 + - 3.12.10 method: POST uri: https://api.openai.com/v1/chat/completions response: - content: "{\n \"id\": \"chatcmpl-BHIyHPwQwes0C4pDX7xQLHvqR6305\",\n \"object\": - \"chat.completion\",\n \"created\": 1743464201,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Thought: I should start using the tool - to get the final answer repeatedly as instructed. \\nAction: get_final_answer - \ \\nAction Input: {} \",\n \"refusal\": null,\n \"annotations\": - []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n - \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 303,\n \"completion_tokens\": - 29,\n \"total_tokens\": 332,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n - \ \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_b376dfbbd5\"\n}\n" + body: + string: !!binary | + H4sIAAAAAAAAAwAAAP//tFTRbtMwFH3vV1z5uZ2aNCsjb2hI0+ABbUwCiU6Za98kZo5t7OuNMvXf + UZx26dgm8QAvieTjc+6518d+mAAwJVkJTLScROf07FTk8suv9tfZ+u3lh68XHz/Lzi1Pry7eb67O + Ltm0Z9j1dxS0Zx0J2zmNpKwZYOGRE/aq2ZvlIjvJl4siAZ2VqHta42hWHGWzThk1y+f58WxezLJi + R2+tEhhYCd8mAAAP6dsbNRJ/shLm0/1KhyHwBln5uAmAeav7FcZDUIG4ITYdQWENoUneb25uVuaq + tbFpqYRzCK2NWkIMCNQiNEhVrQzXFTfhHj2QtRp4AGUC+SgIJXAj4RbRgbTKNBAs3CtqbSRo1F2/ + 0gslEdiJbJCOVuad6KdVPquxR+DcuEglPGxX5tM6oL/jA6HIVyb53v0O7ZPSGgyiBLKDqxj2Hl5u + xqNLJ6U3sMbaenzN9n+xfGoNKRNTPZvG/swlD+DxR1Qe5d7hYMtGcvFfTPIwGx7rGHgfUBO1PgC4 + MZYSL6XyeodsH3OobeO8XYc/qKxWRoW28siDNX3mAlnHErqdAFynvMcnEWbO285RRfYWU7nFfDHo + sfGejWiW7VGyxPUIFNly+oJgJZG40uHgyjDBRYtypI73i0ep7AEwOWj7uZ2XtIfWlWn+Rn4EhEBH + KCvnUSrxtOVxm8f+HXpt2+OYk2HWn70SWJFC3x+FxJpHPTwOLGwCYdcnqEHvvBpeiNpVhchPjrP6 + ZJmzyXbyGwAA//8DAKpgMhgwBQAA headers: - CF-RAY: - - 9293ab99f853ce50-SJC + CF-Ray: + - 99ec2aa84b2ba230-SJC Connection: - keep-alive Content-Encoding: @@ -80,15 +77,17 @@ interactions: Content-Type: - application/json Date: - - Mon, 31 Mar 2025 23:36:42 GMT + - Sat, 15 Nov 2025 04:57:16 GMT Server: - cloudflare Set-Cookie: - - __cf_bm=Bwvchs4Dp02K9.WxyX6U8yVg.jg2z6x7yNWekHnFUbQ-1743464202-1.0.1.1-KvmUaCRpD961qPqJPLi38I.N4IEYmc3i_IyJ5LDo2z5TIhZilbmK0oMNu7HrCHT3kzKWh0SpZ_FocvywK0qJ3fku_cwyTByEPK05SQQOEWE; - path=/; expires=Tue, 01-Apr-25 00:06:42 GMT; domain=.api.openai.com; HttpOnly; + - __cf_bm=REDACTED; + path=/; expires=Sat, 15-Nov-25 05:27:16 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - - _cfuvid=zeQ6mwappLtze7fZgtCp1BJNVbBLSsCm8WxR2Jydshg-1743464202332-0.0.1.1-604800000; + - _cfuvid=REDACTED; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload Transfer-Encoding: - chunked X-Content-Type-Options: @@ -100,324 +99,42 @@ interactions: cf-cache-status: - DYNAMIC openai-organization: - - crewai-iuxna1 + - REDACTED openai-processing-ms: - - '967' + - '1441' + openai-project: + - REDACTED openai-version: - '2020-10-01' - strict-transport-security: - - max-age=31536000; includeSubDomains; preload + x-envoy-upstream-service-time: + - '1595' + x-openai-proxy-wasm: + - v0.1 + x-ratelimit-limit-project-tokens: + - '150000000' x-ratelimit-limit-requests: - '30000' x-ratelimit-limit-tokens: - '150000000' + x-ratelimit-remaining-project-tokens: + - '149999662' x-ratelimit-remaining-requests: - '29999' x-ratelimit-remaining-tokens: - - '149999663' + - '149999662' + x-ratelimit-reset-project-tokens: + - 0s x-ratelimit-reset-requests: - 2ms x-ratelimit-reset-tokens: - 0s x-request-id: - - req_a8af664cb724dbc0d8886d863743321b - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"messages": [{"role": "system", "content": "You are test role. test backstory\nYour - personal goal is: test goal\nYou ONLY have access to the following tools, and - should NEVER make up tools that are not listed here:\n\nTool Name: get_final_answer\nTool - Arguments: {}\nTool Description: Get the final answer but don''t give it yet, - just re-use this\n tool non-stop.\n\nIMPORTANT: Use the following format - in your response:\n\n```\nThought: you should always think about what to do\nAction: - the action to take, only one name of [get_final_answer], just the name, exactly - as it''s written.\nAction Input: the input to the action, just a simple JSON - object, enclosed in curly braces, using \" to wrap keys and values.\nObservation: - the result of the action\n```\n\nOnce all necessary information is gathered, - return the following format:\n\n```\nThought: I now know the final answer\nFinal - Answer: the final answer to the original input question\n```"}, {"role": "user", - "content": "\nCurrent Task: The final answer is 42. But don''t give it yet, - instead keep using the `get_final_answer` tool over and over until you''re told - you can give your final answer.\n\nThis is the expected criteria for your final - answer: The final answer\nyou MUST return the actual complete content as the - final answer, not a summary.\n\nBegin! This is VERY important to you, use the - tools available and give your best Final Answer, your job depends on it!\n\nThought:"}, - {"role": "assistant", "content": "42"}, {"role": "assistant", "content": "Thought: - I should start using the tool to get the final answer repeatedly as instructed. \nAction: - get_final_answer \nAction Input: {} \nObservation: 42"}], "model": "gpt-4o-mini", - "stop": ["\nObservation:"]}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '1734' - content-type: - - application/json - cookie: - - __cf_bm=Bwvchs4Dp02K9.WxyX6U8yVg.jg2z6x7yNWekHnFUbQ-1743464202-1.0.1.1-KvmUaCRpD961qPqJPLi38I.N4IEYmc3i_IyJ5LDo2z5TIhZilbmK0oMNu7HrCHT3kzKWh0SpZ_FocvywK0qJ3fku_cwyTByEPK05SQQOEWE; - _cfuvid=zeQ6mwappLtze7fZgtCp1BJNVbBLSsCm8WxR2Jydshg-1743464202332-0.0.1.1-604800000 - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.68.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.68.2 - x-stainless-raw-response: - - 'true' - x-stainless-read-timeout: - - '600.0' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.12.8 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - content: "{\n \"id\": \"chatcmpl-BHIyIBjI26RQEA6wcGPOodTFflqRo\",\n \"object\": - \"chat.completion\",\n \"created\": 1743464202,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Thought: I should continue using the - tool to obtain the final answer. \\nAction: get_final_answer \\nAction Input: - {} \",\n \"refusal\": null,\n \"annotations\": []\n },\n - \ \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n - \ \"usage\": {\n \"prompt_tokens\": 345,\n \"completion_tokens\": 26,\n - \ \"total_tokens\": 371,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n - \ \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_b376dfbbd5\"\n}\n" - headers: - CF-RAY: - - 9293aba0e8d6ce50-SJC - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 31 Mar 2025 23:36:43 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - crewai-iuxna1 - openai-processing-ms: - - '556' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999622' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_c57d2f2205a659ee25d122bdc7a3d5ba - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"messages": [{"role": "system", "content": "You are test role. test backstory\nYour - personal goal is: test goal\nYou ONLY have access to the following tools, and - should NEVER make up tools that are not listed here:\n\nTool Name: get_final_answer\nTool - Arguments: {}\nTool Description: Get the final answer but don''t give it yet, - just re-use this\n tool non-stop.\n\nIMPORTANT: Use the following format - in your response:\n\n```\nThought: you should always think about what to do\nAction: - the action to take, only one name of [get_final_answer], just the name, exactly - as it''s written.\nAction Input: the input to the action, just a simple JSON - object, enclosed in curly braces, using \" to wrap keys and values.\nObservation: - the result of the action\n```\n\nOnce all necessary information is gathered, - return the following format:\n\n```\nThought: I now know the final answer\nFinal - Answer: the final answer to the original input question\n```"}, {"role": "user", - "content": "\nCurrent Task: The final answer is 42. But don''t give it yet, - instead keep using the `get_final_answer` tool over and over until you''re told - you can give your final answer.\n\nThis is the expected criteria for your final - answer: The final answer\nyou MUST return the actual complete content as the - final answer, not a summary.\n\nBegin! This is VERY important to you, use the - tools available and give your best Final Answer, your job depends on it!\n\nThought:"}, - {"role": "assistant", "content": "42"}, {"role": "assistant", "content": "Thought: - I should start using the tool to get the final answer repeatedly as instructed. \nAction: - get_final_answer \nAction Input: {} \nObservation: 42"}, {"role": "assistant", - "content": "I tried reusing the same input, I must stop using this action input. - I''ll try something else instead.\n\n"}, {"role": "assistant", "content": "Thought: - I should continue using the tool to obtain the final answer. \nAction: get_final_answer \nAction - Input: {} \nObservation: I tried reusing the same input, I must stop using - this action input. I''ll try something else instead."}], "model": "gpt-4o-mini", - "stop": ["\nObservation:"]}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '2150' - content-type: - - application/json - cookie: - - __cf_bm=Bwvchs4Dp02K9.WxyX6U8yVg.jg2z6x7yNWekHnFUbQ-1743464202-1.0.1.1-KvmUaCRpD961qPqJPLi38I.N4IEYmc3i_IyJ5LDo2z5TIhZilbmK0oMNu7HrCHT3kzKWh0SpZ_FocvywK0qJ3fku_cwyTByEPK05SQQOEWE; - _cfuvid=zeQ6mwappLtze7fZgtCp1BJNVbBLSsCm8WxR2Jydshg-1743464202332-0.0.1.1-604800000 - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.68.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.68.2 - x-stainless-raw-response: - - 'true' - x-stainless-read-timeout: - - '600.0' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.12.8 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - content: "{\n \"id\": \"chatcmpl-BHIyJ9rzK9MdaKoTCou0bZfXbocg2\",\n \"object\": - \"chat.completion\",\n \"created\": 1743464203,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Thought: I need to keep using the tool - to retrieve the final answer repeatedly. \\nAction: get_final_answer \\nAction - Input: {} \",\n \"refusal\": null,\n \"annotations\": []\n },\n - \ \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n - \ \"usage\": {\n \"prompt_tokens\": 425,\n \"completion_tokens\": 28,\n - \ \"total_tokens\": 453,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n - \ \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_b376dfbbd5\"\n}\n" - headers: - CF-RAY: - - 9293aba4eda8ce50-SJC - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 31 Mar 2025 23:36:43 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - crewai-iuxna1 - openai-processing-ms: - - '550' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999537' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_43c3fb39cef01274c42b218850f6c23a - http_version: HTTP/1.1 - status_code: 200 -- request: - body: !!binary | - CpQECiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkS6wMKEgoQY3Jld2FpLnRl - bGVtZXRyeRKUAQoQKWg+yHi9soA2LjyuLMgsRRIIAgk59s2N62MqClRvb2wgVXNhZ2UwATnQhPxq - dAcyGEHofxFrdAcyGEobCg5jcmV3YWlfdmVyc2lvbhIJCgcwLjEwOC4wSh8KCXRvb2xfbmFtZRIS - ChBnZXRfZmluYWxfYW5zd2VySg4KCGF0dGVtcHRzEgIYAXoCGAGFAQABAAASnQEKEIU9KjUxT2Q4 - Rb5JHmc7ziwSCE1tdrTxYrB1KhNUb29sIFJlcGVhdGVkIFVzYWdlMAE5MHhQkXQHMhhBMB5fkXQH - MhhKGwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4xMDguMEofCgl0b29sX25hbWUSEgoQZ2V0X2ZpbmFs - X2Fuc3dlckoOCghhdHRlbXB0cxICGAF6AhgBhQEAAQAAEp0BChBktnW7lH1MTK02aePrm5fjEggA - v1XFsR1QSyoTVG9vbCBSZXBlYXRlZCBVc2FnZTABOeAkd7h0BzIYQTj+gbh0BzIYShsKDmNyZXdh - aV92ZXJzaW9uEgkKBzAuMTA4LjBKHwoJdG9vbF9uYW1lEhIKEGdldF9maW5hbF9hbnN3ZXJKDgoI - YXR0ZW1wdHMSAhgBegIYAYUBAAEAAA== - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '535' - Content-Type: - - application/x-protobuf - User-Agent: - - OTel-OTLP-Exporter-Python/1.31.1 - method: POST - uri: https://telemetry.crewai.com:4319/v1/traces - response: - body: - string: "\n\0" - headers: - Content-Length: - - '2' - Content-Type: - - application/x-protobuf - Date: - - Mon, 31 Mar 2025 23:36:44 GMT + - REDACTED_REQUEST_ID status: code: 200 message: OK - request: - body: '{"messages": [{"role": "system", "content": "You are test role. test backstory\nYour + body: '{"messages":[{"role":"system","content":"You are test role. test backstory\nYour personal goal is: test goal\nYou ONLY have access to the following tools, and should NEVER make up tools that are not listed here:\n\nTool Name: get_final_answer\nTool Arguments: {}\nTool Description: Get the final answer but don''t give it yet, @@ -428,722 +145,726 @@ interactions: object, enclosed in curly braces, using \" to wrap keys and values.\nObservation: the result of the action\n```\n\nOnce all necessary information is gathered, return the following format:\n\n```\nThought: I now know the final answer\nFinal - Answer: the final answer to the original input question\n```"}, {"role": "user", - "content": "\nCurrent Task: The final answer is 42. But don''t give it yet, - instead keep using the `get_final_answer` tool over and over until you''re told - you can give your final answer.\n\nThis is the expected criteria for your final - answer: The final answer\nyou MUST return the actual complete content as the - final answer, not a summary.\n\nBegin! This is VERY important to you, use the - tools available and give your best Final Answer, your job depends on it!\n\nThought:"}, - {"role": "assistant", "content": "42"}, {"role": "assistant", "content": "Thought: - I should start using the tool to get the final answer repeatedly as instructed. \nAction: - get_final_answer \nAction Input: {} \nObservation: 42"}, {"role": "assistant", - "content": "I tried reusing the same input, I must stop using this action input. - I''ll try something else instead.\n\n"}, {"role": "assistant", "content": "Thought: - I should continue using the tool to obtain the final answer. \nAction: get_final_answer \nAction - Input: {} \nObservation: I tried reusing the same input, I must stop using - this action input. I''ll try something else instead."}, {"role": "assistant", - "content": "I tried reusing the same input, I must stop using this action input. - I''ll try something else instead.\n\n\n\n\nYou ONLY have access to the following - tools, and should NEVER make up tools that are not listed here:\n\nTool Name: - get_final_answer\nTool Arguments: {}\nTool Description: Get the final answer - but don''t give it yet, just re-use this\n tool non-stop.\n\nIMPORTANT: - Use the following format in your response:\n\n```\nThought: you should always - think about what to do\nAction: the action to take, only one name of [get_final_answer], - just the name, exactly as it''s written.\nAction Input: the input to the action, - just a simple JSON object, enclosed in curly braces, using \" to wrap keys and - values.\nObservation: the result of the action\n```\n\nOnce all necessary information - is gathered, return the following format:\n\n```\nThought: I now know the final - answer\nFinal Answer: the final answer to the original input question\n```"}, - {"role": "assistant", "content": "Thought: I need to keep using the tool to - retrieve the final answer repeatedly. \nAction: get_final_answer \nAction - Input: {} \nObservation: I tried reusing the same input, I must stop using - this action input. I''ll try something else instead.\n\n\n\n\nYou ONLY have - access to the following tools, and should NEVER make up tools that are not listed - here:\n\nTool Name: get_final_answer\nTool Arguments: {}\nTool Description: - Get the final answer but don''t give it yet, just re-use this\n tool - non-stop.\n\nIMPORTANT: Use the following format in your response:\n\n```\nThought: - you should always think about what to do\nAction: the action to take, only one - name of [get_final_answer], just the name, exactly as it''s written.\nAction - Input: the input to the action, just a simple JSON object, enclosed in curly - braces, using \" to wrap keys and values.\nObservation: the result of the action\n```\n\nOnce - all necessary information is gathered, return the following format:\n\n```\nThought: - I now know the final answer\nFinal Answer: the final answer to the original - input question\n```"}], "model": "gpt-4o-mini", "stop": ["\nObservation:"]}' + Answer: the final answer to the original input question\n```"},{"role":"user","content":"\nCurrent + Task: The final answer is 42. But don''t give it yet, instead keep using the + `get_final_answer` tool over and over until you''re told you can give your final + answer.\n\nThis is the expected criteria for your final answer: The final answer\nyou + MUST return the actual complete content as the final answer, not a summary.\n\nBegin! + This is VERY important to you, use the tools available and give your best Final + Answer, your job depends on it!\n\nThought:"},{"role":"assistant","content":"```\nThought: + I should use the get_final_answer tool as instructed and keep doing so without + giving the final answer yet.\nAction: get_final_answer\nAction Input: {}\nObservation: + 42"}],"model":"gpt-4.1-mini"}' headers: accept: - application/json accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '4266' - content-type: - - application/json - cookie: - - __cf_bm=Bwvchs4Dp02K9.WxyX6U8yVg.jg2z6x7yNWekHnFUbQ-1743464202-1.0.1.1-KvmUaCRpD961qPqJPLi38I.N4IEYmc3i_IyJ5LDo2z5TIhZilbmK0oMNu7HrCHT3kzKWh0SpZ_FocvywK0qJ3fku_cwyTByEPK05SQQOEWE; - _cfuvid=zeQ6mwappLtze7fZgtCp1BJNVbBLSsCm8WxR2Jydshg-1743464202332-0.0.1.1-604800000 - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.68.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.68.2 - x-stainless-raw-response: - - 'true' - x-stainless-read-timeout: - - '600.0' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.12.8 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - content: "{\n \"id\": \"chatcmpl-BHIyJOYjYmWgzoxY1EujNvwGjOf0V\",\n \"object\": - \"chat.completion\",\n \"created\": 1743464203,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Thought: I need to continue using the - designated tool to obtain the final answer. \\nAction: get_final_answer \\nAction - Input: {} \",\n \"refusal\": null,\n \"annotations\": []\n },\n - \ \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n - \ \"usage\": {\n \"prompt_tokens\": 861,\n \"completion_tokens\": 28,\n - \ \"total_tokens\": 889,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n - \ \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_b376dfbbd5\"\n}\n" - headers: - CF-RAY: - - 9293aba90b04ce50-SJC - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 31 Mar 2025 23:36:45 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - crewai-iuxna1 - openai-processing-ms: - - '1496' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149999039' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_8c38f479539f55db3282f670b8957bf4 - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"messages": [{"role": "system", "content": "You are test role. test backstory\nYour - personal goal is: test goal\nYou ONLY have access to the following tools, and - should NEVER make up tools that are not listed here:\n\nTool Name: get_final_answer\nTool - Arguments: {}\nTool Description: Get the final answer but don''t give it yet, - just re-use this\n tool non-stop.\n\nIMPORTANT: Use the following format - in your response:\n\n```\nThought: you should always think about what to do\nAction: - the action to take, only one name of [get_final_answer], just the name, exactly - as it''s written.\nAction Input: the input to the action, just a simple JSON - object, enclosed in curly braces, using \" to wrap keys and values.\nObservation: - the result of the action\n```\n\nOnce all necessary information is gathered, - return the following format:\n\n```\nThought: I now know the final answer\nFinal - Answer: the final answer to the original input question\n```"}, {"role": "user", - "content": "\nCurrent Task: The final answer is 42. But don''t give it yet, - instead keep using the `get_final_answer` tool over and over until you''re told - you can give your final answer.\n\nThis is the expected criteria for your final - answer: The final answer\nyou MUST return the actual complete content as the - final answer, not a summary.\n\nBegin! This is VERY important to you, use the - tools available and give your best Final Answer, your job depends on it!\n\nThought:"}, - {"role": "assistant", "content": "42"}, {"role": "assistant", "content": "Thought: - I should start using the tool to get the final answer repeatedly as instructed. \nAction: - get_final_answer \nAction Input: {} \nObservation: 42"}, {"role": "assistant", - "content": "I tried reusing the same input, I must stop using this action input. - I''ll try something else instead.\n\n"}, {"role": "assistant", "content": "Thought: - I should continue using the tool to obtain the final answer. \nAction: get_final_answer \nAction - Input: {} \nObservation: I tried reusing the same input, I must stop using - this action input. I''ll try something else instead."}, {"role": "assistant", - "content": "I tried reusing the same input, I must stop using this action input. - I''ll try something else instead.\n\n\n\n\nYou ONLY have access to the following - tools, and should NEVER make up tools that are not listed here:\n\nTool Name: - get_final_answer\nTool Arguments: {}\nTool Description: Get the final answer - but don''t give it yet, just re-use this\n tool non-stop.\n\nIMPORTANT: - Use the following format in your response:\n\n```\nThought: you should always - think about what to do\nAction: the action to take, only one name of [get_final_answer], - just the name, exactly as it''s written.\nAction Input: the input to the action, - just a simple JSON object, enclosed in curly braces, using \" to wrap keys and - values.\nObservation: the result of the action\n```\n\nOnce all necessary information - is gathered, return the following format:\n\n```\nThought: I now know the final - answer\nFinal Answer: the final answer to the original input question\n```"}, - {"role": "assistant", "content": "Thought: I need to keep using the tool to - retrieve the final answer repeatedly. \nAction: get_final_answer \nAction - Input: {} \nObservation: I tried reusing the same input, I must stop using - this action input. I''ll try something else instead.\n\n\n\n\nYou ONLY have - access to the following tools, and should NEVER make up tools that are not listed - here:\n\nTool Name: get_final_answer\nTool Arguments: {}\nTool Description: - Get the final answer but don''t give it yet, just re-use this\n tool - non-stop.\n\nIMPORTANT: Use the following format in your response:\n\n```\nThought: - you should always think about what to do\nAction: the action to take, only one - name of [get_final_answer], just the name, exactly as it''s written.\nAction - Input: the input to the action, just a simple JSON object, enclosed in curly - braces, using \" to wrap keys and values.\nObservation: the result of the action\n```\n\nOnce - all necessary information is gathered, return the following format:\n\n```\nThought: - I now know the final answer\nFinal Answer: the final answer to the original - input question\n```"}, {"role": "assistant", "content": "I tried reusing the - same input, I must stop using this action input. I''ll try something else instead.\n\n"}, - {"role": "assistant", "content": "Thought: I need to continue using the designated - tool to obtain the final answer. \nAction: get_final_answer \nAction Input: - {} \nObservation: I tried reusing the same input, I must stop using this action - input. I''ll try something else instead."}], "model": "gpt-4o-mini", "stop": - ["\nObservation:"]}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '4694' - content-type: - - application/json - cookie: - - __cf_bm=Bwvchs4Dp02K9.WxyX6U8yVg.jg2z6x7yNWekHnFUbQ-1743464202-1.0.1.1-KvmUaCRpD961qPqJPLi38I.N4IEYmc3i_IyJ5LDo2z5TIhZilbmK0oMNu7HrCHT3kzKWh0SpZ_FocvywK0qJ3fku_cwyTByEPK05SQQOEWE; - _cfuvid=zeQ6mwappLtze7fZgtCp1BJNVbBLSsCm8WxR2Jydshg-1743464202332-0.0.1.1-604800000 - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.68.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.68.2 - x-stainless-raw-response: - - 'true' - x-stainless-read-timeout: - - '600.0' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.12.8 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - content: "{\n \"id\": \"chatcmpl-BHIyLLDkgsE6GdQsZ86C35CjnYGTo\",\n \"object\": - \"chat.completion\",\n \"created\": 1743464205,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Thought: I need to continue using the - tool without changing the input format. \\nAction: get_final_answer \\nAction - Input: {} \",\n \"refusal\": null,\n \"annotations\": []\n },\n - \ \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n - \ \"usage\": {\n \"prompt_tokens\": 943,\n \"completion_tokens\": 27,\n - \ \"total_tokens\": 970,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n - \ \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_b376dfbbd5\"\n}\n" - headers: - CF-RAY: - - 9293abb3684dce50-SJC - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 31 Mar 2025 23:36:46 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - crewai-iuxna1 - openai-processing-ms: - - '809' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149998950' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_35fcab88e7d96ac0040ee34407d57ced - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"messages": [{"role": "system", "content": "You are test role. test backstory\nYour - personal goal is: test goal\nYou ONLY have access to the following tools, and - should NEVER make up tools that are not listed here:\n\nTool Name: get_final_answer\nTool - Arguments: {}\nTool Description: Get the final answer but don''t give it yet, - just re-use this\n tool non-stop.\n\nIMPORTANT: Use the following format - in your response:\n\n```\nThought: you should always think about what to do\nAction: - the action to take, only one name of [get_final_answer], just the name, exactly - as it''s written.\nAction Input: the input to the action, just a simple JSON - object, enclosed in curly braces, using \" to wrap keys and values.\nObservation: - the result of the action\n```\n\nOnce all necessary information is gathered, - return the following format:\n\n```\nThought: I now know the final answer\nFinal - Answer: the final answer to the original input question\n```"}, {"role": "user", - "content": "\nCurrent Task: The final answer is 42. But don''t give it yet, - instead keep using the `get_final_answer` tool over and over until you''re told - you can give your final answer.\n\nThis is the expected criteria for your final - answer: The final answer\nyou MUST return the actual complete content as the - final answer, not a summary.\n\nBegin! This is VERY important to you, use the - tools available and give your best Final Answer, your job depends on it!\n\nThought:"}, - {"role": "assistant", "content": "42"}, {"role": "assistant", "content": "Thought: - I should start using the tool to get the final answer repeatedly as instructed. \nAction: - get_final_answer \nAction Input: {} \nObservation: 42"}, {"role": "assistant", - "content": "I tried reusing the same input, I must stop using this action input. - I''ll try something else instead.\n\n"}, {"role": "assistant", "content": "Thought: - I should continue using the tool to obtain the final answer. \nAction: get_final_answer \nAction - Input: {} \nObservation: I tried reusing the same input, I must stop using - this action input. I''ll try something else instead."}, {"role": "assistant", - "content": "I tried reusing the same input, I must stop using this action input. - I''ll try something else instead.\n\n\n\n\nYou ONLY have access to the following - tools, and should NEVER make up tools that are not listed here:\n\nTool Name: - get_final_answer\nTool Arguments: {}\nTool Description: Get the final answer - but don''t give it yet, just re-use this\n tool non-stop.\n\nIMPORTANT: - Use the following format in your response:\n\n```\nThought: you should always - think about what to do\nAction: the action to take, only one name of [get_final_answer], - just the name, exactly as it''s written.\nAction Input: the input to the action, - just a simple JSON object, enclosed in curly braces, using \" to wrap keys and - values.\nObservation: the result of the action\n```\n\nOnce all necessary information - is gathered, return the following format:\n\n```\nThought: I now know the final - answer\nFinal Answer: the final answer to the original input question\n```"}, - {"role": "assistant", "content": "Thought: I need to keep using the tool to - retrieve the final answer repeatedly. \nAction: get_final_answer \nAction - Input: {} \nObservation: I tried reusing the same input, I must stop using - this action input. I''ll try something else instead.\n\n\n\n\nYou ONLY have - access to the following tools, and should NEVER make up tools that are not listed - here:\n\nTool Name: get_final_answer\nTool Arguments: {}\nTool Description: - Get the final answer but don''t give it yet, just re-use this\n tool - non-stop.\n\nIMPORTANT: Use the following format in your response:\n\n```\nThought: - you should always think about what to do\nAction: the action to take, only one - name of [get_final_answer], just the name, exactly as it''s written.\nAction - Input: the input to the action, just a simple JSON object, enclosed in curly - braces, using \" to wrap keys and values.\nObservation: the result of the action\n```\n\nOnce - all necessary information is gathered, return the following format:\n\n```\nThought: - I now know the final answer\nFinal Answer: the final answer to the original - input question\n```"}, {"role": "assistant", "content": "I tried reusing the - same input, I must stop using this action input. I''ll try something else instead.\n\n"}, - {"role": "assistant", "content": "Thought: I need to continue using the designated - tool to obtain the final answer. \nAction: get_final_answer \nAction Input: - {} \nObservation: I tried reusing the same input, I must stop using this action - input. I''ll try something else instead."}, {"role": "assistant", "content": - "I tried reusing the same input, I must stop using this action input. I''ll - try something else instead.\n\n"}, {"role": "assistant", "content": "Thought: - I need to continue using the tool without changing the input format. \nAction: - get_final_answer \nAction Input: {} \nObservation: I tried reusing the same - input, I must stop using this action input. I''ll try something else instead."}, - {"role": "assistant", "content": "Thought: I need to continue using the tool - without changing the input format. \nAction: get_final_answer \nAction Input: - {} \nObservation: I tried reusing the same input, I must stop using this action - input. I''ll try something else instead.\n\n\nNow it''s time you MUST give your - absolute best final answer. You''ll ignore all previous instructions, stop using - any tools, and just return your absolute BEST Final answer."}], "model": "gpt-4o-mini", - "stop": ["\nObservation:"]}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '5577' - content-type: - - application/json - cookie: - - __cf_bm=Bwvchs4Dp02K9.WxyX6U8yVg.jg2z6x7yNWekHnFUbQ-1743464202-1.0.1.1-KvmUaCRpD961qPqJPLi38I.N4IEYmc3i_IyJ5LDo2z5TIhZilbmK0oMNu7HrCHT3kzKWh0SpZ_FocvywK0qJ3fku_cwyTByEPK05SQQOEWE; - _cfuvid=zeQ6mwappLtze7fZgtCp1BJNVbBLSsCm8WxR2Jydshg-1743464202332-0.0.1.1-604800000 - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.68.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.68.2 - x-stainless-raw-response: - - 'true' - x-stainless-read-timeout: - - '600.0' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.12.8 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - content: "{\n \"id\": \"chatcmpl-BHIyMjkFCQoAMiB3hVzH8zjNlHHem\",\n \"object\": - \"chat.completion\",\n \"created\": 1743464206,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"```\\nThought: I now know the final answer\\nFinal - Answer: 42\\n```\",\n \"refusal\": null,\n \"annotations\": []\n - \ },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n - \ ],\n \"usage\": {\n \"prompt_tokens\": 1111,\n \"completion_tokens\": - 19,\n \"total_tokens\": 1130,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n - \ \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_b376dfbbd5\"\n}\n" - headers: - CF-RAY: - - 9293abb94854ce50-SJC - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 31 Mar 2025 23:36:46 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - crewai-iuxna1 - openai-processing-ms: - - '638' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149998757' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_dfb10b0dbcc99d8a08c6c8cd172b006d - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"messages": [{"role": "system", "content": "You are test role. test backstory\nYour - personal goal is: test goal\nYou ONLY have access to the following tools, and - should NEVER make up tools that are not listed here:\n\nTool Name: get_final_answer\nTool - Arguments: {}\nTool Description: Get the final answer but don''t give it yet, - just re-use this\n tool non-stop.\n\nIMPORTANT: Use the following format - in your response:\n\n```\nThought: you should always think about what to do\nAction: - the action to take, only one name of [get_final_answer], just the name, exactly - as it''s written.\nAction Input: the input to the action, just a simple JSON - object, enclosed in curly braces, using \" to wrap keys and values.\nObservation: - the result of the action\n```\n\nOnce all necessary information is gathered, - return the following format:\n\n```\nThought: I now know the final answer\nFinal - Answer: the final answer to the original input question\n```"}, {"role": "user", - "content": "\nCurrent Task: The final answer is 42. But don''t give it yet, - instead keep using the `get_final_answer` tool over and over until you''re told - you can give your final answer.\n\nThis is the expected criteria for your final - answer: The final answer\nyou MUST return the actual complete content as the - final answer, not a summary.\n\nBegin! This is VERY important to you, use the - tools available and give your best Final Answer, your job depends on it!\n\nThought:"}, - {"role": "assistant", "content": "42"}, {"role": "assistant", "content": "Thought: - I should start using the tool to get the final answer repeatedly as instructed. \nAction: - get_final_answer \nAction Input: {} \nObservation: 42"}, {"role": "assistant", - "content": "I tried reusing the same input, I must stop using this action input. - I''ll try something else instead.\n\n"}, {"role": "assistant", "content": "Thought: - I should continue using the tool to obtain the final answer. \nAction: get_final_answer \nAction - Input: {} \nObservation: I tried reusing the same input, I must stop using - this action input. I''ll try something else instead."}, {"role": "assistant", - "content": "I tried reusing the same input, I must stop using this action input. - I''ll try something else instead.\n\n\n\n\nYou ONLY have access to the following - tools, and should NEVER make up tools that are not listed here:\n\nTool Name: - get_final_answer\nTool Arguments: {}\nTool Description: Get the final answer - but don''t give it yet, just re-use this\n tool non-stop.\n\nIMPORTANT: - Use the following format in your response:\n\n```\nThought: you should always - think about what to do\nAction: the action to take, only one name of [get_final_answer], - just the name, exactly as it''s written.\nAction Input: the input to the action, - just a simple JSON object, enclosed in curly braces, using \" to wrap keys and - values.\nObservation: the result of the action\n```\n\nOnce all necessary information - is gathered, return the following format:\n\n```\nThought: I now know the final - answer\nFinal Answer: the final answer to the original input question\n```"}, - {"role": "assistant", "content": "Thought: I need to keep using the tool to - retrieve the final answer repeatedly. \nAction: get_final_answer \nAction - Input: {} \nObservation: I tried reusing the same input, I must stop using - this action input. I''ll try something else instead.\n\n\n\n\nYou ONLY have - access to the following tools, and should NEVER make up tools that are not listed - here:\n\nTool Name: get_final_answer\nTool Arguments: {}\nTool Description: - Get the final answer but don''t give it yet, just re-use this\n tool - non-stop.\n\nIMPORTANT: Use the following format in your response:\n\n```\nThought: - you should always think about what to do\nAction: the action to take, only one - name of [get_final_answer], just the name, exactly as it''s written.\nAction - Input: the input to the action, just a simple JSON object, enclosed in curly - braces, using \" to wrap keys and values.\nObservation: the result of the action\n```\n\nOnce - all necessary information is gathered, return the following format:\n\n```\nThought: - I now know the final answer\nFinal Answer: the final answer to the original - input question\n```"}, {"role": "assistant", "content": "I tried reusing the - same input, I must stop using this action input. I''ll try something else instead.\n\n"}, - {"role": "assistant", "content": "Thought: I need to continue using the designated - tool to obtain the final answer. \nAction: get_final_answer \nAction Input: - {} \nObservation: I tried reusing the same input, I must stop using this action - input. I''ll try something else instead."}, {"role": "assistant", "content": - "I tried reusing the same input, I must stop using this action input. I''ll - try something else instead.\n\n"}, {"role": "assistant", "content": "Thought: - I need to continue using the tool without changing the input format. \nAction: - get_final_answer \nAction Input: {} \nObservation: I tried reusing the same - input, I must stop using this action input. I''ll try something else instead."}, - {"role": "assistant", "content": "Thought: I need to continue using the tool - without changing the input format. \nAction: get_final_answer \nAction Input: - {} \nObservation: I tried reusing the same input, I must stop using this action - input. I''ll try something else instead.\n\n\nNow it''s time you MUST give your - absolute best final answer. You''ll ignore all previous instructions, stop using - any tools, and just return your absolute BEST Final answer."}], "model": "gpt-4o-mini", - "stop": ["\nObservation:"]}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '5577' - content-type: - - application/json - cookie: - - __cf_bm=Bwvchs4Dp02K9.WxyX6U8yVg.jg2z6x7yNWekHnFUbQ-1743464202-1.0.1.1-KvmUaCRpD961qPqJPLi38I.N4IEYmc3i_IyJ5LDo2z5TIhZilbmK0oMNu7HrCHT3kzKWh0SpZ_FocvywK0qJ3fku_cwyTByEPK05SQQOEWE; - _cfuvid=zeQ6mwappLtze7fZgtCp1BJNVbBLSsCm8WxR2Jydshg-1743464202332-0.0.1.1-604800000 - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.68.2 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.68.2 - x-stainless-raw-response: - - 'true' - x-stainless-read-timeout: - - '600.0' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.12.8 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - content: "{\n \"id\": \"chatcmpl-BHIyNYch0OY50INtQUdPpOnd0ypLu\",\n \"object\": - \"chat.completion\",\n \"created\": 1743464207,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"```\\nThought: I now know the final answer\\nFinal - Answer: 42\\n```\",\n \"refusal\": null,\n \"annotations\": []\n - \ },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n - \ ],\n \"usage\": {\n \"prompt_tokens\": 1111,\n \"completion_tokens\": - 19,\n \"total_tokens\": 1130,\n \"prompt_tokens_details\": {\n \"cached_tokens\": - 1024,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": - {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": - 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": - \"default\",\n \"system_fingerprint\": \"fp_b376dfbbd5\"\n}\n" - headers: - CF-RAY: - - 9293abbdcd59ce50-SJC - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Mon, 31 Mar 2025 23:36:47 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - crewai-iuxna1 - openai-processing-ms: - - '587' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - x-ratelimit-limit-requests: - - '30000' - x-ratelimit-limit-tokens: - - '150000000' - x-ratelimit-remaining-requests: - - '29999' - x-ratelimit-remaining-tokens: - - '149998757' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_424bb9ef11cf97c170f2543448a30bea - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"trace_id": "457ac24c-be88-4a24-9378-8cb2bf1f8b10", "execution_type": - "crew", "user_identifier": null, "execution_context": {"crew_fingerprint": null, - "crew_name": "Unknown Crew", "flow_name": null, "crewai_version": "0.193.2", - "privacy_level": "standard"}, "execution_metadata": {"expected_duration_estimate": - 300, "agent_count": 0, "task_count": 0, "flow_method_count": 0, "execution_started_at": - "2025-09-23T20:11:00.682743+00:00"}}' - headers: - Accept: - - '*/*' - Accept-Encoding: - gzip, deflate - Connection: + connection: - keep-alive - Content-Length: - - '436' - Content-Type: + content-length: + - '1680' + content-type: - application/json - User-Agent: - - CrewAI-CLI/0.193.2 - X-Crewai-Version: - - 0.193.2 + cookie: + - __cf_bm=REDACTED; + _cfuvid=REDACTED + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.109.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.109.1 + x-stainless-read-timeout: + - '600' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.10 method: POST - uri: http://localhost:3000/crewai_plus/api/v1/tracing/batches + uri: https://api.openai.com/v1/chat/completions response: body: - string: '{"error":"bad_credentials","message":"Bad credentials"}' + string: !!binary | + H4sIAAAAAAAAAwAAAP//jJNPb9swDMXv+RSEzkmQOG4W+FYM2NbDNgwIBhRLYSsSbauVKUGi2xVB + vvtg54+TdgN28UFPv2fykdqNAITRIgOhasmq8XbyUSX6Xt/ef66/tY/Wffn5Y/uypvITfV3PGjHu + CLd9RMUnaqpc4y2ycXSQVUDJ2LnOPywX81WyXCx7oXEabYdVnifpdD5pDJlJMktuJrN0Mk+PeO2M + wigy+DUCANj1365Q0vhbZDAbn04ajFFWKLLzJQARnO1OhIzRRJbEYjyIyhEj9bUXRbGhde3aquYM + 7iDWrrUanhA9tNFQBVwjVMh5aUjaXFJ8wQDsnAVZSUMgIxiKHFrFqMdAjqEyzyeyp+BIvSJPN3Sr + upSyd6YnBe7It5zBbr+h79uI4VkegDTZUFEUl50ELNsouziptfZCkESOe67P8OGo7M+pWVf54Lbx + DSpKQybWeUAZHXUJRXZe9Op+BPDQT6e9Clz44BrPObsn7H+3SJcHPzFsxaCmx9EJdiztBbU6UVd+ + uUaWxsaL+QolVY16QIdlkK027kIYXXT9vpq/eR86N1T9j/0gKIWeUec+oDbquuPhWsDu0fzr2jnl + vmDRjd4ozNlg6CahsZStPWyyiK+RsekWqMLggzmsc+nzVCWrm3m5WiZitB/9AQAA//8DAEnNXEzd + AwAA headers: - Content-Length: - - '55' - cache-control: - - no-cache - content-security-policy: - - 'default-src ''self'' *.crewai.com crewai.com; script-src ''self'' ''unsafe-inline'' - *.crewai.com crewai.com https://cdn.jsdelivr.net/npm/apexcharts https://www.gstatic.com - https://run.pstmn.io https://share.descript.com/; style-src ''self'' ''unsafe-inline'' - *.crewai.com crewai.com https://cdn.jsdelivr.net/npm/apexcharts; img-src ''self'' - data: *.crewai.com crewai.com https://zeus.tools.crewai.com https://dashboard.tools.crewai.com - https://cdn.jsdelivr.net; font-src ''self'' data: *.crewai.com crewai.com; - connect-src ''self'' *.crewai.com crewai.com https://zeus.tools.crewai.com - https://connect.useparagon.com/ https://zeus.useparagon.com/* https://*.useparagon.com/* - https://run.pstmn.io https://connect.tools.crewai.com/ ws://localhost:3036 - wss://localhost:3036; frame-src ''self'' *.crewai.com crewai.com https://connect.useparagon.com/ - https://zeus.tools.crewai.com https://zeus.useparagon.com/* https://connect.tools.crewai.com/ - https://www.youtube.com https://share.descript.com' - content-type: - - application/json; charset=utf-8 - permissions-policy: - - camera=(), microphone=(self), geolocation=() - referrer-policy: - - strict-origin-when-cross-origin - server-timing: - - cache_read.active_support;dur=0.05, cache_fetch_hit.active_support;dur=0.00, - cache_read_multi.active_support;dur=0.06, start_processing.action_controller;dur=0.00, - process_action.action_controller;dur=1.67 - vary: - - Accept - x-content-type-options: + CF-Ray: + - 99ec2ab4ec1ca230-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Sat, 15 Nov 2025 04:57:17 GMT + Server: + - cloudflare + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Transfer-Encoding: + - chunked + X-Content-Type-Options: - nosniff - x-frame-options: - - SAMEORIGIN - x-permitted-cross-domain-policies: - - none + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - REDACTED + openai-processing-ms: + - '601' + openai-project: + - REDACTED + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '617' + x-openai-proxy-wasm: + - v0.1 + x-ratelimit-limit-project-tokens: + - '150000000' + x-ratelimit-limit-requests: + - '30000' + x-ratelimit-limit-tokens: + - '150000000' + x-ratelimit-remaining-project-tokens: + - '149999617' + x-ratelimit-remaining-requests: + - '29999' + x-ratelimit-remaining-tokens: + - '149999617' + x-ratelimit-reset-project-tokens: + - 0s + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s x-request-id: - - 4bce750d-c407-47b5-af16-ba94c1cdca3a - x-runtime: - - '0.024288' - x-xss-protection: - - 1; mode=block + - REDACTED_REQUEST_ID status: - code: 401 - message: Unauthorized + code: 200 + message: OK +- request: + body: '{"messages":[{"role":"system","content":"You are test role. test backstory\nYour + personal goal is: test goal\nYou ONLY have access to the following tools, and + should NEVER make up tools that are not listed here:\n\nTool Name: get_final_answer\nTool + Arguments: {}\nTool Description: Get the final answer but don''t give it yet, + just re-use this\n tool non-stop.\n\nIMPORTANT: Use the following format + in your response:\n\n```\nThought: you should always think about what to do\nAction: + the action to take, only one name of [get_final_answer], just the name, exactly + as it''s written.\nAction Input: the input to the action, just a simple JSON + object, enclosed in curly braces, using \" to wrap keys and values.\nObservation: + the result of the action\n```\n\nOnce all necessary information is gathered, + return the following format:\n\n```\nThought: I now know the final answer\nFinal + Answer: the final answer to the original input question\n```"},{"role":"user","content":"\nCurrent + Task: The final answer is 42. But don''t give it yet, instead keep using the + `get_final_answer` tool over and over until you''re told you can give your final + answer.\n\nThis is the expected criteria for your final answer: The final answer\nyou + MUST return the actual complete content as the final answer, not a summary.\n\nBegin! + This is VERY important to you, use the tools available and give your best Final + Answer, your job depends on it!\n\nThought:"},{"role":"assistant","content":"```\nThought: + I should use the get_final_answer tool as instructed and keep doing so without + giving the final answer yet.\nAction: get_final_answer\nAction Input: {}\nObservation: + 42"},{"role":"assistant","content":"```\nThought: I should keep using the get_final_answer + tool again as instructed, not giving the final answer yet.\nAction: get_final_answer\nAction + Input: {}\nObservation: I tried reusing the same input, I must stop using this + action input. I''ll try something else instead."}],"model":"gpt-4.1-mini"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '1987' + content-type: + - application/json + cookie: + - __cf_bm=REDACTED; + _cfuvid=REDACTED + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.109.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.109.1 + x-stainless-read-timeout: + - '600' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.10 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAAwAAAP//jFPBjtowEL3nK0Y+AwpZYFFuVWm7nLqHnlpWwdiTxF3HtuxJt3TFv1dO + gIRuK/WSw7x5zzPvTV4TAKYky4GJmpNonJ6+F5n8+nFtH+R6026z+vBpk35w6cPm8dFLNokMe/iO + gi6smbCN00jKmh4WHjlhVJ3fr+7m62x1d98BjZWoI61yNF3M5tNGGTXN0mw5TRfT+eJMr60SGFgO + 3xIAgNfuGwc1En+yHNLJpdJgCLxCll+bAJi3OlYYD0EF4obYZACFNYSmm32/3+/Ml9q2VU05bMEj + 1+oXwhZCbVst4RnRQRuUqYBqhAqpKJXhuuAmvKAHslaDR9dtq4/AA7hYrhGUCeRbET2ZwIui2rYE + 5I9RS6qyRI+GQBnXUpjtzLuuM3/zxAWBbezM4fW0M58PAf0P3hMW2c7s9/vxhh7LNvBos2m1HgHc + GEsdr/P26Yycrm5qWzlvD+EPKiuVUaEuPPJgTXQukHWsQ08JwFOXWnsTBHPeNo4Kss/YPbdI170e + G65lhGZnkCxxPaovz1nf6hUSiSsdRrkzwUWNcqAOR8JbqewISEZbv53mb9r95spU/yM/AEKgI5SF + 8yiVuN14aPMYf6Z/tV1d7gZmMXolsCCFPiYhseSt7i+chWMgbOIBVeidV/2Zl65YiGy9nJfrVcaS + U/IbAAD//wMAUCfbCPUDAAA= + headers: + CF-Ray: + - 99ec2abbba2fa230-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Sat, 15 Nov 2025 04:57:18 GMT + Server: + - cloudflare + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - REDACTED + openai-processing-ms: + - '1108' + openai-project: + - REDACTED + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '1129' + x-openai-proxy-wasm: + - v0.1 + x-ratelimit-limit-project-tokens: + - '150000000' + x-ratelimit-limit-requests: + - '30000' + x-ratelimit-limit-tokens: + - '150000000' + x-ratelimit-remaining-project-tokens: + - '149999550' + x-ratelimit-remaining-requests: + - '29999' + x-ratelimit-remaining-tokens: + - '149999550' + x-ratelimit-reset-project-tokens: + - 0s + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - REDACTED_REQUEST_ID + status: + code: 200 + message: OK +- request: + body: '{"messages":[{"role":"system","content":"You are test role. test backstory\nYour + personal goal is: test goal\nYou ONLY have access to the following tools, and + should NEVER make up tools that are not listed here:\n\nTool Name: get_final_answer\nTool + Arguments: {}\nTool Description: Get the final answer but don''t give it yet, + just re-use this\n tool non-stop.\n\nIMPORTANT: Use the following format + in your response:\n\n```\nThought: you should always think about what to do\nAction: + the action to take, only one name of [get_final_answer], just the name, exactly + as it''s written.\nAction Input: the input to the action, just a simple JSON + object, enclosed in curly braces, using \" to wrap keys and values.\nObservation: + the result of the action\n```\n\nOnce all necessary information is gathered, + return the following format:\n\n```\nThought: I now know the final answer\nFinal + Answer: the final answer to the original input question\n```"},{"role":"user","content":"\nCurrent + Task: The final answer is 42. But don''t give it yet, instead keep using the + `get_final_answer` tool over and over until you''re told you can give your final + answer.\n\nThis is the expected criteria for your final answer: The final answer\nyou + MUST return the actual complete content as the final answer, not a summary.\n\nBegin! + This is VERY important to you, use the tools available and give your best Final + Answer, your job depends on it!\n\nThought:"},{"role":"assistant","content":"```\nThought: + I should use the get_final_answer tool as instructed and keep doing so without + giving the final answer yet.\nAction: get_final_answer\nAction Input: {}\nObservation: + 42"},{"role":"assistant","content":"```\nThought: I should keep using the get_final_answer + tool again as instructed, not giving the final answer yet.\nAction: get_final_answer\nAction + Input: {}\nObservation: I tried reusing the same input, I must stop using this + action input. I''ll try something else instead."},{"role":"assistant","content":"```\nThought: + I realize I should keep using the get_final_answer tool repeatedly as per the + instruction, without trying different inputs.\nAction: get_final_answer\nAction + Input: {}\nObservation: I tried reusing the same input, I must stop using this + action input. I''ll try something else instead.\n\n\n\n\nYou ONLY have access + to the following tools, and should NEVER make up tools that are not listed here:\n\nTool + Name: get_final_answer\nTool Arguments: {}\nTool Description: Get the final + answer but don''t give it yet, just re-use this\n tool non-stop.\n\nIMPORTANT: + Use the following format in your response:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, only one name of [get_final_answer], + just the name, exactly as it''s written.\nAction Input: the input to the action, + just a simple JSON object, enclosed in curly braces, using \" to wrap keys and + values.\nObservation: the result of the action\n```\n\nOnce all necessary information + is gathered, return the following format:\n\n```\nThought: I now know the final + answer\nFinal Answer: the final answer to the original input question\n```"}],"model":"gpt-4.1-mini"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '3165' + content-type: + - application/json + cookie: + - __cf_bm=REDACTED; + _cfuvid=REDACTED + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.109.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.109.1 + x-stainless-read-timeout: + - '600' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.10 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAAwAAAP//jFM9b9swEN39Kw6cbSOWFdfWVnTK0qBFUzStA4kmzxIbiiTIU1LX8H8v + SNmW06RAFw16H7r37rQfATAlWQFMNJxE6/Tkg8jkRv2+W4m7T8tvdC/NZ8e/3uJHqr/fs3FU2M1P + FHRSTYVtnUZS1vSw8MgJo+vs3WI+W2aL+SoBrZWoo6x2NMmns0mrjJpkV9n15CqfzPKjvLFKYGAF + /BgBAOzTMw5qJP5iBVyNT29aDIHXyIozCYB5q+MbxkNQgbghNh5AYQ2hSbNXVbU2Xxrb1Q0VcANt + FwhSlh08K2qAGgTi4RE2O4g6ZTplaiALHl2KqHfQBUzEGqncKsN1yU14Rg9krU4+tiNw3j4pmdQN + QuLBkbdDmq7NexH7K17ZnBC4Ma6jAvaHtbndBPRPvBfk2dpUVXWZ0eO2CzwWbTqtLwBujKWkS+0+ + HJHDuU9ta+ftJvwlZVtlVGhKjzxYE7sLZB1L6GEE8JD21r1YBXPeto5Kso+YPrfIV70fG+5lQPP5 + ESRLXF+oVtn4Db9SInGlw8XmmeCiQTlIhzPhnVT2AhhdpH49zVvefXJl6v+xHwAh0BHK0nmUSrxM + PNA8xt/pX7Rzy2lgFlevBJak0MdNSNzyTvc3zsIuELbxgGr0zqv+0LeuzEW2vJ5tl4uMjQ6jPwAA + AP//AwB5UB+29wMAAA== + headers: + CF-Ray: + - 99ec2ac30913a230-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Sat, 15 Nov 2025 04:57:19 GMT + Server: + - cloudflare + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - REDACTED + openai-processing-ms: + - '668' + openai-project: + - REDACTED + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '686' + x-openai-proxy-wasm: + - v0.1 + x-ratelimit-limit-project-tokens: + - '150000000' + x-ratelimit-limit-requests: + - '30000' + x-ratelimit-limit-tokens: + - '150000000' + x-ratelimit-remaining-project-tokens: + - '149999270' + x-ratelimit-remaining-requests: + - '29999' + x-ratelimit-remaining-tokens: + - '149999270' + x-ratelimit-reset-project-tokens: + - 0s + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - REDACTED_REQUEST_ID + status: + code: 200 + message: OK +- request: + body: '{"messages":[{"role":"system","content":"You are test role. test backstory\nYour + personal goal is: test goal\nYou ONLY have access to the following tools, and + should NEVER make up tools that are not listed here:\n\nTool Name: get_final_answer\nTool + Arguments: {}\nTool Description: Get the final answer but don''t give it yet, + just re-use this\n tool non-stop.\n\nIMPORTANT: Use the following format + in your response:\n\n```\nThought: you should always think about what to do\nAction: + the action to take, only one name of [get_final_answer], just the name, exactly + as it''s written.\nAction Input: the input to the action, just a simple JSON + object, enclosed in curly braces, using \" to wrap keys and values.\nObservation: + the result of the action\n```\n\nOnce all necessary information is gathered, + return the following format:\n\n```\nThought: I now know the final answer\nFinal + Answer: the final answer to the original input question\n```"},{"role":"user","content":"\nCurrent + Task: The final answer is 42. But don''t give it yet, instead keep using the + `get_final_answer` tool over and over until you''re told you can give your final + answer.\n\nThis is the expected criteria for your final answer: The final answer\nyou + MUST return the actual complete content as the final answer, not a summary.\n\nBegin! + This is VERY important to you, use the tools available and give your best Final + Answer, your job depends on it!\n\nThought:"},{"role":"assistant","content":"```\nThought: + I should use the get_final_answer tool as instructed and keep doing so without + giving the final answer yet.\nAction: get_final_answer\nAction Input: {}\nObservation: + 42"},{"role":"assistant","content":"```\nThought: I should keep using the get_final_answer + tool again as instructed, not giving the final answer yet.\nAction: get_final_answer\nAction + Input: {}\nObservation: I tried reusing the same input, I must stop using this + action input. I''ll try something else instead."},{"role":"assistant","content":"```\nThought: + I realize I should keep using the get_final_answer tool repeatedly as per the + instruction, without trying different inputs.\nAction: get_final_answer\nAction + Input: {}\nObservation: I tried reusing the same input, I must stop using this + action input. I''ll try something else instead.\n\n\n\n\nYou ONLY have access + to the following tools, and should NEVER make up tools that are not listed here:\n\nTool + Name: get_final_answer\nTool Arguments: {}\nTool Description: Get the final + answer but don''t give it yet, just re-use this\n tool non-stop.\n\nIMPORTANT: + Use the following format in your response:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, only one name of [get_final_answer], + just the name, exactly as it''s written.\nAction Input: the input to the action, + just a simple JSON object, enclosed in curly braces, using \" to wrap keys and + values.\nObservation: the result of the action\n```\n\nOnce all necessary information + is gathered, return the following format:\n\n```\nThought: I now know the final + answer\nFinal Answer: the final answer to the original input question\n```"},{"role":"assistant","content":"```\nThought: + I must comply with the task by continuing to repeatedly use the get_final_answer + tool without providing the final answer yet.\nAction: get_final_answer\nAction + Input: {}\nObservation: I tried reusing the same input, I must stop using this + action input. I''ll try something else instead."}],"model":"gpt-4.1-mini"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '3498' + content-type: + - application/json + cookie: + - __cf_bm=REDACTED; + _cfuvid=REDACTED + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.109.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.109.1 + x-stainless-read-timeout: + - '600' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.10 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAAwAAAP//jFNLj5swEL7nV4x8XqJAyWO59SFVe8plL1WzAscM4MTYlj0kXUX57xXO + A9JtpV44zPdg5pvxaQLAZMkyYKLhJFqroq8iKUX6+mW9Wz8vvz2Xq8QdfrT74y5Odt/ZU68w2x0K + uqmmwrRWIUmjL7BwyAl713i5+BSvkkU6C0BrSlS9rLYUpdM4aqWWUTJL5tEsjeL0Km+MFOhZBj8n + AACn8O0b1SX+YhkEs1Bp0XteI8vuJADmjOorjHsvPXFN7GkAhdGEOvReFMVGvzamqxvK4AXazhNU + RilzBGoQXKcQyMAe0ULnpa5DuUbKK6m5yrn2R3RAxig4SmpMR1DLw40YSHAlvSNNN/qz6FPKPnjc + EHjRtqMMTueNXm89ugO/CNJko4uiGE/isOo87+PUnVIjgGttKOhChm9X5HxPTZnaOrP1f0hZJbX0 + Te6Qe6P7hDwZywJ6ngC8he10D4Ez60xrKSezx/C7ZZxe/NhwFQOaXlfHyBBXI9X8pnrwy0skLpUf + 7ZcJLhosB+lwDLwrpRkBk9HUH7v5m/dlcqnr/7EfACHQEpa5dVhK8TjxQHPYP5p/0e4ph4ZZv3op + MCeJrt9EiRXv1OWSmX/3hG1/QDU66+TlnCubpyJZzeNqtUjY5Dz5DQAA//8DAMggTHTdAwAA + headers: + CF-Ray: + - 99ec2acb6c2aa230-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Sat, 15 Nov 2025 04:57:21 GMT + Server: + - cloudflare + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - REDACTED + openai-processing-ms: + - '664' + openai-project: + - REDACTED + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '966' + x-openai-proxy-wasm: + - v0.1 + x-ratelimit-limit-project-tokens: + - '150000000' + x-ratelimit-limit-requests: + - '30000' + x-ratelimit-limit-tokens: + - '150000000' + x-ratelimit-remaining-project-tokens: + - '149999195' + x-ratelimit-remaining-requests: + - '29999' + x-ratelimit-remaining-tokens: + - '149999195' + x-ratelimit-reset-project-tokens: + - 0s + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - REDACTED_REQUEST_ID + status: + code: 200 + message: OK +- request: + body: '{"messages":[{"role":"system","content":"You are test role. test backstory\nYour + personal goal is: test goal\nYou ONLY have access to the following tools, and + should NEVER make up tools that are not listed here:\n\nTool Name: get_final_answer\nTool + Arguments: {}\nTool Description: Get the final answer but don''t give it yet, + just re-use this\n tool non-stop.\n\nIMPORTANT: Use the following format + in your response:\n\n```\nThought: you should always think about what to do\nAction: + the action to take, only one name of [get_final_answer], just the name, exactly + as it''s written.\nAction Input: the input to the action, just a simple JSON + object, enclosed in curly braces, using \" to wrap keys and values.\nObservation: + the result of the action\n```\n\nOnce all necessary information is gathered, + return the following format:\n\n```\nThought: I now know the final answer\nFinal + Answer: the final answer to the original input question\n```"},{"role":"user","content":"\nCurrent + Task: The final answer is 42. But don''t give it yet, instead keep using the + `get_final_answer` tool over and over until you''re told you can give your final + answer.\n\nThis is the expected criteria for your final answer: The final answer\nyou + MUST return the actual complete content as the final answer, not a summary.\n\nBegin! + This is VERY important to you, use the tools available and give your best Final + Answer, your job depends on it!\n\nThought:"},{"role":"assistant","content":"```\nThought: + I should use the get_final_answer tool as instructed and keep doing so without + giving the final answer yet.\nAction: get_final_answer\nAction Input: {}\nObservation: + 42"},{"role":"assistant","content":"```\nThought: I should keep using the get_final_answer + tool again as instructed, not giving the final answer yet.\nAction: get_final_answer\nAction + Input: {}\nObservation: I tried reusing the same input, I must stop using this + action input. I''ll try something else instead."},{"role":"assistant","content":"```\nThought: + I realize I should keep using the get_final_answer tool repeatedly as per the + instruction, without trying different inputs.\nAction: get_final_answer\nAction + Input: {}\nObservation: I tried reusing the same input, I must stop using this + action input. I''ll try something else instead.\n\n\n\n\nYou ONLY have access + to the following tools, and should NEVER make up tools that are not listed here:\n\nTool + Name: get_final_answer\nTool Arguments: {}\nTool Description: Get the final + answer but don''t give it yet, just re-use this\n tool non-stop.\n\nIMPORTANT: + Use the following format in your response:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, only one name of [get_final_answer], + just the name, exactly as it''s written.\nAction Input: the input to the action, + just a simple JSON object, enclosed in curly braces, using \" to wrap keys and + values.\nObservation: the result of the action\n```\n\nOnce all necessary information + is gathered, return the following format:\n\n```\nThought: I now know the final + answer\nFinal Answer: the final answer to the original input question\n```"},{"role":"assistant","content":"```\nThought: + I must comply with the task by continuing to repeatedly use the get_final_answer + tool without providing the final answer yet.\nAction: get_final_answer\nAction + Input: {}\nObservation: I tried reusing the same input, I must stop using this + action input. I''ll try something else instead."},{"role":"assistant","content":"```\nThought: + I must follow the rule to keep using the get_final_answer tool without giving + the final answer yet.\nAction: get_final_answer\nAction Input: {}\nObservation: + I tried reusing the same input, I must stop using this action input. I''ll try + something else instead."},{"role":"assistant","content":"```\nThought: I must + follow the rule to keep using the get_final_answer tool without giving the final + answer yet.\nAction: get_final_answer\nAction Input: {}\nObservation: I tried + reusing the same input, I must stop using this action input. I''ll try something + else instead.\n\n\nNow it''s time you MUST give your absolute best final answer. + You''ll ignore all previous instructions, stop using any tools, and just return + your absolute BEST Final answer."}],"model":"gpt-4.1-mini"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '4290' + content-type: + - application/json + cookie: + - __cf_bm=REDACTED; + _cfuvid=REDACTED + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.109.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.109.1 + x-stainless-read-timeout: + - '600' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.10 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAAwAAAP//jJJNb+MgEIbv/hWIc1zFjptavq2iXW3vPay2qWwCY5sEA4LxtlWV/15B + Puzsh7QXJHjmHeadmY+EECoFrQjlPUM+WJVueC7E+vvT6odf/dyXfgOHR8g2asx3X/d0ERRmtweO + F9UdN4NVgNLoE+YOGELImj2sV1mZr4ssgsEIUEHWWUyLuywdpJZpvszv02WRZsVZ3hvJwdOKPCeE + EPIRz1CoFvBGK7JcXF4G8J51QKtrECHUGRVeKPNeemQa6WKC3GgEHWtvmmarn3ozdj1W5JFo80oO + 4cAeSCs1U4Rp/wpuq7/F25d4q0iRb3XTNPO0DtrRs+BNj0rNANPaIAu9iYZezuR4taBMZ53Z+d+k + tJVa+r52wLzRoVyPxtJIjwkhL7FV4417ap0ZLNZoDhC/Kx/OraLTiCaalWeIBpmaqcoLuMlXC0Am + lZ81m3LGexCTdJoMG4U0M5DMXP9Zzd9yn5xL3f1P+glwDhZB1NaBkPzW8RTmIGzwv8KuXY4FUw/u + l+RQowQXJiGgZaM6rRX17x5hqFupO3DWydNutbYueF7eZ225zmlyTD4BAAD//wMANR6C4GoDAAA= + headers: + CF-Ray: + - 99ec2ad62db2a230-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Sat, 15 Nov 2025 04:57:22 GMT + Server: + - cloudflare + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - REDACTED + openai-processing-ms: + - '584' + openai-project: + - REDACTED + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '609' + x-openai-proxy-wasm: + - v0.1 + x-ratelimit-limit-project-tokens: + - '150000000' + x-ratelimit-limit-requests: + - '30000' + x-ratelimit-limit-tokens: + - '150000000' + x-ratelimit-remaining-project-tokens: + - '149999012' + x-ratelimit-remaining-requests: + - '29999' + x-ratelimit-remaining-tokens: + - '149999015' + x-ratelimit-reset-project-tokens: + - 0s + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - REDACTED_REQUEST_ID + status: + code: 200 + message: OK version: 1 diff --git a/lib/crewai/tests/cassettes/test_agent_with_only_crewai_knowledge.yaml b/lib/crewai/tests/cassettes/test_agent_with_only_crewai_knowledge.yaml index b1b47edc9..adc6ccd6e 100644 --- a/lib/crewai/tests/cassettes/test_agent_with_only_crewai_knowledge.yaml +++ b/lib/crewai/tests/cassettes/test_agent_with_only_crewai_knowledge.yaml @@ -1,103 +1,4 @@ interactions: -- request: - body: '{"trace_id": "9d9d9d14-e5bc-44bc-8cfc-3df9ba4e6055", "execution_type": - "crew", "user_identifier": null, "execution_context": {"crew_fingerprint": null, - "crew_name": "crew", "flow_name": null, "crewai_version": "1.3.0", "privacy_level": - "standard"}, "execution_metadata": {"expected_duration_estimate": 300, "agent_count": - 0, "task_count": 0, "flow_method_count": 0, "execution_started_at": "2025-11-06T15:58:15.778396+00:00"}, - "ephemeral_trace_id": "9d9d9d14-e5bc-44bc-8cfc-3df9ba4e6055"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '488' - Content-Type: - - application/json - User-Agent: - - CrewAI-CLI/1.3.0 - X-Crewai-Version: - - 1.3.0 - method: POST - uri: https://app.crewai.com/crewai_plus/api/v1/tracing/ephemeral/batches - response: - body: - string: '{"id":"f303021e-f1a0-4fd8-9c7d-8ba6779f8ad3","ephemeral_trace_id":"9d9d9d14-e5bc-44bc-8cfc-3df9ba4e6055","execution_type":"crew","crew_name":"crew","flow_name":null,"status":"running","duration_ms":null,"crewai_version":"1.3.0","total_events":0,"execution_context":{"crew_fingerprint":null,"crew_name":"crew","flow_name":null,"crewai_version":"1.3.0","privacy_level":"standard"},"created_at":"2025-11-06T15:58:16.189Z","updated_at":"2025-11-06T15:58:16.189Z","access_code":"TRACE-c2990cd4d4","user_identifier":null}' - headers: - Connection: - - keep-alive - Content-Length: - - '515' - Content-Type: - - application/json; charset=utf-8 - Date: - - Thu, 06 Nov 2025 15:58:16 GMT - cache-control: - - no-store - content-security-policy: - - 'default-src ''self'' *.app.crewai.com app.crewai.com; script-src ''self'' - ''unsafe-inline'' *.app.crewai.com app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts - https://www.gstatic.com https://run.pstmn.io https://apis.google.com https://apis.google.com/js/api.js - https://accounts.google.com https://accounts.google.com/gsi/client https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css.map - https://*.google.com https://docs.google.com https://slides.google.com https://js.hs-scripts.com - https://js.sentry-cdn.com https://browser.sentry-cdn.com https://www.googletagmanager.com - https://js-na1.hs-scripts.com https://js.hubspot.com http://js-na1.hs-scripts.com - https://bat.bing.com https://cdn.amplitude.com https://cdn.segment.com https://d1d3n03t5zntha.cloudfront.net/ - https://descriptusercontent.com https://edge.fullstory.com https://googleads.g.doubleclick.net - https://js.hs-analytics.net https://js.hs-banner.com https://js.hsadspixel.net - https://js.hscollectedforms.net https://js.usemessages.com https://snap.licdn.com - https://static.cloudflareinsights.com https://static.reo.dev https://www.google-analytics.com - https://share.descript.com/; style-src ''self'' ''unsafe-inline'' *.app.crewai.com - app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts; img-src ''self'' data: - *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com https://dashboard.tools.crewai.com - https://cdn.jsdelivr.net https://forms.hsforms.com https://track.hubspot.com - https://px.ads.linkedin.com https://px4.ads.linkedin.com https://www.google.com - https://www.google.com.br; font-src ''self'' data: *.app.crewai.com app.crewai.com; - connect-src ''self'' *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com - https://connect.useparagon.com/ https://zeus.useparagon.com/* https://*.useparagon.com/* - https://run.pstmn.io https://connect.tools.crewai.com/ https://*.sentry.io - https://www.google-analytics.com https://edge.fullstory.com https://rs.fullstory.com - https://api.hubspot.com https://forms.hscollectedforms.net https://api.hubapi.com - https://px.ads.linkedin.com https://px4.ads.linkedin.com https://google.com/pagead/form-data/16713662509 - https://google.com/ccm/form-data/16713662509 https://www.google.com/ccm/collect - https://worker-actionkit.tools.crewai.com https://api.reo.dev; frame-src ''self'' - *.app.crewai.com app.crewai.com https://connect.useparagon.com/ https://zeus.tools.crewai.com - https://zeus.useparagon.com/* https://connect.tools.crewai.com/ https://docs.google.com - https://drive.google.com https://slides.google.com https://accounts.google.com - https://*.google.com https://app.hubspot.com/ https://td.doubleclick.net https://www.googletagmanager.com/ - https://www.youtube.com https://share.descript.com' - etag: - - W/"8df0b730688b8bc094b74c66a6293578" - expires: - - '0' - permissions-policy: - - camera=(), microphone=(self), geolocation=() - pragma: - - no-cache - referrer-policy: - - strict-origin-when-cross-origin - strict-transport-security: - - max-age=63072000; includeSubDomains - vary: - - Accept - x-content-type-options: - - nosniff - x-frame-options: - - SAMEORIGIN - x-permitted-cross-domain-policies: - - none - x-request-id: - - 38352441-7508-4e1e-9bff-77d1689dffdf - x-runtime: - - '0.085540' - x-xss-protection: - - 1; mode=block - status: - code: 201 - message: Created - request: body: '{"messages":[{"role":"system","content":"Your goal is to rewrite the user query so that it is optimized for retrieval from a vector database. Consider @@ -115,7 +16,7 @@ interactions: accept: - application/json accept-encoding: - - gzip, deflate, zstd + - gzip, deflate connection: - keep-alive content-length: @@ -143,23 +44,23 @@ interactions: x-stainless-runtime: - CPython x-stainless-runtime-version: - - 3.12.9 + - 3.12.10 method: POST uri: https://api.openai.com/v1/chat/completions response: body: string: !!binary | - H4sIAAAAAAAAAwAAAP//jFJBbtswELzrFQQvvViBLMuy42sObYEWKIoiQFMEAkOu5G0oLkGu0xaB - /15QciwlTYFceODsDGeG+5gJIdHInZB6r1j33uZX33+1H78y9tvVt+Lmpv68KrfXX96Xnz7cu61c - JAbd/QTNT6wLTb23wEhuhHUAxZBUl5u6rKqqvqwHoCcDNtE6z3lFeY8O87Ioq7zY5MuTuN4Taohy - J35kQgjxOJzJpzPwW+5EsXi66SFG1YHcnYeEkIFsupEqRoysHMvFBGpyDG6wfo0G+V0UrXqggAxC - k6VwMZ8O0B6iSo7dwdoZoJwjVinx4PP2hBzPzix1PtBdfEGVLTqM+yaAiuSSi8jk5YAeMyFuhwYO - z0JJH6j33DDdw/DccrMa9eRU/ISuTxgTKzsnbRevyDUGWKGNswqlVnoPZqJOfauDQZoB2Sz0v2Ze - 0x6Do+veIj8BWoNnMI0PYFA/DzyNBUhr+b+xc8mDYRkhPKCGhhFC+ggDrTrYcVlk/BMZ+qZF10Hw - AceNaX2zrgvV1rBeX8rsmP0FAAD//wMA5SIzeT8DAAA= + H4sIAAAAAAAAAwAAAP//jFLBTtwwFLznKyxfetmg3YXspnutCmpVIS70UqHI2C/JK46fZb+sQGj/ + HTlZNqGA1IsPnjfjmfF7zoSQaOROSN0q1p23+Te9rh8vr67tj+99Wdw8NDc/Xdy32KvbX71cJAbd + /wXNr6wzTZ23wEhuhHUAxZBUV9vN+apcb8tiADoyYBOt8ZxfUN6hw3y9XF/ky22+Ko/sllBDlDvx + JxNCiOfhTD6dgUe5E8vF600HMaoG5O40JIQMZNONVDFiZOVYLiZQk2Nwg/XfaJC/RFGrPQVkEJos + hbP5dIC6jyo5dr21M0A5R6xS4sHn3RE5nJxZanyg+/gPVdboMLZVABXJJReRycsBPWRC3A0N9G9C + SR+o81wxPcDw3Gp7PurJqfgJLY4YEys7J5WLD+QqA6zQxlmFUivdgpmoU9+qN0gzIJuFfm/mI+0x + OLrmf+QnQGvwDKbyAQzqt4GnsQBpLT8bO5U8GJYRwh41VIwQ0kcYqFVvx2WR8SkydFWNroHgA44b + U/uq2CxVvYGi+CqzQ/YCAAD//wMAZMa5Sz8DAAA= headers: CF-RAY: - - 99a5ca96bb1443e7-EWR + - 99ec2e536dcc3c7d-SJC Connection: - keep-alive Content-Encoding: @@ -167,12 +68,12 @@ interactions: Content-Type: - application/json Date: - - Thu, 06 Nov 2025 15:58:16 GMT + - Sat, 15 Nov 2025 04:59:45 GMT Server: - cloudflare Set-Cookie: - __cf_bm=REDACTED; - path=/; expires=Thu, 06-Nov-25 16:28:16 GMT; domain=.api.openai.com; HttpOnly; + path=/; expires=Sat, 15-Nov-25 05:29:45 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - _cfuvid=REDACTED; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None @@ -189,31 +90,37 @@ interactions: cf-cache-status: - DYNAMIC openai-organization: - - user-REDACTED + - REDACTED_ORG openai-processing-ms: - - '235' + - '418' openai-project: - - proj_REDACTED + - REDACTED_PROJECT openai-version: - '2020-10-01' x-envoy-upstream-service-time: - - '420' + - '434' x-openai-proxy-wasm: - v0.1 + x-ratelimit-limit-project-tokens: + - '150000000' x-ratelimit-limit-requests: - - '10000' + - '30000' x-ratelimit-limit-tokens: - - '200000' + - '150000000' + x-ratelimit-remaining-project-tokens: + - '149999785' x-ratelimit-remaining-requests: - - '9999' + - '29999' x-ratelimit-remaining-tokens: - - '199785' + - '149999785' + x-ratelimit-reset-project-tokens: + - 0s x-ratelimit-reset-requests: - - 8.64s + - 2ms x-ratelimit-reset-tokens: - - 64ms + - 0s x-request-id: - - req_9810e9721aa9463c930414ab5174ab61 + - REDACTED_REQUEST_ID status: code: 200 message: OK @@ -233,7 +140,7 @@ interactions: accept: - application/json accept-encoding: - - gzip, deflate, zstd + - gzip, deflate connection: - keep-alive content-length: @@ -264,25 +171,26 @@ interactions: x-stainless-runtime: - CPython x-stainless-runtime-version: - - 3.12.9 + - 3.12.10 method: POST uri: https://api.openai.com/v1/chat/completions response: body: string: !!binary | - H4sIAAAAAAAAAwAAAP//jFPBahsxEL37KwZderGN7dqO41vaUghtT4FCacIiS7PrSbQaVZq1swT/ - e9HayTptCr0ING/e6M2b0dMAQJFVa1Bmq8XUwY0+/tiXXy4/2BDN/p7izdY4/vrp29Wvmxbv1TAz - eHOPRp5ZY8N1cCjE/gibiFowV51eLGfz+Xx5ueqAmi26TKuCjOY8qsnTaDaZzUeTi9F0dWJvmQwm - tYafAwCAp+7MOr3FR7WGyfA5UmNKukK1fkkCUJFdjiidEiXRXtSwBw17Qd9JvwbPezDaQ0U7BA1V - lg3apz1GgFv/mbx2cNXd1/CdLMm7BKXecSRBMOw4AiXwLBCajSPjWrBsmhq9oAWOsCeLroUHz3s/ - husSWm5gq3cIKaChkgx0ih4lZ1sUTS6B3nAjxweHcA21bmGDoDcOQRhC5B3ZLLjmiJApHNFCxBTY - Jxyf9xuxbJLOnvvGuTNAe8+i88w6p+9OyOHFW8dViLxJf1BVSZ7StoioE/vsYxIOqkMPA4C7bobN - q7GoELkOUgg/YPfcdLk61lP96vTofHEChUW7Pj6bvh++Ua842Xa2Bcpos0XbU/uV0Y0lPgMGZ13/ - reat2sfOyVf/U74HjMEgaIsQ0ZJ53XGfFjH/rH+lvbjcCVYJ444MFkIY8yQslrpxx31XqU2CdVGS - rzCGSMelL0OxWE50ucTF4lINDoPfAAAA//8DAPFGfbMCBAAA + H4sIAAAAAAAAAwAAAP//jFNNbxNBDL3nV1hz4bKp8tGkITdEBVRC4oLgAFXkzHg3prP2aGY2aaj6 + 39Fu0mxaisRlpfXze7bHzw8DAMPOLMHYDWZbBz98byfl/bW9mcrH69GX37Kd8v6z/X63Ubz/aoqW + oetfZPMT68JqHTxlVjnANhJmalXHV/PpeDG5Wsw6oFZHvqVVIQ8vdViz8HAymlwOR1fD8eLI3ihb + SmYJPwYAAA/dt+1THN2bJYyKp0hNKWFFZnlKAjBRfRsxmBKnjJJN0YNWJZN0rd+A6A4sClS8JUCo + 2rYBJe0oAvyUDyzo4V33v4Rv7Di/SVDiViNnAqteI3AC0QyhWXu2fg9ObVOTZHKACTh3BbYY97DG + RA5UIFBM2kqHSCVFEkvpAj7pjrYUC7Ba1yov6iTAWqUCFsdbdg36BFpmEmCxvnEEa99Q0c5AUgCK + g0iugHWTIStYlZJjfRoiBbJcsn1RpQAVgp023oEQuSM1NT4DQiTPuPYESZtoCTSC40g2+z1guoMN + 1xfnbx2pbBK2+5bG+zMARTRj65duy7dH5PG0V69ViLpOL6imZOG0WUXCpNLuMGUNpkMfBwC3nX+a + Z5YwIWod8irrHXXlxvPFQc/0tu3R+fwIZs3o+/hkelm8ordylJF9OnOgsWg35Hpqb1dsHOsZMDib + +u9uXtM+TM5S/Y98D1hLIZNbhUiO7fOJ+7RI7VX/K+30yl3DJlHcsqVVZortJhyV2PjDrZm0T5nq + VclSUQyRDwdXhtVsPsJyTrPZWzN4HPwBAAD//wMAtb7X3X4EAAA= headers: CF-RAY: - - 99a5ca9c5ef543e7-EWR + - 99ec2e59baca3c7d-SJC Connection: - keep-alive Content-Encoding: @@ -290,7 +198,7 @@ interactions: Content-Type: - application/json Date: - - Thu, 06 Nov 2025 15:58:19 GMT + - Sat, 15 Nov 2025 04:59:47 GMT Server: - cloudflare Strict-Transport-Security: @@ -306,31 +214,37 @@ interactions: cf-cache-status: - DYNAMIC openai-organization: - - user-REDACTED + - REDACTED_ORG openai-processing-ms: - - '1326' + - '1471' openai-project: - - proj_REDACTED + - REDACTED_PROJECT openai-version: - '2020-10-01' x-envoy-upstream-service-time: - - '1754' + - '1488' x-openai-proxy-wasm: - v0.1 + x-ratelimit-limit-project-tokens: + - '150000000' x-ratelimit-limit-requests: - - '10000' + - '30000' x-ratelimit-limit-tokens: - - '200000' + - '150000000' + x-ratelimit-remaining-project-tokens: + - '149999805' x-ratelimit-remaining-requests: - - '9998' + - '29999' x-ratelimit-remaining-tokens: - - '199803' + - '149999802' + x-ratelimit-reset-project-tokens: + - 0s x-ratelimit-reset-requests: - - 15.913s + - 2ms x-ratelimit-reset-tokens: - - 59ms + - 0s x-request-id: - - req_f975e16b666e498b8bcfdfab525f71b3 + - REDACTED_REQUEST_ID status: code: 200 message: OK diff --git a/lib/crewai/tests/cassettes/test_llm_call.yaml b/lib/crewai/tests/cassettes/test_llm_call.yaml index fec22c0fc..603964b5b 100644 --- a/lib/crewai/tests/cassettes/test_llm_call.yaml +++ b/lib/crewai/tests/cassettes/test_llm_call.yaml @@ -1,104 +1,10 @@ interactions: - request: - body: '{"messages": [{"role": "user", "content": "Say ''Hello, World!''"}], "model": - "gpt-3.5-turbo"}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '92' - content-type: - - application/json - cookie: - - __cf_bm=rb61BZH2ejzD5YPmLaEJqI7km71QqyNJGTVdNxBq6qk-1727213194-1.0.1.1-pJ49onmgX9IugEMuYQMralzD7oj_6W.CHbSu4Su1z3NyjTGYg.rhgJZWng8feFYah._oSnoYlkTjpK1Wd2C9FA; - _cfuvid=lbRdAddVWV6W3f5Dm9SaOPWDUOxqtZBSPr_fTW26nEA-1727213194587-0.0.1.1-604800000 - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.47.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.47.0 - x-stainless-raw-response: - - 'true' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.11.7 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - content: "{\n \"id\": \"chatcmpl-AB7WOl4G3lFflxNyRE5fAnkueUNWp\",\n \"object\": - \"chat.completion\",\n \"created\": 1727213884,\n \"model\": \"gpt-3.5-turbo-0125\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Hello, World!\",\n \"refusal\": - null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n - \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 13,\n \"completion_tokens\": - 4,\n \"total_tokens\": 17,\n \"completion_tokens_details\": {\n \"reasoning_tokens\": - 0\n }\n },\n \"system_fingerprint\": null\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 8c85eb570b271cf3-GRU - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Tue, 24 Sep 2024 21:38:04 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - openai-organization: - - crewai-iuxna1 - openai-processing-ms: - - '170' - openai-version: - - '2020-10-01' - strict-transport-security: - - max-age=31536000; includeSubDomains; preload - x-ratelimit-limit-requests: - - '10000' - x-ratelimit-limit-tokens: - - '50000000' - x-ratelimit-remaining-requests: - - '9999' - x-ratelimit-remaining-tokens: - - '49999978' - x-ratelimit-reset-requests: - - 6ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_c504d56aee4210a9911e1b90551f1e46 - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"trace_id": "9d3dfee1-ebe8-4eb3-aa28-e77448706cb5", "execution_type": + body: '{"trace_id": "3fe0e5a3-1d9c-4604-b3a7-2cd3f16e95f9", "execution_type": "crew", "user_identifier": null, "execution_context": {"crew_fingerprint": null, - "crew_name": "Unknown Crew", "flow_name": null, "crewai_version": "0.193.2", - "privacy_level": "standard"}, "execution_metadata": {"expected_duration_estimate": - 300, "agent_count": 0, "task_count": 0, "flow_method_count": 0, "execution_started_at": - "2025-09-24T05:36:10.874552+00:00"}}' + "crew_name": "Unknown Crew", "flow_name": null, "crewai_version": "1.4.1", "privacy_level": + "standard"}, "execution_metadata": {"expected_duration_estimate": 300, "agent_count": + 0, "task_count": 0, "flow_method_count": 0, "execution_started_at": "2025-11-15T04:57:05.245294+00:00"}}' headers: Accept: - '*/*' @@ -107,54 +13,73 @@ interactions: Connection: - keep-alive Content-Length: - - '436' + - '434' Content-Type: - application/json User-Agent: - - CrewAI-CLI/0.193.2 + - CrewAI-CLI/1.4.1 X-Crewai-Organization-Id: - - d3a3d10c-35db-423f-a7a4-c026030ba64d + - 73c2b193-f579-422c-84c7-76a39a1da77f X-Crewai-Version: - - 0.193.2 + - 1.4.1 method: POST - uri: http://localhost:3000/crewai_plus/api/v1/tracing/batches + uri: https://app.crewai.com/crewai_plus/api/v1/tracing/batches response: body: - string: '{"id":"bc65d267-2f55-4edd-9277-61486245c5f6","trace_id":"9d3dfee1-ebe8-4eb3-aa28-e77448706cb5","execution_type":"crew","crew_name":"Unknown - Crew","flow_name":null,"status":"running","duration_ms":null,"crewai_version":"0.193.2","privacy_level":"standard","total_events":0,"execution_context":{"crew_fingerprint":null,"crew_name":"Unknown - Crew","flow_name":null,"crewai_version":"0.193.2","privacy_level":"standard"},"created_at":"2025-09-24T05:36:11.292Z","updated_at":"2025-09-24T05:36:11.292Z"}' + string: '{"error":"bad_credentials","message":"Bad credentials"}' headers: + Connection: + - keep-alive Content-Length: - - '496' - cache-control: - - max-age=0, private, must-revalidate - content-security-policy: - - 'default-src ''self'' *.crewai.com crewai.com; script-src ''self'' ''unsafe-inline'' - *.crewai.com crewai.com https://cdn.jsdelivr.net/npm/apexcharts https://www.gstatic.com - https://run.pstmn.io https://share.descript.com/; style-src ''self'' ''unsafe-inline'' - *.crewai.com crewai.com https://cdn.jsdelivr.net/npm/apexcharts; img-src ''self'' - data: *.crewai.com crewai.com https://zeus.tools.crewai.com https://dashboard.tools.crewai.com - https://cdn.jsdelivr.net; font-src ''self'' data: *.crewai.com crewai.com; - connect-src ''self'' *.crewai.com crewai.com https://zeus.tools.crewai.com - https://connect.useparagon.com/ https://zeus.useparagon.com/* https://*.useparagon.com/* - https://run.pstmn.io https://connect.tools.crewai.com/ ws://localhost:3036 - wss://localhost:3036; frame-src ''self'' *.crewai.com crewai.com https://connect.useparagon.com/ - https://zeus.tools.crewai.com https://zeus.useparagon.com/* https://connect.tools.crewai.com/ - https://www.youtube.com https://share.descript.com' - content-type: + - '55' + Content-Type: - application/json; charset=utf-8 - etag: - - W/"43353f343ab1e228123d1a9c9a4b6e7c" + Date: + - Sat, 15 Nov 2025 04:57:05 GMT + cache-control: + - no-store + content-security-policy: + - 'default-src ''self'' *.app.crewai.com app.crewai.com; script-src ''self'' + ''unsafe-inline'' *.app.crewai.com app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts + https://www.gstatic.com https://run.pstmn.io https://apis.google.com https://apis.google.com/js/api.js + https://accounts.google.com https://accounts.google.com/gsi/client https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css.map + https://*.google.com https://docs.google.com https://slides.google.com https://js.hs-scripts.com + https://js.sentry-cdn.com https://browser.sentry-cdn.com https://www.googletagmanager.com + https://js-na1.hs-scripts.com https://js.hubspot.com http://js-na1.hs-scripts.com + https://bat.bing.com https://cdn.amplitude.com https://cdn.segment.com https://d1d3n03t5zntha.cloudfront.net/ + https://descriptusercontent.com https://edge.fullstory.com https://googleads.g.doubleclick.net + https://js.hs-analytics.net https://js.hs-banner.com https://js.hsadspixel.net + https://js.hscollectedforms.net https://js.usemessages.com https://snap.licdn.com + https://static.cloudflareinsights.com https://static.reo.dev https://www.google-analytics.com + https://share.descript.com/; style-src ''self'' ''unsafe-inline'' *.app.crewai.com + app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts; img-src ''self'' data: + *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com https://dashboard.tools.crewai.com + https://cdn.jsdelivr.net https://forms.hsforms.com https://track.hubspot.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://www.google.com + https://www.google.com.br; font-src ''self'' data: *.app.crewai.com app.crewai.com; + connect-src ''self'' *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com + https://connect.useparagon.com/ https://zeus.useparagon.com/* https://*.useparagon.com/* + https://run.pstmn.io https://connect.tools.crewai.com/ https://*.sentry.io + https://www.google-analytics.com https://edge.fullstory.com https://rs.fullstory.com + https://api.hubspot.com https://forms.hscollectedforms.net https://api.hubapi.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://google.com/pagead/form-data/16713662509 + https://google.com/ccm/form-data/16713662509 https://www.google.com/ccm/collect + https://worker-actionkit.tools.crewai.com https://api.reo.dev; frame-src ''self'' + *.app.crewai.com app.crewai.com https://connect.useparagon.com/ https://zeus.tools.crewai.com + https://zeus.useparagon.com/* https://connect.tools.crewai.com/ https://docs.google.com + https://drive.google.com https://slides.google.com https://accounts.google.com + https://*.google.com https://app.hubspot.com/ https://td.doubleclick.net https://www.googletagmanager.com/ + https://www.youtube.com https://share.descript.com' + expires: + - '0' permissions-policy: - camera=(), microphone=(self), geolocation=() + pragma: + - no-cache referrer-policy: - strict-origin-when-cross-origin - server-timing: - - cache_read.active_support;dur=0.09, cache_fetch_hit.active_support;dur=0.00, - cache_read_multi.active_support;dur=0.08, start_processing.action_controller;dur=0.00, - sql.active_record;dur=24.53, instantiation.active_record;dur=1.01, feature_operation.flipper;dur=0.07, - start_transaction.active_record;dur=0.02, transaction.active_record;dur=24.66, - process_action.action_controller;dur=399.97 + strict-transport-security: + - max-age=63072000; includeSubDomains vary: - Accept x-content-type-options: @@ -164,12 +89,120 @@ interactions: x-permitted-cross-domain-policies: - none x-request-id: - - 256ac03e-f7ae-4e03-b5e0-31bd179a7afc + - 98dde4ab-199c-4d1c-a059-3d8b9c0c93d3 x-runtime: - - '0.422765' + - '0.037564' x-xss-protection: - 1; mode=block status: - code: 201 - message: Created + code: 401 + message: Unauthorized +- request: + body: '{"messages":[{"role":"user","content":"Say ''Hello, World!''"}],"model":"gpt-3.5-turbo"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '86' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.109.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.109.1 + x-stainless-read-timeout: + - '600' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.10 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAAwAAAP//jJJNaxsxEIbv+yvUOa+NP2q78TUQegihTQmGFrPI0nitVKtRpdm2Ifi/ + F8kfu24SyEUHPfOO3nc0z4UQYDQsBaidZNV4O7hWE31n9Rdz9TCaXd9//dPcLlZhdf999OvmG5RJ + QZtHVHxSDRU13iIbcgesAkrG1HW8mE/HnybzySyDhjTaJKs9D6bD2YDbsKHBaDyZHZU7MgojLMWP + QgghnvOZPDqNf2EpRuXppsEYZY2wPBcJAYFsugEZo4ksHUPZQUWO0WXbn9FaKsWKgtUf+jUBt22U + yaNrre0B6RyxTBmzu/WR7M9+LNU+0Cb+J4WtcSbuqoAykktvRyYPme4LIdY5d3sRBXygxnPF9BPz + c+PpoR10k+7gxyNjYml7mkX5SrNKI0tjY29soKTaoe6U3Yxlqw31QNGL/NLLa70PsY2r39O+A0qh + Z9SVD6iNuszblQVMa/hW2XnE2TBEDL+NwooNhvQNGreytYcFgfgUGZtqa1yNwQeTtyR9Y7Ev/gEA + AP//AwAqA1omJAMAAA== + headers: + CF-RAY: + - 99ec2a70de42f9e4-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Sat, 15 Nov 2025 04:57:05 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=REDACTED; + path=/; expires=Sat, 15-Nov-25 05:27:05 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=REDACTED; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - REDACTED_ORG + openai-processing-ms: + - '162' + openai-project: + - REDACTED_PROJECT + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '183' + x-openai-proxy-wasm: + - v0.1 + x-ratelimit-limit-requests: + - '10000' + x-ratelimit-limit-tokens: + - '50000000' + x-ratelimit-remaining-requests: + - '9999' + x-ratelimit-remaining-tokens: + - '49999993' + x-ratelimit-reset-requests: + - 6ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - REDACTED_REQUEST_ID + status: + code: 200 + message: OK version: 1 diff --git a/lib/crewai/tests/cassettes/test_save_task_pydantic_output.yaml b/lib/crewai/tests/cassettes/test_save_task_pydantic_output.yaml index 2608683cd..6d12a6652 100644 --- a/lib/crewai/tests/cassettes/test_save_task_pydantic_output.yaml +++ b/lib/crewai/tests/cassettes/test_save_task_pydantic_output.yaml @@ -81,11 +81,9 @@ interactions: Server: - cloudflare Set-Cookie: - - __cf_bm=REDACTED; - path=/; expires=Wed, 05-Nov-25 22:40:59 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=REDACTED; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + - __cf_bm=REDACTED; path=/; expires=Wed, 05-Nov-25 22:40:59 GMT; domain=.api.openai.com; + HttpOnly; Secure; SameSite=None + - _cfuvid=REDACTED; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None Strict-Transport-Security: - max-age=31536000; includeSubDomains; preload Transfer-Encoding: @@ -127,4 +125,105 @@ interactions: status: code: 200 message: OK +- request: + body: '{"trace_id": "c682f49d-bb6b-49d9-84b7-06e1881d37cd", "execution_type": + "crew", "user_identifier": null, "execution_context": {"crew_fingerprint": null, + "crew_name": "crew", "flow_name": null, "crewai_version": "1.4.1", "privacy_level": + "standard"}, "execution_metadata": {"expected_duration_estimate": 300, "agent_count": + 0, "task_count": 0, "flow_method_count": 0, "execution_started_at": "2025-11-15T21:20:09.431751+00:00"}, + "ephemeral_trace_id": "c682f49d-bb6b-49d9-84b7-06e1881d37cd"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '488' + Content-Type: + - application/json + User-Agent: + - CrewAI-CLI/1.4.1 + X-Crewai-Organization-Id: + - 73c2b193-f579-422c-84c7-76a39a1da77f + X-Crewai-Version: + - 1.4.1 + method: POST + uri: https://app.crewai.com/crewai_plus/api/v1/tracing/ephemeral/batches + response: + body: + string: '{"id":"25f0f0b3-90bb-4e2a-bde5-817920201bf1","ephemeral_trace_id":"c682f49d-bb6b-49d9-84b7-06e1881d37cd","execution_type":"crew","crew_name":"crew","flow_name":null,"status":"running","duration_ms":null,"crewai_version":"1.4.1","total_events":0,"execution_context":{"crew_fingerprint":null,"crew_name":"crew","flow_name":null,"crewai_version":"1.4.1","privacy_level":"standard"},"created_at":"2025-11-15T21:20:09.594Z","updated_at":"2025-11-15T21:20:09.594Z","access_code":"TRACE-1fb0209738","user_identifier":null}' + headers: + Connection: + - keep-alive + Content-Length: + - '515' + Content-Type: + - application/json; charset=utf-8 + Date: + - Sat, 15 Nov 2025 21:20:09 GMT + cache-control: + - no-store + content-security-policy: + - 'default-src ''self'' *.app.crewai.com app.crewai.com; script-src ''self'' + ''unsafe-inline'' *.app.crewai.com app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts + https://www.gstatic.com https://run.pstmn.io https://apis.google.com https://apis.google.com/js/api.js + https://accounts.google.com https://accounts.google.com/gsi/client https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css.map + https://*.google.com https://docs.google.com https://slides.google.com https://js.hs-scripts.com + https://js.sentry-cdn.com https://browser.sentry-cdn.com https://www.googletagmanager.com + https://js-na1.hs-scripts.com https://js.hubspot.com http://js-na1.hs-scripts.com + https://bat.bing.com https://cdn.amplitude.com https://cdn.segment.com https://d1d3n03t5zntha.cloudfront.net/ + https://descriptusercontent.com https://edge.fullstory.com https://googleads.g.doubleclick.net + https://js.hs-analytics.net https://js.hs-banner.com https://js.hsadspixel.net + https://js.hscollectedforms.net https://js.usemessages.com https://snap.licdn.com + https://static.cloudflareinsights.com https://static.reo.dev https://www.google-analytics.com + https://share.descript.com/; style-src ''self'' ''unsafe-inline'' *.app.crewai.com + app.crewai.com https://cdn.jsdelivr.net/npm/apexcharts; img-src ''self'' data: + *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com https://dashboard.tools.crewai.com + https://cdn.jsdelivr.net https://forms.hsforms.com https://track.hubspot.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://www.google.com + https://www.google.com.br; font-src ''self'' data: *.app.crewai.com app.crewai.com; + connect-src ''self'' *.app.crewai.com app.crewai.com https://zeus.tools.crewai.com + https://connect.useparagon.com/ https://zeus.useparagon.com/* https://*.useparagon.com/* + https://run.pstmn.io https://connect.tools.crewai.com/ https://*.sentry.io + https://www.google-analytics.com https://edge.fullstory.com https://rs.fullstory.com + https://api.hubspot.com https://forms.hscollectedforms.net https://api.hubapi.com + https://px.ads.linkedin.com https://px4.ads.linkedin.com https://google.com/pagead/form-data/16713662509 + https://google.com/ccm/form-data/16713662509 https://www.google.com/ccm/collect + https://worker-actionkit.tools.crewai.com https://api.reo.dev; frame-src ''self'' + *.app.crewai.com app.crewai.com https://connect.useparagon.com/ https://zeus.tools.crewai.com + https://zeus.useparagon.com/* https://connect.tools.crewai.com/ https://docs.google.com + https://drive.google.com https://slides.google.com https://accounts.google.com + https://*.google.com https://app.hubspot.com/ https://td.doubleclick.net https://www.googletagmanager.com/ + https://www.youtube.com https://share.descript.com' + etag: + - W/"e8d1e903c8c6ec2f765163c0c03bed79" + expires: + - '0' + permissions-policy: + - camera=(), microphone=(self), geolocation=() + pragma: + - no-cache + referrer-policy: + - strict-origin-when-cross-origin + strict-transport-security: + - max-age=63072000; includeSubDomains + vary: + - Accept + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-permitted-cross-domain-policies: + - none + x-request-id: + - 5ea5f513-c359-4a92-a84a-08ad44d9857b + x-runtime: + - '0.044665' + x-xss-protection: + - 1; mode=block + status: + code: 201 + message: Created version: 1 diff --git a/lib/crewai/tests/test_task.py b/lib/crewai/tests/test_task.py index 72fe23b4b..370b5d270 100644 --- a/lib/crewai/tests/test_task.py +++ b/lib/crewai/tests/test_task.py @@ -697,8 +697,13 @@ def test_save_task_json_output(): @pytest.mark.vcr(filter_headers=["authorization"]) -def test_save_task_pydantic_output(): - import uuid +def test_save_task_pydantic_output(tmp_path, monkeypatch): + """Test saving pydantic output to a file. + + Uses tmp_path fixture and monkeypatch to change directory to avoid + file system race conditions on enterprise systems. + """ + from pathlib import Path class ScoreOutput(BaseModel): score: int @@ -710,7 +715,9 @@ def test_save_task_pydantic_output(): allow_delegation=False, ) - output_file = f"score_{uuid.uuid4()}.json" + monkeypatch.chdir(tmp_path) + + output_file = "score_output.json" task = Task( description="Give me an integer score between 1-5 for the following title: 'The impact of AI in the future of work'", expected_output="The score of the title.", @@ -722,11 +729,9 @@ def test_save_task_pydantic_output(): crew = Crew(agents=[scorer], tasks=[task]) crew.kickoff() - output_file_exists = os.path.exists(output_file) - assert output_file_exists - assert {"score": 4} == json.loads(open(output_file).read()) - if output_file_exists: - os.remove(output_file) + output_path = Path(output_file).resolve() + assert output_path.exists() + assert {"score": 4} == json.loads(output_path.read_text()) @pytest.mark.vcr(filter_headers=["authorization"]) diff --git a/lib/crewai/tests/tracing/test_trace_enable_disable.py b/lib/crewai/tests/tracing/test_trace_enable_disable.py new file mode 100644 index 000000000..6304fbb78 --- /dev/null +++ b/lib/crewai/tests/tracing/test_trace_enable_disable.py @@ -0,0 +1,112 @@ +"""Tests to verify that traces are sent when enabled and not sent when disabled. + +VCR will record HTTP interactions. Inspect cassettes to verify tracing behavior. +""" + +import pytest +from crewai import Agent, Crew, Task +from tests.utils import wait_for_event_handlers + + +class TestTraceEnableDisable: + """Test suite to verify trace sending behavior with VCR cassette recording.""" + + @pytest.mark.vcr(filter_headers=["authorization"]) + def test_no_http_calls_when_disabled_via_env(self): + """Test execution when tracing disabled via CREWAI_TRACING_ENABLED=false.""" + with pytest.MonkeyPatch.context() as mp: + mp.setenv("CREWAI_TRACING_ENABLED", "false") + mp.setenv("CREWAI_DISABLE_TELEMETRY", "false") + + agent = Agent( + role="Test Agent", + goal="Test goal", + backstory="Test backstory", + llm="gpt-4o-mini", + ) + task = Task( + description="Say hello", + expected_output="hello", + agent=agent, + ) + crew = Crew(agents=[agent], tasks=[task], verbose=False) + + result = crew.kickoff() + wait_for_event_handlers() + + assert result is not None + + @pytest.mark.vcr(filter_headers=["authorization"]) + def test_no_http_calls_when_disabled_via_tracing_false(self): + """Test execution when tracing=False explicitly set.""" + with pytest.MonkeyPatch.context() as mp: + mp.setenv("CREWAI_DISABLE_TELEMETRY", "false") + + agent = Agent( + role="Test Agent", + goal="Test goal", + backstory="Test backstory", + llm="gpt-4o-mini", + ) + task = Task( + description="Say hello", + expected_output="hello", + agent=agent, + ) + crew = Crew(agents=[agent], tasks=[task], verbose=False, tracing=False) + + result = crew.kickoff() + wait_for_event_handlers() + + assert result is not None + + @pytest.mark.vcr(filter_headers=["authorization"]) + def test_trace_calls_when_enabled_via_env(self): + """Test execution when tracing enabled via CREWAI_TRACING_ENABLED=true.""" + with pytest.MonkeyPatch.context() as mp: + mp.setenv("CREWAI_TRACING_ENABLED", "true") + mp.setenv("CREWAI_DISABLE_TELEMETRY", "false") + mp.setenv("OTEL_SDK_DISABLED", "false") + + agent = Agent( + role="Test Agent", + goal="Test goal", + backstory="Test backstory", + llm="gpt-4o-mini", + ) + task = Task( + description="Say hello", + expected_output="hello", + agent=agent, + ) + crew = Crew(agents=[agent], tasks=[task], verbose=False) + + result = crew.kickoff() + wait_for_event_handlers() + + assert result is not None + + @pytest.mark.vcr(filter_headers=["authorization"]) + def test_trace_calls_when_enabled_via_tracing_true(self): + """Test execution when tracing=True explicitly set.""" + with pytest.MonkeyPatch.context() as mp: + mp.setenv("CREWAI_DISABLE_TELEMETRY", "false") + mp.setenv("OTEL_SDK_DISABLED", "false") + + agent = Agent( + role="Test Agent", + goal="Test goal", + backstory="Test backstory", + llm="gpt-4o-mini", + ) + task = Task( + description="Say hello", + expected_output="hello", + agent=agent, + ) + crew = Crew(agents=[agent], tasks=[task], verbose=False, tracing=True) + + result = crew.kickoff() + wait_for_event_handlers() + + assert result is not None diff --git a/lib/crewai/tests/tracing/test_tracing.py b/lib/crewai/tests/tracing/test_tracing.py index 644c7a4b4..cb340c6d4 100644 --- a/lib/crewai/tests/tracing/test_tracing.py +++ b/lib/crewai/tests/tracing/test_tracing.py @@ -20,6 +20,21 @@ from tests.utils import wait_for_event_handlers class TestTraceListenerSetup: """Test TraceListener is properly setup and collecting events""" + @pytest.fixture(autouse=True) + def mock_user_data_file_io(self): + """Mock user data file I/O to prevent file system pollution between tests""" + with ( + patch( + "crewai.events.listeners.tracing.utils._load_user_data", + return_value={}, + ), + patch( + "crewai.events.listeners.tracing.utils._save_user_data", + return_value=None, + ), + ): + yield + @pytest.fixture(autouse=True) def mock_auth_token(self): """Mock authentication token for all tests in this class""" @@ -45,6 +60,13 @@ class TestTraceListenerSetup: """Reset tracing singleton instances between tests""" from crewai.events.event_bus import crewai_event_bus from crewai.events.event_listener import EventListener + from crewai.events.listeners.tracing.utils import _tracing_enabled + + # Reset the tracing enabled contextvar + try: + _tracing_enabled.set(None) + except (LookupError, AttributeError): + pass # Clear event bus handlers BEFORE creating any new singletons with crewai_event_bus._rwlock.w_locked(): @@ -53,11 +75,19 @@ class TestTraceListenerSetup: crewai_event_bus._handler_dependencies = {} crewai_event_bus._execution_plan_cache = {} - # Reset TraceCollectionListener singleton - if hasattr(TraceCollectionListener, "_instance"): - TraceCollectionListener._instance = None - TraceCollectionListener._initialized = False - TraceCollectionListener._listeners_setup = False + # Reset TraceCollectionListener singleton - must reset instance attributes too + if TraceCollectionListener._instance is not None: + # Reset instance attributes that shadow class attributes (only if they exist as instance attrs) + instance_dict = TraceCollectionListener._instance.__dict__ + if "_initialized" in instance_dict: + del TraceCollectionListener._instance._initialized + if "_listeners_setup" in instance_dict: + del TraceCollectionListener._instance._listeners_setup + + # Reset class attributes + TraceCollectionListener._instance = None + TraceCollectionListener._initialized = False + TraceCollectionListener._listeners_setup = False # Reset EventListener singleton if hasattr(EventListener, "_instance"): @@ -72,10 +102,19 @@ class TestTraceListenerSetup: crewai_event_bus._handler_dependencies = {} crewai_event_bus._execution_plan_cache = {} - if hasattr(TraceCollectionListener, "_instance"): - TraceCollectionListener._instance = None - TraceCollectionListener._initialized = False - TraceCollectionListener._listeners_setup = False + # Reset TraceCollectionListener singleton - must reset instance attributes too + if TraceCollectionListener._instance is not None: + # Reset instance attributes that shadow class attributes (only if they exist as instance attrs) + instance_dict = TraceCollectionListener._instance.__dict__ + if "_initialized" in instance_dict: + del TraceCollectionListener._instance._initialized + if "_listeners_setup" in instance_dict: + del TraceCollectionListener._instance._listeners_setup + + # Reset class attributes + TraceCollectionListener._instance = None + TraceCollectionListener._initialized = False + TraceCollectionListener._listeners_setup = False if hasattr(EventListener, "_instance"): EventListener._instance = None @@ -119,7 +158,15 @@ class TestTraceListenerSetup: def test_trace_listener_collects_crew_events(self): """Test that trace listener properly collects events from crew execution""" - with patch.dict(os.environ, {"CREWAI_TRACING_ENABLED": "true"}): + with patch.dict( + os.environ, + { + "CREWAI_TRACING_ENABLED": "true", + "CREWAI_DISABLE_TELEMETRY": "false", + "CREWAI_DISABLE_TRACKING": "false", + "OTEL_SDK_DISABLED": "false", + }, + ): agent = Agent( role="Test Agent", goal="Test goal", @@ -148,7 +195,15 @@ class TestTraceListenerSetup: def test_batch_manager_finalizes_batch_clears_buffer(self): """Test that batch manager properly finalizes batch and clears buffer""" - with patch.dict(os.environ, {"CREWAI_TRACING_ENABLED": "true"}): + with patch.dict( + os.environ, + { + "CREWAI_TRACING_ENABLED": "true", + "CREWAI_DISABLE_TELEMETRY": "false", + "CREWAI_DISABLE_TRACKING": "false", + "OTEL_SDK_DISABLED": "false", + }, + ): agent = Agent( role="Test Agent", goal="Test goal", @@ -206,7 +261,15 @@ class TestTraceListenerSetup: def test_events_collection_batch_manager(self, mock_plus_api_calls): """Test that trace listener properly collects events from crew execution""" - with patch.dict(os.environ, {"CREWAI_TRACING_ENABLED": "true"}): + with patch.dict( + os.environ, + { + "CREWAI_TRACING_ENABLED": "true", + "CREWAI_DISABLE_TELEMETRY": "false", + "CREWAI_DISABLE_TRACKING": "false", + "OTEL_SDK_DISABLED": "false", + }, + ): agent = Agent( role="Test Agent", goal="Test goal", @@ -300,7 +363,15 @@ class TestTraceListenerSetup: def test_trace_listener_setup_correctly_for_crew(self): """Test that trace listener is set up correctly when enabled""" - with patch.dict(os.environ, {"CREWAI_TRACING_ENABLED": "true"}): + with patch.dict( + os.environ, + { + "CREWAI_TRACING_ENABLED": "true", + "CREWAI_DISABLE_TELEMETRY": "false", + "CREWAI_DISABLE_TRACKING": "false", + "OTEL_SDK_DISABLED": "false", + }, + ): agent = Agent( role="Test Agent", goal="Test goal", @@ -318,11 +389,19 @@ class TestTraceListenerSetup: Crew(agents=[agent], tasks=[task], verbose=True) assert mock_listener_setup.call_count >= 1 + @pytest.mark.vcr(filter_headers=["authorization"]) def test_trace_listener_setup_correctly_for_flow(self): """Test that trace listener is set up correctly when enabled""" - with patch.dict(os.environ, {"CREWAI_TRACING_ENABLED": "true"}): - + with patch.dict( + os.environ, + { + "CREWAI_TRACING_ENABLED": "true", + "CREWAI_DISABLE_TELEMETRY": "false", + "CREWAI_DISABLE_TRACKING": "false", + "OTEL_SDK_DISABLED": "false", + }, + ): class FlowExample(Flow): @start() def start(self): @@ -338,7 +417,15 @@ class TestTraceListenerSetup: def test_trace_listener_ephemeral_batch(self): """Test that trace listener properly handles ephemeral batches""" with ( - patch.dict(os.environ, {"CREWAI_TRACING_ENABLED": "true"}), + patch.dict( + os.environ, + { + "CREWAI_TRACING_ENABLED": "true", + "CREWAI_DISABLE_TELEMETRY": "false", + "CREWAI_DISABLE_TRACKING": "false", + "OTEL_SDK_DISABLED": "false", + }, + ), patch( "crewai.events.listeners.tracing.trace_listener.TraceCollectionListener._check_authenticated", return_value=False, @@ -371,7 +458,15 @@ class TestTraceListenerSetup: @pytest.mark.vcr(filter_headers=["authorization"]) def test_trace_listener_with_authenticated_user(self): """Test that trace listener properly handles authenticated batches""" - with patch.dict(os.environ, {"CREWAI_TRACING_ENABLED": "true"}): + with patch.dict( + os.environ, + { + "CREWAI_TRACING_ENABLED": "true", + "CREWAI_DISABLE_TELEMETRY": "false", + "CREWAI_DISABLE_TRACKING": "false", + "OTEL_SDK_DISABLED": "false", + }, + ): agent = Agent( role="Test Agent", goal="Test goal", @@ -433,7 +528,15 @@ class TestTraceListenerSetup: """Test first-time user trace collection logic with timeout behavior""" with ( - patch.dict(os.environ, {"CREWAI_TRACING_ENABLED": "false"}), + patch.dict( + os.environ, + { + "CREWAI_TRACING_ENABLED": "false", + "CREWAI_DISABLE_TELEMETRY": "false", + "CREWAI_DISABLE_TRACKING": "false", + "OTEL_SDK_DISABLED": "false", + }, + ), patch( "crewai.events.listeners.tracing.utils._is_test_environment", return_value=False, @@ -472,6 +575,10 @@ class TestTraceListenerSetup: trace_listener = TraceCollectionListener() trace_listener.setup_listeners(crewai_event_bus) + trace_listener.first_time_handler = FirstTimeTraceHandler() + if trace_listener.first_time_handler.initialize_for_first_time_user(): + trace_listener.first_time_handler.set_batch_manager(trace_listener.batch_manager) + assert trace_listener.first_time_handler.is_first_time is True assert trace_listener.first_time_handler.collected_events is False @@ -494,7 +601,15 @@ class TestTraceListenerSetup: """Test first-time user trace collection when user accepts viewing traces""" with ( - patch.dict(os.environ, {"CREWAI_TRACING_ENABLED": "false"}), + patch.dict( + os.environ, + { + "CREWAI_TRACING_ENABLED": "false", + "CREWAI_DISABLE_TELEMETRY": "false", + "CREWAI_DISABLE_TRACKING": "false", + "OTEL_SDK_DISABLED": "false", + }, + ), patch( "crewai.events.listeners.tracing.utils._is_test_environment", return_value=False, @@ -531,6 +646,12 @@ class TestTraceListenerSetup: from crewai.events.event_bus import crewai_event_bus trace_listener = TraceCollectionListener() + trace_listener.setup_listeners(crewai_event_bus) + + # Re-initialize first-time handler after patches are applied to ensure clean state + trace_listener.first_time_handler = FirstTimeTraceHandler() + if trace_listener.first_time_handler.initialize_for_first_time_user(): + trace_listener.first_time_handler.set_batch_manager(trace_listener.batch_manager) trace_listener.batch_manager.ephemeral_trace_url = ( "https://crewai.com/trace/mock-id" @@ -546,8 +667,6 @@ class TestTraceListenerSetup: trace_listener.first_time_handler, "_display_ephemeral_trace_link" ) as mock_display_link, ): - trace_listener.setup_listeners(crewai_event_bus) - assert trace_listener.first_time_handler.is_first_time is True trace_listener.first_time_handler.collected_events = True @@ -567,7 +686,15 @@ class TestTraceListenerSetup: def test_first_time_user_trace_consolidation_logic(self, mock_plus_api_calls): """Test the consolidation logic for first-time users vs regular tracing""" with ( - patch.dict(os.environ, {"CREWAI_TRACING_ENABLED": "false"}), + patch.dict( + os.environ, + { + "CREWAI_TRACING_ENABLED": "", + "CREWAI_DISABLE_TELEMETRY": "false", + "CREWAI_DISABLE_TRACKING": "false", + "OTEL_SDK_DISABLED": "false", + }, + ), patch( "crewai.events.listeners.tracing.utils._is_test_environment", return_value=False, @@ -588,6 +715,13 @@ class TestTraceListenerSetup: crewai_event_bus._async_handlers = {} trace_listener = TraceCollectionListener() + + # Re-initialize first-time handler after patches are applied to ensure clean state + # This is necessary because the singleton may have been created before patches were active + trace_listener.first_time_handler = FirstTimeTraceHandler() + if trace_listener.first_time_handler.initialize_for_first_time_user(): + trace_listener.first_time_handler.set_batch_manager(trace_listener.batch_manager) + trace_listener.setup_listeners(crewai_event_bus) assert trace_listener.first_time_handler.is_first_time is True @@ -668,40 +802,41 @@ class TestTraceListenerSetup: def test_trace_batch_marked_as_failed_on_finalize_error(self): """Test that trace batch is marked as failed when finalization returns non-200 status""" # Test the error handling logic directly in TraceBatchManager - batch_manager = TraceBatchManager() + with patch("crewai.events.listeners.tracing.trace_batch_manager.is_tracing_enabled_in_context", return_value=True): + batch_manager = TraceBatchManager() - # Initialize a batch - batch_manager.current_batch = batch_manager.initialize_batch( - user_context={"privacy_level": "standard"}, - execution_metadata={ - "execution_type": "crew", - "crew_name": "test_crew", - }, - ) - batch_manager.trace_batch_id = "test_batch_id_12345" - batch_manager.backend_initialized = True - - # Mock the API responses - with ( - patch.object( - batch_manager.plus_api, - "send_trace_events", - return_value=MagicMock(status_code=200), - ), - patch.object( - batch_manager.plus_api, - "finalize_trace_batch", - return_value=MagicMock(status_code=500, text="Internal Server Error"), - ), - patch.object( - batch_manager.plus_api, - "mark_trace_batch_as_failed", - ) as mock_mark_failed, - ): - # Call finalize_batch directly - batch_manager.finalize_batch() - - # Verify that mark_trace_batch_as_failed was called with the error message - mock_mark_failed.assert_called_once_with( - "test_batch_id_12345", "Internal Server Error" + # Initialize a batch + batch_manager.current_batch = batch_manager.initialize_batch( + user_context={"privacy_level": "standard"}, + execution_metadata={ + "execution_type": "crew", + "crew_name": "test_crew", + }, ) + batch_manager.trace_batch_id = "test_batch_id_12345" + batch_manager.backend_initialized = True + + # Mock the API responses + with ( + patch.object( + batch_manager.plus_api, + "send_trace_events", + return_value=MagicMock(status_code=200), + ), + patch.object( + batch_manager.plus_api, + "finalize_trace_batch", + return_value=MagicMock(status_code=500, text="Internal Server Error"), + ), + patch.object( + batch_manager.plus_api, + "mark_trace_batch_as_failed", + ) as mock_mark_failed, + ): + # Call finalize_batch directly + batch_manager.finalize_batch() + + # Verify that mark_trace_batch_as_failed was called with the error message + mock_mark_failed.assert_called_once_with( + "test_batch_id_12345", "Internal Server Error" + )