diff --git a/lib/crewai/src/crewai/agent/core.py b/lib/crewai/src/crewai/agent/core.py index 8f3c80107..55eb807ef 100644 --- a/lib/crewai/src/crewai/agent/core.py +++ b/lib/crewai/src/crewai/agent/core.py @@ -75,6 +75,7 @@ from crewai.utilities.agent_utils import ( ) from crewai.utilities.constants import TRAINED_AGENTS_DATA_FILE, TRAINING_DATA_FILE from crewai.utilities.converter import Converter, ConverterError +from crewai.utilities.env import get_env_context from crewai.utilities.guardrail import process_guardrail from crewai.utilities.guardrail_types import GuardrailType from crewai.utilities.llm_utils import create_llm @@ -364,6 +365,7 @@ class Agent(BaseAgent): ValueError: If the max execution time is not a positive integer. RuntimeError: If the agent execution fails for other reasons. """ + get_env_context() # Only call handle_reasoning for legacy CrewAgentExecutor # For AgentExecutor, planning is handled in AgentExecutor.generate_plan() if self.executor_class is not AgentExecutor: diff --git a/lib/crewai/src/crewai/crew.py b/lib/crewai/src/crewai/crew.py index cdd371cbc..61d1f52cf 100644 --- a/lib/crewai/src/crewai/crew.py +++ b/lib/crewai/src/crewai/crew.py @@ -98,6 +98,7 @@ from crewai.types.streaming import CrewStreamingOutput from crewai.types.usage_metrics import UsageMetrics from crewai.utilities.constants import NOT_SPECIFIED, TRAINING_DATA_FILE from crewai.utilities.crew.models import CrewContext +from crewai.utilities.env import get_env_context from crewai.utilities.evaluators.crew_evaluator_handler import CrewEvaluator from crewai.utilities.evaluators.task_evaluator import TaskEvaluator from crewai.utilities.file_handler import FileHandler @@ -679,6 +680,7 @@ class Crew(FlowTrackable, BaseModel): Returns: CrewOutput or CrewStreamingOutput if streaming is enabled. """ + get_env_context() if self.stream: enable_agent_streaming(self.agents) ctx = StreamingContext() 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 b022eb582..b86d77aa1 100644 --- a/lib/crewai/src/crewai/events/listeners/tracing/trace_listener.py +++ b/lib/crewai/src/crewai/events/listeners/tracing/trace_listener.py @@ -58,6 +58,12 @@ from crewai.events.types.crew_events import ( CrewKickoffFailedEvent, CrewKickoffStartedEvent, ) +from crewai.events.types.env_events import ( + CCEnvEvent, + CodexEnvEvent, + CursorEnvEvent, + DefaultEnvEvent, +) from crewai.events.types.flow_events import ( FlowCreatedEvent, FlowFinishedEvent, @@ -192,6 +198,7 @@ class TraceCollectionListener(BaseEventListener): if self._listeners_setup: return + self._register_env_event_handlers(crewai_event_bus) self._register_flow_event_handlers(crewai_event_bus) self._register_context_event_handlers(crewai_event_bus) self._register_action_event_handlers(crewai_event_bus) @@ -200,6 +207,25 @@ class TraceCollectionListener(BaseEventListener): self._listeners_setup = True + def _register_env_event_handlers(self, event_bus: CrewAIEventsBus) -> None: + """Register handlers for environment context events.""" + + @event_bus.on(CCEnvEvent) + def on_cc_env(source: Any, event: CCEnvEvent) -> None: + self._handle_action_event("cc_env", source, event) + + @event_bus.on(CodexEnvEvent) + def on_codex_env(source: Any, event: CodexEnvEvent) -> None: + self._handle_action_event("codex_env", source, event) + + @event_bus.on(CursorEnvEvent) + def on_cursor_env(source: Any, event: CursorEnvEvent) -> None: + self._handle_action_event("cursor_env", source, event) + + @event_bus.on(DefaultEnvEvent) + def on_default_env(source: Any, event: DefaultEnvEvent) -> None: + self._handle_action_event("default_env", source, event) + def _register_flow_event_handlers(self, event_bus: CrewAIEventsBus) -> None: """Register handlers for flow events.""" diff --git a/lib/crewai/src/crewai/flow/flow.py b/lib/crewai/src/crewai/flow/flow.py index 8ef77e482..71bd31915 100644 --- a/lib/crewai/src/crewai/flow/flow.py +++ b/lib/crewai/src/crewai/flow/flow.py @@ -110,6 +110,7 @@ if TYPE_CHECKING: from crewai.flow.visualization import build_flow_structure, render_interactive from crewai.types.streaming import CrewStreamingOutput, FlowStreamingOutput +from crewai.utilities.env import get_env_context from crewai.utilities.streaming import ( TaskInfo, create_async_chunk_generator, @@ -1770,6 +1771,7 @@ class Flow(Generic[T], metaclass=FlowMeta): Returns: The final output from the flow or FlowStreamingOutput if streaming. """ + get_env_context() if self.stream: result_holder: list[Any] = [] current_task_info: TaskInfo = {