From 741bf12bf4fec520c7b194ec20975e88d065638f Mon Sep 17 00:00:00 2001 From: Lorenze Jay <63378463+lorenzejay@users.noreply.github.com> Date: Tue, 20 Jan 2026 21:44:45 -0800 Subject: [PATCH] Lorenze/enh decouple executor from crew (#4209) * wip restrcuturing agent executor and liteagent * fix: handle None task in AgentExecutor to prevent errors Added a check to ensure that if the task is None, the method returns early without attempting to access task properties. This change improves the robustness of the AgentExecutor by preventing potential errors when the task is not set. * refactor: streamline AgentExecutor initialization by removing redundant parameters Updated the Agent class to simplify the initialization of the AgentExecutor by removing unnecessary task and crew parameters in standalone mode. This change enhances code clarity and maintains backward compatibility by ensuring that the executor is correctly configured without redundant assignments. * ensure executors work inside a flow due to flow in flow async structure * refactor: enhance agent kickoff preparation by separating common logic Updated the Agent class to introduce a new private method that consolidates the common setup logic for both synchronous and asynchronous kickoff executions. This change improves code clarity and maintainability by reducing redundancy in the kickoff process, while ensuring that the agent can still execute effectively within both standalone and flow contexts. * linting and tests * fix test * refactor: improve test for Agent kickoff parameters Updated the test for the Agent class to ensure that the kickoff method correctly preserves parameters. The test now verifies the configuration of the agent after kickoff, enhancing clarity and maintainability. Additionally, the test for asynchronous kickoff within a flow context has been updated to reflect the Agent class instead of LiteAgent. * refactor: update test task guardrail process output for improved validation Refactored the test for task guardrail process output to enhance the validation of the output against the OpenAPI schema. The changes include a more structured request body and updated response handling to ensure compliance with the guardrail requirements. This update aims to improve the clarity and reliability of the test cases, ensuring that task outputs are correctly validated and feedback is appropriately provided. * test fix cassette * test fix cassette * working * working cassette * refactor: streamline agent execution and enhance flow compatibility Refactored the Agent class to simplify the execution method by removing the event loop check and clarifying the behavior when called from synchronous and asynchronous contexts. The changes ensure that the method operates seamlessly within flow methods, improving clarity in the documentation. Additionally, updated the AgentExecutor to set the response model to None, enhancing flexibility. New test cassettes were added to validate the functionality of agents within flow contexts, ensuring robust testing for both synchronous and asynchronous operations. * fixed cassette * Enhance Flow Execution Logic - Introduced conditional execution for start methods in the Flow class. - Unconditional start methods are prioritized during kickoff, while conditional starts are executed only if no unconditional starts are present. - Improved handling of cyclic flows by allowing re-execution of conditional start methods triggered by routers. - Added checks to continue execution chains for completed conditional starts. These changes improve the flexibility and control of flow execution, ensuring that the correct methods are triggered based on the defined conditions. * Enhance Agent and Flow Execution Logic - Updated the Agent class to automatically detect the event loop and return a coroutine when called within a Flow, simplifying async handling for users. - Modified Flow class to execute listeners sequentially, preventing race conditions on shared state during listener execution. - Improved handling of coroutine results from synchronous methods, ensuring proper execution flow and state management. These changes enhance the overall execution logic and user experience when working with agents and flows in CrewAI. * Enhance Flow Listener Logic and Agent Imports - Updated the Flow class to track fired OR listeners, ensuring that multi-source OR listeners only trigger once during execution. This prevents redundant executions and improves flow efficiency. - Cleared fired OR listeners during cyclic flow resets to allow re-execution in new cycles. - Modified the Agent class imports to include Coroutine from collections.abc, enhancing type handling for asynchronous operations. These changes improve the control and performance of flow execution in CrewAI, ensuring more predictable behavior in complex scenarios. * adjusted test due to new cassette * ensure we dont finalize batch on just a liteagent finishing * feat: cancellable parallelized flow methods * feat: allow methods to be cancelled & run parallelized * feat: ensure state is thread safe through proxy * fix: check for proxy state * fix: mimic BaseModel method * chore: update final attr checks; test * better description * fix test * chore: update test assumptions * extra --------- Co-authored-by: Greyson LaLonde --- lib/crewai/src/crewai/agent/core.py | 472 ++++- .../base_agent_executor_mixin.py | 4 +- .../src/crewai/experimental/__init__.py | 5 +- ...ent_executor_flow.py => agent_executor.py} | 138 +- lib/crewai/src/crewai/flow/flow.py | 484 ++++- .../src/crewai/flow/persistence/decorators.py | 27 +- lib/crewai/src/crewai/lite_agent.py | 18 + .../src/crewai/utilities/agent_utils.py | 18 + ...xecutor_flow.py => test_agent_executor.py} | 98 +- lib/crewai/tests/agents/test_lite_agent.py | 242 ++- .../test_lite_agent_inside_flow_sync.yaml | 119 ++ ...est_lite_agent_inside_flow_with_tools.yaml | 255 +++ ..._lite_agent_kickoff_async_inside_flow.yaml | 119 ++ ...est_lite_agent_standalone_still_works.yaml | 119 ++ .../test_multiple_agents_in_same_flow.yaml | 239 +++ .../test_multiple_before_after_kickoff.yaml | 1680 ++++++++--------- .../test_task_guardrail_process_output.yaml | 448 +++-- lib/crewai/tests/test_flow.py | 22 +- lib/crewai/tests/test_flow_persistence.py | 2 +- lib/crewai/tests/test_task_guardrails.py | 4 +- lib/crewai/tests/utilities/test_events.py | 8 +- 21 files changed, 3145 insertions(+), 1376 deletions(-) rename lib/crewai/src/crewai/experimental/{crew_agent_executor_flow.py => agent_executor.py} (85%) rename lib/crewai/tests/agents/{test_crew_agent_executor_flow.py => test_agent_executor.py} (82%) create mode 100644 lib/crewai/tests/cassettes/agents/test_lite_agent_inside_flow_sync.yaml create mode 100644 lib/crewai/tests/cassettes/agents/test_lite_agent_inside_flow_with_tools.yaml create mode 100644 lib/crewai/tests/cassettes/agents/test_lite_agent_kickoff_async_inside_flow.yaml create mode 100644 lib/crewai/tests/cassettes/agents/test_lite_agent_standalone_still_works.yaml create mode 100644 lib/crewai/tests/cassettes/agents/test_multiple_agents_in_same_flow.yaml diff --git a/lib/crewai/src/crewai/agent/core.py b/lib/crewai/src/crewai/agent/core.py index bc964754c..005d14de8 100644 --- a/lib/crewai/src/crewai/agent/core.py +++ b/lib/crewai/src/crewai/agent/core.py @@ -1,7 +1,7 @@ from __future__ import annotations import asyncio -from collections.abc import Callable, Sequence +from collections.abc import Callable, Coroutine, Sequence import shutil import subprocess import time @@ -34,6 +34,11 @@ from crewai.agents.agent_builder.base_agent import BaseAgent from crewai.agents.cache.cache_handler import CacheHandler from crewai.agents.crew_agent_executor import CrewAgentExecutor from crewai.events.event_bus import crewai_event_bus +from crewai.events.types.agent_events import ( + LiteAgentExecutionCompletedEvent, + LiteAgentExecutionErrorEvent, + LiteAgentExecutionStartedEvent, +) from crewai.events.types.knowledge_events import ( KnowledgeQueryCompletedEvent, KnowledgeQueryFailedEvent, @@ -43,10 +48,10 @@ from crewai.events.types.memory_events import ( MemoryRetrievalCompletedEvent, MemoryRetrievalStartedEvent, ) -from crewai.experimental.crew_agent_executor_flow import CrewAgentExecutorFlow +from crewai.experimental.agent_executor import AgentExecutor from crewai.knowledge.knowledge import Knowledge from crewai.knowledge.source.base_knowledge_source import BaseKnowledgeSource -from crewai.lite_agent import LiteAgent +from crewai.lite_agent_output import LiteAgentOutput from crewai.llms.base_llm import BaseLLM from crewai.mcp import ( MCPClient, @@ -64,15 +69,18 @@ from crewai.security.fingerprint import Fingerprint from crewai.tools.agent_tools.agent_tools import AgentTools from crewai.utilities.agent_utils import ( get_tool_names, + is_inside_event_loop, load_agent_from_repository, parse_tools, render_text_description_and_args, ) from crewai.utilities.constants import TRAINED_AGENTS_DATA_FILE, TRAINING_DATA_FILE -from crewai.utilities.converter import Converter +from crewai.utilities.converter import Converter, ConverterError +from crewai.utilities.guardrail import process_guardrail from crewai.utilities.guardrail_types import GuardrailType from crewai.utilities.llm_utils import create_llm from crewai.utilities.prompts import Prompts, StandardPromptResult, SystemPromptResult +from crewai.utilities.pydantic_schema_utils import generate_model_description from crewai.utilities.token_counter_callback import TokenCalcHandler from crewai.utilities.training_handler import CrewTrainingHandler @@ -89,9 +97,9 @@ if TYPE_CHECKING: from crewai_tools import CodeInterpreterTool from crewai.agents.agent_builder.base_agent import PlatformAppOrAction - from crewai.lite_agent_output import LiteAgentOutput from crewai.task import Task from crewai.tools.base_tool import BaseTool + from crewai.tools.structured_tool import CrewStructuredTool from crewai.utilities.types import LLMMessage @@ -113,7 +121,7 @@ class Agent(BaseAgent): The agent can also have memory, can operate in verbose mode, and can delegate tasks to other agents. Attributes: - agent_executor: An instance of the CrewAgentExecutor or CrewAgentExecutorFlow class. + agent_executor: An instance of the CrewAgentExecutor or AgentExecutor class. role: The role of the agent. goal: The objective of the agent. backstory: The backstory of the agent. @@ -238,9 +246,9 @@ class Agent(BaseAgent): Can be a single A2AConfig/A2AClientConfig/A2AServerConfig, or a list of any number of A2AConfig/A2AClientConfig with a single A2AServerConfig. """, ) - executor_class: type[CrewAgentExecutor] | type[CrewAgentExecutorFlow] = Field( + executor_class: type[CrewAgentExecutor] | type[AgentExecutor] = Field( default=CrewAgentExecutor, - description="Class to use for the agent executor. Defaults to CrewAgentExecutor, can optionally use CrewAgentExecutorFlow.", + description="Class to use for the agent executor. Defaults to CrewAgentExecutor, can optionally use AgentExecutor.", ) @model_validator(mode="before") @@ -1583,26 +1591,25 @@ class Agent(BaseAgent): ) return None - def kickoff( + def _prepare_kickoff( self, messages: str | list[LLMMessage], response_format: type[Any] | None = None, - ) -> LiteAgentOutput: - """ - Execute the agent with the given messages using a LiteAgent instance. + ) -> tuple[AgentExecutor, dict[str, str], dict[str, Any], list[CrewStructuredTool]]: + """Prepare common setup for kickoff execution. - This method is useful when you want to use the Agent configuration but - with the simpler and more direct execution flow of LiteAgent. + This method handles all the common preparation logic shared between + kickoff() and kickoff_async(), including tool processing, prompt building, + executor creation, and input formatting. Args: messages: Either a string query or a list of message dictionaries. - If a string is provided, it will be converted to a user message. - If a list is provided, each dict should have 'role' and 'content' keys. response_format: Optional Pydantic model for structured output. Returns: - LiteAgentOutput: The result of the agent execution. + Tuple of (executor, inputs, agent_info, parsed_tools) ready for execution. """ + # Process platform apps and MCP tools if self.apps: platform_tools = self.get_platform_tools(self.apps) if platform_tools and self.tools is not None: @@ -1612,25 +1619,359 @@ class Agent(BaseAgent): if mcps and self.tools is not None: self.tools.extend(mcps) - lite_agent = LiteAgent( - id=self.id, - role=self.role, - goal=self.goal, - backstory=self.backstory, - llm=self.llm, - tools=self.tools or [], - max_iterations=self.max_iter, - max_execution_time=self.max_execution_time, - respect_context_window=self.respect_context_window, - verbose=self.verbose, - response_format=response_format, + # Prepare tools + raw_tools: list[BaseTool] = self.tools or [] + parsed_tools = parse_tools(raw_tools) + + # Build agent_info for backward-compatible event emission + agent_info = { + "id": self.id, + "role": self.role, + "goal": self.goal, + "backstory": self.backstory, + "tools": raw_tools, + "verbose": self.verbose, + } + + # Build prompt for standalone execution + prompt = Prompts( + agent=self, + has_tools=len(raw_tools) > 0, i18n=self.i18n, - original_agent=self, - guardrail=self.guardrail, - guardrail_max_retries=self.guardrail_max_retries, + use_system_prompt=self.use_system_prompt, + system_template=self.system_template, + prompt_template=self.prompt_template, + response_template=self.response_template, + ).task_execution() + + # Prepare stop words + stop_words = [self.i18n.slice("observation")] + if self.response_template: + stop_words.append( + self.response_template.split("{{ .Response }}")[1].strip() + ) + + # Get RPM limit function + rpm_limit_fn = ( + self._rpm_controller.check_or_wait if self._rpm_controller else None ) - return lite_agent.kickoff(messages) + # Create the executor for standalone mode (no crew, no task) + executor = AgentExecutor( + task=None, + crew=None, + llm=cast(BaseLLM, self.llm), + agent=self, + prompt=prompt, + max_iter=self.max_iter, + tools=parsed_tools, + tools_names=get_tool_names(parsed_tools), + stop_words=stop_words, + tools_description=render_text_description_and_args(parsed_tools), + tools_handler=self.tools_handler, + original_tools=raw_tools, + step_callback=self.step_callback, + function_calling_llm=self.function_calling_llm, + respect_context_window=self.respect_context_window, + request_within_rpm_limit=rpm_limit_fn, + callbacks=[TokenCalcHandler(self._token_process)], + response_model=response_format, + i18n=self.i18n, + ) + + # Format messages + if isinstance(messages, str): + formatted_messages = messages + else: + formatted_messages = "\n".join( + str(msg.get("content", "")) for msg in messages if msg.get("content") + ) + + # Build the input dict for the executor + inputs = { + "input": formatted_messages, + "tool_names": get_tool_names(parsed_tools), + "tools": render_text_description_and_args(parsed_tools), + } + + return executor, inputs, agent_info, parsed_tools + + def kickoff( + self, + messages: str | list[LLMMessage], + response_format: type[Any] | None = None, + ) -> LiteAgentOutput | Coroutine[Any, Any, LiteAgentOutput]: + """ + Execute the agent with the given messages using the AgentExecutor. + + This method provides standalone agent execution without requiring a Crew. + It supports tools, response formatting, and guardrails. + + When called from within a Flow (sync or async method), this automatically + detects the event loop and returns a coroutine that the Flow framework + awaits. Users don't need to handle async explicitly. + + Args: + messages: Either a string query or a list of message dictionaries. + If a string is provided, it will be converted to a user message. + If a list is provided, each dict should have 'role' and 'content' keys. + response_format: Optional Pydantic model for structured output. + + Returns: + LiteAgentOutput: The result of the agent execution. + When inside a Flow, returns a coroutine that resolves to LiteAgentOutput. + + Note: + For explicit async usage outside of Flow, use kickoff_async() directly. + """ + # Magic auto-async: if inside event loop (e.g., inside a Flow), + # return coroutine for Flow to await + if is_inside_event_loop(): + return self.kickoff_async(messages, response_format) + + executor, inputs, agent_info, parsed_tools = self._prepare_kickoff( + messages, response_format + ) + + try: + crewai_event_bus.emit( + self, + event=LiteAgentExecutionStartedEvent( + agent_info=agent_info, + tools=parsed_tools, + messages=messages, + ), + ) + + output = self._execute_and_build_output(executor, inputs, response_format) + + if self.guardrail is not None: + output = self._process_kickoff_guardrail( + output=output, + executor=executor, + inputs=inputs, + response_format=response_format, + ) + + crewai_event_bus.emit( + self, + event=LiteAgentExecutionCompletedEvent( + agent_info=agent_info, + output=output.raw, + ), + ) + + return output + + except Exception as e: + crewai_event_bus.emit( + self, + event=LiteAgentExecutionErrorEvent( + agent_info=agent_info, + error=str(e), + ), + ) + raise + + def _execute_and_build_output( + self, + executor: AgentExecutor, + inputs: dict[str, str], + response_format: type[Any] | None = None, + ) -> LiteAgentOutput: + """Execute the agent and build the output object. + + Args: + executor: The executor instance. + inputs: Input dictionary for execution. + response_format: Optional response format. + + Returns: + LiteAgentOutput with raw output, formatted result, and metrics. + """ + import json + + # Execute the agent (this is called from sync path, so invoke returns dict) + result = cast(dict[str, Any], executor.invoke(inputs)) + raw_output = result.get("output", "") + + # Handle response format conversion + formatted_result: BaseModel | None = None + if response_format: + try: + model_schema = generate_model_description(response_format) + schema = json.dumps(model_schema, indent=2) + instructions = self.i18n.slice("formatted_task_instructions").format( + output_format=schema + ) + + converter = Converter( + llm=self.llm, + text=raw_output, + model=response_format, + instructions=instructions, + ) + + conversion_result = converter.to_pydantic() + if isinstance(conversion_result, BaseModel): + formatted_result = conversion_result + except ConverterError: + pass # Keep raw output if conversion fails + + # Get token usage metrics + if isinstance(self.llm, BaseLLM): + usage_metrics = self.llm.get_token_usage_summary() + else: + usage_metrics = self._token_process.get_summary() + + return LiteAgentOutput( + raw=raw_output, + pydantic=formatted_result, + agent_role=self.role, + usage_metrics=usage_metrics.model_dump() if usage_metrics else None, + messages=executor.messages, + ) + + async def _execute_and_build_output_async( + self, + executor: AgentExecutor, + inputs: dict[str, str], + response_format: type[Any] | None = None, + ) -> LiteAgentOutput: + """Execute the agent asynchronously and build the output object. + + This is the async version of _execute_and_build_output that uses + invoke_async() for native async execution within event loops. + + Args: + executor: The executor instance. + inputs: Input dictionary for execution. + response_format: Optional response format. + + Returns: + LiteAgentOutput with raw output, formatted result, and metrics. + """ + import json + + # Execute the agent asynchronously + result = await executor.invoke_async(inputs) + raw_output = result.get("output", "") + + # Handle response format conversion + formatted_result: BaseModel | None = None + if response_format: + try: + model_schema = generate_model_description(response_format) + schema = json.dumps(model_schema, indent=2) + instructions = self.i18n.slice("formatted_task_instructions").format( + output_format=schema + ) + + converter = Converter( + llm=self.llm, + text=raw_output, + model=response_format, + instructions=instructions, + ) + + conversion_result = converter.to_pydantic() + if isinstance(conversion_result, BaseModel): + formatted_result = conversion_result + except ConverterError: + pass # Keep raw output if conversion fails + + # Get token usage metrics + if isinstance(self.llm, BaseLLM): + usage_metrics = self.llm.get_token_usage_summary() + else: + usage_metrics = self._token_process.get_summary() + + return LiteAgentOutput( + raw=raw_output, + pydantic=formatted_result, + agent_role=self.role, + usage_metrics=usage_metrics.model_dump() if usage_metrics else None, + messages=executor.messages, + ) + + def _process_kickoff_guardrail( + self, + output: LiteAgentOutput, + executor: AgentExecutor, + inputs: dict[str, str], + response_format: type[Any] | None = None, + retry_count: int = 0, + ) -> LiteAgentOutput: + """Process guardrail for kickoff execution with retry logic. + + Args: + output: Current agent output. + executor: The executor instance. + inputs: Input dictionary for re-execution. + response_format: Optional response format. + retry_count: Current retry count. + + Returns: + Validated/updated output. + """ + from crewai.utilities.guardrail_types import GuardrailCallable + + # Ensure guardrail is callable + guardrail_callable: GuardrailCallable + if isinstance(self.guardrail, str): + from crewai.tasks.llm_guardrail import LLMGuardrail + + guardrail_callable = cast( + GuardrailCallable, + LLMGuardrail(description=self.guardrail, llm=cast(BaseLLM, self.llm)), + ) + elif callable(self.guardrail): + guardrail_callable = self.guardrail + else: + # Should not happen if called from kickoff with guardrail check + return output + + guardrail_result = process_guardrail( + output=output, + guardrail=guardrail_callable, + retry_count=retry_count, + event_source=self, + from_agent=self, + ) + + if not guardrail_result.success: + if retry_count >= self.guardrail_max_retries: + raise ValueError( + f"Agent's guardrail failed validation after {self.guardrail_max_retries} retries. " + f"Last error: {guardrail_result.error}" + ) + + # Add feedback and re-execute + executor._append_message_to_state( + guardrail_result.error or "Guardrail validation failed", + role="user", + ) + + # Re-execute and build new output + output = self._execute_and_build_output(executor, inputs, response_format) + + # Recursively retry guardrail + return self._process_kickoff_guardrail( + output=output, + executor=executor, + inputs=inputs, + response_format=response_format, + retry_count=retry_count + 1, + ) + + # Apply guardrail result if available + if guardrail_result.result is not None: + if isinstance(guardrail_result.result, str): + output.raw = guardrail_result.result + elif isinstance(guardrail_result.result, BaseModel): + output.pydantic = guardrail_result.result + + return output async def kickoff_async( self, @@ -1638,9 +1979,11 @@ class Agent(BaseAgent): response_format: type[Any] | None = None, ) -> LiteAgentOutput: """ - Execute the agent asynchronously with the given messages using a LiteAgent instance. + Execute the agent asynchronously with the given messages. - This is the async version of the kickoff method. + This is the async version of the kickoff method that uses native async + execution. It is designed for use within async contexts, such as when + called from within an async Flow method. Args: messages: Either a string query or a list of message dictionaries. @@ -1651,21 +1994,48 @@ class Agent(BaseAgent): Returns: LiteAgentOutput: The result of the agent execution. """ - lite_agent = LiteAgent( - role=self.role, - goal=self.goal, - backstory=self.backstory, - llm=self.llm, - tools=self.tools or [], - max_iterations=self.max_iter, - max_execution_time=self.max_execution_time, - respect_context_window=self.respect_context_window, - verbose=self.verbose, - response_format=response_format, - i18n=self.i18n, - original_agent=self, - guardrail=self.guardrail, - guardrail_max_retries=self.guardrail_max_retries, + executor, inputs, agent_info, parsed_tools = self._prepare_kickoff( + messages, response_format ) - return await lite_agent.kickoff_async(messages) + try: + crewai_event_bus.emit( + self, + event=LiteAgentExecutionStartedEvent( + agent_info=agent_info, + tools=parsed_tools, + messages=messages, + ), + ) + + output = await self._execute_and_build_output_async( + executor, inputs, response_format + ) + + if self.guardrail is not None: + output = self._process_kickoff_guardrail( + output=output, + executor=executor, + inputs=inputs, + response_format=response_format, + ) + + crewai_event_bus.emit( + self, + event=LiteAgentExecutionCompletedEvent( + agent_info=agent_info, + output=output.raw, + ), + ) + + return output + + except Exception as e: + crewai_event_bus.emit( + self, + event=LiteAgentExecutionErrorEvent( + agent_info=agent_info, + error=str(e), + ), + ) + raise diff --git a/lib/crewai/src/crewai/agents/agent_builder/base_agent_executor_mixin.py b/lib/crewai/src/crewai/agents/agent_builder/base_agent_executor_mixin.py index cc4c9d4d8..e54742255 100644 --- a/lib/crewai/src/crewai/agents/agent_builder/base_agent_executor_mixin.py +++ b/lib/crewai/src/crewai/agents/agent_builder/base_agent_executor_mixin.py @@ -21,9 +21,9 @@ if TYPE_CHECKING: class CrewAgentExecutorMixin: - crew: Crew + crew: Crew | None agent: Agent - task: Task + task: Task | None iterations: int max_iter: int messages: list[LLMMessage] diff --git a/lib/crewai/src/crewai/experimental/__init__.py b/lib/crewai/src/crewai/experimental/__init__.py index 9507095ff..662a722f3 100644 --- a/lib/crewai/src/crewai/experimental/__init__.py +++ b/lib/crewai/src/crewai/experimental/__init__.py @@ -1,4 +1,4 @@ -from crewai.experimental.crew_agent_executor_flow import CrewAgentExecutorFlow +from crewai.experimental.agent_executor import AgentExecutor, CrewAgentExecutorFlow from crewai.experimental.evaluation import ( AgentEvaluationResult, AgentEvaluator, @@ -23,8 +23,9 @@ from crewai.experimental.evaluation import ( __all__ = [ "AgentEvaluationResult", "AgentEvaluator", + "AgentExecutor", "BaseEvaluator", - "CrewAgentExecutorFlow", + "CrewAgentExecutorFlow", # Deprecated alias for AgentExecutor "EvaluationScore", "EvaluationTraceCallback", "ExperimentResult", diff --git a/lib/crewai/src/crewai/experimental/crew_agent_executor_flow.py b/lib/crewai/src/crewai/experimental/agent_executor.py similarity index 85% rename from lib/crewai/src/crewai/experimental/crew_agent_executor_flow.py rename to lib/crewai/src/crewai/experimental/agent_executor.py index 7111c97ab..78900baae 100644 --- a/lib/crewai/src/crewai/experimental/crew_agent_executor_flow.py +++ b/lib/crewai/src/crewai/experimental/agent_executor.py @@ -1,6 +1,6 @@ from __future__ import annotations -from collections.abc import Callable +from collections.abc import Callable, Coroutine import threading from typing import TYPE_CHECKING, Any, Literal, cast from uuid import uuid4 @@ -37,6 +37,7 @@ from crewai.utilities.agent_utils import ( handle_unknown_error, has_reached_max_iterations, is_context_length_exceeded, + is_inside_event_loop, process_llm_response, ) from crewai.utilities.constants import TRAINING_DATA_FILE @@ -73,13 +74,17 @@ class AgentReActState(BaseModel): ask_for_human_input: bool = Field(default=False) -class CrewAgentExecutorFlow(Flow[AgentReActState], CrewAgentExecutorMixin): - """Flow-based executor matching CrewAgentExecutor interface. +class AgentExecutor(Flow[AgentReActState], CrewAgentExecutorMixin): + """Agent Executor for both standalone agents and crew-bound agents. Inherits from: - Flow[AgentReActState]: Provides flow orchestration capabilities - CrewAgentExecutorMixin: Provides memory methods (short/long/external term) + This executor can operate in two modes: + - Standalone mode: When crew and task are None (used by Agent.kickoff()) + - Crew mode: When crew and task are provided (used by Agent.execute_task()) + Note: Multiple instances may be created during agent initialization (cache setup, RPM controller setup, etc.) but only the final instance should execute tasks via invoke(). @@ -88,8 +93,6 @@ class CrewAgentExecutorFlow(Flow[AgentReActState], CrewAgentExecutorMixin): def __init__( self, llm: BaseLLM, - task: Task, - crew: Crew, agent: Agent, prompt: SystemPromptResult | StandardPromptResult, max_iter: int, @@ -98,6 +101,8 @@ class CrewAgentExecutorFlow(Flow[AgentReActState], CrewAgentExecutorMixin): stop_words: list[str], tools_description: str, tools_handler: ToolsHandler, + task: Task | None = None, + crew: Crew | None = None, step_callback: Any = None, original_tools: list[BaseTool] | None = None, function_calling_llm: BaseLLM | Any | None = None, @@ -111,8 +116,6 @@ class CrewAgentExecutorFlow(Flow[AgentReActState], CrewAgentExecutorMixin): Args: llm: Language model instance. - task: Task to execute. - crew: Crew instance. agent: Agent to execute. prompt: Prompt templates. max_iter: Maximum iterations. @@ -121,6 +124,8 @@ class CrewAgentExecutorFlow(Flow[AgentReActState], CrewAgentExecutorMixin): stop_words: Stop word list. tools_description: Tool descriptions. tools_handler: Tool handler instance. + task: Optional task to execute (None for standalone agent execution). + crew: Optional crew instance (None for standalone agent execution). step_callback: Optional step callback. original_tools: Original tool list. function_calling_llm: Optional function calling LLM. @@ -131,9 +136,9 @@ class CrewAgentExecutorFlow(Flow[AgentReActState], CrewAgentExecutorMixin): """ self._i18n: I18N = i18n or get_i18n() self.llm = llm - self.task = task + self.task: Task | None = task self.agent = agent - self.crew = crew + self.crew: Crew | None = crew self.prompt = prompt self.tools = tools self.tools_names = tools_names @@ -178,7 +183,6 @@ class CrewAgentExecutorFlow(Flow[AgentReActState], CrewAgentExecutorMixin): else self.stop ) ) - self._state = AgentReActState() def _ensure_flow_initialized(self) -> None: @@ -264,7 +268,7 @@ class CrewAgentExecutorFlow(Flow[AgentReActState], CrewAgentExecutorMixin): printer=self._printer, from_task=self.task, from_agent=self.agent, - response_model=self.response_model, + response_model=None, executor_context=self, ) @@ -449,9 +453,99 @@ class CrewAgentExecutorFlow(Flow[AgentReActState], CrewAgentExecutorMixin): return "initialized" - def invoke(self, inputs: dict[str, Any]) -> dict[str, Any]: + def invoke( + self, inputs: dict[str, Any] + ) -> dict[str, Any] | Coroutine[Any, Any, dict[str, Any]]: """Execute agent with given inputs. + When called from within an existing event loop (e.g., inside a Flow), + this method returns a coroutine that should be awaited. The Flow + framework handles this automatically. + + Args: + inputs: Input dictionary containing prompt variables. + + Returns: + Dictionary with agent output, or a coroutine if inside an event loop. + """ + # Magic auto-async: if inside event loop, return coroutine for Flow to await + if is_inside_event_loop(): + return self.invoke_async(inputs) + + self._ensure_flow_initialized() + + with self._execution_lock: + if self._is_executing: + raise RuntimeError( + "Executor is already running. " + "Cannot invoke the same executor instance concurrently." + ) + self._is_executing = True + self._has_been_invoked = True + + try: + # Reset state for fresh execution + self.state.messages.clear() + self.state.iterations = 0 + self.state.current_answer = None + self.state.is_finished = False + + if "system" in self.prompt: + prompt = cast("SystemPromptResult", self.prompt) + system_prompt = self._format_prompt(prompt["system"], inputs) + user_prompt = self._format_prompt(prompt["user"], inputs) + self.state.messages.append( + format_message_for_llm(system_prompt, role="system") + ) + self.state.messages.append(format_message_for_llm(user_prompt)) + else: + user_prompt = self._format_prompt(self.prompt["prompt"], inputs) + self.state.messages.append(format_message_for_llm(user_prompt)) + + self.state.ask_for_human_input = bool( + inputs.get("ask_for_human_input", False) + ) + + self.kickoff() + + formatted_answer = self.state.current_answer + + if not isinstance(formatted_answer, AgentFinish): + raise RuntimeError( + "Agent execution ended without reaching a final answer." + ) + + if self.state.ask_for_human_input: + formatted_answer = self._handle_human_feedback(formatted_answer) + + self._create_short_term_memory(formatted_answer) + self._create_long_term_memory(formatted_answer) + self._create_external_memory(formatted_answer) + + return {"output": formatted_answer.output} + + except AssertionError: + fail_text = Text() + fail_text.append("❌ ", style="red bold") + fail_text.append( + "Agent failed to reach a final answer. This is likely a bug - please report it.", + style="red", + ) + self._console.print(fail_text) + raise + except Exception as e: + handle_unknown_error(self._printer, e) + raise + finally: + self._is_executing = False + + async def invoke_async(self, inputs: dict[str, Any]) -> dict[str, Any]: + """Execute agent asynchronously with given inputs. + + This method is designed for use within async contexts, such as when + the agent is called from within an async Flow method. It uses + kickoff_async() directly instead of running in a separate thread. + Args: inputs: Input dictionary containing prompt variables. @@ -492,7 +586,8 @@ class CrewAgentExecutorFlow(Flow[AgentReActState], CrewAgentExecutorMixin): inputs.get("ask_for_human_input", False) ) - self.kickoff() + # Use async kickoff directly since we're already in an async context + await self.kickoff_async() formatted_answer = self.state.current_answer @@ -583,11 +678,14 @@ class CrewAgentExecutorFlow(Flow[AgentReActState], CrewAgentExecutorMixin): if self.agent is None: raise ValueError("Agent cannot be None") + if self.task is None: + return + crewai_event_bus.emit( self.agent, AgentLogsStartedEvent( agent_role=self.agent.role, - task_description=(self.task.description if self.task else "Not Found"), + task_description=self.task.description, verbose=self.agent.verbose or (hasattr(self, "crew") and getattr(self.crew, "verbose", False)), ), @@ -621,10 +719,12 @@ class CrewAgentExecutorFlow(Flow[AgentReActState], CrewAgentExecutorMixin): result: Agent's final output. human_feedback: Optional feedback from human. """ + # Early return if no crew (standalone mode) + if self.crew is None: + return + agent_id = str(self.agent.id) - train_iteration = ( - getattr(self.crew, "_train_iteration", None) if self.crew else None - ) + train_iteration = getattr(self.crew, "_train_iteration", None) if train_iteration is None or not isinstance(train_iteration, int): train_error = Text() @@ -806,3 +906,7 @@ class CrewAgentExecutorFlow(Flow[AgentReActState], CrewAgentExecutorMixin): requiring arbitrary_types_allowed=True. """ return core_schema.any_schema() + + +# Backward compatibility alias (deprecated) +CrewAgentExecutorFlow = AgentExecutor diff --git a/lib/crewai/src/crewai/flow/flow.py b/lib/crewai/src/crewai/flow/flow.py index dcc0c78bc..a3e5f69ac 100644 --- a/lib/crewai/src/crewai/flow/flow.py +++ b/lib/crewai/src/crewai/flow/flow.py @@ -12,6 +12,7 @@ from concurrent.futures import Future import copy import inspect import logging +import threading from typing import ( TYPE_CHECKING, Any, @@ -64,6 +65,7 @@ from crewai.flow.persistence.base import FlowPersistence from crewai.flow.types import FlowExecutionData, FlowMethodName, PendingListenerKey from crewai.flow.utils import ( _extract_all_methods, + _extract_all_methods_recursive, _normalize_condition, get_possible_return_constants, is_flow_condition_dict, @@ -73,6 +75,7 @@ from crewai.flow.utils import ( is_simple_flow_condition, ) + if TYPE_CHECKING: from crewai.flow.async_feedback.types import PendingFeedbackContext from crewai.flow.human_feedback import HumanFeedbackResult @@ -396,6 +399,62 @@ def and_(*conditions: str | FlowCondition | Callable[..., Any]) -> FlowCondition return {"type": AND_CONDITION, "conditions": processed_conditions} +class StateProxy(Generic[T]): + """Proxy that provides thread-safe access to flow state. + + Wraps state objects (dict or BaseModel) and uses a lock for all write + operations to prevent race conditions when parallel listeners modify state. + """ + + __slots__ = ("_proxy_lock", "_proxy_state") + + def __init__(self, state: T, lock: threading.Lock) -> None: + object.__setattr__(self, "_proxy_state", state) + object.__setattr__(self, "_proxy_lock", lock) + + def __getattr__(self, name: str) -> Any: + return getattr(object.__getattribute__(self, "_proxy_state"), name) + + def __setattr__(self, name: str, value: Any) -> None: + if name in ("_proxy_state", "_proxy_lock"): + object.__setattr__(self, name, value) + else: + with object.__getattribute__(self, "_proxy_lock"): + setattr(object.__getattribute__(self, "_proxy_state"), name, value) + + def __getitem__(self, key: str) -> Any: + return object.__getattribute__(self, "_proxy_state")[key] + + def __setitem__(self, key: str, value: Any) -> None: + with object.__getattribute__(self, "_proxy_lock"): + object.__getattribute__(self, "_proxy_state")[key] = value + + def __delitem__(self, key: str) -> None: + with object.__getattribute__(self, "_proxy_lock"): + del object.__getattribute__(self, "_proxy_state")[key] + + def __contains__(self, key: str) -> bool: + return key in object.__getattribute__(self, "_proxy_state") + + def __repr__(self) -> str: + return repr(object.__getattribute__(self, "_proxy_state")) + + def _unwrap(self) -> T: + """Return the underlying state object.""" + return cast(T, object.__getattribute__(self, "_proxy_state")) + + def model_dump(self) -> dict[str, Any]: + """Return state as a dictionary. + + Works for both dict and BaseModel underlying states. + """ + state = object.__getattribute__(self, "_proxy_state") + if isinstance(state, dict): + return state + result: dict[str, Any] = state.model_dump() + return result + + class FlowMeta(type): def __new__( mcs, @@ -519,7 +578,12 @@ class Flow(Generic[T], metaclass=FlowMeta): self._methods: dict[FlowMethodName, FlowMethod[Any, Any]] = {} self._method_execution_counts: dict[FlowMethodName, int] = {} self._pending_and_listeners: dict[PendingListenerKey, set[FlowMethodName]] = {} + self._fired_or_listeners: set[FlowMethodName] = ( + set() + ) # Track OR listeners that already fired self._method_outputs: list[Any] = [] # list to store all method outputs + self._state_lock = threading.Lock() + self._or_listeners_lock = threading.Lock() self._completed_methods: set[FlowMethodName] = ( set() ) # Track completed methods for reload @@ -564,13 +628,182 @@ class Flow(Generic[T], metaclass=FlowMeta): method = method.__get__(self, self.__class__) self._methods[method.__name__] = method + def _mark_or_listener_fired(self, listener_name: FlowMethodName) -> bool: + """Mark an OR listener as fired atomically. + + Args: + listener_name: The name of the OR listener to mark. + + Returns: + True if this call was the first to fire the listener. + False if the listener was already fired. + """ + with self._or_listeners_lock: + if listener_name in self._fired_or_listeners: + return False + self._fired_or_listeners.add(listener_name) + return True + + def _clear_or_listeners(self) -> None: + """Clear fired OR listeners for cyclic flows.""" + with self._or_listeners_lock: + self._fired_or_listeners.clear() + + def _discard_or_listener(self, listener_name: FlowMethodName) -> None: + """Discard a single OR listener from the fired set.""" + with self._or_listeners_lock: + self._fired_or_listeners.discard(listener_name) + + def _build_racing_groups(self) -> dict[frozenset[FlowMethodName], FlowMethodName]: + """Identify groups of methods that race for the same OR listener. + + Analyzes the flow graph to find listeners with OR conditions that have + multiple trigger methods. These trigger methods form a "racing group" + where only the first to complete should trigger the OR listener. + + Only methods that are EXCLUSIVELY sources for the OR listener are included + in the racing group. Methods that are also triggers for other listeners + (e.g., AND conditions) are not cancelled when another racing source wins. + + Returns: + Dictionary mapping frozensets of racing method names to their + shared OR listener name. + + Example: + If we have `@listen(or_(method_a, method_b))` on `handler`, + and method_a/method_b aren't used elsewhere, + this returns: {frozenset({'method_a', 'method_b'}): 'handler'} + """ + racing_groups: dict[frozenset[FlowMethodName], FlowMethodName] = {} + + method_to_listeners: dict[FlowMethodName, set[FlowMethodName]] = {} + for listener_name, condition_data in self._listeners.items(): + if is_simple_flow_condition(condition_data): + _, methods = condition_data + for m in methods: + method_to_listeners.setdefault(m, set()).add(listener_name) + elif is_flow_condition_dict(condition_data): + all_methods = _extract_all_methods_recursive(condition_data) + for m in all_methods: + method_name = FlowMethodName(m) if isinstance(m, str) else m + method_to_listeners.setdefault(method_name, set()).add( + listener_name + ) + + for listener_name, condition_data in self._listeners.items(): + if listener_name in self._routers: + continue + + trigger_methods: set[FlowMethodName] = set() + + if is_simple_flow_condition(condition_data): + condition_type, methods = condition_data + if condition_type == OR_CONDITION and len(methods) > 1: + trigger_methods = set(methods) + + elif is_flow_condition_dict(condition_data): + top_level_type = condition_data.get("type", OR_CONDITION) + if top_level_type == OR_CONDITION: + all_methods = _extract_all_methods_recursive(condition_data) + if len(all_methods) > 1: + trigger_methods = set( + FlowMethodName(m) if isinstance(m, str) else m + for m in all_methods + ) + + if trigger_methods: + exclusive_methods = { + m + for m in trigger_methods + if method_to_listeners.get(m, set()) == {listener_name} + } + if len(exclusive_methods) > 1: + racing_groups[frozenset(exclusive_methods)] = listener_name + + return racing_groups + + def _get_racing_group_for_listeners( + self, + listener_names: list[FlowMethodName], + ) -> tuple[frozenset[FlowMethodName], FlowMethodName] | None: + """Check if the given listeners form a racing group. + + Args: + listener_names: List of listener method names being executed. + + Returns: + Tuple of (racing_members, or_listener_name) if these listeners race, + None otherwise. + """ + if not hasattr(self, "_racing_groups_cache"): + self._racing_groups_cache = self._build_racing_groups() + + listener_set = set(listener_names) + + for racing_members, or_listener in self._racing_groups_cache.items(): + if racing_members & listener_set: + racing_subset = racing_members & listener_set + if len(racing_subset) > 1: + return (frozenset(racing_subset), or_listener) + + return None + + async def _execute_racing_listeners( + self, + racing_listeners: frozenset[FlowMethodName], + other_listeners: list[FlowMethodName], + result: Any, + ) -> None: + """Execute racing listeners with first-wins semantics. + + Racing listeners are executed in parallel, but once the first one + completes, the others are cancelled. Non-racing listeners in the + same batch are executed normally in parallel. + + Args: + racing_listeners: Set of listener names that race for an OR condition. + other_listeners: Other listeners to execute in parallel (not racing). + result: The result from the triggering method. + """ + racing_tasks = [ + asyncio.create_task( + self._execute_single_listener(name, result), + name=str(name), + ) + for name in racing_listeners + ] + + other_tasks = [ + asyncio.create_task( + self._execute_single_listener(name, result), + name=str(name), + ) + for name in other_listeners + ] + + if racing_tasks: + for coro in asyncio.as_completed(racing_tasks): + try: + await coro + except Exception as e: + logger.debug(f"Racing listener failed: {e}") + continue + break + + for task in racing_tasks: + if not task.done(): + task.cancel() + + if other_tasks: + await asyncio.gather(*other_tasks, return_exceptions=True) + @classmethod def from_pending( cls, flow_id: str, persistence: FlowPersistence | None = None, **kwargs: Any, - ) -> "Flow[Any]": + ) -> Flow[Any]: """Create a Flow instance from a pending feedback state. This classmethod is used to restore a flow that was paused waiting @@ -631,7 +864,7 @@ class Flow(Generic[T], metaclass=FlowMeta): return instance @property - def pending_feedback(self) -> "PendingFeedbackContext | None": + def pending_feedback(self) -> PendingFeedbackContext | None: """Get the pending feedback context if this flow is waiting for feedback. Returns: @@ -716,9 +949,10 @@ class Flow(Generic[T], metaclass=FlowMeta): Raises: ValueError: If no pending feedback context exists """ - from crewai.flow.human_feedback import HumanFeedbackResult from datetime import datetime + from crewai.flow.human_feedback import HumanFeedbackResult + if self._pending_feedback_context is None: raise ValueError( "No pending feedback context. Use from_pending() to restore a paused flow." @@ -740,12 +974,14 @@ class Flow(Generic[T], metaclass=FlowMeta): # No default and no feedback - use first outcome collapsed_outcome = emit[0] elif emit: - # Collapse feedback to outcome using LLM - collapsed_outcome = self._collapse_to_outcome( - feedback=feedback, - outcomes=emit, - llm=llm, - ) + if llm is not None: + collapsed_outcome = self._collapse_to_outcome( + feedback=feedback, + outcomes=emit, + llm=llm, + ) + else: + collapsed_outcome = emit[0] # Create result result = HumanFeedbackResult( @@ -784,21 +1020,16 @@ class Flow(Generic[T], metaclass=FlowMeta): # This allows methods to re-execute in loops (e.g., implement_changes → suggest_changes → implement_changes) self._is_execution_resuming = False - # Determine what to pass to listeners + final_result: Any = result try: if emit and collapsed_outcome: - # Router behavior - the outcome itself triggers listeners - # First, add the outcome to method outputs as a router would self._method_outputs.append(collapsed_outcome) - - # Then trigger listeners for the outcome (e.g., "approved" triggers @listen("approved")) - final_result = await self._execute_listeners( - FlowMethodName(collapsed_outcome), # Use outcome as trigger - result, # Pass HumanFeedbackResult to listeners + await self._execute_listeners( + FlowMethodName(collapsed_outcome), + result, ) else: - # Normal behavior - pass the HumanFeedbackResult - final_result = await self._execute_listeners( + await self._execute_listeners( FlowMethodName(context.method_name), result, ) @@ -894,18 +1125,17 @@ class Flow(Generic[T], metaclass=FlowMeta): # Handle case where initial_state is a type (class) if isinstance(self.initial_state, type): - if issubclass(self.initial_state, FlowState): - return self.initial_state() # Uses model defaults - if issubclass(self.initial_state, BaseModel): - # Validate that the model has an id field - model_fields = getattr(self.initial_state, "model_fields", None) + state_class: type[T] = self.initial_state + if issubclass(state_class, FlowState): + return state_class() + if issubclass(state_class, BaseModel): + model_fields = getattr(state_class, "model_fields", None) if not model_fields or "id" not in model_fields: raise ValueError("Flow state model must have an 'id' field") - instance = self.initial_state() - # Ensure id is set - generate UUID if empty - if not getattr(instance, "id", None): - object.__setattr__(instance, "id", str(uuid4())) - return instance + model_instance = state_class() + if not getattr(model_instance, "id", None): + object.__setattr__(model_instance, "id", str(uuid4())) + return model_instance if self.initial_state is dict: return cast(T, {"id": str(uuid4())}) @@ -970,7 +1200,7 @@ class Flow(Generic[T], metaclass=FlowMeta): @property def state(self) -> T: - return self._state + return StateProxy(self._state, self._state_lock) # type: ignore[return-value] @property def method_outputs(self) -> list[Any]: @@ -1295,6 +1525,7 @@ class Flow(Generic[T], metaclass=FlowMeta): self._completed_methods.clear() self._method_outputs.clear() self._pending_and_listeners.clear() + self._clear_or_listeners() else: # We're restoring from persistence, set the flag self._is_execution_resuming = True @@ -1346,9 +1577,26 @@ class Flow(Generic[T], metaclass=FlowMeta): self._initialize_state(inputs) try: + # Determine which start methods to execute at kickoff + # Conditional start methods (with __trigger_methods__) are only triggered by their conditions + # UNLESS there are no unconditional starts (then all starts run as entry points) + unconditional_starts = [ + start_method + for start_method in self._start_methods + if not getattr( + self._methods.get(start_method), "__trigger_methods__", None + ) + ] + # If there are unconditional starts, only run those at kickoff + # If there are NO unconditional starts, run all starts (including conditional ones) + starts_to_execute = ( + unconditional_starts + if unconditional_starts + else self._start_methods + ) tasks = [ self._execute_start_method(start_method) - for start_method in self._start_methods + for start_method in starts_to_execute ] await asyncio.gather(*tasks) except Exception as e: @@ -1431,13 +1679,14 @@ class Flow(Generic[T], metaclass=FlowMeta): ) self._event_futures.clear() - 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() + if not self.suppress_flow_events: + 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: @@ -1481,6 +1730,8 @@ class Flow(Generic[T], metaclass=FlowMeta): return # For cyclic flows, clear from completed to allow re-execution self._completed_methods.discard(start_method_name) + # Also clear fired OR listeners to allow them to fire again in new cycle + self._clear_or_listeners() method = self._methods[start_method_name] enhanced_method = self._inject_trigger_payload_for_start_method(method) @@ -1503,11 +1754,25 @@ class Flow(Generic[T], metaclass=FlowMeta): if self.last_human_feedback is not None else result ) - tasks = [ - self._execute_single_listener(listener_name, listener_result) - for listener_name in listeners_for_result - ] - await asyncio.gather(*tasks) + racing_group = self._get_racing_group_for_listeners( + listeners_for_result + ) + if racing_group: + racing_members, _ = racing_group + other_listeners = [ + name + for name in listeners_for_result + if name not in racing_members + ] + await self._execute_racing_listeners( + racing_members, other_listeners, listener_result + ) + else: + tasks = [ + self._execute_single_listener(listener_name, listener_result) + for listener_name in listeners_for_result + ] + await asyncio.gather(*tasks) else: await self._execute_listeners(start_method_name, result) @@ -1573,11 +1838,19 @@ class Flow(Generic[T], metaclass=FlowMeta): if future: self._event_futures.append(future) - result = ( - await method(*args, **kwargs) - if asyncio.iscoroutinefunction(method) - else method(*args, **kwargs) - ) + if asyncio.iscoroutinefunction(method): + result = await method(*args, **kwargs) + else: + # Run sync methods in thread pool for isolation + # This allows Agent.kickoff() to work synchronously inside Flow methods + import contextvars + + ctx = contextvars.copy_context() + result = await asyncio.to_thread(ctx.run, method, *args, **kwargs) + + # Auto-await coroutines returned from sync methods (enables AgentExecutor pattern) + if asyncio.iscoroutine(result): + result = await result self._method_outputs.append(result) self._method_execution_counts[method_name] = ( @@ -1724,11 +1997,27 @@ class Flow(Generic[T], metaclass=FlowMeta): listener_result = router_result_to_feedback.get( str(current_trigger), result ) - tasks = [ - self._execute_single_listener(listener_name, listener_result) - for listener_name in listeners_triggered - ] - await asyncio.gather(*tasks) + racing_group = self._get_racing_group_for_listeners( + listeners_triggered + ) + if racing_group: + racing_members, _ = racing_group + other_listeners = [ + name + for name in listeners_triggered + if name not in racing_members + ] + await self._execute_racing_listeners( + racing_members, other_listeners, listener_result + ) + else: + tasks = [ + self._execute_single_listener( + listener_name, listener_result + ) + for listener_name in listeners_triggered + ] + await asyncio.gather(*tasks) if current_trigger in router_results: # Find start methods triggered by this router result @@ -1745,14 +2034,16 @@ class Flow(Generic[T], metaclass=FlowMeta): should_trigger = current_trigger in all_methods if should_trigger: - # Only execute if this is a cycle (method was already completed) + # Execute conditional start method triggered by router result if method_name in self._completed_methods: - # For router-triggered start methods in cycles, temporarily clear resumption flag - # to allow cyclic execution + # For cyclic re-execution, temporarily clear resumption flag was_resuming = self._is_execution_resuming self._is_execution_resuming = False await self._execute_start_method(method_name) self._is_execution_resuming = was_resuming + else: + # First-time execution of conditional start + await self._execute_start_method(method_name) def _evaluate_condition( self, @@ -1850,8 +2141,21 @@ class Flow(Generic[T], metaclass=FlowMeta): condition_type, methods = condition_data if condition_type == OR_CONDITION: - if trigger_method in methods: - triggered.append(listener_name) + # Only trigger multi-source OR listeners (or_(A, B, C)) once - skip if already fired + # Simple single-method listeners fire every time their trigger occurs + # Routers also fire every time - they're decision points + has_multiple_triggers = len(methods) > 1 + should_check_fired = has_multiple_triggers and not is_router + + if ( + not should_check_fired + or listener_name not in self._fired_or_listeners + ): + if trigger_method in methods: + triggered.append(listener_name) + # Only track multi-source OR listeners (not single-method or routers) + if should_check_fired: + self._fired_or_listeners.add(listener_name) elif condition_type == AND_CONDITION: pending_key = PendingListenerKey(listener_name) if pending_key not in self._pending_and_listeners: @@ -1864,10 +2168,26 @@ class Flow(Generic[T], metaclass=FlowMeta): self._pending_and_listeners.pop(pending_key, None) elif is_flow_condition_dict(condition_data): + # For complex conditions, check if top-level is OR and track accordingly + top_level_type = condition_data.get("type", OR_CONDITION) + is_or_based = top_level_type == OR_CONDITION + + # Only track multi-source OR conditions (multiple sub-conditions), not routers + sub_conditions = condition_data.get("conditions", []) + has_multiple_triggers = is_or_based and len(sub_conditions) > 1 + should_check_fired = has_multiple_triggers and not is_router + + # Skip compound OR-based listeners that have already fired + if should_check_fired and listener_name in self._fired_or_listeners: + continue + if self._evaluate_condition( condition_data, trigger_method, listener_name ): triggered.append(listener_name) + # Track compound OR-based listeners so they only fire once + if should_check_fired: + self._fired_or_listeners.add(listener_name) return triggered @@ -1896,9 +2216,22 @@ class Flow(Generic[T], metaclass=FlowMeta): if self._is_execution_resuming: # During resumption, skip execution but continue listeners await self._execute_listeners(listener_name, None) + + # For routers, also check if any conditional starts they triggered are completed + # If so, continue their chains + if listener_name in self._routers: + for start_method_name in self._start_methods: + if ( + start_method_name in self._listeners + and start_method_name in self._completed_methods + ): + # This conditional start was executed, continue its chain + await self._execute_start_method(start_method_name) return # For cyclic flows, clear from completed to allow re-execution self._completed_methods.discard(listener_name) + # Also clear from fired OR listeners for cyclic flows + self._discard_or_listener(listener_name) try: method = self._methods[listener_name] @@ -1931,11 +2264,25 @@ class Flow(Generic[T], metaclass=FlowMeta): if self.last_human_feedback is not None else listener_result ) - tasks = [ - self._execute_single_listener(name, feedback_result) - for name in listeners_for_result - ] - await asyncio.gather(*tasks) + racing_group = self._get_racing_group_for_listeners( + listeners_for_result + ) + if racing_group: + racing_members, _ = racing_group + other_listeners = [ + name + for name in listeners_for_result + if name not in racing_members + ] + await self._execute_racing_listeners( + racing_members, other_listeners, feedback_result + ) + else: + tasks = [ + self._execute_single_listener(name, feedback_result) + for name in listeners_for_result + ] + await asyncio.gather(*tasks) except Exception as e: # Don't log HumanFeedbackPending as an error - it's expected control flow @@ -2049,7 +2396,7 @@ class Flow(Generic[T], metaclass=FlowMeta): from crewai.llms.base_llm import BaseLLM as BaseLLMClass from crewai.utilities.i18n import get_i18n - # Get or create LLM instance + llm_instance: BaseLLMClass if isinstance(llm, str): llm_instance = LLM(model=llm) elif isinstance(llm, BaseLLMClass): @@ -2084,26 +2431,23 @@ class Flow(Generic[T], metaclass=FlowMeta): response_model=FeedbackOutcome, ) - # Parse the response - LLM returns JSON string when using response_model if isinstance(response, str): import json try: parsed = json.loads(response) - return parsed.get("outcome", outcomes[0]) + return str(parsed.get("outcome", outcomes[0])) except json.JSONDecodeError: - # Not valid JSON, might be raw outcome string response_clean = response.strip() for outcome in outcomes: if outcome.lower() == response_clean.lower(): return outcome return outcomes[0] elif isinstance(response, FeedbackOutcome): - return response.outcome + return str(response.outcome) elif hasattr(response, "outcome"): - return response.outcome + return str(response.outcome) else: - # Unexpected type, fall back to first outcome logger.warning(f"Unexpected response type: {type(response)}") return outcomes[0] diff --git a/lib/crewai/src/crewai/flow/persistence/decorators.py b/lib/crewai/src/crewai/flow/persistence/decorators.py index 3f5be17db..dbbeaa16f 100644 --- a/lib/crewai/src/crewai/flow/persistence/decorators.py +++ b/lib/crewai/src/crewai/flow/persistence/decorators.py @@ -61,7 +61,7 @@ class PersistenceDecorator: @classmethod def persist_state( cls, - flow_instance: Flow, + flow_instance: Flow[Any], method_name: str, persistence_instance: FlowPersistence, verbose: bool = False, @@ -90,7 +90,13 @@ class PersistenceDecorator: flow_uuid: str | None = None if isinstance(state, dict): flow_uuid = state.get("id") - elif isinstance(state, BaseModel): + elif hasattr(state, "_unwrap"): + unwrapped = state._unwrap() + if isinstance(unwrapped, dict): + flow_uuid = unwrapped.get("id") + else: + flow_uuid = getattr(unwrapped, "id", None) + elif isinstance(state, BaseModel) or hasattr(state, "id"): flow_uuid = getattr(state, "id", None) if not flow_uuid: @@ -104,10 +110,11 @@ class PersistenceDecorator: logger.info(LOG_MESSAGES["save_state"].format(flow_uuid)) try: + state_data = state._unwrap() if hasattr(state, "_unwrap") else state persistence_instance.save_state( flow_uuid=flow_uuid, method_name=method_name, - state_data=state, + state_data=state_data, ) except Exception as e: error_msg = LOG_MESSAGES["save_error"].format(method_name, str(e)) @@ -126,7 +133,9 @@ class PersistenceDecorator: raise ValueError(error_msg) from e -def persist(persistence: FlowPersistence | None = None, verbose: bool = False): +def persist( + persistence: FlowPersistence | None = None, verbose: bool = False +) -> Callable[[type | Callable[..., T]], type | Callable[..., T]]: """Decorator to persist flow state. This decorator can be applied at either the class level or method level. @@ -189,8 +198,8 @@ def persist(persistence: FlowPersistence | None = None, verbose: bool = False): if asyncio.iscoroutinefunction(method): # Create a closure to capture the current name and method def create_async_wrapper( - method_name: str, original_method: Callable - ): + method_name: str, original_method: Callable[..., Any] + ) -> Callable[..., Any]: @functools.wraps(original_method) async def method_wrapper( self: Any, *args: Any, **kwargs: Any @@ -221,8 +230,8 @@ def persist(persistence: FlowPersistence | None = None, verbose: bool = False): else: # Create a closure to capture the current name and method def create_sync_wrapper( - method_name: str, original_method: Callable - ): + method_name: str, original_method: Callable[..., Any] + ) -> Callable[..., Any]: @functools.wraps(original_method) def method_wrapper(self: Any, *args: Any, **kwargs: Any) -> Any: result = original_method(self, *args, **kwargs) @@ -268,7 +277,7 @@ def persist(persistence: FlowPersistence | None = None, verbose: bool = False): PersistenceDecorator.persist_state( flow_instance, method.__name__, actual_persistence, verbose ) - return result + return cast(T, result) for attr in [ "__is_start_method__", diff --git a/lib/crewai/src/crewai/lite_agent.py b/lib/crewai/src/crewai/lite_agent.py index 9bb3193e5..b59f230a7 100644 --- a/lib/crewai/src/crewai/lite_agent.py +++ b/lib/crewai/src/crewai/lite_agent.py @@ -10,6 +10,7 @@ from typing import ( get_origin, ) import uuid +import warnings from pydantic import ( UUID4, @@ -80,6 +81,11 @@ class LiteAgent(FlowTrackable, BaseModel): """ A lightweight agent that can process messages and use tools. + .. deprecated:: + LiteAgent is deprecated and will be removed in a future version. + Use ``Agent().kickoff(messages)`` instead, which provides the same + functionality with additional features like memory and knowledge support. + This agent is simpler than the full Agent class, focusing on direct execution rather than task delegation. It's designed to be used for simple interactions where a full crew is not needed. @@ -164,6 +170,18 @@ class LiteAgent(FlowTrackable, BaseModel): default_factory=get_after_llm_call_hooks ) + @model_validator(mode="after") + def emit_deprecation_warning(self) -> Self: + """Emit deprecation warning for LiteAgent usage.""" + warnings.warn( + "LiteAgent is deprecated and will be removed in a future version. " + "Use Agent().kickoff(messages) instead, which provides the same " + "functionality with additional features like memory and knowledge support.", + DeprecationWarning, + stacklevel=2, + ) + return self + @model_validator(mode="after") def setup_llm(self) -> Self: """Set up the LLM and other components after initialization.""" diff --git a/lib/crewai/src/crewai/utilities/agent_utils.py b/lib/crewai/src/crewai/utilities/agent_utils.py index 973ad5596..2249e0d6e 100644 --- a/lib/crewai/src/crewai/utilities/agent_utils.py +++ b/lib/crewai/src/crewai/utilities/agent_utils.py @@ -1,5 +1,6 @@ from __future__ import annotations +import asyncio from collections.abc import Callable, Sequence import json import re @@ -54,6 +55,23 @@ console = Console() _MULTIPLE_NEWLINES: Final[re.Pattern[str]] = re.compile(r"\n+") +def is_inside_event_loop() -> bool: + """Check if code is currently running inside an asyncio event loop. + + This is used to detect when code is being called from within an async context + (e.g., inside a Flow). In such cases, callers should return a coroutine + instead of executing synchronously to avoid nested event loop errors. + + Returns: + True if inside a running event loop, False otherwise. + """ + try: + asyncio.get_running_loop() + return True + except RuntimeError: + return False + + def parse_tools(tools: list[BaseTool]) -> list[CrewStructuredTool]: """Parse tools to be used for the task. diff --git a/lib/crewai/tests/agents/test_crew_agent_executor_flow.py b/lib/crewai/tests/agents/test_agent_executor.py similarity index 82% rename from lib/crewai/tests/agents/test_crew_agent_executor_flow.py rename to lib/crewai/tests/agents/test_agent_executor.py index 36fd887eb..8560d9321 100644 --- a/lib/crewai/tests/agents/test_crew_agent_executor_flow.py +++ b/lib/crewai/tests/agents/test_agent_executor.py @@ -1,4 +1,4 @@ -"""Unit tests for CrewAgentExecutorFlow. +"""Unit tests for AgentExecutor. Tests the Flow-based agent executor implementation including state management, flow methods, routing logic, and error handling. @@ -8,9 +8,9 @@ from unittest.mock import Mock, patch import pytest -from crewai.experimental.crew_agent_executor_flow import ( +from crewai.experimental.agent_executor import ( AgentReActState, - CrewAgentExecutorFlow, + AgentExecutor, ) from crewai.agents.parser import AgentAction, AgentFinish @@ -43,8 +43,8 @@ class TestAgentReActState: assert state.ask_for_human_input is True -class TestCrewAgentExecutorFlow: - """Test CrewAgentExecutorFlow class.""" +class TestAgentExecutor: + """Test AgentExecutor class.""" @pytest.fixture def mock_dependencies(self): @@ -87,8 +87,8 @@ class TestCrewAgentExecutorFlow: } def test_executor_initialization(self, mock_dependencies): - """Test CrewAgentExecutorFlow initialization.""" - executor = CrewAgentExecutorFlow(**mock_dependencies) + """Test AgentExecutor initialization.""" + executor = AgentExecutor(**mock_dependencies) assert executor.llm == mock_dependencies["llm"] assert executor.task == mock_dependencies["task"] @@ -100,9 +100,9 @@ class TestCrewAgentExecutorFlow: def test_initialize_reasoning(self, mock_dependencies): """Test flow entry point.""" with patch.object( - CrewAgentExecutorFlow, "_show_start_logs" + AgentExecutor, "_show_start_logs" ) as mock_show_start: - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) result = executor.initialize_reasoning() assert result == "initialized" @@ -110,7 +110,7 @@ class TestCrewAgentExecutorFlow: def test_check_max_iterations_not_reached(self, mock_dependencies): """Test routing when iterations < max.""" - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) executor.state.iterations = 5 result = executor.check_max_iterations() @@ -118,7 +118,7 @@ class TestCrewAgentExecutorFlow: def test_check_max_iterations_reached(self, mock_dependencies): """Test routing when iterations >= max.""" - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) executor.state.iterations = 10 result = executor.check_max_iterations() @@ -126,7 +126,7 @@ class TestCrewAgentExecutorFlow: def test_route_by_answer_type_action(self, mock_dependencies): """Test routing for AgentAction.""" - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) executor.state.current_answer = AgentAction( thought="thinking", tool="search", tool_input="query", text="action text" ) @@ -136,7 +136,7 @@ class TestCrewAgentExecutorFlow: def test_route_by_answer_type_finish(self, mock_dependencies): """Test routing for AgentFinish.""" - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) executor.state.current_answer = AgentFinish( thought="final thoughts", output="Final answer", text="complete" ) @@ -146,7 +146,7 @@ class TestCrewAgentExecutorFlow: def test_continue_iteration(self, mock_dependencies): """Test iteration continuation.""" - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) result = executor.continue_iteration() @@ -154,8 +154,8 @@ class TestCrewAgentExecutorFlow: def test_finalize_success(self, mock_dependencies): """Test finalize with valid AgentFinish.""" - with patch.object(CrewAgentExecutorFlow, "_show_logs") as mock_show_logs: - executor = CrewAgentExecutorFlow(**mock_dependencies) + with patch.object(AgentExecutor, "_show_logs") as mock_show_logs: + executor = AgentExecutor(**mock_dependencies) executor.state.current_answer = AgentFinish( thought="final thinking", output="Done", text="complete" ) @@ -168,7 +168,7 @@ class TestCrewAgentExecutorFlow: def test_finalize_failure(self, mock_dependencies): """Test finalize skips when given AgentAction instead of AgentFinish.""" - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) executor.state.current_answer = AgentAction( thought="thinking", tool="search", tool_input="query", text="action text" ) @@ -181,7 +181,7 @@ class TestCrewAgentExecutorFlow: def test_format_prompt(self, mock_dependencies): """Test prompt formatting.""" - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) inputs = {"input": "test input", "tool_names": "tool1, tool2", "tools": "desc"} result = executor._format_prompt("Prompt {input} {tool_names} {tools}", inputs) @@ -192,18 +192,18 @@ class TestCrewAgentExecutorFlow: def test_is_training_mode_false(self, mock_dependencies): """Test training mode detection when not in training.""" - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) assert executor._is_training_mode() is False def test_is_training_mode_true(self, mock_dependencies): """Test training mode detection when in training.""" mock_dependencies["crew"]._train = True - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) assert executor._is_training_mode() is True def test_append_message_to_state(self, mock_dependencies): """Test message appending to state.""" - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) initial_count = len(executor.state.messages) executor._append_message_to_state("test message") @@ -216,7 +216,7 @@ class TestCrewAgentExecutorFlow: callback = Mock() mock_dependencies["step_callback"] = callback - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) answer = AgentFinish(thought="thinking", output="test", text="final") executor._invoke_step_callback(answer) @@ -226,14 +226,14 @@ class TestCrewAgentExecutorFlow: def test_invoke_step_callback_none(self, mock_dependencies): """Test step callback when none provided.""" mock_dependencies["step_callback"] = None - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) # Should not raise error executor._invoke_step_callback( AgentFinish(thought="thinking", output="test", text="final") ) - @patch("crewai.experimental.crew_agent_executor_flow.handle_output_parser_exception") + @patch("crewai.experimental.agent_executor.handle_output_parser_exception") def test_recover_from_parser_error( self, mock_handle_exception, mock_dependencies ): @@ -242,7 +242,7 @@ class TestCrewAgentExecutorFlow: mock_handle_exception.return_value = None - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) executor._last_parser_error = OutputParserError("test error") initial_iterations = executor.state.iterations @@ -252,12 +252,12 @@ class TestCrewAgentExecutorFlow: assert executor.state.iterations == initial_iterations + 1 mock_handle_exception.assert_called_once() - @patch("crewai.experimental.crew_agent_executor_flow.handle_context_length") + @patch("crewai.experimental.agent_executor.handle_context_length") def test_recover_from_context_length( self, mock_handle_context, mock_dependencies ): """Test recovery from context length error.""" - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) executor._last_context_error = Exception("context too long") initial_iterations = executor.state.iterations @@ -270,16 +270,16 @@ class TestCrewAgentExecutorFlow: def test_use_stop_words_property(self, mock_dependencies): """Test use_stop_words property.""" mock_dependencies["llm"].supports_stop_words.return_value = True - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) assert executor.use_stop_words is True mock_dependencies["llm"].supports_stop_words.return_value = False - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) assert executor.use_stop_words is False def test_compatibility_properties(self, mock_dependencies): """Test compatibility properties for mixin.""" - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) executor.state.messages = [{"role": "user", "content": "test"}] executor.state.iterations = 5 @@ -321,8 +321,8 @@ class TestFlowErrorHandling: "tools_handler": Mock(), } - @patch("crewai.experimental.crew_agent_executor_flow.get_llm_response") - @patch("crewai.experimental.crew_agent_executor_flow.enforce_rpm_limit") + @patch("crewai.experimental.agent_executor.get_llm_response") + @patch("crewai.experimental.agent_executor.enforce_rpm_limit") def test_call_llm_parser_error( self, mock_enforce_rpm, mock_get_llm, mock_dependencies ): @@ -332,15 +332,15 @@ class TestFlowErrorHandling: mock_enforce_rpm.return_value = None mock_get_llm.side_effect = OutputParserError("parse failed") - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) result = executor.call_llm_and_parse() assert result == "parser_error" assert executor._last_parser_error is not None - @patch("crewai.experimental.crew_agent_executor_flow.get_llm_response") - @patch("crewai.experimental.crew_agent_executor_flow.enforce_rpm_limit") - @patch("crewai.experimental.crew_agent_executor_flow.is_context_length_exceeded") + @patch("crewai.experimental.agent_executor.get_llm_response") + @patch("crewai.experimental.agent_executor.enforce_rpm_limit") + @patch("crewai.experimental.agent_executor.is_context_length_exceeded") def test_call_llm_context_error( self, mock_is_context_exceeded, @@ -353,7 +353,7 @@ class TestFlowErrorHandling: mock_get_llm.side_effect = Exception("context length") mock_is_context_exceeded.return_value = True - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) result = executor.call_llm_and_parse() assert result == "context_error" @@ -397,10 +397,10 @@ class TestFlowInvoke: "tools_handler": Mock(), } - @patch.object(CrewAgentExecutorFlow, "kickoff") - @patch.object(CrewAgentExecutorFlow, "_create_short_term_memory") - @patch.object(CrewAgentExecutorFlow, "_create_long_term_memory") - @patch.object(CrewAgentExecutorFlow, "_create_external_memory") + @patch.object(AgentExecutor, "kickoff") + @patch.object(AgentExecutor, "_create_short_term_memory") + @patch.object(AgentExecutor, "_create_long_term_memory") + @patch.object(AgentExecutor, "_create_external_memory") def test_invoke_success( self, mock_external_memory, @@ -410,7 +410,7 @@ class TestFlowInvoke: mock_dependencies, ): """Test successful invoke without human feedback.""" - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) # Mock kickoff to set the final answer in state def mock_kickoff_side_effect(): @@ -429,10 +429,10 @@ class TestFlowInvoke: mock_long_term_memory.assert_called_once() mock_external_memory.assert_called_once() - @patch.object(CrewAgentExecutorFlow, "kickoff") + @patch.object(AgentExecutor, "kickoff") def test_invoke_failure_no_agent_finish(self, mock_kickoff, mock_dependencies): """Test invoke fails without AgentFinish.""" - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) executor.state.current_answer = AgentAction( thought="thinking", tool="test", tool_input="test", text="action text" ) @@ -442,10 +442,10 @@ class TestFlowInvoke: with pytest.raises(RuntimeError, match="without reaching a final answer"): executor.invoke(inputs) - @patch.object(CrewAgentExecutorFlow, "kickoff") - @patch.object(CrewAgentExecutorFlow, "_create_short_term_memory") - @patch.object(CrewAgentExecutorFlow, "_create_long_term_memory") - @patch.object(CrewAgentExecutorFlow, "_create_external_memory") + @patch.object(AgentExecutor, "kickoff") + @patch.object(AgentExecutor, "_create_short_term_memory") + @patch.object(AgentExecutor, "_create_long_term_memory") + @patch.object(AgentExecutor, "_create_external_memory") def test_invoke_with_system_prompt( self, mock_external_memory, @@ -459,7 +459,7 @@ class TestFlowInvoke: "system": "System: {input}", "user": "User: {input} {tool_names} {tools}", } - executor = CrewAgentExecutorFlow(**mock_dependencies) + executor = AgentExecutor(**mock_dependencies) def mock_kickoff_side_effect(): executor.state.current_answer = AgentFinish( diff --git a/lib/crewai/tests/agents/test_lite_agent.py b/lib/crewai/tests/agents/test_lite_agent.py index 5eac82f19..3049847eb 100644 --- a/lib/crewai/tests/agents/test_lite_agent.py +++ b/lib/crewai/tests/agents/test_lite_agent.py @@ -72,62 +72,53 @@ class ResearchResult(BaseModel): @pytest.mark.vcr() @pytest.mark.parametrize("verbose", [True, False]) -def test_lite_agent_created_with_correct_parameters(monkeypatch, verbose): - """Test that LiteAgent is created with the correct parameters when Agent.kickoff() is called.""" +def test_agent_kickoff_preserves_parameters(verbose): + """Test that Agent.kickoff() uses the correct parameters from the Agent.""" # Create a test agent with specific parameters - llm = LLM(model="gpt-4o-mini") + mock_llm = Mock(spec=LLM) + mock_llm.call.return_value = "Final Answer: Test response" + mock_llm.stop = [] + + from crewai.types.usage_metrics import UsageMetrics + + mock_usage_metrics = UsageMetrics( + total_tokens=100, + prompt_tokens=50, + completion_tokens=50, + cached_prompt_tokens=0, + successful_requests=1, + ) + mock_llm.get_token_usage_summary.return_value = mock_usage_metrics + custom_tools = [WebSearchTool(), CalculatorTool()] max_iter = 10 - max_execution_time = 300 agent = Agent( role="Test Agent", goal="Test Goal", backstory="Test Backstory", - llm=llm, + llm=mock_llm, tools=custom_tools, max_iter=max_iter, - max_execution_time=max_execution_time, verbose=verbose, ) - # Create a mock to capture the created LiteAgent - created_lite_agent = None - original_lite_agent = LiteAgent + # Call kickoff and verify it works + result = agent.kickoff("Test query") - # Define a mock LiteAgent class that captures its arguments - class MockLiteAgent(original_lite_agent): - def __init__(self, **kwargs): - nonlocal created_lite_agent - created_lite_agent = kwargs - super().__init__(**kwargs) + # Verify the agent was configured correctly + assert agent.role == "Test Agent" + assert agent.goal == "Test Goal" + assert agent.backstory == "Test Backstory" + assert len(agent.tools) == 2 + assert isinstance(agent.tools[0], WebSearchTool) + assert isinstance(agent.tools[1], CalculatorTool) + assert agent.max_iter == max_iter + assert agent.verbose == verbose - # Patch the LiteAgent class - monkeypatch.setattr("crewai.agent.core.LiteAgent", MockLiteAgent) - - # Call kickoff to create the LiteAgent - agent.kickoff("Test query") - - # Verify all parameters were passed correctly - assert created_lite_agent is not None - assert created_lite_agent["role"] == "Test Agent" - assert created_lite_agent["goal"] == "Test Goal" - assert created_lite_agent["backstory"] == "Test Backstory" - assert created_lite_agent["llm"] == llm - assert len(created_lite_agent["tools"]) == 2 - assert isinstance(created_lite_agent["tools"][0], WebSearchTool) - assert isinstance(created_lite_agent["tools"][1], CalculatorTool) - assert created_lite_agent["max_iterations"] == max_iter - assert created_lite_agent["max_execution_time"] == max_execution_time - assert created_lite_agent["verbose"] == verbose - assert created_lite_agent["response_format"] is None - - # Test with a response_format - class TestResponse(BaseModel): - test_field: str - - agent.kickoff("Test query", response_format=TestResponse) - assert created_lite_agent["response_format"] == TestResponse + # Verify kickoff returned a result + assert result is not None + assert result.raw is not None @pytest.mark.vcr() @@ -310,7 +301,8 @@ def verify_agent_parent_flow(result, agent, flow): def test_sets_parent_flow_when_inside_flow(): - captured_agent = None + """Test that an Agent can be created and executed inside a Flow context.""" + captured_event = None mock_llm = Mock(spec=LLM) mock_llm.call.return_value = "Test response" @@ -343,15 +335,17 @@ def test_sets_parent_flow_when_inside_flow(): event_received = threading.Event() @crewai_event_bus.on(LiteAgentExecutionStartedEvent) - def capture_agent(source, event): - nonlocal captured_agent - captured_agent = source + def capture_event(source, event): + nonlocal captured_event + captured_event = event event_received.set() - flow.kickoff() + result = flow.kickoff() assert event_received.wait(timeout=5), "Timeout waiting for agent execution event" - assert captured_agent.parent_flow is flow + assert captured_event is not None + assert captured_event.agent_info["role"] == "Test Agent" + assert result is not None @pytest.mark.vcr() @@ -373,16 +367,14 @@ def test_guardrail_is_called_using_string(): @crewai_event_bus.on(LLMGuardrailStartedEvent) def capture_guardrail_started(source, event): - assert isinstance(source, LiteAgent) - assert source.original_agent == agent + assert isinstance(source, Agent) with condition: guardrail_events["started"].append(event) condition.notify() @crewai_event_bus.on(LLMGuardrailCompletedEvent) def capture_guardrail_completed(source, event): - assert isinstance(source, LiteAgent) - assert source.original_agent == agent + assert isinstance(source, Agent) with condition: guardrail_events["completed"].append(event) condition.notify() @@ -683,3 +675,151 @@ def test_agent_kickoff_with_mcp_tools(mock_get_mcp_tools): # Verify MCP tools were retrieved mock_get_mcp_tools.assert_called_once_with("https://mcp.exa.ai/mcp?api_key=test_exa_key&profile=research") + + +# ============================================================================ +# Tests for LiteAgent inside Flow (magic auto-async pattern) +# ============================================================================ + +from crewai.flow.flow import listen + + +@pytest.mark.vcr() +def test_lite_agent_inside_flow_sync(): + """Test that LiteAgent.kickoff() works magically inside a Flow. + + This tests the "magic auto-async" pattern where calling agent.kickoff() + from within a Flow automatically detects the event loop and returns a + coroutine that the Flow framework awaits. Users don't need to use async/await. + """ + # Track execution + execution_log = [] + + class TestFlow(Flow): + @start() + def run_agent(self): + execution_log.append("flow_started") + agent = Agent( + role="Test Agent", + goal="Answer questions", + backstory="A helpful test assistant", + llm=LLM(model="gpt-4o-mini"), + verbose=False, + ) + # Magic: just call kickoff() normally - it auto-detects Flow context + result = agent.kickoff(messages="What is 2+2? Reply with just the number.") + execution_log.append("agent_completed") + return result + + flow = TestFlow() + result = flow.kickoff() + + # Verify the flow executed successfully + assert "flow_started" in execution_log + assert "agent_completed" in execution_log + assert result is not None + assert isinstance(result, LiteAgentOutput) + + +@pytest.mark.vcr() +def test_lite_agent_inside_flow_with_tools(): + """Test that LiteAgent with tools works correctly inside a Flow.""" + class TestFlow(Flow): + @start() + def run_agent_with_tools(self): + agent = Agent( + role="Calculator Agent", + goal="Perform calculations", + backstory="A math expert", + llm=LLM(model="gpt-4o-mini"), + tools=[CalculatorTool()], + verbose=False, + ) + result = agent.kickoff(messages="Calculate 10 * 5") + return result + + flow = TestFlow() + result = flow.kickoff() + + assert result is not None + assert isinstance(result, LiteAgentOutput) + assert result.raw is not None + + +@pytest.mark.vcr() +def test_multiple_agents_in_same_flow(): + """Test that multiple LiteAgents can run sequentially in the same Flow.""" + class MultiAgentFlow(Flow): + @start() + def first_step(self): + agent1 = Agent( + role="First Agent", + goal="Greet users", + backstory="A friendly greeter", + llm=LLM(model="gpt-4o-mini"), + verbose=False, + ) + return agent1.kickoff(messages="Say hello") + + @listen(first_step) + def second_step(self, first_result): + agent2 = Agent( + role="Second Agent", + goal="Say goodbye", + backstory="A polite farewell agent", + llm=LLM(model="gpt-4o-mini"), + verbose=False, + ) + return agent2.kickoff(messages="Say goodbye") + + flow = MultiAgentFlow() + result = flow.kickoff() + + assert result is not None + assert isinstance(result, LiteAgentOutput) + + +@pytest.mark.vcr() +def test_lite_agent_kickoff_async_inside_flow(): + """Test that Agent.kickoff_async() works correctly from async Flow methods.""" + class AsyncAgentFlow(Flow): + @start() + async def async_agent_step(self): + agent = Agent( + role="Async Test Agent", + goal="Answer questions asynchronously", + backstory="An async helper", + llm=LLM(model="gpt-4o-mini"), + verbose=False, + ) + result = await agent.kickoff_async(messages="What is 3+3?") + return result + + flow = AsyncAgentFlow() + result = flow.kickoff() + + assert result is not None + assert isinstance(result, LiteAgentOutput) + + +@pytest.mark.vcr() +def test_lite_agent_standalone_still_works(): + """Test that LiteAgent.kickoff() still works normally outside of a Flow. + + This verifies that the magic auto-async pattern doesn't break standalone usage + where there's no event loop running. + """ + agent = Agent( + role="Standalone Agent", + goal="Answer questions", + backstory="A helpful assistant", + llm=LLM(model="gpt-4o-mini"), + verbose=False, + ) + + # This should work normally - no Flow, no event loop + result = agent.kickoff(messages="What is 5+5? Reply with just the number.") + + assert result is not None + assert isinstance(result, LiteAgentOutput) + assert result.raw is not None diff --git a/lib/crewai/tests/cassettes/agents/test_lite_agent_inside_flow_sync.yaml b/lib/crewai/tests/cassettes/agents/test_lite_agent_inside_flow_sync.yaml new file mode 100644 index 000000000..89749c490 --- /dev/null +++ b/lib/crewai/tests/cassettes/agents/test_lite_agent_inside_flow_sync.yaml @@ -0,0 +1,119 @@ +interactions: +- request: + body: '{"messages":[{"role":"system","content":"You are Test Agent. A helpful + test assistant\nYour personal goal is: Answer questions\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: + What is 2+2? Reply with just the number.\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: + User-Agent: + - X-USER-AGENT-XXX + accept: + - application/json + accept-encoding: + - ACCEPT-ENCODING-XXX + authorization: + - AUTHORIZATION-XXX + connection: + - keep-alive + content-length: + - '673' + content-type: + - application/json + host: + - api.openai.com + x-stainless-arch: + - X-STAINLESS-ARCH-XXX + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - X-STAINLESS-OS-XXX + x-stainless-package-version: + - 1.83.0 + x-stainless-read-timeout: + - X-STAINLESS-READ-TIMEOUT-XXX + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.13.3 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: "{\n \"id\": \"chatcmpl-Cy7b0HjL79y39EkUcMLrRhPFe3XGj\",\n \"object\": + \"chat.completion\",\n \"created\": 1768444914,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"I now can give a great answer \\nFinal + Answer: 4\",\n \"refusal\": null,\n \"annotations\": []\n },\n + \ \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n + \ \"usage\": {\n \"prompt_tokens\": 136,\n \"completion_tokens\": 13,\n + \ \"total_tokens\": 149,\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_8bbc38b4db\"\n}\n" + headers: + CF-RAY: + - CF-RAY-XXX + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Thu, 15 Jan 2026 02:41:55 GMT + Server: + - cloudflare + Set-Cookie: + - SET-COOKIE-XXX + Strict-Transport-Security: + - STS-XXX + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - X-CONTENT-TYPE-XXX + access-control-expose-headers: + - ACCESS-CONTROL-XXX + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + content-length: + - '857' + openai-organization: + - OPENAI-ORG-XXX + openai-processing-ms: + - '341' + openai-project: + - OPENAI-PROJECT-XXX + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '358' + x-openai-proxy-wasm: + - v0.1 + x-ratelimit-limit-requests: + - X-RATELIMIT-LIMIT-REQUESTS-XXX + x-ratelimit-limit-tokens: + - X-RATELIMIT-LIMIT-TOKENS-XXX + x-ratelimit-remaining-requests: + - X-RATELIMIT-REMAINING-REQUESTS-XXX + x-ratelimit-remaining-tokens: + - X-RATELIMIT-REMAINING-TOKENS-XXX + x-ratelimit-reset-requests: + - X-RATELIMIT-RESET-REQUESTS-XXX + x-ratelimit-reset-tokens: + - X-RATELIMIT-RESET-TOKENS-XXX + x-request-id: + - X-REQUEST-ID-XXX + status: + code: 200 + message: OK +version: 1 diff --git a/lib/crewai/tests/cassettes/agents/test_lite_agent_inside_flow_with_tools.yaml b/lib/crewai/tests/cassettes/agents/test_lite_agent_inside_flow_with_tools.yaml new file mode 100644 index 000000000..e508e1afc --- /dev/null +++ b/lib/crewai/tests/cassettes/agents/test_lite_agent_inside_flow_with_tools.yaml @@ -0,0 +1,255 @@ +interactions: +- request: + body: '{"messages":[{"role":"system","content":"You are Calculator Agent. A math + expert\nYour personal goal is: Perform calculations\nYou ONLY have access to + the following tools, and should NEVER make up tools that are not listed here:\n\nTool + Name: calculate\nTool Arguments: {\n \"properties\": {\n \"expression\": + {\n \"title\": \"Expression\",\n \"type\": \"string\"\n }\n },\n \"required\": + [\n \"expression\"\n ],\n \"title\": \"CalculatorToolSchema\",\n \"type\": + \"object\",\n \"additionalProperties\": false\n}\nTool Description: Calculate + the result of a mathematical expression.\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 [calculate], 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: Calculate 10 * 5\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: + User-Agent: + - X-USER-AGENT-XXX + accept: + - application/json + accept-encoding: + - ACCEPT-ENCODING-XXX + authorization: + - AUTHORIZATION-XXX + connection: + - keep-alive + content-length: + - '1403' + content-type: + - application/json + host: + - api.openai.com + x-stainless-arch: + - X-STAINLESS-ARCH-XXX + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - X-STAINLESS-OS-XXX + x-stainless-package-version: + - 1.83.0 + x-stainless-read-timeout: + - X-STAINLESS-READ-TIMEOUT-XXX + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.13.3 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: "{\n \"id\": \"chatcmpl-Cy7avghVPSpszLmlbHpwDQlWDoD6O\",\n \"object\": + \"chat.completion\",\n \"created\": 1768444909,\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 calculate the expression + 10 * 5.\\nAction: calculate\\nAction Input: {\\\"expression\\\":\\\"10 * 5\\\"}\\nObservation: + 50\",\n \"refusal\": null,\n \"annotations\": []\n },\n + \ \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n + \ \"usage\": {\n \"prompt_tokens\": 291,\n \"completion_tokens\": 33,\n + \ \"total_tokens\": 324,\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_c4585b5b9c\"\n}\n" + headers: + CF-RAY: + - CF-RAY-XXX + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Thu, 15 Jan 2026 02:41:49 GMT + Server: + - cloudflare + Set-Cookie: + - SET-COOKIE-XXX + Strict-Transport-Security: + - STS-XXX + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - X-CONTENT-TYPE-XXX + access-control-expose-headers: + - ACCESS-CONTROL-XXX + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + content-length: + - '939' + openai-organization: + - OPENAI-ORG-XXX + openai-processing-ms: + - '579' + openai-project: + - OPENAI-PROJECT-XXX + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '598' + x-openai-proxy-wasm: + - v0.1 + x-ratelimit-limit-requests: + - X-RATELIMIT-LIMIT-REQUESTS-XXX + x-ratelimit-limit-tokens: + - X-RATELIMIT-LIMIT-TOKENS-XXX + x-ratelimit-remaining-requests: + - X-RATELIMIT-REMAINING-REQUESTS-XXX + x-ratelimit-remaining-tokens: + - X-RATELIMIT-REMAINING-TOKENS-XXX + x-ratelimit-reset-requests: + - X-RATELIMIT-RESET-REQUESTS-XXX + x-ratelimit-reset-tokens: + - X-RATELIMIT-RESET-TOKENS-XXX + x-request-id: + - X-REQUEST-ID-XXX + status: + code: 200 + message: OK +- request: + body: '{"messages":[{"role":"system","content":"You are Calculator Agent. A math + expert\nYour personal goal is: Perform calculations\nYou ONLY have access to + the following tools, and should NEVER make up tools that are not listed here:\n\nTool + Name: calculate\nTool Arguments: {\n \"properties\": {\n \"expression\": + {\n \"title\": \"Expression\",\n \"type\": \"string\"\n }\n },\n \"required\": + [\n \"expression\"\n ],\n \"title\": \"CalculatorToolSchema\",\n \"type\": + \"object\",\n \"additionalProperties\": false\n}\nTool Description: Calculate + the result of a mathematical expression.\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 [calculate], 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: Calculate 10 * 5\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":"Thought: + I need to calculate the expression 10 * 5.\nAction: calculate\nAction Input: + {\"expression\":\"10 * 5\"}\nObservation: The result of 10 * 5 is 50"}],"model":"gpt-4o-mini"}' + headers: + User-Agent: + - X-USER-AGENT-XXX + accept: + - application/json + accept-encoding: + - ACCEPT-ENCODING-XXX + authorization: + - AUTHORIZATION-XXX + connection: + - keep-alive + content-length: + - '1591' + content-type: + - application/json + cookie: + - COOKIE-XXX + host: + - api.openai.com + x-stainless-arch: + - X-STAINLESS-ARCH-XXX + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - X-STAINLESS-OS-XXX + x-stainless-package-version: + - 1.83.0 + x-stainless-read-timeout: + - X-STAINLESS-READ-TIMEOUT-XXX + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.13.3 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: "{\n \"id\": \"chatcmpl-Cy7avDhDZCLvv8v2dh8ZQRrLdci6A\",\n \"object\": + \"chat.completion\",\n \"created\": 1768444909,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"Thought: I now know the final answer.\\nFinal + Answer: 50\",\n \"refusal\": null,\n \"annotations\": []\n },\n + \ \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n + \ \"usage\": {\n \"prompt_tokens\": 337,\n \"completion_tokens\": 14,\n + \ \"total_tokens\": 351,\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_c4585b5b9c\"\n}\n" + headers: + CF-RAY: + - CF-RAY-XXX + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Thu, 15 Jan 2026 02:41:50 GMT + Server: + - cloudflare + Strict-Transport-Security: + - STS-XXX + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - X-CONTENT-TYPE-XXX + access-control-expose-headers: + - ACCESS-CONTROL-XXX + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + content-length: + - '864' + openai-organization: + - OPENAI-ORG-XXX + openai-processing-ms: + - '429' + openai-project: + - OPENAI-PROJECT-XXX + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '457' + x-openai-proxy-wasm: + - v0.1 + x-ratelimit-limit-requests: + - X-RATELIMIT-LIMIT-REQUESTS-XXX + x-ratelimit-limit-tokens: + - X-RATELIMIT-LIMIT-TOKENS-XXX + x-ratelimit-remaining-requests: + - X-RATELIMIT-REMAINING-REQUESTS-XXX + x-ratelimit-remaining-tokens: + - X-RATELIMIT-REMAINING-TOKENS-XXX + x-ratelimit-reset-requests: + - X-RATELIMIT-RESET-REQUESTS-XXX + x-ratelimit-reset-tokens: + - X-RATELIMIT-RESET-TOKENS-XXX + x-request-id: + - X-REQUEST-ID-XXX + status: + code: 200 + message: OK +version: 1 diff --git a/lib/crewai/tests/cassettes/agents/test_lite_agent_kickoff_async_inside_flow.yaml b/lib/crewai/tests/cassettes/agents/test_lite_agent_kickoff_async_inside_flow.yaml new file mode 100644 index 000000000..1a17a39fe --- /dev/null +++ b/lib/crewai/tests/cassettes/agents/test_lite_agent_kickoff_async_inside_flow.yaml @@ -0,0 +1,119 @@ +interactions: +- request: + body: '{"messages":[{"role":"system","content":"You are Async Test Agent. An async + helper\nYour personal goal is: Answer questions asynchronously\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: + What is 3+3?\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: + User-Agent: + - X-USER-AGENT-XXX + accept: + - application/json + accept-encoding: + - ACCEPT-ENCODING-XXX + authorization: + - AUTHORIZATION-XXX + connection: + - keep-alive + content-length: + - '657' + content-type: + - application/json + host: + - api.openai.com + x-stainless-arch: + - X-STAINLESS-ARCH-XXX + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - X-STAINLESS-OS-XXX + x-stainless-package-version: + - 1.83.0 + x-stainless-read-timeout: + - X-STAINLESS-READ-TIMEOUT-XXX + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.13.3 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: "{\n \"id\": \"chatcmpl-Cy7atOGxtc4y3oYNI62WiQ0Vogsdv\",\n \"object\": + \"chat.completion\",\n \"created\": 1768444907,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"I now can give a great answer \\nFinal + Answer: The sum of 3 + 3 is 6. Therefore, the outcome is that if you add three + and three together, you will arrive at the total of six.\",\n \"refusal\": + null,\n \"annotations\": []\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 131,\n \"completion_tokens\": 46,\n \"total_tokens\": 177,\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_29330a9688\"\n}\n" + headers: + CF-RAY: + - CF-RAY-XXX + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Thu, 15 Jan 2026 02:41:48 GMT + Server: + - cloudflare + Set-Cookie: + - SET-COOKIE-XXX + Strict-Transport-Security: + - STS-XXX + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - X-CONTENT-TYPE-XXX + access-control-expose-headers: + - ACCESS-CONTROL-XXX + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + content-length: + - '983' + openai-organization: + - OPENAI-ORG-XXX + openai-processing-ms: + - '944' + openai-project: + - OPENAI-PROJECT-XXX + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '1192' + x-openai-proxy-wasm: + - v0.1 + x-ratelimit-limit-requests: + - X-RATELIMIT-LIMIT-REQUESTS-XXX + x-ratelimit-limit-tokens: + - X-RATELIMIT-LIMIT-TOKENS-XXX + x-ratelimit-remaining-requests: + - X-RATELIMIT-REMAINING-REQUESTS-XXX + x-ratelimit-remaining-tokens: + - X-RATELIMIT-REMAINING-TOKENS-XXX + x-ratelimit-reset-requests: + - X-RATELIMIT-RESET-REQUESTS-XXX + x-ratelimit-reset-tokens: + - X-RATELIMIT-RESET-TOKENS-XXX + x-request-id: + - X-REQUEST-ID-XXX + status: + code: 200 + message: OK +version: 1 diff --git a/lib/crewai/tests/cassettes/agents/test_lite_agent_standalone_still_works.yaml b/lib/crewai/tests/cassettes/agents/test_lite_agent_standalone_still_works.yaml new file mode 100644 index 000000000..83bec39ce --- /dev/null +++ b/lib/crewai/tests/cassettes/agents/test_lite_agent_standalone_still_works.yaml @@ -0,0 +1,119 @@ +interactions: +- request: + body: '{"messages":[{"role":"system","content":"You are Standalone Agent. A helpful + assistant\nYour personal goal is: Answer questions\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: + What is 5+5? Reply with just the number.\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: + User-Agent: + - X-USER-AGENT-XXX + accept: + - application/json + accept-encoding: + - ACCEPT-ENCODING-XXX + authorization: + - AUTHORIZATION-XXX + connection: + - keep-alive + content-length: + - '674' + content-type: + - application/json + host: + - api.openai.com + x-stainless-arch: + - X-STAINLESS-ARCH-XXX + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - X-STAINLESS-OS-XXX + x-stainless-package-version: + - 1.83.0 + x-stainless-read-timeout: + - X-STAINLESS-READ-TIMEOUT-XXX + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.13.3 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: "{\n \"id\": \"chatcmpl-Cy7azhPwUHQ0p5tdhxSAmLPoE8UgC\",\n \"object\": + \"chat.completion\",\n \"created\": 1768444913,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"I now can give a great answer \\nFinal + Answer: 10\",\n \"refusal\": null,\n \"annotations\": []\n },\n + \ \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n + \ \"usage\": {\n \"prompt_tokens\": 136,\n \"completion_tokens\": 13,\n + \ \"total_tokens\": 149,\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_29330a9688\"\n}\n" + headers: + CF-RAY: + - CF-RAY-XXX + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Thu, 15 Jan 2026 02:41:54 GMT + Server: + - cloudflare + Set-Cookie: + - SET-COOKIE-XXX + Strict-Transport-Security: + - STS-XXX + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - X-CONTENT-TYPE-XXX + access-control-expose-headers: + - ACCESS-CONTROL-XXX + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + content-length: + - '858' + openai-organization: + - OPENAI-ORG-XXX + openai-processing-ms: + - '455' + openai-project: + - OPENAI-PROJECT-XXX + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '583' + x-openai-proxy-wasm: + - v0.1 + x-ratelimit-limit-requests: + - X-RATELIMIT-LIMIT-REQUESTS-XXX + x-ratelimit-limit-tokens: + - X-RATELIMIT-LIMIT-TOKENS-XXX + x-ratelimit-remaining-requests: + - X-RATELIMIT-REMAINING-REQUESTS-XXX + x-ratelimit-remaining-tokens: + - X-RATELIMIT-REMAINING-TOKENS-XXX + x-ratelimit-reset-requests: + - X-RATELIMIT-RESET-REQUESTS-XXX + x-ratelimit-reset-tokens: + - X-RATELIMIT-RESET-TOKENS-XXX + x-request-id: + - X-REQUEST-ID-XXX + status: + code: 200 + message: OK +version: 1 diff --git a/lib/crewai/tests/cassettes/agents/test_multiple_agents_in_same_flow.yaml b/lib/crewai/tests/cassettes/agents/test_multiple_agents_in_same_flow.yaml new file mode 100644 index 000000000..46ba712c1 --- /dev/null +++ b/lib/crewai/tests/cassettes/agents/test_multiple_agents_in_same_flow.yaml @@ -0,0 +1,239 @@ +interactions: +- request: + body: '{"messages":[{"role":"system","content":"You are First Agent. A friendly + greeter\nYour personal goal is: Greet users\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\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: + User-Agent: + - X-USER-AGENT-XXX + accept: + - application/json + accept-encoding: + - ACCEPT-ENCODING-XXX + authorization: + - AUTHORIZATION-XXX + connection: + - keep-alive + content-length: + - '632' + content-type: + - application/json + host: + - api.openai.com + x-stainless-arch: + - X-STAINLESS-ARCH-XXX + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - X-STAINLESS-OS-XXX + x-stainless-package-version: + - 1.83.0 + x-stainless-read-timeout: + - X-STAINLESS-READ-TIMEOUT-XXX + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.13.3 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: "{\n \"id\": \"chatcmpl-CyRKzgODZ9yn3F9OkaXsscLk2Ln3N\",\n \"object\": + \"chat.completion\",\n \"created\": 1768520801,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"I now can give a great answer \\nFinal + Answer: Hello! Welcome! I'm so glad to see you here. If you need any assistance + or have any questions, feel free to ask. Have a wonderful day!\",\n \"refusal\": + null,\n \"annotations\": []\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 127,\n \"completion_tokens\": 43,\n \"total_tokens\": 170,\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_c4585b5b9c\"\n}\n" + headers: + CF-RAY: + - CF-RAY-XXX + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Thu, 15 Jan 2026 23:46:42 GMT + Server: + - cloudflare + Set-Cookie: + - SET-COOKIE-XXX + Strict-Transport-Security: + - STS-XXX + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - X-CONTENT-TYPE-XXX + access-control-expose-headers: + - ACCESS-CONTROL-XXX + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + content-length: + - '990' + openai-organization: + - OPENAI-ORG-XXX + openai-processing-ms: + - '880' + openai-project: + - OPENAI-PROJECT-XXX + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '1160' + x-openai-proxy-wasm: + - v0.1 + x-ratelimit-limit-requests: + - X-RATELIMIT-LIMIT-REQUESTS-XXX + x-ratelimit-limit-tokens: + - X-RATELIMIT-LIMIT-TOKENS-XXX + x-ratelimit-remaining-requests: + - X-RATELIMIT-REMAINING-REQUESTS-XXX + x-ratelimit-remaining-tokens: + - X-RATELIMIT-REMAINING-TOKENS-XXX + x-ratelimit-reset-requests: + - X-RATELIMIT-RESET-REQUESTS-XXX + x-ratelimit-reset-tokens: + - X-RATELIMIT-RESET-TOKENS-XXX + x-request-id: + - X-REQUEST-ID-XXX + status: + code: 200 + message: OK +- request: + body: '{"messages":[{"role":"system","content":"You are Second Agent. A polite + farewell agent\nYour personal goal is: Say goodbye\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 goodbye\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: + User-Agent: + - X-USER-AGENT-XXX + accept: + - application/json + accept-encoding: + - ACCEPT-ENCODING-XXX + authorization: + - AUTHORIZATION-XXX + connection: + - keep-alive + content-length: + - '640' + content-type: + - application/json + host: + - api.openai.com + x-stainless-arch: + - X-STAINLESS-ARCH-XXX + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - X-STAINLESS-OS-XXX + x-stainless-package-version: + - 1.83.0 + x-stainless-read-timeout: + - X-STAINLESS-READ-TIMEOUT-XXX + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.13.3 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: "{\n \"id\": \"chatcmpl-CyRL1Ua2PkK5xXPp3KeF0AnGAk3JP\",\n \"object\": + \"chat.completion\",\n \"created\": 1768520803,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"I now can give a great answer \\nFinal + Answer: As we reach the end of our conversation, I want to express my gratitude + for the time we've shared. It's been a pleasure assisting you, and I hope + you found our interaction helpful and enjoyable. Remember, whenever you need + assistance, I'm just a message away. Wishing you all the best in your future + endeavors. Goodbye and take care!\",\n \"refusal\": null,\n \"annotations\": + []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n + \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 126,\n \"completion_tokens\": + 79,\n \"total_tokens\": 205,\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_29330a9688\"\n}\n" + headers: + CF-RAY: + - CF-RAY-XXX + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Thu, 15 Jan 2026 23:46:44 GMT + Server: + - cloudflare + Set-Cookie: + - SET-COOKIE-XXX + Strict-Transport-Security: + - STS-XXX + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - X-CONTENT-TYPE-XXX + access-control-expose-headers: + - ACCESS-CONTROL-XXX + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + content-length: + - '1189' + openai-organization: + - OPENAI-ORG-XXX + openai-processing-ms: + - '1363' + openai-project: + - OPENAI-PROJECT-XXX + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '1605' + x-openai-proxy-wasm: + - v0.1 + x-ratelimit-limit-requests: + - X-RATELIMIT-LIMIT-REQUESTS-XXX + x-ratelimit-limit-tokens: + - X-RATELIMIT-LIMIT-TOKENS-XXX + x-ratelimit-remaining-requests: + - X-RATELIMIT-REMAINING-REQUESTS-XXX + x-ratelimit-remaining-tokens: + - X-RATELIMIT-REMAINING-TOKENS-XXX + x-ratelimit-reset-requests: + - X-RATELIMIT-RESET-REQUESTS-XXX + x-ratelimit-reset-tokens: + - X-RATELIMIT-RESET-TOKENS-XXX + x-request-id: + - X-REQUEST-ID-XXX + status: + code: 200 + message: OK +version: 1 diff --git a/lib/crewai/tests/cassettes/test_multiple_before_after_kickoff.yaml b/lib/crewai/tests/cassettes/test_multiple_before_after_kickoff.yaml index bc21fa5ef..1674ea40e 100644 --- a/lib/crewai/tests/cassettes/test_multiple_before_after_kickoff.yaml +++ b/lib/crewai/tests/cassettes/test_multiple_before_after_kickoff.yaml @@ -1,994 +1,585 @@ interactions: - request: - body: !!binary | - CuoRCiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkSwREKEgoQY3Jld2FpLnRl - bGVtZXRyeRKnDQoQNqOad6IrfJm4KSihMA59NRIIVg6xl6r4LrsqDENyZXcgQ3JlYXRlZDABOYCV - yjE9zDoYQRh22TE9zDoYShsKDmNyZXdhaV92ZXJzaW9uEgkKBzAuMTE3LjFKGgoOcHl0aG9uX3Zl - cnNpb24SCAoGMy4xMi45Si4KCGNyZXdfa2V5EiIKIDZiYTkxMmY5MTI5ZDY4NDlhMGFjNDljZmJk - MzIxZGFkSjEKB2NyZXdfaWQSJgokNmY2NWVjNmYtMGM1NC00MDQ5LThiZTgtOWRkOGRjZTVmMGMx - ShwKDGNyZXdfcHJvY2VzcxIMCgpzZXF1ZW50aWFsShEKC2NyZXdfbWVtb3J5EgIQAEoaChRjcmV3 - X251bWJlcl9vZl90YXNrcxICGAJKGwoVY3Jld19udW1iZXJfb2ZfYWdlbnRzEgIYAko6ChBjcmV3 - X2ZpbmdlcnByaW50EiYKJDYzMTNlOTRlLTQ0MTUtNDQxMy1hNGY5LTMxYmEyN2UzZTEyM0o7Chtj - cmV3X2ZpbmdlcnByaW50X2NyZWF0ZWRfYXQSHAoaMjAyNS0wNC0yOVQxMDoxMjo0OC43NTc0MzZK - xwUKC2NyZXdfYWdlbnRzErcFCrQFW3sia2V5IjogIjczYzM0OWM5M2MxNjNiNWQ0ZGY5OGE2NGZh - YzFjNDMwIiwgImlkIjogIjI5YzMzYmUyLWMwZmUtNGI4OC05MDNjLWE4MzQ5ZDIxMDgxNCIsICJy - b2xlIjogInt0b3BpY30gU2VuaW9yIERhdGEgUmVzZWFyY2hlclxuIiwgInZlcmJvc2U/IjogdHJ1 - ZSwgIm1heF9pdGVyIjogMjUsICJtYXhfcnBtIjogbnVsbCwgImZ1bmN0aW9uX2NhbGxpbmdfbGxt - IjogImxvY2FsX2xsbSIsICJsbG0iOiAiZ3B0LTRvLW1pbmkiLCAiZGVsZWdhdGlvbl9lbmFibGVk - PyI6IGZhbHNlLCAiYWxsb3dfY29kZV9leGVjdXRpb24/IjogZmFsc2UsICJtYXhfcmV0cnlfbGlt - aXQiOiAyLCAidG9vbHNfbmFtZXMiOiBbXX0sIHsia2V5IjogIjEwNGZlMDY1OWUxMGI0MjZjZjg4 - ZjAyNGZiNTcxNTUzIiwgImlkIjogIjM5ZGU5Y2ExLWFlMjktNDI5NC04YjRhLWY1YjBhZmYyOTMw - YSIsICJyb2xlIjogInt0b3BpY30gUmVwb3J0aW5nIEFuYWx5c3RcbiIsICJ2ZXJib3NlPyI6IHRy - dWUsICJtYXhfaXRlciI6IDI1LCAibWF4X3JwbSI6IG51bGwsICJmdW5jdGlvbl9jYWxsaW5nX2xs - bSI6ICJvbmxpbmVfbGxtIiwgImxsbSI6ICJncHQtNG8tbWluaSIsICJkZWxlZ2F0aW9uX2VuYWJs - ZWQ/IjogZmFsc2UsICJhbGxvd19jb2RlX2V4ZWN1dGlvbj8iOiBmYWxzZSwgIm1heF9yZXRyeV9s - aW1pdCI6IDIsICJ0b29sc19uYW1lcyI6IFtdfV1KkwQKCmNyZXdfdGFza3MShAQKgQRbeyJrZXki - OiAiMDAxNzk3ZTNmNjJkMzNjZDFkNjM1ZWI2ZmRkNWI0NTMiLCAiaWQiOiAiMWRhZjkwNTctZDEx - NC00ODNmLWE0OWMtNGVlMDFkYzk0MWIwIiwgImFzeW5jX2V4ZWN1dGlvbj8iOiBmYWxzZSwgImh1 - bWFuX2lucHV0PyI6IGZhbHNlLCAiYWdlbnRfcm9sZSI6ICJ7dG9waWN9IFNlbmlvciBEYXRhIFJl - c2VhcmNoZXJcbiIsICJhZ2VudF9rZXkiOiAiNzNjMzQ5YzkzYzE2M2I1ZDRkZjk4YTY0ZmFjMWM0 - MzAiLCAidG9vbHNfbmFtZXMiOiBbXX0sIHsia2V5IjogImIxN2IxODhkYmYxNGY5M2E5OGU1Yjk1 - YWFkMzY3NTc3IiwgImlkIjogImE4YmE1MmFlLTc5NDItNDE2Yi04YTdkLTdjNzZkMzQzMDE1YSIs - ICJhc3luY19leGVjdXRpb24/IjogZmFsc2UsICJodW1hbl9pbnB1dD8iOiBmYWxzZSwgImFnZW50 - X3JvbGUiOiAie3RvcGljfSBSZXBvcnRpbmcgQW5hbHlzdFxuIiwgImFnZW50X2tleSI6ICIxMDRm - ZTA2NTllMTBiNDI2Y2Y4OGYwMjRmYjU3MTU1MyIsICJ0b29sc19uYW1lcyI6IFtdfV16AhgBhQEA - AQAAEoAEChBDP5l0DjoBGKgMxteEDV7jEghlXEOTh7NRoSoMVGFzayBDcmVhdGVkMAE5WB3tMT3M - OhhBmLntMT3MOhhKLgoIY3Jld19rZXkSIgogNmJhOTEyZjkxMjlkNjg0OWEwYWM0OWNmYmQzMjFk - YWRKMQoHY3Jld19pZBImCiQ2ZjY1ZWM2Zi0wYzU0LTQwNDktOGJlOC05ZGQ4ZGNlNWYwYzFKLgoI - dGFza19rZXkSIgogMDAxNzk3ZTNmNjJkMzNjZDFkNjM1ZWI2ZmRkNWI0NTNKMQoHdGFza19pZBIm - CiQxZGFmOTA1Ny1kMTE0LTQ4M2YtYTQ5Yy00ZWUwMWRjOTQxYjBKOgoQY3Jld19maW5nZXJwcmlu - dBImCiQ2MzEzZTk0ZS00NDE1LTQ0MTMtYTRmOS0zMWJhMjdlM2UxMjNKOgoQdGFza19maW5nZXJw - cmludBImCiRjYmZjNjIwMi1lZWI4LTQ2Y2MtYTIwOC0zZmUyOWI0NWI3MGJKOwobdGFza19maW5n - ZXJwcmludF9jcmVhdGVkX2F0EhwKGjIwMjUtMDQtMjlUMTA6MTI6NDguNzU3MTg1SjsKEWFnZW50 - X2ZpbmdlcnByaW50EiYKJDcyODI1M2YwLWY4ODUtNDFiYS1hNTljLWVjZDc5ZWUwYWVkZHoCGAGF - AQABAAA= + body: '{"messages":[{"role":"system","content":"You are plants Senior Data Researcher\n. + You''re a seasoned researcher with a knack for uncovering the latest developments + in plants. Known for your ability to find the most relevant information and + present it in a clear and concise manner.\n\nYour personal goal is: Uncover + cutting-edge developments in plants\n\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: Conduct + a thorough research about plants Make sure you find any interesting and relevant + information given the current year is 2025.\n\n\nThis is the expected criteria + for your final answer: A list with 10 bullet points of the most relevant information + about plants\n\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: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '2285' - 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: - - Tue, 29 Apr 2025 13:12:53 GMT - status: - code: 200 - message: OK -- request: - body: '{"messages": [{"role": "system", "content": "You are plants Senior Data Researcher\n. You''re a seasoned researcher with a knack for uncovering the latest developments in plants. Known for your ability to find the most relevant information and present it in a clear and concise manner.\n\nYour personal goal is: Uncover cutting-edge developments in plants\n\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: Conduct a thorough research about plants Make sure you find any interesting and relevant information given the current year is 2025.\n\n\nThis is the expected criteria for your final answer: A list with 10 bullet points of the most relevant information about plants\n\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:"]}' - headers: + - X-USER-AGENT-XXX accept: - application/json accept-encoding: - - gzip, deflate + - ACCEPT-ENCODING-XXX + authorization: + - AUTHORIZATION-XXX connection: - keep-alive content-length: - - '1245' + - '1208' content-type: - application/json - cookie: - - __cf_bm=4a_upL.aOpvumKsSeVod76qQJryQ9gcG.cvZf8lEbAw-1745932159-1.0.1.1-GTnl1gK1N2Xv_PPjpQRqAzyiVmkomIe02l2R8_be1yz_9PofNkOyUGUpjMBblZUyz4iC7Tm78.fg1IY5Zs7e8rz4MB.09svg9PxqCYBV3Eg; _cfuvid=2Ua1nky3gSdkGURhJ85.hQrqMawwIif2iX06h02kAPI-1745932159900-0.0.1.1-604800000 host: - api.openai.com - user-agent: - - OpenAI/Python 1.68.2 x-stainless-arch: - - arm64 + - X-STAINLESS-ARCH-XXX x-stainless-async: - 'false' x-stainless-lang: - python x-stainless-os: - - MacOS + - X-STAINLESS-OS-XXX x-stainless-package-version: - - 1.68.2 - x-stainless-raw-response: - - 'true' + - 1.83.0 x-stainless-read-timeout: - - '600.0' + - X-STAINLESS-READ-TIMEOUT-XXX x-stainless-retry-count: - '0' x-stainless-runtime: - CPython x-stainless-runtime-version: - - 3.12.9 + - 3.13.3 method: POST uri: https://api.openai.com/v1/chat/completions response: body: - string: "{\n \"id\": \"chatcmpl-BRf3QSCjp8ye7LA3ahUu34qnOcb7Z\",\n \"object\": \"chat.completion\",\n \"created\": 1745932368,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"I now can give a great answer \\nFinal Answer: \\n1. **Plant-Based Biofuels**: Advances in genetic engineering are allowing researchers to develop plants that produce higher yields of biofuels, reducing reliance on fossil fuels. For example, specialized strains of switchgrass and algae are being cultivated for more efficient biofuel production.\\n\\n2. **CRISPR Technology in Plant Breeding**: The use of CRISPR technology has accelerated the breeding of disease-resistant and drought-tolerant plants. Researchers are now able to edit plant genomes with precision, leading to breakthroughs in staple crops like rice and wheat for better resilience to climate change.\\n\\n3. **Vertical Farming Innovations**:\ - \ Vertical farming techniques have evolved to integrate advanced hydroponics and aeroponics, improving space efficiency and speed of plant growth. This method not only conserves water but also minimizes the use of pesticides and herbicides.\\n\\n4. **Enhancing Plant Photosynthesis**: Researchers are exploring ways to enhance the photosynthesis process in plants, potentially increasing crop yields by up to 50%. New variations in light-harvesting proteins have been identified that could lead to crops that grow quicker and with less resource input.\\n\\n5. **Plant Communication**: Studies have shown that plants can communicate with each other through root exudates and volatile organic compounds. This research is leading to better understanding of plant ecology and could have implications for agriculture practices and pest control.\\n\\n6. **Soil Microbiomes and Plant Health**: Recent findings highlight the importance of soil microbiomes in promoting plant health and growth. The use\ - \ of beneficial microbial inoculants is becoming a popular strategy to enhance nutrient uptake and improve plant resilience.\\n\\n7. **Sustainable Pest Management**: Innovative pest management strategies utilizing plant-based repellents are on the rise. This involves selecting and cultivating plants that naturally deter pests, minimizing the need for chemical pesticides and enhancing biodiversity.\\n\\n8. **Urban Forests as Carbon Sinks**: Urban greening initiatives are increasingly focusing on planting trees and shrubs in cities to capture carbon dioxide, improve air quality, and promote biodiversity. These efforts are being recognized for their role in mitigating urban heat and climate change impacts.\\n\\n9. **Phytoremediation**: Research into using specific plants for soil and water remediation has gained traction. Some plants can absorb heavy metals and toxins, offering a sustainable solution for cleaning contaminated environments.\\n\\n10. **Biophilic Design in Architecture**:\ - \ There is a growing trend in incorporating plants into architectural designs, employing biophilic principles to enhance urban ecosystems. This includes the integration of green roofs and living walls, which provide aesthetic benefits while improving air quality and biodiversity.\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 228,\n \"completion_tokens\": 535,\n \"total_tokens\": 763,\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_0392822090\"\n}\n" + string: "{\n \"id\": \"chatcmpl-Cy5aSZuHW2rLtJbEy88r1LpwkYQqE\",\n \"object\": + \"chat.completion\",\n \"created\": 1768437192,\n \"model\": \"gpt-4.1-mini-2025-04-14\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"Thought: I now can give a great answer\\nFinal + Answer: \\n\\n1. **CRISPR and Gene Editing in Plants:** In 2025, advancements + in CRISPR technology have enabled more precise and efficient gene editing + in plants, leading to the development of crop varieties with enhanced resistance + to pests, diseases, and environmental stresses like drought and salinity.\\n\\n2. + **Vertical Farming Expansion:** Vertical farming has become more widespread + globally, using aeroponics and hydroponics technology to grow plants indoors + with minimal water usage and no soil, minimizing agricultural land use and + increasing year-round food production.\\n\\n3. **Plant-Microbiome Interactions:** + Research in 2025 has highlighted the importance of the plant microbiome, the + community of microorganisms living in and around plants, showing how manipulating + these microbes can improve plant health, growth, and nutrient uptake.\\n\\n4. + **Climate-Resilient Crop Varieties:** With ongoing climate change challenges, + scientists have bred and genetically engineered new crop varieties that can + withstand extreme temperatures, prolonged droughts, and flooding, ensuring + food security under unpredictable weather patterns.\\n\\n5. **Carbon Sequestration + through Plants:** Plants are being increasingly recognized as vital carbon + sinks. New forestry and agricultural practices have been developed to maximize + carbon sequestration ability, including biochar soil amendments and selecting + fast-growing tree species.\\n\\n6. **Plant-Based Meat Alternatives:** Advances + in plant biology and food technology have improved the texture, flavor, and + nutritional profile of plant-based meat substitutes, making them more popular + as sustainable alternatives to animal protein.\\n\\n7. **Plant Sensory and + Signaling Research:** Cutting-edge studies have revealed more about how plants + sense their environment and communicate internally and with other plants (e.g., + signaling pathways involving electrical and chemical signals), which could + lead to innovations in agriculture.\\n\\n8. **Synthetic Photosynthesis Developments:** + Scientists have created hybrid systems combining plants with synthetic materials + to enhance photosynthesis efficiency, aiming to boost crop yields and offer + renewable energy solutions.\\n\\n9. **Urban Greening Initiatives:** Urban + environments have increasingly integrated plants into architecture and infrastructure + for improved air quality, temperature regulation, and mental health benefits. + New plant species specially bred for urban resilience are now common.\\n\\n10. + **Conservation of Plant Biodiversity:** In 2025, global efforts have intensified + to protect endangered plant species and habitats through seed banks, in vitro + conservation techniques, and habitat restoration projects, in response to + habitat loss and extinction risks.\\n\\nThese points reflect the most recent + and relevant breakthroughs and trends in plant science and applications as + of 2025.\",\n \"refusal\": null,\n \"annotations\": []\n },\n + \ \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n + \ \"usage\": {\n \"prompt_tokens\": 228,\n \"completion_tokens\": 509,\n + \ \"total_tokens\": 737,\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_376a7ccef1\"\n}\n" headers: CF-RAY: - - 937f0d98de3a7dff-GRU + - CF-RAY-XXX Connection: - keep-alive Content-Type: - application/json Date: - - Tue, 29 Apr 2025 13:13:04 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-REDACTED - openai-processing-ms: - - '15605' - 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: - - '149999724' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_8a6ae39c0ba124a2320481043af26573 - status: - code: 200 - message: OK -- request: - body: '{"messages": [{"role": "system", "content": "You are Guardrail Agent. You are a expert at validating the output of a task. By providing effective feedback if the output is not valid.\nYour personal goal is: Validate the output of the task\n\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!\nIMPORTANT: Your final answer MUST contain all the information requested in the following format: {\n \"valid\": bool,\n \"feedback\": str | None\n}\n\nIMPORTANT: Ensure the final output does not include any code block markers like ```json or ```python."}, {"role": "user", "content": "\n Ensure the following task result complies with the given guardrail.\n\n Task result:\n 1. **Plant-Based Biofuels**: Advances in genetic - engineering are allowing researchers to develop plants that produce higher yields of biofuels, reducing reliance on fossil fuels. For example, specialized strains of switchgrass and algae are being cultivated for more efficient biofuel production.\n\n2. **CRISPR Technology in Plant Breeding**: The use of CRISPR technology has accelerated the breeding of disease-resistant and drought-tolerant plants. Researchers are now able to edit plant genomes with precision, leading to breakthroughs in staple crops like rice and wheat for better resilience to climate change.\n\n3. **Vertical Farming Innovations**: Vertical farming techniques have evolved to integrate advanced hydroponics and aeroponics, improving space efficiency and speed of plant growth. This method not only conserves water but also minimizes the use of pesticides and herbicides.\n\n4. **Enhancing Plant Photosynthesis**: Researchers are exploring ways to enhance the photosynthesis process in plants, potentially increasing crop - yields by up to 50%. New variations in light-harvesting proteins have been identified that could lead to crops that grow quicker and with less resource input.\n\n5. **Plant Communication**: Studies have shown that plants can communicate with each other through root exudates and volatile organic compounds. This research is leading to better understanding of plant ecology and could have implications for agriculture practices and pest control.\n\n6. **Soil Microbiomes and Plant Health**: Recent findings highlight the importance of soil microbiomes in promoting plant health and growth. The use of beneficial microbial inoculants is becoming a popular strategy to enhance nutrient uptake and improve plant resilience.\n\n7. **Sustainable Pest Management**: Innovative pest management strategies utilizing plant-based repellents are on the rise. This involves selecting and cultivating plants that naturally deter pests, minimizing the need for chemical pesticides and enhancing biodiversity.\n\n8. - **Urban Forests as Carbon Sinks**: Urban greening initiatives are increasingly focusing on planting trees and shrubs in cities to capture carbon dioxide, improve air quality, and promote biodiversity. These efforts are being recognized for their role in mitigating urban heat and climate change impacts.\n\n9. **Phytoremediation**: Research into using specific plants for soil and water remediation has gained traction. Some plants can absorb heavy metals and toxins, offering a sustainable solution for cleaning contaminated environments.\n\n10. **Biophilic Design in Architecture**: There is a growing trend in incorporating plants into architectural designs, employing biophilic principles to enhance urban ecosystems. This includes the integration of green roofs and living walls, which provide aesthetic benefits while improving air quality and biodiversity.\n\n Guardrail:\n ensure each bullet contains its source\n \n Your task:\n - Confirm if the Task result - complies with the guardrail.\n - If not, provide clear feedback explaining what is wrong (e.g., by how much it violates the rule, or what specific part fails).\n - Focus only on identifying issues \u2014 do not propose corrections.\n - If the Task result complies with the guardrail, saying that is valid\n "}], "model": "gpt-4o-mini", "stop": ["\nObservation:"]}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '4381' - content-type: - - application/json - cookie: - - __cf_bm=4a_upL.aOpvumKsSeVod76qQJryQ9gcG.cvZf8lEbAw-1745932159-1.0.1.1-GTnl1gK1N2Xv_PPjpQRqAzyiVmkomIe02l2R8_be1yz_9PofNkOyUGUpjMBblZUyz4iC7Tm78.fg1IY5Zs7e8rz4MB.09svg9PxqCYBV3Eg; _cfuvid=2Ua1nky3gSdkGURhJ85.hQrqMawwIif2iX06h02kAPI-1745932159900-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.9 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-BRf3h9OSBPpYRdv6iw1Iob1IBZZld\",\n \"object\": \"chat.completion\",\n \"created\": 1745932385,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Thought: I now can give a great answer \\nFinal Answer: {\\n \\\"valid\\\": false,\\n \\\"feedback\\\": \\\"The task result does not comply with the guardrail as none of the bullet points contain their sources. Each statement should have a citation or reference to support the claims made.\\\"\\n}\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 798,\n \"completion_tokens\": 61,\n \"total_tokens\": 859,\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_0392822090\"\n}\n" - headers: - CF-RAY: - - 937f0dfd28257dff-GRU - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 29 Apr 2025 13:13:07 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-REDACTED - openai-processing-ms: - - '1350' - 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: - - '149998947' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_026aae70c2fb4864824d30a203da9dd3 - status: - code: 200 - message: OK -- request: - body: !!binary | - CsAECiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkSlwQKEgoQY3Jld2FpLnRl - bGVtZXRyeRKABAoQNoNxIE28DCnitmGtN4y0hhIIu7s69+dRZsoqDFRhc2sgQ3JlYXRlZDABOcCZ - 63JBzDoYQYjG7HJBzDoYSi4KCGNyZXdfa2V5EiIKIDZiYTkxMmY5MTI5ZDY4NDlhMGFjNDljZmJk - MzIxZGFkSjEKB2NyZXdfaWQSJgokNmY2NWVjNmYtMGM1NC00MDQ5LThiZTgtOWRkOGRjZTVmMGMx - Si4KCHRhc2tfa2V5EiIKIDAwMTc5N2UzZjYyZDMzY2QxZDYzNWViNmZkZDViNDUzSjEKB3Rhc2tf - aWQSJgokMWRhZjkwNTctZDExNC00ODNmLWE0OWMtNGVlMDFkYzk0MWIwSjoKEGNyZXdfZmluZ2Vy - cHJpbnQSJgokNjMxM2U5NGUtNDQxNS00NDEzLWE0ZjktMzFiYTI3ZTNlMTIzSjoKEHRhc2tfZmlu - Z2VycHJpbnQSJgokY2JmYzYyMDItZWViOC00NmNjLWEyMDgtM2ZlMjliNDViNzBiSjsKG3Rhc2tf - ZmluZ2VycHJpbnRfY3JlYXRlZF9hdBIcChoyMDI1LTA0LTI5VDEwOjEyOjQ4Ljc1NzE4NUo7ChFh - Z2VudF9maW5nZXJwcmludBImCiQ3MjgyNTNmMC1mODg1LTQxYmEtYTU5Yy1lY2Q3OWVlMGFlZGR6 - AhgBhQEAAQAA - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '579' - 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: - - Tue, 29 Apr 2025 13:13:08 GMT - status: - code: 200 - message: OK -- request: - body: '{"messages": [{"role": "system", "content": "You are plants Senior Data Researcher\n. You''re a seasoned researcher with a knack for uncovering the latest developments in plants. Known for your ability to find the most relevant information and present it in a clear and concise manner.\n\nYour personal goal is: Uncover cutting-edge developments in plants\n\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: Conduct a thorough research about plants Make sure you find any interesting and relevant information given the current year is 2025.\n\n\nThis is the expected criteria for your final answer: A list with 10 bullet points of the most relevant information about plants\n\nyou MUST return - the actual complete content as the final answer, not a summary.\n\nThis is the context you''re working with:\n### Previous attempt failed validation: The task result does not comply with the guardrail as none of the bullet points contain their sources. Each statement should have a citation or reference to support the claims made.\n\n\n### Previous result:\n1. **Plant-Based Biofuels**: Advances in genetic engineering are allowing researchers to develop plants that produce higher yields of biofuels, reducing reliance on fossil fuels. For example, specialized strains of switchgrass and algae are being cultivated for more efficient biofuel production.\n\n2. **CRISPR Technology in Plant Breeding**: The use of CRISPR technology has accelerated the breeding of disease-resistant and drought-tolerant plants. Researchers are now able to edit plant genomes with precision, leading to breakthroughs in staple crops like rice and wheat for better resilience to climate change.\n\n3. **Vertical Farming - Innovations**: Vertical farming techniques have evolved to integrate advanced hydroponics and aeroponics, improving space efficiency and speed of plant growth. This method not only conserves water but also minimizes the use of pesticides and herbicides.\n\n4. **Enhancing Plant Photosynthesis**: Researchers are exploring ways to enhance the photosynthesis process in plants, potentially increasing crop yields by up to 50%. New variations in light-harvesting proteins have been identified that could lead to crops that grow quicker and with less resource input.\n\n5. **Plant Communication**: Studies have shown that plants can communicate with each other through root exudates and volatile organic compounds. This research is leading to better understanding of plant ecology and could have implications for agriculture practices and pest control.\n\n6. **Soil Microbiomes and Plant Health**: Recent findings highlight the importance of soil microbiomes in promoting plant health and growth. The - use of beneficial microbial inoculants is becoming a popular strategy to enhance nutrient uptake and improve plant resilience.\n\n7. **Sustainable Pest Management**: Innovative pest management strategies utilizing plant-based repellents are on the rise. This involves selecting and cultivating plants that naturally deter pests, minimizing the need for chemical pesticides and enhancing biodiversity.\n\n8. **Urban Forests as Carbon Sinks**: Urban greening initiatives are increasingly focusing on planting trees and shrubs in cities to capture carbon dioxide, improve air quality, and promote biodiversity. These efforts are being recognized for their role in mitigating urban heat and climate change impacts.\n\n9. **Phytoremediation**: Research into using specific plants for soil and water remediation has gained traction. Some plants can absorb heavy metals and toxins, offering a sustainable solution for cleaning contaminated environments.\n\n10. **Biophilic Design in Architecture**: There - is a growing trend in incorporating plants into architectural designs, employing biophilic principles to enhance urban ecosystems. This includes the integration of green roofs and living walls, which provide aesthetic benefits while improving air quality and biodiversity.\n\n\nTry again, making sure to address the validation error.\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:"]}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '4510' - content-type: - - application/json - cookie: - - __cf_bm=4a_upL.aOpvumKsSeVod76qQJryQ9gcG.cvZf8lEbAw-1745932159-1.0.1.1-GTnl1gK1N2Xv_PPjpQRqAzyiVmkomIe02l2R8_be1yz_9PofNkOyUGUpjMBblZUyz4iC7Tm78.fg1IY5Zs7e8rz4MB.09svg9PxqCYBV3Eg; _cfuvid=2Ua1nky3gSdkGURhJ85.hQrqMawwIif2iX06h02kAPI-1745932159900-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.9 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-BRf3jSdgZkcPXnXOZRXFDvPiDD8Hm\",\n \"object\": \"chat.completion\",\n \"created\": 1745932387,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"I now can give a great answer \\nFinal Answer: \\n\\n1. **Plant-Based Biofuels Advancements**: Recent genetic engineering developments enable the cultivation of specialized strains of switchgrass and algae to produce higher biofuel yields, thereby reducing reliance on fossil fuels (Source: Zhang, L. et al., 2025. *Journal of Renewable Energy*. DOI: 10.1016/j.jre.2025.01.005).\\n\\n2. **CRISPR in Plant Breeding**: The adoption of CRISPR technology has resulted in significant progress in the breeding of disease-resistant and drought-tolerant crops, such as rice and wheat, ensuring better resilience against climate change impacts (Source: Smith, J. et al., 2025. *Plant Biotechnology Journal*.\ - \ DOI: 10.1111/pbi.13456).\\n\\n3. **Innovations in Vertical Farming**: Vertical farming now incorporates advanced hydroponics and aeroponics, enhancing efficiency and speed in plant growth while conserving water and reducing pesticide usage (Source: Johnson, R. & Lee, K., 2025. *Agricultural Systems*. DOI: 10.1016/j.agsy.2025.02.006).\\n\\n4. **Enhancing Photosynthesis**: Research has identified new variations in light-harvesting proteins aimed at increasing the photosynthesis process in plants, with potential yield increases of up to 50% in staple crops (Source: Patel, A. & Cheng, M., 2025. *New Phytologist*. DOI: 10.1111/nph.17475).\\n\\n5. **Plant Communication Mechanisms**: Studies demonstrate that plants communicate with neighboring counterparts through root exudates and volatile organic compounds, providing insights into plant ecology and influencing future agricultural practices (Source: Wang, X. et al., 2025. *Ecology Letters*. DOI: 10.1111/ele.13478).\\n\\n6. **Impact of\ - \ Soil Microbiomes**: Recent research emphasizes how soil microbiomes are crucial for plant health, with microbial inoculants becoming popular in enhancing nutrient uptake and promoting plant resilience to environmental stresses (Source: Lopez, F. et al., 2025. *Soil Biology and Biochemistry*. DOI: 10.1016/j.soilbio.2025.03.009).\\n\\n7. **Sustainable Pest Management Research**: Innovative strategies utilizing plant-based repellents are gaining traction, focusing on cultivating companion plants that naturally deter pests, thereby decreasing reliance on chemical pesticides (Source: Morris, T. & Gray, S., 2025. *Pest Management Science*. DOI: 10.1002/ps.6543).\\n\\n8. **Urban Forests as Carbon Sinks**: Urban greening initiatives are increasingly promoting the planting of trees and shrubs, recognizing their role in carbon capture, air quality improvement, and biodiversity enhancement amidst urbanization (Source: Thompson, L. et al., 2025. *Urban Forestry & Urban Greening*. DOI: 10.1016/j.ufug.2025.04.012).\\\ - n\\n9. **Phytoremediation for Environmental Cleanup**: Research into using specific plant species for phytoremediation is expanding, as certain plants show the capacity to absorb heavy metals and toxins, offering sustainable methods for soil and water cleanup (Source: Taylor, M. & Wong, H., 2025. *Environmental Science & Technology*. DOI: 10.1021/acs.est.5b01234).\\n\\n10. **Biophilic Architectural Designs**: A growing trend is the integration of plants in architectural designs, using biophilic concepts to create green roofs and living walls that enhance urban ecosystems, improve air quality, and promote biodiversity (Source: Green, C. & Black, R., 2025. *Journal of Urban Design*. DOI: 10.1080/13574809.2025.101001).\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 813,\n \"completion_tokens\": 807,\n \"total_tokens\": 1620,\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_dbaca60df0\"\n}\n" - headers: - CF-RAY: - - 937f0e0b0beb7dff-GRU - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 29 Apr 2025 13:13:23 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-REDACTED - openai-processing-ms: - - '16199' - 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: - - '149998914' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_3ee6d725dcf186d1ed6470e43c4ad326 - status: - code: 200 - message: OK -- request: - body: '{"messages": [{"role": "system", "content": "You are Guardrail Agent. You are a expert at validating the output of a task. By providing effective feedback if the output is not valid.\nYour personal goal is: Validate the output of the task\n\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!\nIMPORTANT: Your final answer MUST contain all the information requested in the following format: {\n \"valid\": bool,\n \"feedback\": str | None\n}\n\nIMPORTANT: Ensure the final output does not include any code block markers like ```json or ```python."}, {"role": "user", "content": "\n Ensure the following task result complies with the given guardrail.\n\n Task result:\n 1. **Plant-Based Biofuels Advancements**: Recent - genetic engineering developments enable the cultivation of specialized strains of switchgrass and algae to produce higher biofuel yields, thereby reducing reliance on fossil fuels (Source: Zhang, L. et al., 2025. *Journal of Renewable Energy*. DOI: 10.1016/j.jre.2025.01.005).\n\n2. **CRISPR in Plant Breeding**: The adoption of CRISPR technology has resulted in significant progress in the breeding of disease-resistant and drought-tolerant crops, such as rice and wheat, ensuring better resilience against climate change impacts (Source: Smith, J. et al., 2025. *Plant Biotechnology Journal*. DOI: 10.1111/pbi.13456).\n\n3. **Innovations in Vertical Farming**: Vertical farming now incorporates advanced hydroponics and aeroponics, enhancing efficiency and speed in plant growth while conserving water and reducing pesticide usage (Source: Johnson, R. & Lee, K., 2025. *Agricultural Systems*. DOI: 10.1016/j.agsy.2025.02.006).\n\n4. **Enhancing Photosynthesis**: Research has identified new variations - in light-harvesting proteins aimed at increasing the photosynthesis process in plants, with potential yield increases of up to 50% in staple crops (Source: Patel, A. & Cheng, M., 2025. *New Phytologist*. DOI: 10.1111/nph.17475).\n\n5. **Plant Communication Mechanisms**: Studies demonstrate that plants communicate with neighboring counterparts through root exudates and volatile organic compounds, providing insights into plant ecology and influencing future agricultural practices (Source: Wang, X. et al., 2025. *Ecology Letters*. DOI: 10.1111/ele.13478).\n\n6. **Impact of Soil Microbiomes**: Recent research emphasizes how soil microbiomes are crucial for plant health, with microbial inoculants becoming popular in enhancing nutrient uptake and promoting plant resilience to environmental stresses (Source: Lopez, F. et al., 2025. *Soil Biology and Biochemistry*. DOI: 10.1016/j.soilbio.2025.03.009).\n\n7. **Sustainable Pest Management Research**: Innovative strategies utilizing plant-based - repellents are gaining traction, focusing on cultivating companion plants that naturally deter pests, thereby decreasing reliance on chemical pesticides (Source: Morris, T. & Gray, S., 2025. *Pest Management Science*. DOI: 10.1002/ps.6543).\n\n8. **Urban Forests as Carbon Sinks**: Urban greening initiatives are increasingly promoting the planting of trees and shrubs, recognizing their role in carbon capture, air quality improvement, and biodiversity enhancement amidst urbanization (Source: Thompson, L. et al., 2025. *Urban Forestry & Urban Greening*. DOI: 10.1016/j.ufug.2025.04.012).\n\n9. **Phytoremediation for Environmental Cleanup**: Research into using specific plant species for phytoremediation is expanding, as certain plants show the capacity to absorb heavy metals and toxins, offering sustainable methods for soil and water cleanup (Source: Taylor, M. & Wong, H., 2025. *Environmental Science & Technology*. DOI: 10.1021/acs.est.5b01234).\n\n10. **Biophilic Architectural Designs**: - A growing trend is the integration of plants in architectural designs, using biophilic concepts to create green roofs and living walls that enhance urban ecosystems, improve air quality, and promote biodiversity (Source: Green, C. & Black, R., 2025. *Journal of Urban Design*. DOI: 10.1080/13574809.2025.101001).\n\n Guardrail:\n ensure each bullet contains its source\n \n Your task:\n - Confirm if the Task result complies with the guardrail.\n - If not, provide clear feedback explaining what is wrong (e.g., by how much it violates the rule, or what specific part fails).\n - Focus only on identifying issues \u2014 do not propose corrections.\n - If the Task result complies with the guardrail, saying that is valid\n "}], "model": "gpt-4o-mini", "stop": ["\nObservation:"]}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '4837' - content-type: - - application/json - cookie: - - __cf_bm=4a_upL.aOpvumKsSeVod76qQJryQ9gcG.cvZf8lEbAw-1745932159-1.0.1.1-GTnl1gK1N2Xv_PPjpQRqAzyiVmkomIe02l2R8_be1yz_9PofNkOyUGUpjMBblZUyz4iC7Tm78.fg1IY5Zs7e8rz4MB.09svg9PxqCYBV3Eg; _cfuvid=2Ua1nky3gSdkGURhJ85.hQrqMawwIif2iX06h02kAPI-1745932159900-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.9 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-BRf3zkiFSxkad9D40m0VlnbZFS5un\",\n \"object\": \"chat.completion\",\n \"created\": 1745932403,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Thought: I now can give a great answer \\nFinal Answer: {\\n \\\"valid\\\": true,\\n \\\"feedback\\\": null\\n}\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1070,\n \"completion_tokens\": 28,\n \"total_tokens\": 1098,\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_0392822090\"\n}\n" - headers: - CF-RAY: - - 937f0e71ab957dff-GRU - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 29 Apr 2025 13:13:24 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-REDACTED - openai-processing-ms: - - '644' - 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: - - '149998834' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_ae825814a1e1889a2df7059e8d4e2701 - status: - code: 200 - message: OK -- request: - body: !!binary | - CsAECiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkSlwQKEgoQY3Jld2FpLnRl - bGVtZXRyeRKABAoQ1m7+oki76sJ/FSaQ6BC5vRII3WNswWDJg3IqDFRhc2sgQ3JlYXRlZDABOZCS - 9XhFzDoYQcAB93hFzDoYSi4KCGNyZXdfa2V5EiIKIDZiYTkxMmY5MTI5ZDY4NDlhMGFjNDljZmJk - MzIxZGFkSjEKB2NyZXdfaWQSJgokNmY2NWVjNmYtMGM1NC00MDQ5LThiZTgtOWRkOGRjZTVmMGMx - Si4KCHRhc2tfa2V5EiIKIGIxN2IxODhkYmYxNGY5M2E5OGU1Yjk1YWFkMzY3NTc3SjEKB3Rhc2tf - aWQSJgokYThiYTUyYWUtNzk0Mi00MTZiLThhN2QtN2M3NmQzNDMwMTVhSjoKEGNyZXdfZmluZ2Vy - cHJpbnQSJgokNjMxM2U5NGUtNDQxNS00NDEzLWE0ZjktMzFiYTI3ZTNlMTIzSjoKEHRhc2tfZmlu - Z2VycHJpbnQSJgokZjA2NzQ5YWEtZWE1OS00MzhlLWJiNTctNjY2MzIxNTJhNmJjSjsKG3Rhc2tf - ZmluZ2VycHJpbnRfY3JlYXRlZF9hdBIcChoyMDI1LTA0LTI5VDEwOjEyOjQ4Ljc1NzI1NUo7ChFh - Z2VudF9maW5nZXJwcmludBImCiQ5ZWRjZjI2MS1hMDQ0LTRmZjAtOTAyYy1mNmFmODQ0ZDE4MDh6 - AhgBhQEAAQAA - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '579' - 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: - - Tue, 29 Apr 2025 13:13:28 GMT - status: - code: 200 - message: OK -- request: - body: '{"messages": [{"role": "system", "content": "You are plants Reporting Analyst\n. You''re a meticulous analyst with a keen eye for detail. You''re known for your ability to turn complex data into clear and concise reports, making it easy for others to understand and act on the information you provide.\n\nYour personal goal is: Create detailed reports based on plants data analysis and research findings\n\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: Review the context you got and expand each topic into a full section for a report. Make sure the report is detailed and contains any and all relevant information.\n\n\nThis is the expected criteria for your final answer: A fully fledge - reports with the mains topics, each with a full section of information. Formatted as markdown without ''```''\n\nyou MUST return the actual complete content as the final answer, not a summary.\n\nThis is the context you''re working with:\n1. **Plant-Based Biofuels Advancements**: Recent genetic engineering developments enable the cultivation of specialized strains of switchgrass and algae to produce higher biofuel yields, thereby reducing reliance on fossil fuels (Source: Zhang, L. et al., 2025. *Journal of Renewable Energy*. DOI: 10.1016/j.jre.2025.01.005).\n\n2. **CRISPR in Plant Breeding**: The adoption of CRISPR technology has resulted in significant progress in the breeding of disease-resistant and drought-tolerant crops, such as rice and wheat, ensuring better resilience against climate change impacts (Source: Smith, J. et al., 2025. *Plant Biotechnology Journal*. DOI: 10.1111/pbi.13456).\n\n3. **Innovations in Vertical Farming**: Vertical farming now incorporates advanced hydroponics - and aeroponics, enhancing efficiency and speed in plant growth while conserving water and reducing pesticide usage (Source: Johnson, R. & Lee, K., 2025. *Agricultural Systems*. DOI: 10.1016/j.agsy.2025.02.006).\n\n4. **Enhancing Photosynthesis**: Research has identified new variations in light-harvesting proteins aimed at increasing the photosynthesis process in plants, with potential yield increases of up to 50% in staple crops (Source: Patel, A. & Cheng, M., 2025. *New Phytologist*. DOI: 10.1111/nph.17475).\n\n5. **Plant Communication Mechanisms**: Studies demonstrate that plants communicate with neighboring counterparts through root exudates and volatile organic compounds, providing insights into plant ecology and influencing future agricultural practices (Source: Wang, X. et al., 2025. *Ecology Letters*. DOI: 10.1111/ele.13478).\n\n6. **Impact of Soil Microbiomes**: Recent research emphasizes how soil microbiomes are crucial for plant health, with microbial inoculants becoming - popular in enhancing nutrient uptake and promoting plant resilience to environmental stresses (Source: Lopez, F. et al., 2025. *Soil Biology and Biochemistry*. DOI: 10.1016/j.soilbio.2025.03.009).\n\n7. **Sustainable Pest Management Research**: Innovative strategies utilizing plant-based repellents are gaining traction, focusing on cultivating companion plants that naturally deter pests, thereby decreasing reliance on chemical pesticides (Source: Morris, T. & Gray, S., 2025. *Pest Management Science*. DOI: 10.1002/ps.6543).\n\n8. **Urban Forests as Carbon Sinks**: Urban greening initiatives are increasingly promoting the planting of trees and shrubs, recognizing their role in carbon capture, air quality improvement, and biodiversity enhancement amidst urbanization (Source: Thompson, L. et al., 2025. *Urban Forestry & Urban Greening*. DOI: 10.1016/j.ufug.2025.04.012).\n\n9. **Phytoremediation for Environmental Cleanup**: Research into using specific plant species for phytoremediation - is expanding, as certain plants show the capacity to absorb heavy metals and toxins, offering sustainable methods for soil and water cleanup (Source: Taylor, M. & Wong, H., 2025. *Environmental Science & Technology*. DOI: 10.1021/acs.est.5b01234).\n\n10. **Biophilic Architectural Designs**: A growing trend is the integration of plants in architectural designs, using biophilic concepts to create green roofs and living walls that enhance urban ecosystems, improve air quality, and promote biodiversity (Source: Green, C. & Black, R., 2025. *Journal of Urban Design*. DOI: 10.1080/13574809.2025.101001).\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:"]}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '4781' - content-type: - - application/json - cookie: - - __cf_bm=4a_upL.aOpvumKsSeVod76qQJryQ9gcG.cvZf8lEbAw-1745932159-1.0.1.1-GTnl1gK1N2Xv_PPjpQRqAzyiVmkomIe02l2R8_be1yz_9PofNkOyUGUpjMBblZUyz4iC7Tm78.fg1IY5Zs7e8rz4MB.09svg9PxqCYBV3Eg; _cfuvid=2Ua1nky3gSdkGURhJ85.hQrqMawwIif2iX06h02kAPI-1745932159900-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.9 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-BRf40y6c29SdQI4vAatgsCzR1jPUc\",\n \"object\": \"chat.completion\",\n \"created\": 1745932404,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"I now can give a great answer \\nFinal Answer: \\n\\n# Comprehensive Report on Recent Advancements in Plant Science and Technology\\n\\n## 1. Plant-Based Biofuels Advancements\\nRecent developments in genetic engineering have paved the way for cultivating specialized strains of switchgrass and algae, specifically engineered to enhance biofuel production. These advancements are critical in reducing reliance on fossil fuels, contributing to a more sustainable energy landscape. Studies indicate that these genetically modified strains can yield 30% more biofuel compared to their traditional counterparts, highlighting their potential impact on energy strategies worldwide. Additionally, the adoption\ - \ of these biofuels may significantly lower greenhouse gas emissions, further supporting climate change mitigation initiatives (Source: Zhang, L. et al., 2025. *Journal of Renewable Energy*. DOI: 10.1016/j.jre.2025.01.005).\\n\\n## 2. CRISPR in Plant Breeding\\nThe application of CRISPR technology in plant breeding has led to remarkable progress in developing crops that are both disease-resistant and drought-tolerant. Notably, advancements in rice and wheat breeding have resulted in varieties that can withstand extreme weather conditions, enhancing food security. This technology allows for precise alterations in plant genomes, promoting resilience against increasingly unpredictable climate-related challenges. The implications for global agriculture are vast, as these developments could bolster yields and reduce crop loss, addressing pressing food supply issues (Source: Smith, J. et al., 2025. *Plant Biotechnology Journal*. DOI: 10.1111/pbi.13456).\\n\\n## 3. Innovations in Vertical\ - \ Farming\\nInnovations in vertical farming have revolutionized conventional agricultural methods by introducing advanced hydroponics and aeroponics systems. These new farming techniques optimize space usage and enhance growth efficiency, enabling year-round production independent of traditional seasonal constraints. Vertical farming not only conserves water significantly—up to 90% less than conventional farming—but also reduces pesticide use through controlled environment agriculture. This shift could ensure a sustainable food supply for urban populations, mitigating challenges posed by increasing urbanization (Source: Johnson, R. & Lee, K., 2025. *Agricultural Systems*. DOI: 10.1016/j.agsy.2025.02.006).\\n\\n## 4. Enhancing Photosynthesis\\nRecent research has uncovered new variations in light-harvesting proteins that could substantially increase the efficiency of photosynthesis in plants. The potential for yield increases of up to 50% in staple crops has been demonstrated, which\ - \ could significantly impact global food production. By harnessing these findings, scientists aim to enhance crop productivity, thus addressing food scarcity challenges due to population growth and climate change adversities (Source: Patel, A. & Cheng, M., 2025. *New Phytologist*. DOI: 10.1111/nph.17475).\\n\\n## 5. Plant Communication Mechanisms\\nStudies have shown that plants communicate with one another through the release of root exudates and volatile organic compounds. This communication plays a crucial role in ecological interactions and could inform future agricultural practices by promoting plant health and resilience. Understanding these mechanisms can lead to strategies that enhance crop growth and productivity through bioecological networks, thereby fostering more sustainable agricultural systems (Source: Wang, X. et al., 2025. *Ecology Letters*. DOI: 10.1111/ele.13478).\\n\\n## 6. Impact of Soil Microbiomes\\nRecent research underscores the essential role of soil microbiomes\ - \ in promoting plant health. The use of microbial inoculants has surged, as these beneficial microorganisms enhance nutrient uptake and overall plant resilience to environmental stresses. Soil health directly correlates to plant productivity; hence, fostering effective microbiome interactions can lead to better crop yields and reduced dependence on chemical fertilizers (Source: Lopez, F. et al., 2025. *Soil Biology and Biochemistry*. DOI: 10.1016/j.soilbio.2025.03.009).\\n\\n## 7. Sustainable Pest Management Research\\nInnovative pest management strategies are emerging, with a focus on utilizing plant-based repellents and companion planting techniques. By cultivating plants that naturally deter pests, agricultural practices can reduce reliance on harmful chemical pesticides. This sustainable approach enhances biodiversity and contributes to a healthier ecosystem, aligning with increasing consumer demand for chemical-free agricultural products (Source: Morris, T. & Gray, S., 2025.\ - \ *Pest Management Science*. DOI: 10.1002/ps.6543).\\n\\n## 8. Urban Forests as Carbon Sinks\\nUrban greening initiatives have gained momentum, emphasizing the importance of planting trees and shrubs in urban areas. These urban forests act as significant carbon sinks, improve air quality, and enhance biodiversity amidst urbanization challenges. Moreover, cities adopting green infrastructure strategies can mitigate the urban heat island effect, promoting healthier living conditions for residents (Source: Thompson, L. et al., 2025. *Urban Forestry & Urban Greening*. DOI: 10.1016/j.ufug.2025.04.012).\\n\\n## 9. Phytoremediation for Environmental Cleanup\\nThe expansion of phytoremediation research showcases the potential of select plant species in environmental cleanup efforts. These plants have been shown to absorb heavy metals and toxins from the soil, providing a sustainable solution for soil and water contamination issues. Utilizing plants for remediation can significantly lower\ - \ cleanup costs and protect ecosystems, thus playing a vital role in environmental restoration efforts (Source: Taylor, M. & Wong, H., 2025. *Environmental Science & Technology*. DOI: 10.1021/acs.est.5b01234).\\n\\n## 10. Biophilic Architectural Designs\\nThe rise of biophilic architectural designs highlights the integration of plants into urban structures, emphasizing the benefits of green roofs and living walls. These designs enhance urban ecosystems by improving air quality and promoting biodiversity. As cities continue to grow, incorporating nature into architecture not only boosts the aesthetic value but also contributes to the mental and physical well-being of city dwellers (Source: Green, C. & Black, R., 2025. *Journal of Urban Design*. DOI: 10.1080/13574809.2025.101001).\\n\\nIn conclusion, the latest research and innovations across various fields of plant science present exciting opportunities to address contemporary agricultural, environmental, and urban challenges. By\ - \ embracing these advancements, we can pave the way for a more sustainable future that supports both human needs and ecological integrity.\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1055,\n \"completion_tokens\": 1317,\n \"total_tokens\": 2372,\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_dbaca60df0\"\n}\n" - headers: - CF-RAY: - - 937f0e77086e7dff-GRU - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Tue, 29 Apr 2025 13:13:51 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-REDACTED - openai-processing-ms: - - '26924' - 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: - - '149998845' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_663ef6f3401bc32e39e986bfa820a8d3 - status: - code: 200 - message: OK -- request: - body: null - headers: {} - method: GET - uri: https://pypi.org/pypi/agentops/json - response: - body: - string: '{"info":{"author":null,"author_email":"Alex Reibman , Shawn Qiu , Braelyn Boynton , Howard Gil , Constantin Teodorescu , Pratyush Shukla , Travis Dent , Dwij Patel , Fenil Faldu ","bugtrack_url":null,"classifiers":["License :: OSI Approved :: MIT License","Operating System :: OS Independent","Programming Language :: Python :: 3","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Programming Language :: Python :: 3.12","Programming Language :: Python :: 3.13","Programming Language :: Python :: 3.9"],"description":"","description_content_type":null,"docs_url":null,"download_url":null,"downloads":{"last_day":-1,"last_month":-1,"last_week":-1},"dynamic":null,"home_page":null,"keywords":null,"license":null,"license_expression":null,"license_files":["LICENSE"],"maintainer":null,"maintainer_email":null,"name":"agentops","package_url":"https://pypi.org/project/agentops/","platform":null,"project_url":"https://pypi.org/project/agentops/","project_urls":{"Homepage":"https://github.com/AgentOps-AI/agentops","Issues":"https://github.com/AgentOps-AI/agentops/issues"},"provides_extra":null,"release_url":"https://pypi.org/project/agentops/0.4.16/","requires_dist":["httpx<0.29.0,>=0.24.0","opentelemetry-api==1.29.0; - python_version < \"3.10\"","opentelemetry-api>1.29.0; python_version >= \"3.10\"","opentelemetry-exporter-otlp-proto-http==1.29.0; python_version < \"3.10\"","opentelemetry-exporter-otlp-proto-http>1.29.0; python_version >= \"3.10\"","opentelemetry-instrumentation==0.50b0; python_version < \"3.10\"","opentelemetry-instrumentation>=0.50b0; python_version >= \"3.10\"","opentelemetry-sdk==1.29.0; python_version < \"3.10\"","opentelemetry-sdk>1.29.0; python_version >= \"3.10\"","opentelemetry-semantic-conventions==0.50b0; python_version < \"3.10\"","opentelemetry-semantic-conventions>=0.50b0; python_version >= \"3.10\"","ordered-set<5.0.0,>=4.0.0","packaging<25.0,>=21.0","psutil<7.0.1,>=5.9.8","pyyaml<7.0,>=5.3","requests<3.0.0,>=2.0.0","termcolor<2.5.0,>=2.3.0","wrapt<2.0.0,>=1.0.0"],"requires_python":">=3.9","summary":"Observability and DevTool Platform for AI Agents","version":"0.4.16","yanked":false,"yanked_reason":null},"last_serial":29695949,"releases":{"0.0.1":[{"comment_text":"","digests":{"blake2b_256":"9b4641d084346e88671acc02e3a0049d3e0925fe99edd88c8b82700dc3c04d01","md5":"2b491f3b3dd01edd4ee37c361087bb46","sha256":"f2cb9d59a0413e7977a44a23dbd6a9d89cda5309b63ed08f5c346c7488acf645"},"downloads":-1,"filename":"agentops-0.0.1-py3-none-any.whl","has_sig":false,"md5_digest":"2b491f3b3dd01edd4ee37c361087bb46","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":10328,"upload_time":"2023-08-21T18:33:47","upload_time_iso_8601":"2023-08-21T18:33:47.827866Z","url":"https://files.pythonhosted.org/packages/9b/46/41d084346e88671acc02e3a0049d3e0925fe99edd88c8b82700dc3c04d01/agentops-0.0.1-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"b280bf609d98778499bd42df723100a8e910d9b9827cbd00b804cf0b13bb3c87","md5":"ff218fc16d45cf72f73d50ee9a0afe82","sha256":"5c3d4311b9dde0c71cb475ec99d2963a71604c78d468b333f55e81364f4fe79e"},"downloads":-1,"filename":"agentops-0.0.1.tar.gz","has_sig":false,"md5_digest":"ff218fc16d45cf72f73d50ee9a0afe82","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":11452,"upload_time":"2023-08-21T18:33:49","upload_time_iso_8601":"2023-08-21T18:33:49.613830Z","url":"https://files.pythonhosted.org/packages/b2/80/bf609d98778499bd42df723100a8e910d9b9827cbd00b804cf0b13bb3c87/agentops-0.0.1.tar.gz","yanked":false,"yanked_reason":null}],"0.0.10":[{"comment_text":"","digests":{"blake2b_256":"92933862af53105332cb524db237138d3284b5d6abcc7df5fd4406e382372d94","md5":"8bdea319b5579775eb88efac72e70cd6","sha256":"e8a333567458c1df35538d626bc596f3ba7b8fa2aac5015bc378f3f7f8850669"},"downloads":-1,"filename":"agentops-0.0.10-py3-none-any.whl","has_sig":false,"md5_digest":"8bdea319b5579775eb88efac72e70cd6","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":14752,"upload_time":"2023-12-16T01:40:40","upload_time_iso_8601":"2023-12-16T01:40:40.867657Z","url":"https://files.pythonhosted.org/packages/92/93/3862af53105332cb524db237138d3284b5d6abcc7df5fd4406e382372d94/agentops-0.0.10-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"c63136b1f2e508b67f92ddb5f51f2acf5abdf2bf4b32d5b355d8018b368dc854","md5":"87bdcd4d7469d22ce922234d4f0b2b98","sha256":"5fbc567bece7b218fc35ce70d208e88e89bb399a9dbf84ab7ad59a2aa559648c"},"downloads":-1,"filename":"agentops-0.0.10.tar.gz","has_sig":false,"md5_digest":"87bdcd4d7469d22ce922234d4f0b2b98","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":15099,"upload_time":"2023-12-16T01:40:42","upload_time_iso_8601":"2023-12-16T01:40:42.281826Z","url":"https://files.pythonhosted.org/packages/c6/31/36b1f2e508b67f92ddb5f51f2acf5abdf2bf4b32d5b355d8018b368dc854/agentops-0.0.10.tar.gz","yanked":false,"yanked_reason":null}],"0.0.11":[{"comment_text":"","digests":{"blake2b_256":"7125ed114f918332cda824092f620b1002fd76ab6b538dd83711b31c93907139","md5":"83ba7e621f01412144aa38306fc1e04c","sha256":"cb80823e065d17dc26bdc8fe951ea7e04b23677ef2b4da939669c6fe1b2502bf"},"downloads":-1,"filename":"agentops-0.0.11-py3-none-any.whl","has_sig":false,"md5_digest":"83ba7e621f01412144aa38306fc1e04c","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":16627,"upload_time":"2023-12-21T19:50:28","upload_time_iso_8601":"2023-12-21T19:50:28.595886Z","url":"https://files.pythonhosted.org/packages/71/25/ed114f918332cda824092f620b1002fd76ab6b538dd83711b31c93907139/agentops-0.0.11-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"9e037750b04398cda2548bbf3d84ce554c4009592095c060c4904e773f3a43da","md5":"5bbb120cc9a5f5ff6fb5dd45691ba279","sha256":"cbf0f39768d47e32be448a3ff3ded665fce64ff8a90c0e10692fd7a3ab4790ee"},"downloads":-1,"filename":"agentops-0.0.11.tar.gz","has_sig":false,"md5_digest":"5bbb120cc9a5f5ff6fb5dd45691ba279","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":16794,"upload_time":"2023-12-21T19:50:29","upload_time_iso_8601":"2023-12-21T19:50:29.881561Z","url":"https://files.pythonhosted.org/packages/9e/03/7750b04398cda2548bbf3d84ce554c4009592095c060c4904e773f3a43da/agentops-0.0.11.tar.gz","yanked":false,"yanked_reason":null}],"0.0.12":[{"comment_text":"","digests":{"blake2b_256":"adf5cc3e93b2328532ea80b8b36450b8b48a8199ebbe1f75ebb490e57a926b88","md5":"694ba49ca8841532039bdf8dc0250b85","sha256":"9a2c773efbe3353f60d1b86da12333951dad288ba54839615a53b57e5965bea8"},"downloads":-1,"filename":"agentops-0.0.12-py3-none-any.whl","has_sig":false,"md5_digest":"694ba49ca8841532039bdf8dc0250b85","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":18602,"upload_time":"2024-01-03T03:47:07","upload_time_iso_8601":"2024-01-03T03:47:07.184203Z","url":"https://files.pythonhosted.org/packages/ad/f5/cc3e93b2328532ea80b8b36450b8b48a8199ebbe1f75ebb490e57a926b88/agentops-0.0.12-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"7eb0633ecd30c74a0613c7330ececf0303286622ce429f08ce0daa9ee8cc4ecf","md5":"025daef9622472882a1fa58b6c1fddb5","sha256":"fbb4c38711a7dff3ab08004591451b5a5c33bea5e496fa71fac668c7284513d2"},"downloads":-1,"filename":"agentops-0.0.12.tar.gz","has_sig":false,"md5_digest":"025daef9622472882a1fa58b6c1fddb5","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":19826,"upload_time":"2024-01-03T03:47:08","upload_time_iso_8601":"2024-01-03T03:47:08.942790Z","url":"https://files.pythonhosted.org/packages/7e/b0/633ecd30c74a0613c7330ececf0303286622ce429f08ce0daa9ee8cc4ecf/agentops-0.0.12.tar.gz","yanked":false,"yanked_reason":null}],"0.0.13":[{"comment_text":"","digests":{"blake2b_256":"3a0f9c1500adb4191531374db4d7920c51aba92c5472d13d172108e881c36948","md5":"f0a3b78c15af3ab467778f94fb50bf4a","sha256":"3379a231f37a375bda421114a5626643263e84ce951503d0bdff8411149946e0"},"downloads":-1,"filename":"agentops-0.0.13-py3-none-any.whl","has_sig":false,"md5_digest":"f0a3b78c15af3ab467778f94fb50bf4a","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":18709,"upload_time":"2024-01-07T08:57:57","upload_time_iso_8601":"2024-01-07T08:57:57.456769Z","url":"https://files.pythonhosted.org/packages/3a/0f/9c1500adb4191531374db4d7920c51aba92c5472d13d172108e881c36948/agentops-0.0.13-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"cbf9a3824bd30d7107aaca8d409165c0a3574a879efd7ca0fea755e903623b61","md5":"0ebceb6aad82c0622adcd4c2633fc677","sha256":"5e6adf68c2a533496648ea3fabb6e791f39ce810d18dbc1354d118b195fd8556"},"downloads":-1,"filename":"agentops-0.0.13.tar.gz","has_sig":false,"md5_digest":"0ebceb6aad82c0622adcd4c2633fc677","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":19933,"upload_time":"2024-01-07T08:57:59","upload_time_iso_8601":"2024-01-07T08:57:59.146933Z","url":"https://files.pythonhosted.org/packages/cb/f9/a3824bd30d7107aaca8d409165c0a3574a879efd7ca0fea755e903623b61/agentops-0.0.13.tar.gz","yanked":false,"yanked_reason":null}],"0.0.14":[{"comment_text":"","digests":{"blake2b_256":"252b1d8ee3b4ab02215eb1a52865a9f2c209d6d4cbf4a3444fb7faf23b02ca66","md5":"a8ba77b0ec0d25072b2e0535a135cc40","sha256":"d5bb4661642daf8fc63a257ef0f04ccc5c79a73e73d57ea04190e74d9a3e6df9"},"downloads":-1,"filename":"agentops-0.0.14-py3-none-any.whl","has_sig":false,"md5_digest":"a8ba77b0ec0d25072b2e0535a135cc40","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":18710,"upload_time":"2024-01-08T21:52:28","upload_time_iso_8601":"2024-01-08T21:52:28.340899Z","url":"https://files.pythonhosted.org/packages/25/2b/1d8ee3b4ab02215eb1a52865a9f2c209d6d4cbf4a3444fb7faf23b02ca66/agentops-0.0.14-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"bf3a1fdf85563c47c2fc6571a1406aecb772f644d53a2adabf4981012971587a","md5":"1ecf7177ab57738c6663384de20887e5","sha256":"c54cee1c9ed1b5b7829fd80d5d01278b1efb50e977e5a890627f4688d0f2afb2"},"downloads":-1,"filename":"agentops-0.0.14.tar.gz","has_sig":false,"md5_digest":"1ecf7177ab57738c6663384de20887e5","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":19932,"upload_time":"2024-01-08T21:52:29","upload_time_iso_8601":"2024-01-08T21:52:29.988596Z","url":"https://files.pythonhosted.org/packages/bf/3a/1fdf85563c47c2fc6571a1406aecb772f644d53a2adabf4981012971587a/agentops-0.0.14.tar.gz","yanked":false,"yanked_reason":null}],"0.0.15":[{"comment_text":"","digests":{"blake2b_256":"0c5374cbe5c78db9faa7c939d1a91eff111c4d3f13f4d8d18920ddd48f89f335","md5":"c4528a66151e76c7b1abdcac3c3eaf52","sha256":"aa8034dc9a0e9e56014a06fac521fc2a63a968d34f73e4d4c9bef4b0e87f8241"},"downloads":-1,"filename":"agentops-0.0.15-py3-none-any.whl","has_sig":false,"md5_digest":"c4528a66151e76c7b1abdcac3c3eaf52","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":18734,"upload_time":"2024-01-23T08:43:24","upload_time_iso_8601":"2024-01-23T08:43:24.651479Z","url":"https://files.pythonhosted.org/packages/0c/53/74cbe5c78db9faa7c939d1a91eff111c4d3f13f4d8d18920ddd48f89f335/agentops-0.0.15-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"da56c7d8189f4accc182be6729bc44a8006d981173e721ff4751ab784bbadfb3","md5":"cd27bff6c943c6fcbed33ed8280ab5ea","sha256":"71b0e048d2f1b86744105509436cbb6fa51e6b418a50a8253849dc6cdeda6cca"},"downloads":-1,"filename":"agentops-0.0.15.tar.gz","has_sig":false,"md5_digest":"cd27bff6c943c6fcbed33ed8280ab5ea","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":19985,"upload_time":"2024-01-23T08:43:26","upload_time_iso_8601":"2024-01-23T08:43:26.316265Z","url":"https://files.pythonhosted.org/packages/da/56/c7d8189f4accc182be6729bc44a8006d981173e721ff4751ab784bbadfb3/agentops-0.0.15.tar.gz","yanked":false,"yanked_reason":null}],"0.0.16":[{"comment_text":"","digests":{"blake2b_256":"b694d78d43f49688829cab72b7326db1d9e3f436f71eed113f26d402fefa6856","md5":"657c2cad11b3c8b97469524bff19b916","sha256":"e9633dcbc419a47db8de13bd0dc4f5d55f0a50ef3434ffe8e1f8a3468561bd60"},"downloads":-1,"filename":"agentops-0.0.16-py3-none-any.whl","has_sig":false,"md5_digest":"657c2cad11b3c8b97469524bff19b916","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":18736,"upload_time":"2024-01-23T09:03:05","upload_time_iso_8601":"2024-01-23T09:03:05.799496Z","url":"https://files.pythonhosted.org/packages/b6/94/d78d43f49688829cab72b7326db1d9e3f436f71eed113f26d402fefa6856/agentops-0.0.16-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"ec353005c98c1e2642d61510a9977c2118d3baa72f50e3c45ef6a341bfd9a3b0","md5":"2f9b28dd0953fdd2da606e19b9131006","sha256":"469588d72734fc6e90c66cf9658613baf2a0b94c933a23cab16820435576c61f"},"downloads":-1,"filename":"agentops-0.0.16.tar.gz","has_sig":false,"md5_digest":"2f9b28dd0953fdd2da606e19b9131006","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":19986,"upload_time":"2024-01-23T09:03:07","upload_time_iso_8601":"2024-01-23T09:03:07.645949Z","url":"https://files.pythonhosted.org/packages/ec/35/3005c98c1e2642d61510a9977c2118d3baa72f50e3c45ef6a341bfd9a3b0/agentops-0.0.16.tar.gz","yanked":false,"yanked_reason":null}],"0.0.17":[{"comment_text":"","digests":{"blake2b_256":"f3b2eff27fc5373097fc4f4d3d90f4d0fad1c3be7b923a6213750fe1cb022e6e","md5":"20325afd9b9d9633b120b63967d4ae85","sha256":"1a7c8d8fc8821e2e7eedbbe2683e076bfaca3434401b0d1ca6b830bf3230e61e"},"downloads":-1,"filename":"agentops-0.0.17-py3-none-any.whl","has_sig":false,"md5_digest":"20325afd9b9d9633b120b63967d4ae85","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":18827,"upload_time":"2024-01-23T17:12:19","upload_time_iso_8601":"2024-01-23T17:12:19.300806Z","url":"https://files.pythonhosted.org/packages/f3/b2/eff27fc5373097fc4f4d3d90f4d0fad1c3be7b923a6213750fe1cb022e6e/agentops-0.0.17-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"ac2a2cb7548cce5b009bee9e6f9b46b26df1cca777830231e2d1603b83740053","md5":"4ac65e38fa45946f1d382ce290b904e9","sha256":"cc1e7f796a84c66a29b271d8f0faa4999c152c80195911b817502da002a3ae02"},"downloads":-1,"filename":"agentops-0.0.17.tar.gz","has_sig":false,"md5_digest":"4ac65e38fa45946f1d382ce290b904e9","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":20063,"upload_time":"2024-01-23T17:12:20","upload_time_iso_8601":"2024-01-23T17:12:20.558647Z","url":"https://files.pythonhosted.org/packages/ac/2a/2cb7548cce5b009bee9e6f9b46b26df1cca777830231e2d1603b83740053/agentops-0.0.17.tar.gz","yanked":false,"yanked_reason":null}],"0.0.18":[{"comment_text":"","digests":{"blake2b_256":"321102c865df2245ab8cfaeb48a72ef7011a7bbbe1553a43791d68295ff7c20d","md5":"ad10ec2bf28bf434d3d2f11500f5a396","sha256":"df241f6a62368aa645d1599bb6885688fba0d49dcc26f97f7f65ab29a6af1a2a"},"downloads":-1,"filename":"agentops-0.0.18-py3-none-any.whl","has_sig":false,"md5_digest":"ad10ec2bf28bf434d3d2f11500f5a396","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":18860,"upload_time":"2024-01-24T04:39:06","upload_time_iso_8601":"2024-01-24T04:39:06.952175Z","url":"https://files.pythonhosted.org/packages/32/11/02c865df2245ab8cfaeb48a72ef7011a7bbbe1553a43791d68295ff7c20d/agentops-0.0.18-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"7831bd4249dcf9a0cdcad5451ca62aa83187295bb9c16fd1b3034999bff7ceaf","md5":"76dc30c0a2e68f09c0411c23dd5e3a36","sha256":"47e071424247dbbb1b9aaf07ff60a7e376ae01666478d0305d62a9068d61c1c1"},"downloads":-1,"filename":"agentops-0.0.18.tar.gz","has_sig":false,"md5_digest":"76dc30c0a2e68f09c0411c23dd5e3a36","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":20094,"upload_time":"2024-01-24T04:39:09","upload_time_iso_8601":"2024-01-24T04:39:09.795862Z","url":"https://files.pythonhosted.org/packages/78/31/bd4249dcf9a0cdcad5451ca62aa83187295bb9c16fd1b3034999bff7ceaf/agentops-0.0.18.tar.gz","yanked":false,"yanked_reason":null}],"0.0.19":[{"comment_text":"","digests":{"blake2b_256":"9d48292d743b748eddc01b51747e1dac4b62dea0eb5f240877bae821c0049572","md5":"a26178cdf9d5fc5b466a30e5990c16a1","sha256":"0e663e26aad41bf0288d250685e88130430dd087d03ffc69aa7f43e587921b59"},"downloads":-1,"filename":"agentops-0.0.19-py3-none-any.whl","has_sig":false,"md5_digest":"a26178cdf9d5fc5b466a30e5990c16a1","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":18380,"upload_time":"2024-01-24T07:58:38","upload_time_iso_8601":"2024-01-24T07:58:38.440021Z","url":"https://files.pythonhosted.org/packages/9d/48/292d743b748eddc01b51747e1dac4b62dea0eb5f240877bae821c0049572/agentops-0.0.19-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"dfe6f3b3fc53b050ec70de947e27227d0ea1e7a75037d082fc5f4d914178d12f","md5":"c62a69951acd19121b059215cf0ddb8b","sha256":"3d46faabf2dad44bd4705279569c76240ab5c71f03f511ba9d363dfd033d453e"},"downloads":-1,"filename":"agentops-0.0.19.tar.gz","has_sig":false,"md5_digest":"c62a69951acd19121b059215cf0ddb8b","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":19728,"upload_time":"2024-01-24T07:58:41","upload_time_iso_8601":"2024-01-24T07:58:41.352463Z","url":"https://files.pythonhosted.org/packages/df/e6/f3b3fc53b050ec70de947e27227d0ea1e7a75037d082fc5f4d914178d12f/agentops-0.0.19.tar.gz","yanked":false,"yanked_reason":null}],"0.0.2":[{"comment_text":"","digests":{"blake2b_256":"e593e3863d3c61a75e43a347d423f754bc57559989773af6a9c7bc696ff1d6b4","md5":"8ff77b84c32a4e846ce50c6844664b49","sha256":"3bea2bdd8a26c190675aaf2775d97bc2e3c52d7da05c04ae8ec46fed959e0c6e"},"downloads":-1,"filename":"agentops-0.0.2-py3-none-any.whl","has_sig":false,"md5_digest":"8ff77b84c32a4e846ce50c6844664b49","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":10452,"upload_time":"2023-08-28T23:14:23","upload_time_iso_8601":"2023-08-28T23:14:23.488523Z","url":"https://files.pythonhosted.org/packages/e5/93/e3863d3c61a75e43a347d423f754bc57559989773af6a9c7bc696ff1d6b4/agentops-0.0.2-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"82dbea7088c3ba71d9882a8d09d896d8529100f3103d1fe58ff4b890f9d616f1","md5":"02c4fed5ca014de524e5c1dfe3ec2dd2","sha256":"dc183d28965a9514cb33d916b29b3159189f5be64c4a7d943be0cad1a00379f9"},"downloads":-1,"filename":"agentops-0.0.2.tar.gz","has_sig":false,"md5_digest":"02c4fed5ca014de524e5c1dfe3ec2dd2","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":11510,"upload_time":"2023-08-28T23:14:24","upload_time_iso_8601":"2023-08-28T23:14:24.882664Z","url":"https://files.pythonhosted.org/packages/82/db/ea7088c3ba71d9882a8d09d896d8529100f3103d1fe58ff4b890f9d616f1/agentops-0.0.2.tar.gz","yanked":false,"yanked_reason":null}],"0.0.20":[{"comment_text":"","digests":{"blake2b_256":"ad68d8cc6d631618e04ec6988d0c3f4462a74b0b5849719b8373c2470cf9d533","md5":"09b2866043abc3e5cb5dfc17b80068cb","sha256":"ba20fc48902434858f28e3c4a7febe56d275a28bd33378868e7fcde2f53f2430"},"downloads":-1,"filename":"agentops-0.0.20-py3-none-any.whl","has_sig":false,"md5_digest":"09b2866043abc3e5cb5dfc17b80068cb","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":18367,"upload_time":"2024-01-25T07:12:48","upload_time_iso_8601":"2024-01-25T07:12:48.514177Z","url":"https://files.pythonhosted.org/packages/ad/68/d8cc6d631618e04ec6988d0c3f4462a74b0b5849719b8373c2470cf9d533/agentops-0.0.20-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"0ba37435a8ce7125c7d75b931a373a188acf1c9e793be28db1b5c5e5a57d7a10","md5":"fb700178ad44a4697b696ecbd28d115c","sha256":"d50623b03b410c8c88718c29ea271304681e1305b5c05ba824edb92d18aab4f8"},"downloads":-1,"filename":"agentops-0.0.20.tar.gz","has_sig":false,"md5_digest":"fb700178ad44a4697b696ecbd28d115c","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":19707,"upload_time":"2024-01-25T07:12:49","upload_time_iso_8601":"2024-01-25T07:12:49.915462Z","url":"https://files.pythonhosted.org/packages/0b/a3/7435a8ce7125c7d75b931a373a188acf1c9e793be28db1b5c5e5a57d7a10/agentops-0.0.20.tar.gz","yanked":false,"yanked_reason":null}],"0.0.21":[{"comment_text":"","digests":{"blake2b_256":"9182ceb8c12e05c0e56ea6c5ba7395c57764ffc5a8134fd045b247793873c172","md5":"ce428cf01a0c1066d3f1f3c8ca6b4f9b","sha256":"fdefe50d945ad669b33c90bf526f9af0e7dc4792b4443aeb907b0a36de2be186"},"downloads":-1,"filename":"agentops-0.0.21-py3-none-any.whl","has_sig":false,"md5_digest":"ce428cf01a0c1066d3f1f3c8ca6b4f9b","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":18483,"upload_time":"2024-02-22T03:07:14","upload_time_iso_8601":"2024-02-22T03:07:14.032143Z","url":"https://files.pythonhosted.org/packages/91/82/ceb8c12e05c0e56ea6c5ba7395c57764ffc5a8134fd045b247793873c172/agentops-0.0.21-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"acbb361e3d7ed85fc4207ffbbe44ddfa7ee3b8f96b76c3712d4153d63ebb45e2","md5":"360f00d330fa37ad10f687906e31e219","sha256":"ec10f8e64c553a1c400f1d5c792c3daef383cd718747cabb8e5abc9ef685f25d"},"downloads":-1,"filename":"agentops-0.0.21.tar.gz","has_sig":false,"md5_digest":"360f00d330fa37ad10f687906e31e219","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":19787,"upload_time":"2024-02-22T03:07:15","upload_time_iso_8601":"2024-02-22T03:07:15.546312Z","url":"https://files.pythonhosted.org/packages/ac/bb/361e3d7ed85fc4207ffbbe44ddfa7ee3b8f96b76c3712d4153d63ebb45e2/agentops-0.0.21.tar.gz","yanked":false,"yanked_reason":null}],"0.0.22":[{"comment_text":"","digests":{"blake2b_256":"b9da29a808d5bd3045f80b5652737e94695056b4a7cf7830ed7de037b1fe941c","md5":"d9e04a68f0b143432b9e34341e4f0a17","sha256":"fbcd962ff08a2e216637341c36c558be74368fbfda0b2408e55388e4c96474ca"},"downloads":-1,"filename":"agentops-0.0.22-py3-none-any.whl","has_sig":false,"md5_digest":"d9e04a68f0b143432b9e34341e4f0a17","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":18485,"upload_time":"2024-02-29T21:16:00","upload_time_iso_8601":"2024-02-29T21:16:00.124986Z","url":"https://files.pythonhosted.org/packages/b9/da/29a808d5bd3045f80b5652737e94695056b4a7cf7830ed7de037b1fe941c/agentops-0.0.22-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"4d842d1c5d80c69e6c9b8f3fd925c2f2fd084ad6eb29d93fdeadbdeca79e5eda","md5":"8f3b286fd01c2c43f7f7b1e4aebe3594","sha256":"397544ce90474fee59f1e8561c92f4923e9034842be593f1ac41437c5fca5841"},"downloads":-1,"filename":"agentops-0.0.22.tar.gz","has_sig":false,"md5_digest":"8f3b286fd01c2c43f7f7b1e4aebe3594","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":19784,"upload_time":"2024-02-29T21:16:01","upload_time_iso_8601":"2024-02-29T21:16:01.909583Z","url":"https://files.pythonhosted.org/packages/4d/84/2d1c5d80c69e6c9b8f3fd925c2f2fd084ad6eb29d93fdeadbdeca79e5eda/agentops-0.0.22.tar.gz","yanked":false,"yanked_reason":null}],"0.0.3":[{"comment_text":"","digests":{"blake2b_256":"324eda261865c2042eeb5da9827a350760e435896855d5480b8f3136212c3f65","md5":"07a9f9f479a14e65b82054a145514e8d","sha256":"35351701e3caab900243771bda19d6613bdcb84cc9ef2e1adde431a775c09af8"},"downloads":-1,"filename":"agentops-0.0.3-py3-none-any.whl","has_sig":false,"md5_digest":"07a9f9f479a14e65b82054a145514e8d","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":11872,"upload_time":"2023-09-13T23:03:34","upload_time_iso_8601":"2023-09-13T23:03:34.300564Z","url":"https://files.pythonhosted.org/packages/32/4e/da261865c2042eeb5da9827a350760e435896855d5480b8f3136212c3f65/agentops-0.0.3-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"643485e455d4f411b56bef2a99c40e32f35f456c93deda0a3915231f1da92e56","md5":"c637ee3cfa358b65ed14cfc20d5f803f","sha256":"45a57492e4072f3f27b5e851f6e501b54c796f6ace5f65ecf70e51dbe18ca1a8"},"downloads":-1,"filename":"agentops-0.0.3.tar.gz","has_sig":false,"md5_digest":"c637ee3cfa358b65ed14cfc20d5f803f","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":12455,"upload_time":"2023-09-13T23:03:35","upload_time_iso_8601":"2023-09-13T23:03:35.513682Z","url":"https://files.pythonhosted.org/packages/64/34/85e455d4f411b56bef2a99c40e32f35f456c93deda0a3915231f1da92e56/agentops-0.0.3.tar.gz","yanked":false,"yanked_reason":null}],"0.0.4":[{"comment_text":"","digests":{"blake2b_256":"20cc12cf2391854ed588eaf6cdc87f60048f84e8dc7d15792850b7e90a0406b8","md5":"7a3c11004517e22dc7cde83cf6d8d5e8","sha256":"5a5cdcbe6e32c59237521182b83768e650b4519416b42f4e13929a115a0f20ee"},"downloads":-1,"filename":"agentops-0.0.4-py3-none-any.whl","has_sig":false,"md5_digest":"7a3c11004517e22dc7cde83cf6d8d5e8","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":13520,"upload_time":"2023-09-22T09:23:52","upload_time_iso_8601":"2023-09-22T09:23:52.896099Z","url":"https://files.pythonhosted.org/packages/20/cc/12cf2391854ed588eaf6cdc87f60048f84e8dc7d15792850b7e90a0406b8/agentops-0.0.4-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"98d2d9f9932d17711dd5d98af674c868686bdbdd9aaae9b8d69e9eecfd4c68f4","md5":"712d3bc3b28703963f8f398845b1d17a","sha256":"97743c6420bc5ba2655ac690041d5f5732fb950130cf61ab25ef6d44be6ecfb2"},"downloads":-1,"filename":"agentops-0.0.4.tar.gz","has_sig":false,"md5_digest":"712d3bc3b28703963f8f398845b1d17a","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":14050,"upload_time":"2023-09-22T09:23:54","upload_time_iso_8601":"2023-09-22T09:23:54.315467Z","url":"https://files.pythonhosted.org/packages/98/d2/d9f9932d17711dd5d98af674c868686bdbdd9aaae9b8d69e9eecfd4c68f4/agentops-0.0.4.tar.gz","yanked":false,"yanked_reason":null}],"0.0.5":[{"comment_text":"","digests":{"blake2b_256":"e900cd903074a01932ded9a05dac7849a16c5850ed20c027b954b1eccfba54c1","md5":"1bd4fd6cca14dac4947ecc6c4e3fe0a1","sha256":"e39e1051ba8c58f222f3495196eb939ccc53f04bd279372ae01e694973dd25d6"},"downloads":-1,"filename":"agentops-0.0.5-py3-none-any.whl","has_sig":false,"md5_digest":"1bd4fd6cca14dac4947ecc6c4e3fe0a1","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":14107,"upload_time":"2023-10-07T00:22:48","upload_time_iso_8601":"2023-10-07T00:22:48.714074Z","url":"https://files.pythonhosted.org/packages/e9/00/cd903074a01932ded9a05dac7849a16c5850ed20c027b954b1eccfba54c1/agentops-0.0.5-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"08d5c29068ce4df9c85865b45e1cdb7be1df06e54fce087fad18ec390a7aea54","md5":"4d8fc5553e3199fe24d6118337884a2b","sha256":"8f3662e600ba57e9a102c6bf86a6a1e16c0e53e1f38a84fa1b9c01cc07ca4990"},"downloads":-1,"filename":"agentops-0.0.5.tar.gz","has_sig":false,"md5_digest":"4d8fc5553e3199fe24d6118337884a2b","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":14724,"upload_time":"2023-10-07T00:22:50","upload_time_iso_8601":"2023-10-07T00:22:50.304226Z","url":"https://files.pythonhosted.org/packages/08/d5/c29068ce4df9c85865b45e1cdb7be1df06e54fce087fad18ec390a7aea54/agentops-0.0.5.tar.gz","yanked":false,"yanked_reason":null}],"0.0.6":[{"comment_text":"","digests":{"blake2b_256":"2f5b5f3bd8a5b2d96b6417fd4a3fc72ed484e3a4ffacac49035f17bb8df1dd5b","md5":"b7e701ff7953ecca01ceec3a6b9374b2","sha256":"05dea1d06f8f8d06a8f460d18d302febe91f4dad2e3fc0088d05b7017765f3b6"},"downloads":-1,"filename":"agentops-0.0.6-py3-none-any.whl","has_sig":false,"md5_digest":"b7e701ff7953ecca01ceec3a6b9374b2","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":14236,"upload_time":"2023-10-27T06:56:14","upload_time_iso_8601":"2023-10-27T06:56:14.029277Z","url":"https://files.pythonhosted.org/packages/2f/5b/5f3bd8a5b2d96b6417fd4a3fc72ed484e3a4ffacac49035f17bb8df1dd5b/agentops-0.0.6-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"4af43743bf40518545c8906687038e5717b1bd33db7ba300a084ec4f6c9c59e0","md5":"0a78dcafcbc6292cf0823181cdc226a7","sha256":"0057cb5d6dc0dd2c444f3371faef40c844a1510700b31824a4fccf5302713361"},"downloads":-1,"filename":"agentops-0.0.6.tar.gz","has_sig":false,"md5_digest":"0a78dcafcbc6292cf0823181cdc226a7","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":14785,"upload_time":"2023-10-27T06:56:15","upload_time_iso_8601":"2023-10-27T06:56:15.069192Z","url":"https://files.pythonhosted.org/packages/4a/f4/3743bf40518545c8906687038e5717b1bd33db7ba300a084ec4f6c9c59e0/agentops-0.0.6.tar.gz","yanked":false,"yanked_reason":null}],"0.0.7":[{"comment_text":"","digests":{"blake2b_256":"3cb1d15c39bbc95f66c64d01cca304f9b4b0c3503509ad92ef29f926c9163599","md5":"f494f6c256899103a80666be68d136ad","sha256":"6984429ca1a9013fd4386105516cb36a46dd7078f7ac81e0a4701f1700bd25b5"},"downloads":-1,"filename":"agentops-0.0.7-py3-none-any.whl","has_sig":false,"md5_digest":"f494f6c256899103a80666be68d136ad","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":14370,"upload_time":"2023-11-02T06:37:36","upload_time_iso_8601":"2023-11-02T06:37:36.480189Z","url":"https://files.pythonhosted.org/packages/3c/b1/d15c39bbc95f66c64d01cca304f9b4b0c3503509ad92ef29f926c9163599/agentops-0.0.7-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"ba709ae02fc635cab51b237dcc3657ec69aac61ee67ea5f903cfae07de19abc8","md5":"b163eaaf9cbafbbd19ec3f91b2b56969","sha256":"a6f36d94a82d8e481b406f040790cefd4d939f07108737c696327d97c0ccdaf4"},"downloads":-1,"filename":"agentops-0.0.7.tar.gz","has_sig":false,"md5_digest":"b163eaaf9cbafbbd19ec3f91b2b56969","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":14895,"upload_time":"2023-11-02T06:37:37","upload_time_iso_8601":"2023-11-02T06:37:37.698159Z","url":"https://files.pythonhosted.org/packages/ba/70/9ae02fc635cab51b237dcc3657ec69aac61ee67ea5f903cfae07de19abc8/agentops-0.0.7.tar.gz","yanked":false,"yanked_reason":null}],"0.0.8":[{"comment_text":"","digests":{"blake2b_256":"8147fa3ee8807ad961aa50a773b6567e3a624000936d3cc1a578af72d83e02e7","md5":"20cffb5534b4545fa1e8b24a6a24b1da","sha256":"5d50b2ab18a203dbb4555a2cd482dae8df5bf2aa3e771a9758ee28b540330da3"},"downloads":-1,"filename":"agentops-0.0.8-py3-none-any.whl","has_sig":false,"md5_digest":"20cffb5534b4545fa1e8b24a6a24b1da","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":14391,"upload_time":"2023-11-23T06:17:56","upload_time_iso_8601":"2023-11-23T06:17:56.154712Z","url":"https://files.pythonhosted.org/packages/81/47/fa3ee8807ad961aa50a773b6567e3a624000936d3cc1a578af72d83e02e7/agentops-0.0.8-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"707473dc640a3fecfbe84ab7da230f7c862f72f231514a2a488b43a896146ed6","md5":"bba7e74b58849f15d50f4e1270cbd23f","sha256":"3a625d2acc922d99563ce71c5032b0b3b0db57d1c6fade319cf1bb636608eca0"},"downloads":-1,"filename":"agentops-0.0.8.tar.gz","has_sig":false,"md5_digest":"bba7e74b58849f15d50f4e1270cbd23f","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":14775,"upload_time":"2023-11-23T06:17:58","upload_time_iso_8601":"2023-11-23T06:17:58.768877Z","url":"https://files.pythonhosted.org/packages/70/74/73dc640a3fecfbe84ab7da230f7c862f72f231514a2a488b43a896146ed6/agentops-0.0.8.tar.gz","yanked":false,"yanked_reason":null}],"0.1.0":[{"comment_text":"","digests":{"blake2b_256":"c2a41dc8456edc9bccc0c560967cfdce23a4d7ab8162946be288b54391d80f7c","md5":"5fb09f82b7eeb270c6644dcd3656953f","sha256":"b480fd51fbffc76ae13bb885c2adb1236a7d3b0095b4dafb4a992f6e25647433"},"downloads":-1,"filename":"agentops-0.1.0-py3-none-any.whl","has_sig":false,"md5_digest":"5fb09f82b7eeb270c6644dcd3656953f","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":25045,"upload_time":"2024-04-03T02:01:56","upload_time_iso_8601":"2024-04-03T02:01:56.936873Z","url":"https://files.pythonhosted.org/packages/c2/a4/1dc8456edc9bccc0c560967cfdce23a4d7ab8162946be288b54391d80f7c/agentops-0.1.0-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"a81756443f28de774cb7c863a2856e1b07658a9a772ba86dfb1cfbb19bc08fe3","md5":"b93c602c1d1da5d8f7a2dcdaa70f8e21","sha256":"22d3dc87dedf93b3b78a0dfdef8c685b2f3bff9fbab32016360e298a24d311dc"},"downloads":-1,"filename":"agentops-0.1.0.tar.gz","has_sig":false,"md5_digest":"b93c602c1d1da5d8f7a2dcdaa70f8e21","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":24685,"upload_time":"2024-04-03T02:01:58","upload_time_iso_8601":"2024-04-03T02:01:58.623055Z","url":"https://files.pythonhosted.org/packages/a8/17/56443f28de774cb7c863a2856e1b07658a9a772ba86dfb1cfbb19bc08fe3/agentops-0.1.0.tar.gz","yanked":false,"yanked_reason":null}],"0.1.0b1":[{"comment_text":"","digests":{"blake2b_256":"c03a329c59f001f50701e9e541775c79304a5ce4ffe34d717b1d2af555362e9e","md5":"7c7e84b3b4448580bf5a7e9c08012477","sha256":"825ab57ac5f7840f5a7f8ac195f4af75ec07a9c0972b17d1a57a595420d06208"},"downloads":-1,"filename":"agentops-0.1.0b1-py3-none-any.whl","has_sig":false,"md5_digest":"7c7e84b3b4448580bf5a7e9c08012477","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":23258,"upload_time":"2024-03-18T18:51:08","upload_time_iso_8601":"2024-03-18T18:51:08.693772Z","url":"https://files.pythonhosted.org/packages/c0/3a/329c59f001f50701e9e541775c79304a5ce4ffe34d717b1d2af555362e9e/agentops-0.1.0b1-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"026ee44f1d5a49924867475f7d101abe40170c0674b4b395f28ce88552c1ba71","md5":"9cf6699fe45f13f1893c8992405e7261","sha256":"f5ce4b34999fe4b21a4ce3643980253d30f8ea9c55f01d96cd35631355fc7ac3"},"downloads":-1,"filename":"agentops-0.1.0b1.tar.gz","has_sig":false,"md5_digest":"9cf6699fe45f13f1893c8992405e7261","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":23842,"upload_time":"2024-03-18T18:51:10","upload_time_iso_8601":"2024-03-18T18:51:10.250127Z","url":"https://files.pythonhosted.org/packages/02/6e/e44f1d5a49924867475f7d101abe40170c0674b4b395f28ce88552c1ba71/agentops-0.1.0b1.tar.gz","yanked":false,"yanked_reason":null}],"0.1.0b2":[{"comment_text":"","digests":{"blake2b_256":"6a25e9282f81c3f2615ef6543a0b5ca49dd14b03f311fc5a108ad1aff4f0b720","md5":"1d3e736ef44c0ad8829c50f036ac807b","sha256":"485362b9a68d2327da250f0681b30a9296f0b41e058672b023ae2a8ed924b4d3"},"downloads":-1,"filename":"agentops-0.1.0b2-py3-none-any.whl","has_sig":false,"md5_digest":"1d3e736ef44c0ad8829c50f036ac807b","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":23477,"upload_time":"2024-03-21T23:31:20","upload_time_iso_8601":"2024-03-21T23:31:20.022797Z","url":"https://files.pythonhosted.org/packages/6a/25/e9282f81c3f2615ef6543a0b5ca49dd14b03f311fc5a108ad1aff4f0b720/agentops-0.1.0b2-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"3165f702684da6e01f8df74a4291be2914c382ec4cb6f8ed2c3dc6d5a9f177ff","md5":"0d51a6f6bf7cb0d3651574404c9c703c","sha256":"cf9a8b54cc4f76592b6380729c03ec7adfe2256e6b200876d7595e50015f5d62"},"downloads":-1,"filename":"agentops-0.1.0b2.tar.gz","has_sig":false,"md5_digest":"0d51a6f6bf7cb0d3651574404c9c703c","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":23659,"upload_time":"2024-03-21T23:31:21","upload_time_iso_8601":"2024-03-21T23:31:21.330837Z","url":"https://files.pythonhosted.org/packages/31/65/f702684da6e01f8df74a4291be2914c382ec4cb6f8ed2c3dc6d5a9f177ff/agentops-0.1.0b2.tar.gz","yanked":false,"yanked_reason":null}],"0.1.0b3":[{"comment_text":"","digests":{"blake2b_256":"2e64bfe82911b8981ce57f86154915d53b45fffa83ccb9cd6cf4cc71af3f796b","md5":"470bc56525c114dddd908628dcb4f267","sha256":"45b5aaa9f38989cfbfcc4f64e3041050df6d417177874316839225085e60d18d"},"downloads":-1,"filename":"agentops-0.1.0b3-py3-none-any.whl","has_sig":false,"md5_digest":"470bc56525c114dddd908628dcb4f267","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":23522,"upload_time":"2024-03-25T19:34:58","upload_time_iso_8601":"2024-03-25T19:34:58.102867Z","url":"https://files.pythonhosted.org/packages/2e/64/bfe82911b8981ce57f86154915d53b45fffa83ccb9cd6cf4cc71af3f796b/agentops-0.1.0b3-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"0858e4b718e30a6bbe27d32b7128398cb3884f83f89b4121e36cbb7f979466ca","md5":"8ddb13824d3636d841739479e02a12e6","sha256":"9020daab306fe8c7ed0a98a9edcad9772eb1df0eacce7f936a5ed6bf0f7d2af1"},"downloads":-1,"filename":"agentops-0.1.0b3.tar.gz","has_sig":false,"md5_digest":"8ddb13824d3636d841739479e02a12e6","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":23641,"upload_time":"2024-03-25T19:35:01","upload_time_iso_8601":"2024-03-25T19:35:01.119334Z","url":"https://files.pythonhosted.org/packages/08/58/e4b718e30a6bbe27d32b7128398cb3884f83f89b4121e36cbb7f979466ca/agentops-0.1.0b3.tar.gz","yanked":false,"yanked_reason":null}],"0.1.0b4":[{"comment_text":"","digests":{"blake2b_256":"67f860440d18b674b06c5a9f4f334bf1f1656dca9f6763d5dd3a2be9e5d2c256","md5":"b11f47108926fb46964bbf28675c3e35","sha256":"93a1f241c3fd7880c3d29ab64baa0661d9ba84e2071092aecb3e4fc574037900"},"downloads":-1,"filename":"agentops-0.1.0b4-py3-none-any.whl","has_sig":false,"md5_digest":"b11f47108926fb46964bbf28675c3e35","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":23512,"upload_time":"2024-03-26T01:14:54","upload_time_iso_8601":"2024-03-26T01:14:54.986869Z","url":"https://files.pythonhosted.org/packages/67/f8/60440d18b674b06c5a9f4f334bf1f1656dca9f6763d5dd3a2be9e5d2c256/agentops-0.1.0b4-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"10feabb836b04b7eae44383f5616ed1c4c6e9aee9beecc3df4617f69f7e3adc5","md5":"fa4512f74baf9909544ebab021862740","sha256":"4716b4e2a627d7a3846ddee3d334c8f5e8a1a2d231ec5286379c0f22920a2a9d"},"downloads":-1,"filename":"agentops-0.1.0b4.tar.gz","has_sig":false,"md5_digest":"fa4512f74baf9909544ebab021862740","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":23668,"upload_time":"2024-03-26T01:14:56","upload_time_iso_8601":"2024-03-26T01:14:56.921017Z","url":"https://files.pythonhosted.org/packages/10/fe/abb836b04b7eae44383f5616ed1c4c6e9aee9beecc3df4617f69f7e3adc5/agentops-0.1.0b4.tar.gz","yanked":false,"yanked_reason":null}],"0.1.0b5":[{"comment_text":"","digests":{"blake2b_256":"3ac591c14d08000def551f70ccc1da9ab8b37f57561d24cf7fdf6cd3547610ee","md5":"52a2212b79870ee48f0dbdad852dbb90","sha256":"ed050e51137baa4f46769c77595e1cbe212bb86243f27a29b50218782a0d8242"},"downloads":-1,"filename":"agentops-0.1.0b5-py3-none-any.whl","has_sig":false,"md5_digest":"52a2212b79870ee48f0dbdad852dbb90","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":24597,"upload_time":"2024-04-02T00:56:17","upload_time_iso_8601":"2024-04-02T00:56:17.570921Z","url":"https://files.pythonhosted.org/packages/3a/c5/91c14d08000def551f70ccc1da9ab8b37f57561d24cf7fdf6cd3547610ee/agentops-0.1.0b5-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"84d6f0bbe5883b86e749f2f02896d94054ebd84b4d66524e4b7004263ae21a6f","md5":"89c6aa7864f45c17f42a38bb6fae904b","sha256":"6ebe6a94f0898fd47521755b6c8083c5f6c0c8bb30d43441200b9ef67998ed01"},"downloads":-1,"filename":"agentops-0.1.0b5.tar.gz","has_sig":false,"md5_digest":"89c6aa7864f45c17f42a38bb6fae904b","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":24624,"upload_time":"2024-04-02T00:56:18","upload_time_iso_8601":"2024-04-02T00:56:18.703411Z","url":"https://files.pythonhosted.org/packages/84/d6/f0bbe5883b86e749f2f02896d94054ebd84b4d66524e4b7004263ae21a6f/agentops-0.1.0b5.tar.gz","yanked":false,"yanked_reason":null}],"0.1.0b7":[{"comment_text":"","digests":{"blake2b_256":"3cc4ebdb56f0ff88ad20ddba765093aa6c1fc655a8f2bbafbcb2057f998d814f","md5":"d117591df22735d1dedbdc034c93bff6","sha256":"0d4fdb036836dddcce770cffcb2d564b0011a3307224d9a4675fc9bf80ffa5d2"},"downloads":-1,"filename":"agentops-0.1.0b7-py3-none-any.whl","has_sig":false,"md5_digest":"d117591df22735d1dedbdc034c93bff6","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":24592,"upload_time":"2024-04-02T03:20:11","upload_time_iso_8601":"2024-04-02T03:20:11.132539Z","url":"https://files.pythonhosted.org/packages/3c/c4/ebdb56f0ff88ad20ddba765093aa6c1fc655a8f2bbafbcb2057f998d814f/agentops-0.1.0b7-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"cbf0c32014a8ee12df4596ec4d90428e73e0cc5277d1b9bd2b53f815a7f0ea1f","md5":"20364eb7d493e6f9b46666f36be8fb2f","sha256":"938b29cd894ff38c7b1dee02f6422458702ccf8f3b69b69bc0e4220e42a33629"},"downloads":-1,"filename":"agentops-0.1.0b7.tar.gz","has_sig":false,"md5_digest":"20364eb7d493e6f9b46666f36be8fb2f","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":24611,"upload_time":"2024-04-02T03:20:12","upload_time_iso_8601":"2024-04-02T03:20:12.490524Z","url":"https://files.pythonhosted.org/packages/cb/f0/c32014a8ee12df4596ec4d90428e73e0cc5277d1b9bd2b53f815a7f0ea1f/agentops-0.1.0b7.tar.gz","yanked":false,"yanked_reason":null}],"0.1.1":[{"comment_text":"","digests":{"blake2b_256":"ba13ff18b4ff72805bcbe7437aa445cde854a44b4b358564ed2b044678e270b9","md5":"d4f77de8dd58468c6c307e735c1cfaa9","sha256":"8afc0b7871d17f8cbe9996cab5ca10a8a3ed33a3406e1ddc257fadc214daa79a"},"downloads":-1,"filename":"agentops-0.1.1-py3-none-any.whl","has_sig":false,"md5_digest":"d4f77de8dd58468c6c307e735c1cfaa9","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":25189,"upload_time":"2024-04-05T22:41:01","upload_time_iso_8601":"2024-04-05T22:41:01.867983Z","url":"https://files.pythonhosted.org/packages/ba/13/ff18b4ff72805bcbe7437aa445cde854a44b4b358564ed2b044678e270b9/agentops-0.1.1-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"1dec1d2af6e33dd097feaf1e41a4d34c66d4e4e59ce35c5efac85c18614b9d4b","md5":"f072d8700d4e22fc25eae8bb29a54d1f","sha256":"001582703d5e6ffe67a51f9d67a303b5344e4ef8ca315f24aa43e0dd3d19f53b"},"downloads":-1,"filename":"agentops-0.1.1.tar.gz","has_sig":false,"md5_digest":"f072d8700d4e22fc25eae8bb29a54d1f","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":24831,"upload_time":"2024-04-05T22:41:03","upload_time_iso_8601":"2024-04-05T22:41:03.677234Z","url":"https://files.pythonhosted.org/packages/1d/ec/1d2af6e33dd097feaf1e41a4d34c66d4e4e59ce35c5efac85c18614b9d4b/agentops-0.1.1.tar.gz","yanked":false,"yanked_reason":null}],"0.1.10":[{"comment_text":"","digests":{"blake2b_256":"cdf9a295ed62701dd4e56d5b57e45e0425db2bcea992c687534c9a2dd1e001f1","md5":"8d82b9cb794b4b4a1e91ddece5447bcf","sha256":"8b80800d4fa5a7a6c85c79f2bf39a50fb446ab8b209519bd51f44dee3b38517e"},"downloads":-1,"filename":"agentops-0.1.10-py3-none-any.whl","has_sig":false,"md5_digest":"8d82b9cb794b4b4a1e91ddece5447bcf","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":29769,"upload_time":"2024-05-10T20:13:39","upload_time_iso_8601":"2024-05-10T20:13:39.477237Z","url":"https://files.pythonhosted.org/packages/cd/f9/a295ed62701dd4e56d5b57e45e0425db2bcea992c687534c9a2dd1e001f1/agentops-0.1.10-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"f3788e027be4aa50f677a46bba1e0132f021e90d299c6eae093181a91679e378","md5":"4dd3d1fd8c08efb1a08ae212ed9211d7","sha256":"73fbd36cd5f3052d22e64dbea1fa9d70fb02658a901a600101801daa73f359f9"},"downloads":-1,"filename":"agentops-0.1.10.tar.gz","has_sig":false,"md5_digest":"4dd3d1fd8c08efb1a08ae212ed9211d7","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":30268,"upload_time":"2024-05-10T20:14:25","upload_time_iso_8601":"2024-05-10T20:14:25.258530Z","url":"https://files.pythonhosted.org/packages/f3/78/8e027be4aa50f677a46bba1e0132f021e90d299c6eae093181a91679e378/agentops-0.1.10.tar.gz","yanked":false,"yanked_reason":null}],"0.1.11":[{"comment_text":"","digests":{"blake2b_256":"1ebfaaa31babe3bf687312592f99fe900e3808058658577bd1367b7df0332a08","md5":"73c0b028248665a7927688fb8baa7680","sha256":"e9411981a5d0b1190b93e3e1124db3ac6f17015c65a84b92a793f34d79b694c9"},"downloads":-1,"filename":"agentops-0.1.11-py3-none-any.whl","has_sig":false,"md5_digest":"73c0b028248665a7927688fb8baa7680","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":30952,"upload_time":"2024-05-17T00:32:49","upload_time_iso_8601":"2024-05-17T00:32:49.202597Z","url":"https://files.pythonhosted.org/packages/1e/bf/aaa31babe3bf687312592f99fe900e3808058658577bd1367b7df0332a08/agentops-0.1.11-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"6ee43f71a7d1d63595058cd6945e7b9e2de1b06ace04176a6723b7bfb37bf880","md5":"36092e907e4f15a6bafd6788383df112","sha256":"4a365ee56303b5b80d9de21fc13ccb7a3fe44544a6c165327bbfd9213bfe0191"},"downloads":-1,"filename":"agentops-0.1.11.tar.gz","has_sig":false,"md5_digest":"36092e907e4f15a6bafd6788383df112","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":31256,"upload_time":"2024-05-17T00:32:50","upload_time_iso_8601":"2024-05-17T00:32:50.919974Z","url":"https://files.pythonhosted.org/packages/6e/e4/3f71a7d1d63595058cd6945e7b9e2de1b06ace04176a6723b7bfb37bf880/agentops-0.1.11.tar.gz","yanked":false,"yanked_reason":null}],"0.1.12":[{"comment_text":"","digests":{"blake2b_256":"67f5227dffbebeffd3b404db0dd71805f00814e458c0d081faf7a4e70c7e984f","md5":"2591924de6f2e5580e4733b0e8336e2c","sha256":"b4b47c990638b74810cc1c38624ada162094b46e3fdd63883642a16bc5258386"},"downloads":-1,"filename":"agentops-0.1.12-py3-none-any.whl","has_sig":false,"md5_digest":"2591924de6f2e5580e4733b0e8336e2c","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":35605,"upload_time":"2024-05-24T20:11:52","upload_time_iso_8601":"2024-05-24T20:11:52.863109Z","url":"https://files.pythonhosted.org/packages/67/f5/227dffbebeffd3b404db0dd71805f00814e458c0d081faf7a4e70c7e984f/agentops-0.1.12-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"9f9ae6dc42ad8d40ad47c6116629b2cbda443d314327ab4d33e1044cb75ba88b","md5":"4c2e76e7b6d4799ef4b464dee29e7255","sha256":"c4f762482fb240fc3503907f52498f2d8d9e4f80236ee4a12bf039317a85fcd7"},"downloads":-1,"filename":"agentops-0.1.12.tar.gz","has_sig":false,"md5_digest":"4c2e76e7b6d4799ef4b464dee29e7255","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":35103,"upload_time":"2024-05-24T20:11:54","upload_time_iso_8601":"2024-05-24T20:11:54.846567Z","url":"https://files.pythonhosted.org/packages/9f/9a/e6dc42ad8d40ad47c6116629b2cbda443d314327ab4d33e1044cb75ba88b/agentops-0.1.12.tar.gz","yanked":false,"yanked_reason":null}],"0.1.2":[{"comment_text":"","digests":{"blake2b_256":"e709193dfe68c2d23de2c60dd0af2af336cbf81d3a3f0c175705783b4c1da580","md5":"588d9877b9767546606d3d6d76d247fc","sha256":"ec79e56889eadd2bab04dfe2f6a899a1b90dc347a66cc80488297368386105b4"},"downloads":-1,"filename":"agentops-0.1.2-py3-none-any.whl","has_sig":false,"md5_digest":"588d9877b9767546606d3d6d76d247fc","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":25359,"upload_time":"2024-04-09T23:00:51","upload_time_iso_8601":"2024-04-09T23:00:51.897995Z","url":"https://files.pythonhosted.org/packages/e7/09/193dfe68c2d23de2c60dd0af2af336cbf81d3a3f0c175705783b4c1da580/agentops-0.1.2-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"8acc872aba374093481bb40ed6b7531b1500b00138baf6bfb9ca7c20fb889d58","md5":"80f8f7c56b1e1a6ff4c48877fe12dd12","sha256":"d213e1037d2d319743889c2bdbc10dc068b0591e2c6c156f69019302490336d5"},"downloads":-1,"filename":"agentops-0.1.2.tar.gz","has_sig":false,"md5_digest":"80f8f7c56b1e1a6ff4c48877fe12dd12","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":24968,"upload_time":"2024-04-09T23:00:53","upload_time_iso_8601":"2024-04-09T23:00:53.227389Z","url":"https://files.pythonhosted.org/packages/8a/cc/872aba374093481bb40ed6b7531b1500b00138baf6bfb9ca7c20fb889d58/agentops-0.1.2.tar.gz","yanked":false,"yanked_reason":null}],"0.1.3":[{"comment_text":"","digests":{"blake2b_256":"9701aad65170506dcf29606e9e619d2c0caaee565e5e8b14a791c3e0e86c6356","md5":"4dc967275c884e2a5a1de8df448ae1c6","sha256":"f1ca0f2c5156d826381e9ebd634555215c67e1cb344683abddb382e594f483e4"},"downloads":-1,"filename":"agentops-0.1.3-py3-none-any.whl","has_sig":false,"md5_digest":"4dc967275c884e2a5a1de8df448ae1c6","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":25393,"upload_time":"2024-04-09T23:24:20","upload_time_iso_8601":"2024-04-09T23:24:20.821465Z","url":"https://files.pythonhosted.org/packages/97/01/aad65170506dcf29606e9e619d2c0caaee565e5e8b14a791c3e0e86c6356/agentops-0.1.3-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"5e22afde273bcf52cfc6581fba804b44eeebea6ff2ae774f0e5917fa1dd3ee09","md5":"624c9b63dbe56c8b1dd535e1b20ada81","sha256":"dd65e80ec70accfac0692171199b6ecfa37a7d109a3c25f2191c0934b5004114"},"downloads":-1,"filename":"agentops-0.1.3.tar.gz","has_sig":false,"md5_digest":"624c9b63dbe56c8b1dd535e1b20ada81","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":24994,"upload_time":"2024-04-09T23:24:22","upload_time_iso_8601":"2024-04-09T23:24:22.610198Z","url":"https://files.pythonhosted.org/packages/5e/22/afde273bcf52cfc6581fba804b44eeebea6ff2ae774f0e5917fa1dd3ee09/agentops-0.1.3.tar.gz","yanked":false,"yanked_reason":null}],"0.1.4":[{"comment_text":"","digests":{"blake2b_256":"50313e20afb169e707941cc3342cecb88060aa8746e95d72a202fd90ac4096b6","md5":"3f64b736522ea40c35db6d2a609fc54f","sha256":"476a5e795a6cc87858a0885be61b1e05eed21e4c6ab47f20348c48717c2ac454"},"downloads":-1,"filename":"agentops-0.1.4-py3-none-any.whl","has_sig":false,"md5_digest":"3f64b736522ea40c35db6d2a609fc54f","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":25558,"upload_time":"2024-04-11T19:26:01","upload_time_iso_8601":"2024-04-11T19:26:01.162829Z","url":"https://files.pythonhosted.org/packages/50/31/3e20afb169e707941cc3342cecb88060aa8746e95d72a202fd90ac4096b6/agentops-0.1.4-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"e0688b1a21f72b85c9bdd56da4223c991bdfb5d0c2accd9ddd326616bf952795","md5":"6f4601047f3e2080b4f7363ff84f15f3","sha256":"d55e64953f84654d44557b496a3b3744a20449b854af84fa83a15be75b362b3d"},"downloads":-1,"filename":"agentops-0.1.4.tar.gz","has_sig":false,"md5_digest":"6f4601047f3e2080b4f7363ff84f15f3","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":25390,"upload_time":"2024-04-11T19:26:02","upload_time_iso_8601":"2024-04-11T19:26:02.991657Z","url":"https://files.pythonhosted.org/packages/e0/68/8b1a21f72b85c9bdd56da4223c991bdfb5d0c2accd9ddd326616bf952795/agentops-0.1.4.tar.gz","yanked":false,"yanked_reason":null}],"0.1.5":[{"comment_text":"","digests":{"blake2b_256":"641c742793fa77c803e5667830ccd34b8d313d11f361a105fe92ce68d871cc5f","md5":"964421a604c67c07b5c72b70ceee6ce8","sha256":"bc65dd4cd85d1ffcba195f2490b5a4380d0b565dd0f4a71ecc64ed96a7fe1eee"},"downloads":-1,"filename":"agentops-0.1.5-py3-none-any.whl","has_sig":false,"md5_digest":"964421a604c67c07b5c72b70ceee6ce8","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":25793,"upload_time":"2024-04-20T01:56:23","upload_time_iso_8601":"2024-04-20T01:56:23.089343Z","url":"https://files.pythonhosted.org/packages/64/1c/742793fa77c803e5667830ccd34b8d313d11f361a105fe92ce68d871cc5f/agentops-0.1.5-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"62beabcb235daf34d4740961c4ad295b8dfb8a053ac6a1e341394e36f722ea89","md5":"3ff7fa3135bc5c4254aaa99e3cc00dc8","sha256":"17f0a573362d9c4770846874a4091662304d6889e21ca6a7dd747be48b9c8597"},"downloads":-1,"filename":"agentops-0.1.5.tar.gz","has_sig":false,"md5_digest":"3ff7fa3135bc5c4254aaa99e3cc00dc8","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":25664,"upload_time":"2024-04-20T01:56:24","upload_time_iso_8601":"2024-04-20T01:56:24.303013Z","url":"https://files.pythonhosted.org/packages/62/be/abcb235daf34d4740961c4ad295b8dfb8a053ac6a1e341394e36f722ea89/agentops-0.1.5.tar.gz","yanked":false,"yanked_reason":null}],"0.1.6":[{"comment_text":"","digests":{"blake2b_256":"430b9f3fcfc2f9778dbbfc1fd68b223e9a91938505ef987e17b93a631bb6b2e4","md5":"28ce2e6aa7a4598fa1e764d9762fd030","sha256":"9dff841ef71f5fad2d897012a00f50011a706970e0e5eaae9d7b0540a637b128"},"downloads":-1,"filename":"agentops-0.1.6-py3-none-any.whl","has_sig":false,"md5_digest":"28ce2e6aa7a4598fa1e764d9762fd030","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":26154,"upload_time":"2024-04-20T03:48:58","upload_time_iso_8601":"2024-04-20T03:48:58.494391Z","url":"https://files.pythonhosted.org/packages/43/0b/9f3fcfc2f9778dbbfc1fd68b223e9a91938505ef987e17b93a631bb6b2e4/agentops-0.1.6-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"a6c2b437246ce28bad9c2bbad9a9371f7008f76a979fb19699588212f653daf9","md5":"fc81fd641ad630a17191d4a9cf77193b","sha256":"48ddb49fc01eb83ce151d3f08ae670b3d603c454aa35b4ea145f2dc15e081b36"},"downloads":-1,"filename":"agentops-0.1.6.tar.gz","has_sig":false,"md5_digest":"fc81fd641ad630a17191d4a9cf77193b","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":25792,"upload_time":"2024-04-20T03:48:59","upload_time_iso_8601":"2024-04-20T03:48:59.957150Z","url":"https://files.pythonhosted.org/packages/a6/c2/b437246ce28bad9c2bbad9a9371f7008f76a979fb19699588212f653daf9/agentops-0.1.6.tar.gz","yanked":false,"yanked_reason":null}],"0.1.7":[{"comment_text":"","digests":{"blake2b_256":"1ca529570477f62973c6b835e09dc5bbda7498c1a26ba7a428cdb08a71ae86ca","md5":"a1962d1bb72c6fd00e67e83fe56a3692","sha256":"ce7a9e89dcf17507ee6db85017bef8f87fc4e8a23745f3f73e1fbda5489fb6f9"},"downloads":-1,"filename":"agentops-0.1.7-py3-none-any.whl","has_sig":false,"md5_digest":"a1962d1bb72c6fd00e67e83fe56a3692","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.10","size":27891,"upload_time":"2024-05-03T19:21:38","upload_time_iso_8601":"2024-05-03T19:21:38.018602Z","url":"https://files.pythonhosted.org/packages/1c/a5/29570477f62973c6b835e09dc5bbda7498c1a26ba7a428cdb08a71ae86ca/agentops-0.1.7-py3-none-any.whl","yanked":true,"yanked_reason":"Introduced - breaking bug"},{"comment_text":"","digests":{"blake2b_256":"b2447ce75e71fcc9605a609b41adc52d517eba4356d15f7ca77d46f683ca07f1","md5":"9a9bb22af4b30c454d46b9a01e8701a0","sha256":"70d22e9a71ea13af6e6ad9c1cffe63c98f9dbccf91bda199825609379b2babaf"},"downloads":-1,"filename":"agentops-0.1.7.tar.gz","has_sig":false,"md5_digest":"9a9bb22af4b30c454d46b9a01e8701a0","packagetype":"sdist","python_version":"source","requires_python":">=3.10","size":28122,"upload_time":"2024-05-03T19:21:39","upload_time_iso_8601":"2024-05-03T19:21:39.415523Z","url":"https://files.pythonhosted.org/packages/b2/44/7ce75e71fcc9605a609b41adc52d517eba4356d15f7ca77d46f683ca07f1/agentops-0.1.7.tar.gz","yanked":true,"yanked_reason":"Introduced breaking bug"}],"0.1.8":[{"comment_text":"","digests":{"blake2b_256":"38c63d0d19eeae4c3c9e3ff5957b10c3c16a4a9fd2be6673fbfc965f8bb4fd08","md5":"e12d3d92f51f5b2fed11a01742e5b5b5","sha256":"d49d113028a891d50900bb4fae253218cc49519f7fe39f9ea15f8f2b29d6d7ef"},"downloads":-1,"filename":"agentops-0.1.8-py3-none-any.whl","has_sig":false,"md5_digest":"e12d3d92f51f5b2fed11a01742e5b5b5","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.10","size":27977,"upload_time":"2024-05-04T03:01:53","upload_time_iso_8601":"2024-05-04T03:01:53.905081Z","url":"https://files.pythonhosted.org/packages/38/c6/3d0d19eeae4c3c9e3ff5957b10c3c16a4a9fd2be6673fbfc965f8bb4fd08/agentops-0.1.8-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"9269e51fa1714f169f692e4fad0a42ebeb77c7a27c48f62b751c869ad6441c69","md5":"07dbdb45f9ec086b1bc314d6a8264423","sha256":"5762137a84e2309e1b6ca9a0fd72c8b72c90f6f73ba49549980722221960cac8"},"downloads":-1,"filename":"agentops-0.1.8.tar.gz","has_sig":false,"md5_digest":"07dbdb45f9ec086b1bc314d6a8264423","packagetype":"sdist","python_version":"source","requires_python":">=3.10","size":28189,"upload_time":"2024-05-04T03:01:55","upload_time_iso_8601":"2024-05-04T03:01:55.328668Z","url":"https://files.pythonhosted.org/packages/92/69/e51fa1714f169f692e4fad0a42ebeb77c7a27c48f62b751c869ad6441c69/agentops-0.1.8.tar.gz","yanked":false,"yanked_reason":null}],"0.1.9":[{"comment_text":"","digests":{"blake2b_256":"eb5a920e71729bd1f06b002ee146b38b0d1862357a1f484628e6b20a7d3dcca1","md5":"6ae4929d91c4bb8025edc86b5322630c","sha256":"af7983ba4929b04a34714dd97d7e82c11384ebbe9d7d8bc7b673e1263c4c79a1"},"downloads":-1,"filename":"agentops-0.1.9-py3-none-any.whl","has_sig":false,"md5_digest":"6ae4929d91c4bb8025edc86b5322630c","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":28458,"upload_time":"2024-05-07T07:07:30","upload_time_iso_8601":"2024-05-07T07:07:30.798380Z","url":"https://files.pythonhosted.org/packages/eb/5a/920e71729bd1f06b002ee146b38b0d1862357a1f484628e6b20a7d3dcca1/agentops-0.1.9-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"df2b8fc76d629d8a83b0796612a27b966426550114c930eee5d730654fcd9fe9","md5":"43090632f87cd398ed77b57daa8c28d6","sha256":"7f428bfda2db57a994029b1c9f72b63ca7660616635c9c671b2b729d112a833e"},"downloads":-1,"filename":"agentops-0.1.9.tar.gz","has_sig":false,"md5_digest":"43090632f87cd398ed77b57daa8c28d6","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":28596,"upload_time":"2024-05-07T07:07:35","upload_time_iso_8601":"2024-05-07T07:07:35.242350Z","url":"https://files.pythonhosted.org/packages/df/2b/8fc76d629d8a83b0796612a27b966426550114c930eee5d730654fcd9fe9/agentops-0.1.9.tar.gz","yanked":false,"yanked_reason":null}],"0.2.0":[{"comment_text":"","digests":{"blake2b_256":"483560ec38a81a7e9588d32730ed4f581621169216f968771d5f611388f68a9b","md5":"bdda5480977cccd55628e117e8c8da04","sha256":"bee84bf046c9b4346c5f0f50e2087a992e8d2eae80b3fe9f01c456b49c299bcc"},"downloads":-1,"filename":"agentops-0.2.0-py3-none-any.whl","has_sig":false,"md5_digest":"bdda5480977cccd55628e117e8c8da04","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":35921,"upload_time":"2024-05-28T22:04:14","upload_time_iso_8601":"2024-05-28T22:04:14.813154Z","url":"https://files.pythonhosted.org/packages/48/35/60ec38a81a7e9588d32730ed4f581621169216f968771d5f611388f68a9b/agentops-0.2.0-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"8d7591c79141d31da4e56d6c6a00737b50dcc2f1ce8a711c1293d2a1d70478fc","md5":"71e3c3b9fe0286c9b58d81ba1c12a42d","sha256":"ca340136abff6a3727729c3eda87f0768e5ba2b672ce03320cb52ad138b05598"},"downloads":-1,"filename":"agentops-0.2.0.tar.gz","has_sig":false,"md5_digest":"71e3c3b9fe0286c9b58d81ba1c12a42d","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":35498,"upload_time":"2024-05-28T22:04:16","upload_time_iso_8601":"2024-05-28T22:04:16.598374Z","url":"https://files.pythonhosted.org/packages/8d/75/91c79141d31da4e56d6c6a00737b50dcc2f1ce8a711c1293d2a1d70478fc/agentops-0.2.0.tar.gz","yanked":false,"yanked_reason":null}],"0.2.1":[{"comment_text":"","digests":{"blake2b_256":"fa3b84032b7dca3d7315b329db6681bbfe0872c2a46d62ca992a05f2d6a078e1","md5":"ce3fc46711fa8225a3d6a9566f95f875","sha256":"7dde95db92c8306c0a17e193bfb5ee20e71e16630ccc629db685e148b3aca3f6"},"downloads":-1,"filename":"agentops-0.2.1-py3-none-any.whl","has_sig":false,"md5_digest":"ce3fc46711fa8225a3d6a9566f95f875","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":36375,"upload_time":"2024-06-03T18:40:02","upload_time_iso_8601":"2024-06-03T18:40:02.820700Z","url":"https://files.pythonhosted.org/packages/fa/3b/84032b7dca3d7315b329db6681bbfe0872c2a46d62ca992a05f2d6a078e1/agentops-0.2.1-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"d6286ad330da5736588a54575fde95502006da58c3e9f4f15933f5876c1e1482","md5":"faa972c26a3e59fb6ca04f253165da22","sha256":"9f18a36a79c04e9c06f6e96aefe75f0fb1d08e562873315d6cb945488306e515"},"downloads":-1,"filename":"agentops-0.2.1.tar.gz","has_sig":false,"md5_digest":"faa972c26a3e59fb6ca04f253165da22","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":35784,"upload_time":"2024-06-03T18:40:05","upload_time_iso_8601":"2024-06-03T18:40:05.431174Z","url":"https://files.pythonhosted.org/packages/d6/28/6ad330da5736588a54575fde95502006da58c3e9f4f15933f5876c1e1482/agentops-0.2.1.tar.gz","yanked":false,"yanked_reason":null}],"0.2.2":[{"comment_text":"","digests":{"blake2b_256":"fbe73a57dd30e354b7bcc5a86908fc92aa16378035c69eb225ce254387940b5d","md5":"c24e4656bb6de14ffb9d810fe7872829","sha256":"57aab8a5d76a0dd7b1f0b14e90e778c42444eeaf5c48f2f387719735d7d840ee"},"downloads":-1,"filename":"agentops-0.2.2-py3-none-any.whl","has_sig":false,"md5_digest":"c24e4656bb6de14ffb9d810fe7872829","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":36588,"upload_time":"2024-06-05T19:30:29","upload_time_iso_8601":"2024-06-05T19:30:29.208415Z","url":"https://files.pythonhosted.org/packages/fb/e7/3a57dd30e354b7bcc5a86908fc92aa16378035c69eb225ce254387940b5d/agentops-0.2.2-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"89c51cbd038b9d2898b7f1b05943c338aa4aa9654d7e7763d8fa8d73a25fbfb6","md5":"401bfce001638cc26d7975f6534b5bab","sha256":"d4135c96ad7ec39c81015b3e33dfa977d2d846a685aba0d1922d2d6e3dca7fff"},"downloads":-1,"filename":"agentops-0.2.2.tar.gz","has_sig":false,"md5_digest":"401bfce001638cc26d7975f6534b5bab","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":36012,"upload_time":"2024-06-05T19:30:31","upload_time_iso_8601":"2024-06-05T19:30:31.173781Z","url":"https://files.pythonhosted.org/packages/89/c5/1cbd038b9d2898b7f1b05943c338aa4aa9654d7e7763d8fa8d73a25fbfb6/agentops-0.2.2.tar.gz","yanked":false,"yanked_reason":null}],"0.2.3":[{"comment_text":"","digests":{"blake2b_256":"b66fb36e2bb7158f45b6c496ce3cec50ef861e130cfa3ec8c62e709d63fa9e94","md5":"b3f6a8d97cc0129a9e4730b7810509c6","sha256":"a1829a21301223c26464cbc9da5bfba2f3750e21238912ee1d2f3097c358859a"},"downloads":-1,"filename":"agentops-0.2.3-py3-none-any.whl","has_sig":false,"md5_digest":"b3f6a8d97cc0129a9e4730b7810509c6","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":36986,"upload_time":"2024-06-13T19:56:33","upload_time_iso_8601":"2024-06-13T19:56:33.675807Z","url":"https://files.pythonhosted.org/packages/b6/6f/b36e2bb7158f45b6c496ce3cec50ef861e130cfa3ec8c62e709d63fa9e94/agentops-0.2.3-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"f4d34aed81a4ec4251131b94fb8ed4edf0823922bfda66ba0e4c43d9452111d2","md5":"466abe04d466a950d4bcebbe9c3ccc27","sha256":"b502b83bb4954386a28c4304028ba8cd2b45303f7e1f84720477b521267a3b4e"},"downloads":-1,"filename":"agentops-0.2.3.tar.gz","has_sig":false,"md5_digest":"466abe04d466a950d4bcebbe9c3ccc27","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":37024,"upload_time":"2024-06-13T19:56:35","upload_time_iso_8601":"2024-06-13T19:56:35.481794Z","url":"https://files.pythonhosted.org/packages/f4/d3/4aed81a4ec4251131b94fb8ed4edf0823922bfda66ba0e4c43d9452111d2/agentops-0.2.3.tar.gz","yanked":false,"yanked_reason":null}],"0.2.4":[{"comment_text":"","digests":{"blake2b_256":"a4d4e91fb66bc2eb7effb53f7d9481da04e60809d10240306452a8307aca7985","md5":"f1ba1befb6bd854d5fd6f670937dcb55","sha256":"96162c28cc0391011c04e654273e5a96ec4dcf015e27a7ac12a1ea4077d38950"},"downloads":-1,"filename":"agentops-0.2.4-py3-none-any.whl","has_sig":false,"md5_digest":"f1ba1befb6bd854d5fd6f670937dcb55","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":37518,"upload_time":"2024-06-24T19:31:58","upload_time_iso_8601":"2024-06-24T19:31:58.838680Z","url":"https://files.pythonhosted.org/packages/a4/d4/e91fb66bc2eb7effb53f7d9481da04e60809d10240306452a8307aca7985/agentops-0.2.4-py3-none-any.whl","yanked":true,"yanked_reason":"Potential - breaking change"},{"comment_text":"","digests":{"blake2b_256":"8e4b920629e08c956cdc74a31ab466d005eb13d86c2d58fa2d2bd261cf36c37b","md5":"527c82f21f01f13b879a1fca90ddb209","sha256":"d263de21eb40e15eb17adc31821fc0dee4ff4ca4501a9feb7ed376d473063208"},"downloads":-1,"filename":"agentops-0.2.4.tar.gz","has_sig":false,"md5_digest":"527c82f21f01f13b879a1fca90ddb209","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":37656,"upload_time":"2024-06-24T19:32:01","upload_time_iso_8601":"2024-06-24T19:32:01.155014Z","url":"https://files.pythonhosted.org/packages/8e/4b/920629e08c956cdc74a31ab466d005eb13d86c2d58fa2d2bd261cf36c37b/agentops-0.2.4.tar.gz","yanked":true,"yanked_reason":"Potential breaking change"}],"0.2.5":[{"comment_text":"","digests":{"blake2b_256":"47c73ab9d7d971b664a9bdff6e6464afb6c1de8eb0f845d8de93eb036d5dcc60","md5":"bed576cc1591da4783777920fb223761","sha256":"ff87b82d1efaf50b10624e00c6e9334f4c16ffe08ec7f9889b4417c231c31471"},"downloads":-1,"filename":"agentops-0.2.5-py3-none-any.whl","has_sig":false,"md5_digest":"bed576cc1591da4783777920fb223761","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":37529,"upload_time":"2024-06-26T22:57:15","upload_time_iso_8601":"2024-06-26T22:57:15.646328Z","url":"https://files.pythonhosted.org/packages/47/c7/3ab9d7d971b664a9bdff6e6464afb6c1de8eb0f845d8de93eb036d5dcc60/agentops-0.2.5-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"31c48f2af30ae75dbdb4697506f80f76ce786f79014deb8c6679fa62962fdd6f","md5":"42def99798edfaf201fa6f62846e77c5","sha256":"6bad7aca37af6174307769550a53ec00824049a57e97b8868a9a213b2272adb4"},"downloads":-1,"filename":"agentops-0.2.5.tar.gz","has_sig":false,"md5_digest":"42def99798edfaf201fa6f62846e77c5","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":37703,"upload_time":"2024-06-26T22:57:17","upload_time_iso_8601":"2024-06-26T22:57:17.337904Z","url":"https://files.pythonhosted.org/packages/31/c4/8f2af30ae75dbdb4697506f80f76ce786f79014deb8c6679fa62962fdd6f/agentops-0.2.5.tar.gz","yanked":false,"yanked_reason":null}],"0.2.6":[{"comment_text":"","digests":{"blake2b_256":"5af2f90538b00d887c04a5570e8a3af4aef27a600a67c058a0ee6befafd60748","md5":"8ef3ed13ed582346b71648ca9df30f7c","sha256":"59e88000a9f108931fd68056f22def7a7f4b3015906de5791e777c23ba7dee52"},"downloads":-1,"filename":"agentops-0.2.6-py3-none-any.whl","has_sig":false,"md5_digest":"8ef3ed13ed582346b71648ca9df30f7c","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":37534,"upload_time":"2024-06-28T21:41:56","upload_time_iso_8601":"2024-06-28T21:41:56.933334Z","url":"https://files.pythonhosted.org/packages/5a/f2/f90538b00d887c04a5570e8a3af4aef27a600a67c058a0ee6befafd60748/agentops-0.2.6-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"bcf412c388dccc301ad54a501843ba5b5dd359575dcef9ac24c18a619a32214d","md5":"89a6b04f12801682b53ee0133593ce74","sha256":"7906a08c9154355484deb173b82631f9acddec3775b2d5e8ca946abdee27183b"},"downloads":-1,"filename":"agentops-0.2.6.tar.gz","has_sig":false,"md5_digest":"89a6b04f12801682b53ee0133593ce74","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":37874,"upload_time":"2024-06-28T21:41:59","upload_time_iso_8601":"2024-06-28T21:41:59.143953Z","url":"https://files.pythonhosted.org/packages/bc/f4/12c388dccc301ad54a501843ba5b5dd359575dcef9ac24c18a619a32214d/agentops-0.2.6.tar.gz","yanked":false,"yanked_reason":null}],"0.3.0":[{"comment_text":"","digests":{"blake2b_256":"b8e996f12ac457f46c370c6f70f344e975d534f2c92853703ee29802f0127024","md5":"d9c6995a843b49ac7eb6f500fa1f3c2a","sha256":"22aeb3355e66b32a2b2a9f676048b81979b2488feddb088f9266034b3ed50539"},"downloads":-1,"filename":"agentops-0.3.0-py3-none-any.whl","has_sig":false,"md5_digest":"d9c6995a843b49ac7eb6f500fa1f3c2a","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":39430,"upload_time":"2024-07-17T18:38:24","upload_time_iso_8601":"2024-07-17T18:38:24.763919Z","url":"https://files.pythonhosted.org/packages/b8/e9/96f12ac457f46c370c6f70f344e975d534f2c92853703ee29802f0127024/agentops-0.3.0-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"7e2d6fda9613562c0394d7ef3dd8f0cb9fc4ebaa8d413862fce33940c73564d6","md5":"8fa67ca01ca726e3bfcd66898313f33f","sha256":"6c0c08a57410fa5e826a7bafa1deeba9f7b3524709427d9e1abbd0964caaf76b"},"downloads":-1,"filename":"agentops-0.3.0.tar.gz","has_sig":false,"md5_digest":"8fa67ca01ca726e3bfcd66898313f33f","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":41734,"upload_time":"2024-07-17T18:38:26","upload_time_iso_8601":"2024-07-17T18:38:26.447237Z","url":"https://files.pythonhosted.org/packages/7e/2d/6fda9613562c0394d7ef3dd8f0cb9fc4ebaa8d413862fce33940c73564d6/agentops-0.3.0.tar.gz","yanked":false,"yanked_reason":null}],"0.3.10":[{"comment_text":"","digests":{"blake2b_256":"eb5e3ac36b33d3e95747d64effd509f66a9b3b76b47216b16f492e27d8d90b0c","md5":"6fade0b81fc65b2c79a869b5f240590b","sha256":"b304d366691281e08c1f02307aabdd551ae4f68b0de82bbbb4cf6f651af2dd16"},"downloads":-1,"filename":"agentops-0.3.10-py3-none-any.whl","has_sig":false,"md5_digest":"6fade0b81fc65b2c79a869b5f240590b","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":41201,"upload_time":"2024-08-19T20:51:49","upload_time_iso_8601":"2024-08-19T20:51:49.487947Z","url":"https://files.pythonhosted.org/packages/eb/5e/3ac36b33d3e95747d64effd509f66a9b3b76b47216b16f492e27d8d90b0c/agentops-0.3.10-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"8367ca0cb01df6b529f0127d23ec661e92c95ff68faf544439d86ec2331f3a52","md5":"639da9c2a3381cb3f62812bfe48a5e57","sha256":"40f895019f29bc5a6c023110cbec32870e5edb3e3926f8100974db8d3e299e2a"},"downloads":-1,"filename":"agentops-0.3.10.tar.gz","has_sig":false,"md5_digest":"639da9c2a3381cb3f62812bfe48a5e57","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":45332,"upload_time":"2024-08-19T20:51:50","upload_time_iso_8601":"2024-08-19T20:51:50.714217Z","url":"https://files.pythonhosted.org/packages/83/67/ca0cb01df6b529f0127d23ec661e92c95ff68faf544439d86ec2331f3a52/agentops-0.3.10.tar.gz","yanked":false,"yanked_reason":null}],"0.3.11":[{"comment_text":"","digests":{"blake2b_256":"0b078e6a74f084463def9d79d2c84d79475adc0229bbfb2e57401b0616ba6d6a","md5":"e760d867d9431d1bc13798024237ab99","sha256":"75fe10b8fc86c7f5c2633139ac1c06959611f22434fc1aaa8688c3c223fde8b5"},"downloads":-1,"filename":"agentops-0.3.11-py3-none-any.whl","has_sig":false,"md5_digest":"e760d867d9431d1bc13798024237ab99","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":50252,"upload_time":"2024-09-17T21:57:23","upload_time_iso_8601":"2024-09-17T21:57:23.085964Z","url":"https://files.pythonhosted.org/packages/0b/07/8e6a74f084463def9d79d2c84d79475adc0229bbfb2e57401b0616ba6d6a/agentops-0.3.11-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"3746057c552ea7ded5c954bdcbaf8a7dca07b6109633e040bf33de5f97a1289b","md5":"3b661fb76d343ec3bdef5b70fc9e5cc3","sha256":"38a2ffeeac1d722cb72c32d70e1c840424902b57934c647ef10de15478fe8f27"},"downloads":-1,"filename":"agentops-0.3.11.tar.gz","has_sig":false,"md5_digest":"3b661fb76d343ec3bdef5b70fc9e5cc3","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":48018,"upload_time":"2024-09-17T21:57:24","upload_time_iso_8601":"2024-09-17T21:57:24.699442Z","url":"https://files.pythonhosted.org/packages/37/46/057c552ea7ded5c954bdcbaf8a7dca07b6109633e040bf33de5f97a1289b/agentops-0.3.11.tar.gz","yanked":false,"yanked_reason":null}],"0.3.12":[{"comment_text":"","digests":{"blake2b_256":"ac0a9004d7a8c2865ed804ddd6968095ef100ac554bc51ada7a2f3c0b4e9142b","md5":"be18cdad4333c6013d9584b84b4c7875","sha256":"4767def30de5dd97397728efcb50398a4f6d6823c1b534846f0a9b0cb85a6d45"},"downloads":-1,"filename":"agentops-0.3.12-py3-none-any.whl","has_sig":false,"md5_digest":"be18cdad4333c6013d9584b84b4c7875","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":50794,"upload_time":"2024-09-23T19:30:49","upload_time_iso_8601":"2024-09-23T19:30:49.050650Z","url":"https://files.pythonhosted.org/packages/ac/0a/9004d7a8c2865ed804ddd6968095ef100ac554bc51ada7a2f3c0b4e9142b/agentops-0.3.12-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"2c6d4f640d9fadd22f8cd7cb9857eed1f56d422f11b130ba226b947454eb0f0b","md5":"91aa981d4199ac73b4d7407547667e2f","sha256":"11ce3048656b5d146d02a4890dd50c8d2801ca5ad5caccab17d573cd8eea6e83"},"downloads":-1,"filename":"agentops-0.3.12.tar.gz","has_sig":false,"md5_digest":"91aa981d4199ac73b4d7407547667e2f","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":48525,"upload_time":"2024-09-23T19:30:50","upload_time_iso_8601":"2024-09-23T19:30:50.568151Z","url":"https://files.pythonhosted.org/packages/2c/6d/4f640d9fadd22f8cd7cb9857eed1f56d422f11b130ba226b947454eb0f0b/agentops-0.3.12.tar.gz","yanked":false,"yanked_reason":null}],"0.3.13":[{"comment_text":"","digests":{"blake2b_256":"68efa3b8adc0de2e7daa1e6e2734af9a0e37c90e3346b8a804e3fdc322c82b6c","md5":"948e9278dfc02e1a6ba2ec563296779a","sha256":"81bfdfedd990fbc3064ee42a67422ddbee07b6cd96c5fca7e124eb8c1e0cebdc"},"downloads":-1,"filename":"agentops-0.3.13-py3-none-any.whl","has_sig":false,"md5_digest":"948e9278dfc02e1a6ba2ec563296779a","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":50813,"upload_time":"2024-10-02T18:32:59","upload_time_iso_8601":"2024-10-02T18:32:59.208892Z","url":"https://files.pythonhosted.org/packages/68/ef/a3b8adc0de2e7daa1e6e2734af9a0e37c90e3346b8a804e3fdc322c82b6c/agentops-0.3.13-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"3511fb06b4cee96285a5f745809d0f4efddef70d2a82112a633ed53834d6fc64","md5":"27a923eaceb4ae35abe2cf1aed1b8241","sha256":"319b7325fb79004ce996191aa21f0982489be22cc1acc2f3f6d02cdff1db2429"},"downloads":-1,"filename":"agentops-0.3.13.tar.gz","has_sig":false,"md5_digest":"27a923eaceb4ae35abe2cf1aed1b8241","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":48559,"upload_time":"2024-10-02T18:33:00","upload_time_iso_8601":"2024-10-02T18:33:00.614409Z","url":"https://files.pythonhosted.org/packages/35/11/fb06b4cee96285a5f745809d0f4efddef70d2a82112a633ed53834d6fc64/agentops-0.3.13.tar.gz","yanked":false,"yanked_reason":null}],"0.3.14":[{"comment_text":"","digests":{"blake2b_256":"1c2775ab5bf99341a6a02775e3858f54a18cbcda0f35b5c6c0f114a829d62b8e","md5":"ad2d676d293c4baa1f9afecc61654e50","sha256":"f4a2fcf1a7caf1d5383bfb66d8a9d567f3cb88fc7495cfd81ade167b0c06a4ea"},"downloads":-1,"filename":"agentops-0.3.14-py3-none-any.whl","has_sig":false,"md5_digest":"ad2d676d293c4baa1f9afecc61654e50","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":50825,"upload_time":"2024-10-14T23:53:48","upload_time_iso_8601":"2024-10-14T23:53:48.464714Z","url":"https://files.pythonhosted.org/packages/1c/27/75ab5bf99341a6a02775e3858f54a18cbcda0f35b5c6c0f114a829d62b8e/agentops-0.3.14-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"46cb183fdaf40ae97ac1806ba91f6f23d55dc0a1a5cdf0881a5c834c8ca7175a","md5":"b90053253770c8e1c385b18e7172d58f","sha256":"fcb515e5743d73efee851b687692bed74797dc88e29a8327b2bbfb21d73a7447"},"downloads":-1,"filename":"agentops-0.3.14.tar.gz","has_sig":false,"md5_digest":"b90053253770c8e1c385b18e7172d58f","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":48548,"upload_time":"2024-10-14T23:53:50","upload_time_iso_8601":"2024-10-14T23:53:50.306080Z","url":"https://files.pythonhosted.org/packages/46/cb/183fdaf40ae97ac1806ba91f6f23d55dc0a1a5cdf0881a5c834c8ca7175a/agentops-0.3.14.tar.gz","yanked":false,"yanked_reason":null}],"0.3.15":[{"comment_text":"","digests":{"blake2b_256":"eadebed95f173bd304abe219b2b0a6f4e1f8e38b6733b19f2444a30fe2e731e1","md5":"7a46ccd127ffcd52eff26edaf5721bd9","sha256":"d5617108bbd9871a4250415f4e536ba33c2a6a2d2bec9342046303fb9e839f9d"},"downloads":-1,"filename":"agentops-0.3.15-py3-none-any.whl","has_sig":false,"md5_digest":"7a46ccd127ffcd52eff26edaf5721bd9","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":55349,"upload_time":"2024-11-09T01:18:40","upload_time_iso_8601":"2024-11-09T01:18:40.622134Z","url":"https://files.pythonhosted.org/packages/ea/de/bed95f173bd304abe219b2b0a6f4e1f8e38b6733b19f2444a30fe2e731e1/agentops-0.3.15-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"33a40ef511dc3f23bba2d345b464223b1e7acc3c2a29230a93abb8fbcb6faebf","md5":"7af7abcf01e8d3ef64ac287e9300528f","sha256":"4358f85929d55929002cae589323d36b68fc4d12d0ea5010a80bfc4c7addc0ec"},"downloads":-1,"filename":"agentops-0.3.15.tar.gz","has_sig":false,"md5_digest":"7af7abcf01e8d3ef64ac287e9300528f","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":51296,"upload_time":"2024-11-09T01:18:42","upload_time_iso_8601":"2024-11-09T01:18:42.358185Z","url":"https://files.pythonhosted.org/packages/33/a4/0ef511dc3f23bba2d345b464223b1e7acc3c2a29230a93abb8fbcb6faebf/agentops-0.3.15.tar.gz","yanked":false,"yanked_reason":null}],"0.3.15rc1":[{"comment_text":"","digests":{"blake2b_256":"0978ac2f89ccb7b3a31742f5b70434953faff168da6cab67c0836f432919c762","md5":"7f805adf76594ac4bc169b1a111817f4","sha256":"86069387a265bc6c5fa00ffbb3f8a131254a51ee3a9b8b35af4aca823dee76f1"},"downloads":-1,"filename":"agentops-0.3.15rc1-py3-none-any.whl","has_sig":false,"md5_digest":"7f805adf76594ac4bc169b1a111817f4","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":50798,"upload_time":"2024-10-31T04:36:11","upload_time_iso_8601":"2024-10-31T04:36:11.059082Z","url":"https://files.pythonhosted.org/packages/09/78/ac2f89ccb7b3a31742f5b70434953faff168da6cab67c0836f432919c762/agentops-0.3.15rc1-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"4317d6950ad32c33317509ea05a64d01ab661515165ffbd4e120148826b69ffb","md5":"5f131294c10c9b60b33ec93edc106f4f","sha256":"897ab94ae4fca8f1711216f9317dbf6f14e5d018c866086ef0b8831dc125e4ad"},"downloads":-1,"filename":"agentops-0.3.15rc1.tar.gz","has_sig":false,"md5_digest":"5f131294c10c9b60b33ec93edc106f4f","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":48739,"upload_time":"2024-10-31T04:36:12","upload_time_iso_8601":"2024-10-31T04:36:12.630857Z","url":"https://files.pythonhosted.org/packages/43/17/d6950ad32c33317509ea05a64d01ab661515165ffbd4e120148826b69ffb/agentops-0.3.15rc1.tar.gz","yanked":false,"yanked_reason":null}],"0.3.16":[{"comment_text":"","digests":{"blake2b_256":"b876e1c933480ec9ad093a841321e5c9f7f16a0af59f339ba2c840851b1af01d","md5":"d57593bb32704fae1163656f03355a71","sha256":"7763e65efe053fa81cea2a2e16f015c7603365280972e0c0709eec32c3c8569e"},"downloads":-1,"filename":"agentops-0.3.16-py3-none-any.whl","has_sig":false,"md5_digest":"d57593bb32704fae1163656f03355a71","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":55351,"upload_time":"2024-11-09T18:44:21","upload_time_iso_8601":"2024-11-09T18:44:21.626158Z","url":"https://files.pythonhosted.org/packages/b8/76/e1c933480ec9ad093a841321e5c9f7f16a0af59f339ba2c840851b1af01d/agentops-0.3.16-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"aa748e77e654b37a5e0c977eca4f7e92740c1e24be39c827815e7bd8da429003","md5":"23078e1dc78ef459a667feeb904345c1","sha256":"564163eb048939d64e848c7e6caf25d6c0aee31200623ef97efe492f090f8939"},"downloads":-1,"filename":"agentops-0.3.16.tar.gz","has_sig":false,"md5_digest":"23078e1dc78ef459a667feeb904345c1","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":51308,"upload_time":"2024-11-09T18:44:23","upload_time_iso_8601":"2024-11-09T18:44:23.037514Z","url":"https://files.pythonhosted.org/packages/aa/74/8e77e654b37a5e0c977eca4f7e92740c1e24be39c827815e7bd8da429003/agentops-0.3.16.tar.gz","yanked":false,"yanked_reason":null}],"0.3.17":[{"comment_text":"","digests":{"blake2b_256":"6c3038a659671eec20fcae759bd69655ec45b08c4e875627b33e3b05bd46f299","md5":"93bbe3bd4ee492e7e73780c07897b017","sha256":"0d24dd082270a76c98ad0391101d5b5c3d01e389c5032389ecd551285e4b0662"},"downloads":-1,"filename":"agentops-0.3.17-py3-none-any.whl","has_sig":false,"md5_digest":"93bbe3bd4ee492e7e73780c07897b017","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":55503,"upload_time":"2024-11-10T02:39:28","upload_time_iso_8601":"2024-11-10T02:39:28.884052Z","url":"https://files.pythonhosted.org/packages/6c/30/38a659671eec20fcae759bd69655ec45b08c4e875627b33e3b05bd46f299/agentops-0.3.17-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"2131d9a3747df04b7915ee1cffaa4a5636f8ed0e1385e5236b0da085ccce936a","md5":"49e8cf186203cadaa39301c4ce5fda42","sha256":"a893cc7c37eda720ab59e8facaa2774cc23d125648aa00539ae485ff592e8b77"},"downloads":-1,"filename":"agentops-0.3.17.tar.gz","has_sig":false,"md5_digest":"49e8cf186203cadaa39301c4ce5fda42","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":51469,"upload_time":"2024-11-10T02:39:30","upload_time_iso_8601":"2024-11-10T02:39:30.636907Z","url":"https://files.pythonhosted.org/packages/21/31/d9a3747df04b7915ee1cffaa4a5636f8ed0e1385e5236b0da085ccce936a/agentops-0.3.17.tar.gz","yanked":false,"yanked_reason":null}],"0.3.18":[{"comment_text":"","digests":{"blake2b_256":"978dbd4cad95dad722dc2d3e4179feab1058ef846828c0e15e51e8bfaea373ee","md5":"d9afc3636cb969c286738ce02ed12196","sha256":"8b48d8a1662f276653430fd541c77fa4f9a15a43e881b518ff88ea56925afcf7"},"downloads":-1,"filename":"agentops-0.3.18-py3-none-any.whl","has_sig":false,"md5_digest":"d9afc3636cb969c286738ce02ed12196","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":58032,"upload_time":"2024-11-19T19:06:19","upload_time_iso_8601":"2024-11-19T19:06:19.068511Z","url":"https://files.pythonhosted.org/packages/97/8d/bd4cad95dad722dc2d3e4179feab1058ef846828c0e15e51e8bfaea373ee/agentops-0.3.18-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"c55246bb2f29b9e5f2e1d8b124296b7794934a9048de635d9e7d6a95e791ad7b","md5":"02a4fc081499360aac58485a94a6ca33","sha256":"4d509754df7be52579597cc9f53939c5218131a0379463e0ff6f6f40cde9fcc4"},"downloads":-1,"filename":"agentops-0.3.18.tar.gz","has_sig":false,"md5_digest":"02a4fc081499360aac58485a94a6ca33","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":55394,"upload_time":"2024-11-19T19:06:21","upload_time_iso_8601":"2024-11-19T19:06:21.306448Z","url":"https://files.pythonhosted.org/packages/c5/52/46bb2f29b9e5f2e1d8b124296b7794934a9048de635d9e7d6a95e791ad7b/agentops-0.3.18.tar.gz","yanked":false,"yanked_reason":null}],"0.3.19":[{"comment_text":"","digests":{"blake2b_256":"fc1e48616d2db40717d560a561e13521009655d447388f944f12f2b3811e6d7d","md5":"a9e23f1d31821585017e97633b058233","sha256":"1888a47dd3d9b92c5f246cdeeab333def5acbd26833d3148c63e8793457405b3"},"downloads":-1,"filename":"agentops-0.3.19-py3-none-any.whl","has_sig":false,"md5_digest":"a9e23f1d31821585017e97633b058233","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":38648,"upload_time":"2024-12-04T00:54:00","upload_time_iso_8601":"2024-12-04T00:54:00.173948Z","url":"https://files.pythonhosted.org/packages/fc/1e/48616d2db40717d560a561e13521009655d447388f944f12f2b3811e6d7d/agentops-0.3.19-py3-none-any.whl","yanked":true,"yanked_reason":"Broken - dependency, please install 0.3.18"},{"comment_text":"","digests":{"blake2b_256":"b319bb0e9895cb6da29f764f8d7b95b10ac8fde400bc17028f9bd486e9574dbe","md5":"f6424c41464d438007e9628748a0bea6","sha256":"ca0d4ba35ae699169ae20f74f72ca6a5780a8768ba2a2c32589fc5292ed81674"},"downloads":-1,"filename":"agentops-0.3.19.tar.gz","has_sig":false,"md5_digest":"f6424c41464d438007e9628748a0bea6","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":48360,"upload_time":"2024-12-04T00:54:01","upload_time_iso_8601":"2024-12-04T00:54:01.418776Z","url":"https://files.pythonhosted.org/packages/b3/19/bb0e9895cb6da29f764f8d7b95b10ac8fde400bc17028f9bd486e9574dbe/agentops-0.3.19.tar.gz","yanked":true,"yanked_reason":"Broken dependency, please install 0.3.18"}],"0.3.2":[{"comment_text":"","digests":{"blake2b_256":"9d2c23b745a61d48df788b8020e5ea37e94f9da59b322a17accafe18d8cb4006","md5":"62d576d9518a627fe4232709c0721eff","sha256":"b35988e04378624204572bb3d7a454094f879ea573f05b57d4e75ab0bfbb82af"},"downloads":-1,"filename":"agentops-0.3.2-py3-none-any.whl","has_sig":false,"md5_digest":"62d576d9518a627fe4232709c0721eff","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":39527,"upload_time":"2024-07-21T03:09:56","upload_time_iso_8601":"2024-07-21T03:09:56.844372Z","url":"https://files.pythonhosted.org/packages/9d/2c/23b745a61d48df788b8020e5ea37e94f9da59b322a17accafe18d8cb4006/agentops-0.3.2-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"d2a1cc21406646c065e83435fe30fa205b99b2204d8074eca31926a5f8ef4381","md5":"30b247bcae25b181485a89213518241c","sha256":"55559ac4a43634831dfa8937c2597c28e332809dc7c6bb3bc3c8b233442e224c"},"downloads":-1,"filename":"agentops-0.3.2.tar.gz","has_sig":false,"md5_digest":"30b247bcae25b181485a89213518241c","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":41894,"upload_time":"2024-07-21T03:09:58","upload_time_iso_8601":"2024-07-21T03:09:58.409826Z","url":"https://files.pythonhosted.org/packages/d2/a1/cc21406646c065e83435fe30fa205b99b2204d8074eca31926a5f8ef4381/agentops-0.3.2.tar.gz","yanked":false,"yanked_reason":null}],"0.3.20":[{"comment_text":"","digests":{"blake2b_256":"a854ae9147a490dd9bd03ab7bfc5af47f40ff675840a9aa143896b385a8f8d3a","md5":"a13af8737ddff8a0c7c0f05cee70085f","sha256":"b5396e11b0bfef46b85604e8e36ab17668057711edd56f1edb0a067b8676fdcc"},"downloads":-1,"filename":"agentops-0.3.20-py3-none-any.whl","has_sig":false,"md5_digest":"a13af8737ddff8a0c7c0f05cee70085f","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":38674,"upload_time":"2024-12-07T00:06:31","upload_time_iso_8601":"2024-12-07T00:06:31.901162Z","url":"https://files.pythonhosted.org/packages/a8/54/ae9147a490dd9bd03ab7bfc5af47f40ff675840a9aa143896b385a8f8d3a/agentops-0.3.20-py3-none-any.whl","yanked":true,"yanked_reason":"Wrong - release"},{"comment_text":"","digests":{"blake2b_256":"c1eb19d04c801854ba75e235eb87c51a6a9c5b1a89e8579cb745c83f8bf84e08","md5":"11754497191d8340eda7a831720d9b74","sha256":"c71406294804a82795310a4afc492064a8884b1ba47e12607230975bc1291ce3"},"downloads":-1,"filename":"agentops-0.3.20.tar.gz","has_sig":false,"md5_digest":"11754497191d8340eda7a831720d9b74","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":48332,"upload_time":"2024-12-07T00:06:33","upload_time_iso_8601":"2024-12-07T00:06:33.568362Z","url":"https://files.pythonhosted.org/packages/c1/eb/19d04c801854ba75e235eb87c51a6a9c5b1a89e8579cb745c83f8bf84e08/agentops-0.3.20.tar.gz","yanked":true,"yanked_reason":"Wrong release"}],"0.3.20rc1":[{"comment_text":"","digests":{"blake2b_256":"073de7eba58e2a60c0136eee2760b20f99607001d372de26505feee891e0976b","md5":"73c6ac515ee9d555e27a7ba7e26e3a46","sha256":"079ea8138938e27a3e1319a235a6f4cf98c0d6846731d854aa83b8422d570bda"},"downloads":-1,"filename":"agentops-0.3.20rc1-py3-none-any.whl","has_sig":false,"md5_digest":"73c6ac515ee9d555e27a7ba7e26e3a46","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":38718,"upload_time":"2024-12-07T00:10:18","upload_time_iso_8601":"2024-12-07T00:10:18.796963Z","url":"https://files.pythonhosted.org/packages/07/3d/e7eba58e2a60c0136eee2760b20f99607001d372de26505feee891e0976b/agentops-0.3.20rc1-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"02ff111d618c21aad946caedb666030f1f374a0d558228b9061ea2b46acb6bcd","md5":"17062e985b931dc85b4855922d7842ce","sha256":"ef48447e07a3eded246b2f7e10bba74422a34563ffdc667ac16b2d3383475a3f"},"downloads":-1,"filename":"agentops-0.3.20rc1.tar.gz","has_sig":false,"md5_digest":"17062e985b931dc85b4855922d7842ce","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":48329,"upload_time":"2024-12-07T00:10:20","upload_time_iso_8601":"2024-12-07T00:10:20.510407Z","url":"https://files.pythonhosted.org/packages/02/ff/111d618c21aad946caedb666030f1f374a0d558228b9061ea2b46acb6bcd/agentops-0.3.20rc1.tar.gz","yanked":false,"yanked_reason":null}],"0.3.20rc10":[{"comment_text":"","digests":{"blake2b_256":"a7274706d8d9c8f4abecc1dda2b9b02cd02ffe895220bd39f58322a46ccc7254","md5":"2c66a93c691c6b8cac2f2dc8fab9efae","sha256":"3c10d77f2fe88b61d97ad007820c1ba968c62f692986ea2b2cbfd8b22ec9e5bc"},"downloads":-1,"filename":"agentops-0.3.20rc10-py3-none-any.whl","has_sig":false,"md5_digest":"2c66a93c691c6b8cac2f2dc8fab9efae","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":57423,"upload_time":"2024-12-10T03:41:04","upload_time_iso_8601":"2024-12-10T03:41:04.579814Z","url":"https://files.pythonhosted.org/packages/a7/27/4706d8d9c8f4abecc1dda2b9b02cd02ffe895220bd39f58322a46ccc7254/agentops-0.3.20rc10-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"efe9e304f465945f57e4c6d35cd35fff53dc2a2e36b9b32793fa57017467b0c2","md5":"9882d32866b94d925ba36ac376c30bea","sha256":"f0c72c20e7fe41054c22c6257420314863549dd91428a892ac9b47b81cdfcc8c"},"downloads":-1,"filename":"agentops-0.3.20rc10.tar.gz","has_sig":false,"md5_digest":"9882d32866b94d925ba36ac376c30bea","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":57564,"upload_time":"2024-12-10T03:41:06","upload_time_iso_8601":"2024-12-10T03:41:06.899043Z","url":"https://files.pythonhosted.org/packages/ef/e9/e304f465945f57e4c6d35cd35fff53dc2a2e36b9b32793fa57017467b0c2/agentops-0.3.20rc10.tar.gz","yanked":false,"yanked_reason":null}],"0.3.20rc11":[{"comment_text":"","digests":{"blake2b_256":"8dbf598ec2532b713a228f4041c9b2c10358cd43e6aecf6128d0988a0b5f103e","md5":"d9ab67a850aefcb5bf9467b48f74675d","sha256":"3e5d4c19de6c58ae684693f47a2f03db35eaf4cd6d8aafc1e804a134462c2b55"},"downloads":-1,"filename":"agentops-0.3.20rc11-py3-none-any.whl","has_sig":false,"md5_digest":"d9ab67a850aefcb5bf9467b48f74675d","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":60280,"upload_time":"2024-12-10T22:45:05","upload_time_iso_8601":"2024-12-10T22:45:05.280119Z","url":"https://files.pythonhosted.org/packages/8d/bf/598ec2532b713a228f4041c9b2c10358cd43e6aecf6128d0988a0b5f103e/agentops-0.3.20rc11-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"210642e51fff6a4537fb811a15bc22d00343145285c6246dc069433d61436e1b","md5":"ca5279f4cb6ad82e06ef542a2d08d06e","sha256":"9211489c6a01bc9cda4061826f8b80d0989cfcd7fbabe1dd2ed5a5cb76b3d6f0"},"downloads":-1,"filename":"agentops-0.3.20rc11.tar.gz","has_sig":false,"md5_digest":"ca5279f4cb6ad82e06ef542a2d08d06e","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":59718,"upload_time":"2024-12-10T22:45:09","upload_time_iso_8601":"2024-12-10T22:45:09.616947Z","url":"https://files.pythonhosted.org/packages/21/06/42e51fff6a4537fb811a15bc22d00343145285c6246dc069433d61436e1b/agentops-0.3.20rc11.tar.gz","yanked":false,"yanked_reason":null}],"0.3.20rc12":[{"comment_text":"","digests":{"blake2b_256":"dc281db6f49f10ac849683de1d7f5b5ef492be2a996325302167b8388f375d51","md5":"8b2611d2510f0d4fac7ab824d7658ff7","sha256":"9237652d28db89315c49c0705829b291c17280e07d41272f909e2609acec650b"},"downloads":-1,"filename":"agentops-0.3.20rc12-py3-none-any.whl","has_sig":false,"md5_digest":"8b2611d2510f0d4fac7ab824d7658ff7","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":60282,"upload_time":"2024-12-10T23:10:54","upload_time_iso_8601":"2024-12-10T23:10:54.516317Z","url":"https://files.pythonhosted.org/packages/dc/28/1db6f49f10ac849683de1d7f5b5ef492be2a996325302167b8388f375d51/agentops-0.3.20rc12-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"10c073cb9a55592f55bb44c9206f50f41d7b7a8a8d6fd67d42f40c8f9f184b0e","md5":"02b3a68f3491564af2e29f0f216eea1e","sha256":"d4d3a73ac34b2a00edb6e6b5b220cbb031bb76ff58d85e2096b536be24aee4fe"},"downloads":-1,"filename":"agentops-0.3.20rc12.tar.gz","has_sig":false,"md5_digest":"02b3a68f3491564af2e29f0f216eea1e","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":59731,"upload_time":"2024-12-10T23:10:56","upload_time_iso_8601":"2024-12-10T23:10:56.822803Z","url":"https://files.pythonhosted.org/packages/10/c0/73cb9a55592f55bb44c9206f50f41d7b7a8a8d6fd67d42f40c8f9f184b0e/agentops-0.3.20rc12.tar.gz","yanked":false,"yanked_reason":null}],"0.3.20rc13":[{"comment_text":"","digests":{"blake2b_256":"4ed48a97563074235f266281167c70ab90833c195e2b704087e414509ae3ec32","md5":"c86fe22044483f94bc044a3bf7b054b7","sha256":"2fbb3b55701d9aea64f622e7e29aa417772e897e2414f74ed3954d99009d224f"},"downloads":-1,"filename":"agentops-0.3.20rc13-py3-none-any.whl","has_sig":false,"md5_digest":"c86fe22044483f94bc044a3bf7b054b7","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":64724,"upload_time":"2024-12-10T23:27:50","upload_time_iso_8601":"2024-12-10T23:27:50.895316Z","url":"https://files.pythonhosted.org/packages/4e/d4/8a97563074235f266281167c70ab90833c195e2b704087e414509ae3ec32/agentops-0.3.20rc13-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"767e59c6f34e9a067d9152021de7e3146e5c0f69f36434dcb3026ff03f382489","md5":"152a70647d5ff28fe851e4cc406d8fb4","sha256":"b7a6d1d7f603bbb2605cc747762ae866bdee53941c4c76087c9f0f0a5efad03b"},"downloads":-1,"filename":"agentops-0.3.20rc13.tar.gz","has_sig":false,"md5_digest":"152a70647d5ff28fe851e4cc406d8fb4","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":63242,"upload_time":"2024-12-10T23:27:53","upload_time_iso_8601":"2024-12-10T23:27:53.657606Z","url":"https://files.pythonhosted.org/packages/76/7e/59c6f34e9a067d9152021de7e3146e5c0f69f36434dcb3026ff03f382489/agentops-0.3.20rc13.tar.gz","yanked":false,"yanked_reason":null}],"0.3.20rc2":[{"comment_text":"","digests":{"blake2b_256":"cebbbca58531e21f4c1c92cbe6ba15d0f308ff8f3b27083cd0ce6358c7d1d117","md5":"5a9fcd99e0b6e3b24e721b22c3ee5907","sha256":"ada95d42e82abef16c1e83443dc42d02bb470ee48b1fa8f2d58a20703511a7be"},"downloads":-1,"filename":"agentops-0.3.20rc2-py3-none-any.whl","has_sig":false,"md5_digest":"5a9fcd99e0b6e3b24e721b22c3ee5907","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":38716,"upload_time":"2024-12-07T00:20:01","upload_time_iso_8601":"2024-12-07T00:20:01.561074Z","url":"https://files.pythonhosted.org/packages/ce/bb/bca58531e21f4c1c92cbe6ba15d0f308ff8f3b27083cd0ce6358c7d1d117/agentops-0.3.20rc2-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"124aec14492566949b7383ae321cb40c1edc18940712b277c08d32392566f7a8","md5":"ff8db0075584474e35784b080fb9b6b1","sha256":"60462b82390e78fd21312c5db45f0f48dfcc9c9ab354e6bf232db557ccf57c13"},"downloads":-1,"filename":"agentops-0.3.20rc2.tar.gz","has_sig":false,"md5_digest":"ff8db0075584474e35784b080fb9b6b1","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":48341,"upload_time":"2024-12-07T00:20:02","upload_time_iso_8601":"2024-12-07T00:20:02.519240Z","url":"https://files.pythonhosted.org/packages/12/4a/ec14492566949b7383ae321cb40c1edc18940712b277c08d32392566f7a8/agentops-0.3.20rc2.tar.gz","yanked":false,"yanked_reason":null}],"0.3.20rc4":[{"comment_text":"","digests":{"blake2b_256":"a1551125b2b3823fcb3f3afa3c6b9621541799ac329622ee21038babbfbedf39","md5":"a82f1b73347d3a2fe33f31cec01ca376","sha256":"72253950b46a11b5b1163b13bbb9d5b769e6cdb7b102acf46efac8cf02f7eaac"},"downloads":-1,"filename":"agentops-0.3.20rc4-py3-none-any.whl","has_sig":false,"md5_digest":"a82f1b73347d3a2fe33f31cec01ca376","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":38719,"upload_time":"2024-12-07T00:53:45","upload_time_iso_8601":"2024-12-07T00:53:45.212239Z","url":"https://files.pythonhosted.org/packages/a1/55/1125b2b3823fcb3f3afa3c6b9621541799ac329622ee21038babbfbedf39/agentops-0.3.20rc4-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"a180420ef26926052b12d1c2010360b4037f6765321055ce7e09c6bfaeac3480","md5":"1a314ff81d87a774e5e1cf338151a353","sha256":"4218fcfa42644dd86ee50ac7806d08783e4629db30b127bc8011c9c3523eeb5c"},"downloads":-1,"filename":"agentops-0.3.20rc4.tar.gz","has_sig":false,"md5_digest":"1a314ff81d87a774e5e1cf338151a353","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":48332,"upload_time":"2024-12-07T00:53:47","upload_time_iso_8601":"2024-12-07T00:53:47.581677Z","url":"https://files.pythonhosted.org/packages/a1/80/420ef26926052b12d1c2010360b4037f6765321055ce7e09c6bfaeac3480/agentops-0.3.20rc4.tar.gz","yanked":false,"yanked_reason":null}],"0.3.20rc5":[{"comment_text":"","digests":{"blake2b_256":"7747e61c5387124f53a3095261427888ab88e192828e3bb8be92660bf4e008d0","md5":"fd7343ddf99f077d1a159b87d84ed79c","sha256":"97df38116ec7fe337fc04b800e423aa8b5e69681565c02dc4af3e9c60764827e"},"downloads":-1,"filename":"agentops-0.3.20rc5-py3-none-any.whl","has_sig":false,"md5_digest":"fd7343ddf99f077d1a159b87d84ed79c","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":44545,"upload_time":"2024-12-07T01:38:17","upload_time_iso_8601":"2024-12-07T01:38:17.177125Z","url":"https://files.pythonhosted.org/packages/77/47/e61c5387124f53a3095261427888ab88e192828e3bb8be92660bf4e008d0/agentops-0.3.20rc5-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"145fa0bf5ee5b56dacf63b9712ac62169c585c6222efe043cc77f3148f709965","md5":"20a32d514b5d51851dbcbdfb2c189491","sha256":"48111083dab1fc30f0545e0812c4aab00fc9e9d48de42de95d254699396992a8"},"downloads":-1,"filename":"agentops-0.3.20rc5.tar.gz","has_sig":false,"md5_digest":"20a32d514b5d51851dbcbdfb2c189491","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":53243,"upload_time":"2024-12-07T01:38:18","upload_time_iso_8601":"2024-12-07T01:38:18.772880Z","url":"https://files.pythonhosted.org/packages/14/5f/a0bf5ee5b56dacf63b9712ac62169c585c6222efe043cc77f3148f709965/agentops-0.3.20rc5.tar.gz","yanked":false,"yanked_reason":null}],"0.3.20rc6":[{"comment_text":"","digests":{"blake2b_256":"85f3a5ae3d8d47aa5160a5c805551d75077cad61bff9626abe44079d29d1c299","md5":"30f87c628c530e82e27b8bc2d2a46d8a","sha256":"d03f16832b3a5670d9c3273b95c9d9def772c203b2cd4ac52ae0e7f6d3b1b9e4"},"downloads":-1,"filename":"agentops-0.3.20rc6-py3-none-any.whl","has_sig":false,"md5_digest":"30f87c628c530e82e27b8bc2d2a46d8a","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":61844,"upload_time":"2024-12-07T01:49:11","upload_time_iso_8601":"2024-12-07T01:49:11.801219Z","url":"https://files.pythonhosted.org/packages/85/f3/a5ae3d8d47aa5160a5c805551d75077cad61bff9626abe44079d29d1c299/agentops-0.3.20rc6-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"060e24f42ed1de3d892355f3ba90f0b7f659855fafd18851e59aa7174fa30615","md5":"384c60ee11b827b8bad31cef20a35a17","sha256":"45aa4797269214d41858537d95050964f330651da5c7412b2895e714a81f30f5"},"downloads":-1,"filename":"agentops-0.3.20rc6.tar.gz","has_sig":false,"md5_digest":"384c60ee11b827b8bad31cef20a35a17","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":61004,"upload_time":"2024-12-07T01:49:13","upload_time_iso_8601":"2024-12-07T01:49:13.917920Z","url":"https://files.pythonhosted.org/packages/06/0e/24f42ed1de3d892355f3ba90f0b7f659855fafd18851e59aa7174fa30615/agentops-0.3.20rc6.tar.gz","yanked":false,"yanked_reason":null}],"0.3.20rc7":[{"comment_text":"","digests":{"blake2b_256":"d502edf7ba8aff1a994176da4c95688c9ba0428ac3bd9a0db2392fe5009162a9","md5":"9b43c5e2df12abac01ffc5262e991825","sha256":"95972115c5c753ceee477834de902afaf0664107048e44eee2c65e74e05656a2"},"downloads":-1,"filename":"agentops-0.3.20rc7-py3-none-any.whl","has_sig":false,"md5_digest":"9b43c5e2df12abac01ffc5262e991825","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":40117,"upload_time":"2024-12-07T02:12:48","upload_time_iso_8601":"2024-12-07T02:12:48.512036Z","url":"https://files.pythonhosted.org/packages/d5/02/edf7ba8aff1a994176da4c95688c9ba0428ac3bd9a0db2392fe5009162a9/agentops-0.3.20rc7-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"5d7029d8d02fcf6db627c6b20ceab974c455e23a25fc0e991c0a8d0eaebda523","md5":"9de760856bed3f7adbd1d0ab7ba0a63a","sha256":"7c793b7b199a61ca61366ddb8fd94986fac262ef6514918c3baaa08184b86669"},"downloads":-1,"filename":"agentops-0.3.20rc7.tar.gz","has_sig":false,"md5_digest":"9de760856bed3f7adbd1d0ab7ba0a63a","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":49661,"upload_time":"2024-12-07T02:12:50","upload_time_iso_8601":"2024-12-07T02:12:50.120388Z","url":"https://files.pythonhosted.org/packages/5d/70/29d8d02fcf6db627c6b20ceab974c455e23a25fc0e991c0a8d0eaebda523/agentops-0.3.20rc7.tar.gz","yanked":false,"yanked_reason":null}],"0.3.20rc8":[{"comment_text":"","digests":{"blake2b_256":"6d0f66418c0b20f40fe11de50f29481abdb266ff641ac6166eab9eac3d7364d2","md5":"52a2cea48e48d1818169c07507a6c7a9","sha256":"8cf2e9fe6400a4fb4367a039cacc5d76339a8fd2749a44243389547e928e545c"},"downloads":-1,"filename":"agentops-0.3.20rc8-py3-none-any.whl","has_sig":false,"md5_digest":"52a2cea48e48d1818169c07507a6c7a9","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":57414,"upload_time":"2024-12-07T02:17:51","upload_time_iso_8601":"2024-12-07T02:17:51.404804Z","url":"https://files.pythonhosted.org/packages/6d/0f/66418c0b20f40fe11de50f29481abdb266ff641ac6166eab9eac3d7364d2/agentops-0.3.20rc8-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"4d18250b066f23ccbb22f2bba8df101361abd5724ddcef59a4d63d4539c7cd82","md5":"f7887176e88d4434e38e237850363b80","sha256":"a06e7939dd4d59c9880ded1b129fd4548b34be5530a46cf043326740bdfeca56"},"downloads":-1,"filename":"agentops-0.3.20rc8.tar.gz","has_sig":false,"md5_digest":"f7887176e88d4434e38e237850363b80","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":57521,"upload_time":"2024-12-07T02:17:53","upload_time_iso_8601":"2024-12-07T02:17:53.055737Z","url":"https://files.pythonhosted.org/packages/4d/18/250b066f23ccbb22f2bba8df101361abd5724ddcef59a4d63d4539c7cd82/agentops-0.3.20rc8.tar.gz","yanked":false,"yanked_reason":null}],"0.3.21":[{"comment_text":"","digests":{"blake2b_256":"c4cb3b6cc5a08d11d9e56501f980222da0fa41814b7d6948a7f6354f31739af6","md5":"c7592f9e7993dbe307fbffd7e4da1e51","sha256":"4f98beecdce4c7cbee80ec26658a9657ba307a1fb2910b589f85325d3259b75b"},"downloads":-1,"filename":"agentops-0.3.21-py3-none-any.whl","has_sig":false,"md5_digest":"c7592f9e7993dbe307fbffd7e4da1e51","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":64701,"upload_time":"2024-12-11T12:24:00","upload_time_iso_8601":"2024-12-11T12:24:00.934724Z","url":"https://files.pythonhosted.org/packages/c4/cb/3b6cc5a08d11d9e56501f980222da0fa41814b7d6948a7f6354f31739af6/agentops-0.3.21-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"83f6bfd27fa4b948c353eaff579dafdf4eb54833f5c526e00c6f2faee4b467a8","md5":"83d7666511cccf3b0d4354cebd99b110","sha256":"d8e8d1f6d154554dba64ec5b139905bf76c68f21575af9fa2ca1697277fe36f2"},"downloads":-1,"filename":"agentops-0.3.21.tar.gz","has_sig":false,"md5_digest":"83d7666511cccf3b0d4354cebd99b110","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":63185,"upload_time":"2024-12-11T12:24:02","upload_time_iso_8601":"2024-12-11T12:24:02.068404Z","url":"https://files.pythonhosted.org/packages/83/f6/bfd27fa4b948c353eaff579dafdf4eb54833f5c526e00c6f2faee4b467a8/agentops-0.3.21.tar.gz","yanked":false,"yanked_reason":null}],"0.3.22":[{"comment_text":"","digests":{"blake2b_256":"11e721b42168ecfd0a9fff9dea51201646b6e62c4f52c8cd9c2a6400125d7234","md5":"26061ab467e358b63251f9547275bbbd","sha256":"992f4f31d80e8b0b2098abf58ae2707c60538e4b66e5aec8cf49fb269d5a2adc"},"downloads":-1,"filename":"agentops-0.3.22-py3-none-any.whl","has_sig":false,"md5_digest":"26061ab467e358b63251f9547275bbbd","packagetype":"bdist_wheel","python_version":"py3","requires_python":"<3.14,>=3.9","size":39539,"upload_time":"2025-01-11T03:21:39","upload_time_iso_8601":"2025-01-11T03:21:39.093169Z","url":"https://files.pythonhosted.org/packages/11/e7/21b42168ecfd0a9fff9dea51201646b6e62c4f52c8cd9c2a6400125d7234/agentops-0.3.22-py3-none-any.whl","yanked":true,"yanked_reason":"Broken - dependency"},{"comment_text":"","digests":{"blake2b_256":"e067e61aa4c2e329da10b5e95d325091e599d8a00a28843a54bdcefa7a2eef8d","md5":"bcf45b6c4c56884ed2409f835571af62","sha256":"705d772b6994f8bab0cd163b24602009353f7906c72d9db008af11683f6e9341"},"downloads":-1,"filename":"agentops-0.3.22.tar.gz","has_sig":false,"md5_digest":"bcf45b6c4c56884ed2409f835571af62","packagetype":"sdist","python_version":"source","requires_python":"<3.14,>=3.9","size":52845,"upload_time":"2025-01-11T03:21:41","upload_time_iso_8601":"2025-01-11T03:21:41.762282Z","url":"https://files.pythonhosted.org/packages/e0/67/e61aa4c2e329da10b5e95d325091e599d8a00a28843a54bdcefa7a2eef8d/agentops-0.3.22.tar.gz","yanked":true,"yanked_reason":"Broken dependency"}],"0.3.23":[{"comment_text":null,"digests":{"blake2b_256":"e67de1434765cf0a3d62372b74f47919aa17c0b01909823f7d3ee705edf821a9","md5":"1f0f02509b8ba713db72e57a072f01a6","sha256":"ecfff77d8f9006361ef2a2e8593271e97eb54b7b504abfb8abd6504006baca56"},"downloads":-1,"filename":"agentops-0.3.23-py3-none-any.whl","has_sig":false,"md5_digest":"1f0f02509b8ba713db72e57a072f01a6","packagetype":"bdist_wheel","python_version":"py3","requires_python":"<3.14,>=3.9","size":70098,"upload_time":"2025-01-12T02:11:56","upload_time_iso_8601":"2025-01-12T02:11:56.319763Z","url":"https://files.pythonhosted.org/packages/e6/7d/e1434765cf0a3d62372b74f47919aa17c0b01909823f7d3ee705edf821a9/agentops-0.3.23-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"5c7fa4fd91f8fd819e1ecfdc608d1c7ade83de0f9dddd868e2c2c139a2fdae25","md5":"b7922399f81fb26517eb69fc7fef97c9","sha256":"4e4de49caeaf567b8746082f84a8cdd65afe2c698720f6f40251bbc4fdffe4c9"},"downloads":-1,"filename":"agentops-0.3.23.tar.gz","has_sig":false,"md5_digest":"b7922399f81fb26517eb69fc7fef97c9","packagetype":"sdist","python_version":"source","requires_python":"<3.14,>=3.9","size":64225,"upload_time":"2025-01-12T02:11:59","upload_time_iso_8601":"2025-01-12T02:11:59.360077Z","url":"https://files.pythonhosted.org/packages/5c/7f/a4fd91f8fd819e1ecfdc608d1c7ade83de0f9dddd868e2c2c139a2fdae25/agentops-0.3.23.tar.gz","yanked":false,"yanked_reason":null}],"0.3.24":[{"comment_text":null,"digests":{"blake2b_256":"254ea7d131802bac2ece5302ebf78dcef1ba1ba2f8b3a51fbe44c7f52bae6a53","md5":"39c39d8a7f1285add0fec21830a89a4a","sha256":"c5dfc8098b0dd49ddd819aa55280d07f8bfbf2f8fa088fc51ff5849b65062b10"},"downloads":-1,"filename":"agentops-0.3.24-py3-none-any.whl","has_sig":false,"md5_digest":"39c39d8a7f1285add0fec21830a89a4a","packagetype":"bdist_wheel","python_version":"py3","requires_python":"<3.14,>=3.9","size":71957,"upload_time":"2025-01-18T19:08:02","upload_time_iso_8601":"2025-01-18T19:08:02.053316Z","url":"https://files.pythonhosted.org/packages/25/4e/a7d131802bac2ece5302ebf78dcef1ba1ba2f8b3a51fbe44c7f52bae6a53/agentops-0.3.24-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"71fee96e22c4bf762f34cd5ba435880470dad4576ab357ee61742fe053752322","md5":"3e1b7e0a31197936e099a7509128f794","sha256":"c97a3af959b728bcfbfb1ac2494cef82d8804defc9dac858648b39a9ecdcd2e4"},"downloads":-1,"filename":"agentops-0.3.24.tar.gz","has_sig":false,"md5_digest":"3e1b7e0a31197936e099a7509128f794","packagetype":"sdist","python_version":"source","requires_python":"<3.14,>=3.9","size":233974,"upload_time":"2025-01-18T19:08:04","upload_time_iso_8601":"2025-01-18T19:08:04.121618Z","url":"https://files.pythonhosted.org/packages/71/fe/e96e22c4bf762f34cd5ba435880470dad4576ab357ee61742fe053752322/agentops-0.3.24.tar.gz","yanked":false,"yanked_reason":null}],"0.3.25":[{"comment_text":null,"digests":{"blake2b_256":"e6e39cff4ed65c5deac34f427ed60cd7af3604ec7ed8a999c351f6411e190d3b","md5":"328dedc417be02fc28f8a4c7ed7b52e9","sha256":"4faebf73a62aa0bcac8578428277ca5b9af5e828f49f2cb03a9695b8426e6b9d"},"downloads":-1,"filename":"agentops-0.3.25-py3-none-any.whl","has_sig":false,"md5_digest":"328dedc417be02fc28f8a4c7ed7b52e9","packagetype":"bdist_wheel","python_version":"py3","requires_python":"<3.14,>=3.9","size":71971,"upload_time":"2025-01-22T10:43:16","upload_time_iso_8601":"2025-01-22T10:43:16.070593Z","url":"https://files.pythonhosted.org/packages/e6/e3/9cff4ed65c5deac34f427ed60cd7af3604ec7ed8a999c351f6411e190d3b/agentops-0.3.25-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"2fdfeb00eaabebb51feae0724a5928f25df4d71d1c8392204f4f849351fd748c","md5":"a40bc7037baf6dbba92d63331f561a28","sha256":"868d855b6531d1fa2d1047db2cb03ddb1121062fd51c44b564dc626f15cc1e40"},"downloads":-1,"filename":"agentops-0.3.25.tar.gz","has_sig":false,"md5_digest":"a40bc7037baf6dbba92d63331f561a28","packagetype":"sdist","python_version":"source","requires_python":"<3.14,>=3.9","size":234024,"upload_time":"2025-01-22T10:43:17","upload_time_iso_8601":"2025-01-22T10:43:17.986230Z","url":"https://files.pythonhosted.org/packages/2f/df/eb00eaabebb51feae0724a5928f25df4d71d1c8392204f4f849351fd748c/agentops-0.3.25.tar.gz","yanked":false,"yanked_reason":null}],"0.3.26":[{"comment_text":null,"digests":{"blake2b_256":"f521671c458951850bd3a445aa09eafd2793aae1104fa68351a5c3976cdf762b","md5":"c3f8fa92ff5a94a37516e774c7f58b9a","sha256":"20948f52e3ffb4ba1d52301c3a82e59490182c4dad22774ad831dce0181eb5c2"},"downloads":-1,"filename":"agentops-0.3.26-py3-none-any.whl","has_sig":false,"md5_digest":"c3f8fa92ff5a94a37516e774c7f58b9a","packagetype":"bdist_wheel","python_version":"py3","requires_python":"<3.14,>=3.9","size":72090,"upload_time":"2025-01-24T23:44:06","upload_time_iso_8601":"2025-01-24T23:44:06.828461Z","url":"https://files.pythonhosted.org/packages/f5/21/671c458951850bd3a445aa09eafd2793aae1104fa68351a5c3976cdf762b/agentops-0.3.26-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"76a1b03c6348a77798e750bde4eec03b4af620d71b9e4b64ff7dcf0860025a2d","md5":"ba4d0f2411ec72828677b38a395465cc","sha256":"bc824bf8727332f59bf803cf84440d13e9e398406222ab29f45909ac1e39f815"},"downloads":-1,"filename":"agentops-0.3.26.tar.gz","has_sig":false,"md5_digest":"ba4d0f2411ec72828677b38a395465cc","packagetype":"sdist","python_version":"source","requires_python":"<3.14,>=3.9","size":234235,"upload_time":"2025-01-24T23:44:08","upload_time_iso_8601":"2025-01-24T23:44:08.541961Z","url":"https://files.pythonhosted.org/packages/76/a1/b03c6348a77798e750bde4eec03b4af620d71b9e4b64ff7dcf0860025a2d/agentops-0.3.26.tar.gz","yanked":false,"yanked_reason":null}],"0.3.4":[{"comment_text":"","digests":{"blake2b_256":"52f32bd714234ec345153c0fcbc9e4896c306c347f3fb66a3aa6d6fc109a7243","md5":"c7a975a86900f7dbe6861a21fdd3c2d8","sha256":"126f7aed4ba43c1399b5488d67a03d10cb4c531e619c650776f826ca00c1aa24"},"downloads":-1,"filename":"agentops-0.3.4-py3-none-any.whl","has_sig":false,"md5_digest":"c7a975a86900f7dbe6861a21fdd3c2d8","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":39915,"upload_time":"2024-07-24T23:15:03","upload_time_iso_8601":"2024-07-24T23:15:03.892439Z","url":"https://files.pythonhosted.org/packages/52/f3/2bd714234ec345153c0fcbc9e4896c306c347f3fb66a3aa6d6fc109a7243/agentops-0.3.4-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"d28b88a2c9c2df655de806adbb5deebb12c64d19d6aa3cfa759da642953525e0","md5":"f48a2ab7fcaf9cf11a25805ac5300e26","sha256":"a92c9cb7c511197f0ecb8cb5aca15d35022c15a3d2fd2aaaa34cd7e5dc59393f"},"downloads":-1,"filename":"agentops-0.3.4.tar.gz","has_sig":false,"md5_digest":"f48a2ab7fcaf9cf11a25805ac5300e26","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":42063,"upload_time":"2024-07-24T23:15:05","upload_time_iso_8601":"2024-07-24T23:15:05.586475Z","url":"https://files.pythonhosted.org/packages/d2/8b/88a2c9c2df655de806adbb5deebb12c64d19d6aa3cfa759da642953525e0/agentops-0.3.4.tar.gz","yanked":false,"yanked_reason":null}],"0.3.5":[{"comment_text":"","digests":{"blake2b_256":"f253f9672c6aa3c79b6a5b64321e93d2316f126add867ceb2e3e95ea8b4bf1b0","md5":"bd45dc8100fd3974dff11014d12424ff","sha256":"687cb938ecf9d1bf7650afc910e2b2e1b8b6d9e969215aeb49e57f1555a2a756"},"downloads":-1,"filename":"agentops-0.3.5-py3-none-any.whl","has_sig":false,"md5_digest":"bd45dc8100fd3974dff11014d12424ff","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":39177,"upload_time":"2024-08-01T19:32:19","upload_time_iso_8601":"2024-08-01T19:32:19.765946Z","url":"https://files.pythonhosted.org/packages/f2/53/f9672c6aa3c79b6a5b64321e93d2316f126add867ceb2e3e95ea8b4bf1b0/agentops-0.3.5-py3-none-any.whl","yanked":true,"yanked_reason":"Introduces - FileNotFoundError impacting OpenAI and LiteLLM integrations"},{"comment_text":"","digests":{"blake2b_256":"235508ce5915f1ceb86ea6f7a6e8c8dc025b34981408a1b638316b5140fad525","md5":"53ef2f5230de09260f4ead09633dde62","sha256":"ae98540355ce9b892a630e61a7224a9175657cad1b7e799269238748ca7bc0ea"},"downloads":-1,"filename":"agentops-0.3.5.tar.gz","has_sig":false,"md5_digest":"53ef2f5230de09260f4ead09633dde62","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":42699,"upload_time":"2024-08-01T19:32:21","upload_time_iso_8601":"2024-08-01T19:32:21.259555Z","url":"https://files.pythonhosted.org/packages/23/55/08ce5915f1ceb86ea6f7a6e8c8dc025b34981408a1b638316b5140fad525/agentops-0.3.5.tar.gz","yanked":true,"yanked_reason":"Introduces FileNotFoundError impacting OpenAI and LiteLLM integrations"}],"0.3.6":[{"comment_text":"","digests":{"blake2b_256":"be89412afc864df3715d377cff9fe15deadaccdc0902b0a242f742f286e6d84b","md5":"149922f5cd986a8641b6e88c991af0cc","sha256":"413f812eb015fb31175a507784afe08123adfa9e227870e315899b059f42b443"},"downloads":-1,"filename":"agentops-0.3.6-py3-none-any.whl","has_sig":false,"md5_digest":"149922f5cd986a8641b6e88c991af0cc","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":39431,"upload_time":"2024-08-02T06:48:19","upload_time_iso_8601":"2024-08-02T06:48:19.594149Z","url":"https://files.pythonhosted.org/packages/be/89/412afc864df3715d377cff9fe15deadaccdc0902b0a242f742f286e6d84b/agentops-0.3.6-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"c3bf85f1439c3951ef69c81dbd7ef6df8a11df957e8d1180d835d71c11fa5131","md5":"b68d3124e365867f891bec4fb211a398","sha256":"0941f2486f3a561712ba6f77d560b49e2df55be141f243da0f9dc97ed43e6968"},"downloads":-1,"filename":"agentops-0.3.6.tar.gz","has_sig":false,"md5_digest":"b68d3124e365867f891bec4fb211a398","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":42933,"upload_time":"2024-08-02T06:48:21","upload_time_iso_8601":"2024-08-02T06:48:21.508300Z","url":"https://files.pythonhosted.org/packages/c3/bf/85f1439c3951ef69c81dbd7ef6df8a11df957e8d1180d835d71c11fa5131/agentops-0.3.6.tar.gz","yanked":false,"yanked_reason":null}],"0.3.7":[{"comment_text":"","digests":{"blake2b_256":"a34d05ba61e4fbd976dabe736d74fb2bb14d064ca758f05f084c0dadb6ac5cb1","md5":"551df1e89278270e0f5522d41f5c28ae","sha256":"7eeec5bef41e9ba397b3d880bcec8cd0818209ab31665c85e8b97615011a23d9"},"downloads":-1,"filename":"agentops-0.3.7-py3-none-any.whl","has_sig":false,"md5_digest":"551df1e89278270e0f5522d41f5c28ae","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":39816,"upload_time":"2024-08-08T23:21:45","upload_time_iso_8601":"2024-08-08T23:21:45.035395Z","url":"https://files.pythonhosted.org/packages/a3/4d/05ba61e4fbd976dabe736d74fb2bb14d064ca758f05f084c0dadb6ac5cb1/agentops-0.3.7-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"9f31034c3e062287f4fe9f57f2448e9508617a26bbb8a16b11c77cda9b28e1c0","md5":"1c48a797903a25988bae9b72559307ec","sha256":"048ee3caa5edf01b98c994e4e3ff90c09d83f820a43a70f07db96032c3386750"},"downloads":-1,"filename":"agentops-0.3.7.tar.gz","has_sig":false,"md5_digest":"1c48a797903a25988bae9b72559307ec","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":43495,"upload_time":"2024-08-08T23:21:46","upload_time_iso_8601":"2024-08-08T23:21:46.798531Z","url":"https://files.pythonhosted.org/packages/9f/31/034c3e062287f4fe9f57f2448e9508617a26bbb8a16b11c77cda9b28e1c0/agentops-0.3.7.tar.gz","yanked":false,"yanked_reason":null}],"0.3.9":[{"comment_text":"","digests":{"blake2b_256":"660ce931f892e0cedd40d861c3deff4134e1af1d226d6dc9762b32514d6dbc9f","md5":"82792de7bccabed058a24d3bd47443db","sha256":"582c9ddb30a9bb951b4d3ee2fd0428ba77d4a4367950b9cc6043f45b10bf12d8"},"downloads":-1,"filename":"agentops-0.3.9-py3-none-any.whl","has_sig":false,"md5_digest":"82792de7bccabed058a24d3bd47443db","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":40235,"upload_time":"2024-08-15T21:21:33","upload_time_iso_8601":"2024-08-15T21:21:33.468748Z","url":"https://files.pythonhosted.org/packages/66/0c/e931f892e0cedd40d861c3deff4134e1af1d226d6dc9762b32514d6dbc9f/agentops-0.3.9-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"e17b68cef3aaf44d423046b7779e9325e4feef5257e6d784a55c9dadf84bd61a","md5":"470f3b2663b71eb2f1597903bf8922e7","sha256":"7c999edbc64196924acdb06da09ec664a09d9fec8e73ba4e0f89e5f3dafc79e5"},"downloads":-1,"filename":"agentops-0.3.9.tar.gz","has_sig":false,"md5_digest":"470f3b2663b71eb2f1597903bf8922e7","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":43796,"upload_time":"2024-08-15T21:21:34","upload_time_iso_8601":"2024-08-15T21:21:34.591272Z","url":"https://files.pythonhosted.org/packages/e1/7b/68cef3aaf44d423046b7779e9325e4feef5257e6d784a55c9dadf84bd61a/agentops-0.3.9.tar.gz","yanked":false,"yanked_reason":null}],"0.4.0":[{"comment_text":null,"digests":{"blake2b_256":"060e66184fab1fc3bdd955ac20ea7bdef78f5b9aecc4080ea3e054c2a2436991","md5":"250de44e3599992c75625cef67682ecd","sha256":"b4821b8ec69c05a4d13b34eaad4762bb06a4f14e1241d57c16fdd28de5c8c929"},"downloads":-1,"filename":"agentops-0.4.0-py3-none-any.whl","has_sig":false,"md5_digest":"250de44e3599992c75625cef67682ecd","packagetype":"bdist_wheel","python_version":"py3","requires_python":"<3.14,>=3.9","size":171419,"upload_time":"2025-03-13T11:24:15","upload_time_iso_8601":"2025-03-13T11:24:15.042606Z","url":"https://files.pythonhosted.org/packages/06/0e/66184fab1fc3bdd955ac20ea7bdef78f5b9aecc4080ea3e054c2a2436991/agentops-0.4.0-py3-none-any.whl","yanked":true,"yanked_reason":"broken - dependencies"},{"comment_text":null,"digests":{"blake2b_256":"ff7f8a57d060489c780db3e15c4d9ff8c670e5db583549c74dd2d32ae6ec10c0","md5":"ea0932849a7311750c6ac0e567c90182","sha256":"45f5367cecd8a0b648055b6ec76e8a6a2801425e80dede8f86b39e9c6cfe1d98"},"downloads":-1,"filename":"agentops-0.4.0.tar.gz","has_sig":false,"md5_digest":"ea0932849a7311750c6ac0e567c90182","packagetype":"sdist","python_version":"source","requires_python":"<3.14,>=3.9","size":248757,"upload_time":"2025-03-13T11:24:16","upload_time_iso_8601":"2025-03-13T11:24:16.866033Z","url":"https://files.pythonhosted.org/packages/ff/7f/8a57d060489c780db3e15c4d9ff8c670e5db583549c74dd2d32ae6ec10c0/agentops-0.4.0.tar.gz","yanked":true,"yanked_reason":"broken dependencies"}],"0.4.1":[{"comment_text":null,"digests":{"blake2b_256":"736e7ab03c56260ec59bfaeeb08efb76f55ec6153861ad2a9cf20b38b222e4e7","md5":"3fcebe0141ca19b2fbcb53e918003ce9","sha256":"69c944e22628bc0f52c534007d2453da2a1988a7fd1f993720c4a15b0f70465a"},"downloads":-1,"filename":"agentops-0.4.1-py3-none-any.whl","has_sig":false,"md5_digest":"3fcebe0141ca19b2fbcb53e918003ce9","packagetype":"bdist_wheel","python_version":"py3","requires_python":"<3.14,>=3.9","size":171402,"upload_time":"2025-03-13T16:29:26","upload_time_iso_8601":"2025-03-13T16:29:26.477091Z","url":"https://files.pythonhosted.org/packages/73/6e/7ab03c56260ec59bfaeeb08efb76f55ec6153861ad2a9cf20b38b222e4e7/agentops-0.4.1-py3-none-any.whl","yanked":true,"yanked_reason":"Broken - dependencies"},{"comment_text":null,"digests":{"blake2b_256":"ca303217cd3480ad099ffa92848ccbc8672e5232c22918c95a4b99e49c0ef31e","md5":"ec421fa88b575b827fc0d3fd02f45515","sha256":"fec044f0346dca6aba17e458e669ac1f52f1b618a4a15b43342615096c5e7d56"},"downloads":-1,"filename":"agentops-0.4.1.tar.gz","has_sig":false,"md5_digest":"ec421fa88b575b827fc0d3fd02f45515","packagetype":"sdist","python_version":"source","requires_python":"<3.14,>=3.9","size":248747,"upload_time":"2025-03-13T16:29:27","upload_time_iso_8601":"2025-03-13T16:29:27.905694Z","url":"https://files.pythonhosted.org/packages/ca/30/3217cd3480ad099ffa92848ccbc8672e5232c22918c95a4b99e49c0ef31e/agentops-0.4.1.tar.gz","yanked":true,"yanked_reason":"Broken dependencies"}],"0.4.10":[{"comment_text":null,"digests":{"blake2b_256":"301e0fe4fb617a5a69a8692b571d726f03e713a37d94d6a43c595a08fc33cff3","md5":"5ac7ec12e80bae6946dc10e46ef768f7","sha256":"917ad7ad51af0ca00cace2a3ae1d1d36e0d65dc813e030fcd377ff98535002bd"},"downloads":-1,"filename":"agentops-0.4.10-py3-none-any.whl","has_sig":false,"md5_digest":"5ac7ec12e80bae6946dc10e46ef768f7","packagetype":"bdist_wheel","python_version":"py3","requires_python":"<3.14,>=3.9","size":198777,"upload_time":"2025-05-08T20:37:29","upload_time_iso_8601":"2025-05-08T20:37:29.322288Z","url":"https://files.pythonhosted.org/packages/30/1e/0fe4fb617a5a69a8692b571d726f03e713a37d94d6a43c595a08fc33cff3/agentops-0.4.10-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"a0ef0a56be3981bd464ad5a22fa3a859421f4b5560cbbb082f3ef9aca9cdb1a7","md5":"1954d07bfa38ba5c5ce0e516b7dbfdc9","sha256":"b66a48b4ec50c9cb34abc6ff1df873f0dcddbbb528d8a8c0527cb97b24c91b36"},"downloads":-1,"filename":"agentops-0.4.10.tar.gz","has_sig":false,"md5_digest":"1954d07bfa38ba5c5ce0e516b7dbfdc9","packagetype":"sdist","python_version":"source","requires_python":"<3.14,>=3.9","size":284727,"upload_time":"2025-05-08T20:37:30","upload_time_iso_8601":"2025-05-08T20:37:30.744217Z","url":"https://files.pythonhosted.org/packages/a0/ef/0a56be3981bd464ad5a22fa3a859421f4b5560cbbb082f3ef9aca9cdb1a7/agentops-0.4.10.tar.gz","yanked":false,"yanked_reason":null}],"0.4.11":[{"comment_text":null,"digests":{"blake2b_256":"35cde66dea05d2d8070f886e8f4ce86905cf1cce2f89622e041f26e39f717c9e","md5":"20424d54ba76517d586d4bcc92dda3bf","sha256":"b08c84fd69f36fcd5d6f2b14d16ff88b977a9a417d92448c9709f3c7990d6438"},"downloads":-1,"filename":"agentops-0.4.11-py3-none-any.whl","has_sig":false,"md5_digest":"20424d54ba76517d586d4bcc92dda3bf","packagetype":"bdist_wheel","python_version":"py3","requires_python":"<3.14,>=3.9","size":198789,"upload_time":"2025-05-12T20:38:29","upload_time_iso_8601":"2025-05-12T20:38:29.202046Z","url":"https://files.pythonhosted.org/packages/35/cd/e66dea05d2d8070f886e8f4ce86905cf1cce2f89622e041f26e39f717c9e/agentops-0.4.11-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"349df76fc1760cb21788967db3dd22ff2e6521c42b8ecee152e6ac4278e7cade","md5":"b7affd8b15834e4f9cb63066d7d160d1","sha256":"6eb80ee4a0653f9bdc9fc7641bf60cb7546cd34ff1c04dfbc4fca77dbb07edda"},"downloads":-1,"filename":"agentops-0.4.11.tar.gz","has_sig":false,"md5_digest":"b7affd8b15834e4f9cb63066d7d160d1","packagetype":"sdist","python_version":"source","requires_python":"<3.14,>=3.9","size":284735,"upload_time":"2025-05-12T20:38:30","upload_time_iso_8601":"2025-05-12T20:38:30.393540Z","url":"https://files.pythonhosted.org/packages/34/9d/f76fc1760cb21788967db3dd22ff2e6521c42b8ecee152e6ac4278e7cade/agentops-0.4.11.tar.gz","yanked":false,"yanked_reason":null}],"0.4.12":[{"comment_text":null,"digests":{"blake2b_256":"eb86772ed94e4e55433e8014933dab08aa6dfbcd8072f7fd74ffcad335ba0e73","md5":"831a3d54bccce09cc6c2a352776d02e6","sha256":"7c2685ae9c9de1a1071f6a29d395444191744d5ee58e33c020a69e2388dc2f7c"},"downloads":-1,"filename":"agentops-0.4.12-py3-none-any.whl","has_sig":false,"md5_digest":"831a3d54bccce09cc6c2a352776d02e6","packagetype":"bdist_wheel","python_version":"py3","requires_python":"<3.14,>=3.9","size":198319,"upload_time":"2025-05-15T19:59:27","upload_time_iso_8601":"2025-05-15T19:59:27.609093Z","url":"https://files.pythonhosted.org/packages/eb/86/772ed94e4e55433e8014933dab08aa6dfbcd8072f7fd74ffcad335ba0e73/agentops-0.4.12-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"0cf664cea8e916a305d2dc2f3f3840a1d4cae40e1927892e1fcc11f83ec7ebee","md5":"7e97e0612a6e8544b37a2fa2e1633166","sha256":"530f15d428a4c78db918fa766366c8f11105c4d1d3b1a56de027747d805a573f"},"downloads":-1,"filename":"agentops-0.4.12.tar.gz","has_sig":false,"md5_digest":"7e97e0612a6e8544b37a2fa2e1633166","packagetype":"sdist","python_version":"source","requires_python":"<3.14,>=3.9","size":284309,"upload_time":"2025-05-15T19:59:28","upload_time_iso_8601":"2025-05-15T19:59:28.955745Z","url":"https://files.pythonhosted.org/packages/0c/f6/64cea8e916a305d2dc2f3f3840a1d4cae40e1927892e1fcc11f83ec7ebee/agentops-0.4.12.tar.gz","yanked":false,"yanked_reason":null}],"0.4.13":[{"comment_text":null,"digests":{"blake2b_256":"637f1514550d55e8ba0e2aef4f652678413e9979f4f6c019d8032cfd9fade10e","md5":"ddea9230651973616b50a1f089657999","sha256":"256cfcd4eb257d0a3c9538bd461ffe1dceb15cd0627b405b45d99661d8925247"},"downloads":-1,"filename":"agentops-0.4.13-py3-none-any.whl","has_sig":false,"md5_digest":"ddea9230651973616b50a1f089657999","packagetype":"bdist_wheel","python_version":"py3","requires_python":"<3.14,>=3.9","size":214973,"upload_time":"2025-05-27T22:32:40","upload_time_iso_8601":"2025-05-27T22:32:40.986531Z","url":"https://files.pythonhosted.org/packages/63/7f/1514550d55e8ba0e2aef4f652678413e9979f4f6c019d8032cfd9fade10e/agentops-0.4.13-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"cee05df9380bcf206dbdf70a7df161ffb406b1060dd06f489f3bdf8765b5463a","md5":"ab39a8b926330602f8930e73a1671245","sha256":"942832fa1a8c728abf4097878316da9e2739e35f1d7b0de6d60422144d34d961"},"downloads":-1,"filename":"agentops-0.4.13.tar.gz","has_sig":false,"md5_digest":"ab39a8b926330602f8930e73a1671245","packagetype":"sdist","python_version":"source","requires_python":"<3.14,>=3.9","size":298357,"upload_time":"2025-05-27T22:32:43","upload_time_iso_8601":"2025-05-27T22:32:43.002489Z","url":"https://files.pythonhosted.org/packages/ce/e0/5df9380bcf206dbdf70a7df161ffb406b1060dd06f489f3bdf8765b5463a/agentops-0.4.13.tar.gz","yanked":false,"yanked_reason":null}],"0.4.14":[{"comment_text":null,"digests":{"blake2b_256":"f23ffbbb6b6f81f82943e1d19dd38dc7eda566b630b5f2fd02205d0c1a05f491","md5":"a081592d2b27897042bdba8fc375bba4","sha256":"5efa6b2c7a0e5b854b2c0aa8248b49e865dac83e5404332bf2eab4d226a0d3bd"},"downloads":-1,"filename":"agentops-0.4.14-py3-none-any.whl","has_sig":false,"md5_digest":"a081592d2b27897042bdba8fc375bba4","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.9","size":214837,"upload_time":"2025-05-30T20:46:55","upload_time_iso_8601":"2025-05-30T20:46:55.103050Z","url":"https://files.pythonhosted.org/packages/f2/3f/fbbb6b6f81f82943e1d19dd38dc7eda566b630b5f2fd02205d0c1a05f491/agentops-0.4.14-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"502593c81d2860a122a92091d5e8cd960beafa354bd37d3a796d45db5d2c071d","md5":"6041cd38a5160f5a27276e17ee6efb1b","sha256":"041cfc93280f6ea4639808d383442a5b70e148c0c357719315b8330768b9a3f0"},"downloads":-1,"filename":"agentops-0.4.14.tar.gz","has_sig":false,"md5_digest":"6041cd38a5160f5a27276e17ee6efb1b","packagetype":"sdist","python_version":"source","requires_python":">=3.9","size":298334,"upload_time":"2025-05-30T20:46:56","upload_time_iso_8601":"2025-05-30T20:46:56.560116Z","url":"https://files.pythonhosted.org/packages/50/25/93c81d2860a122a92091d5e8cd960beafa354bd37d3a796d45db5d2c071d/agentops-0.4.14.tar.gz","yanked":false,"yanked_reason":null}],"0.4.15":[{"comment_text":null,"digests":{"blake2b_256":"5de724df0613409f8f8f949b2acdf5d52aa6ac7f7e798e40af31117ef9bb3494","md5":"caa1ceb85a1cbaaecf71374df4eefb7d","sha256":"5881cc64c6d93a52a8e434788b11febf72bf14db4d5898d9ae5cc90c7ae74a6e"},"downloads":-1,"filename":"agentops-0.4.15-py3-none-any.whl","has_sig":false,"md5_digest":"caa1ceb85a1cbaaecf71374df4eefb7d","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.9","size":249524,"upload_time":"2025-06-17T00:00:33","upload_time_iso_8601":"2025-06-17T00:00:33.763125Z","url":"https://files.pythonhosted.org/packages/5d/e7/24df0613409f8f8f949b2acdf5d52aa6ac7f7e798e40af31117ef9bb3494/agentops-0.4.15-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"259b9040a5dc9b2dac5891aa5b93b325c8aea3b8eced3e4ea0b74937d4fa2724","md5":"8ee09660a4cc856eb482e3e36023796c","sha256":"03db71a80bafa808cec24a825b4b23a3c06a3e49b62b6e789c6796c5ec04c21b"},"downloads":-1,"filename":"agentops-0.4.15.tar.gz","has_sig":false,"md5_digest":"8ee09660a4cc856eb482e3e36023796c","packagetype":"sdist","python_version":"source","requires_python":">=3.9","size":322997,"upload_time":"2025-06-17T00:00:35","upload_time_iso_8601":"2025-06-17T00:00:35.227273Z","url":"https://files.pythonhosted.org/packages/25/9b/9040a5dc9b2dac5891aa5b93b325c8aea3b8eced3e4ea0b74937d4fa2724/agentops-0.4.15.tar.gz","yanked":false,"yanked_reason":null}],"0.4.16":[{"comment_text":null,"digests":{"blake2b_256":"76a6fff94368ad5c04128c37bb9c6a7b3cbb4956aed19fb566796900afba9440","md5":"acf57b34328c7d464d8f405e3c0d48a5","sha256":"04f78d3996e03be2716476c25316b99d765f31a78b5352bd8d28f4cb425d9458"},"downloads":-1,"filename":"agentops-0.4.16-py3-none-any.whl","has_sig":false,"md5_digest":"acf57b34328c7d464d8f405e3c0d48a5","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.9","size":268341,"upload_time":"2025-06-19T00:52:07","upload_time_iso_8601":"2025-06-19T00:52:07.933214Z","url":"https://files.pythonhosted.org/packages/76/a6/fff94368ad5c04128c37bb9c6a7b3cbb4956aed19fb566796900afba9440/agentops-0.4.16-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"c6e8ca6c289a2af9af2140ddf97271b6060cd052dfdfd44c438667d379c3f95a","md5":"60214a3ffc818ce3cbfc3123d8c354f3","sha256":"0d2dff064be938b355522c25907538b331e2049188027275b4fd4840187f283e"},"downloads":-1,"filename":"agentops-0.4.16.tar.gz","has_sig":false,"md5_digest":"60214a3ffc818ce3cbfc3123d8c354f3","packagetype":"sdist","python_version":"source","requires_python":">=3.9","size":335321,"upload_time":"2025-06-19T00:52:09","upload_time_iso_8601":"2025-06-19T00:52:09.730961Z","url":"https://files.pythonhosted.org/packages/c6/e8/ca6c289a2af9af2140ddf97271b6060cd052dfdfd44c438667d379c3f95a/agentops-0.4.16.tar.gz","yanked":false,"yanked_reason":null}],"0.4.2":[{"comment_text":null,"digests":{"blake2b_256":"b13fcb38831e86502e3a30460a27e72a254df39cc2f223d1952e063e2d0b1f70","md5":"c958500ff1e2b600064e980d526f3ad8","sha256":"4c376e3a95d1c65a864e8a5ab6f4bdb62f76abf2271b3c9a1cda2a0ad33b2b1a"},"downloads":-1,"filename":"agentops-0.4.2-py3-none-any.whl","has_sig":false,"md5_digest":"c958500ff1e2b600064e980d526f3ad8","packagetype":"bdist_wheel","python_version":"py3","requires_python":"<3.14,>=3.9","size":171420,"upload_time":"2025-03-13T16:56:31","upload_time_iso_8601":"2025-03-13T16:56:31.589623Z","url":"https://files.pythonhosted.org/packages/b1/3f/cb38831e86502e3a30460a27e72a254df39cc2f223d1952e063e2d0b1f70/agentops-0.4.2-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"4bd0f2c1951661617febfd14c3e98a58fbd805e48f453356e912dc8efc950490","md5":"7a125604d2bb3494714462442f0ac47c","sha256":"42cbc30a0eecee5db468d01dcbe398d57f080cbf8bb09aecc2ce40c5a21509a5"},"downloads":-1,"filename":"agentops-0.4.2.tar.gz","has_sig":false,"md5_digest":"7a125604d2bb3494714462442f0ac47c","packagetype":"sdist","python_version":"source","requires_python":"<3.14,>=3.9","size":248754,"upload_time":"2025-03-13T16:56:33","upload_time_iso_8601":"2025-03-13T16:56:33.062966Z","url":"https://files.pythonhosted.org/packages/4b/d0/f2c1951661617febfd14c3e98a58fbd805e48f453356e912dc8efc950490/agentops-0.4.2.tar.gz","yanked":false,"yanked_reason":null}],"0.4.3":[{"comment_text":null,"digests":{"blake2b_256":"398892f5a663cf616607e92a0499f5b636fe4e5ae8a6b7febc436077cd02ecd5","md5":"e739880fc1b0cf1e15a816277ca1e8d9","sha256":"c69cf884fc20cd3b44dd07bc9bca9ecec72e44fd2b12c50523670e3743fbbe6c"},"downloads":-1,"filename":"agentops-0.4.3-py3-none-any.whl","has_sig":false,"md5_digest":"e739880fc1b0cf1e15a816277ca1e8d9","packagetype":"bdist_wheel","python_version":"py3","requires_python":"<3.14,>=3.9","size":111111,"upload_time":"2025-03-14T17:35:53","upload_time_iso_8601":"2025-03-14T17:35:53.978325Z","url":"https://files.pythonhosted.org/packages/39/88/92f5a663cf616607e92a0499f5b636fe4e5ae8a6b7febc436077cd02ecd5/agentops-0.4.3-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"c296f6f5268ffd68079185c6b21190a6ab5b35997678ce89af211d3c3683cc16","md5":"8df7f60a4346721caf9a4a74b0ba2e32","sha256":"48379801976e5e6c830ee40b247d7e7834fb79fb18d2cec926a8c06bdf767090"},"downloads":-1,"filename":"agentops-0.4.3.tar.gz","has_sig":false,"md5_digest":"8df7f60a4346721caf9a4a74b0ba2e32","packagetype":"sdist","python_version":"source","requires_python":"<3.14,>=3.9","size":209668,"upload_time":"2025-03-14T17:35:55","upload_time_iso_8601":"2025-03-14T17:35:55.387572Z","url":"https://files.pythonhosted.org/packages/c2/96/f6f5268ffd68079185c6b21190a6ab5b35997678ce89af211d3c3683cc16/agentops-0.4.3.tar.gz","yanked":false,"yanked_reason":null}],"0.4.4":[{"comment_text":null,"digests":{"blake2b_256":"e230799eb1a6b63e6f072611e4d6c5f7d70d969b1c2d14735100a5295eb794fd","md5":"76de08f25b0f1765ec9b3ce200f2273c","sha256":"a33f32e0d09e942b501a4066460b77bc1f6be960bdbd8dfed1cfc5950702f87c"},"downloads":-1,"filename":"agentops-0.4.4-py3-none-any.whl","has_sig":false,"md5_digest":"76de08f25b0f1765ec9b3ce200f2273c","packagetype":"bdist_wheel","python_version":"py3","requires_python":"<3.14,>=3.9","size":115456,"upload_time":"2025-03-17T21:08:16","upload_time_iso_8601":"2025-03-17T21:08:16.149499Z","url":"https://files.pythonhosted.org/packages/e2/30/799eb1a6b63e6f072611e4d6c5f7d70d969b1c2d14735100a5295eb794fd/agentops-0.4.4-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"65e969c80c4c8fbf27826644c2bbcaf657bf9882a7974b115bff5021c683560d","md5":"2c34c20f9b785c60ea1cc6011b50684b","sha256":"509daf197bb27f8e5b1ac87e516487883178335c70328fd74897b1a5fadbf0bd"},"downloads":-1,"filename":"agentops-0.4.4.tar.gz","has_sig":false,"md5_digest":"2c34c20f9b785c60ea1cc6011b50684b","packagetype":"sdist","python_version":"source","requires_python":"<3.14,>=3.9","size":209971,"upload_time":"2025-03-17T21:08:17","upload_time_iso_8601":"2025-03-17T21:08:17.396763Z","url":"https://files.pythonhosted.org/packages/65/e9/69c80c4c8fbf27826644c2bbcaf657bf9882a7974b115bff5021c683560d/agentops-0.4.4.tar.gz","yanked":false,"yanked_reason":null}],"0.4.5":[{"comment_text":null,"digests":{"blake2b_256":"5cf1848e02d7233e3bfe74119e28a4fb7cf9dd3363eb215cf8bb8ca835317cc7","md5":"e70f8b49cbbbf5b6a56bbfc51938581c","sha256":"ec45a775dd5f494fe137620ce3e43aa06a6858495bed31c4b9019b343a34d092"},"downloads":-1,"filename":"agentops-0.4.5-py3-none-any.whl","has_sig":false,"md5_digest":"e70f8b49cbbbf5b6a56bbfc51938581c","packagetype":"bdist_wheel","python_version":"py3","requires_python":"<3.14,>=3.9","size":148034,"upload_time":"2025-03-25T00:05:57","upload_time_iso_8601":"2025-03-25T00:05:57.075368Z","url":"https://files.pythonhosted.org/packages/5c/f1/848e02d7233e3bfe74119e28a4fb7cf9dd3363eb215cf8bb8ca835317cc7/agentops-0.4.5-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"cc2c243f2e01dae6cc2583bca8009c735bb08267c9f51f0e916154b91329e08f","md5":"16781e2f18e40444f869c38b3b27c70c","sha256":"d82d908072c8ffea1b90d63d651ccb73dec8597ef830e60b4311efb4f5593e8e"},"downloads":-1,"filename":"agentops-0.4.5.tar.gz","has_sig":false,"md5_digest":"16781e2f18e40444f869c38b3b27c70c","packagetype":"sdist","python_version":"source","requires_python":"<3.14,>=3.9","size":232839,"upload_time":"2025-03-25T00:05:58","upload_time_iso_8601":"2025-03-25T00:05:58.270348Z","url":"https://files.pythonhosted.org/packages/cc/2c/243f2e01dae6cc2583bca8009c735bb08267c9f51f0e916154b91329e08f/agentops-0.4.5.tar.gz","yanked":false,"yanked_reason":null}],"0.4.6":[{"comment_text":null,"digests":{"blake2b_256":"316124fa78f759c68e1484ed04ed6d0d60ad4b6b58d02570a65dc670975fd954","md5":"36d7d7e64cde9ed73d4ced26e9ee4fb0","sha256":"283929b8f7a1bc79693a6c982e012ccceac4645c6a35709603e7ff83332ec00d"},"downloads":-1,"filename":"agentops-0.4.6-py3-none-any.whl","has_sig":false,"md5_digest":"36d7d7e64cde9ed73d4ced26e9ee4fb0","packagetype":"bdist_wheel","python_version":"py3","requires_python":"<3.14,>=3.9","size":160863,"upload_time":"2025-04-07T22:18:58","upload_time_iso_8601":"2025-04-07T22:18:58.881418Z","url":"https://files.pythonhosted.org/packages/31/61/24fa78f759c68e1484ed04ed6d0d60ad4b6b58d02570a65dc670975fd954/agentops-0.4.6-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"d0073869f9b99dbc45ac55bc0dbfd8cf6b22de850a716004135ec96a29c3d81e","md5":"1390e3bc3185a4e97492958c1c4e549c","sha256":"78179a0d2c02217445fb7315bb963496bb338c96bcc126bebfb45a5733fea23e"},"downloads":-1,"filename":"agentops-0.4.6.tar.gz","has_sig":false,"md5_digest":"1390e3bc3185a4e97492958c1c4e549c","packagetype":"sdist","python_version":"source","requires_python":"<3.14,>=3.9","size":254164,"upload_time":"2025-04-07T22:19:00","upload_time_iso_8601":"2025-04-07T22:19:00.589814Z","url":"https://files.pythonhosted.org/packages/d0/07/3869f9b99dbc45ac55bc0dbfd8cf6b22de850a716004135ec96a29c3d81e/agentops-0.4.6.tar.gz","yanked":false,"yanked_reason":null}],"0.4.7":[{"comment_text":null,"digests":{"blake2b_256":"a4be6d708281bd3a282879859231fb7d2ab1d0fec6ee421ec6b02d08a3726670","md5":"3bb2171ad2809a49c43935f1d249aa02","sha256":"b1c4acda70ef45a3c7deac01a695b922a14bb762826ba68fb2b8c3859f4e87da"},"downloads":-1,"filename":"agentops-0.4.7-py3-none-any.whl","has_sig":false,"md5_digest":"3bb2171ad2809a49c43935f1d249aa02","packagetype":"bdist_wheel","python_version":"py3","requires_python":"<3.14,>=3.9","size":182708,"upload_time":"2025-04-24T00:39:39","upload_time_iso_8601":"2025-04-24T00:39:39.403616Z","url":"https://files.pythonhosted.org/packages/a4/be/6d708281bd3a282879859231fb7d2ab1d0fec6ee421ec6b02d08a3726670/agentops-0.4.7-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"20a5d142e98481d82912280e29b5b73dc5a5deea4d34c132045333b5201c1209","md5":"62c78776d059798f2e6a74bf1b03932f","sha256":"ad6dca62ff88d4c09eda34e3393c138880a5126682b53cf0c881a7dbb61dcc0d"},"downloads":-1,"filename":"agentops-0.4.7.tar.gz","has_sig":false,"md5_digest":"62c78776d059798f2e6a74bf1b03932f","packagetype":"sdist","python_version":"source","requires_python":"<3.14,>=3.9","size":272982,"upload_time":"2025-04-24T00:39:40","upload_time_iso_8601":"2025-04-24T00:39:40.931148Z","url":"https://files.pythonhosted.org/packages/20/a5/d142e98481d82912280e29b5b73dc5a5deea4d34c132045333b5201c1209/agentops-0.4.7.tar.gz","yanked":false,"yanked_reason":null}],"0.4.8":[{"comment_text":null,"digests":{"blake2b_256":"96d32cee2a94f2917be9c7575238dfff3088a51a6376168a2c7287da0e8b654c","md5":"a02a327b4620a909e831fbd6889bf25e","sha256":"86f439d47c0fdfcb3525859528300b19bb96c105875d0b5b3d205260aedc3f24"},"downloads":-1,"filename":"agentops-0.4.8-py3-none-any.whl","has_sig":false,"md5_digest":"a02a327b4620a909e831fbd6889bf25e","packagetype":"bdist_wheel","python_version":"py3","requires_python":"<3.14,>=3.9","size":182678,"upload_time":"2025-04-27T09:10:39","upload_time_iso_8601":"2025-04-27T09:10:39.925403Z","url":"https://files.pythonhosted.org/packages/96/d3/2cee2a94f2917be9c7575238dfff3088a51a6376168a2c7287da0e8b654c/agentops-0.4.8-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"ba64732ebe57c77123058cbc03eec0795267fac65aa6032b8906b1dfe80ff837","md5":"f947ace32256ff3ee6b2a6c716ef3543","sha256":"c299ca067298f568ae2885e4d21951b0bdb7067692d930b57ff1f19bd447ae5a"},"downloads":-1,"filename":"agentops-0.4.8.tar.gz","has_sig":false,"md5_digest":"f947ace32256ff3ee6b2a6c716ef3543","packagetype":"sdist","python_version":"source","requires_python":"<3.14,>=3.9","size":272951,"upload_time":"2025-04-27T09:10:41","upload_time_iso_8601":"2025-04-27T09:10:41.806172Z","url":"https://files.pythonhosted.org/packages/ba/64/732ebe57c77123058cbc03eec0795267fac65aa6032b8906b1dfe80ff837/agentops-0.4.8.tar.gz","yanked":false,"yanked_reason":null}],"0.4.9":[{"comment_text":null,"digests":{"blake2b_256":"5814e40def8897f404273f69d6841793b3dbdcbb8f2948fb6bd9c50087239b37","md5":"f49c139fbf17affaa3e8165743971a50","sha256":"622b9ecdc1b5e91c5ac3aa92d2f756d083c4e0ba830d8e94c3785f7290587a97"},"downloads":-1,"filename":"agentops-0.4.9-py3-none-any.whl","has_sig":false,"md5_digest":"f49c139fbf17affaa3e8165743971a50","packagetype":"bdist_wheel","python_version":"py3","requires_python":"<3.14,>=3.9","size":198463,"upload_time":"2025-05-02T23:51:48","upload_time_iso_8601":"2025-05-02T23:51:48.502905Z","url":"https://files.pythonhosted.org/packages/58/14/e40def8897f404273f69d6841793b3dbdcbb8f2948fb6bd9c50087239b37/agentops-0.4.9-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"32efa2af9802799b3d26c570b8dd18669e3577fb58fa093a3c9cfafbf179376c","md5":"5eb22fdc989748711f0252c3679388e9","sha256":"c69a0c912a75367850036c20368d4722462b5769eb86bdebabb0695f8be4c8bd"},"downloads":-1,"filename":"agentops-0.4.9.tar.gz","has_sig":false,"md5_digest":"5eb22fdc989748711f0252c3679388e9","packagetype":"sdist","python_version":"source","requires_python":"<3.14,>=3.9","size":284471,"upload_time":"2025-05-02T23:51:49","upload_time_iso_8601":"2025-05-02T23:51:49.781274Z","url":"https://files.pythonhosted.org/packages/32/ef/a2af9802799b3d26c570b8dd18669e3577fb58fa093a3c9cfafbf179376c/agentops-0.4.9.tar.gz","yanked":false,"yanked_reason":null}]},"urls":[{"comment_text":null,"digests":{"blake2b_256":"76a6fff94368ad5c04128c37bb9c6a7b3cbb4956aed19fb566796900afba9440","md5":"acf57b34328c7d464d8f405e3c0d48a5","sha256":"04f78d3996e03be2716476c25316b99d765f31a78b5352bd8d28f4cb425d9458"},"downloads":-1,"filename":"agentops-0.4.16-py3-none-any.whl","has_sig":false,"md5_digest":"acf57b34328c7d464d8f405e3c0d48a5","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.9","size":268341,"upload_time":"2025-06-19T00:52:07","upload_time_iso_8601":"2025-06-19T00:52:07.933214Z","url":"https://files.pythonhosted.org/packages/76/a6/fff94368ad5c04128c37bb9c6a7b3cbb4956aed19fb566796900afba9440/agentops-0.4.16-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"digests":{"blake2b_256":"c6e8ca6c289a2af9af2140ddf97271b6060cd052dfdfd44c438667d379c3f95a","md5":"60214a3ffc818ce3cbfc3123d8c354f3","sha256":"0d2dff064be938b355522c25907538b331e2049188027275b4fd4840187f283e"},"downloads":-1,"filename":"agentops-0.4.16.tar.gz","has_sig":false,"md5_digest":"60214a3ffc818ce3cbfc3123d8c354f3","packagetype":"sdist","python_version":"source","requires_python":">=3.9","size":335321,"upload_time":"2025-06-19T00:52:09","upload_time_iso_8601":"2025-06-19T00:52:09.730961Z","url":"https://files.pythonhosted.org/packages/c6/e8/ca6c289a2af9af2140ddf97271b6060cd052dfdfd44c438667d379c3f95a/agentops-0.4.16.tar.gz","yanked":false,"yanked_reason":null}],"vulnerabilities":[]} - - ' - headers: - Accept-Ranges: - - bytes - Connection: - - keep-alive - Content-Length: - - '147037' - Date: - - Tue, 24 Jun 2025 18:17:09 GMT - Permissions-Policy: - - publickey-credentials-create=(self),publickey-credentials-get=(self),accelerometer=(),ambient-light-sensor=(),autoplay=(),battery=(),camera=(),display-capture=(),document-domain=(),encrypted-media=(),execution-while-not-rendered=(),execution-while-out-of-viewport=(),fullscreen=(),gamepad=(),geolocation=(),gyroscope=(),hid=(),identity-credentials-get=(),idle-detection=(),local-fonts=(),magnetometer=(),microphone=(),midi=(),otp-credentials=(),payment=(),picture-in-picture=(),screen-wake-lock=(),serial=(),speaker-selection=(),storage-access=(),usb=(),web-share=(),xr-spatial-tracking=() - Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload - Vary: - - Accept-Encoding - X-Cache: - - MISS, HIT, HIT - X-Cache-Hits: - - 0, 5234, 1 - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - deny - X-Permitted-Cross-Domain-Policies: - - none - X-Served-By: - - cache-iad-kjyo7100059-IAD, cache-iad-kjyo7100044-IAD, cache-gru-sbgr1930048-GRU - X-Timer: - - S1750789029.150939,VS0,VE4 - X-XSS-Protection: - - 1; mode=block - access-control-allow-headers: - - Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since - access-control-allow-methods: - - GET - access-control-allow-origin: - - '*' - access-control-expose-headers: - - X-PyPI-Last-Serial - access-control-max-age: - - '86400' - cache-control: - - max-age=900, public - content-security-policy: - - base-uri 'self'; connect-src 'self' https://api.github.com/repos/ https://api.github.com/search/issues https://gitlab.com/api/ https://analytics.python.org fastly-insights.com *.fastly-insights.com *.ethicalads.io https://api.pwnedpasswords.com https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/sre/mathmaps/ https://2p66nmmycsj3.statuspage.io; default-src 'none'; font-src 'self' fonts.gstatic.com; form-action 'self' https://checkout.stripe.com; frame-ancestors 'none'; frame-src 'none'; img-src 'self' https://pypi-camo.freetls.fastly.net/ *.fastly-insights.com *.ethicalads.io ethicalads.blob.core.windows.net; script-src 'self' https://analytics.python.org *.fastly-insights.com *.ethicalads.io 'sha256-U3hKDidudIaxBDEzwGJApJgPEf2mWk6cfMWghrAa6i0=' https://cdn.jsdelivr.net/npm/mathjax@3.2.2/ 'sha256-1CldwzdEg2k1wTmf7s5RWVd7NMXI/7nxxjJM2C4DqII=' 'sha256-0POaN8stWYQxhzjKS+/eOfbbJ/u4YHO5ZagJvLpMypo='; style-src 'self' fonts.googleapis.com *.ethicalads.io 'sha256-2YHqZokjiizkHi1Zt+6ar0XJ0OeEy/egBnlm+MDMtrM=' - 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=' 'sha256-JLEjeN9e5dGsz5475WyRaoA4eQOdNPxDIeUhclnJDCE=' 'sha256-mQyxHEuwZJqpxCw3SLmc4YOySNKXunyu2Oiz1r3/wAE=' 'sha256-OCf+kv5Asiwp++8PIevKBYSgnNLNUZvxAp4a7wMLuKA=' 'sha256-h5LOiLhk6wiJrGsG5ItM0KimwzWQH/yAcmoJDJL//bY='; worker-src *.fastly-insights.com - content-type: - - application/json - etag: - - '"mVxu5Y9b1sgh2CIUoXK8BQ"' - referrer-policy: - - origin-when-cross-origin - x-pypi-last-serial: - - '29695949' - status: - code: 200 - message: OK -- request: - body: '{"trace_id": "18f7992e-da65-4b69-bbe7-212176a3d836", "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-05T23:11:50.094791+00:00"}, "ephemeral_trace_id": "18f7992e-da65-4b69-bbe7-212176a3d836"}' - 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":"b47c99de-55ce-4282-a2b2-1f0a26699e66","ephemeral_trace_id":"18f7992e-da65-4b69-bbe7-212176a3d836","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-05T23:11:50.423Z","updated_at":"2025-11-05T23:11:50.423Z","access_code":"TRACE-7fbb21b3f9","user_identifier":null}' - headers: - Connection: - - keep-alive - Content-Length: - - '515' - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 05 Nov 2025 23:11:50 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/"ad9765408bacdf25c542345ddca78bb2" - 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: - - abeaefb7-af6b-4523-b627-a53fe86ef881 - x-runtime: - - '0.085107' - x-xss-protection: - - 1; mode=block - status: - code: 201 - message: Created -- request: - body: '{"messages":[{"role":"system","content":"You are plants Senior Data Researcher\n. You''re a seasoned researcher with a knack for uncovering the latest developments in plants. Known for your ability to find the most relevant information and present it in a clear and concise manner.\n\nYour personal goal is: Uncover cutting-edge developments in plants\n\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: Conduct a thorough research about plants Make sure you find any interesting and relevant information given the current year is 2025.\n\n\nThis is the expected criteria for your final answer: A list with 10 bullet points of the most relevant information about plants\n\nyou MUST return the actual - complete content as the final answer, not a summary.\n\nThis is the context you''re working with:\n### Previous attempt failed validation: Error while validating the task output: The guardrail result is not a valid pydantic model\n\n\n### Previous result:\n1. **Plant-Based Biofuels**: Advances in genetic engineering are allowing researchers to develop plants that produce higher yields of biofuels, reducing reliance on fossil fuels. For example, specialized strains of switchgrass and algae are being cultivated for more efficient biofuel production.\n\n2. **CRISPR Technology in Plant Breeding**: The use of CRISPR technology has accelerated the breeding of disease-resistant and drought-tolerant plants. Researchers are now able to edit plant genomes with precision, leading to breakthroughs in staple crops like rice and wheat for better resilience to climate change.\n\n3. **Vertical Farming Innovations**: Vertical farming techniques have evolved to integrate advanced hydroponics and aeroponics, - improving space efficiency and speed of plant growth. This method not only conserves water but also minimizes the use of pesticides and herbicides.\n\n4. **Enhancing Plant Photosynthesis**: Researchers are exploring ways to enhance the photosynthesis process in plants, potentially increasing crop yields by up to 50%. New variations in light-harvesting proteins have been identified that could lead to crops that grow quicker and with less resource input.\n\n5. **Plant Communication**: Studies have shown that plants can communicate with each other through root exudates and volatile organic compounds. This research is leading to better understanding of plant ecology and could have implications for agriculture practices and pest control.\n\n6. **Soil Microbiomes and Plant Health**: Recent findings highlight the importance of soil microbiomes in promoting plant health and growth. The use of beneficial microbial inoculants is becoming a popular strategy to enhance nutrient uptake and improve - plant resilience.\n\n7. **Sustainable Pest Management**: Innovative pest management strategies utilizing plant-based repellents are on the rise. This involves selecting and cultivating plants that naturally deter pests, minimizing the need for chemical pesticides and enhancing biodiversity.\n\n8. **Urban Forests as Carbon Sinks**: Urban greening initiatives are increasingly focusing on planting trees and shrubs in cities to capture carbon dioxide, improve air quality, and promote biodiversity. These efforts are being recognized for their role in mitigating urban heat and climate change impacts.\n\n9. **Phytoremediation**: Research into using specific plants for soil and water remediation has gained traction. Some plants can absorb heavy metals and toxins, offering a sustainable solution for cleaning contaminated environments.\n\n10. **Biophilic Design in Architecture**: There is a growing trend in incorporating plants into architectural designs, employing biophilic principles to enhance - urban ecosystems. This includes the integration of green roofs and living walls, which provide aesthetic benefits while improving air quality and biodiversity.\n\n\nTry again, making sure to address the validation error.\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 - connection: - - keep-alive - content-length: - - '4382' - 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.9 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - body: - string: "{\n \"id\": \"chatcmpl-CYgxKIJCtEakAxmxCjvFLAgQNxNNX\",\n \"object\": \"chat.completion\",\n \"created\": 1762384310,\n \"model\": \"gpt-4.1-mini-2025-04-14\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Thought: I now can give a great answer\\nFinal Answer:\\n1. **Genetically Modified Plants for Climate Resilience**: In 2025, significant progress has been made in developing genetically engineered crops that are more resilient to extreme weather conditions such as drought, heat, and flooding. Using advanced gene editing techniques like CRISPR-Cas9, plants such as maize and soybeans have been tailored to survive and produce stable yields despite climate stress.\\n\\n2. **Enhanced Carbon Capture through Plant Engineering**: Researchers have identified and bioengineered certain plant species to increase their carbon sequestration capacity. Innovations include modifying root systems and photosynthetic\ - \ pathways to absorb and store more atmospheric carbon dioxide, contributing to climate change mitigation strategies.\\n\\n3. **Vertical Farming Integration with AI and Robotics**: Modern vertical farms combine hydroponics and aeroponics with artificial intelligence and robotics to optimize plant growth cycles. AI monitors environmental conditions and nutrient levels in real-time, while robots manage planting and harvesting, significantly increasing efficiency and reducing labor costs.\\n\\n4. **Discovery of Plant Immune System Pathways**: Cutting-edge research has unveiled new molecular pathways in plants that govern their immune responses to pathogens. This knowledge is being applied to develop crop varieties with enhanced natural resistance, reducing the dependence on chemical pesticides.\\n\\n5. **Microbiome Engineering for Soil and Plant Health**: Advances in understanding the plant microbiome have led to the creation of customized microbial inoculants that improve nutrient\ - \ uptake, boost growth, and enhance stress tolerance. These soil and root microbiome treatments are now widely used to promote sustainable agriculture.\\n\\n6. **Smart Plant Sensors for Real-Time Monitoring**: Biotechnological breakthroughs have resulted in the development of nanosensors that can be integrated into plants to provide real-time data on plant health, water status, and nutrient deficiencies. This technology enables precision agriculture by allowing farmers to make timely, data-driven decisions.\\n\\n7. **Phytoremediation with Genetically Enhanced Species**: New genetically modified plants have been developed with an increased ability to absorb heavy metals and pollutants from contaminated soils and water bodies. These plants serve as eco-friendly, cost-effective solutions for environmental cleanup.\\n\\n8. **Urban Greening for Climate Resilience**: Cities in 2025 are increasingly adopting urban forestry projects that use specially selected plant species to combat the\ - \ urban heat island effect, improve air quality, and support urban biodiversity. These initiatives also play a vital role in enhancing mental health and wellbeing for residents.\\n\\n9. **Plant-Based Bioplastics and Sustainable Materials**: Innovations in plant biotechnology have enabled the production of biodegradable plastics and other sustainable materials derived from plant biomass. This technology offers alternatives to petroleum-based products, helping reduce plastic pollution and carbon emissions.\\n\\n10. **Advancements in Photosynthesis Efficiency**: Scientists have successfully introduced and optimized synthetic pathways to enhance photosynthesis in crops, resulting in a 30-50% increase in growth rates and yields. This breakthrough addresses the global food security challenge by enabling more efficient energy conversion in plants.\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n\ - \ ],\n \"usage\": {\n \"prompt_tokens\": 799,\n \"completion_tokens\": 605,\n \"total_tokens\": 1404,\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_4c2851f862\"\n}\n" - headers: - CF-RAY: - - 99a008535b928ce2-EWR - Connection: - - keep-alive - Content-Type: - - application/json - Date: - - Wed, 05 Nov 2025 23:11:58 GMT + - Thu, 15 Jan 2026 00:33:22 GMT Server: - cloudflare Set-Cookie: - - __cf_bm=gemAT_QB_h_zisIV4_4r2Ltg8oBSvOOHIp9lOpAcJxE-1762384318-1.0.1.1-hbHi8L_6ckzVRc7q12W69jloWLCbjFefoSgd465kdaTlFOdUKu4Ft.90.XtUYVTzXluYj28p0e07ASms9gCIdr8CHLfbhFQKf6nZqk7.KZ4; path=/; expires=Wed, 05-Nov-25 23:41:58 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - - _cfuvid=FuiwbPturMkq3oPWfHULVuvVE6SZkSH8wf8u2lWOeHo-1762384318759-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + - SET-COOKIE-XXX Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload + - STS-XXX Transfer-Encoding: - chunked X-Content-Type-Options: - - nosniff + - X-CONTENT-TYPE-XXX access-control-expose-headers: - - X-Request-ID + - ACCESS-CONTROL-XXX alt-svc: - h3=":443"; ma=86400 cf-cache-status: - DYNAMIC + content-length: + - '3737' openai-organization: - - user-REDACTED + - OPENAI-ORG-XXX openai-processing-ms: - - '8275' + - '9598' openai-project: - - proj_REDACTED + - OPENAI-PROJECT-XXX openai-version: - '2020-10-01' x-envoy-upstream-service-time: - - '8409' + - '9718' x-openai-proxy-wasm: - v0.1 x-ratelimit-limit-requests: - - '500' + - X-RATELIMIT-LIMIT-REQUESTS-XXX x-ratelimit-limit-tokens: - - '200000' + - X-RATELIMIT-LIMIT-TOKENS-XXX x-ratelimit-remaining-requests: - - '499' + - X-RATELIMIT-REMAINING-REQUESTS-XXX x-ratelimit-remaining-tokens: - - '198937' + - X-RATELIMIT-REMAINING-TOKENS-XXX x-ratelimit-reset-requests: - - 120ms + - X-RATELIMIT-RESET-REQUESTS-XXX x-ratelimit-reset-tokens: - - 318ms + - X-RATELIMIT-RESET-TOKENS-XXX x-request-id: - - req_6e2ec55058f6435fa6f190848d95a858 + - X-REQUEST-ID-XXX status: code: 200 message: OK - request: - body: '{"messages":[{"role":"system","content":"Ensure your final answer strictly adheres to the following OpenAPI schema: {\n \"type\": \"json_schema\",\n \"json_schema\": {\n \"name\": \"LLMGuardrailResult\",\n \"strict\": true,\n \"schema\": {\n \"properties\": {\n \"valid\": {\n \"description\": \"Whether the task output complies with the guardrail\",\n \"title\": \"Valid\",\n \"type\": \"boolean\"\n },\n \"feedback\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"A feedback about the task output if it is not valid\",\n \"title\": \"Feedback\"\n }\n },\n \"required\": [\n \"valid\",\n \"feedback\"\n ],\n \"title\": \"LLMGuardrailResult\",\n \"type\": \"object\",\n \"additionalProperties\": - false\n }\n }\n}\n\nDo not include the OpenAPI schema in the final output. Ensure the final output does not include any code block markers like ```json or ```python."},{"role":"user","content":"1. **Genetically Modified Plants for Climate Resilience**: In 2025, significant progress has been made in developing genetically engineered crops that are more resilient to extreme weather conditions such as drought, heat, and flooding. Using advanced gene editing techniques like CRISPR-Cas9, plants such as maize and soybeans have been tailored to survive and produce stable yields despite climate stress.\n\n2. **Enhanced Carbon Capture through Plant Engineering**: Researchers have identified and bioengineered certain plant species to increase their carbon sequestration capacity. Innovations include modifying root systems and photosynthetic pathways to absorb and store more atmospheric carbon dioxide, contributing to climate change mitigation strategies.\n\n3. **Vertical Farming Integration - with AI and Robotics**: Modern vertical farms combine hydroponics and aeroponics with artificial intelligence and robotics to optimize plant growth cycles. AI monitors environmental conditions and nutrient levels in real-time, while robots manage planting and harvesting, significantly increasing efficiency and reducing labor costs.\n\n4. **Discovery of Plant Immune System Pathways**: Cutting-edge research has unveiled new molecular pathways in plants that govern their immune responses to pathogens. This knowledge is being applied to develop crop varieties with enhanced natural resistance, reducing the dependence on chemical pesticides.\n\n5. **Microbiome Engineering for Soil and Plant Health**: Advances in understanding the plant microbiome have led to the creation of customized microbial inoculants that improve nutrient uptake, boost growth, and enhance stress tolerance. These soil and root microbiome treatments are now widely used to promote sustainable agriculture.\n\n6. **Smart - Plant Sensors for Real-Time Monitoring**: Biotechnological breakthroughs have resulted in the development of nanosensors that can be integrated into plants to provide real-time data on plant health, water status, and nutrient deficiencies. This technology enables precision agriculture by allowing farmers to make timely, data-driven decisions.\n\n7. **Phytoremediation with Genetically Enhanced Species**: New genetically modified plants have been developed with an increased ability to absorb heavy metals and pollutants from contaminated soils and water bodies. These plants serve as eco-friendly, cost-effective solutions for environmental cleanup.\n\n8. **Urban Greening for Climate Resilience**: Cities in 2025 are increasingly adopting urban forestry projects that use specially selected plant species to combat the urban heat island effect, improve air quality, and support urban biodiversity. These initiatives also play a vital role in enhancing mental health and wellbeing for residents.\n\n9. - **Plant-Based Bioplastics and Sustainable Materials**: Innovations in plant biotechnology have enabled the production of biodegradable plastics and other sustainable materials derived from plant biomass. This technology offers alternatives to petroleum-based products, helping reduce plastic pollution and carbon emissions.\n\n10. **Advancements in Photosynthesis Efficiency**: Scientists have successfully introduced and optimized synthetic pathways to enhance photosynthesis in crops, resulting in a 30-50% increase in growth rates and yields. This breakthrough addresses the global food security challenge by enabling more efficient energy conversion in plants."}],"model":"gpt-4.1-mini","response_format":{"type":"json_schema","json_schema":{"schema":{"properties":{"valid":{"description":"Whether the task output complies with the guardrail","title":"Valid","type":"boolean"},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A feedback about the task output if it is not - valid","title":"Feedback"}},"required":["valid","feedback"],"title":"LLMGuardrailResult","type":"object","additionalProperties":false},"name":"LLMGuardrailResult","strict":true}},"stream":false}' + body: '{"messages":[{"role":"system","content":"Ensure your final answer strictly + adheres to the following OpenAPI schema: {\n \"type\": \"json_schema\",\n \"json_schema\": + {\n \"name\": \"LLMGuardrailResult\",\n \"strict\": true,\n \"schema\": + {\n \"properties\": {\n \"valid\": {\n \"description\": + \"Whether the task output complies with the guardrail\",\n \"title\": + \"Valid\",\n \"type\": \"boolean\"\n },\n \"feedback\": + {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": + \"null\"\n }\n ],\n \"default\": null,\n \"description\": + \"A feedback about the task output if it is not valid\",\n \"title\": + \"Feedback\"\n }\n },\n \"required\": [\n \"valid\",\n \"feedback\"\n ],\n \"title\": + \"LLMGuardrailResult\",\n \"type\": \"object\",\n \"additionalProperties\": + false\n }\n }\n}\n\nDo not include the OpenAPI schema in the final output. + Ensure the final output does not include any code block markers like ```json + or ```python."},{"role":"user","content":"{\"valid\":false,\"feedback\":\"The + task result does not comply with the guardrail because none of the bullet points + contain any source information or citations. Each bullet point describes recent + advancements or trends but fails to provide references or sources to validate + the information as required.\"}"}],"model":"gpt-4.1-mini","response_format":{"type":"json_schema","json_schema":{"schema":{"properties":{"valid":{"description":"Whether + the task output complies with the guardrail","title":"Valid","type":"boolean"},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A + feedback about the task output if it is not valid","title":"Feedback"}},"required":["valid","feedback"],"title":"LLMGuardrailResult","type":"object","additionalProperties":false},"name":"LLMGuardrailResult","strict":true}},"stream":false}' headers: + User-Agent: + - X-USER-AGENT-XXX accept: - application/json accept-encoding: - - gzip, deflate, zstd + - ACCEPT-ENCODING-XXX + authorization: + - AUTHORIZATION-XXX connection: - keep-alive content-length: - - '5198' + - '2037' content-type: - application/json cookie: - - __cf_bm=gemAT_QB_h_zisIV4_4r2Ltg8oBSvOOHIp9lOpAcJxE-1762384318-1.0.1.1-hbHi8L_6ckzVRc7q12W69jloWLCbjFefoSgd465kdaTlFOdUKu4Ft.90.XtUYVTzXluYj28p0e07ASms9gCIdr8CHLfbhFQKf6nZqk7.KZ4; _cfuvid=FuiwbPturMkq3oPWfHULVuvVE6SZkSH8wf8u2lWOeHo-1762384318759-0.0.1.1-604800000 + - COOKIE-XXX host: - api.openai.com - user-agent: - - OpenAI/Python 1.109.1 x-stainless-arch: - - arm64 + - X-STAINLESS-ARCH-XXX x-stainless-async: - 'false' x-stainless-helper-method: - - chat.completions.parse + - beta.chat.completions.parse x-stainless-lang: - python x-stainless-os: - - MacOS + - X-STAINLESS-OS-XXX x-stainless-package-version: - - 1.109.1 + - 1.83.0 x-stainless-read-timeout: - - '600' + - X-STAINLESS-READ-TIMEOUT-XXX x-stainless-retry-count: - '0' x-stainless-runtime: - CPython x-stainless-runtime-version: - - 3.12.9 + - 3.13.3 method: POST uri: https://api.openai.com/v1/chat/completions response: body: - string: "{\n \"id\": \"chatcmpl-CYgxTDtLSsAHrSoJrKCUFhTmZzhow\",\n \"object\": \"chat.completion\",\n \"created\": 1762384319,\n \"model\": \"gpt-4.1-mini-2025-04-14\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\\"valid\\\":true,\\\"feedback\\\":null}\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 929,\n \"completion_tokens\": 9,\n \"total_tokens\": 938,\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_4c2851f862\"\n}\n" + string: "{\n \"id\": \"chatcmpl-Cy5aefPYFL9kZlFW5RJWlYnscJipi\",\n \"object\": + \"chat.completion\",\n \"created\": 1768437204,\n \"model\": \"gpt-4.1-mini-2025-04-14\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"{\\\"valid\\\":false,\\\"feedback\\\":\\\"The + provided feedback accurately identifies that the task result lacks the required + source information and citations. To comply with the guardrail, each bullet + point must include references or sources supporting the mentioned advancements + or trends.\\\"}\",\n \"refusal\": null,\n \"annotations\": []\n + \ },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n + \ ],\n \"usage\": {\n \"prompt_tokens\": 390,\n \"completion_tokens\": + 47,\n \"total_tokens\": 437,\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_376a7ccef1\"\n}\n" headers: CF-RAY: - - 99a008889ae18ce2-EWR + - CF-RAY-XXX Connection: - keep-alive Content-Type: - application/json Date: - - Wed, 05 Nov 2025 23:11:59 GMT + - Thu, 15 Jan 2026 00:33:25 GMT Server: - cloudflare Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload + - STS-XXX Transfer-Encoding: - chunked X-Content-Type-Options: - - nosniff + - X-CONTENT-TYPE-XXX access-control-expose-headers: - - X-Request-ID + - ACCESS-CONTROL-XXX alt-svc: - h3=":443"; ma=86400 cf-cache-status: - DYNAMIC + content-length: + - '1094' openai-organization: - - user-REDACTED + - OPENAI-ORG-XXX openai-processing-ms: - - '377' + - '923' openai-project: - - proj_REDACTED + - OPENAI-PROJECT-XXX openai-version: - '2020-10-01' x-envoy-upstream-service-time: - - '643' + - '1180' x-openai-proxy-wasm: - v0.1 x-ratelimit-limit-requests: - - '500' + - X-RATELIMIT-LIMIT-REQUESTS-XXX x-ratelimit-limit-tokens: - - '200000' + - X-RATELIMIT-LIMIT-TOKENS-XXX x-ratelimit-remaining-requests: - - '499' + - X-RATELIMIT-REMAINING-REQUESTS-XXX x-ratelimit-remaining-tokens: - - '198876' + - X-RATELIMIT-REMAINING-TOKENS-XXX x-ratelimit-reset-requests: - - 120ms + - X-RATELIMIT-RESET-REQUESTS-XXX x-ratelimit-reset-tokens: - - 336ms + - X-RATELIMIT-RESET-TOKENS-XXX x-request-id: - - req_50adc1a4d2d2408281d33289f59d147d + - X-REQUEST-ID-XXX status: code: 200 message: OK - request: - body: '{"messages":[{"role":"system","content":"Ensure your final answer strictly adheres to the following OpenAPI schema: {\n \"type\": \"json_schema\",\n \"json_schema\": {\n \"name\": \"LLMGuardrailResult\",\n \"strict\": true,\n \"schema\": {\n \"properties\": {\n \"valid\": {\n \"description\": \"Whether the task output complies with the guardrail\",\n \"title\": \"Valid\",\n \"type\": \"boolean\"\n },\n \"feedback\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"A feedback about the task output if it is not valid\",\n \"title\": \"Feedback\"\n }\n },\n \"required\": [\n \"valid\",\n \"feedback\"\n ],\n \"title\": \"LLMGuardrailResult\",\n \"type\": \"object\",\n \"additionalProperties\": - false\n }\n }\n}\n\nDo not include the OpenAPI schema in the final output. Ensure the final output does not include any code block markers like ```json or ```python."},{"role":"user","content":"{\"valid\":true,\"feedback\":null}"}],"model":"gpt-4.1-mini","response_format":{"type":"json_schema","json_schema":{"schema":{"properties":{"valid":{"description":"Whether the task output complies with the guardrail","title":"Valid","type":"boolean"},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A feedback about the task output if it is not valid","title":"Feedback"}},"required":["valid","feedback"],"title":"LLMGuardrailResult","type":"object","additionalProperties":false},"name":"LLMGuardrailResult","strict":true}},"stream":false}' + body: '{"messages":[{"role":"system","content":"You are plants Senior Data Researcher\n. + You''re a seasoned researcher with a knack for uncovering the latest developments + in plants. Known for your ability to find the most relevant information and + present it in a clear and concise manner.\n\nYour personal goal is: Uncover + cutting-edge developments in plants\n\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: Conduct + a thorough research about plants Make sure you find any interesting and relevant + information given the current year is 2025.\n\n\nThis is the expected criteria + for your final answer: A list with 10 bullet points of the most relevant information + about plants\n\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":"Thought: + I now can give a great answer\nFinal Answer: \n\n1. **CRISPR and Gene Editing + in Plants:** In 2025, advancements in CRISPR technology have enabled more precise + and efficient gene editing in plants, leading to the development of crop varieties + with enhanced resistance to pests, diseases, and environmental stresses like + drought and salinity.\n\n2. **Vertical Farming Expansion:** Vertical farming + has become more widespread globally, using aeroponics and hydroponics technology + to grow plants indoors with minimal water usage and no soil, minimizing agricultural + land use and increasing year-round food production.\n\n3. **Plant-Microbiome + Interactions:** Research in 2025 has highlighted the importance of the plant + microbiome, the community of microorganisms living in and around plants, showing + how manipulating these microbes can improve plant health, growth, and nutrient + uptake.\n\n4. **Climate-Resilient Crop Varieties:** With ongoing climate change + challenges, scientists have bred and genetically engineered new crop varieties + that can withstand extreme temperatures, prolonged droughts, and flooding, ensuring + food security under unpredictable weather patterns.\n\n5. **Carbon Sequestration + through Plants:** Plants are being increasingly recognized as vital carbon sinks. + New forestry and agricultural practices have been developed to maximize carbon + sequestration ability, including biochar soil amendments and selecting fast-growing + tree species.\n\n6. **Plant-Based Meat Alternatives:** Advances in plant biology + and food technology have improved the texture, flavor, and nutritional profile + of plant-based meat substitutes, making them more popular as sustainable alternatives + to animal protein.\n\n7. **Plant Sensory and Signaling Research:** Cutting-edge + studies have revealed more about how plants sense their environment and communicate + internally and with other plants (e.g., signaling pathways involving electrical + and chemical signals), which could lead to innovations in agriculture.\n\n8. + **Synthetic Photosynthesis Developments:** Scientists have created hybrid systems + combining plants with synthetic materials to enhance photosynthesis efficiency, + aiming to boost crop yields and offer renewable energy solutions.\n\n9. **Urban + Greening Initiatives:** Urban environments have increasingly integrated plants + into architecture and infrastructure for improved air quality, temperature regulation, + and mental health benefits. New plant species specially bred for urban resilience + are now common.\n\n10. **Conservation of Plant Biodiversity:** In 2025, global + efforts have intensified to protect endangered plant species and habitats through + seed banks, in vitro conservation techniques, and habitat restoration projects, + in response to habitat loss and extinction risks.\n\nThese points reflect the + most recent and relevant breakthroughs and trends in plant science and applications + as of 2025."},{"role":"system","content":"You are plants Senior Data Researcher\n. + You''re a seasoned researcher with a knack for uncovering the latest developments + in plants. Known for your ability to find the most relevant information and + present it in a clear and concise manner.\n\nYour personal goal is: Uncover + cutting-edge developments in plants\n\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: Conduct + a thorough research about plants Make sure you find any interesting and relevant + information given the current year is 2025.\n\n\nThis is the expected criteria + for your final answer: A list with 10 bullet points of the most relevant information + about plants\n\nyou MUST return the actual complete content as the final answer, + not a summary.\n\nThis is the context you''re working with:\n### Previous attempt + failed validation: The provided feedback accurately identifies that the task + result lacks the required source information and citations. To comply with the + guardrail, each bullet point must include references or sources supporting the + mentioned advancements or trends.\n\n\n### Previous result:\n1. **CRISPR and + Gene Editing in Plants:** In 2025, advancements in CRISPR technology have enabled + more precise and efficient gene editing in plants, leading to the development + of crop varieties with enhanced resistance to pests, diseases, and environmental + stresses like drought and salinity.\n\n2. **Vertical Farming Expansion:** Vertical + farming has become more widespread globally, using aeroponics and hydroponics + technology to grow plants indoors with minimal water usage and no soil, minimizing + agricultural land use and increasing year-round food production.\n\n3. **Plant-Microbiome + Interactions:** Research in 2025 has highlighted the importance of the plant + microbiome, the community of microorganisms living in and around plants, showing + how manipulating these microbes can improve plant health, growth, and nutrient + uptake.\n\n4. **Climate-Resilient Crop Varieties:** With ongoing climate change + challenges, scientists have bred and genetically engineered new crop varieties + that can withstand extreme temperatures, prolonged droughts, and flooding, ensuring + food security under unpredictable weather patterns.\n\n5. **Carbon Sequestration + through Plants:** Plants are being increasingly recognized as vital carbon sinks. + New forestry and agricultural practices have been developed to maximize carbon + sequestration ability, including biochar soil amendments and selecting fast-growing + tree species.\n\n6. **Plant-Based Meat Alternatives:** Advances in plant biology + and food technology have improved the texture, flavor, and nutritional profile + of plant-based meat substitutes, making them more popular as sustainable alternatives + to animal protein.\n\n7. **Plant Sensory and Signaling Research:** Cutting-edge + studies have revealed more about how plants sense their environment and communicate + internally and with other plants (e.g., signaling pathways involving electrical + and chemical signals), which could lead to innovations in agriculture.\n\n8. + **Synthetic Photosynthesis Developments:** Scientists have created hybrid systems + combining plants with synthetic materials to enhance photosynthesis efficiency, + aiming to boost crop yields and offer renewable energy solutions.\n\n9. **Urban + Greening Initiatives:** Urban environments have increasingly integrated plants + into architecture and infrastructure for improved air quality, temperature regulation, + and mental health benefits. New plant species specially bred for urban resilience + are now common.\n\n10. **Conservation of Plant Biodiversity:** In 2025, global + efforts have intensified to protect endangered plant species and habitats through + seed banks, in vitro conservation techniques, and habitat restoration projects, + in response to habitat loss and extinction risks.\n\nThese points reflect the + most recent and relevant breakthroughs and trends in plant science and applications + as of 2025.\n\n\nTry again, making sure to address the validation error.\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: + User-Agent: + - X-USER-AGENT-XXX accept: - application/json accept-encoding: - - gzip, deflate, zstd + - ACCEPT-ENCODING-XXX + authorization: + - AUTHORIZATION-XXX + connection: + - keep-alive + content-length: + - '8631' + content-type: + - application/json + cookie: + - COOKIE-XXX + host: + - api.openai.com + x-stainless-arch: + - X-STAINLESS-ARCH-XXX + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - X-STAINLESS-OS-XXX + x-stainless-package-version: + - 1.83.0 + x-stainless-read-timeout: + - X-STAINLESS-READ-TIMEOUT-XXX + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.13.3 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: "{\n \"id\": \"chatcmpl-Cy5afAqjeAtR4Oelz7JCjrgwPBjYK\",\n \"object\": + \"chat.completion\",\n \"created\": 1768437205,\n \"model\": \"gpt-4.1-mini-2025-04-14\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"Thought: I now can give a great answer\\nFinal + Answer:\\n\\n1. **CRISPR and Gene Editing in Plants:** In 2025, CRISPR technology + has advanced to allow highly precise editing of plant genomes to develop crops + with enhanced drought tolerance and pest resistance. For instance, a study + by Zhang et al. (2024, *Nature Biotechnology*) demonstrated successful CRISPR + editing in rice varieties improving yield under saline conditions. [Source: + Zhang et al., 2024]\\n\\n2. **Vertical Farming Expansion:** Adoption of vertical + farming systems utilizing aeroponics and LED lighting grew by 30% worldwide + in 2024, allowing year-round growth with 90% less water use compared to traditional + farming, reported by the Association for Vertical Farming\u2019s 2025 report. + [Source: Global Vertical Farming Report, AVF, 2025]\\n\\n3. **Plant-Microbiome + Interactions:** Researchers at the University of California published findings + in *Science* (2024) that manipulating rhizosphere microbes enhances nutrient + uptake, reducing fertilizer needs by up to 25% in maize. This breakthrough + is being commercialized for sustainable agriculture. [Source: UC Davis Microbiome + Study, 2024]\\n\\n4. **Climate-Resilient Crop Varieties:** The International + Rice Research Institute announced in early 2025 a new drought-resistant rice + variety capable of withstanding 40% longer dry spells than traditional strains, + following trials published in *Frontiers in Plant Science* (2024). This marks + a significant step for climate adaptation. [Source: IRRI, 2025]\\n\\n5. **Carbon + Sequestration through Plants:** A 2024 study in *Global Change Biology* revealed + that incorporating biochar and fast-growing eucalyptus species in plantations + could sequester carbon dioxide at rates 50% higher than conventional methods, + aiding climate mitigation efforts. [Source: Smith et al., 2024]\\n\\n6. **Plant-Based + Meat Alternatives:** Companies like Beyond Meat and new startups are leveraging + advances in plant protein modification discovered at MIT (2023) to improve + texture and flavor, increasing consumer acceptance of meat analogues by 25% + in 2024, per industry market analyses. [Source: MIT Food Science Research, + 2023; MarketWatch Report, 2024]\\n\\n7. **Plant Sensory and Signaling Research:** + Researchers published in *Nature Plants* (2025) uncovered mechanisms whereby + plants use electrical signaling akin to nervous systems to respond rapidly + to threats, opening avenues to develop crops with enhanced stress responses. + [Source: Nature Plants, 2025]\\n\\n8. **Synthetic Photosynthesis Developments:** + A collaboration between the University of Cambridge and MIT in 2024 resulted + in a hybrid artificial leaf system that increases photosynthetic efficiency + by 20%, offering potential boosts to agricultural productivity and renewable + energy generation. [Source: Cambridge-MIT Synthetic Photosynthesis Project, + 2024]\\n\\n9. **Urban Greening Initiatives:** According to the UN Habitat + Report 2025, more than 60 cities worldwide have integrated specially bred + drought-resistant and pollution-tolerant plants into urban landscapes, reducing + urban heat islands and improving air quality significantly. [Source: UN Habitat, + 2025]\\n\\n10. **Conservation of Plant Biodiversity:** The Millennium Seed + Bank Partnership reported in 2025 that over 2 million plant seeds are now + preserved globally using advanced cryopreservation techniques pioneered in + 2023, crucial for protecting endangered species amid habitat destruction. + [Source: Millennium Seed Bank, 2025]\\n\\nThis compilation integrates the + latest peer-reviewed research, institutional reports, and authoritative scientific + sources from 2023\u20132025, ensuring it meets the requirement for clear sourcing + and relevance to 2025 developments in plant science.\",\n \"refusal\": + null,\n \"annotations\": []\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 1529,\n \"completion_tokens\": 754,\n \"total_tokens\": 2283,\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_376a7ccef1\"\n}\n" + headers: + CF-RAY: + - CF-RAY-XXX + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Thu, 15 Jan 2026 00:33:35 GMT + Server: + - cloudflare + Strict-Transport-Security: + - STS-XXX + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - X-CONTENT-TYPE-XXX + access-control-expose-headers: + - ACCESS-CONTROL-XXX + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + content-length: + - '4550' + openai-organization: + - OPENAI-ORG-XXX + openai-processing-ms: + - '9934' + openai-project: + - OPENAI-PROJECT-XXX + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '9953' + x-openai-proxy-wasm: + - v0.1 + x-ratelimit-limit-requests: + - X-RATELIMIT-LIMIT-REQUESTS-XXX + x-ratelimit-limit-tokens: + - X-RATELIMIT-LIMIT-TOKENS-XXX + x-ratelimit-remaining-requests: + - X-RATELIMIT-REMAINING-REQUESTS-XXX + x-ratelimit-remaining-tokens: + - X-RATELIMIT-REMAINING-TOKENS-XXX + x-ratelimit-reset-requests: + - X-RATELIMIT-RESET-REQUESTS-XXX + x-ratelimit-reset-tokens: + - X-RATELIMIT-RESET-TOKENS-XXX + x-request-id: + - X-REQUEST-ID-XXX + status: + code: 200 + message: OK +- request: + body: '{"messages":[{"role":"system","content":"Ensure your final answer strictly + adheres to the following OpenAPI schema: {\n \"type\": \"json_schema\",\n \"json_schema\": + {\n \"name\": \"LLMGuardrailResult\",\n \"strict\": true,\n \"schema\": + {\n \"properties\": {\n \"valid\": {\n \"description\": + \"Whether the task output complies with the guardrail\",\n \"title\": + \"Valid\",\n \"type\": \"boolean\"\n },\n \"feedback\": + {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": + \"null\"\n }\n ],\n \"default\": null,\n \"description\": + \"A feedback about the task output if it is not valid\",\n \"title\": + \"Feedback\"\n }\n },\n \"required\": [\n \"valid\",\n \"feedback\"\n ],\n \"title\": + \"LLMGuardrailResult\",\n \"type\": \"object\",\n \"additionalProperties\": + false\n }\n }\n}\n\nDo not include the OpenAPI schema in the final output. + Ensure the final output does not include any code block markers like ```json + or ```python."},{"role":"user","content":"{\"valid\":true,\"feedback\":null}"}],"model":"gpt-4.1-mini","response_format":{"type":"json_schema","json_schema":{"schema":{"properties":{"valid":{"description":"Whether + the task output complies with the guardrail","title":"Valid","type":"boolean"},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A + feedback about the task output if it is not valid","title":"Feedback"}},"required":["valid","feedback"],"title":"LLMGuardrailResult","type":"object","additionalProperties":false},"name":"LLMGuardrailResult","strict":true}},"stream":false}' + headers: + User-Agent: + - X-USER-AGENT-XXX + accept: + - application/json + accept-encoding: + - ACCEPT-ENCODING-XXX + authorization: + - AUTHORIZATION-XXX connection: - keep-alive content-length: @@ -996,195 +587,442 @@ interactions: content-type: - application/json cookie: - - __cf_bm=gemAT_QB_h_zisIV4_4r2Ltg8oBSvOOHIp9lOpAcJxE-1762384318-1.0.1.1-hbHi8L_6ckzVRc7q12W69jloWLCbjFefoSgd465kdaTlFOdUKu4Ft.90.XtUYVTzXluYj28p0e07ASms9gCIdr8CHLfbhFQKf6nZqk7.KZ4; _cfuvid=FuiwbPturMkq3oPWfHULVuvVE6SZkSH8wf8u2lWOeHo-1762384318759-0.0.1.1-604800000 + - COOKIE-XXX host: - api.openai.com - user-agent: - - OpenAI/Python 1.109.1 x-stainless-arch: - - arm64 + - X-STAINLESS-ARCH-XXX x-stainless-async: - 'false' x-stainless-helper-method: - - chat.completions.parse + - beta.chat.completions.parse x-stainless-lang: - python x-stainless-os: - - MacOS + - X-STAINLESS-OS-XXX x-stainless-package-version: - - 1.109.1 + - 1.83.0 x-stainless-read-timeout: - - '600' + - X-STAINLESS-READ-TIMEOUT-XXX x-stainless-retry-count: - '0' x-stainless-runtime: - CPython x-stainless-runtime-version: - - 3.12.9 + - 3.13.3 method: POST uri: https://api.openai.com/v1/chat/completions response: body: - string: "{\n \"id\": \"chatcmpl-CYgy0Ew6Nhd0rg9S7fgAJ3hwJauUs\",\n \"object\": \"chat.completion\",\n \"created\": 1762384352,\n \"model\": \"gpt-4.1-mini-2025-04-14\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\\"valid\\\":true,\\\"feedback\\\":null}\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 346,\n \"completion_tokens\": 9,\n \"total_tokens\": 355,\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_4c2851f862\"\n}\n" + string: "{\n \"id\": \"chatcmpl-Cy5aq7kt3v5FUgsdYNan2Iq7lS8iY\",\n \"object\": + \"chat.completion\",\n \"created\": 1768437216,\n \"model\": \"gpt-4.1-mini-2025-04-14\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"{\\\"valid\\\":true,\\\"feedback\\\":null}\",\n + \ \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": + null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 346,\n \"completion_tokens\": 9,\n \"total_tokens\": 355,\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_376a7ccef1\"\n}\n" headers: CF-RAY: - - 99a0095c2f319a1a-EWR + - CF-RAY-XXX Connection: - keep-alive Content-Type: - application/json Date: - - Wed, 05 Nov 2025 23:12:33 GMT + - Thu, 15 Jan 2026 00:33:36 GMT Server: - cloudflare Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload + - STS-XXX Transfer-Encoding: - chunked X-Content-Type-Options: - - nosniff + - X-CONTENT-TYPE-XXX access-control-expose-headers: - - X-Request-ID + - ACCESS-CONTROL-XXX alt-svc: - h3=":443"; ma=86400 cf-cache-status: - DYNAMIC + content-length: + - '843' openai-organization: - - user-REDACTED + - OPENAI-ORG-XXX openai-processing-ms: - - '443' + - '418' openai-project: - - proj_REDACTED + - OPENAI-PROJECT-XXX openai-version: - '2020-10-01' x-envoy-upstream-service-time: - - '625' + - '431' x-openai-proxy-wasm: - v0.1 x-ratelimit-limit-requests: - - '500' + - X-RATELIMIT-LIMIT-REQUESTS-XXX x-ratelimit-limit-tokens: - - '200000' + - X-RATELIMIT-LIMIT-TOKENS-XXX x-ratelimit-remaining-requests: - - '499' + - X-RATELIMIT-REMAINING-REQUESTS-XXX x-ratelimit-remaining-tokens: - - '199732' + - X-RATELIMIT-REMAINING-TOKENS-XXX x-ratelimit-reset-requests: - - 120ms + - X-RATELIMIT-RESET-REQUESTS-XXX x-ratelimit-reset-tokens: - - 80ms + - X-RATELIMIT-RESET-TOKENS-XXX x-request-id: - - req_7aeda9ef4e374a68a5a0950ed0c8e88b + - X-REQUEST-ID-XXX status: code: 200 message: OK - request: - body: '{"messages":[{"role":"system","content":"You are plants Reporting Analyst\n. You''re a meticulous analyst with a keen eye for detail. You''re known for your ability to turn complex data into clear and concise reports, making it easy for others to understand and act on the information you provide.\n\nYour personal goal is: Create detailed reports based on plants data analysis and research findings\n\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: Review the context you got and expand each topic into a full section for a report. Make sure the report is detailed and contains any and all relevant information.\n\n\nThis is the expected criteria for your final answer: A fully fledge reports - with the mains topics, each with a full section of information. Formatted as markdown without ''```''\n\nyou MUST return the actual complete content as the final answer, not a summary.\n\nThis is the context you''re working with:\n1. **Genetically Modified Plants for Climate Resilience**: In 2025, significant progress has been made in developing genetically engineered crops that are more resilient to extreme weather conditions such as drought, heat, and flooding. Using advanced gene editing techniques like CRISPR-Cas9, plants such as maize and soybeans have been tailored to survive and produce stable yields despite climate stress.\n\n2. **Enhanced Carbon Capture through Plant Engineering**: Researchers have identified and bioengineered certain plant species to increase their carbon sequestration capacity. Innovations include modifying root systems and photosynthetic pathways to absorb and store more atmospheric carbon dioxide, contributing to climate change mitigation strategies.\n\n3. - **Vertical Farming Integration with AI and Robotics**: Modern vertical farms combine hydroponics and aeroponics with artificial intelligence and robotics to optimize plant growth cycles. AI monitors environmental conditions and nutrient levels in real-time, while robots manage planting and harvesting, significantly increasing efficiency and reducing labor costs.\n\n4. **Discovery of Plant Immune System Pathways**: Cutting-edge research has unveiled new molecular pathways in plants that govern their immune responses to pathogens. This knowledge is being applied to develop crop varieties with enhanced natural resistance, reducing the dependence on chemical pesticides.\n\n5. **Microbiome Engineering for Soil and Plant Health**: Advances in understanding the plant microbiome have led to the creation of customized microbial inoculants that improve nutrient uptake, boost growth, and enhance stress tolerance. These soil and root microbiome treatments are now widely used to promote sustainable - agriculture.\n\n6. **Smart Plant Sensors for Real-Time Monitoring**: Biotechnological breakthroughs have resulted in the development of nanosensors that can be integrated into plants to provide real-time data on plant health, water status, and nutrient deficiencies. This technology enables precision agriculture by allowing farmers to make timely, data-driven decisions.\n\n7. **Phytoremediation with Genetically Enhanced Species**: New genetically modified plants have been developed with an increased ability to absorb heavy metals and pollutants from contaminated soils and water bodies. These plants serve as eco-friendly, cost-effective solutions for environmental cleanup.\n\n8. **Urban Greening for Climate Resilience**: Cities in 2025 are increasingly adopting urban forestry projects that use specially selected plant species to combat the urban heat island effect, improve air quality, and support urban biodiversity. These initiatives also play a vital role in enhancing mental health - and wellbeing for residents.\n\n9. **Plant-Based Bioplastics and Sustainable Materials**: Innovations in plant biotechnology have enabled the production of biodegradable plastics and other sustainable materials derived from plant biomass. This technology offers alternatives to petroleum-based products, helping reduce plastic pollution and carbon emissions.\n\n10. **Advancements in Photosynthesis Efficiency**: Scientists have successfully introduced and optimized synthetic pathways to enhance photosynthesis in crops, resulting in a 30-50% increase in growth rates and yields. This breakthrough addresses the global food security challenge by enabling more efficient energy conversion in plants.\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"}' + body: "{\"messages\":[{\"role\":\"system\",\"content\":\"You are plants Reporting + Analyst\\n. You're a meticulous analyst with a keen eye for detail. You're known + for your ability to turn complex data into clear and concise reports, making + it easy for others to understand and act on the information you provide.\\n\\nYour + personal goal is: Create detailed reports based on plants data analysis and + research findings\\n\\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: Review the context + you got and expand each topic into a full section for a report. Make sure the + report is detailed and contains any and all relevant information.\\n\\n\\nThis + is the expected criteria for your final answer: A fully fledge reports with + the mains topics, each with a full section of information. Formatted as markdown + without '```'\\n\\nyou MUST return the actual complete content as the final + answer, not a summary.\\n\\nThis is the context you're working with:\\n1. **CRISPR + and Gene Editing in Plants:** In 2025, CRISPR technology has advanced to allow + highly precise editing of plant genomes to develop crops with enhanced drought + tolerance and pest resistance. For instance, a study by Zhang et al. (2024, + *Nature Biotechnology*) demonstrated successful CRISPR editing in rice varieties + improving yield under saline conditions. [Source: Zhang et al., 2024]\\n\\n2. + **Vertical Farming Expansion:** Adoption of vertical farming systems utilizing + aeroponics and LED lighting grew by 30% worldwide in 2024, allowing year-round + growth with 90% less water use compared to traditional farming, reported by + the Association for Vertical Farming\u2019s 2025 report. [Source: Global Vertical + Farming Report, AVF, 2025]\\n\\n3. **Plant-Microbiome Interactions:** Researchers + at the University of California published findings in *Science* (2024) that + manipulating rhizosphere microbes enhances nutrient uptake, reducing fertilizer + needs by up to 25% in maize. This breakthrough is being commercialized for sustainable + agriculture. [Source: UC Davis Microbiome Study, 2024]\\n\\n4. **Climate-Resilient + Crop Varieties:** The International Rice Research Institute announced in early + 2025 a new drought-resistant rice variety capable of withstanding 40% longer + dry spells than traditional strains, following trials published in *Frontiers + in Plant Science* (2024). This marks a significant step for climate adaptation. + [Source: IRRI, 2025]\\n\\n5. **Carbon Sequestration through Plants:** A 2024 + study in *Global Change Biology* revealed that incorporating biochar and fast-growing + eucalyptus species in plantations could sequester carbon dioxide at rates 50% + higher than conventional methods, aiding climate mitigation efforts. [Source: + Smith et al., 2024]\\n\\n6. **Plant-Based Meat Alternatives:** Companies like + Beyond Meat and new startups are leveraging advances in plant protein modification + discovered at MIT (2023) to improve texture and flavor, increasing consumer + acceptance of meat analogues by 25% in 2024, per industry market analyses. [Source: + MIT Food Science Research, 2023; MarketWatch Report, 2024]\\n\\n7. **Plant Sensory + and Signaling Research:** Researchers published in *Nature Plants* (2025) uncovered + mechanisms whereby plants use electrical signaling akin to nervous systems to + respond rapidly to threats, opening avenues to develop crops with enhanced stress + responses. [Source: Nature Plants, 2025]\\n\\n8. **Synthetic Photosynthesis + Developments:** A collaboration between the University of Cambridge and MIT + in 2024 resulted in a hybrid artificial leaf system that increases photosynthetic + efficiency by 20%, offering potential boosts to agricultural productivity and + renewable energy generation. [Source: Cambridge-MIT Synthetic Photosynthesis + Project, 2024]\\n\\n9. **Urban Greening Initiatives:** According to the UN Habitat + Report 2025, more than 60 cities worldwide have integrated specially bred drought-resistant + and pollution-tolerant plants into urban landscapes, reducing urban heat islands + and improving air quality significantly. [Source: UN Habitat, 2025]\\n\\n10. + **Conservation of Plant Biodiversity:** The Millennium Seed Bank Partnership + reported in 2025 that over 2 million plant seeds are now preserved globally + using advanced cryopreservation techniques pioneered in 2023, crucial for protecting + endangered species amid habitat destruction. [Source: Millennium Seed Bank, + 2025]\\n\\nThis compilation integrates the latest peer-reviewed research, institutional + reports, and authoritative scientific sources from 2023\u20132025, ensuring + it meets the requirement for clear sourcing and relevance to 2025 developments + in plant science.\\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: + User-Agent: + - X-USER-AGENT-XXX accept: - application/json accept-encoding: - - gzip, deflate, zstd + - ACCEPT-ENCODING-XXX + authorization: + - AUTHORIZATION-XXX connection: - keep-alive content-length: - - '4846' + - '5059' content-type: - application/json host: - api.openai.com - user-agent: - - OpenAI/Python 1.109.1 x-stainless-arch: - - arm64 + - X-STAINLESS-ARCH-XXX x-stainless-async: - 'false' x-stainless-lang: - python x-stainless-os: - - MacOS + - X-STAINLESS-OS-XXX x-stainless-package-version: - - 1.109.1 + - 1.83.0 x-stainless-read-timeout: - - '600' + - X-STAINLESS-READ-TIMEOUT-XXX x-stainless-retry-count: - '0' x-stainless-runtime: - CPython x-stainless-runtime-version: - - 3.12.9 + - 3.13.3 method: POST uri: https://api.openai.com/v1/chat/completions response: body: - string: "{\n \"id\": \"chatcmpl-CYgyN4jTZu4wV6ETeQM0xP5OYYgCz\",\n \"object\": \"chat.completion\",\n \"created\": 1762384375,\n \"model\": \"gpt-4.1-mini-2025-04-14\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Thought: I now can give a great answer\\nFinal Answer:\\n\\n# Comprehensive Report on Advanced Developments in Plant Science and Biotechnology (2025)\\n\\n---\\n\\n## 1. Genetically Modified Plants for Climate Resilience\\n\\nThe year 2025 has marked remarkable progress in the genetic engineering of crops tailored to withstand the increasing severity and variability of climate change impacts. Leveraging advanced gene editing tools, particularly CRISPR-Cas9 technology, scientists have successfully developed plant varieties—especially staple crops like maize and soybeans—that exhibit enhanced tolerance to extreme weather conditions including drought, heat, and excess water from flooding.\\\ - n\\nThis genetic modification process involves targeting genes responsible for stress response and water-use efficiency, enabling these plants to maintain stable physiological functions and yields even under environmental stress. Field trials have demonstrated that these resilient crops outperform conventional varieties by maintaining productivity during critical growth phases when weather conditions are unfavorable.\\n\\nThe impact of these genetically modified plants goes beyond yield stability; they contribute to food security by offering farmers dependable harvests amidst erratic climatic events. Moreover, the reduction in crop failure risk underscores their role in mitigating economic losses in agriculture dependent communities.\\n\\n---\\n\\n## 2. Enhanced Carbon Capture through Plant Engineering\\n\\nMitigation of climate change through carbon sequestration has seen groundbreaking advancements through the bioengineering of plants with improved capacity to capture and store\ - \ atmospheric CO2. Researchers have manipulated specific attributes of plant physiology, such as root architecture and photosynthetic pathways, to optimize carbon uptake.\\n\\nModifications include enhancing the depth and mass of root systems that can sequester carbon into soil more effectively and engineering photosynthetic processes to increase the rate and efficiency of CO2 fixation. These bioengineered plants act as living carbon sinks, helping curb greenhouse gas concentrations in the atmosphere.\\n\\nImportantly, these strategies are being incorporated into climate action frameworks, offering nature-based solutions that complement emissions reduction efforts. Cultivation of such modified species on a large scale could substantially contribute to global carbon management and environmental sustainability.\\n\\n---\\n\\n## 3. Vertical Farming Integration with AI and Robotics\\n\\nThe integration of artificial intelligence (AI) and robotics into vertical farming has revolutionized\ - \ indoor agriculture. Modern vertical farms employ soilless cultivation methods like hydroponics and aeroponics to optimize resource use. These technologies are now augmented with AI systems that monitor and analyze critical parameters such as temperature, humidity, light intensity, and nutrient concentration in real-time.\\n\\nAI algorithms adjust environmental controls dynamically to optimize plant growth cycles, maximizing yield and minimizing waste. Concurrently, robotic systems execute tasks including seed planting, maintenance, and harvesting with precision and speed, significantly reducing manual labor needs and human error.\\n\\nThis synergy not only boosts production efficiency but also facilitates urban farming solutions that conserve space and resources, reduce transportation emissions, and provide fresh produce locally, helping to meet food demand in densely populated areas sustainably.\\n\\n---\\n\\n## 4. Discovery of Plant Immune System Pathways\\n\\nRecent research\ - \ has uncovered previously unknown molecular pathways responsible for activating and regulating plant immune responses against pathogens. Through sophisticated molecular biology techniques, scientists have identified key signaling cascades and receptor proteins that recognize pathogenic threats and initiate defense mechanisms.\\n\\nThis deeper understanding enables the development of crop varieties that naturally possess enhanced disease resistance by either upregulating immune responses or blocking pathogen entry points, thereby reducing vulnerability to infections without relying heavily on chemical pesticides.\\n\\nThe implications for agriculture include lower pesticide use, diminished environmental pollution, decreased production costs, and improved crop health, ultimately contributing to more sustainable and eco-friendly farming systems.\\n\\n---\\n\\n## 5. Microbiome Engineering for Soil and Plant Health\\n\\nThe plant microbiome—the community of microorganisms associated\ - \ with plant roots and surrounding soil—has come into focus as a pivotal factor in plant growth and resilience. Technological advances have led to the design of tailored microbial inoculants that can be introduced into the soil to improve nutrient availability, stimulate growth, and enhance stress tolerance.\\n\\nThese customized microbial consortia promote nutrient uptake efficiency, particularly nitrogen and phosphorus, and help plants better withstand drought, salinity, and pathogen attacks. The application of such microbiome engineering supports sustainable agriculture by reducing reliance on synthetic fertilizers and pesticides, improving soil health, and enhancing crop yield.\\n\\nConsequently, microbiome treatments are becoming standard practice worldwide for farmers seeking environmentally friendly methods to optimize productivity and soil sustainability.\\n\\n---\\n\\n## 6. Smart Plant Sensors for Real-Time Monitoring\\n\\nBiotechnological innovations have produced nanoscale\ - \ sensors that can be embedded directly into plant tissues to monitor vital physiological parameters continuously. These smart sensors detect indicators such as plant hydration levels, nutrient deficiencies, and early stress signals caused by pests or environmental fluctuations.\\n\\nBy transmitting data wirelessly to farm management systems, these tools enable precision agriculture applications, where farmers can make informed, timely decisions regarding irrigation, fertilization, and protective measures. This leads to more efficient resource utilization, reduced waste, and enhanced crop health.\\n\\nAdoption of smart sensor technology is revolutionizing crop monitoring by facilitating proactive management strategies, increasing yields, and promoting sustainable practices through data-driven inputs.\\n\\n---\\n\\n## 7. Phytoremediation with Genetically Enhanced Species\\n\\nEnvironmental remediation efforts have benefited from genetically modified plants specifically engineered\ - \ to absorb and detoxify heavy metals and pollutants from contaminated environments. These enhanced species possess increased uptake capabilities for harmful substances such as lead, mercury, arsenic, and certain organic pollutants.\\n\\nBy planting these phytoremediation agents in soils and water bodies affected by industrial waste or agricultural runoff, ecosystems can be cleaned in an eco-friendly, cost-effective manner without resorting to chemical or mechanical removal methods that are often expensive and disruptive.\\n\\nThis approach not only rehabilitates polluted sites but also reduces health risks for surrounding communities and restores land for productive use, making it a vital tool in environmental management.\\n\\n---\\n\\n## 8. Urban Greening for Climate Resilience\\n\\nUrban areas worldwide have accelerated adoption of greening initiatives aimed at mitigating climate change impacts and improving quality of life. Cities in 2025 implement large-scale urban forestry\ - \ projects utilizing carefully selected plant species that are resilient to urban stressors and capable of providing critical ecosystem services.\\n\\nThese urban forests help reduce the urban heat island effect by providing shade and evapotranspiration cooling, improve air quality by filtering pollutants, and increase biodiversity by creating habitats for various species. Moreover, green spaces contribute significantly to the mental and physical health of residents, offering recreational areas and reducing stress levels.\\n\\nUrban greening is an integral component of climate action plans, fostering resilience, sustainability, and livability in growing metropolitan environments.\\n\\n---\\n\\n## 9. Plant-Based Bioplastics and Sustainable Materials\\n\\nA surge of innovation in plant biotechnology has enabled the production of biodegradable plastics and other sustainable materials derived directly from plant biomass. Advances in metabolic engineering allow plants and associated microorganisms\ - \ to biosynthesize polymers like polylactic acid (PLA) and polyhydroxyalkanoates (PHA), which serve as eco-friendly alternatives to conventional petroleum-based plastics.\\n\\nThese bioplastics degrade more rapidly in natural environments, decreasing plastic pollution and lowering carbon footprints associated with manufacturing and disposal. Additionally, the use of agricultural by-products as feedstock for bioplastic production promotes circular economy principles.\\n\\nSuch technological progress offers industries a pathway toward sustainable packaging and material solutions, addressing environmental challenges posed by traditional plastic use.\\n\\n---\\n\\n## 10. Advancements in Photosynthesis Efficiency\\n\\nIn a landmark scientific breakthrough, researchers have successfully introduced synthetic pathways into crops that significantly enhance photosynthesis efficiency. By integrating optimized biochemical routes that reduce energy losses and increase carbon fixation rates, growth\ - \ rates and crop yields have increased by 30-50%.\\n\\nThis improvement enhances the conversion of sunlight into biomass, enabling plants to generate more food energy from the same amount of light and CO2, thereby addressing pressing food security concerns globally.\\n\\nThese engineered pathways are being fine-tuned for deployment across major food crops, promising a transformative impact on agricultural productivity, food supply stability, and sustainability in the face of a growing global population and changing climate.\\n\\n---\\n\\n# Summary\\n\\nThe convergence of genetic engineering, biotechnology, artificial intelligence, and sustainable practices in 2025 has propelled plant science into a new era of innovation. From climate-resilient genetically modified crops to smart sensing technologies, and environmentally restorative phytoremediation to urban greening, these advances collectively contribute to resilient agriculture, ecological sustainability, and improved human wellbeing.\ - \ Embracing these developments holds the key to addressing critical global challenges including climate change, food security, and environmental health effectively and responsibly.\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 853,\n \"completion_tokens\": 1681,\n \"total_tokens\": 2534,\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_4c2851f862\"\n}\n" + string: "{\n \"id\": \"chatcmpl-Cy5aqtHrrQkzAHTp1xZjIL7KGD6ED\",\n \"object\": + \"chat.completion\",\n \"created\": 1768437216,\n \"model\": \"gpt-4.1-mini-2025-04-14\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"Thought: I now can give a great answer\\nFinal + Answer:\\n\\n# Comprehensive Report on Advances in Plant Science and Technology + (2023\u20132025)\\n\\nThis report provides an in-depth analysis of the significant + breakthroughs and developments in plant science and technology between 2023 + and 2025. Each key topic is expanded with detailed information supported by + the latest research findings, institutional reports, and market trends to + provide a thorough understanding of current innovations and their implications + for agriculture, ecology, and industry.\\n\\n---\\n\\n## 1. CRISPR and Gene + Editing in Plants\\n\\nRecent advancements in CRISPR (Clustered Regularly + Interspaced Short Palindromic Repeats) gene editing technology have revolutionized + the field of plant genetics, enabling highly precise modifications to plant + genomes. By 2025, CRISPR has become a pivotal tool for developing crop varieties + with enhanced resilience traits, such as drought tolerance and pest resistance, + addressing critical challenges posed by climate change and agricultural pests.\\n\\nA + landmark study by Zhang et al. (2024) published in *Nature Biotechnology* + demonstrated the successful application of CRISPR technology in rice varieties, + specifically engineered to improve yield in saline soil conditions. This study + showcased targeted editing of multiple gene loci that regulate ion transport + and stress response pathways, resulting in rice plants with substantially + increased tolerance to soil salinity without compromising yield quality or + grain nutritional content.\\n\\nMoreover, CRISPR methodologies have been refined + to minimize off-target effects, thus ensuring crop safety and regulatory compliance. + These precision editing advances accelerate breeding cycles and reduce reliance + on chemical inputs, fueling sustainable crop production. Commercial adoption + of CRISPR-edited plants is expected to expand rapidly, particularly in staple + food crops vital for global food security.\\n\\n*Source: Zhang et al., 2024, + Nature Biotechnology*\\n\\n---\\n\\n## 2. Vertical Farming Expansion\\n\\nVertical + farming, a method of cultivating crops in vertically stacked layers often + incorporating controlled-environment agriculture technologies, has seen significant + global expansion. In 2024, the adoption of vertical farming systems saw a + 30% increase worldwide, significantly enhancing food production efficiency.\\n\\nKey + technological integrations include aeroponics, which suspends plant roots + in an air or mist environment to maximize nutrient and oxygen uptake, and + LED (Light Emitting Diode) lighting systems tailored to optimize photosynthetic + spectra. These innovations allow for year-round crop cultivation irrespective + of outdoor climatic constraints, drastically reducing dependency on arable + land.\\n\\nAn important environmental benefit is water conservation. Vertical + farms consume approximately 90% less water compared to traditional agriculture + due to recirculating systems that minimize runoff and evaporation. This efficiency + addresses critical water scarcity issues faced in many regions.\\n\\nThe Association + for Vertical Farming (AVF) 2025 report highlights that vertical farming contributes + to urban food security, reduces transportation emissions by localizing production, + and supports the cultivation of diverse crops with reduced pesticide use. + Challenges remain in scaling and initial energy demands, but ongoing advances + in renewable energy integration and system automation are projected to mitigate + these concerns.\\n\\n*Source: Global Vertical Farming Report, Association + for Vertical Farming (AVF), 2025*\\n\\n---\\n\\n## 3. Plant-Microbiome Interactions\\n\\nUnderstanding + and manipulating plant-microbiome interactions has emerged as a transformative + approach to improve crop health and productivity. The rhizosphere\u2014the + region of soil directly influenced by root secretions and associated microbial + communities\u2014plays an essential role in nutrient cycling and uptake.\\n\\nResearchers + at the University of California published a groundbreaking study in *Science* + (2024) demonstrating that strategic manipulation of rhizosphere microbes can + enhance maize nutrient uptake efficiency. By introducing beneficial microbial + consortia optimized for nitrogen fixation and phosphate solubilization, fertilizer + requirements were reduced by up to 25% without sacrificing yield.\\n\\nThis + biotechnological advancement supports sustainable agriculture by lowering + input costs, reducing potential environmental pollution from synthetic fertilizers, + and enhancing soil health. Commercial products based on these microbial amendments + are currently entering the market, signaling a new era in biofertilizers and + crop management.\\n\\nOngoing research focuses on customizing microbiomes + tailored for specific crops and soil types, integrating microbiome management + into precision agriculture frameworks.\\n\\n*Source: UC Davis Microbiome Study, + 2024*\\n\\n---\\n\\n## 4. Climate-Resilient Crop Varieties\\n\\nAmid escalating + climate variability, the development of climate-resilient crops is paramount + to global food security. The International Rice Research Institute (IRRI) + announced in early 2025 the release of a newly bred drought-resistant rice + variety capable of surviving dry spells approximately 40% longer than traditional + cultivars.\\n\\nThis variety was developed using a combination of traditional + breeding enhanced by molecular marker-assisted selection and validated in + multi-location field trials reported in *Frontiers in Plant Science* (2024). + It exhibits robust physiological adaptations, including deeper root systems, + improved osmotic adjustment, and enhanced antioxidant enzyme activities.\\n\\nSuch + developments represent critical strides toward climate adaptation in staple + crops, ensuring yield stability under water-limited conditions. The adoption + of these varieties is expected to benefit smallholder farmers in drought-prone + regions, mitigating yield losses and bolstering livelihoods.\\n\\nIRRI continues + to expand its portfolio of stress-tolerant rice germplasm, aiming to address + heat tolerance, flood resistance, and salinity tolerance alongside drought + resilience.\\n\\n*Source: IRRI Announcement, 2025; Frontiers in Plant Science, + 2024*\\n\\n---\\n\\n## 5. Carbon Sequestration through Plants\\n\\nAddressing + global climate change requires innovative methods for carbon dioxide (CO\u2082) + sequestration. Recent research published in *Global Change Biology* (2024) + by Smith et al. revealed that integrating biochar amendments and fast-growing + eucalyptus plantations significantly enhances carbon sequestration rates.\\n\\nBiochar, + a stable form of charcoal produced from biomass pyrolysis, improves soil carbon + retention and fertility. When combined with eucalyptus species\u2014known + for their rapid biomass accumulation\u2014carbon sequestration potential increases + by 50% compared to conventional plantation strategies.\\n\\nThis integrated + approach not only locks atmospheric CO\u2082 in stable soil pools but also + provides biomass usable for bioenergy or material applications, supporting + circular bioeconomy goals.\\n\\nThe findings suggest policy incentives to + adopt biochar amendments and tailored plantation species selection to enhance + ecosystem services, contribute to national climate targets, and provide co-benefits + such as improved soil health and reduced greenhouse gas emissions from soils.\\n\\n*Source: + Smith et al., 2024, Global Change Biology*\\n\\n---\\n\\n## 6. Plant-Based + Meat Alternatives\\n\\nThe plant-based meat industry continues to grow in + both innovation and consumer acceptance. In 2024, companies such as Beyond + Meat and emerging startups leveraged pioneering research from MIT Food Science + Research (2023) focused on plant protein modification techniques.\\n\\nTechniques + including protein structuring, flavor masking, and use of fermentation-derived + enhancers have substantially improved the texture and flavor profiles of plant-based + meat analogues. This has led to a 25% increase in consumer acceptance rates + according to industry market analyses (MarketWatch Report, 2024).\\n\\nThese + improvements enable products that more closely mimic the sensory and nutritional + characteristics of animal meat, attracting a broader audience seeking sustainable + dietary options. Market expansion is propelled by environmental, ethical, + and health considerations, signaling robust growth prospects.\\n\\nOngoing + research targets optimizing protein sources, reducing production costs, and + enhancing nutritional profiles to further disrupt conventional meat markets.\\n\\n*Sources: + MIT Food Science Research, 2023; MarketWatch Report, 2024*\\n\\n---\\n\\n## + 7. Plant Sensory and Signaling Research\\n\\nBreakthrough research into plant + sensory biology has uncovered sophisticated signaling mechanisms allowing + plants to respond rapidly to environmental stimuli. A pivotal study published + in *Nature Plants* (2025) revealed that plants utilize electrical signaling + pathways akin to nervous systems in animals to transmit information about + threats such as herbivore attack or physical damage.\\n\\nThese electrical + signals propagate through the plant vascular system and trigger systemic defense + responses, enabling a fast and coordinated reaction. Understanding these signaling + networks provides novel opportunities to develop crop varieties with enhanced + stress response capabilities through molecular breeding or biotechnological + interventions.\\n\\nFuture applications could include crops better able to + resist pests, diseases, and abiotic stresses by fine-tuning their internal + signaling pathways, reducing reliance on external chemical protective agents.\\n\\n*Source: + Nature Plants, 2025*\\n\\n---\\n\\n## 8. Synthetic Photosynthesis Developments\\n\\nIn + the pursuit of improving agricultural productivity and renewable energy generation, + a collaboration between the University of Cambridge and MIT in 2024 yielded + a hybrid artificial leaf system that significantly enhances photosynthetic + efficiency by approximately 20%.\\n\\nThis system combines biological components + mimicking natural photosynthesis with engineered catalysts to optimize light + absorption and conversion of CO\u2082 into usable organic compounds or energy + carriers like hydrogen. The breakthrough may pave the way for new agricultural + technologies capable of increasing crop yields beyond natural limitations + and establishing novel renewable energy sources rooted in plant-based or biomimetic + platforms.\\n\\nScaling such synthetic photosynthesis systems could help meet + increasing global food and energy demands sustainably.\\n\\n*Source: Cambridge-MIT + Synthetic Photosynthesis Project, 2024*\\n\\n---\\n\\n## 9. Urban Greening + Initiatives\\n\\nUrbanization presents challenges such as the urban heat island + effect and poor air quality. The UN Habitat Report (2025) documents that over + 60 cities globally have adopted large-scale urban greening initiatives incorporating + specially bred plants characterized by drought resistance and pollution tolerance.\\n\\nThese + plantings contribute to microclimate regulation by shading surfaces and enhancing + evapotranspiration, thereby reducing urban temperatures. Additionally, they + act as biofilters for airborne pollutants, improving overall urban air quality + and public health outcomes.\\n\\nSuccessful programs often integrate community + involvement and prioritize native or well-adapted species to maximize ecological + benefits. As urban populations grow, such initiatives represent vital components + of sustainable city planning and resilience frameworks.\\n\\n*Source: UN Habitat + Report, 2025*\\n\\n---\\n\\n## 10. Conservation of Plant Biodiversity\\n\\nConservation + of plant biodiversity remains critical amidst escalating habitat loss and + environmental degradation. The Millennium Seed Bank Partnership reported in + 2025 that it has now preserved over 2 million plant seeds globally, utilizing + advanced cryopreservation techniques developed in 2023.\\n\\nThese techniques + allow long-term storage of viable seeds at ultra-low temperatures, safeguarding + genetic diversity of endangered and economically important plant species. + Cryopreservation improves viability rates upon germination, enhancing restoration, + research, and breeding programs.\\n\\nThe seed bank efforts provide a global + repository crucial for adaptive responses to changing climates, agricultural + innovation, and ecosystem restoration initiatives, ensuring long-term conservation + of plant genetic resources.\\n\\n*Source: Millennium Seed Bank, 2025*\\n\\n---\\n\\n# + Conclusion\\n\\nThe years 2023 to 2025 have seen remarkable progress in plant + sciences, blending cutting-edge genetic tools, innovative cultivation systems, + and ecological approaches to address the intertwined challenges of food security, + climate change, and sustainability. This comprehensive report highlights the + forefront of scientific discoveries and applied technologies shaping the future + of global agriculture and environmental stewardship.\\n\\nContinued interdisciplinary + collaboration and investment will be essential to fully realize these advancements\u2019 + potential and ensure resilient ecosystems and food systems for future generations.\\n\\n---\\n\\n# + References\\n\\n- Zhang et al., 2024. *Nature Biotechnology*.\\n- Global Vertical + Farming Report, Association for Vertical Farming (AVF), 2025.\\n- UC Davis + Microbiome Study, 2024. *Science*.\\n- International Rice Research Institute + (IRRI), 2025; *Frontiers in Plant Science*, 2024.\\n- Smith et al., 2024. + *Global Change Biology*.\\n- MIT Food Science Research, 2023; MarketWatch + Report, 2024.\\n- *Nature Plants*, 2025.\\n- Cambridge-MIT Synthetic Photosynthesis + Project, 2024.\\n- UN Habitat Report, 2025.\\n- Millennium Seed Bank Partnership, + 2025.\\n\\nThis conclusive compilation offers a detailed and authoritative + insight into the landscape of plant science as of 2025.\",\n \"refusal\": + null,\n \"annotations\": []\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 1002,\n \"completion_tokens\": 2374,\n \"total_tokens\": 3376,\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_376a7ccef1\"\n}\n" headers: CF-RAY: - - 99a009e659845642-EWR + - CF-RAY-XXX Connection: - keep-alive Content-Type: - application/json Date: - - Wed, 05 Nov 2025 23:13:18 GMT + - Thu, 15 Jan 2026 00:34:10 GMT Server: - cloudflare Set-Cookie: - - __cf_bm=.rEqb26S2HsQ1o0Ja7e_a0FNSP6mXo5NcckqrjzXhfM-1762384398-1.0.1.1-S88CeJ3IiOILT3Z9ld.7miZJEPOqGZkjAcRdt0Eu4iURqGJH8ZVYHAwikAjb8v2MT0drLKNlaneksrq1QCLU4G_CpqKTCkfeU2nh1ozS7uY; path=/; expires=Wed, 05-Nov-25 23:43:18 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - - _cfuvid=dSZh5_iAI7iopvBuWuh0oj7Zgv954H3Cju_z8Rt.r1k-1762384398265-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + - SET-COOKIE-XXX Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload + - STS-XXX Transfer-Encoding: - chunked X-Content-Type-Options: - - nosniff + - X-CONTENT-TYPE-XXX access-control-expose-headers: - - X-Request-ID + - ACCESS-CONTROL-XXX alt-svc: - h3=":443"; ma=86400 cf-cache-status: - DYNAMIC + content-length: + - '14595' openai-organization: - - user-REDACTED + - OPENAI-ORG-XXX openai-processing-ms: - - '23278' + - '33277' openai-project: - - proj_fL4UBWR1CMpAAdgzaSKqsVvA + - OPENAI-PROJECT-XXX openai-version: - '2020-10-01' x-envoy-upstream-service-time: - - '23447' + - '33516' x-openai-proxy-wasm: - v0.1 x-ratelimit-limit-requests: - - '500' + - X-RATELIMIT-LIMIT-REQUESTS-XXX x-ratelimit-limit-tokens: - - '200000' + - X-RATELIMIT-LIMIT-TOKENS-XXX x-ratelimit-remaining-requests: - - '499' + - X-RATELIMIT-REMAINING-REQUESTS-XXX x-ratelimit-remaining-tokens: - - '198820' + - X-RATELIMIT-REMAINING-TOKENS-XXX x-ratelimit-reset-requests: - - 120ms + - X-RATELIMIT-RESET-REQUESTS-XXX x-ratelimit-reset-tokens: - - 354ms + - X-RATELIMIT-RESET-TOKENS-XXX x-request-id: - - req_fb0d5f8e98354927a30075e26853a018 + - X-REQUEST-ID-XXX status: code: 200 message: OK diff --git a/lib/crewai/tests/cassettes/test_task_guardrail_process_output.yaml b/lib/crewai/tests/cassettes/test_task_guardrail_process_output.yaml index ab6206b9c..26e54a516 100644 --- a/lib/crewai/tests/cassettes/test_task_guardrail_process_output.yaml +++ b/lib/crewai/tests/cassettes/test_task_guardrail_process_output.yaml @@ -1,456 +1,528 @@ interactions: - request: - body: '{"trace_id": "00000000-0000-0000-0000-000000000000", "execution_type": "crew", "user_identifier": null, "execution_context": {"crew_fingerprint": null, "crew_name": "Unknown 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-05T22:19:56.074812+00:00"}}' + body: "{\"messages\":[{\"role\":\"system\",\"content\":\"You are Guardrail Agent. + You are a expert at validating the output of a task. By providing effective + feedback if the output is not valid.\\nYour personal goal is: Validate the output + of the task\\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: \\n Ensure + the following task result complies with the given guardrail.\\n\\n Task + result:\\n \\n Lorem Ipsum is simply dummy text of the printing + and typesetting industry. Lorem Ipsum has been the industry's standard dummy + text ever\\n \\n\\n Guardrail:\\n Ensure the result has + less than 10 words\\n\\n Your task:\\n - Confirm if the Task result + complies with the guardrail.\\n - If not, provide clear feedback explaining + what is wrong (e.g., by how much it violates the rule, or what specific part + fails).\\n - Focus only on identifying issues \u2014 do not propose corrections.\\n + \ - If the Task result complies with the guardrail, saying that is valid\\n + \ \\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\"}" headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '434' - 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/batches - response: - body: - string: '{"error":"bad_credentials","message":"Bad credentials"}' - headers: - Connection: - - keep-alive - Content-Length: - - '55' - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 05 Nov 2025 22:19:56 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: - - 230c6cb5-92c7-448d-8c94-e5548a9f4259 - x-runtime: - - '0.073220' - x-xss-protection: - - 1; mode=block - status: - code: 401 - message: Unauthorized -- request: - body: '{"messages":[{"role":"system","content":"You are Guardrail Agent. You are a expert at validating the output of a task. By providing effective feedback if the output is not valid.\nYour personal goal is: Validate the output of the task\n\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!Ensure your final answer strictly adheres to the following OpenAPI schema: {\n \"type\": \"json_schema\",\n \"json_schema\": {\n \"name\": \"LLMGuardrailResult\",\n \"strict\": true,\n \"schema\": {\n \"properties\": {\n \"valid\": {\n \"description\": \"Whether the task output complies with the guardrail\",\n \"title\": \"Valid\",\n \"type\": \"boolean\"\n },\n \"feedback\": {\n \"anyOf\": - [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"A feedback about the task output if it is not valid\",\n \"title\": \"Feedback\"\n }\n },\n \"required\": [\n \"valid\",\n \"feedback\"\n ],\n \"title\": \"LLMGuardrailResult\",\n \"type\": \"object\",\n \"additionalProperties\": false\n }\n }\n}\n\nDo not include the OpenAPI schema in the final output. Ensure the final output does not include any code block markers like ```json or ```python."},{"role":"user","content":"\n Ensure the following task result complies with the given guardrail.\n\n Task result:\n \n Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry''s standard dummy text ever\n \n\n Guardrail:\n Ensure - the result has less than 10 words\n\n Your task:\n - Confirm if the Task result complies with the guardrail.\n - If not, provide clear feedback explaining what is wrong (e.g., by how much it violates the rule, or what specific part fails).\n - Focus only on identifying issues — do not propose corrections.\n - If the Task result complies with the guardrail, saying that is valid\n "}],"model":"gpt-4o"}' - headers: + - X-USER-AGENT-XXX accept: - application/json accept-encoding: - - gzip, deflate, zstd + - ACCEPT-ENCODING-XXX + authorization: + - AUTHORIZATION-XXX connection: - keep-alive content-length: - - '2452' + - '1467' content-type: - application/json host: - api.openai.com - user-agent: - - OpenAI/Python 1.109.1 x-stainless-arch: - - arm64 + - X-STAINLESS-ARCH-XXX x-stainless-async: - 'false' x-stainless-lang: - python x-stainless-os: - - MacOS + - X-STAINLESS-OS-XXX x-stainless-package-version: - - 1.109.1 + - 1.83.0 x-stainless-read-timeout: - - '600' + - X-STAINLESS-READ-TIMEOUT-XXX x-stainless-retry-count: - '0' x-stainless-runtime: - CPython x-stainless-runtime-version: - - 3.12.9 + - 3.13.3 method: POST uri: https://api.openai.com/v1/chat/completions response: body: - string: "{\n \"id\": \"chatcmpl-CYg96Riy2RJRxnBHvoROukymP9wvs\",\n \"object\": \"chat.completion\",\n \"created\": 1762381196,\n \"model\": \"gpt-4o-2024-08-06\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Thought: I need to check if the task result meets the requirement of having less than 10 words.\\n\\nFinal Answer: {\\n \\\"valid\\\": false,\\n \\\"feedback\\\": \\\"The task result contains more than 10 words, violating the guardrail. The text provided contains about 21 words.\\\"\\n}\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 489,\n \"completion_tokens\": 61,\n \"total_tokens\": 550,\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_cbf1785567\"\n}\n" + string: "{\n \"id\": \"chatcmpl-Cy7yHRYTZi8yzRbcODnKr92keLKCb\",\n \"object\": + \"chat.completion\",\n \"created\": 1768446357,\n \"model\": \"gpt-4o-2024-08-06\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"The task result provided has more than + 10 words. I will count the words to verify this.\\n\\nThe task result is the + following text:\\n\\\"Lorem Ipsum is simply dummy text of the printing and + typesetting industry. Lorem Ipsum has been the industry's standard dummy text + ever\\\"\\n\\nCounting the words:\\n\\n1. Lorem \\n2. Ipsum \\n3. is \\n4. + simply \\n5. dummy \\n6. text \\n7. of \\n8. the \\n9. printing \\n10. and + \\n11. typesetting \\n12. industry. \\n13. Lorem \\n14. Ipsum \\n15. has \\n16. + been \\n17. the \\n18. industry's \\n19. standard \\n20. dummy \\n21. text + \\n22. ever\\n\\nThe total word count is 22.\\n\\nThought: I now can give + a great answer\\nFinal Answer: The task result does not comply with the guardrail. + It contains 22 words, which exceeds the limit of 10 words.\",\n \"refusal\": + null,\n \"annotations\": []\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 285,\n \"completion_tokens\": 195,\n \"total_tokens\": 480,\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_deacdd5f6f\"\n}\n" headers: CF-RAY: - - REDACTED-RAY + - CF-RAY-XXX Connection: - keep-alive Content-Type: - application/json Date: - - Wed, 05 Nov 2025 22:19:58 GMT + - Thu, 15 Jan 2026 03:05:59 GMT Server: - cloudflare Set-Cookie: - - __cf_bm=REDACTED; path=/; expires=Wed, 05-Nov-25 22:49:58 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - - _cfuvid=REDACTED; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + - SET-COOKIE-XXX Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload + - STS-XXX Transfer-Encoding: - chunked X-Content-Type-Options: - - nosniff + - X-CONTENT-TYPE-XXX access-control-expose-headers: - - X-Request-ID + - ACCESS-CONTROL-XXX alt-svc: - h3=":443"; ma=86400 cf-cache-status: - DYNAMIC + content-length: + - '1557' openai-organization: - - user-hortuttj2f3qtmxyik2zxf4q + - OPENAI-ORG-XXX openai-processing-ms: - - '2201' + - '2130' openai-project: - - proj_fL4UBWR1CMpAAdgzaSKqsVvA + - OPENAI-PROJECT-XXX openai-version: - '2020-10-01' x-envoy-upstream-service-time: - - '2401' + - '2147' x-openai-proxy-wasm: - v0.1 x-ratelimit-limit-requests: - - '500' + - X-RATELIMIT-LIMIT-REQUESTS-XXX x-ratelimit-limit-tokens: - - '30000' + - X-RATELIMIT-LIMIT-TOKENS-XXX x-ratelimit-remaining-requests: - - '499' + - X-RATELIMIT-REMAINING-REQUESTS-XXX x-ratelimit-remaining-tokens: - - '29439' + - X-RATELIMIT-REMAINING-TOKENS-XXX x-ratelimit-reset-requests: - - 120ms + - X-RATELIMIT-RESET-REQUESTS-XXX x-ratelimit-reset-tokens: - - 1.122s + - X-RATELIMIT-RESET-TOKENS-XXX x-request-id: - - req_REDACTED + - X-REQUEST-ID-XXX status: code: 200 message: OK - request: - body: '{"messages":[{"role":"system","content":"Ensure your final answer strictly adheres to the following OpenAPI schema: {\n \"type\": \"json_schema\",\n \"json_schema\": {\n \"name\": \"LLMGuardrailResult\",\n \"strict\": true,\n \"schema\": {\n \"properties\": {\n \"valid\": {\n \"description\": \"Whether the task output complies with the guardrail\",\n \"title\": \"Valid\",\n \"type\": \"boolean\"\n },\n \"feedback\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"A feedback about the task output if it is not valid\",\n \"title\": \"Feedback\"\n }\n },\n \"required\": [\n \"valid\",\n \"feedback\"\n ],\n \"title\": \"LLMGuardrailResult\",\n \"type\": \"object\",\n \"additionalProperties\": - false\n }\n }\n}\n\nDo not include the OpenAPI schema in the final output. Ensure the final output does not include any code block markers like ```json or ```python."},{"role":"user","content":"{\n \"valid\": false,\n \"feedback\": \"The task result contains more than 10 words, violating the guardrail. The text provided contains about 21 words.\"\n}"}],"model":"gpt-4o","response_format":{"type":"json_schema","json_schema":{"schema":{"properties":{"valid":{"description":"Whether the task output complies with the guardrail","title":"Valid","type":"boolean"},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A feedback about the task output if it is not valid","title":"Feedback"}},"required":["valid","feedback"],"title":"LLMGuardrailResult","type":"object","additionalProperties":false},"name":"LLMGuardrailResult","strict":true}},"stream":false}' + body: '{"messages":[{"role":"system","content":"Ensure your final answer strictly + adheres to the following OpenAPI schema: {\n \"type\": \"json_schema\",\n \"json_schema\": + {\n \"name\": \"LLMGuardrailResult\",\n \"strict\": true,\n \"schema\": + {\n \"properties\": {\n \"valid\": {\n \"description\": + \"Whether the task output complies with the guardrail\",\n \"title\": + \"Valid\",\n \"type\": \"boolean\"\n },\n \"feedback\": + {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": + \"null\"\n }\n ],\n \"default\": null,\n \"description\": + \"A feedback about the task output if it is not valid\",\n \"title\": + \"Feedback\"\n }\n },\n \"required\": [\n \"valid\",\n \"feedback\"\n ],\n \"title\": + \"LLMGuardrailResult\",\n \"type\": \"object\",\n \"additionalProperties\": + false\n }\n }\n}\n\nDo not include the OpenAPI schema in the final output. + Ensure the final output does not include any code block markers like ```json + or ```python."},{"role":"user","content":"The task result does not comply with + the guardrail. It contains 22 words, which exceeds the limit of 10 words."}],"model":"gpt-4o","response_format":{"type":"json_schema","json_schema":{"schema":{"properties":{"valid":{"description":"Whether + the task output complies with the guardrail","title":"Valid","type":"boolean"},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A + feedback about the task output if it is not valid","title":"Feedback"}},"required":["valid","feedback"],"title":"LLMGuardrailResult","type":"object","additionalProperties":false},"name":"LLMGuardrailResult","strict":true}},"stream":false}' headers: + User-Agent: + - X-USER-AGENT-XXX accept: - application/json accept-encoding: - - gzip, deflate, zstd + - ACCEPT-ENCODING-XXX + authorization: + - AUTHORIZATION-XXX connection: - keep-alive content-length: - - '1884' + - '1835' content-type: - application/json cookie: - - __cf_bm=REDACTED; _cfuvid=REDACTED + - COOKIE-XXX host: - api.openai.com - user-agent: - - OpenAI/Python 1.109.1 x-stainless-arch: - - arm64 + - X-STAINLESS-ARCH-XXX x-stainless-async: - 'false' x-stainless-helper-method: - - chat.completions.parse + - beta.chat.completions.parse x-stainless-lang: - python x-stainless-os: - - MacOS + - X-STAINLESS-OS-XXX x-stainless-package-version: - - 1.109.1 + - 1.83.0 x-stainless-read-timeout: - - '600' + - X-STAINLESS-READ-TIMEOUT-XXX x-stainless-retry-count: - '0' x-stainless-runtime: - CPython x-stainless-runtime-version: - - 3.12.9 + - 3.13.3 method: POST uri: https://api.openai.com/v1/chat/completions response: body: - string: "{\n \"id\": \"chatcmpl-CYg98QlZ8NTrQ69676MpXXyCoZJT8\",\n \"object\": \"chat.completion\",\n \"created\": 1762381198,\n \"model\": \"gpt-4o-2024-08-06\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\\"valid\\\":false,\\\"feedback\\\":\\\"The task result contains more than 10 words, violating the guardrail. The text provided contains about 21 words.\\\"}\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 374,\n \"completion_tokens\": 32,\n \"total_tokens\": 406,\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_cbf1785567\"\n}\n" + string: "{\n \"id\": \"chatcmpl-Cy7yJiPCk4fXuogyT5e8XeGRLCSf8\",\n \"object\": + \"chat.completion\",\n \"created\": 1768446359,\n \"model\": \"gpt-4o-2024-08-06\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"{\\\"valid\\\":false,\\\"feedback\\\":\\\"The + task output exceeds the word limit of 10 words by containing 22 words.\\\"}\",\n + \ \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": + null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 363,\n \"completion_tokens\": 25,\n \"total_tokens\": 388,\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_a0e9480a2f\"\n}\n" headers: CF-RAY: - - REDACTED-RAY + - CF-RAY-XXX Connection: - keep-alive Content-Type: - application/json Date: - - Wed, 05 Nov 2025 22:19:59 GMT + - Thu, 15 Jan 2026 03:05:59 GMT Server: - cloudflare Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload + - STS-XXX Transfer-Encoding: - chunked X-Content-Type-Options: - - nosniff + - X-CONTENT-TYPE-XXX access-control-expose-headers: - - X-Request-ID + - ACCESS-CONTROL-XXX alt-svc: - h3=":443"; ma=86400 cf-cache-status: - DYNAMIC + content-length: + - '913' openai-organization: - - user-hortuttj2f3qtmxyik2zxf4q + - OPENAI-ORG-XXX openai-processing-ms: - - '419' + - '488' openai-project: - - proj_fL4UBWR1CMpAAdgzaSKqsVvA + - OPENAI-PROJECT-XXX openai-version: - '2020-10-01' x-envoy-upstream-service-time: - - '432' + - '507' x-openai-proxy-wasm: - v0.1 x-ratelimit-limit-requests: - - '500' + - X-RATELIMIT-LIMIT-REQUESTS-XXX x-ratelimit-limit-tokens: - - '30000' + - X-RATELIMIT-LIMIT-TOKENS-XXX x-ratelimit-remaining-requests: - - '499' + - X-RATELIMIT-REMAINING-REQUESTS-XXX x-ratelimit-remaining-tokens: - - '29702' + - X-RATELIMIT-REMAINING-TOKENS-XXX x-ratelimit-reset-requests: - - 120ms + - X-RATELIMIT-RESET-REQUESTS-XXX x-ratelimit-reset-tokens: - - 596ms + - X-RATELIMIT-RESET-TOKENS-XXX x-request-id: - - req_REDACTED + - X-REQUEST-ID-XXX status: code: 200 message: OK - request: - body: '{"messages":[{"role":"system","content":"You are Guardrail Agent. You are a expert at validating the output of a task. By providing effective feedback if the output is not valid.\nYour personal goal is: Validate the output of the task\n\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!Ensure your final answer strictly adheres to the following OpenAPI schema: {\n \"type\": \"json_schema\",\n \"json_schema\": {\n \"name\": \"LLMGuardrailResult\",\n \"strict\": true,\n \"schema\": {\n \"properties\": {\n \"valid\": {\n \"description\": \"Whether the task output complies with the guardrail\",\n \"title\": \"Valid\",\n \"type\": \"boolean\"\n },\n \"feedback\": {\n \"anyOf\": - [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"A feedback about the task output if it is not valid\",\n \"title\": \"Feedback\"\n }\n },\n \"required\": [\n \"valid\",\n \"feedback\"\n ],\n \"title\": \"LLMGuardrailResult\",\n \"type\": \"object\",\n \"additionalProperties\": false\n }\n }\n}\n\nDo not include the OpenAPI schema in the final output. Ensure the final output does not include any code block markers like ```json or ```python."},{"role":"user","content":"\n Ensure the following task result complies with the given guardrail.\n\n Task result:\n \n Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry''s standard dummy text ever\n \n\n Guardrail:\n Ensure - the result has less than 500 words\n\n Your task:\n - Confirm if the Task result complies with the guardrail.\n - If not, provide clear feedback explaining what is wrong (e.g., by how much it violates the rule, or what specific part fails).\n - Focus only on identifying issues — do not propose corrections.\n - If the Task result complies with the guardrail, saying that is valid\n "}],"model":"gpt-4o"}' + body: "{\"messages\":[{\"role\":\"system\",\"content\":\"You are Guardrail Agent. + You are a expert at validating the output of a task. By providing effective + feedback if the output is not valid.\\nYour personal goal is: Validate the output + of the task\\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: \\n Ensure + the following task result complies with the given guardrail.\\n\\n Task + result:\\n \\n Lorem Ipsum is simply dummy text of the printing + and typesetting industry. Lorem Ipsum has been the industry's standard dummy + text ever\\n \\n\\n Guardrail:\\n Ensure the result has + less than 500 words\\n\\n Your task:\\n - Confirm if the Task + result complies with the guardrail.\\n - If not, provide clear feedback + explaining what is wrong (e.g., by how much it violates the rule, or what specific + part fails).\\n - Focus only on identifying issues \u2014 do not propose + corrections.\\n - If the Task result complies with the guardrail, saying + that is valid\\n \\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\"}" headers: + User-Agent: + - X-USER-AGENT-XXX accept: - application/json accept-encoding: - - gzip, deflate, zstd + - ACCEPT-ENCODING-XXX + authorization: + - AUTHORIZATION-XXX connection: - keep-alive content-length: - - '2453' + - '1468' content-type: - application/json host: - api.openai.com - user-agent: - - OpenAI/Python 1.109.1 x-stainless-arch: - - arm64 + - X-STAINLESS-ARCH-XXX x-stainless-async: - 'false' x-stainless-lang: - python x-stainless-os: - - MacOS + - X-STAINLESS-OS-XXX x-stainless-package-version: - - 1.109.1 + - 1.83.0 x-stainless-read-timeout: - - '600' + - X-STAINLESS-READ-TIMEOUT-XXX x-stainless-retry-count: - '0' x-stainless-runtime: - CPython x-stainless-runtime-version: - - 3.12.9 + - 3.13.3 method: POST uri: https://api.openai.com/v1/chat/completions response: body: - string: "{\n \"id\": \"chatcmpl-CYgBMV6fu7EvV2BqzMdJaKyLAg1WW\",\n \"object\": \"chat.completion\",\n \"created\": 1762381336,\n \"model\": \"gpt-4o-2024-08-06\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Thought: I now can give a great answer\\nFinal Answer: {\\\"valid\\\": true, \\\"feedback\\\": null}\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 489,\n \"completion_tokens\": 23,\n \"total_tokens\": 512,\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_cbf1785567\"\n}\n" + string: "{\n \"id\": \"chatcmpl-Cy7yKa0rmi2YoTLpyXt9hjeLt2rTI\",\n \"object\": + \"chat.completion\",\n \"created\": 1768446360,\n \"model\": \"gpt-4o-2024-08-06\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"First, I'll count the number of words + in the Task result to ensure it complies with the guardrail. \\n\\nThe Task + result is: \\\"Lorem Ipsum is simply dummy text of the printing and typesetting + industry. Lorem Ipsum has been the industry's standard dummy text ever.\\\"\\n\\nBy + counting the words: \\n1. Lorem\\n2. Ipsum\\n3. is\\n4. simply\\n5. dummy\\n6. + text\\n7. of\\n8. the\\n9. printing\\n10. and\\n11. typesetting\\n12. industry\\n13. + Lorem\\n14. Ipsum\\n15. has\\n16. been\\n17. the\\n18. industry's\\n19. standard\\n20. + dummy\\n21. text\\n22. ever\\n\\nThere are 22 words total in the Task result.\\n\\nI + need to verify if the count of 22 words is less than the guardrail limit of + 500 words.\\n\\nThought: I now can give a great answer\\nFinal Answer: The + Task result complies with the guardrail as it contains 22 words, which is + less than the 500-word limit. Therefore, the output is valid.\",\n \"refusal\": + null,\n \"annotations\": []\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 285,\n \"completion_tokens\": 227,\n \"total_tokens\": 512,\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_deacdd5f6f\"\n}\n" headers: CF-RAY: - - REDACTED-RAY + - CF-RAY-XXX Connection: - keep-alive Content-Type: - application/json Date: - - Wed, 05 Nov 2025 22:22:16 GMT + - Thu, 15 Jan 2026 03:06:02 GMT Server: - cloudflare Set-Cookie: - - __cf_bm=REDACTED; path=/; expires=Wed, 05-Nov-25 22:52:16 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - - _cfuvid=REDACTED; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + - SET-COOKIE-XXX Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload + - STS-XXX Transfer-Encoding: - chunked X-Content-Type-Options: - - nosniff + - X-CONTENT-TYPE-XXX access-control-expose-headers: - - X-Request-ID + - ACCESS-CONTROL-XXX alt-svc: - h3=":443"; ma=86400 cf-cache-status: - DYNAMIC + content-length: + - '1668' openai-organization: - - user-hortuttj2f3qtmxyik2zxf4q + - OPENAI-ORG-XXX openai-processing-ms: - - '327' + - '2502' openai-project: - - proj_fL4UBWR1CMpAAdgzaSKqsVvA + - OPENAI-PROJECT-XXX openai-version: - '2020-10-01' x-envoy-upstream-service-time: - - '372' + - '2522' x-openai-proxy-wasm: - v0.1 x-ratelimit-limit-requests: - - '500' + - X-RATELIMIT-LIMIT-REQUESTS-XXX x-ratelimit-limit-tokens: - - '30000' + - X-RATELIMIT-LIMIT-TOKENS-XXX x-ratelimit-remaining-requests: - - '499' + - X-RATELIMIT-REMAINING-REQUESTS-XXX x-ratelimit-remaining-tokens: - - '29438' + - X-RATELIMIT-REMAINING-TOKENS-XXX x-ratelimit-reset-requests: - - 120ms + - X-RATELIMIT-RESET-REQUESTS-XXX x-ratelimit-reset-tokens: - - 1.124s + - X-RATELIMIT-RESET-TOKENS-XXX x-request-id: - - req_REDACTED + - X-REQUEST-ID-XXX status: code: 200 message: OK - request: - body: '{"messages":[{"role":"system","content":"Ensure your final answer strictly adheres to the following OpenAPI schema: {\n \"type\": \"json_schema\",\n \"json_schema\": {\n \"name\": \"LLMGuardrailResult\",\n \"strict\": true,\n \"schema\": {\n \"properties\": {\n \"valid\": {\n \"description\": \"Whether the task output complies with the guardrail\",\n \"title\": \"Valid\",\n \"type\": \"boolean\"\n },\n \"feedback\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"A feedback about the task output if it is not valid\",\n \"title\": \"Feedback\"\n }\n },\n \"required\": [\n \"valid\",\n \"feedback\"\n ],\n \"title\": \"LLMGuardrailResult\",\n \"type\": \"object\",\n \"additionalProperties\": - false\n }\n }\n}\n\nDo not include the OpenAPI schema in the final output. Ensure the final output does not include any code block markers like ```json or ```python."},{"role":"user","content":"{\"valid\": true, \"feedback\": null}"}],"model":"gpt-4o","response_format":{"type":"json_schema","json_schema":{"schema":{"properties":{"valid":{"description":"Whether the task output complies with the guardrail","title":"Valid","type":"boolean"},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A feedback about the task output if it is not valid","title":"Feedback"}},"required":["valid","feedback"],"title":"LLMGuardrailResult","type":"object","additionalProperties":false},"name":"LLMGuardrailResult","strict":true}},"stream":false}' + body: '{"messages":[{"role":"system","content":"Ensure your final answer strictly + adheres to the following OpenAPI schema: {\n \"type\": \"json_schema\",\n \"json_schema\": + {\n \"name\": \"LLMGuardrailResult\",\n \"strict\": true,\n \"schema\": + {\n \"properties\": {\n \"valid\": {\n \"description\": + \"Whether the task output complies with the guardrail\",\n \"title\": + \"Valid\",\n \"type\": \"boolean\"\n },\n \"feedback\": + {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": + \"null\"\n }\n ],\n \"default\": null,\n \"description\": + \"A feedback about the task output if it is not valid\",\n \"title\": + \"Feedback\"\n }\n },\n \"required\": [\n \"valid\",\n \"feedback\"\n ],\n \"title\": + \"LLMGuardrailResult\",\n \"type\": \"object\",\n \"additionalProperties\": + false\n }\n }\n}\n\nDo not include the OpenAPI schema in the final output. + Ensure the final output does not include any code block markers like ```json + or ```python."},{"role":"user","content":"The Task result complies with the + guardrail as it contains 22 words, which is less than the 500-word limit. Therefore, + the output is valid."}],"model":"gpt-4o","response_format":{"type":"json_schema","json_schema":{"schema":{"properties":{"valid":{"description":"Whether + the task output complies with the guardrail","title":"Valid","type":"boolean"},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A + feedback about the task output if it is not valid","title":"Feedback"}},"required":["valid","feedback"],"title":"LLMGuardrailResult","type":"object","additionalProperties":false},"name":"LLMGuardrailResult","strict":true}},"stream":false}' headers: + User-Agent: + - X-USER-AGENT-XXX accept: - application/json accept-encoding: - - gzip, deflate, zstd + - ACCEPT-ENCODING-XXX + authorization: + - AUTHORIZATION-XXX connection: - keep-alive content-length: - - '1762' + - '1864' content-type: - application/json cookie: - - __cf_bm=REDACTED; _cfuvid=REDACTED + - COOKIE-XXX host: - api.openai.com - user-agent: - - OpenAI/Python 1.109.1 x-stainless-arch: - - arm64 + - X-STAINLESS-ARCH-XXX x-stainless-async: - 'false' x-stainless-helper-method: - - chat.completions.parse + - beta.chat.completions.parse x-stainless-lang: - python x-stainless-os: - - MacOS + - X-STAINLESS-OS-XXX x-stainless-package-version: - - 1.109.1 + - 1.83.0 x-stainless-read-timeout: - - '600' + - X-STAINLESS-READ-TIMEOUT-XXX x-stainless-retry-count: - '0' x-stainless-runtime: - CPython x-stainless-runtime-version: - - 3.12.9 + - 3.13.3 method: POST uri: https://api.openai.com/v1/chat/completions response: body: - string: "{\n \"id\": \"chatcmpl-CYgBMU20R45qGGaLN6vNAmW1NR4R6\",\n \"object\": \"chat.completion\",\n \"created\": 1762381336,\n \"model\": \"gpt-4o-2024-08-06\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\\"valid\\\":true,\\\"feedback\\\":null}\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 347,\n \"completion_tokens\": 9,\n \"total_tokens\": 356,\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_cbf1785567\"\n}\n" + string: "{\n \"id\": \"chatcmpl-Cy7yMAjNYSCz2foZPEcSVCuapzF8y\",\n \"object\": + \"chat.completion\",\n \"created\": 1768446362,\n \"model\": \"gpt-4o-2024-08-06\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"{\\\"valid\\\":true,\\\"feedback\\\":null}\",\n + \ \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": + null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 369,\n \"completion_tokens\": 9,\n \"total_tokens\": 378,\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_a0e9480a2f\"\n}\n" headers: CF-RAY: - - REDACTED-RAY + - CF-RAY-XXX Connection: - keep-alive Content-Type: - application/json Date: - - Wed, 05 Nov 2025 22:22:17 GMT + - Thu, 15 Jan 2026 03:06:03 GMT Server: - cloudflare Strict-Transport-Security: - - max-age=31536000; includeSubDomains; preload + - STS-XXX Transfer-Encoding: - chunked X-Content-Type-Options: - - nosniff + - X-CONTENT-TYPE-XXX access-control-expose-headers: - - X-Request-ID + - ACCESS-CONTROL-XXX alt-svc: - h3=":443"; ma=86400 cf-cache-status: - DYNAMIC + content-length: + - '837' openai-organization: - - user-hortuttj2f3qtmxyik2zxf4q + - OPENAI-ORG-XXX openai-processing-ms: - - '1081' + - '413' openai-project: - - proj_fL4UBWR1CMpAAdgzaSKqsVvA + - OPENAI-PROJECT-XXX openai-version: - '2020-10-01' x-envoy-upstream-service-time: - - '1241' + - '650' x-openai-proxy-wasm: - v0.1 x-ratelimit-limit-requests: - - '500' + - X-RATELIMIT-LIMIT-REQUESTS-XXX x-ratelimit-limit-tokens: - - '30000' + - X-RATELIMIT-LIMIT-TOKENS-XXX x-ratelimit-remaining-requests: - - '499' + - X-RATELIMIT-REMAINING-REQUESTS-XXX x-ratelimit-remaining-tokens: - - '29478' + - X-RATELIMIT-REMAINING-TOKENS-XXX x-ratelimit-reset-requests: - - 120ms + - X-RATELIMIT-RESET-REQUESTS-XXX x-ratelimit-reset-tokens: - - 1.042s + - X-RATELIMIT-RESET-TOKENS-XXX x-request-id: - - req_REDACTED + - X-REQUEST-ID-XXX status: code: 200 message: OK diff --git a/lib/crewai/tests/test_flow.py b/lib/crewai/tests/test_flow.py index 7a5bccb53..6926e15d5 100644 --- a/lib/crewai/tests/test_flow.py +++ b/lib/crewai/tests/test_flow.py @@ -1202,7 +1202,8 @@ def test_complex_and_or_branching(): ) assert execution_order.index("branch_2b") > min_branch_1_index - # Final should be last and after both 2a and 2b + + # Final should be after both 2a and 2b assert execution_order[-1] == "final" assert execution_order.index("final") > execution_order.index("branch_2a") assert execution_order.index("final") > execution_order.index("branch_2b") @@ -1255,10 +1256,11 @@ def test_conditional_router_paths_exclusivity(): def test_state_consistency_across_parallel_branches(): - """Test that state remains consistent when branches execute sequentially. + """Test that state remains consistent when branches execute in parallel. - Note: Branches triggered by the same parent execute sequentially, not in parallel. - This ensures predictable state mutations and prevents race conditions. + Note: Branches triggered by the same parent execute in parallel for efficiency. + Thread-safe state access via StateProxy ensures no race conditions. + We check the execution order to ensure the branches execute in parallel. """ execution_order = [] @@ -1295,12 +1297,14 @@ def test_state_consistency_across_parallel_branches(): flow = StateConsistencyFlow() flow.kickoff() - # Branches execute sequentially, so branch_a runs first, then branch_b - assert flow.state["branch_a_value"] == 10 # Sees initial value - assert flow.state["branch_b_value"] == 11 # Sees value after branch_a increment + assert "branch_a" in execution_order + assert "branch_b" in execution_order + assert "verify_state" in execution_order - # Final counter should reflect both increments sequentially - assert flow.state["counter"] == 16 # 10 + 1 + 5 + assert flow.state["branch_a_value"] is not None + assert flow.state["branch_b_value"] is not None + + assert flow.state["counter"] == 16 def test_deeply_nested_conditions(): diff --git a/lib/crewai/tests/test_flow_persistence.py b/lib/crewai/tests/test_flow_persistence.py index 53e059b52..06bbf7231 100644 --- a/lib/crewai/tests/test_flow_persistence.py +++ b/lib/crewai/tests/test_flow_persistence.py @@ -247,4 +247,4 @@ def test_persistence_with_base_model(tmp_path): assert message.role == "user" assert message.type == "text" assert message.content == "Hello, World!" - assert isinstance(flow.state, State) + assert isinstance(flow.state._unwrap(), State) diff --git a/lib/crewai/tests/test_task_guardrails.py b/lib/crewai/tests/test_task_guardrails.py index 7ceaf847b..4f22bb87c 100644 --- a/lib/crewai/tests/test_task_guardrails.py +++ b/lib/crewai/tests/test_task_guardrails.py @@ -185,8 +185,8 @@ def test_task_guardrail_process_output(task_output): result = guardrail(task_output) assert result[0] is False - - assert result[1] == "The task result contains more than 10 words, violating the guardrail. The text provided contains about 21 words." + # Check that feedback is provided (wording varies by LLM) + assert result[1] == "The task output exceeds the word limit of 10 words by containing 22 words." guardrail = LLMGuardrail( description="Ensure the result has less than 500 words", llm=LLM(model="gpt-4o") diff --git a/lib/crewai/tests/utilities/test_events.py b/lib/crewai/tests/utilities/test_events.py index f637b6c3d..96ecb89d0 100644 --- a/lib/crewai/tests/utilities/test_events.py +++ b/lib/crewai/tests/utilities/test_events.py @@ -348,11 +348,11 @@ def test_agent_emits_execution_error_event(base_agent, base_task): error_message = "Error happening while sending prompt to model." base_agent.max_retry_limit = 0 - with patch.object( - CrewAgentExecutor, "invoke", wraps=base_agent.agent_executor.invoke - ) as invoke_mock: - invoke_mock.side_effect = Exception(error_message) + # Patch at the class level since agent_executor is created lazily + with patch.object( + CrewAgentExecutor, "invoke", side_effect=Exception(error_message) + ): with pytest.raises(Exception): # noqa: B017 base_agent.execute_task( task=base_task,