From b6d668fc664c5f376626f06acdf48f9f462884e2 Mon Sep 17 00:00:00 2001 From: Vini Brasil Date: Tue, 18 Feb 2025 07:47:01 -0600 Subject: [PATCH 01/35] Implement Flow state export method (#2134) This commit implements a method for exporting the state of a flow into a JSON-serializable dictionary. The idea is producing a human-readable version of state that can be inspected or consumed by other systems, hence JSON and not pickling or marshalling. I consider it an export because it's a one-way process, meaning it cannot be loaded back into Python because of complex types. --- src/crewai/flow/state_utils.py | 52 +++++++++++ tests/flow/test_state_utils.py | 156 +++++++++++++++++++++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 src/crewai/flow/state_utils.py create mode 100644 tests/flow/test_state_utils.py diff --git a/src/crewai/flow/state_utils.py b/src/crewai/flow/state_utils.py new file mode 100644 index 000000000..40bc81162 --- /dev/null +++ b/src/crewai/flow/state_utils.py @@ -0,0 +1,52 @@ +from datetime import date, datetime +from typing import Any + +from pydantic import BaseModel + +from crewai.flow import Flow + + +def export_state(flow: Flow) -> dict[str, Any]: + """Exports the Flow's internal state as JSON-compatible data structures. + + Performs a one-way transformation of a Flow's state into basic Python types + that can be safely serialized to JSON. To prevent infinite recursion with + circular references, the conversion is limited to a depth of 5 levels. + + Args: + flow: The Flow object whose state needs to be exported + + Returns: + dict[str, Any]: The transformed state using JSON-compatible Python + types. + """ + return _to_serializable(flow._state) + + +def _to_serializable(obj: Any, max_depth: int = 5, _current_depth: int = 0) -> Any: + if _current_depth >= max_depth: + return repr(obj) + + if isinstance(obj, (str, int, float, bool, type(None))): + return obj + elif isinstance(obj, (date, datetime)): + return obj.isoformat() + elif isinstance(obj, (list, tuple, set)): + return [_to_serializable(item, max_depth, _current_depth + 1) for item in obj] + elif isinstance(obj, dict): + return { + _to_serializable_key(key): _to_serializable( + value, max_depth, _current_depth + 1 + ) + for key, value in obj.items() + } + elif isinstance(obj, BaseModel): + return _to_serializable(obj.model_dump(), max_depth, _current_depth + 1) + else: + return repr(obj) + + +def _to_serializable_key(key: Any) -> str: + if isinstance(key, (str, int)): + return str(key) + return f"key_{id(key)}_{repr(key)}" diff --git a/tests/flow/test_state_utils.py b/tests/flow/test_state_utils.py new file mode 100644 index 000000000..1f71cd981 --- /dev/null +++ b/tests/flow/test_state_utils.py @@ -0,0 +1,156 @@ +from datetime import date, datetime +from typing import List +from unittest.mock import Mock + +import pytest +from pydantic import BaseModel + +from crewai.flow import Flow +from crewai.flow.state_utils import export_state + + +class Address(BaseModel): + street: str + city: str + country: str + + +class Person(BaseModel): + name: str + age: int + address: Address + birthday: date + skills: List[str] + + +@pytest.fixture +def mock_flow(): + def create_flow(state): + flow = Mock(spec=Flow) + flow._state = state + return flow + + return create_flow + + +@pytest.mark.parametrize( + "test_input,expected", + [ + ({"text": "hello world"}, {"text": "hello world"}), + ({"number": 42}, {"number": 42}), + ({"decimal": 3.14}, {"decimal": 3.14}), + ({"flag": True}, {"flag": True}), + ({"empty": None}, {"empty": None}), + ({"list": [1, 2, 3]}, {"list": [1, 2, 3]}), + ({"tuple": (1, 2, 3)}, {"tuple": [1, 2, 3]}), + ({"set": {1, 2, 3}}, {"set": [1, 2, 3]}), + ({"nested": [1, [2, 3], {4, 5}]}, {"nested": [1, [2, 3], [4, 5]]}), + ], +) +def test_basic_serialization(mock_flow, test_input, expected): + flow = mock_flow(test_input) + result = export_state(flow) + assert result == expected + + +@pytest.mark.parametrize( + "input_date,expected", + [ + (date(2024, 1, 1), "2024-01-01"), + (datetime(2024, 1, 1, 12, 30), "2024-01-01T12:30:00"), + ], +) +def test_temporal_serialization(mock_flow, input_date, expected): + flow = mock_flow({"date": input_date}) + result = export_state(flow) + assert result["date"] == expected + + +@pytest.mark.parametrize( + "key,value,expected_key_type", + [ + (("tuple", "key"), "value", str), + (None, "value", str), + (123, "value", str), + ("normal", "value", str), + ], +) +def test_dictionary_key_serialization(mock_flow, key, value, expected_key_type): + flow = mock_flow({key: value}) + result = export_state(flow) + assert len(result) == 1 + result_key = next(iter(result.keys())) + assert isinstance(result_key, expected_key_type) + assert result[result_key] == value + + +@pytest.mark.parametrize( + "callable_obj,expected_in_result", + [ + (lambda x: x * 2, "lambda"), + (str.upper, "upper"), + ], +) +def test_callable_serialization(mock_flow, callable_obj, expected_in_result): + flow = mock_flow({"func": callable_obj}) + result = export_state(flow) + assert isinstance(result["func"], str) + assert expected_in_result in result["func"].lower() + + +def test_pydantic_model_serialization(mock_flow): + address = Address(street="123 Main St", city="Tech City", country="Pythonia") + + person = Person( + name="John Doe", + age=30, + address=address, + birthday=date(1994, 1, 1), + skills=["Python", "Testing"], + ) + + flow = mock_flow( + { + "single_model": address, + "nested_model": person, + "model_list": [address, address], + "model_dict": {"home": address}, + } + ) + + result = export_state(flow) + + assert result["single_model"]["street"] == "123 Main St" + + assert result["nested_model"]["name"] == "John Doe" + assert result["nested_model"]["address"]["city"] == "Tech City" + assert result["nested_model"]["birthday"] == "1994-01-01" + + assert len(result["model_list"]) == 2 + assert all(m["street"] == "123 Main St" for m in result["model_list"]) + assert result["model_dict"]["home"]["city"] == "Tech City" + + +def test_depth_limit(mock_flow): + """Test max depth handling with a deeply nested structure""" + + def create_nested(depth): + if depth == 0: + return "value" + return {"next": create_nested(depth - 1)} + + deep_structure = create_nested(10) + flow = mock_flow(deep_structure) + result = export_state(flow) + + assert result == { + "next": { + "next": { + "next": { + "next": { + "next": "{'next': {'next': {'next': {'next': {'next': 'value'}}}}}" + } + } + } + } + } From ac819bcb6ee6ad95888ba051e173a31492a1f59d Mon Sep 17 00:00:00 2001 From: Vidit Ostwal <110953813+Vidit-Ostwal@users.noreply.github.com> Date: Tue, 18 Feb 2025 22:15:26 +0530 Subject: [PATCH 02/35] Added functionality to have any llm run test functionality (#2071) * Added functionality to have any llm run test functionality * Fixed lint issues * Fixed Linting issues * Fixed unit test case * Fixed unit test * Fixed test case * Fixed unit test case --------- Co-authored-by: Brandon Hancock (bhancock_ai) <109994880+bhancockio@users.noreply.github.com> --- src/crewai/crew.py | 11 ++++++++--- .../utilities/evaluators/crew_evaluator_handler.py | 13 +++++++------ tests/crew_test.py | 6 ++++-- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/crewai/crew.py b/src/crewai/crew.py index 9ae9ce2c0..9eb93a16c 100644 --- a/src/crewai/crew.py +++ b/src/crewai/crew.py @@ -1148,19 +1148,24 @@ class Crew(BaseModel): def test( self, n_iterations: int, - openai_model_name: Optional[str] = None, + eval_llm: Union[str, InstanceOf[LLM]], inputs: Optional[Dict[str, Any]] = None, ) -> None: """Test and evaluate the Crew with the given inputs for n iterations concurrently using concurrent.futures.""" test_crew = self.copy() + eval_llm = create_llm(eval_llm) + + if not eval_llm: + raise ValueError("Failed to create LLM instance.") + self._test_execution_span = test_crew._telemetry.test_execution_span( test_crew, n_iterations, inputs, - openai_model_name, # type: ignore[arg-type] + eval_llm.model, # type: ignore[arg-type] ) # type: ignore[arg-type] - evaluator = CrewEvaluator(test_crew, openai_model_name) # type: ignore[arg-type] + evaluator = CrewEvaluator(test_crew, eval_llm) # type: ignore[arg-type] for i in range(1, n_iterations + 1): evaluator.set_iteration(i) diff --git a/src/crewai/utilities/evaluators/crew_evaluator_handler.py b/src/crewai/utilities/evaluators/crew_evaluator_handler.py index ef9b908e1..9fcd2886d 100644 --- a/src/crewai/utilities/evaluators/crew_evaluator_handler.py +++ b/src/crewai/utilities/evaluators/crew_evaluator_handler.py @@ -1,11 +1,12 @@ from collections import defaultdict -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, InstanceOf from rich.box import HEAVY_EDGE from rich.console import Console from rich.table import Table from crewai.agent import Agent +from crewai.llm import LLM from crewai.task import Task from crewai.tasks.task_output import TaskOutput from crewai.telemetry import Telemetry @@ -23,7 +24,7 @@ class CrewEvaluator: Attributes: crew (Crew): The crew of agents to evaluate. - openai_model_name (str): The model to use for evaluating the performance of the agents (for now ONLY OpenAI accepted). + eval_llm (LLM): Language model instance to use for evaluations tasks_scores (defaultdict): A dictionary to store the scores of the agents for each task. iteration (int): The current iteration of the evaluation. """ @@ -32,9 +33,9 @@ class CrewEvaluator: run_execution_times: defaultdict = defaultdict(list) iteration: int = 0 - def __init__(self, crew, openai_model_name: str): + def __init__(self, crew, eval_llm: InstanceOf[LLM]): self.crew = crew - self.openai_model_name = openai_model_name + self.llm = eval_llm self._telemetry = Telemetry() self._setup_for_evaluating() @@ -51,7 +52,7 @@ class CrewEvaluator: ), backstory="Evaluator agent for crew evaluation with precise capabilities to evaluate the performance of the agents in the crew based on the tasks they have performed", verbose=False, - llm=self.openai_model_name, + llm=self.llm, ) def _evaluation_task( @@ -181,7 +182,7 @@ class CrewEvaluator: self.crew, evaluation_result.pydantic.quality, current_task.execution_duration, - self.openai_model_name, + self.llm.model, ) self.tasks_scores[self.iteration].append(evaluation_result.pydantic.quality) self.run_execution_times[self.iteration].append( diff --git a/tests/crew_test.py b/tests/crew_test.py index 0539ea347..398be37de 100644 --- a/tests/crew_test.py +++ b/tests/crew_test.py @@ -15,6 +15,7 @@ from crewai.agents.cache import CacheHandler from crewai.crew import Crew from crewai.crews.crew_output import CrewOutput from crewai.knowledge.source.string_knowledge_source import StringKnowledgeSource +from crewai.llm import LLM from crewai.memory.contextual.contextual_memory import ContextualMemory from crewai.process import Process from crewai.project import crew @@ -3341,7 +3342,8 @@ def test_crew_testing_function(kickoff_mock, copy_mock, crew_evaluator): copy_mock.return_value = crew n_iterations = 2 - crew.test(n_iterations, openai_model_name="gpt-4o-mini", inputs={"topic": "AI"}) + llm_instance = LLM('gpt-4o-mini') + crew.test(n_iterations, llm_instance, inputs={"topic": "AI"}) # Ensure kickoff is called on the copied crew kickoff_mock.assert_has_calls( @@ -3350,7 +3352,7 @@ def test_crew_testing_function(kickoff_mock, copy_mock, crew_evaluator): crew_evaluator.assert_has_calls( [ - mock.call(crew, "gpt-4o-mini"), + mock.call(crew,llm_instance), mock.call().set_iteration(1), mock.call().set_iteration(2), mock.call().print_crew_evaluation_result(), From 7dc47adb5c28b140caa14ad74abbce29e8727058 Mon Sep 17 00:00:00 2001 From: sharmasundip <59015684+sharmasundip@users.noreply.github.com> Date: Tue, 18 Feb 2025 22:29:29 +0530 Subject: [PATCH 03/35] fix user memory config issue (#2086) Co-authored-by: Brandon Hancock (bhancock_ai) <109994880+bhancockio@users.noreply.github.com> --- src/crewai/crew.py | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/crewai/crew.py b/src/crewai/crew.py index 9eb93a16c..d331599b5 100644 --- a/src/crewai/crew.py +++ b/src/crewai/crew.py @@ -275,12 +275,26 @@ class Crew(BaseModel): if self.entity_memory else EntityMemory(crew=self, embedder_config=self.embedder) ) - if hasattr(self, "memory_config") and self.memory_config is not None: - self._user_memory = ( - self.user_memory if self.user_memory else UserMemory(crew=self) - ) + if ( + self.memory_config and "user_memory" in self.memory_config + ): # Check for user_memory in config + user_memory_config = self.memory_config["user_memory"] + if isinstance( + user_memory_config, UserMemory + ): # Check if it is already an instance + self._user_memory = user_memory_config + elif isinstance( + user_memory_config, dict + ): # Check if it's a configuration dict + self._user_memory = UserMemory( + crew=self, **user_memory_config + ) # Initialize with config + else: + raise TypeError( + "user_memory must be a UserMemory instance or a configuration dictionary" + ) else: - self._user_memory = None + self._user_memory = None # No user memory if not in config return self @model_validator(mode="after") @@ -455,8 +469,6 @@ class Crew(BaseModel): ) return self - - @property def key(self) -> str: source = [agent.key for agent in self.agents] + [ @@ -928,13 +940,13 @@ class Crew(BaseModel): def _create_crew_output(self, task_outputs: List[TaskOutput]) -> CrewOutput: if not task_outputs: raise ValueError("No task outputs available to create crew output.") - + # Filter out empty outputs and get the last valid one as the main output valid_outputs = [t for t in task_outputs if t.raw] if not valid_outputs: raise ValueError("No valid task outputs available to create crew output.") final_task_output = valid_outputs[-1] - + final_string_output = final_task_output.raw self._finish_execution(final_string_output) token_usage = self.calculate_usage_metrics() From 1cb5f57864965395949f138e48736eec5ee8cc05 Mon Sep 17 00:00:00 2001 From: "Brandon Hancock (bhancock_ai)" <109994880+bhancockio@users.noreply.github.com> Date: Tue, 18 Feb 2025 16:10:11 -0500 Subject: [PATCH 04/35] Bugfix/fix backtick in agent response (#2159) * updating prompts * fix issue * clean up thoughts as well * drop trailing set --- src/crewai/agents/parser.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/crewai/agents/parser.py b/src/crewai/agents/parser.py index b4629a8d2..71444a20a 100644 --- a/src/crewai/agents/parser.py +++ b/src/crewai/agents/parser.py @@ -94,6 +94,13 @@ class CrewAgentParser: elif includes_answer: final_answer = text.split(FINAL_ANSWER_ACTION)[-1].strip() + # Check whether the final answer ends with triple backticks. + if final_answer.endswith("```"): + # Count occurrences of triple backticks in the final answer. + count = final_answer.count("```") + # If count is odd then it's an unmatched trailing set; remove it. + if count % 2 != 0: + final_answer = final_answer[:-3].rstrip() return AgentFinish(thought, final_answer, text) if not re.search(r"Action\s*\d*\s*:[\s]*(.*?)", text, re.DOTALL): @@ -120,7 +127,10 @@ class CrewAgentParser: regex = r"(.*?)(?:\n\nAction|\n\nFinal Answer)" thought_match = re.search(regex, text, re.DOTALL) if thought_match: - return thought_match.group(1).strip() + thought = thought_match.group(1).strip() + # Remove any triple backticks from the thought string + thought = thought.replace("```", "").strip() + return thought return "" def _clean_action(self, text: str) -> str: From 90f1bee6025a2bfdc2f4d7ef5531805c727f090e Mon Sep 17 00:00:00 2001 From: Eduardo Chiarotti Date: Wed, 19 Feb 2025 08:52:30 -0300 Subject: [PATCH 05/35] feat: add prompt observability code (#2027) * feat: add prompt observability code * feat: improve logic for llm call * feat: add tests for traces * feat: remove unused improt * feat: add function to clear and add task traces * feat: fix import * feat: chagne time * feat: fix type checking issues * feat: add fixed time to fix test * feat: fix datetime test issue * feat: add add task traces function * feat: add same logic as entp * feat: add start_time as reference for duplication of tool call * feat: add max_depth * feat: add protocols file to properly import on LLM --------- Co-authored-by: Brandon Hancock (bhancock_ai) <109994880+bhancockio@users.noreply.github.com> --- src/crewai/crew.py | 2 + src/crewai/flow/flow.py | 11 +- src/crewai/llm.py | 154 ++++- src/crewai/tools/tool_usage.py | 20 +- src/crewai/traces/__init__.py | 0 src/crewai/traces/context.py | 39 ++ src/crewai/traces/enums.py | 19 + src/crewai/traces/models.py | 89 +++ src/crewai/traces/unified_trace_controller.py | 543 ++++++++++++++++++ src/crewai/utilities/protocols.py | 12 + tests/agent_test.py | 53 +- tests/traces/test_unified_trace_controller.py | 360 ++++++++++++ 12 files changed, 1254 insertions(+), 48 deletions(-) create mode 100644 src/crewai/traces/__init__.py create mode 100644 src/crewai/traces/context.py create mode 100644 src/crewai/traces/enums.py create mode 100644 src/crewai/traces/models.py create mode 100644 src/crewai/traces/unified_trace_controller.py create mode 100644 src/crewai/utilities/protocols.py create mode 100644 tests/traces/test_unified_trace_controller.py diff --git a/src/crewai/crew.py b/src/crewai/crew.py index d331599b5..682d5d60b 100644 --- a/src/crewai/crew.py +++ b/src/crewai/crew.py @@ -38,6 +38,7 @@ from crewai.tasks.task_output import TaskOutput from crewai.telemetry import Telemetry from crewai.tools.agent_tools.agent_tools import AgentTools from crewai.tools.base_tool import Tool +from crewai.traces.unified_trace_controller import init_crew_main_trace from crewai.types.usage_metrics import UsageMetrics from crewai.utilities import I18N, FileHandler, Logger, RPMController from crewai.utilities.constants import TRAINING_DATA_FILE @@ -545,6 +546,7 @@ class Crew(BaseModel): CrewTrainingHandler(filename).clear() raise + @init_crew_main_trace def kickoff( self, inputs: Optional[Dict[str, Any]] = None, diff --git a/src/crewai/flow/flow.py b/src/crewai/flow/flow.py index f1242a2bf..f0d0b1093 100644 --- a/src/crewai/flow/flow.py +++ b/src/crewai/flow/flow.py @@ -30,6 +30,10 @@ from crewai.flow.flow_visualizer import plot_flow from crewai.flow.persistence.base import FlowPersistence from crewai.flow.utils import get_possible_return_constants from crewai.telemetry import Telemetry +from crewai.traces.unified_trace_controller import ( + init_flow_main_trace, + trace_flow_step, +) from crewai.utilities.printer import Printer logger = logging.getLogger(__name__) @@ -753,8 +757,12 @@ class Flow(Generic[T], metaclass=FlowMeta): if inputs is not None and "id" not in inputs: self._initialize_state(inputs) - return asyncio.run(self.kickoff_async()) + async def run_flow(): + return await self.kickoff_async() + return asyncio.run(run_flow()) + + @init_flow_main_trace async def kickoff_async(self, inputs: Optional[Dict[str, Any]] = None) -> Any: if not self._start_methods: raise ValueError("No start method defined") @@ -804,6 +812,7 @@ class Flow(Generic[T], metaclass=FlowMeta): ) await self._execute_listeners(start_method_name, result) + @trace_flow_step async def _execute_method( self, method_name: str, method: Callable, *args: Any, **kwargs: Any ) -> Any: diff --git a/src/crewai/llm.py b/src/crewai/llm.py index ada5c9bf3..43391951e 100644 --- a/src/crewai/llm.py +++ b/src/crewai/llm.py @@ -1,3 +1,4 @@ +import inspect import json import logging import os @@ -5,7 +6,17 @@ import sys import threading import warnings from contextlib import contextmanager -from typing import Any, Dict, List, Literal, Optional, Type, Union, cast +from typing import ( + Any, + Dict, + List, + Literal, + Optional, + Tuple, + Type, + Union, + cast, +) from dotenv import load_dotenv from pydantic import BaseModel @@ -18,9 +29,11 @@ with warnings.catch_warnings(): from litellm.utils import supports_response_schema +from crewai.traces.unified_trace_controller import trace_llm_call from crewai.utilities.exceptions.context_window_exceeding_exception import ( LLMContextLengthExceededException, ) +from crewai.utilities.protocols import AgentExecutorProtocol load_dotenv() @@ -164,6 +177,7 @@ class LLM: self.context_window_size = 0 self.reasoning_effort = reasoning_effort self.additional_params = kwargs + self._message_history: List[Dict[str, str]] = [] self.is_anthropic = self._is_anthropic_model(model) litellm.drop_params = True @@ -179,16 +193,22 @@ class LLM: self.set_callbacks(callbacks) self.set_env_callbacks() + @trace_llm_call + def _call_llm(self, params: Dict[str, Any]) -> Any: + with suppress_warnings(): + response = litellm.completion(**params) + return response + def _is_anthropic_model(self, model: str) -> bool: """Determine if the model is from Anthropic provider. - + Args: model: The model identifier string. - + Returns: bool: True if the model is from Anthropic, False otherwise. """ - ANTHROPIC_PREFIXES = ('anthropic/', 'claude-', 'claude/') + ANTHROPIC_PREFIXES = ("anthropic/", "claude-", "claude/") return any(prefix in model.lower() for prefix in ANTHROPIC_PREFIXES) def call( @@ -199,7 +219,7 @@ class LLM: available_functions: Optional[Dict[str, Any]] = None, ) -> Union[str, Any]: """High-level LLM call method. - + Args: messages: Input messages for the LLM. Can be a string or list of message dictionaries. @@ -211,22 +231,22 @@ class LLM: during and after the LLM call. available_functions: Optional dict mapping function names to callables that can be invoked by the LLM. - + Returns: Union[str, Any]: Either a text response from the LLM (str) or the result of a tool function call (Any). - + Raises: TypeError: If messages format is invalid ValueError: If response format is not supported LLMContextLengthExceededException: If input exceeds model's context limit - + Examples: # Example 1: Simple string input >>> response = llm.call("Return the name of a random city.") >>> print(response) "Paris" - + # Example 2: Message list with system and user messages >>> messages = [ ... {"role": "system", "content": "You are a geography expert"}, @@ -288,7 +308,7 @@ class LLM: params = {k: v for k, v in params.items() if v is not None} # --- 2) Make the completion call - response = litellm.completion(**params) + response = self._call_llm(params) response_message = cast(Choices, cast(ModelResponse, response).choices)[ 0 ].message @@ -348,36 +368,40 @@ class LLM: logging.error(f"LiteLLM call failed: {str(e)}") raise - def _format_messages_for_provider(self, messages: List[Dict[str, str]]) -> List[Dict[str, str]]: + def _format_messages_for_provider( + self, messages: List[Dict[str, str]] + ) -> List[Dict[str, str]]: """Format messages according to provider requirements. - + Args: messages: List of message dictionaries with 'role' and 'content' keys. Can be empty or None. - + Returns: List of formatted messages according to provider requirements. For Anthropic models, ensures first message has 'user' role. - + Raises: TypeError: If messages is None or contains invalid message format. """ if messages is None: raise TypeError("Messages cannot be None") - + # Validate message format first for msg in messages: if not isinstance(msg, dict) or "role" not in msg or "content" not in msg: - raise TypeError("Invalid message format. Each message must be a dict with 'role' and 'content' keys") - + raise TypeError( + "Invalid message format. Each message must be a dict with 'role' and 'content' keys" + ) + if not self.is_anthropic: return messages - + # Anthropic requires messages to start with 'user' role if not messages or messages[0]["role"] == "system": # If first message is system or empty, add a placeholder user message return [{"role": "user", "content": "."}, *messages] - + return messages def _get_custom_llm_provider(self) -> str: @@ -495,3 +519,95 @@ class LLM: litellm.success_callback = success_callbacks litellm.failure_callback = failure_callbacks + + def _get_execution_context(self) -> Tuple[Optional[Any], Optional[Any]]: + """Get the agent and task from the execution context. + + Returns: + tuple: (agent, task) from any AgentExecutor context, or (None, None) if not found + """ + frame = inspect.currentframe() + caller_frame = frame.f_back if frame else None + agent = None + task = None + + # Add a maximum depth to prevent infinite loops + max_depth = 100 # Reasonable limit for call stack depth + current_depth = 0 + + while caller_frame and current_depth < max_depth: + if "self" in caller_frame.f_locals: + caller_self = caller_frame.f_locals["self"] + if isinstance(caller_self, AgentExecutorProtocol): + agent = caller_self.agent + task = caller_self.task + break + caller_frame = caller_frame.f_back + current_depth += 1 + + return agent, task + + def _get_new_messages(self, messages: List[Dict[str, str]]) -> List[Dict[str, str]]: + """Get only the new messages that haven't been processed before.""" + if not hasattr(self, "_message_history"): + self._message_history = [] + + new_messages = [] + for message in messages: + message_key = (message["role"], message["content"]) + if message_key not in [ + (m["role"], m["content"]) for m in self._message_history + ]: + new_messages.append(message) + self._message_history.append(message) + return new_messages + + def _get_new_tool_results(self, agent) -> List[Dict]: + """Get only the new tool results that haven't been processed before.""" + if not agent or not agent.tools_results: + return [] + + if not hasattr(self, "_tool_results_history"): + self._tool_results_history: List[Dict] = [] + + new_tool_results = [] + + for result in agent.tools_results: + # Process tool arguments to extract actual values + processed_args = {} + if isinstance(result["tool_args"], dict): + for key, value in result["tool_args"].items(): + if isinstance(value, dict) and "type" in value: + # Skip metadata and just store the actual value + continue + processed_args[key] = value + + # Create a clean result with processed arguments + clean_result = { + "tool_name": result["tool_name"], + "tool_args": processed_args, + "result": result["result"], + "content": result.get("content", ""), + "start_time": result.get("start_time", ""), + } + + # Check if this exact tool execution exists in history + is_duplicate = False + for history_result in self._tool_results_history: + if ( + clean_result["tool_name"] == history_result["tool_name"] + and str(clean_result["tool_args"]) + == str(history_result["tool_args"]) + and str(clean_result["result"]) == str(history_result["result"]) + and clean_result["content"] == history_result.get("content", "") + and clean_result["start_time"] + == history_result.get("start_time", "") + ): + is_duplicate = True + break + + if not is_duplicate: + new_tool_results.append(clean_result) + self._tool_results_history.append(clean_result) + + return new_tool_results diff --git a/src/crewai/tools/tool_usage.py b/src/crewai/tools/tool_usage.py index 218410ef7..fa821bebd 100644 --- a/src/crewai/tools/tool_usage.py +++ b/src/crewai/tools/tool_usage.py @@ -2,6 +2,7 @@ import ast import datetime import json import time +from datetime import UTC from difflib import SequenceMatcher from json import JSONDecodeError from textwrap import dedent @@ -116,7 +117,10 @@ class ToolUsage: self._printer.print(content=f"\n\n{error}\n", color="red") return error - if isinstance(tool, CrewStructuredTool) and tool.name == self._i18n.tools("add_image")["name"]: # type: ignore + if ( + isinstance(tool, CrewStructuredTool) + and tool.name == self._i18n.tools("add_image")["name"] # type: ignore + ): try: result = self._use(tool_string=tool_string, tool=tool, calling=calling) return result @@ -154,6 +158,7 @@ class ToolUsage: self.task.increment_tools_errors() started_at = time.time() + started_at_trace = datetime.datetime.now(UTC) from_cache = False result = None # type: ignore # Incompatible types in assignment (expression has type "None", variable has type "str") @@ -181,7 +186,9 @@ class ToolUsage: if calling.arguments: try: - acceptable_args = tool.args_schema.model_json_schema()["properties"].keys() # type: ignore + acceptable_args = tool.args_schema.model_json_schema()[ + "properties" + ].keys() # type: ignore arguments = { k: v for k, v in calling.arguments.items() @@ -202,7 +209,7 @@ class ToolUsage: error=e, tool=tool.name, tool_inputs=tool.description ) error = ToolUsageErrorException( - f'\n{error_message}.\nMoving on then. {self._i18n.slice("format").format(tool_names=self.tools_names)}' + f"\n{error_message}.\nMoving on then. {self._i18n.slice('format').format(tool_names=self.tools_names)}" ).message self.task.increment_tools_errors() if self.agent.verbose: @@ -244,6 +251,7 @@ class ToolUsage: "result": result, "tool_name": tool.name, "tool_args": calling.arguments, + "start_time": started_at_trace, } self.on_tool_use_finished( @@ -368,7 +376,7 @@ class ToolUsage: raise else: return ToolUsageErrorException( - f'{self._i18n.errors("tool_arguments_error")}' + f"{self._i18n.errors('tool_arguments_error')}" ) if not isinstance(arguments, dict): @@ -376,7 +384,7 @@ class ToolUsage: raise else: return ToolUsageErrorException( - f'{self._i18n.errors("tool_arguments_error")}' + f"{self._i18n.errors('tool_arguments_error')}" ) return ToolCalling( @@ -404,7 +412,7 @@ class ToolUsage: if self.agent.verbose: self._printer.print(content=f"\n\n{e}\n", color="red") return ToolUsageErrorException( # type: ignore # Incompatible return value type (got "ToolUsageErrorException", expected "ToolCalling | InstructorToolCalling") - f'{self._i18n.errors("tool_usage_error").format(error=e)}\nMoving on then. {self._i18n.slice("format").format(tool_names=self.tools_names)}' + f"{self._i18n.errors('tool_usage_error').format(error=e)}\nMoving on then. {self._i18n.slice('format').format(tool_names=self.tools_names)}" ) return self._tool_calling(tool_string) diff --git a/src/crewai/traces/__init__.py b/src/crewai/traces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/crewai/traces/context.py b/src/crewai/traces/context.py new file mode 100644 index 000000000..dd1cf144e --- /dev/null +++ b/src/crewai/traces/context.py @@ -0,0 +1,39 @@ +from contextlib import contextmanager +from contextvars import ContextVar +from typing import Generator + + +class TraceContext: + """Maintains the current trace context throughout the execution stack. + + This class provides a context manager for tracking trace execution across + async and sync code paths using ContextVars. + """ + + _context: ContextVar = ContextVar("trace_context", default=None) + + @classmethod + def get_current(cls): + """Get the current trace context. + + Returns: + Optional[UnifiedTraceController]: The current trace controller or None if not set. + """ + return cls._context.get() + + @classmethod + @contextmanager + def set_current(cls, trace): + """Set the current trace context within a context manager. + + Args: + trace: The trace controller to set as current. + + Yields: + UnifiedTraceController: The current trace controller. + """ + token = cls._context.set(trace) + try: + yield trace + finally: + cls._context.reset(token) diff --git a/src/crewai/traces/enums.py b/src/crewai/traces/enums.py new file mode 100644 index 000000000..392f46ea4 --- /dev/null +++ b/src/crewai/traces/enums.py @@ -0,0 +1,19 @@ +from enum import Enum + + +class TraceType(Enum): + LLM_CALL = "llm_call" + TOOL_CALL = "tool_call" + FLOW_STEP = "flow_step" + START_CALL = "start_call" + + +class RunType(Enum): + KICKOFF = "kickoff" + TRAIN = "train" + TEST = "test" + + +class CrewType(Enum): + CREW = "crew" + FLOW = "flow" diff --git a/src/crewai/traces/models.py b/src/crewai/traces/models.py new file mode 100644 index 000000000..254da957e --- /dev/null +++ b/src/crewai/traces/models.py @@ -0,0 +1,89 @@ +from datetime import datetime +from typing import Any, Dict, List, Optional + +from pydantic import BaseModel, Field + + +class ToolCall(BaseModel): + """Model representing a tool call during execution""" + + name: str + arguments: Dict[str, Any] + output: str + start_time: datetime + end_time: Optional[datetime] = None + latency_ms: Optional[int] = None + error: Optional[str] = None + + +class LLMRequest(BaseModel): + """Model representing the LLM request details""" + + model: str + messages: List[Dict[str, str]] + temperature: Optional[float] = None + max_tokens: Optional[int] = None + stop_sequences: Optional[List[str]] = None + additional_params: Dict[str, Any] = Field(default_factory=dict) + + +class LLMResponse(BaseModel): + """Model representing the LLM response details""" + + content: str + finish_reason: Optional[str] = None + + +class FlowStepIO(BaseModel): + """Model representing flow step input/output details""" + + function_name: str + inputs: Dict[str, Any] = Field(default_factory=dict) + outputs: Any + metadata: Dict[str, Any] = Field(default_factory=dict) + + +class CrewTrace(BaseModel): + """Model for tracking detailed information about LLM interactions and Flow steps""" + + deployment_instance_id: Optional[str] = Field( + description="ID of the deployment instance" + ) + trace_id: str = Field(description="Unique identifier for this trace") + run_id: str = Field(description="Identifier for the execution run") + agent_role: Optional[str] = Field(description="Role of the agent") + task_id: Optional[str] = Field(description="ID of the current task being executed") + task_name: Optional[str] = Field(description="Name of the current task") + task_description: Optional[str] = Field( + description="Description of the current task" + ) + trace_type: str = Field(description="Type of the trace") + crew_type: str = Field(description="Type of the crew") + run_type: str = Field(description="Type of the run") + + # Timing information + start_time: Optional[datetime] = None + end_time: Optional[datetime] = None + latency_ms: Optional[int] = None + + # Request/Response for LLM calls + request: Optional[LLMRequest] = None + response: Optional[LLMResponse] = None + + # Input/Output for Flow steps + flow_step: Optional[FlowStepIO] = None + + # Tool usage + tool_calls: List[ToolCall] = Field(default_factory=list) + + # Metrics + tokens_used: Optional[int] = None + prompt_tokens: Optional[int] = None + completion_tokens: Optional[int] = None + cost: Optional[float] = None + + # Additional metadata + status: str = "running" # running, completed, error + error: Optional[str] = None + metadata: Dict[str, Any] = Field(default_factory=dict) + tags: List[str] = Field(default_factory=list) diff --git a/src/crewai/traces/unified_trace_controller.py b/src/crewai/traces/unified_trace_controller.py new file mode 100644 index 000000000..986a0a174 --- /dev/null +++ b/src/crewai/traces/unified_trace_controller.py @@ -0,0 +1,543 @@ +import inspect +import os +from datetime import UTC, datetime +from functools import wraps +from typing import Any, Awaitable, Callable, Dict, List, Optional +from uuid import uuid4 + +from crewai.traces.context import TraceContext +from crewai.traces.enums import CrewType, RunType, TraceType +from crewai.traces.models import ( + CrewTrace, + FlowStepIO, + LLMRequest, + LLMResponse, + ToolCall, +) + + +class UnifiedTraceController: + """Controls and manages trace execution and recording. + + This class handles the lifecycle of traces including creation, execution tracking, + and recording of results for various types of operations (LLM calls, tool calls, flow steps). + """ + + _task_traces: Dict[str, List["UnifiedTraceController"]] = {} + + def __init__( + self, + trace_type: TraceType, + run_type: RunType, + crew_type: CrewType, + run_id: str, + deployment_instance_id: str = os.environ.get( + "CREWAI_DEPLOYMENT_INSTANCE_ID", "" + ), + parent_trace_id: Optional[str] = None, + agent_role: Optional[str] = "unknown", + task_name: Optional[str] = None, + task_description: Optional[str] = None, + task_id: Optional[str] = None, + flow_step: Dict[str, Any] = {}, + tool_calls: List[ToolCall] = [], + **context: Any, + ) -> None: + """Initialize a new trace controller. + + Args: + trace_type: Type of trace being recorded. + run_type: Type of run being executed. + crew_type: Type of crew executing the trace. + run_id: Unique identifier for the run. + deployment_instance_id: Optional deployment instance identifier. + parent_trace_id: Optional parent trace identifier for nested traces. + agent_role: Role of the agent executing the trace. + task_name: Optional name of the task being executed. + task_description: Optional description of the task. + task_id: Optional unique identifier for the task. + flow_step: Optional flow step information. + tool_calls: Optional list of tool calls made during execution. + **context: Additional context parameters. + """ + self.trace_id = str(uuid4()) + self.run_id = run_id + self.parent_trace_id = parent_trace_id + self.trace_type = trace_type + self.run_type = run_type + self.crew_type = crew_type + self.context = context + self.agent_role = agent_role + self.task_name = task_name + self.task_description = task_description + self.task_id = task_id + self.deployment_instance_id = deployment_instance_id + self.children: List[Dict[str, Any]] = [] + self.start_time: Optional[datetime] = None + self.end_time: Optional[datetime] = None + self.error: Optional[str] = None + self.tool_calls = tool_calls + self.flow_step = flow_step + self.status: str = "running" + + # Add trace to task's trace collection if task_id is present + if task_id: + self._add_to_task_traces() + + def _add_to_task_traces(self) -> None: + """Add this trace to the task's trace collection.""" + if not hasattr(UnifiedTraceController, "_task_traces"): + UnifiedTraceController._task_traces = {} + + if self.task_id is None: + return + + if self.task_id not in UnifiedTraceController._task_traces: + UnifiedTraceController._task_traces[self.task_id] = [] + + UnifiedTraceController._task_traces[self.task_id].append(self) + + @classmethod + def get_task_traces(cls, task_id: str) -> List["UnifiedTraceController"]: + """Get all traces for a specific task. + + Args: + task_id: The ID of the task to get traces for + + Returns: + List of traces associated with the task + """ + return cls._task_traces.get(task_id, []) + + @classmethod + def clear_task_traces(cls, task_id: str) -> None: + """Clear traces for a specific task. + + Args: + task_id: The ID of the task to clear traces for + """ + if hasattr(cls, "_task_traces") and task_id in cls._task_traces: + del cls._task_traces[task_id] + + def _get_current_trace(self) -> "UnifiedTraceController": + return TraceContext.get_current() + + def start_trace(self) -> "UnifiedTraceController": + """Start the trace execution. + + Returns: + UnifiedTraceController: Self for method chaining. + """ + self.start_time = datetime.now(UTC) + return self + + def end_trace(self, result: Any = None, error: Optional[str] = None) -> None: + """End the trace execution and record results. + + Args: + result: Optional result from the trace execution. + error: Optional error message if the trace failed. + """ + self.end_time = datetime.now(UTC) + self.status = "error" if error else "completed" + self.error = error + self._record_trace(result) + + def add_child_trace(self, child_trace: Dict[str, Any]) -> None: + """Add a child trace to this trace's execution history. + + Args: + child_trace: The child trace information to add. + """ + self.children.append(child_trace) + + def to_crew_trace(self) -> CrewTrace: + """Convert to CrewTrace format for storage. + + Returns: + CrewTrace: The trace data in CrewTrace format. + """ + latency_ms = None + + if self.tool_calls and hasattr(self.tool_calls[0], "start_time"): + self.start_time = self.tool_calls[0].start_time + + if self.start_time and self.end_time: + latency_ms = int((self.end_time - self.start_time).total_seconds() * 1000) + + request = None + response = None + flow_step_obj = None + + if self.trace_type in [TraceType.LLM_CALL, TraceType.TOOL_CALL]: + request = LLMRequest( + model=self.context.get("model", "unknown"), + messages=self.context.get("messages", []), + temperature=self.context.get("temperature"), + max_tokens=self.context.get("max_tokens"), + stop_sequences=self.context.get("stop_sequences"), + ) + if "response" in self.context: + response = LLMResponse( + content=self.context["response"].get("content", ""), + finish_reason=self.context["response"].get("finish_reason"), + ) + + elif self.trace_type == TraceType.FLOW_STEP: + flow_step_obj = FlowStepIO( + function_name=self.flow_step.get("function_name", "unknown"), + inputs=self.flow_step.get("inputs", {}), + outputs={"result": self.context.get("response")}, + metadata=self.flow_step.get("metadata", {}), + ) + + return CrewTrace( + deployment_instance_id=self.deployment_instance_id, + trace_id=self.trace_id, + task_id=self.task_id, + run_id=self.run_id, + agent_role=self.agent_role, + task_name=self.task_name, + task_description=self.task_description, + trace_type=self.trace_type.value, + crew_type=self.crew_type.value, + run_type=self.run_type.value, + start_time=self.start_time, + end_time=self.end_time, + latency_ms=latency_ms, + request=request, + response=response, + flow_step=flow_step_obj, + tool_calls=self.tool_calls, + tokens_used=self.context.get("tokens_used"), + prompt_tokens=self.context.get("prompt_tokens"), + completion_tokens=self.context.get("completion_tokens"), + status=self.status, + error=self.error, + ) + + def _record_trace(self, result: Any = None) -> None: + """Record the trace. + + This method is called when a trace is completed. It ensures the trace + is properly recorded and associated with its task if applicable. + + Args: + result: Optional result to include in the trace + """ + if result: + self.context["response"] = result + + # Add to task traces if this trace belongs to a task + if self.task_id: + self._add_to_task_traces() + + +def should_trace() -> bool: + """Check if tracing is enabled via environment variable.""" + return os.getenv("CREWAI_ENABLE_TRACING", "false").lower() == "true" + + +# Crew main trace +def init_crew_main_trace(func: Callable[..., Any]) -> Callable[..., Any]: + """Decorator to initialize and track the main crew execution trace. + + This decorator sets up the trace context for the main crew execution, + handling both synchronous and asynchronous crew operations. + + Args: + func: The crew function to be traced. + + Returns: + Wrapped function that creates and manages the main crew trace context. + """ + + @wraps(func) + def wrapper(self: Any, *args: Any, **kwargs: Any) -> Any: + if not should_trace(): + return func(self, *args, **kwargs) + + trace = build_crew_main_trace(self) + with TraceContext.set_current(trace): + try: + return func(self, *args, **kwargs) + except Exception as e: + trace.end_trace(error=str(e)) + raise + + return wrapper + + +def build_crew_main_trace(self: Any) -> "UnifiedTraceController": + """Build the main trace controller for a crew execution. + + This function creates a trace controller configured for the main crew execution, + handling different run types (kickoff, test, train) and maintaining context. + + Args: + self: The crew instance. + + Returns: + UnifiedTraceController: The configured trace controller for the crew. + """ + run_type = RunType.KICKOFF + if hasattr(self, "_test") and self._test: + run_type = RunType.TEST + elif hasattr(self, "_train") and self._train: + run_type = RunType.TRAIN + + current_trace = TraceContext.get_current() + + trace = UnifiedTraceController( + trace_type=TraceType.LLM_CALL, + run_type=run_type, + crew_type=current_trace.crew_type if current_trace else CrewType.CREW, + run_id=current_trace.run_id if current_trace else str(self.id), + parent_trace_id=current_trace.trace_id if current_trace else None, + ) + return trace + + +# Flow main trace +def init_flow_main_trace( + func: Callable[..., Awaitable[Any]], +) -> Callable[..., Awaitable[Any]]: + """Decorator to initialize and track the main flow execution trace. + + Args: + func: The async flow function to be traced. + + Returns: + Wrapped async function that creates and manages the main flow trace context. + """ + + @wraps(func) + async def wrapper(self: Any, *args: Any, **kwargs: Any) -> Any: + if not should_trace(): + return await func(self, *args, **kwargs) + + trace = build_flow_main_trace(self, *args, **kwargs) + with TraceContext.set_current(trace): + try: + return await func(self, *args, **kwargs) + except Exception: + raise + + return wrapper + + +def build_flow_main_trace( + self: Any, *args: Any, **kwargs: Any +) -> "UnifiedTraceController": + """Build the main trace controller for a flow execution. + + Args: + self: The flow instance. + *args: Variable positional arguments. + **kwargs: Variable keyword arguments. + + Returns: + UnifiedTraceController: The configured trace controller for the flow. + """ + current_trace = TraceContext.get_current() + trace = UnifiedTraceController( + trace_type=TraceType.FLOW_STEP, + run_id=current_trace.run_id if current_trace else str(self.flow_id), + parent_trace_id=current_trace.trace_id if current_trace else None, + crew_type=CrewType.FLOW, + run_type=RunType.KICKOFF, + context={ + "crew_name": self.__class__.__name__, + "inputs": kwargs.get("inputs", {}), + "agents": [], + "tasks": [], + }, + ) + return trace + + +# Flow step trace +def trace_flow_step( + func: Callable[..., Awaitable[Any]], +) -> Callable[..., Awaitable[Any]]: + """Decorator to trace individual flow step executions. + + Args: + func: The async flow step function to be traced. + + Returns: + Wrapped async function that creates and manages the flow step trace context. + """ + + @wraps(func) + async def wrapper( + self: Any, + method_name: str, + method: Callable[..., Any], + *args: Any, + **kwargs: Any, + ) -> Any: + if not should_trace(): + return await func(self, method_name, method, *args, **kwargs) + + trace = build_flow_step_trace(self, method_name, method, *args, **kwargs) + with TraceContext.set_current(trace): + trace.start_trace() + try: + result = await func(self, method_name, method, *args, **kwargs) + trace.end_trace(result=result) + return result + except Exception as e: + trace.end_trace(error=str(e)) + raise + + return wrapper + + +def build_flow_step_trace( + self: Any, method_name: str, method: Callable[..., Any], *args: Any, **kwargs: Any +) -> "UnifiedTraceController": + """Build a trace controller for an individual flow step. + + Args: + self: The flow instance. + method_name: Name of the method being executed. + method: The actual method being executed. + *args: Variable positional arguments. + **kwargs: Variable keyword arguments. + + Returns: + UnifiedTraceController: The configured trace controller for the flow step. + """ + current_trace = TraceContext.get_current() + + # Get method signature + sig = inspect.signature(method) + params = list(sig.parameters.values()) + + # Create inputs dictionary mapping parameter names to values + method_params = [p for p in params if p.name != "self"] + inputs: Dict[str, Any] = {} + + # Map positional args to their parameter names + for i, param in enumerate(method_params): + if i < len(args): + inputs[param.name] = args[i] + + # Add keyword arguments + inputs.update(kwargs) + + trace = UnifiedTraceController( + trace_type=TraceType.FLOW_STEP, + run_type=current_trace.run_type if current_trace else RunType.KICKOFF, + crew_type=current_trace.crew_type if current_trace else CrewType.FLOW, + run_id=current_trace.run_id if current_trace else str(self.flow_id), + parent_trace_id=current_trace.trace_id if current_trace else None, + flow_step={ + "function_name": method_name, + "inputs": inputs, + "metadata": { + "crew_name": self.__class__.__name__, + }, + }, + ) + return trace + + +# LLM trace +def trace_llm_call(func: Callable[..., Any]) -> Callable[..., Any]: + """Decorator to trace LLM calls. + + Args: + func: The function to trace. + + Returns: + Wrapped function that creates and manages the LLM call trace context. + """ + + @wraps(func) + def wrapper(self: Any, *args: Any, **kwargs: Any) -> Any: + if not should_trace(): + return func(self, *args, **kwargs) + + trace = build_llm_trace(self, *args, **kwargs) + with TraceContext.set_current(trace): + trace.start_trace() + try: + response = func(self, *args, **kwargs) + # Extract relevant data from response + trace_response = { + "content": response["choices"][0]["message"]["content"], + "finish_reason": response["choices"][0].get("finish_reason"), + } + + # Add usage metrics to context + if "usage" in response: + trace.context["tokens_used"] = response["usage"].get( + "total_tokens", 0 + ) + trace.context["prompt_tokens"] = response["usage"].get( + "prompt_tokens", 0 + ) + trace.context["completion_tokens"] = response["usage"].get( + "completion_tokens", 0 + ) + + trace.end_trace(trace_response) + return response + except Exception as e: + trace.end_trace(error=str(e)) + raise + + return wrapper + + +def build_llm_trace( + self: Any, params: Dict[str, Any], *args: Any, **kwargs: Any +) -> Any: + """Build a trace controller for an LLM call. + + Args: + self: The LLM instance. + params: The parameters for the LLM call. + *args: Variable positional arguments. + **kwargs: Variable keyword arguments. + + Returns: + UnifiedTraceController: The configured trace controller for the LLM call. + """ + current_trace = TraceContext.get_current() + agent, task = self._get_execution_context() + + # Get new messages and tool results + new_messages = self._get_new_messages(params.get("messages", [])) + new_tool_results = self._get_new_tool_results(agent) + + # Create trace context + trace = UnifiedTraceController( + trace_type=TraceType.TOOL_CALL if new_tool_results else TraceType.LLM_CALL, + crew_type=current_trace.crew_type if current_trace else CrewType.CREW, + run_type=current_trace.run_type if current_trace else RunType.KICKOFF, + run_id=current_trace.run_id if current_trace else str(uuid4()), + parent_trace_id=current_trace.trace_id if current_trace else None, + agent_role=agent.role if agent else "unknown", + task_id=str(task.id) if task else None, + task_name=task.name if task else None, + task_description=task.description if task else None, + model=self.model, + messages=new_messages, + temperature=self.temperature, + max_tokens=self.max_tokens, + stop_sequences=self.stop, + tool_calls=[ + ToolCall( + name=result["tool_name"], + arguments=result["tool_args"], + output=str(result["result"]), + start_time=result.get("start_time", ""), + end_time=datetime.now(UTC), + ) + for result in new_tool_results + ], + ) + return trace diff --git a/src/crewai/utilities/protocols.py b/src/crewai/utilities/protocols.py new file mode 100644 index 000000000..83ebf58e9 --- /dev/null +++ b/src/crewai/utilities/protocols.py @@ -0,0 +1,12 @@ +from typing import Any, Protocol, runtime_checkable + + +@runtime_checkable +class AgentExecutorProtocol(Protocol): + """Protocol defining the expected interface for an agent executor.""" + + @property + def agent(self) -> Any: ... + + @property + def task(self) -> Any: ... diff --git a/tests/agent_test.py b/tests/agent_test.py index e67a7454a..d429a3c60 100644 --- a/tests/agent_test.py +++ b/tests/agent_test.py @@ -1,6 +1,7 @@ """Test Agent creation and execution basic functionality.""" import os +from datetime import UTC, datetime, timezone from unittest import mock from unittest.mock import patch @@ -908,6 +909,8 @@ def test_tool_result_as_answer_is_the_final_answer_for_the_agent(): @pytest.mark.vcr(filter_headers=["authorization"]) def test_tool_usage_information_is_appended_to_agent(): + from datetime import UTC, datetime + from crewai.tools import BaseTool class MyCustomTool(BaseTool): @@ -917,30 +920,36 @@ def test_tool_usage_information_is_appended_to_agent(): def _run(self) -> str: return "Howdy!" - agent1 = Agent( - role="Friendly Neighbor", - goal="Make everyone feel welcome", - backstory="You are the friendly neighbor", - tools=[MyCustomTool(result_as_answer=True)], - ) + fixed_datetime = datetime(2025, 2, 10, 12, 0, 0, tzinfo=UTC) + with patch("datetime.datetime") as mock_datetime: + mock_datetime.now.return_value = fixed_datetime + mock_datetime.side_effect = lambda *args, **kw: datetime(*args, **kw) - greeting = Task( - description="Say an appropriate greeting.", - expected_output="The greeting.", - agent=agent1, - ) - tasks = [greeting] - crew = Crew(agents=[agent1], tasks=tasks) + agent1 = Agent( + role="Friendly Neighbor", + goal="Make everyone feel welcome", + backstory="You are the friendly neighbor", + tools=[MyCustomTool(result_as_answer=True)], + ) - crew.kickoff() - assert agent1.tools_results == [ - { - "result": "Howdy!", - "tool_name": "Decide Greetings", - "tool_args": {}, - "result_as_answer": True, - } - ] + greeting = Task( + description="Say an appropriate greeting.", + expected_output="The greeting.", + agent=agent1, + ) + tasks = [greeting] + crew = Crew(agents=[agent1], tasks=tasks) + + crew.kickoff() + assert agent1.tools_results == [ + { + "result": "Howdy!", + "tool_name": "Decide Greetings", + "tool_args": {}, + "result_as_answer": True, + "start_time": fixed_datetime, + } + ] def test_agent_definition_based_on_dict(): diff --git a/tests/traces/test_unified_trace_controller.py b/tests/traces/test_unified_trace_controller.py new file mode 100644 index 000000000..b14fb5d2d --- /dev/null +++ b/tests/traces/test_unified_trace_controller.py @@ -0,0 +1,360 @@ +import os +from datetime import UTC, datetime +from unittest.mock import MagicMock, patch +from uuid import UUID + +import pytest + +from crewai.traces.context import TraceContext +from crewai.traces.enums import CrewType, RunType, TraceType +from crewai.traces.models import ( + CrewTrace, + FlowStepIO, + LLMRequest, + LLMResponse, +) +from crewai.traces.unified_trace_controller import ( + UnifiedTraceController, + init_crew_main_trace, + init_flow_main_trace, + should_trace, + trace_flow_step, + trace_llm_call, +) + + +class TestUnifiedTraceController: + @pytest.fixture + def basic_trace_controller(self): + return UnifiedTraceController( + trace_type=TraceType.LLM_CALL, + run_type=RunType.KICKOFF, + crew_type=CrewType.CREW, + run_id="test-run-id", + agent_role="test-agent", + task_name="test-task", + task_description="test description", + task_id="test-task-id", + ) + + def test_initialization(self, basic_trace_controller): + """Test basic initialization of UnifiedTraceController""" + assert basic_trace_controller.trace_type == TraceType.LLM_CALL + assert basic_trace_controller.run_type == RunType.KICKOFF + assert basic_trace_controller.crew_type == CrewType.CREW + assert basic_trace_controller.run_id == "test-run-id" + assert basic_trace_controller.agent_role == "test-agent" + assert basic_trace_controller.task_name == "test-task" + assert basic_trace_controller.task_description == "test description" + assert basic_trace_controller.task_id == "test-task-id" + assert basic_trace_controller.status == "running" + assert isinstance(UUID(basic_trace_controller.trace_id), UUID) + + def test_start_trace(self, basic_trace_controller): + """Test starting a trace""" + result = basic_trace_controller.start_trace() + assert result == basic_trace_controller + assert basic_trace_controller.start_time is not None + assert isinstance(basic_trace_controller.start_time, datetime) + + def test_end_trace_success(self, basic_trace_controller): + """Test ending a trace successfully""" + basic_trace_controller.start_trace() + basic_trace_controller.end_trace(result={"test": "result"}) + + assert basic_trace_controller.end_time is not None + assert basic_trace_controller.status == "completed" + assert basic_trace_controller.error is None + assert basic_trace_controller.context.get("response") == {"test": "result"} + + def test_end_trace_with_error(self, basic_trace_controller): + """Test ending a trace with an error""" + basic_trace_controller.start_trace() + basic_trace_controller.end_trace(error="Test error occurred") + + assert basic_trace_controller.end_time is not None + assert basic_trace_controller.status == "error" + assert basic_trace_controller.error == "Test error occurred" + + def test_add_child_trace(self, basic_trace_controller): + """Test adding a child trace""" + child_trace = {"id": "child-1", "type": "test"} + basic_trace_controller.add_child_trace(child_trace) + assert len(basic_trace_controller.children) == 1 + assert basic_trace_controller.children[0] == child_trace + + def test_to_crew_trace_llm_call(self): + """Test converting to CrewTrace for LLM call""" + test_messages = [{"role": "user", "content": "test"}] + test_response = { + "content": "test response", + "finish_reason": "stop", + } + + controller = UnifiedTraceController( + trace_type=TraceType.LLM_CALL, + run_type=RunType.KICKOFF, + crew_type=CrewType.CREW, + run_id="test-run-id", + context={ + "messages": test_messages, + "temperature": 0.7, + "max_tokens": 100, + }, + ) + + # Set model and messages in the context + controller.context["model"] = "gpt-4" + controller.context["messages"] = test_messages + + controller.start_trace() + controller.end_trace(result=test_response) + + crew_trace = controller.to_crew_trace() + assert isinstance(crew_trace, CrewTrace) + assert isinstance(crew_trace.request, LLMRequest) + assert isinstance(crew_trace.response, LLMResponse) + assert crew_trace.request.model == "gpt-4" + assert crew_trace.request.messages == test_messages + assert crew_trace.response.content == test_response["content"] + assert crew_trace.response.finish_reason == test_response["finish_reason"] + + def test_to_crew_trace_flow_step(self): + """Test converting to CrewTrace for flow step""" + flow_step_data = { + "function_name": "test_function", + "inputs": {"param1": "value1"}, + "metadata": {"meta": "data"}, + } + + controller = UnifiedTraceController( + trace_type=TraceType.FLOW_STEP, + run_type=RunType.KICKOFF, + crew_type=CrewType.FLOW, + run_id="test-run-id", + flow_step=flow_step_data, + ) + + controller.start_trace() + controller.end_trace(result="test result") + + crew_trace = controller.to_crew_trace() + assert isinstance(crew_trace, CrewTrace) + assert isinstance(crew_trace.flow_step, FlowStepIO) + assert crew_trace.flow_step.function_name == "test_function" + assert crew_trace.flow_step.inputs == {"param1": "value1"} + assert crew_trace.flow_step.outputs == {"result": "test result"} + + def test_should_trace(self): + """Test should_trace function""" + with patch.dict(os.environ, {"CREWAI_ENABLE_TRACING": "true"}): + assert should_trace() is True + + with patch.dict(os.environ, {"CREWAI_ENABLE_TRACING": "false"}): + assert should_trace() is False + + with patch.dict(os.environ, clear=True): + assert should_trace() is False + + @pytest.mark.asyncio + async def test_trace_flow_step_decorator(self): + """Test trace_flow_step decorator""" + + class TestFlow: + flow_id = "test-flow-id" + + @trace_flow_step + async def test_method(self, method_name, method, *args, **kwargs): + return "test result" + + with patch.dict(os.environ, {"CREWAI_ENABLE_TRACING": "true"}): + flow = TestFlow() + result = await flow.test_method("test_method", lambda x: x, arg1="value1") + assert result == "test result" + + def test_trace_llm_call_decorator(self): + """Test trace_llm_call decorator""" + + class TestLLM: + model = "gpt-4" + temperature = 0.7 + max_tokens = 100 + stop = None + + def _get_execution_context(self): + return MagicMock(), MagicMock() + + def _get_new_messages(self, messages): + return messages + + def _get_new_tool_results(self, agent): + return [] + + @trace_llm_call + def test_method(self, params): + return { + "choices": [ + { + "message": {"content": "test response"}, + "finish_reason": "stop", + } + ], + "usage": { + "total_tokens": 50, + "prompt_tokens": 20, + "completion_tokens": 30, + }, + } + + with patch.dict(os.environ, {"CREWAI_ENABLE_TRACING": "true"}): + llm = TestLLM() + result = llm.test_method({"messages": []}) + assert result["choices"][0]["message"]["content"] == "test response" + + def test_init_crew_main_trace_kickoff(self): + """Test init_crew_main_trace in kickoff mode""" + trace_context = None + + class TestCrew: + id = "test-crew-id" + _test = False + _train = False + + @init_crew_main_trace + def test_method(self): + nonlocal trace_context + trace_context = TraceContext.get_current() + return "test result" + + with patch.dict(os.environ, {"CREWAI_ENABLE_TRACING": "true"}): + crew = TestCrew() + result = test_method(crew) + assert result == "test result" + assert trace_context is not None + assert trace_context.trace_type == TraceType.LLM_CALL + assert trace_context.run_type == RunType.KICKOFF + assert trace_context.crew_type == CrewType.CREW + assert trace_context.run_id == str(crew.id) + + def test_init_crew_main_trace_test_mode(self): + """Test init_crew_main_trace in test mode""" + trace_context = None + + class TestCrew: + id = "test-crew-id" + _test = True + _train = False + + @init_crew_main_trace + def test_method(self): + nonlocal trace_context + trace_context = TraceContext.get_current() + return "test result" + + with patch.dict(os.environ, {"CREWAI_ENABLE_TRACING": "true"}): + crew = TestCrew() + result = test_method(crew) + assert result == "test result" + assert trace_context is not None + assert trace_context.run_type == RunType.TEST + + def test_init_crew_main_trace_train_mode(self): + """Test init_crew_main_trace in train mode""" + trace_context = None + + class TestCrew: + id = "test-crew-id" + _test = False + _train = True + + @init_crew_main_trace + def test_method(self): + nonlocal trace_context + trace_context = TraceContext.get_current() + return "test result" + + with patch.dict(os.environ, {"CREWAI_ENABLE_TRACING": "true"}): + crew = TestCrew() + result = test_method(crew) + assert result == "test result" + assert trace_context is not None + assert trace_context.run_type == RunType.TRAIN + + @pytest.mark.asyncio + async def test_init_flow_main_trace(self): + """Test init_flow_main_trace decorator""" + trace_context = None + test_inputs = {"test": "input"} + + class TestFlow: + flow_id = "test-flow-id" + + @init_flow_main_trace + async def test_method(self, **kwargs): + nonlocal trace_context + trace_context = TraceContext.get_current() + # Verify the context is set during execution + assert trace_context.context["context"]["inputs"] == test_inputs + return "test result" + + with patch.dict(os.environ, {"CREWAI_ENABLE_TRACING": "true"}): + flow = TestFlow() + result = await flow.test_method(inputs=test_inputs) + assert result == "test result" + assert trace_context is not None + assert trace_context.trace_type == TraceType.FLOW_STEP + assert trace_context.crew_type == CrewType.FLOW + assert trace_context.run_type == RunType.KICKOFF + assert trace_context.run_id == str(flow.flow_id) + assert trace_context.context["context"]["inputs"] == test_inputs + + def test_trace_context_management(self): + """Test TraceContext management""" + trace1 = UnifiedTraceController( + trace_type=TraceType.LLM_CALL, + run_type=RunType.KICKOFF, + crew_type=CrewType.CREW, + run_id="test-run-1", + ) + + trace2 = UnifiedTraceController( + trace_type=TraceType.FLOW_STEP, + run_type=RunType.TEST, + crew_type=CrewType.FLOW, + run_id="test-run-2", + ) + + # Test that context is initially empty + assert TraceContext.get_current() is None + + # Test setting and getting context + with TraceContext.set_current(trace1): + assert TraceContext.get_current() == trace1 + + # Test nested context + with TraceContext.set_current(trace2): + assert TraceContext.get_current() == trace2 + + # Test context restoration after nested block + assert TraceContext.get_current() == trace1 + + # Test context cleanup after with block + assert TraceContext.get_current() is None + + def test_trace_context_error_handling(self): + """Test TraceContext error handling""" + trace = UnifiedTraceController( + trace_type=TraceType.LLM_CALL, + run_type=RunType.KICKOFF, + crew_type=CrewType.CREW, + run_id="test-run", + ) + + # Test that context is properly cleaned up even if an error occurs + try: + with TraceContext.set_current(trace): + raise ValueError("Test error") + except ValueError: + pass + + assert TraceContext.get_current() is None From ba66910fbda6aea4b433d9633f60a0c38f830144 Mon Sep 17 00:00:00 2001 From: Vini Brasil Date: Wed, 19 Feb 2025 10:12:51 -0500 Subject: [PATCH 06/35] Implement `flow.state_utils.to_string` method and improve types (#2161) --- src/crewai/flow/state_utils.py | 53 +++++++++++++++++++++++++++++----- tests/flow/test_state_utils.py | 16 ++++------ 2 files changed, 51 insertions(+), 18 deletions(-) diff --git a/src/crewai/flow/state_utils.py b/src/crewai/flow/state_utils.py index 40bc81162..eaf0f21ce 100644 --- a/src/crewai/flow/state_utils.py +++ b/src/crewai/flow/state_utils.py @@ -1,12 +1,18 @@ +import json from datetime import date, datetime -from typing import Any +from typing import Any, Dict, List, Union from pydantic import BaseModel from crewai.flow import Flow +SerializablePrimitive = Union[str, int, float, bool, None] +Serializable = Union[ + SerializablePrimitive, List["Serializable"], Dict[str, "Serializable"] +] -def export_state(flow: Flow) -> dict[str, Any]: + +def export_state(flow: Flow) -> dict[str, Serializable]: """Exports the Flow's internal state as JSON-compatible data structures. Performs a one-way transformation of a Flow's state into basic Python types @@ -20,10 +26,27 @@ def export_state(flow: Flow) -> dict[str, Any]: dict[str, Any]: The transformed state using JSON-compatible Python types. """ - return _to_serializable(flow._state) + result = to_serializable(flow._state) + assert isinstance(result, dict) + return result -def _to_serializable(obj: Any, max_depth: int = 5, _current_depth: int = 0) -> Any: +def to_serializable( + obj: Any, max_depth: int = 5, _current_depth: int = 0 +) -> Serializable: + """Converts a Python object into a JSON-compatible representation. + + Supports primitives, datetime objects, collections, dictionaries, and + Pydantic models. Recursion depth is limited to prevent infinite nesting. + Non-convertible objects default to their string representations. + + Args: + obj (Any): Object to transform. + max_depth (int, optional): Maximum recursion depth. Defaults to 5. + + Returns: + Serializable: A JSON-compatible structure. + """ if _current_depth >= max_depth: return repr(obj) @@ -32,16 +55,16 @@ def _to_serializable(obj: Any, max_depth: int = 5, _current_depth: int = 0) -> A elif isinstance(obj, (date, datetime)): return obj.isoformat() elif isinstance(obj, (list, tuple, set)): - return [_to_serializable(item, max_depth, _current_depth + 1) for item in obj] + return [to_serializable(item, max_depth, _current_depth + 1) for item in obj] elif isinstance(obj, dict): return { - _to_serializable_key(key): _to_serializable( + _to_serializable_key(key): to_serializable( value, max_depth, _current_depth + 1 ) for key, value in obj.items() } elif isinstance(obj, BaseModel): - return _to_serializable(obj.model_dump(), max_depth, _current_depth + 1) + return to_serializable(obj.model_dump(), max_depth, _current_depth + 1) else: return repr(obj) @@ -50,3 +73,19 @@ def _to_serializable_key(key: Any) -> str: if isinstance(key, (str, int)): return str(key) return f"key_{id(key)}_{repr(key)}" + + +def to_string(obj: Any) -> str | None: + """Serializes an object into a JSON string. + + Args: + obj (Any): Object to serialize. + + Returns: + str | None: A JSON-formatted string or `None` if empty. + """ + serializable = to_serializable(obj) + if serializable is None: + return None + else: + return json.dumps(serializable) diff --git a/tests/flow/test_state_utils.py b/tests/flow/test_state_utils.py index 1f71cd981..1b135f36b 100644 --- a/tests/flow/test_state_utils.py +++ b/tests/flow/test_state_utils.py @@ -6,7 +6,7 @@ import pytest from pydantic import BaseModel from crewai.flow import Flow -from crewai.flow.state_utils import export_state +from crewai.flow.state_utils import export_state, to_string class Address(BaseModel): @@ -119,16 +119,10 @@ def test_pydantic_model_serialization(mock_flow): ) result = export_state(flow) - - assert result["single_model"]["street"] == "123 Main St" - - assert result["nested_model"]["name"] == "John Doe" - assert result["nested_model"]["address"]["city"] == "Tech City" - assert result["nested_model"]["birthday"] == "1994-01-01" - - assert len(result["model_list"]) == 2 - assert all(m["street"] == "123 Main St" for m in result["model_list"]) - assert result["model_dict"]["home"]["city"] == "Tech City" + assert ( + to_string(result) + == '{"single_model": {"street": "123 Main St", "city": "Tech City", "country": "Pythonia"}, "nested_model": {"name": "John Doe", "age": 30, "address": {"street": "123 Main St", "city": "Tech City", "country": "Pythonia"}, "birthday": "1994-01-01", "skills": ["Python", "Testing"]}, "model_list": [{"street": "123 Main St", "city": "Tech City", "country": "Pythonia"}, {"street": "123 Main St", "city": "Tech City", "country": "Pythonia"}], "model_dict": {"home": {"street": "123 Main St", "city": "Tech City", "country": "Pythonia"}}}' + ) def test_depth_limit(mock_flow): From 4eaa8755ebb3c71e97703d0f7edcb848b89686b2 Mon Sep 17 00:00:00 2001 From: Tony Kipkemboi Date: Wed, 19 Feb 2025 11:06:46 -0500 Subject: [PATCH 07/35] docs: update accordions and fix layout (#2110) Co-authored-by: Brandon Hancock (bhancock_ai) <109994880+bhancockio@users.noreply.github.com> --- docs/concepts/llms.mdx | 1037 ++++++++++++++++++---------------------- 1 file changed, 461 insertions(+), 576 deletions(-) diff --git a/docs/concepts/llms.mdx b/docs/concepts/llms.mdx index 117face04..12061d1a6 100644 --- a/docs/concepts/llms.mdx +++ b/docs/concepts/llms.mdx @@ -27,157 +27,6 @@ Large Language Models (LLMs) are the core intelligence behind CrewAI agents. The -## Available Models and Their Capabilities - -Here's a detailed breakdown of supported models and their capabilities, you can compare performance at [lmarena.ai](https://lmarena.ai/?leaderboard) and [artificialanalysis.ai](https://artificialanalysis.ai/): - - - - | Model | Context Window | Best For | - |-------|---------------|-----------| - | GPT-4 | 8,192 tokens | High-accuracy tasks, complex reasoning | - | GPT-4 Turbo | 128,000 tokens | Long-form content, document analysis | - | GPT-4o & GPT-4o-mini | 128,000 tokens | Cost-effective large context processing | - | o3-mini | 200,000 tokens | Fast reasoning, complex reasoning | - - - 1 token ≈ 4 characters in English. For example, 8,192 tokens ≈ 32,768 characters or about 6,000 words. - - - - | Model | Context Window | Best For | - |-------|---------------|-----------| - | nvidia/mistral-nemo-minitron-8b-8k-instruct | 8,192 tokens | State-of-the-art small language model delivering superior accuracy for chatbot, virtual assistants, and content generation. | - | nvidia/nemotron-4-mini-hindi-4b-instruct| 4,096 tokens | A bilingual Hindi-English SLM for on-device inference, tailored specifically for Hindi Language. | - | "nvidia/llama-3.1-nemotron-70b-instruct | 128k tokens | Llama-3.1-Nemotron-70B-Instruct is a large language model customized by NVIDIA in order to improve the helpfulness of LLM generated responses. | - | nvidia/llama3-chatqa-1.5-8b | 128k tokens | Advanced LLM to generate high-quality, context-aware responses for chatbots and search engines. | - | nvidia/llama3-chatqa-1.5-70b | 128k tokens | Advanced LLM to generate high-quality, context-aware responses for chatbots and search engines. | - | nvidia/vila | 128k tokens | Multi-modal vision-language model that understands text/img/video and creates informative responses | - | nvidia/neva-22| 4,096 tokens | Multi-modal vision-language model that understands text/images and generates informative responses | - | nvidia/nemotron-mini-4b-instruct | 8,192 tokens | General-purpose tasks | - | nvidia/usdcode-llama3-70b-instruct | 128k tokens | State-of-the-art LLM that answers OpenUSD knowledge queries and generates USD-Python code. | - | nvidia/nemotron-4-340b-instruct | 4,096 tokens | Creates diverse synthetic data that mimics the characteristics of real-world data. | - | meta/codellama-70b | 100k tokens | LLM capable of generating code from natural language and vice versa. | - | meta/llama2-70b | 4,096 tokens | Cutting-edge large language AI model capable of generating text and code in response to prompts. | - | meta/llama3-8b-instruct | 8,192 tokens | Advanced state-of-the-art LLM with language understanding, superior reasoning, and text generation. | - | meta/llama3-70b-instruct | 8,192 tokens | Powers complex conversations with superior contextual understanding, reasoning and text generation. | - | meta/llama-3.1-8b-instruct | 128k tokens | Advanced state-of-the-art model with language understanding, superior reasoning, and text generation. | - | meta/llama-3.1-70b-instruct | 128k tokens | Powers complex conversations with superior contextual understanding, reasoning and text generation. | - | meta/llama-3.1-405b-instruct | 128k tokens | Advanced LLM for synthetic data generation, distillation, and inference for chatbots, coding, and domain-specific tasks. | - | meta/llama-3.2-1b-instruct | 128k tokens | Advanced state-of-the-art small language model with language understanding, superior reasoning, and text generation. | - | meta/llama-3.2-3b-instruct | 128k tokens | Advanced state-of-the-art small language model with language understanding, superior reasoning, and text generation. | - | meta/llama-3.2-11b-vision-instruct | 128k tokens | Advanced state-of-the-art small language model with language understanding, superior reasoning, and text generation. | - | meta/llama-3.2-90b-vision-instruct | 128k tokens | Advanced state-of-the-art small language model with language understanding, superior reasoning, and text generation. | - | meta/llama-3.1-70b-instruct | 128k tokens | Powers complex conversations with superior contextual understanding, reasoning and text generation. | - | google/gemma-7b | 8,192 tokens | Cutting-edge text generation model text understanding, transformation, and code generation. | - | google/gemma-2b | 8,192 tokens | Cutting-edge text generation model text understanding, transformation, and code generation. | - | google/codegemma-7b | 8,192 tokens | Cutting-edge model built on Google's Gemma-7B specialized for code generation and code completion. | - | google/codegemma-1.1-7b | 8,192 tokens | Advanced programming model for code generation, completion, reasoning, and instruction following. | - | google/recurrentgemma-2b | 8,192 tokens | Novel recurrent architecture based language model for faster inference when generating long sequences. | - | google/gemma-2-9b-it | 8,192 tokens | Cutting-edge text generation model text understanding, transformation, and code generation. | - | google/gemma-2-27b-it | 8,192 tokens | Cutting-edge text generation model text understanding, transformation, and code generation. | - | google/gemma-2-2b-it | 8,192 tokens | Cutting-edge text generation model text understanding, transformation, and code generation. | - | google/deplot | 512 tokens | One-shot visual language understanding model that translates images of plots into tables. | - | google/paligemma | 8,192 tokens | Vision language model adept at comprehending text and visual inputs to produce informative responses. | - | mistralai/mistral-7b-instruct-v0.2 | 32k tokens | This LLM follows instructions, completes requests, and generates creative text. | - | mistralai/mixtral-8x7b-instruct-v0.1 | 8,192 tokens | An MOE LLM that follows instructions, completes requests, and generates creative text. | - | mistralai/mistral-large | 4,096 tokens | Creates diverse synthetic data that mimics the characteristics of real-world data. | - | mistralai/mixtral-8x22b-instruct-v0.1 | 8,192 tokens | Creates diverse synthetic data that mimics the characteristics of real-world data. | - | mistralai/mistral-7b-instruct-v0.3 | 32k tokens | This LLM follows instructions, completes requests, and generates creative text. | - | nv-mistralai/mistral-nemo-12b-instruct | 128k tokens | Most advanced language model for reasoning, code, multilingual tasks; runs on a single GPU. | - | mistralai/mamba-codestral-7b-v0.1 | 256k tokens | Model for writing and interacting with code across a wide range of programming languages and tasks. | - | microsoft/phi-3-mini-128k-instruct | 128K tokens | Lightweight, state-of-the-art open LLM with strong math and logical reasoning skills. | - | microsoft/phi-3-mini-4k-instruct | 4,096 tokens | Lightweight, state-of-the-art open LLM with strong math and logical reasoning skills. | - | microsoft/phi-3-small-8k-instruct | 8,192 tokens | Lightweight, state-of-the-art open LLM with strong math and logical reasoning skills. | - | microsoft/phi-3-small-128k-instruct | 128K tokens | Lightweight, state-of-the-art open LLM with strong math and logical reasoning skills. | - | microsoft/phi-3-medium-4k-instruct | 4,096 tokens | Lightweight, state-of-the-art open LLM with strong math and logical reasoning skills. | - | microsoft/phi-3-medium-128k-instruct | 128K tokens | Lightweight, state-of-the-art open LLM with strong math and logical reasoning skills. | - | microsoft/phi-3.5-mini-instruct | 128K tokens | Lightweight multilingual LLM powering AI applications in latency bound, memory/compute constrained environments | - | microsoft/phi-3.5-moe-instruct | 128K tokens | Advanced LLM based on Mixture of Experts architecure to deliver compute efficient content generation | - | microsoft/kosmos-2 | 1,024 tokens | Groundbreaking multimodal model designed to understand and reason about visual elements in images. | - | microsoft/phi-3-vision-128k-instruct | 128k tokens | Cutting-edge open multimodal model exceling in high-quality reasoning from images. | - | microsoft/phi-3.5-vision-instruct | 128k tokens | Cutting-edge open multimodal model exceling in high-quality reasoning from images. | - | databricks/dbrx-instruct | 12k tokens | A general-purpose LLM with state-of-the-art performance in language understanding, coding, and RAG. | - | snowflake/arctic | 1,024 tokens | Delivers high efficiency inference for enterprise applications focused on SQL generation and coding. | - | aisingapore/sea-lion-7b-instruct | 4,096 tokens | LLM to represent and serve the linguistic and cultural diversity of Southeast Asia | - | ibm/granite-8b-code-instruct | 4,096 tokens | Software programming LLM for code generation, completion, explanation, and multi-turn conversion. | - | ibm/granite-34b-code-instruct | 8,192 tokens | Software programming LLM for code generation, completion, explanation, and multi-turn conversion. | - | ibm/granite-3.0-8b-instruct | 4,096 tokens | Advanced Small Language Model supporting RAG, summarization, classification, code, and agentic AI | - | ibm/granite-3.0-3b-a800m-instruct | 4,096 tokens | Highly efficient Mixture of Experts model for RAG, summarization, entity extraction, and classification | - | mediatek/breeze-7b-instruct | 4,096 tokens | Creates diverse synthetic data that mimics the characteristics of real-world data. | - | upstage/solar-10.7b-instruct | 4,096 tokens | Excels in NLP tasks, particularly in instruction-following, reasoning, and mathematics. | - | writer/palmyra-med-70b-32k | 32k tokens | Leading LLM for accurate, contextually relevant responses in the medical domain. | - | writer/palmyra-med-70b | 32k tokens | Leading LLM for accurate, contextually relevant responses in the medical domain. | - | writer/palmyra-fin-70b-32k | 32k tokens | Specialized LLM for financial analysis, reporting, and data processing | - | 01-ai/yi-large | 32k tokens | Powerful model trained on English and Chinese for diverse tasks including chatbot and creative writing. | - | deepseek-ai/deepseek-coder-6.7b-instruct | 2k tokens | Powerful coding model offering advanced capabilities in code generation, completion, and infilling | - | rakuten/rakutenai-7b-instruct | 1,024 tokens | Advanced state-of-the-art LLM with language understanding, superior reasoning, and text generation. | - | rakuten/rakutenai-7b-chat | 1,024 tokens | Advanced state-of-the-art LLM with language understanding, superior reasoning, and text generation. | - | baichuan-inc/baichuan2-13b-chat | 4,096 tokens | Support Chinese and English chat, coding, math, instruction following, solving quizzes | - - - NVIDIA's NIM support for models is expanding continuously! For the most up-to-date list of available models, please visit build.nvidia.com. - - - - | Model | Context Window | Best For | - |-------|---------------|-----------| - | gemini-2.0-flash-exp | 1M tokens | Higher quality at faster speed, multimodal model, good for most tasks | - | gemini-1.5-flash | 1M tokens | Balanced multimodal model, good for most tasks | - | gemini-1.5-flash-8B | 1M tokens | Fastest, most cost-efficient, good for high-frequency tasks | - | gemini-1.5-pro | 2M tokens | Best performing, wide variety of reasoning tasks including logical reasoning, coding, and creative collaboration | - - - Google's Gemini models are all multimodal, supporting audio, images, video and text, supporting context caching, json schema, function calling, etc. - - These models are available via API_KEY from - [The Gemini API](https://ai.google.dev/gemini-api/docs) and also from - [Google Cloud Vertex](https://cloud.google.com/vertex-ai/generative-ai/docs/migrate/migrate-google-ai) as part of the - [Model Garden](https://cloud.google.com/vertex-ai/generative-ai/docs/model-garden/explore-models). - - - - | Model | Context Window | Best For | - |-------|---------------|-----------| - | Llama 3.1 70B/8B | 131,072 tokens | High-performance, large context tasks | - | Llama 3.2 Series | 8,192 tokens | General-purpose tasks | - | Mixtral 8x7B | 32,768 tokens | Balanced performance and context | - - - Groq is known for its fast inference speeds, making it suitable for real-time applications. - - - - | Model | Context Window | Best For | - |-------|---------------|-----------| - | Llama 3.1 70B/8B | Up to 131,072 tokens | High-performance, large context tasks | - | Llama 3.1 405B | 8,192 tokens | High-performance and output quality | - | Llama 3.2 Series | 8,192 tokens | General-purpose tasks, multimodal | - | Llama 3.3 70B | Up to 131,072 tokens | High-performance and output quality| - | Qwen2 familly | 8,192 tokens | High-performance and output quality | - - - [SambaNova](https://cloud.sambanova.ai/) has several models with fast inference speed at full precision. - - - - | Provider | Context Window | Key Features | - |----------|---------------|--------------| - | Deepseek Chat | 64,000 tokens | Specialized in technical discussions | - | Deepseek R1 | 64,000 tokens | Affordable reasoning model | - | Claude 3 | Up to 200K tokens | Strong reasoning, code understanding | - | Gemma Series | 8,192 tokens | Efficient, smaller-scale tasks | - - - Provider selection should consider factors like: - - API availability in your region - - Pricing structure - - Required features (e.g., streaming, function calling) - - Performance requirements - - - - ## Setting Up Your LLM There are three ways to configure LLMs in CrewAI. Choose the method that best fits your workflow: @@ -206,102 +55,12 @@ There are three ways to configure LLMs in CrewAI. Choose the method that best fi ```yaml researcher: - # Agent Definition role: Research Specialist goal: Conduct comprehensive research and analysis backstory: A dedicated research professional with years of experience verbose: true - - # Model Selection (uncomment your choice) - - # OpenAI Models - Known for reliability and performance - llm: openai/gpt-4o-mini - # llm: openai/gpt-4 # More accurate but expensive - # llm: openai/gpt-4-turbo # Fast with large context - # llm: openai/gpt-4o # Optimized for longer texts - # llm: openai/o1-preview # Latest features - # llm: openai/o1-mini # Cost-effective - - # Azure Models - For enterprise deployments - # llm: azure/gpt-4o-mini - # llm: azure/gpt-4 - # llm: azure/gpt-35-turbo - - # Anthropic Models - Strong reasoning capabilities - # llm: anthropic/claude-3-opus-20240229-v1:0 - # llm: anthropic/claude-3-sonnet-20240229-v1:0 - # llm: anthropic/claude-3-haiku-20240307-v1:0 - # llm: anthropic/claude-2.1 - # llm: anthropic/claude-2.0 - - # Google Models - Strong reasoning, large cachable context window, multimodal - # llm: gemini/gemini-1.5-pro-latest - # llm: gemini/gemini-1.5-flash-latest - # llm: gemini/gemini-1.5-flash-8b-latest - - # AWS Bedrock Models - Enterprise-grade - # llm: bedrock/anthropic.claude-3-sonnet-20240229-v1:0 - # llm: bedrock/anthropic.claude-v2:1 - # llm: bedrock/amazon.titan-text-express-v1 - # llm: bedrock/meta.llama2-70b-chat-v1 - - # Amazon SageMaker Models - Enterprise-grade - # llm: sagemaker/ - - # Mistral Models - Open source alternative - # llm: mistral/mistral-large-latest - # llm: mistral/mistral-medium-latest - # llm: mistral/mistral-small-latest - - # Groq Models - Fast inference - # llm: groq/mixtral-8x7b-32768 - # llm: groq/llama-3.1-70b-versatile - # llm: groq/llama-3.2-90b-text-preview - # llm: groq/gemma2-9b-it - # llm: groq/gemma-7b-it - - # IBM watsonx.ai Models - Enterprise features - # llm: watsonx/ibm/granite-13b-chat-v2 - # llm: watsonx/meta-llama/llama-3-1-70b-instruct - # llm: watsonx/bigcode/starcoder2-15b - - # Ollama Models - Local deployment - # llm: ollama/llama3:70b - # llm: ollama/codellama - # llm: ollama/mistral - # llm: ollama/mixtral - # llm: ollama/phi - - # Fireworks AI Models - Specialized tasks - # llm: fireworks_ai/accounts/fireworks/models/llama-v3-70b-instruct - # llm: fireworks_ai/accounts/fireworks/models/mixtral-8x7b - # llm: fireworks_ai/accounts/fireworks/models/zephyr-7b-beta - - # Perplexity AI Models - Research focused - # llm: pplx/llama-3.1-sonar-large-128k-online - # llm: pplx/mistral-7b-instruct - # llm: pplx/codellama-34b-instruct - # llm: pplx/mixtral-8x7b-instruct - - # Hugging Face Models - Community models - # llm: huggingface/meta-llama/Meta-Llama-3.1-8B-Instruct - # llm: huggingface/mistralai/Mixtral-8x7B-Instruct-v0.1 - # llm: huggingface/tiiuae/falcon-180B-chat - # llm: huggingface/google/gemma-7b-it - - # Nvidia NIM Models - GPU-optimized - # llm: nvidia_nim/meta/llama3-70b-instruct - # llm: nvidia_nim/mistral/mixtral-8x7b - # llm: nvidia_nim/google/gemma-7b - - # SambaNova Models - Enterprise AI - # llm: sambanova/Meta-Llama-3.1-8B-Instruct - # llm: sambanova/BioMistral-7B - # llm: sambanova/Falcon-180B - - # Open Router Models - Affordable reasoning - # llm: openrouter/deepseek/deepseek-r1 - # llm: openrouter/deepseek/deepseek-chat + llm: openai/gpt-4o-mini # your model here + # (see provider configuration examples below for more) ``` @@ -349,6 +108,465 @@ There are three ways to configure LLMs in CrewAI. Choose the method that best fi +## Provider Configuration Examples + + +CrewAI supports a multitude of LLM providers, each offering unique features, authentication methods, and model capabilities. +In this section, you'll find detailed examples that help you select, configure, and optimize the LLM that best fits your project's needs. + + + + Set the following environment variables in your `.env` file: + + ```toml Code + # Required + OPENAI_API_KEY=sk-... + + # Optional + OPENAI_API_BASE= + OPENAI_ORGANIZATION= + ``` + + Example usage in your CrewAI project: + ```python Code + from crewai import LLM + + llm = LLM( + model="openai/gpt-4", # call model by provider/model_name + temperature=0.8, + max_tokens=150, + top_p=0.9, + frequency_penalty=0.1, + presence_penalty=0.1, + stop=["END"], + seed=42 + ) + ``` + + OpenAI is one of the leading providers of LLMs with a wide range of models and features. + + | Model | Context Window | Best For | + |---------------------|------------------|-----------------------------------------------| + | GPT-4 | 8,192 tokens | High-accuracy tasks, complex reasoning | + | GPT-4 Turbo | 128,000 tokens | Long-form content, document analysis | + | GPT-4o & GPT-4o-mini | 128,000 tokens | Cost-effective large context processing | + | o3-mini | 200,000 tokens | Fast reasoning, complex reasoning | + | o1-mini | 128,000 tokens | Fast reasoning, complex reasoning | + | o1-preview | 128,000 tokens | Fast reasoning, complex reasoning | + | o1 | 200,000 tokens | Fast reasoning, complex reasoning | + + + + ```toml Code + ANTHROPIC_API_KEY=sk-ant-... + ``` + + Example usage in your CrewAI project: + ```python Code + llm = LLM( + model="anthropic/claude-3-sonnet-20240229-v1:0", + temperature=0.7 + ) + ``` + + + + Set the following environment variables in your `.env` file: + + ```toml Code + # Option 1: Gemini accessed with an API key. + # https://ai.google.dev/gemini-api/docs/api-key + GEMINI_API_KEY= + + # Option 2: Vertex AI IAM credentials for Gemini, Anthropic, and Model Garden. + # https://cloud.google.com/vertex-ai/generative-ai/docs/overview + ``` + + Get credentials from your Google Cloud Console and save it to a JSON file with the following code: + ```python Code + import json + + file_path = 'path/to/vertex_ai_service_account.json' + + # Load the JSON file + with open(file_path, 'r') as file: + vertex_credentials = json.load(file) + + # Convert the credentials to a JSON string + vertex_credentials_json = json.dumps(vertex_credentials) + ``` + + Example usage in your CrewAI project: + ```python Code + from crewai import LLM + + llm = LLM( + model="gemini/gemini-1.5-pro-latest", + temperature=0.7, + vertex_credentials=vertex_credentials_json + ) + ``` + Google offers a range of powerful models optimized for different use cases: + + | Model | Context Window | Best For | + |-----------------------|----------------|------------------------------------------------------------------| + | gemini-2.0-flash-exp | 1M tokens | Higher quality at faster speed, multimodal model, good for most tasks | + | gemini-1.5-flash | 1M tokens | Balanced multimodal model, good for most tasks | + | gemini-1.5-flash-8B | 1M tokens | Fastest, most cost-efficient, good for high-frequency tasks | + | gemini-1.5-pro | 2M tokens | Best performing, wide variety of reasoning tasks including logical reasoning, coding, and creative collaboration | + + + + ```toml Code + # Required + AZURE_API_KEY= + AZURE_API_BASE= + AZURE_API_VERSION= + + # Optional + AZURE_AD_TOKEN= + AZURE_API_TYPE= + ``` + + Example usage in your CrewAI project: + ```python Code + llm = LLM( + model="azure/gpt-4", + api_version="2023-05-15" + ) + ``` + + + + ```toml Code + AWS_ACCESS_KEY_ID= + AWS_SECRET_ACCESS_KEY= + AWS_DEFAULT_REGION= + ``` + + Example usage in your CrewAI project: + ```python Code + llm = LLM( + model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0" + ) + ``` + + + + ```toml Code + AWS_ACCESS_KEY_ID= + AWS_SECRET_ACCESS_KEY= + AWS_DEFAULT_REGION= + ``` + + Example usage in your CrewAI project: + ```python Code + llm = LLM( + model="sagemaker/" + ) + ``` + + + + Set the following environment variables in your `.env` file: + ```toml Code + MISTRAL_API_KEY= + ``` + + Example usage in your CrewAI project: + ```python Code + llm = LLM( + model="mistral/mistral-large-latest", + temperature=0.7 + ) + ``` + + + + Set the following environment variables in your `.env` file: + ```toml Code + NVIDIA_API_KEY= + ``` + + Example usage in your CrewAI project: + ```python Code + llm = LLM( + model="nvidia_nim/meta/llama3-70b-instruct", + temperature=0.7 + ) + ``` + + Nvidia NIM provides a comprehensive suite of models for various use cases, from general-purpose tasks to specialized applications. + + | Model | Context Window | Best For | + |-------------------------------------------------------------------------|----------------|-------------------------------------------------------------------| + | nvidia/mistral-nemo-minitron-8b-8k-instruct | 8,192 tokens | State-of-the-art small language model delivering superior accuracy for chatbot, virtual assistants, and content generation. | + | nvidia/nemotron-4-mini-hindi-4b-instruct | 4,096 tokens | A bilingual Hindi-English SLM for on-device inference, tailored specifically for Hindi Language. | + | nvidia/llama-3.1-nemotron-70b-instruct | 128k tokens | Customized for enhanced helpfulness in responses | + | nvidia/llama3-chatqa-1.5-8b | 128k tokens | Advanced LLM to generate high-quality, context-aware responses for chatbots and search engines. | + | nvidia/llama3-chatqa-1.5-70b | 128k tokens | Advanced LLM to generate high-quality, context-aware responses for chatbots and search engines. | + | nvidia/vila | 128k tokens | Multi-modal vision-language model that understands text/img/video and creates informative responses | + | nvidia/neva-22 | 4,096 tokens | Multi-modal vision-language model that understands text/images and generates informative responses | + | nvidia/nemotron-mini-4b-instruct | 8,192 tokens | General-purpose tasks | + | nvidia/usdcode-llama3-70b-instruct | 128k tokens | State-of-the-art LLM that answers OpenUSD knowledge queries and generates USD-Python code. | + | nvidia/nemotron-4-340b-instruct | 4,096 tokens | Creates diverse synthetic data that mimics the characteristics of real-world data. | + | meta/codellama-70b | 100k tokens | LLM capable of generating code from natural language and vice versa. | + | meta/llama2-70b | 4,096 tokens | Cutting-edge large language AI model capable of generating text and code in response to prompts. | + | meta/llama3-8b-instruct | 8,192 tokens | Advanced state-of-the-art LLM with language understanding, superior reasoning, and text generation. | + | meta/llama3-70b-instruct | 8,192 tokens | Powers complex conversations with superior contextual understanding, reasoning and text generation. | + | meta/llama-3.1-8b-instruct | 128k tokens | Advanced state-of-the-art model with language understanding, superior reasoning, and text generation. | + | meta/llama-3.1-70b-instruct | 128k tokens | Powers complex conversations with superior contextual understanding, reasoning and text generation. | + | meta/llama-3.1-405b-instruct | 128k tokens | Advanced LLM for synthetic data generation, distillation, and inference for chatbots, coding, and domain-specific tasks. | + | meta/llama-3.2-1b-instruct | 128k tokens | Advanced state-of-the-art small language model with language understanding, superior reasoning, and text generation. | + | meta/llama-3.2-3b-instruct | 128k tokens | Advanced state-of-the-art small language model with language understanding, superior reasoning, and text generation. | + | meta/llama-3.2-11b-vision-instruct | 128k tokens | Advanced state-of-the-art small language model with language understanding, superior reasoning, and text generation. | + | meta/llama-3.2-90b-vision-instruct | 128k tokens | Advanced state-of-the-art small language model with language understanding, superior reasoning, and text generation. | + | google/gemma-7b | 8,192 tokens | Cutting-edge text generation model text understanding, transformation, and code generation. | + | google/gemma-2b | 8,192 tokens | Cutting-edge text generation model text understanding, transformation, and code generation. | + | google/codegemma-7b | 8,192 tokens | Cutting-edge model built on Google's Gemma-7B specialized for code generation and code completion. | + | google/codegemma-1.1-7b | 8,192 tokens | Advanced programming model for code generation, completion, reasoning, and instruction following. | + | google/recurrentgemma-2b | 8,192 tokens | Novel recurrent architecture based language model for faster inference when generating long sequences. | + | google/gemma-2-9b-it | 8,192 tokens | Cutting-edge text generation model text understanding, transformation, and code generation. | + | google/gemma-2-27b-it | 8,192 tokens | Cutting-edge text generation model text understanding, transformation, and code generation. | + | google/gemma-2-2b-it | 8,192 tokens | Cutting-edge text generation model text understanding, transformation, and code generation. | + | google/deplot | 512 tokens | One-shot visual language understanding model that translates images of plots into tables. | + | google/paligemma | 8,192 tokens | Vision language model adept at comprehending text and visual inputs to produce informative responses. | + | mistralai/mistral-7b-instruct-v0.2 | 32k tokens | This LLM follows instructions, completes requests, and generates creative text. | + | mistralai/mixtral-8x7b-instruct-v0.1 | 8,192 tokens | An MOE LLM that follows instructions, completes requests, and generates creative text. | + | mistralai/mistral-large | 4,096 tokens | Creates diverse synthetic data that mimics the characteristics of real-world data. | + | mistralai/mixtral-8x22b-instruct-v0.1 | 8,192 tokens | Creates diverse synthetic data that mimics the characteristics of real-world data. | + | mistralai/mistral-7b-instruct-v0.3 | 32k tokens | This LLM follows instructions, completes requests, and generates creative text. | + | nv-mistralai/mistral-nemo-12b-instruct | 128k tokens | Most advanced language model for reasoning, code, multilingual tasks; runs on a single GPU. | + | mistralai/mamba-codestral-7b-v0.1 | 256k tokens | Model for writing and interacting with code across a wide range of programming languages and tasks. | + | microsoft/phi-3-mini-128k-instruct | 128K tokens | Lightweight, state-of-the-art open LLM with strong math and logical reasoning skills. | + | microsoft/phi-3-mini-4k-instruct | 4,096 tokens | Lightweight, state-of-the-art open LLM with strong math and logical reasoning skills. | + | microsoft/phi-3-small-8k-instruct | 8,192 tokens | Lightweight, state-of-the-art open LLM with strong math and logical reasoning skills. | + | microsoft/phi-3-small-128k-instruct | 128K tokens | Lightweight, state-of-the-art open LLM with strong math and logical reasoning skills. | + | microsoft/phi-3-medium-4k-instruct | 4,096 tokens | Lightweight, state-of-the-art open LLM with strong math and logical reasoning skills. | + | microsoft/phi-3-medium-128k-instruct | 128K tokens | Lightweight, state-of-the-art open LLM with strong math and logical reasoning skills. | + | microsoft/phi-3.5-mini-instruct | 128K tokens | Lightweight multilingual LLM powering AI applications in latency bound, memory/compute constrained environments | + | microsoft/phi-3.5-moe-instruct | 128K tokens | Advanced LLM based on Mixture of Experts architecure to deliver compute efficient content generation | + | microsoft/kosmos-2 | 1,024 tokens | Groundbreaking multimodal model designed to understand and reason about visual elements in images. | + | microsoft/phi-3-vision-128k-instruct | 128k tokens | Cutting-edge open multimodal model exceling in high-quality reasoning from images. | + | microsoft/phi-3.5-vision-instruct | 128k tokens | Cutting-edge open multimodal model exceling in high-quality reasoning from images. | + | databricks/dbrx-instruct | 12k tokens | A general-purpose LLM with state-of-the-art performance in language understanding, coding, and RAG. | + | snowflake/arctic | 1,024 tokens | Delivers high efficiency inference for enterprise applications focused on SQL generation and coding. | + | aisingapore/sea-lion-7b-instruct | 4,096 tokens | LLM to represent and serve the linguistic and cultural diversity of Southeast Asia | + | ibm/granite-8b-code-instruct | 4,096 tokens | Software programming LLM for code generation, completion, explanation, and multi-turn conversion. | + | ibm/granite-34b-code-instruct | 8,192 tokens | Software programming LLM for code generation, completion, explanation, and multi-turn conversion. | + | ibm/granite-3.0-8b-instruct | 4,096 tokens | Advanced Small Language Model supporting RAG, summarization, classification, code, and agentic AI | + | ibm/granite-3.0-3b-a800m-instruct | 4,096 tokens | Highly efficient Mixture of Experts model for RAG, summarization, entity extraction, and classification | + | mediatek/breeze-7b-instruct | 4,096 tokens | Creates diverse synthetic data that mimics the characteristics of real-world data. | + | upstage/solar-10.7b-instruct | 4,096 tokens | Excels in NLP tasks, particularly in instruction-following, reasoning, and mathematics. | + | writer/palmyra-med-70b-32k | 32k tokens | Leading LLM for accurate, contextually relevant responses in the medical domain. | + | writer/palmyra-med-70b | 32k tokens | Leading LLM for accurate, contextually relevant responses in the medical domain. | + | writer/palmyra-fin-70b-32k | 32k tokens | Specialized LLM for financial analysis, reporting, and data processing | + | 01-ai/yi-large | 32k tokens | Powerful model trained on English and Chinese for diverse tasks including chatbot and creative writing. | + | deepseek-ai/deepseek-coder-6.7b-instruct | 2k tokens | Powerful coding model offering advanced capabilities in code generation, completion, and infilling | + | rakuten/rakutenai-7b-instruct | 1,024 tokens | Advanced state-of-the-art LLM with language understanding, superior reasoning, and text generation. | + | rakuten/rakutenai-7b-chat | 1,024 tokens | Advanced state-of-the-art LLM with language understanding, superior reasoning, and text generation. | + | baichuan-inc/baichuan2-13b-chat | 4,096 tokens | Support Chinese and English chat, coding, math, instruction following, solving quizzes | + + + + Set the following environment variables in your `.env` file: + + ```toml Code + GROQ_API_KEY= + ``` + + Example usage in your CrewAI project: + ```python Code + llm = LLM( + model="groq/llama-3.2-90b-text-preview", + temperature=0.7 + ) + ``` + | Model | Context Window | Best For | + |-------------------|------------------|--------------------------------------------| + | Llama 3.1 70B/8B | 131,072 tokens | High-performance, large context tasks | + | Llama 3.2 Series | 8,192 tokens | General-purpose tasks | + | Mixtral 8x7B | 32,768 tokens | Balanced performance and context | + + + + Set the following environment variables in your `.env` file: + ```toml Code + # Required + WATSONX_URL= + WATSONX_APIKEY= + WATSONX_PROJECT_ID= + + # Optional + WATSONX_TOKEN= + WATSONX_DEPLOYMENT_SPACE_ID= + ``` + + Example usage in your CrewAI project: + ```python Code + llm = LLM( + model="watsonx/meta-llama/llama-3-1-70b-instruct", + base_url="https://api.watsonx.ai/v1" + ) + ``` + + + + 1. Install Ollama: [ollama.ai](https://ollama.ai/) + 2. Run a model: `ollama run llama2` + 3. Configure: + + ```python Code + llm = LLM( + model="ollama/llama3:70b", + base_url="http://localhost:11434" + ) + ``` + + + + Set the following environment variables in your `.env` file: + ```toml Code + FIREWORKS_API_KEY= + ``` + + Example usage in your CrewAI project: + ```python Code + llm = LLM( + model="fireworks_ai/accounts/fireworks/models/llama-v3-70b-instruct", + temperature=0.7 + ) + ``` + + + + Set the following environment variables in your `.env` file: + ```toml Code + PERPLEXITY_API_KEY= + ``` + + Example usage in your CrewAI project: + ```python Code + llm = LLM( + model="llama-3.1-sonar-large-128k-online", + base_url="https://api.perplexity.ai/" + ) + ``` + + + + Set the following environment variables in your `.env` file: + ```toml Code + HUGGINGFACE_API_KEY= + ``` + + Example usage in your CrewAI project: + ```python Code + llm = LLM( + model="huggingface/meta-llama/Meta-Llama-3.1-8B-Instruct", + base_url="your_api_endpoint" + ) + ``` + + + + Set the following environment variables in your `.env` file: + + ```toml Code + SAMBANOVA_API_KEY= + ``` + + Example usage in your CrewAI project: + ```python Code + llm = LLM( + model="sambanova/Meta-Llama-3.1-8B-Instruct", + temperature=0.7 + ) + ``` + | Model | Context Window | Best For | + |--------------------|------------------------|----------------------------------------------| + | Llama 3.1 70B/8B | Up to 131,072 tokens | High-performance, large context tasks | + | Llama 3.1 405B | 8,192 tokens | High-performance and output quality | + | Llama 3.2 Series | 8,192 tokens | General-purpose, multimodal tasks | + | Llama 3.3 70B | Up to 131,072 tokens | High-performance and output quality | + | Qwen2 familly | 8,192 tokens | High-performance and output quality | + + + + Set the following environment variables in your `.env` file: + ```toml Code + # Required + CEREBRAS_API_KEY= + ``` + + Example usage in your CrewAI project: + ```python Code + llm = LLM( + model="cerebras/llama3.1-70b", + temperature=0.7, + max_tokens=8192 + ) + ``` + + + Cerebras features: + - Fast inference speeds + - Competitive pricing + - Good balance of speed and quality + - Support for long context windows + + + + + Set the following environment variables in your `.env` file: + ```toml Code + OPENROUTER_API_KEY= + ``` + + Example usage in your CrewAI project: + ```python Code + llm = LLM( + model="openrouter/deepseek/deepseek-r1", + base_url="https://openrouter.ai/api/v1", + api_key=OPENROUTER_API_KEY + ) + ``` + + + Open Router models: + - openrouter/deepseek/deepseek-r1 + - openrouter/deepseek/deepseek-chat + + + + +## Structured LLM Calls + +CrewAI supports structured responses from LLM calls by allowing you to define a `response_format` using a Pydantic model. This enables the framework to automatically parse and validate the output, making it easier to integrate the response into your application without manual post-processing. + +For example, you can define a Pydantic model to represent the expected response structure and pass it as the `response_format` when instantiating the LLM. The model will then be used to convert the LLM output into a structured Python object. + +```python Code +from crewai import LLM + +class Dog(BaseModel): + name: str + age: int + breed: str + + +llm = LLM(model="gpt-4o", response_format=Dog) + +response = llm.call( + "Analyze the following messages and return the name, age, and breed. " + "Meet Kona! She is 3 years old and is a black german shepherd." +) +print(response) + +# Output: +# Dog(name='Kona', age=3, breed='black german shepherd') +``` + ## Advanced Features and Optimization Learn how to get the most out of your LLM configuration: @@ -417,339 +635,6 @@ Learn how to get the most out of your LLM configuration: -## Provider Configuration Examples - - - - ```python Code - # Required - OPENAI_API_KEY=sk-... - - # Optional - OPENAI_API_BASE= - OPENAI_ORGANIZATION= - ``` - - Example usage: - ```python Code - from crewai import LLM - - llm = LLM( - model="gpt-4", - temperature=0.8, - max_tokens=150, - top_p=0.9, - frequency_penalty=0.1, - presence_penalty=0.1, - stop=["END"], - seed=42 - ) - ``` - - - - ```python Code - ANTHROPIC_API_KEY=sk-ant-... - ``` - - Example usage: - ```python Code - llm = LLM( - model="anthropic/claude-3-sonnet-20240229-v1:0", - temperature=0.7 - ) - ``` - - - - ```python Code - # Option 1: Gemini accessed with an API key. - # https://ai.google.dev/gemini-api/docs/api-key - GEMINI_API_KEY= - - # Option 2: Vertex AI IAM credentials for Gemini, Anthropic, and Model Garden. - # https://cloud.google.com/vertex-ai/generative-ai/docs/overview - ``` - - Get credentials: - ```python Code - import json - - file_path = 'path/to/vertex_ai_service_account.json' - - # Load the JSON file - with open(file_path, 'r') as file: - vertex_credentials = json.load(file) - - # Convert the credentials to a JSON string - vertex_credentials_json = json.dumps(vertex_credentials) - ``` - - Example usage: - ```python Code - from crewai import LLM - - llm = LLM( - model="gemini/gemini-1.5-pro-latest", - temperature=0.7, - vertex_credentials=vertex_credentials_json - ) - ``` - - - - ```python Code - # Required - AZURE_API_KEY= - AZURE_API_BASE= - AZURE_API_VERSION= - - # Optional - AZURE_AD_TOKEN= - AZURE_API_TYPE= - ``` - - Example usage: - ```python Code - llm = LLM( - model="azure/gpt-4", - api_version="2023-05-15" - ) - ``` - - - - ```python Code - AWS_ACCESS_KEY_ID= - AWS_SECRET_ACCESS_KEY= - AWS_DEFAULT_REGION= - ``` - - Example usage: - ```python Code - llm = LLM( - model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0" - ) - ``` - - - - ```python Code - AWS_ACCESS_KEY_ID= - AWS_SECRET_ACCESS_KEY= - AWS_DEFAULT_REGION= - ``` - - Example usage: - ```python Code - llm = LLM( - model="sagemaker/" - ) - ``` - - - - ```python Code - MISTRAL_API_KEY= - ``` - - Example usage: - ```python Code - llm = LLM( - model="mistral/mistral-large-latest", - temperature=0.7 - ) - ``` - - - - ```python Code - NVIDIA_API_KEY= - ``` - - Example usage: - ```python Code - llm = LLM( - model="nvidia_nim/meta/llama3-70b-instruct", - temperature=0.7 - ) - ``` - - - - ```python Code - GROQ_API_KEY= - ``` - - Example usage: - ```python Code - llm = LLM( - model="groq/llama-3.2-90b-text-preview", - temperature=0.7 - ) - ``` - - - - ```python Code - # Required - WATSONX_URL= - WATSONX_APIKEY= - WATSONX_PROJECT_ID= - - # Optional - WATSONX_TOKEN= - WATSONX_DEPLOYMENT_SPACE_ID= - ``` - - Example usage: - ```python Code - llm = LLM( - model="watsonx/meta-llama/llama-3-1-70b-instruct", - base_url="https://api.watsonx.ai/v1" - ) - ``` - - - - 1. Install Ollama: [ollama.ai](https://ollama.ai/) - 2. Run a model: `ollama run llama2` - 3. Configure: - - ```python Code - llm = LLM( - model="ollama/llama3:70b", - base_url="http://localhost:11434" - ) - ``` - - - - ```python Code - FIREWORKS_API_KEY= - ``` - - Example usage: - ```python Code - llm = LLM( - model="fireworks_ai/accounts/fireworks/models/llama-v3-70b-instruct", - temperature=0.7 - ) - ``` - - - - ```python Code - PERPLEXITY_API_KEY= - ``` - - Example usage: - ```python Code - llm = LLM( - model="llama-3.1-sonar-large-128k-online", - base_url="https://api.perplexity.ai/" - ) - ``` - - - - ```python Code - HUGGINGFACE_API_KEY= - ``` - - Example usage: - ```python Code - llm = LLM( - model="huggingface/meta-llama/Meta-Llama-3.1-8B-Instruct", - base_url="your_api_endpoint" - ) - ``` - - - - ```python Code - SAMBANOVA_API_KEY= - ``` - - Example usage: - ```python Code - llm = LLM( - model="sambanova/Meta-Llama-3.1-8B-Instruct", - temperature=0.7 - ) - ``` - - - - ```python Code - # Required - CEREBRAS_API_KEY= - ``` - - Example usage: - ```python Code - llm = LLM( - model="cerebras/llama3.1-70b", - temperature=0.7, - max_tokens=8192 - ) - ``` - - - Cerebras features: - - Fast inference speeds - - Competitive pricing - - Good balance of speed and quality - - Support for long context windows - - - - - ```python Code - OPENROUTER_API_KEY= - ``` - - Example usage: - ```python Code - llm = LLM( - model="openrouter/deepseek/deepseek-r1", - base_url="https://openrouter.ai/api/v1", - api_key=OPENROUTER_API_KEY - ) - ``` - - - Open Router models: - - openrouter/deepseek/deepseek-r1 - - openrouter/deepseek/deepseek-chat - - - - -## Structured LLM Calls - -CrewAI supports structured responses from LLM calls by allowing you to define a `response_format` using a Pydantic model. This enables the framework to automatically parse and validate the output, making it easier to integrate the response into your application without manual post-processing. - -For example, you can define a Pydantic model to represent the expected response structure and pass it as the `response_format` when instantiating the LLM. The model will then be used to convert the LLM output into a structured Python object. - -```python Code -from crewai import LLM - -class Dog(BaseModel): - name: str - age: int - breed: str - - -llm = LLM(model="gpt-4o", response_format=Dog) - -response = llm.call( - "Analyze the following messages and return the name, age, and breed. " - "Meet Kona! She is 3 years old and is a black german shepherd." -) -print(response) -``` - ## Common Issues and Solutions From bcd90e26b01d1838c686c106d4fb680561f82154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Wed, 19 Feb 2025 12:54:15 -0800 Subject: [PATCH 08/35] making flow verbsoe false by default --- src/crewai/flow/persistence/decorators.py | 24 +++++++------- tests/test_flow_persistence.py | 38 ++++++++++++++++++++++- 2 files changed, 50 insertions(+), 12 deletions(-) diff --git a/src/crewai/flow/persistence/decorators.py b/src/crewai/flow/persistence/decorators.py index ebf3778b7..7b3bd447c 100644 --- a/src/crewai/flow/persistence/decorators.py +++ b/src/crewai/flow/persistence/decorators.py @@ -58,7 +58,7 @@ class PersistenceDecorator: _printer = Printer() # Class-level printer instance @classmethod - def persist_state(cls, flow_instance: Any, method_name: str, persistence_instance: FlowPersistence) -> None: + def persist_state(cls, flow_instance: Any, method_name: str, persistence_instance: FlowPersistence, verbose: bool = False) -> None: """Persist flow state with proper error handling and logging. This method handles the persistence of flow state data, including proper @@ -68,6 +68,7 @@ class PersistenceDecorator: flow_instance: The flow instance whose state to persist method_name: Name of the method that triggered persistence persistence_instance: The persistence backend to use + verbose: Whether to log persistence operations Raises: ValueError: If flow has no state or state lacks an ID @@ -88,9 +89,10 @@ class PersistenceDecorator: if not flow_uuid: raise ValueError("Flow state must have an 'id' field for persistence") - # Log state saving with consistent message - cls._printer.print(LOG_MESSAGES["save_state"].format(flow_uuid), color="cyan") - logger.info(LOG_MESSAGES["save_state"].format(flow_uuid)) + # Log state saving only if verbose is True + if verbose: + cls._printer.print(LOG_MESSAGES["save_state"].format(flow_uuid), color="cyan") + logger.info(LOG_MESSAGES["save_state"].format(flow_uuid)) try: persistence_instance.save_state( @@ -115,7 +117,7 @@ class PersistenceDecorator: raise ValueError(error_msg) from e -def persist(persistence: Optional[FlowPersistence] = None): +def persist(persistence: Optional[FlowPersistence] = None, verbose: bool = False): """Decorator to persist flow state. This decorator can be applied at either the class level or method level. @@ -126,6 +128,7 @@ def persist(persistence: Optional[FlowPersistence] = None): Args: persistence: Optional FlowPersistence implementation to use. If not provided, uses SQLiteFlowPersistence. + verbose: Whether to log persistence operations. Defaults to False. Returns: A decorator that can be applied to either a class or method @@ -135,13 +138,12 @@ def persist(persistence: Optional[FlowPersistence] = None): RuntimeError: If state persistence fails Example: - @persist # Class-level persistence with default SQLite + @persist(verbose=True) # Class-level persistence with logging class MyFlow(Flow[MyState]): @start() def begin(self): pass """ - def decorator(target: Union[Type, Callable[..., T]]) -> Union[Type, Callable[..., T]]: """Decorator that handles both class and method decoration.""" actual_persistence = persistence or SQLiteFlowPersistence() @@ -179,7 +181,7 @@ def persist(persistence: Optional[FlowPersistence] = None): @functools.wraps(original_method) async def method_wrapper(self: Any, *args: Any, **kwargs: Any) -> Any: result = await original_method(self, *args, **kwargs) - PersistenceDecorator.persist_state(self, method_name, actual_persistence) + PersistenceDecorator.persist_state(self, method_name, actual_persistence, verbose) return result return method_wrapper @@ -199,7 +201,7 @@ def persist(persistence: Optional[FlowPersistence] = None): @functools.wraps(original_method) def method_wrapper(self: Any, *args: Any, **kwargs: Any) -> Any: result = original_method(self, *args, **kwargs) - PersistenceDecorator.persist_state(self, method_name, actual_persistence) + PersistenceDecorator.persist_state(self, method_name, actual_persistence, verbose) return result return method_wrapper @@ -228,7 +230,7 @@ def persist(persistence: Optional[FlowPersistence] = None): result = await method_coro else: result = method_coro - PersistenceDecorator.persist_state(flow_instance, method.__name__, actual_persistence) + PersistenceDecorator.persist_state(flow_instance, method.__name__, actual_persistence, verbose) return result for attr in ["__is_start_method__", "__trigger_methods__", "__condition_type__", "__is_router__"]: @@ -240,7 +242,7 @@ def persist(persistence: Optional[FlowPersistence] = None): @functools.wraps(method) def method_sync_wrapper(flow_instance: Any, *args: Any, **kwargs: Any) -> T: result = method(flow_instance, *args, **kwargs) - PersistenceDecorator.persist_state(flow_instance, method.__name__, actual_persistence) + PersistenceDecorator.persist_state(flow_instance, method.__name__, actual_persistence, verbose) return result for attr in ["__is_start_method__", "__trigger_methods__", "__condition_type__", "__is_router__"]: diff --git a/tests/test_flow_persistence.py b/tests/test_flow_persistence.py index e51806b05..b6151de84 100644 --- a/tests/test_flow_persistence.py +++ b/tests/test_flow_persistence.py @@ -17,7 +17,7 @@ class TestState(FlowState): message: str = "" -def test_persist_decorator_saves_state(tmp_path): +def test_persist_decorator_saves_state(tmp_path, caplog): """Test that @persist decorator saves state in SQLite.""" db_path = os.path.join(tmp_path, "test_flows.db") persistence = SQLiteFlowPersistence(db_path) @@ -174,3 +174,39 @@ def test_multiple_method_persistence(tmp_path): final_state = flow2.state assert final_state.counter == 99999 assert final_state.message == "Step 99999" + +def test_persist_decorator_verbose_logging(tmp_path, caplog): + """Test that @persist decorator's verbose parameter controls logging.""" + db_path = os.path.join(tmp_path, "test_flows.db") + persistence = SQLiteFlowPersistence(db_path) + + # Test with verbose=False (default) + class QuietFlow(Flow[Dict[str, str]]): + initial_state = dict() + + @start() + @persist(persistence) # Default verbose=False + def init_step(self): + self.state["message"] = "Hello, World!" + self.state["id"] = "test-uuid-1" + + flow = QuietFlow(persistence=persistence) + flow.kickoff() + assert "Saving flow state to memory for ID: test-uuid-1" not in caplog.text + + # Clear the log + caplog.clear() + + # Test with verbose=True + class VerboseFlow(Flow[Dict[str, str]]): + initial_state = dict() + + @start() + @persist(persistence, verbose=True) + def init_step(self): + self.state["message"] = "Hello, World!" + self.state["id"] = "test-uuid-2" + + flow = VerboseFlow(persistence=persistence) + flow.kickoff() + assert "Saving flow state to memory for ID: test-uuid-2" in caplog.text From 00c2f5043e80be88dc3337d5e57a73358f5ca11a Mon Sep 17 00:00:00 2001 From: Lorenze Jay <63378463+lorenzejay@users.noreply.github.com> Date: Wed, 19 Feb 2025 13:52:47 -0800 Subject: [PATCH 09/35] WIP crew events emitter (#2048) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * WIP crew events emitter * Refactor event handling and introduce new event types - Migrate from global `emit` function to `event_bus.emit` - Add new event types for task failures, tool usage, and agent execution - Update event listeners and event bus to support more granular event tracking - Remove deprecated event emission methods - Improve event type consistency and add more detailed event information * Add event emission for agent execution lifecycle - Emit AgentExecutionStarted and AgentExecutionError events - Update CrewAgentExecutor to use event_bus for tracking agent execution - Refactor error handling to include event emission - Minor code formatting improvements in task.py and crew_agent_executor.py - Fix a typo in test file * Refactor event system and add third-party event listeners - Move event_bus import to correct module paths - Introduce BaseEventListener abstract base class - Add AgentOpsListener for third-party event tracking - Update event listener initialization and setup - Clean up event-related imports and exports * Enhance event system type safety and error handling - Improve type annotations for event bus and event types - Add null checks for agent and task in event emissions - Update import paths for base tool and base agent - Refactor event listener type hints - Remove unnecessary print statements - Update test configurations to match new event handling * Refactor event classes to improve type safety and naming consistency - Rename event classes to have explicit 'Event' suffix (e.g., TaskStartedEvent) - Update import statements and references across multiple files - Remove deprecated events.py module - Enhance event type hints and configurations - Clean up unnecessary event-related code * Add default model for CrewEvaluator and fix event import order - Set default model to "gpt-4o-mini" in CrewEvaluator when no model is specified - Reorder event-related imports in task.py to follow standard import conventions - Update event bus initialization method return type hint - Export event_bus in events/__init__.py * Fix tool usage and event import handling - Update tool usage to use `.get()` method when checking tool name - Remove unnecessary `__all__` export list in events/__init__.py * Refactor Flow and Agent event handling to use event_bus - Remove `event_emitter` from Flow class and replace with `event_bus.emit()` - Update Flow and Agent tests to use event_bus event listeners - Remove redundant event emissions in Flow methods - Add debug print statements in Flow execution - Simplify event tracking in test cases * Enhance event handling for Crew, Task, and Event classes - Add crew name to failed event types (CrewKickoffFailedEvent, CrewTrainFailedEvent, CrewTestFailedEvent) - Update Task events to remove redundant task and context attributes - Refactor EventListener to use Logger for consistent event logging - Add new event types for Crew train and test events - Improve event bus event tracking in test cases * Remove telemetry and tracing dependencies from Task and Flow classes - Remove telemetry-related imports and private attributes from Task class - Remove `_telemetry` attribute from Flow class - Update event handling to emit events without direct telemetry tracking - Simplify task and flow execution by removing explicit telemetry spans - Move telemetry-related event handling to EventListener * Clean up unused imports and event-related code - Remove unused imports from various event and flow-related files - Reorder event imports to follow standard conventions - Remove unnecessary event type references - Simplify import statements in event and flow modules * Update crew test to validate verbose output and kickoff_for_each method - Enhance test_crew_verbose_output to check specific listener log messages - Modify test_kickoff_for_each_invalid_input to use Pydantic validation error - Improve test coverage for crew logging and input validation * Update crew test verbose output with improved emoji icons - Replace task and agent completion icons from 👍 to ✅ - Enhance readability of test output logging - Maintain consistent test coverage for crew verbose output * Add MethodExecutionFailedEvent to handle flow method execution failures - Introduce new MethodExecutionFailedEvent in flow_events module - Update Flow class to catch and emit method execution failures - Add event listener for method execution failure events - Update event-related imports to include new event type - Enhance test coverage for method execution failure handling * Propagate method execution failures in Flow class - Modify Flow class to re-raise exceptions after emitting MethodExecutionFailedEvent - Reorder MethodExecutionFailedEvent import to maintain consistent import style * Enable test coverage for Flow method execution failure event - Uncomment pytest.raises() in test_events to verify exception handling - Ensure test validates MethodExecutionFailedEvent emission during flow kickoff * Add event handling for tool usage events - Introduce event listeners for ToolUsageFinishedEvent and ToolUsageErrorEvent - Log tool usage events with descriptive emoji icons (✅ and ❌) - Update event_listener to track and log tool usage lifecycle * Reorder and clean up event imports in event_listener - Reorganize imports for tool usage events and other event types - Maintain consistent import ordering and remove unused imports - Ensure clean and organized import structure in event_listener module * moving to dedicated eventlistener * dont forget crew level * Refactor AgentOps event listener for crew-level tracking - Modify AgentOpsListener to handle crew-level events - Initialize and end AgentOps session at crew kickoff and completion - Create agents for each crew member during session initialization - Improve session management and event recording - Clean up and simplify event handling logic * Update test_events to validate tool usage error event handling - Modify test to assert single error event with correct attributes - Use pytest.raises() to verify error event generation - Simplify error event validation in test case * Improve AgentOps listener type hints and formatting - Add string type hints for AgentOps classes to resolve potential import issues - Clean up unnecessary whitespace and improve code indentation - Simplify initialization and event handling logic * Update test_events to validate multiple tool usage events - Modify test to assert 75 events instead of a single error event - Remove pytest.raises() check, allowing crew kickoff to complete - Adjust event validation to support broader event tracking * Rename event_bus to crewai_event_bus for improved clarity and specificity - Replace all references to `event_bus` with `crewai_event_bus` - Update import statements across multiple files - Remove the old `event_bus.py` file - Maintain existing event handling functionality * Enhance EventListener with singleton pattern and color configuration - Implement singleton pattern for EventListener to ensure single instance - Add default color configuration using EMITTER_COLOR from constants - Modify log method calls to use default color and remove redundant color parameters - Improve initialization logic to prevent multiple initializations * Add FlowPlotEvent and update event bus to support flow plotting - Introduce FlowPlotEvent to track flow plotting events - Replace Telemetry method with event bus emission in Flow.plot() - Update event bus to support new FlowPlotEvent type - Add test case to validate flow plotting event emission * Remove RunType enum and clean up crew events module - Delete unused RunType enum from crew_events.py - Simplify crew_events.py by removing unnecessary enum definition - Improve code clarity by removing unneeded imports * Enhance event handling for tool usage and agent execution - Add new events for tool usage: ToolSelectionErrorEvent, ToolValidateInputErrorEvent - Improve error tracking and event emission in ToolUsage and LLM classes - Update AgentExecutionStartedEvent to use task_prompt instead of inputs - Add comprehensive test coverage for new event types and error scenarios * Refactor event system and improve crew testing - Extract base CrewEvent class to a new base_events.py module - Update event imports across multiple event-related files - Modify CrewTestStartedEvent to use eval_llm instead of openai_model_name - Add LLM creation validation in crew testing method - Improve type handling and event consistency * Refactor task events to use base CrewEvent - Move CrewEvent import from crew_events to base_events - Remove unnecessary blank lines in task_events.py - Simplify event class structure for task-related events * Update AgentExecutionStartedEvent to use task_prompt - Modify test_events.py to use task_prompt instead of inputs - Simplify event input validation in test case - Align with recent event system refactoring * Improve type hinting for TaskCompletedEvent handler - Add explicit type annotation for TaskCompletedEvent in event_listener.py - Enhance type safety for event handling in EventListener * Improve test_validate_tool_input_invalid_input with mock objects - Add explicit mock objects for agent and action in test case - Ensure proper string values for mock agent and action attributes - Simplify test setup for ToolUsage validation method * Remove ToolUsageStartedEvent emission in tool usage process - Remove unnecessary event emission for tool usage start - Simplify tool usage event handling - Eliminate redundant event data preparation step * refactor: clean up and organize imports in llm and flow modules * test: Improve flow persistence test cases and logging --- src/crewai/agent.py | 50 +- src/crewai/agents/agent_builder/base_agent.py | 5 +- src/crewai/agents/crew_agent_executor.py | 102 +- src/crewai/crew.py | 213 +- src/crewai/flow/flow.py | 126 +- src/crewai/flow/flow_events.py | 39 - .../knowledge/storage/knowledge_storage.py | 2 +- src/crewai/llm.py | 14 +- src/crewai/task.py | 189 +- src/crewai/tools/tool_usage.py | 77 +- src/crewai/tools/tool_usage_events.py | 24 - src/crewai/utilities/constants.py | 1 + .../utilities/evaluators/task_evaluator.py | 20 +- src/crewai/utilities/events.py | 44 - src/crewai/utilities/events/__init__.py | 40 + src/crewai/utilities/events/agent_events.py | 40 + .../utilities/events/base_event_listener.py | 14 + src/crewai/utilities/events/base_events.py | 10 + src/crewai/utilities/events/crew_events.py | 81 + .../utilities/events/crewai_event_bus.py | 113 + src/crewai/utilities/events/event_listener.py | 257 + src/crewai/utilities/events/event_types.py | 61 + src/crewai/utilities/events/flow_events.py | 71 + src/crewai/utilities/events/task_events.py | 32 + .../utilities/events/third_party/__init__.py | 1 + .../events/third_party/agentops_listener.py | 67 + .../utilities/events/tool_usage_events.py | 64 + src/crewai/utilities/logger.py | 5 +- tests/agent_test.py | 39 +- .../test_tool_execution_error_event.yaml | 112 + tests/crew_test.py | 63 +- tests/flow_test.py | 266 +- tests/llm_test.py | 62 +- tests/test_flow_persistence.py | 20 +- tests/tools/test_tool_usage.py | 171 +- ...xecution_started_and_completed_events.yaml | 243 + .../test_crew_emits_end_kickoff_event.yaml | 315 + .../test_crew_emits_end_task_event.yaml | 357 + .../test_crew_emits_kickoff_events.yaml | 245 + .../test_crew_emits_start_kickoff_event.yaml | 243 + .../test_crew_emits_start_task_event.yaml | 245 + .../test_crew_emits_task_failed_event.yaml | 114 + ...test_multiple_handlers_for_same_event.yaml | 111 + ...est_register_handler_adds_new_handler.yaml | 114 + ...emits_failed_event_on_execution_error.yaml | 1004 +++ .../test_tools_emits_error_events.yaml | 7984 +++++++++++++++++ .../test_tools_emits_finished_events.yaml | 512 ++ tests/utilities/test_events.py | 497 + 48 files changed, 13885 insertions(+), 594 deletions(-) delete mode 100644 src/crewai/flow/flow_events.py delete mode 100644 src/crewai/tools/tool_usage_events.py delete mode 100644 src/crewai/utilities/events.py create mode 100644 src/crewai/utilities/events/__init__.py create mode 100644 src/crewai/utilities/events/agent_events.py create mode 100644 src/crewai/utilities/events/base_event_listener.py create mode 100644 src/crewai/utilities/events/base_events.py create mode 100644 src/crewai/utilities/events/crew_events.py create mode 100644 src/crewai/utilities/events/crewai_event_bus.py create mode 100644 src/crewai/utilities/events/event_listener.py create mode 100644 src/crewai/utilities/events/event_types.py create mode 100644 src/crewai/utilities/events/flow_events.py create mode 100644 src/crewai/utilities/events/task_events.py create mode 100644 src/crewai/utilities/events/third_party/__init__.py create mode 100644 src/crewai/utilities/events/third_party/agentops_listener.py create mode 100644 src/crewai/utilities/events/tool_usage_events.py create mode 100644 tests/cassettes/test_tool_execution_error_event.yaml create mode 100644 tests/utilities/cassettes/test_agent_emits_execution_started_and_completed_events.yaml create mode 100644 tests/utilities/cassettes/test_crew_emits_end_kickoff_event.yaml create mode 100644 tests/utilities/cassettes/test_crew_emits_end_task_event.yaml create mode 100644 tests/utilities/cassettes/test_crew_emits_kickoff_events.yaml create mode 100644 tests/utilities/cassettes/test_crew_emits_start_kickoff_event.yaml create mode 100644 tests/utilities/cassettes/test_crew_emits_start_task_event.yaml create mode 100644 tests/utilities/cassettes/test_crew_emits_task_failed_event.yaml create mode 100644 tests/utilities/cassettes/test_multiple_handlers_for_same_event.yaml create mode 100644 tests/utilities/cassettes/test_register_handler_adds_new_handler.yaml create mode 100644 tests/utilities/cassettes/test_task_emits_failed_event_on_execution_error.yaml create mode 100644 tests/utilities/cassettes/test_tools_emits_error_events.yaml create mode 100644 tests/utilities/cassettes/test_tools_emits_finished_events.yaml create mode 100644 tests/utilities/test_events.py diff --git a/src/crewai/agent.py b/src/crewai/agent.py index 4c1e3c393..f07408133 100644 --- a/src/crewai/agent.py +++ b/src/crewai/agent.py @@ -19,25 +19,17 @@ from crewai.tools.agent_tools.agent_tools import AgentTools from crewai.utilities import Converter, Prompts from crewai.utilities.constants import TRAINED_AGENTS_DATA_FILE, TRAINING_DATA_FILE from crewai.utilities.converter import generate_model_description +from crewai.utilities.events.agent_events import ( + AgentExecutionCompletedEvent, + AgentExecutionErrorEvent, + AgentExecutionStartedEvent, +) +from crewai.utilities.events.crewai_event_bus import crewai_event_bus from crewai.utilities.llm_utils import create_llm from crewai.utilities.token_counter_callback import TokenCalcHandler from crewai.utilities.training_handler import CrewTrainingHandler -agentops = None -try: - import agentops # type: ignore # Name "agentops" is already defined - from agentops import track_agent # type: ignore -except ImportError: - - def track_agent(): - def noop(f): - return f - - return noop - - -@track_agent() class Agent(BaseAgent): """Represents an agent in a system. @@ -240,6 +232,15 @@ class Agent(BaseAgent): task_prompt = self._use_trained_data(task_prompt=task_prompt) try: + crewai_event_bus.emit( + self, + event=AgentExecutionStartedEvent( + agent=self, + tools=self.tools, + task_prompt=task_prompt, + task=task, + ), + ) result = self.agent_executor.invoke( { "input": task_prompt, @@ -251,9 +252,25 @@ class Agent(BaseAgent): except Exception as e: if e.__class__.__module__.startswith("litellm"): # Do not retry on litellm errors + crewai_event_bus.emit( + self, + event=AgentExecutionErrorEvent( + agent=self, + task=task, + error=str(e), + ), + ) raise e self._times_executed += 1 if self._times_executed > self.max_retry_limit: + crewai_event_bus.emit( + self, + event=AgentExecutionErrorEvent( + agent=self, + task=task, + error=str(e), + ), + ) raise e result = self.execute_task(task, context, tools) @@ -266,7 +283,10 @@ class Agent(BaseAgent): for tool_result in self.tools_results: # type: ignore # Item "None" of "list[Any] | None" has no attribute "__iter__" (not iterable) if tool_result.get("result_as_answer", False): result = tool_result["result"] - + crewai_event_bus.emit( + self, + event=AgentExecutionCompletedEvent(agent=self, task=task, output=result), + ) return result def create_agent_executor( diff --git a/src/crewai/agents/agent_builder/base_agent.py b/src/crewai/agents/agent_builder/base_agent.py index e602e42a9..64110c2ae 100644 --- a/src/crewai/agents/agent_builder/base_agent.py +++ b/src/crewai/agents/agent_builder/base_agent.py @@ -20,8 +20,7 @@ from crewai.agents.cache.cache_handler import CacheHandler from crewai.agents.tools_handler import ToolsHandler from crewai.knowledge.knowledge import Knowledge from crewai.knowledge.source.base_knowledge_source import BaseKnowledgeSource -from crewai.tools import BaseTool -from crewai.tools.base_tool import Tool +from crewai.tools.base_tool import BaseTool, Tool from crewai.utilities import I18N, Logger, RPMController from crewai.utilities.config import process_config from crewai.utilities.converter import Converter @@ -112,7 +111,7 @@ class BaseAgent(ABC, BaseModel): default=False, description="Enable agent to delegate and ask questions among each other.", ) - tools: Optional[List[Any]] = Field( + tools: Optional[List[BaseTool]] = Field( default_factory=list, description="Tools at agents' disposal" ) max_iter: int = Field( diff --git a/src/crewai/agents/crew_agent_executor.py b/src/crewai/agents/crew_agent_executor.py index ed89008fd..6d34fea4e 100644 --- a/src/crewai/agents/crew_agent_executor.py +++ b/src/crewai/agents/crew_agent_executor.py @@ -18,6 +18,12 @@ from crewai.tools.base_tool import BaseTool from crewai.tools.tool_usage import ToolUsage, ToolUsageErrorException from crewai.utilities import I18N, Printer from crewai.utilities.constants import MAX_LLM_RETRY, TRAINING_DATA_FILE +from crewai.utilities.events import ( + ToolUsageErrorEvent, + ToolUsageStartedEvent, + crewai_event_bus, +) +from crewai.utilities.events.tool_usage_events import ToolUsageStartedEvent from crewai.utilities.exceptions.context_window_exceeding_exception import ( LLMContextLengthExceededException, ) @@ -107,11 +113,11 @@ class CrewAgentExecutor(CrewAgentExecutorMixin): ) raise except Exception as e: + self._handle_unknown_error(e) if e.__class__.__module__.startswith("litellm"): # Do not retry on litellm errors raise e else: - self._handle_unknown_error(e) raise e if self.ask_for_human_input: @@ -349,40 +355,68 @@ class CrewAgentExecutor(CrewAgentExecutorMixin): ) def _execute_tool_and_check_finality(self, agent_action: AgentAction) -> ToolResult: - tool_usage = ToolUsage( - tools_handler=self.tools_handler, - tools=self.tools, - original_tools=self.original_tools, - tools_description=self.tools_description, - tools_names=self.tools_names, - function_calling_llm=self.function_calling_llm, - task=self.task, # type: ignore[arg-type] - agent=self.agent, - action=agent_action, - ) - tool_calling = tool_usage.parse_tool_calling(agent_action.text) - - if isinstance(tool_calling, ToolUsageErrorException): - tool_result = tool_calling.message - return ToolResult(result=tool_result, result_as_answer=False) - else: - if tool_calling.tool_name.casefold().strip() in [ - name.casefold().strip() for name in self.tool_name_to_tool_map - ] or tool_calling.tool_name.casefold().replace("_", " ") in [ - name.casefold().strip() for name in self.tool_name_to_tool_map - ]: - tool_result = tool_usage.use(tool_calling, agent_action.text) - tool = self.tool_name_to_tool_map.get(tool_calling.tool_name) - if tool: - return ToolResult( - result=tool_result, result_as_answer=tool.result_as_answer - ) - else: - tool_result = self._i18n.errors("wrong_tool_name").format( - tool=tool_calling.tool_name, - tools=", ".join([tool.name.casefold() for tool in self.tools]), + try: + if self.agent: + crewai_event_bus.emit( + self, + event=ToolUsageStartedEvent( + agent_key=self.agent.key, + agent_role=self.agent.role, + tool_name=agent_action.tool, + tool_args=agent_action.tool_input, + tool_class=agent_action.tool, + ), ) - return ToolResult(result=tool_result, result_as_answer=False) + tool_usage = ToolUsage( + tools_handler=self.tools_handler, + tools=self.tools, + original_tools=self.original_tools, + tools_description=self.tools_description, + tools_names=self.tools_names, + function_calling_llm=self.function_calling_llm, + task=self.task, # type: ignore[arg-type] + agent=self.agent, + action=agent_action, + ) + tool_calling = tool_usage.parse_tool_calling(agent_action.text) + + if isinstance(tool_calling, ToolUsageErrorException): + tool_result = tool_calling.message + return ToolResult(result=tool_result, result_as_answer=False) + else: + if tool_calling.tool_name.casefold().strip() in [ + name.casefold().strip() for name in self.tool_name_to_tool_map + ] or tool_calling.tool_name.casefold().replace("_", " ") in [ + name.casefold().strip() for name in self.tool_name_to_tool_map + ]: + tool_result = tool_usage.use(tool_calling, agent_action.text) + tool = self.tool_name_to_tool_map.get(tool_calling.tool_name) + if tool: + return ToolResult( + result=tool_result, result_as_answer=tool.result_as_answer + ) + else: + tool_result = self._i18n.errors("wrong_tool_name").format( + tool=tool_calling.tool_name, + tools=", ".join([tool.name.casefold() for tool in self.tools]), + ) + return ToolResult(result=tool_result, result_as_answer=False) + + except Exception as e: + # TODO: drop + if self.agent: + crewai_event_bus.emit( + self, + event=ToolUsageErrorEvent( # validation error + agent_key=self.agent.key, + agent_role=self.agent.role, + tool_name=agent_action.tool, + tool_args=agent_action.tool_input, + tool_class=agent_action.tool, + error=str(e), + ), + ) + raise e def _summarize_messages(self) -> None: messages_groups = [] diff --git a/src/crewai/crew.py b/src/crewai/crew.py index 682d5d60b..31678ae88 100644 --- a/src/crewai/crew.py +++ b/src/crewai/crew.py @@ -44,6 +44,18 @@ from crewai.utilities import I18N, FileHandler, Logger, RPMController from crewai.utilities.constants import TRAINING_DATA_FILE from crewai.utilities.evaluators.crew_evaluator_handler import CrewEvaluator from crewai.utilities.evaluators.task_evaluator import TaskEvaluator +from crewai.utilities.events.crew_events import ( + CrewKickoffCompletedEvent, + CrewKickoffFailedEvent, + CrewKickoffStartedEvent, + CrewTestCompletedEvent, + CrewTestFailedEvent, + CrewTestStartedEvent, + CrewTrainCompletedEvent, + CrewTrainFailedEvent, + CrewTrainStartedEvent, +) +from crewai.utilities.events.crewai_event_bus import crewai_event_bus from crewai.utilities.formatter import ( aggregate_raw_outputs_from_task_outputs, aggregate_raw_outputs_from_tasks, @@ -53,12 +65,6 @@ from crewai.utilities.planning_handler import CrewPlanner from crewai.utilities.task_output_storage_handler import TaskOutputStorageHandler from crewai.utilities.training_handler import CrewTrainingHandler -try: - import agentops # type: ignore -except ImportError: - agentops = None - - warnings.filterwarnings("ignore", category=SyntaxWarning, module="pysbd") @@ -522,10 +528,19 @@ class Crew(BaseModel): self, n_iterations: int, filename: str, inputs: Optional[Dict[str, Any]] = {} ) -> None: """Trains the crew for a given number of iterations.""" - train_crew = self.copy() - train_crew._setup_for_training(filename) - try: + crewai_event_bus.emit( + self, + CrewTrainStartedEvent( + crew_name=self.name or "crew", + n_iterations=n_iterations, + filename=filename, + inputs=inputs, + ), + ) + train_crew = self.copy() + train_crew._setup_for_training(filename) + for n_iteration in range(n_iterations): train_crew._train_iteration = n_iteration train_crew.kickoff(inputs=inputs) @@ -540,7 +555,20 @@ class Crew(BaseModel): CrewTrainingHandler(filename).save_trained_data( agent_id=str(agent.role), trained_data=result.model_dump() ) + + crewai_event_bus.emit( + self, + CrewTrainCompletedEvent( + crew_name=self.name or "crew", + n_iterations=n_iterations, + filename=filename, + ), + ) except Exception as e: + crewai_event_bus.emit( + self, + CrewTrainFailedEvent(error=str(e), crew_name=self.name or "crew"), + ) self._logger.log("error", f"Training failed: {e}", color="red") CrewTrainingHandler(TRAINING_DATA_FILE).clear() CrewTrainingHandler(filename).clear() @@ -551,60 +579,70 @@ class Crew(BaseModel): self, inputs: Optional[Dict[str, Any]] = None, ) -> CrewOutput: - for before_callback in self.before_kickoff_callbacks: - if inputs is None: - inputs = {} - inputs = before_callback(inputs) + try: + for before_callback in self.before_kickoff_callbacks: + if inputs is None: + inputs = {} + inputs = before_callback(inputs) - """Starts the crew to work on its assigned tasks.""" - self._execution_span = self._telemetry.crew_execution_span(self, inputs) - self._task_output_handler.reset() - self._logging_color = "bold_purple" - - if inputs is not None: - self._inputs = inputs - self._interpolate_inputs(inputs) - self._set_tasks_callbacks() - - i18n = I18N(prompt_file=self.prompt_file) - - for agent in self.agents: - agent.i18n = i18n - # type: ignore[attr-defined] # Argument 1 to "_interpolate_inputs" of "Crew" has incompatible type "dict[str, Any] | None"; expected "dict[str, Any]" - agent.crew = self # type: ignore[attr-defined] - # TODO: Create an AgentFunctionCalling protocol for future refactoring - if not agent.function_calling_llm: # type: ignore # "BaseAgent" has no attribute "function_calling_llm" - agent.function_calling_llm = self.function_calling_llm # type: ignore # "BaseAgent" has no attribute "function_calling_llm" - - if not agent.step_callback: # type: ignore # "BaseAgent" has no attribute "step_callback" - agent.step_callback = self.step_callback # type: ignore # "BaseAgent" has no attribute "step_callback" - - agent.create_agent_executor() - - if self.planning: - self._handle_crew_planning() - - metrics: List[UsageMetrics] = [] - - if self.process == Process.sequential: - result = self._run_sequential_process() - elif self.process == Process.hierarchical: - result = self._run_hierarchical_process() - else: - raise NotImplementedError( - f"The process '{self.process}' is not implemented yet." + crewai_event_bus.emit( + self, + CrewKickoffStartedEvent(crew_name=self.name or "crew", inputs=inputs), ) - for after_callback in self.after_kickoff_callbacks: - result = after_callback(result) + # Starts the crew to work on its assigned tasks. + self._task_output_handler.reset() + self._logging_color = "bold_purple" - metrics += [agent._token_process.get_summary() for agent in self.agents] + if inputs is not None: + self._inputs = inputs + self._interpolate_inputs(inputs) + self._set_tasks_callbacks() - self.usage_metrics = UsageMetrics() - for metric in metrics: - self.usage_metrics.add_usage_metrics(metric) + i18n = I18N(prompt_file=self.prompt_file) - return result + for agent in self.agents: + agent.i18n = i18n + # type: ignore[attr-defined] # Argument 1 to "_interpolate_inputs" of "Crew" has incompatible type "dict[str, Any] | None"; expected "dict[str, Any]" + agent.crew = self # type: ignore[attr-defined] + # TODO: Create an AgentFunctionCalling protocol for future refactoring + if not agent.function_calling_llm: # type: ignore # "BaseAgent" has no attribute "function_calling_llm" + agent.function_calling_llm = self.function_calling_llm # type: ignore # "BaseAgent" has no attribute "function_calling_llm" + + if not agent.step_callback: # type: ignore # "BaseAgent" has no attribute "step_callback" + agent.step_callback = self.step_callback # type: ignore # "BaseAgent" has no attribute "step_callback" + + agent.create_agent_executor() + + if self.planning: + self._handle_crew_planning() + + metrics: List[UsageMetrics] = [] + + if self.process == Process.sequential: + result = self._run_sequential_process() + elif self.process == Process.hierarchical: + result = self._run_hierarchical_process() + else: + raise NotImplementedError( + f"The process '{self.process}' is not implemented yet." + ) + + for after_callback in self.after_kickoff_callbacks: + result = after_callback(result) + + metrics += [agent._token_process.get_summary() for agent in self.agents] + + self.usage_metrics = UsageMetrics() + for metric in metrics: + self.usage_metrics.add_usage_metrics(metric) + return result + except Exception as e: + crewai_event_bus.emit( + self, + CrewKickoffFailedEvent(error=str(e), crew_name=self.name or "crew"), + ) + raise def kickoff_for_each(self, inputs: List[Dict[str, Any]]) -> List[CrewOutput]: """Executes the Crew's workflow for each input in the list and aggregates results.""" @@ -952,7 +990,12 @@ class Crew(BaseModel): final_string_output = final_task_output.raw self._finish_execution(final_string_output) token_usage = self.calculate_usage_metrics() - + crewai_event_bus.emit( + self, + CrewKickoffCompletedEvent( + crew_name=self.name or "crew", output=final_task_output + ), + ) return CrewOutput( raw=final_task_output.raw, pydantic=final_task_output.pydantic, @@ -1138,13 +1181,6 @@ class Crew(BaseModel): def _finish_execution(self, final_string_output: str) -> None: if self.max_rpm: self._rpm_controller.stop_rpm_counter() - if agentops: - agentops.end_session( - end_state="Success", - end_state_reason="Finished Execution", - is_auto_end=True, - ) - self._telemetry.end_crew(self, final_string_output) def calculate_usage_metrics(self) -> UsageMetrics: """Calculates and returns the usage metrics.""" @@ -1166,26 +1202,41 @@ class Crew(BaseModel): inputs: Optional[Dict[str, Any]] = None, ) -> None: """Test and evaluate the Crew with the given inputs for n iterations concurrently using concurrent.futures.""" - test_crew = self.copy() + try: + eval_llm = create_llm(eval_llm) + if not eval_llm: + raise ValueError("Failed to create LLM instance.") - eval_llm = create_llm(eval_llm) + crewai_event_bus.emit( + self, + CrewTestStartedEvent( + crew_name=self.name or "crew", + n_iterations=n_iterations, + eval_llm=eval_llm, + inputs=inputs, + ), + ) + test_crew = self.copy() + evaluator = CrewEvaluator(test_crew, eval_llm) # type: ignore[arg-type] - if not eval_llm: - raise ValueError("Failed to create LLM instance.") + for i in range(1, n_iterations + 1): + evaluator.set_iteration(i) + test_crew.kickoff(inputs=inputs) - self._test_execution_span = test_crew._telemetry.test_execution_span( - test_crew, - n_iterations, - inputs, - eval_llm.model, # type: ignore[arg-type] - ) # type: ignore[arg-type] - evaluator = CrewEvaluator(test_crew, eval_llm) # type: ignore[arg-type] + evaluator.print_crew_evaluation_result() - for i in range(1, n_iterations + 1): - evaluator.set_iteration(i) - test_crew.kickoff(inputs=inputs) - - evaluator.print_crew_evaluation_result() + crewai_event_bus.emit( + self, + CrewTestCompletedEvent( + crew_name=self.name or "crew", + ), + ) + except Exception as e: + crewai_event_bus.emit( + self, + CrewTestFailedEvent(error=str(e), crew_name=self.name or "crew"), + ) + raise def __repr__(self): return f"Crew(id={self.id}, process={self.process}, number_of_agents={len(self.agents)}, number_of_tasks={len(self.tasks)})" diff --git a/src/crewai/flow/flow.py b/src/crewai/flow/flow.py index f0d0b1093..2babbe57c 100644 --- a/src/crewai/flow/flow.py +++ b/src/crewai/flow/flow.py @@ -17,23 +17,25 @@ from typing import ( ) from uuid import uuid4 -from blinker import Signal from pydantic import BaseModel, Field, ValidationError -from crewai.flow.flow_events import ( - FlowFinishedEvent, - FlowStartedEvent, - MethodExecutionFinishedEvent, - MethodExecutionStartedEvent, -) from crewai.flow.flow_visualizer import plot_flow from crewai.flow.persistence.base import FlowPersistence from crewai.flow.utils import get_possible_return_constants -from crewai.telemetry import Telemetry from crewai.traces.unified_trace_controller import ( init_flow_main_trace, trace_flow_step, ) +from crewai.utilities.events.crewai_event_bus import crewai_event_bus +from crewai.utilities.events.flow_events import ( + FlowCreatedEvent, + FlowFinishedEvent, + FlowPlotEvent, + FlowStartedEvent, + MethodExecutionFailedEvent, + MethodExecutionFinishedEvent, + MethodExecutionStartedEvent, +) from crewai.utilities.printer import Printer logger = logging.getLogger(__name__) @@ -431,7 +433,6 @@ class Flow(Generic[T], metaclass=FlowMeta): Type parameter T must be either Dict[str, Any] or a subclass of BaseModel.""" - _telemetry = Telemetry() _printer = Printer() _start_methods: List[str] = [] @@ -439,7 +440,6 @@ class Flow(Generic[T], metaclass=FlowMeta): _routers: Set[str] = set() _router_paths: Dict[str, List[str]] = {} initial_state: Union[Type[T], T, None] = None - event_emitter = Signal("event_emitter") def __class_getitem__(cls: Type["Flow"], item: Type[T]) -> Type["Flow"]: class _FlowGeneric(cls): # type: ignore @@ -473,7 +473,13 @@ class Flow(Generic[T], metaclass=FlowMeta): if kwargs: self._initialize_state(kwargs) - self._telemetry.flow_creation_span(self.__class__.__name__) + crewai_event_bus.emit( + self, + FlowCreatedEvent( + type="flow_created", + flow_name=self.__class__.__name__, + ), + ) # Register all flow-related methods for method_name in dir(self): @@ -742,9 +748,9 @@ class Flow(Generic[T], metaclass=FlowMeta): self._initialize_state(filtered_inputs) # Start flow execution - self.event_emitter.send( + crewai_event_bus.emit( self, - event=FlowStartedEvent( + FlowStartedEvent( type="flow_started", flow_name=self.__class__.__name__, inputs=inputs, @@ -767,10 +773,6 @@ class Flow(Generic[T], metaclass=FlowMeta): if not self._start_methods: raise ValueError("No start method defined") - self._telemetry.flow_execution_span( - self.__class__.__name__, list(self._methods.keys()) - ) - tasks = [ self._execute_start_method(start_method) for start_method in self._start_methods @@ -779,9 +781,9 @@ class Flow(Generic[T], metaclass=FlowMeta): final_output = self._method_outputs[-1] if self._method_outputs else None - self.event_emitter.send( + crewai_event_bus.emit( self, - event=FlowFinishedEvent( + FlowFinishedEvent( type="flow_finished", flow_name=self.__class__.__name__, result=final_output, @@ -816,40 +818,55 @@ class Flow(Generic[T], metaclass=FlowMeta): async def _execute_method( self, method_name: str, method: Callable, *args: Any, **kwargs: Any ) -> Any: - dumped_params = {f"_{i}": arg for i, arg in enumerate(args)} | (kwargs or {}) - self.event_emitter.send( - self, - event=MethodExecutionStartedEvent( - type="method_execution_started", - method_name=method_name, - flow_name=self.__class__.__name__, - params=dumped_params, - state=self._copy_state(), - ), - ) + try: + dumped_params = {f"_{i}": arg for i, arg in enumerate(args)} | ( + kwargs or {} + ) + crewai_event_bus.emit( + self, + MethodExecutionStartedEvent( + type="method_execution_started", + method_name=method_name, + flow_name=self.__class__.__name__, + params=dumped_params, + state=self._copy_state(), + ), + ) - result = ( - await method(*args, **kwargs) - if asyncio.iscoroutinefunction(method) - else method(*args, **kwargs) - ) - self._method_outputs.append(result) - self._method_execution_counts[method_name] = ( - self._method_execution_counts.get(method_name, 0) + 1 - ) + result = ( + await method(*args, **kwargs) + if asyncio.iscoroutinefunction(method) + else method(*args, **kwargs) + ) - self.event_emitter.send( - self, - event=MethodExecutionFinishedEvent( - type="method_execution_finished", - method_name=method_name, - flow_name=self.__class__.__name__, - state=self._copy_state(), - result=result, - ), - ) + self._method_outputs.append(result) + self._method_execution_counts[method_name] = ( + self._method_execution_counts.get(method_name, 0) + 1 + ) - return result + crewai_event_bus.emit( + self, + MethodExecutionFinishedEvent( + type="method_execution_finished", + method_name=method_name, + flow_name=self.__class__.__name__, + state=self._copy_state(), + result=result, + ), + ) + + return result + except Exception as e: + crewai_event_bus.emit( + self, + MethodExecutionFailedEvent( + type="method_execution_failed", + method_name=method_name, + flow_name=self.__class__.__name__, + error=e, + ), + ) + raise e async def _execute_listeners(self, trigger_method: str, result: Any) -> None: """ @@ -987,6 +1004,7 @@ class Flow(Generic[T], metaclass=FlowMeta): """ try: method = self._methods[listener_name] + sig = inspect.signature(method) params = list(sig.parameters.values()) method_params = [p for p in params if p.name != "self"] @@ -1036,7 +1054,11 @@ class Flow(Generic[T], metaclass=FlowMeta): logger.warning(message) def plot(self, filename: str = "crewai_flow") -> None: - self._telemetry.flow_plotting_span( - self.__class__.__name__, list(self._methods.keys()) + crewai_event_bus.emit( + self, + FlowPlotEvent( + type="flow_plot", + flow_name=self.__class__.__name__, + ), ) plot_flow(self, filename) diff --git a/src/crewai/flow/flow_events.py b/src/crewai/flow/flow_events.py deleted file mode 100644 index c8f9e9694..000000000 --- a/src/crewai/flow/flow_events.py +++ /dev/null @@ -1,39 +0,0 @@ -from dataclasses import dataclass, field -from datetime import datetime -from typing import Any, Dict, Optional, Union - -from pydantic import BaseModel - - -@dataclass -class Event: - type: str - flow_name: str - timestamp: datetime = field(init=False) - - def __post_init__(self): - self.timestamp = datetime.now() - - -@dataclass -class FlowStartedEvent(Event): - inputs: Optional[Dict[str, Any]] = None - - -@dataclass -class MethodExecutionStartedEvent(Event): - method_name: str - state: Union[Dict[str, Any], BaseModel] - params: Optional[Dict[str, Any]] = None - - -@dataclass -class MethodExecutionFinishedEvent(Event): - method_name: str - state: Union[Dict[str, Any], BaseModel] - result: Any = None - - -@dataclass -class FlowFinishedEvent(Event): - result: Optional[Any] = None diff --git a/src/crewai/knowledge/storage/knowledge_storage.py b/src/crewai/knowledge/storage/knowledge_storage.py index 9e6ab8041..72240e2b6 100644 --- a/src/crewai/knowledge/storage/knowledge_storage.py +++ b/src/crewai/knowledge/storage/knowledge_storage.py @@ -76,7 +76,7 @@ class KnowledgeStorage(BaseKnowledgeStorage): "context": fetched["documents"][0][i], # type: ignore "score": fetched["distances"][0][i], # type: ignore } - if result["score"] >= score_threshold: # type: ignore + if result["score"] >= score_threshold: results.append(result) return results else: diff --git a/src/crewai/llm.py b/src/crewai/llm.py index 43391951e..2d8a08228 100644 --- a/src/crewai/llm.py +++ b/src/crewai/llm.py @@ -21,6 +21,8 @@ from typing import ( from dotenv import load_dotenv from pydantic import BaseModel +from crewai.utilities.events.tool_usage_events import ToolExecutionErrorEvent + with warnings.catch_warnings(): warnings.simplefilter("ignore", UserWarning) import litellm @@ -30,6 +32,7 @@ with warnings.catch_warnings(): from crewai.traces.unified_trace_controller import trace_llm_call +from crewai.utilities.events import crewai_event_bus from crewai.utilities.exceptions.context_window_exceeding_exception import ( LLMContextLengthExceededException, ) @@ -335,7 +338,7 @@ class LLM: # --- 5) Handle the tool call tool_call = tool_calls[0] function_name = tool_call.function.name - + print("function_name", function_name) if function_name in available_functions: try: function_args = json.loads(tool_call.function.arguments) @@ -353,6 +356,15 @@ class LLM: logging.error( f"Error executing function '{function_name}': {e}" ) + crewai_event_bus.emit( + self, + event=ToolExecutionErrorEvent( + tool_name=function_name, + tool_args=function_args, + tool_class=fn, + error=str(e), + ), + ) return text_response else: diff --git a/src/crewai/task.py b/src/crewai/task.py index 4088c3fb0..b9e341e33 100644 --- a/src/crewai/task.py +++ b/src/crewai/task.py @@ -21,7 +21,6 @@ from typing import ( Union, ) -from opentelemetry.trace import Span from pydantic import ( UUID4, BaseModel, @@ -36,10 +35,15 @@ from crewai.agents.agent_builder.base_agent import BaseAgent from crewai.tasks.guardrail_result import GuardrailResult from crewai.tasks.output_format import OutputFormat from crewai.tasks.task_output import TaskOutput -from crewai.telemetry.telemetry import Telemetry from crewai.tools.base_tool import BaseTool from crewai.utilities.config import process_config from crewai.utilities.converter import Converter, convert_to_model +from crewai.utilities.events import ( + TaskCompletedEvent, + TaskFailedEvent, + TaskStartedEvent, +) +from crewai.utilities.events.crewai_event_bus import crewai_event_bus from crewai.utilities.i18n import I18N from crewai.utilities.printer import Printer @@ -183,8 +187,6 @@ class Task(BaseModel): ) return v - _telemetry: Telemetry = PrivateAttr(default_factory=Telemetry) - _execution_span: Optional[Span] = PrivateAttr(default=None) _original_description: Optional[str] = PrivateAttr(default=None) _original_expected_output: Optional[str] = PrivateAttr(default=None) _original_output_file: Optional[str] = PrivateAttr(default=None) @@ -348,100 +350,102 @@ class Task(BaseModel): tools: Optional[List[Any]], ) -> TaskOutput: """Run the core execution logic of the task.""" - agent = agent or self.agent - self.agent = agent - if not agent: - raise Exception( - f"The task '{self.description}' has no agent assigned, therefore it can't be executed directly and should be executed in a Crew using a specific process that support that, like hierarchical." + try: + agent = agent or self.agent + self.agent = agent + if not agent: + raise Exception( + f"The task '{self.description}' has no agent assigned, therefore it can't be executed directly and should be executed in a Crew using a specific process that support that, like hierarchical." + ) + + self.start_time = datetime.datetime.now() + + self.prompt_context = context + tools = tools or self.tools or [] + + self.processed_by_agents.add(agent.role) + crewai_event_bus.emit(self, TaskStartedEvent(context=context)) + result = agent.execute_task( + task=self, + context=context, + tools=tools, ) - self.start_time = datetime.datetime.now() - self._execution_span = self._telemetry.task_started(crew=agent.crew, task=self) + pydantic_output, json_output = self._export_output(result) + task_output = TaskOutput( + name=self.name, + description=self.description, + expected_output=self.expected_output, + raw=result, + pydantic=pydantic_output, + json_dict=json_output, + agent=agent.role, + output_format=self._get_output_format(), + ) - self.prompt_context = context - tools = tools or self.tools or [] + if self.guardrail: + guardrail_result = GuardrailResult.from_tuple( + self.guardrail(task_output) + ) + if not guardrail_result.success: + if self.retry_count >= self.max_retries: + raise Exception( + f"Task failed guardrail validation after {self.max_retries} retries. " + f"Last error: {guardrail_result.error}" + ) - self.processed_by_agents.add(agent.role) + self.retry_count += 1 + context = self.i18n.errors("validation_error").format( + guardrail_result_error=guardrail_result.error, + task_output=task_output.raw, + ) + printer = Printer() + printer.print( + content=f"Guardrail blocked, retrying, due to: {guardrail_result.error}\n", + color="yellow", + ) + return self._execute_core(agent, context, tools) - result = agent.execute_task( - task=self, - context=context, - tools=tools, - ) - - pydantic_output, json_output = self._export_output(result) - task_output = TaskOutput( - name=self.name, - description=self.description, - expected_output=self.expected_output, - raw=result, - pydantic=pydantic_output, - json_dict=json_output, - agent=agent.role, - output_format=self._get_output_format(), - ) - - if self.guardrail: - guardrail_result = GuardrailResult.from_tuple(self.guardrail(task_output)) - if not guardrail_result.success: - if self.retry_count >= self.max_retries: + if guardrail_result.result is None: raise Exception( - f"Task failed guardrail validation after {self.max_retries} retries. " - f"Last error: {guardrail_result.error}" + "Task guardrail returned None as result. This is not allowed." ) - self.retry_count += 1 - context = self.i18n.errors("validation_error").format( - guardrail_result_error=guardrail_result.error, - task_output=task_output.raw, + if isinstance(guardrail_result.result, str): + task_output.raw = guardrail_result.result + pydantic_output, json_output = self._export_output( + guardrail_result.result + ) + task_output.pydantic = pydantic_output + task_output.json_dict = json_output + elif isinstance(guardrail_result.result, TaskOutput): + task_output = guardrail_result.result + + self.output = task_output + self.end_time = datetime.datetime.now() + + if self.callback: + self.callback(self.output) + + crew = self.agent.crew # type: ignore[union-attr] + if crew and crew.task_callback and crew.task_callback != self.callback: + crew.task_callback(self.output) + + if self.output_file: + content = ( + json_output + if json_output + else pydantic_output.model_dump_json() + if pydantic_output + else result ) - printer = Printer() - printer.print( - content=f"Guardrail blocked, retrying, due to: {guardrail_result.error}\n", - color="yellow", - ) - return self._execute_core(agent, context, tools) - - if guardrail_result.result is None: - raise Exception( - "Task guardrail returned None as result. This is not allowed." - ) - - if isinstance(guardrail_result.result, str): - task_output.raw = guardrail_result.result - pydantic_output, json_output = self._export_output( - guardrail_result.result - ) - task_output.pydantic = pydantic_output - task_output.json_dict = json_output - elif isinstance(guardrail_result.result, TaskOutput): - task_output = guardrail_result.result - - self.output = task_output - self.end_time = datetime.datetime.now() - - if self.callback: - self.callback(self.output) - - crew = self.agent.crew # type: ignore[union-attr] - if crew and crew.task_callback and crew.task_callback != self.callback: - crew.task_callback(self.output) - - if self._execution_span: - self._telemetry.task_ended(self._execution_span, self, agent.crew) - self._execution_span = None - - if self.output_file: - content = ( - json_output - if json_output - else pydantic_output.model_dump_json() - if pydantic_output - else result - ) - self._save_file(content) - - return task_output + self._save_file(content) + crewai_event_bus.emit(self, TaskCompletedEvent(output=task_output)) + return task_output + except Exception as e: + self.end_time = datetime.datetime.now() + crewai_event_bus.emit(self, TaskFailedEvent(error=str(e))) + raise e # Re-raise the exception after emitting the event def prompt(self) -> str: """Prompt the task. @@ -716,10 +720,9 @@ class Task(BaseModel): file.write(str(result)) except (OSError, IOError) as e: raise RuntimeError( - "\n".join([ - f"Failed to save output file: {e}", - FILEWRITER_RECOMMENDATION - ]) + "\n".join( + [f"Failed to save output file: {e}", FILEWRITER_RECOMMENDATION] + ) ) return None diff --git a/src/crewai/tools/tool_usage.py b/src/crewai/tools/tool_usage.py index fa821bebd..5c9333557 100644 --- a/src/crewai/tools/tool_usage.py +++ b/src/crewai/tools/tool_usage.py @@ -11,20 +11,21 @@ from typing import Any, Dict, List, Optional, Union import json5 from json_repair import repair_json -import crewai.utilities.events as events from crewai.agents.tools_handler import ToolsHandler from crewai.task import Task from crewai.telemetry import Telemetry from crewai.tools import BaseTool from crewai.tools.structured_tool import CrewStructuredTool from crewai.tools.tool_calling import InstructorToolCalling, ToolCalling -from crewai.tools.tool_usage_events import ToolUsageError, ToolUsageFinished from crewai.utilities import I18N, Converter, ConverterError, Printer +from crewai.utilities.events.crewai_event_bus import crewai_event_bus +from crewai.utilities.events.tool_usage_events import ( + ToolSelectionErrorEvent, + ToolUsageErrorEvent, + ToolUsageFinishedEvent, + ToolValidateInputErrorEvent, +) -try: - import agentops # type: ignore -except ImportError: - agentops = None OPENAI_BIGGER_MODELS = [ "gpt-4", "gpt-4o", @@ -140,7 +141,6 @@ class ToolUsage: tool: Any, calling: Union[ToolCalling, InstructorToolCalling], ) -> str: # TODO: Fix this return type - tool_event = agentops.ToolEvent(name=calling.tool_name) if agentops else None # type: ignore if self._check_tool_repeated_usage(calling=calling): # type: ignore # _check_tool_repeated_usage of "ToolUsage" does not return a value (it only ever returns None) try: result = self._i18n.errors("task_repeated_usage").format( @@ -219,10 +219,6 @@ class ToolUsage: return error # type: ignore # No return value expected self.task.increment_tools_errors() - if agentops: - agentops.record( - agentops.ErrorEvent(exception=e, trigger_event=tool_event) - ) return self.use(calling=calling, tool_string=tool_string) # type: ignore # No return value expected if self.tools_handler: @@ -238,9 +234,6 @@ class ToolUsage: self.tools_handler.on_tool_use( calling=calling, output=result, should_cache=should_cache ) - - if agentops: - agentops.record(tool_event) self._telemetry.tool_usage( llm=self.function_calling_llm, tool_name=tool.name, @@ -316,14 +309,33 @@ class ToolUsage: ): return tool self.task.increment_tools_errors() + tool_selection_data = { + "agent_key": self.agent.key, + "agent_role": self.agent.role, + "tool_name": tool_name, + "tool_args": {}, + "tool_class": self.tools_description, + } if tool_name and tool_name != "": - raise Exception( - f"Action '{tool_name}' don't exist, these are the only available Actions:\n{self.tools_description}" + error = f"Action '{tool_name}' don't exist, these are the only available Actions:\n{self.tools_description}" + crewai_event_bus.emit( + self, + ToolSelectionErrorEvent( + **tool_selection_data, + error=error, + ), ) + raise Exception(error) else: - raise Exception( - f"I forgot the Action name, these are the only available Actions: {self.tools_description}" + error = f"I forgot the Action name, these are the only available Actions: {self.tools_description}" + crewai_event_bus.emit( + self, + ToolSelectionErrorEvent( + **tool_selection_data, + error=error, + ), ) + raise Exception(error) def _render(self) -> str: """Render the tool name and description in plain text.""" @@ -459,18 +471,33 @@ class ToolUsage: if isinstance(arguments, dict): return arguments except Exception as e: - self._printer.print(content=f"Failed to repair JSON: {e}", color="red") + error = f"Failed to repair JSON: {e}" + self._printer.print(content=error, color="red") - # If all parsing attempts fail, raise an error - raise Exception( + error_message = ( "Tool input must be a valid dictionary in JSON or Python literal format" ) + self._emit_validate_input_error(error_message) + # If all parsing attempts fail, raise an error + raise Exception(error_message) + + def _emit_validate_input_error(self, final_error: str): + tool_selection_data = { + "agent_key": self.agent.key, + "agent_role": self.agent.role, + "tool_name": self.action.tool, + "tool_args": str(self.action.tool_input), + "tool_class": self.__class__.__name__, + } + + crewai_event_bus.emit( + self, + ToolValidateInputErrorEvent(**tool_selection_data, error=final_error), + ) def on_tool_error(self, tool: Any, tool_calling: ToolCalling, e: Exception) -> None: event_data = self._prepare_event_data(tool, tool_calling) - events.emit( - source=self, event=ToolUsageError(**{**event_data, "error": str(e)}) - ) + crewai_event_bus.emit(self, ToolUsageErrorEvent(**{**event_data, "error": e})) def on_tool_use_finished( self, tool: Any, tool_calling: ToolCalling, from_cache: bool, started_at: float @@ -484,7 +511,7 @@ class ToolUsage: "from_cache": from_cache, } ) - events.emit(source=self, event=ToolUsageFinished(**event_data)) + crewai_event_bus.emit(self, ToolUsageFinishedEvent(**event_data)) def _prepare_event_data(self, tool: Any, tool_calling: ToolCalling) -> dict: return { diff --git a/src/crewai/tools/tool_usage_events.py b/src/crewai/tools/tool_usage_events.py deleted file mode 100644 index 3c1d16113..000000000 --- a/src/crewai/tools/tool_usage_events.py +++ /dev/null @@ -1,24 +0,0 @@ -from datetime import datetime -from typing import Any, Dict - -from pydantic import BaseModel - - -class ToolUsageEvent(BaseModel): - agent_key: str - agent_role: str - tool_name: str - tool_args: Dict[str, Any] - tool_class: str - run_attempts: int | None = None - delegations: int | None = None - - -class ToolUsageFinished(ToolUsageEvent): - started_at: datetime - finished_at: datetime - from_cache: bool = False - - -class ToolUsageError(ToolUsageEvent): - error: str diff --git a/src/crewai/utilities/constants.py b/src/crewai/utilities/constants.py index 096bb7c8c..9ff10f1d4 100644 --- a/src/crewai/utilities/constants.py +++ b/src/crewai/utilities/constants.py @@ -4,3 +4,4 @@ DEFAULT_SCORE_THRESHOLD = 0.35 KNOWLEDGE_DIRECTORY = "knowledge" MAX_LLM_RETRY = 3 MAX_FILE_NAME_LENGTH = 255 +EMITTER_COLOR = "bold_blue" diff --git a/src/crewai/utilities/evaluators/task_evaluator.py b/src/crewai/utilities/evaluators/task_evaluator.py index 294629274..2e9907bd7 100644 --- a/src/crewai/utilities/evaluators/task_evaluator.py +++ b/src/crewai/utilities/evaluators/task_evaluator.py @@ -3,19 +3,9 @@ from typing import List from pydantic import BaseModel, Field from crewai.utilities import Converter +from crewai.utilities.events import TaskEvaluationEvent, crewai_event_bus from crewai.utilities.pydantic_schema_parser import PydanticSchemaParser -agentops = None -try: - from agentops import track_agent # type: ignore -except ImportError: - - def track_agent(name): - def noop(f): - return f - - return noop - class Entity(BaseModel): name: str = Field(description="The name of the entity.") @@ -48,12 +38,15 @@ class TrainingTaskEvaluation(BaseModel): ) -@track_agent(name="Task Evaluator") class TaskEvaluator: def __init__(self, original_agent): self.llm = original_agent.llm + self.original_agent = original_agent def evaluate(self, task, output) -> TaskEvaluation: + crewai_event_bus.emit( + self, TaskEvaluationEvent(evaluation_type="task_evaluation") + ) evaluation_query = ( f"Assess the quality of the task completed based on the description, expected output, and actual results.\n\n" f"Task Description:\n{task.description}\n\n" @@ -90,6 +83,9 @@ class TaskEvaluator: - training_data (dict): The training data to be evaluated. - agent_id (str): The ID of the agent. """ + crewai_event_bus.emit( + self, TaskEvaluationEvent(evaluation_type="training_data_evaluation") + ) output_training_data = training_data[agent_id] final_aggregated_data = "" diff --git a/src/crewai/utilities/events.py b/src/crewai/utilities/events.py deleted file mode 100644 index 11175e0d2..000000000 --- a/src/crewai/utilities/events.py +++ /dev/null @@ -1,44 +0,0 @@ -from functools import wraps -from typing import Any, Callable, Dict, Generic, List, Type, TypeVar - -from pydantic import BaseModel - -T = TypeVar("T") -EVT = TypeVar("EVT", bound=BaseModel) - - -class Emitter(Generic[T, EVT]): - _listeners: Dict[Type[EVT], List[Callable]] = {} - - def on(self, event_type: Type[EVT]): - def decorator(func: Callable): - @wraps(func) - def wrapper(*args, **kwargs): - return func(*args, **kwargs) - - self._listeners.setdefault(event_type, []).append(wrapper) - return wrapper - - return decorator - - def emit(self, source: T, event: EVT) -> None: - event_type = type(event) - for func in self._listeners.get(event_type, []): - func(source, event) - - -default_emitter = Emitter[Any, BaseModel]() - - -def emit(source: Any, event: BaseModel, raise_on_error: bool = False) -> None: - try: - default_emitter.emit(source, event) - except Exception as e: - if raise_on_error: - raise e - else: - print(f"Error emitting event: {e}") - - -def on(event_type: Type[BaseModel]) -> Callable: - return default_emitter.on(event_type) diff --git a/src/crewai/utilities/events/__init__.py b/src/crewai/utilities/events/__init__.py new file mode 100644 index 000000000..7f3442360 --- /dev/null +++ b/src/crewai/utilities/events/__init__.py @@ -0,0 +1,40 @@ +from .crew_events import ( + CrewKickoffStartedEvent, + CrewKickoffCompletedEvent, + CrewKickoffFailedEvent, + CrewTrainStartedEvent, + CrewTrainCompletedEvent, + CrewTrainFailedEvent, + CrewTestStartedEvent, + CrewTestCompletedEvent, + CrewTestFailedEvent, +) +from .agent_events import ( + AgentExecutionStartedEvent, + AgentExecutionCompletedEvent, + AgentExecutionErrorEvent, +) +from .task_events import TaskStartedEvent, TaskCompletedEvent, TaskFailedEvent, TaskEvaluationEvent +from .flow_events import ( + FlowCreatedEvent, + FlowStartedEvent, + FlowFinishedEvent, + FlowPlotEvent, + MethodExecutionStartedEvent, + MethodExecutionFinishedEvent, + MethodExecutionFailedEvent, +) +from .crewai_event_bus import CrewAIEventsBus, crewai_event_bus +from .tool_usage_events import ( + ToolUsageFinishedEvent, + ToolUsageErrorEvent, + ToolUsageStartedEvent, + ToolExecutionErrorEvent, + ToolSelectionErrorEvent, + ToolUsageEvent, + ToolValidateInputErrorEvent, +) + +# events +from .event_listener import EventListener +from .third_party.agentops_listener import agentops_listener diff --git a/src/crewai/utilities/events/agent_events.py b/src/crewai/utilities/events/agent_events.py new file mode 100644 index 000000000..ed0480957 --- /dev/null +++ b/src/crewai/utilities/events/agent_events.py @@ -0,0 +1,40 @@ +from typing import TYPE_CHECKING, Any, Dict, Optional, Sequence, Union + +from crewai.agents.agent_builder.base_agent import BaseAgent +from crewai.tools.base_tool import BaseTool +from crewai.tools.structured_tool import CrewStructuredTool + +from .base_events import CrewEvent + +if TYPE_CHECKING: + from crewai.agents.agent_builder.base_agent import BaseAgent + + +class AgentExecutionStartedEvent(CrewEvent): + """Event emitted when an agent starts executing a task""" + + agent: BaseAgent + task: Any + tools: Optional[Sequence[Union[BaseTool, CrewStructuredTool]]] + task_prompt: str + type: str = "agent_execution_started" + + model_config = {"arbitrary_types_allowed": True} + + +class AgentExecutionCompletedEvent(CrewEvent): + """Event emitted when an agent completes executing a task""" + + agent: BaseAgent + task: Any + output: str + type: str = "agent_execution_completed" + + +class AgentExecutionErrorEvent(CrewEvent): + """Event emitted when an agent encounters an error during execution""" + + agent: BaseAgent + task: Any + error: str + type: str = "agent_execution_error" diff --git a/src/crewai/utilities/events/base_event_listener.py b/src/crewai/utilities/events/base_event_listener.py new file mode 100644 index 000000000..37763dcc1 --- /dev/null +++ b/src/crewai/utilities/events/base_event_listener.py @@ -0,0 +1,14 @@ +from abc import ABC, abstractmethod +from logging import Logger + +from crewai.utilities.events.crewai_event_bus import CrewAIEventsBus, crewai_event_bus + + +class BaseEventListener(ABC): + def __init__(self): + super().__init__() + self.setup_listeners(crewai_event_bus) + + @abstractmethod + def setup_listeners(self, crewai_event_bus: CrewAIEventsBus): + pass diff --git a/src/crewai/utilities/events/base_events.py b/src/crewai/utilities/events/base_events.py new file mode 100644 index 000000000..b29ae6fb6 --- /dev/null +++ b/src/crewai/utilities/events/base_events.py @@ -0,0 +1,10 @@ +from datetime import datetime + +from pydantic import BaseModel, Field + + +class CrewEvent(BaseModel): + """Base class for all crew events""" + + timestamp: datetime = Field(default_factory=datetime.now) + type: str diff --git a/src/crewai/utilities/events/crew_events.py b/src/crewai/utilities/events/crew_events.py new file mode 100644 index 000000000..13dfd8e34 --- /dev/null +++ b/src/crewai/utilities/events/crew_events.py @@ -0,0 +1,81 @@ +from typing import Any, Dict, Optional, Union + +from pydantic import InstanceOf + +from crewai.utilities.events.base_events import CrewEvent + + +class CrewKickoffStartedEvent(CrewEvent): + """Event emitted when a crew starts execution""" + + crew_name: Optional[str] + inputs: Optional[Dict[str, Any]] + type: str = "crew_kickoff_started" + + +class CrewKickoffCompletedEvent(CrewEvent): + """Event emitted when a crew completes execution""" + + crew_name: Optional[str] + output: Any + type: str = "crew_kickoff_completed" + + +class CrewKickoffFailedEvent(CrewEvent): + """Event emitted when a crew fails to complete execution""" + + error: str + crew_name: Optional[str] + type: str = "crew_kickoff_failed" + + +class CrewTrainStartedEvent(CrewEvent): + """Event emitted when a crew starts training""" + + crew_name: Optional[str] + n_iterations: int + filename: str + inputs: Optional[Dict[str, Any]] + type: str = "crew_train_started" + + +class CrewTrainCompletedEvent(CrewEvent): + """Event emitted when a crew completes training""" + + crew_name: Optional[str] + n_iterations: int + filename: str + type: str = "crew_train_completed" + + +class CrewTrainFailedEvent(CrewEvent): + """Event emitted when a crew fails to complete training""" + + error: str + crew_name: Optional[str] + type: str = "crew_train_failed" + + +class CrewTestStartedEvent(CrewEvent): + """Event emitted when a crew starts testing""" + + crew_name: Optional[str] + n_iterations: int + eval_llm: Optional[Union[str, Any]] + inputs: Optional[Dict[str, Any]] + type: str = "crew_test_started" + + +class CrewTestCompletedEvent(CrewEvent): + """Event emitted when a crew completes testing""" + + crew_name: Optional[str] + type: str = "crew_test_completed" + + +class CrewTestFailedEvent(CrewEvent): + """Event emitted when a crew fails to complete testing""" + + error: str + crew_name: Optional[str] + type: str = "crew_test_failed" diff --git a/src/crewai/utilities/events/crewai_event_bus.py b/src/crewai/utilities/events/crewai_event_bus.py new file mode 100644 index 000000000..c0cf50908 --- /dev/null +++ b/src/crewai/utilities/events/crewai_event_bus.py @@ -0,0 +1,113 @@ +import threading +from contextlib import contextmanager +from typing import Any, Callable, Dict, List, Type, TypeVar, cast + +from blinker import Signal + +from crewai.utilities.events.base_events import CrewEvent +from crewai.utilities.events.event_types import EventTypes + +EventT = TypeVar("EventT", bound=CrewEvent) + + +class CrewAIEventsBus: + """ + A singleton event bus that uses blinker signals for event handling. + Allows both internal (Flow/Crew) and external event handling. + """ + + _instance = None + _lock = threading.Lock() + + def __new__(cls): + if cls._instance is None: + with cls._lock: + if cls._instance is None: # prevent race condition + cls._instance = super(CrewAIEventsBus, cls).__new__(cls) + cls._instance._initialize() + return cls._instance + + def _initialize(self) -> None: + """Initialize the event bus internal state""" + self._signal = Signal("crewai_event_bus") + self._handlers: Dict[Type[CrewEvent], List[Callable]] = {} + + def on( + self, event_type: Type[EventT] + ) -> Callable[[Callable[[Any, EventT], None]], Callable[[Any, EventT], None]]: + """ + Decorator to register an event handler for a specific event type. + + Usage: + @crewai_event_bus.on(AgentExecutionCompletedEvent) + def on_agent_execution_completed( + source: Any, event: AgentExecutionCompletedEvent + ): + print(f"👍 Agent '{event.agent}' completed task") + print(f" Output: {event.output}") + """ + + def decorator( + handler: Callable[[Any, EventT], None], + ) -> Callable[[Any, EventT], None]: + if event_type not in self._handlers: + self._handlers[event_type] = [] + self._handlers[event_type].append( + cast(Callable[[Any, EventT], None], handler) + ) + return handler + + return decorator + + def emit(self, source: Any, event: CrewEvent) -> None: + """ + Emit an event to all registered handlers + + Args: + source: The object emitting the event + event: The event instance to emit + """ + event_type = type(event) + if event_type in self._handlers: + for handler in self._handlers[event_type]: + handler(source, event) + self._signal.send(source, event=event) + + def clear_handlers(self) -> None: + """Clear all registered event handlers - useful for testing""" + self._handlers.clear() + + def register_handler( + self, event_type: Type[EventTypes], handler: Callable[[Any, EventTypes], None] + ) -> None: + """Register an event handler for a specific event type""" + if event_type not in self._handlers: + self._handlers[event_type] = [] + self._handlers[event_type].append( + cast(Callable[[Any, EventTypes], None], handler) + ) + + @contextmanager + def scoped_handlers(self): + """ + Context manager for temporary event handling scope. + Useful for testing or temporary event handling. + + Usage: + with crewai_event_bus.scoped_handlers(): + @crewai_event_bus.on(CrewKickoffStarted) + def temp_handler(source, event): + print("Temporary handler") + # Do stuff... + # Handlers are cleared after the context + """ + previous_handlers = self._handlers.copy() + self._handlers.clear() + try: + yield + finally: + self._handlers = previous_handlers + + +# Global instance +crewai_event_bus = CrewAIEventsBus() diff --git a/src/crewai/utilities/events/event_listener.py b/src/crewai/utilities/events/event_listener.py new file mode 100644 index 000000000..0dcefcd3d --- /dev/null +++ b/src/crewai/utilities/events/event_listener.py @@ -0,0 +1,257 @@ +from pydantic import PrivateAttr + +from crewai.telemetry.telemetry import Telemetry +from crewai.utilities import Logger +from crewai.utilities.constants import EMITTER_COLOR +from crewai.utilities.events.base_event_listener import BaseEventListener + +from .agent_events import AgentExecutionCompletedEvent, AgentExecutionStartedEvent +from .crew_events import ( + CrewKickoffCompletedEvent, + CrewKickoffFailedEvent, + CrewKickoffStartedEvent, + CrewTestCompletedEvent, + CrewTestFailedEvent, + CrewTestStartedEvent, + CrewTrainCompletedEvent, + CrewTrainFailedEvent, + CrewTrainStartedEvent, +) +from .flow_events import ( + FlowCreatedEvent, + FlowFinishedEvent, + FlowStartedEvent, + MethodExecutionFailedEvent, + MethodExecutionFinishedEvent, + MethodExecutionStartedEvent, +) +from .task_events import TaskCompletedEvent, TaskFailedEvent, TaskStartedEvent +from .tool_usage_events import ( + ToolUsageErrorEvent, + ToolUsageFinishedEvent, + ToolUsageStartedEvent, +) + + +class EventListener(BaseEventListener): + _instance = None + _telemetry: Telemetry = PrivateAttr(default_factory=lambda: Telemetry()) + logger = Logger(verbose=True, default_color=EMITTER_COLOR) + + def __new__(cls): + if cls._instance is None: + cls._instance = super().__new__(cls) + cls._instance._initialized = False + return cls._instance + + def __init__(self): + if not hasattr(self, "_initialized") or not self._initialized: + super().__init__() + self._telemetry = Telemetry() + self._telemetry.set_tracer() + self._initialized = True + + # ----------- CREW EVENTS ----------- + + def setup_listeners(self, crewai_event_bus): + @crewai_event_bus.on(CrewKickoffStartedEvent) + def on_crew_started(source, event: CrewKickoffStartedEvent): + self.logger.log( + f"🚀 Crew '{event.crew_name}' started", + event.timestamp, + ) + self._telemetry.crew_execution_span(source, event.inputs) + + @crewai_event_bus.on(CrewKickoffCompletedEvent) + def on_crew_completed(source, event: CrewKickoffCompletedEvent): + final_string_output = event.output.raw + self._telemetry.end_crew(source, final_string_output) + self.logger.log( + f"✅ Crew '{event.crew_name}' completed", + event.timestamp, + ) + + @crewai_event_bus.on(CrewKickoffFailedEvent) + def on_crew_failed(source, event: CrewKickoffFailedEvent): + self.logger.log( + f"❌ Crew '{event.crew_name}' failed", + event.timestamp, + ) + + @crewai_event_bus.on(CrewTestStartedEvent) + def on_crew_test_started(source, event: CrewTestStartedEvent): + cloned_crew = source.copy() + cloned_crew._telemetry.test_execution_span( + cloned_crew, + event.n_iterations, + event.inputs, + event.eval_llm, + ) + self.logger.log( + f"🚀 Crew '{event.crew_name}' started test", + event.timestamp, + ) + + @crewai_event_bus.on(CrewTestCompletedEvent) + def on_crew_test_completed(source, event: CrewTestCompletedEvent): + self.logger.log( + f"✅ Crew '{event.crew_name}' completed test", + event.timestamp, + ) + + @crewai_event_bus.on(CrewTestFailedEvent) + def on_crew_test_failed(source, event: CrewTestFailedEvent): + self.logger.log( + f"❌ Crew '{event.crew_name}' failed test", + event.timestamp, + ) + + @crewai_event_bus.on(CrewTrainStartedEvent) + def on_crew_train_started(source, event: CrewTrainStartedEvent): + self.logger.log( + f"📋 Crew '{event.crew_name}' started train", + event.timestamp, + ) + + @crewai_event_bus.on(CrewTrainCompletedEvent) + def on_crew_train_completed(source, event: CrewTrainCompletedEvent): + self.logger.log( + f"✅ Crew '{event.crew_name}' completed train", + event.timestamp, + ) + + @crewai_event_bus.on(CrewTrainFailedEvent) + def on_crew_train_failed(source, event: CrewTrainFailedEvent): + self.logger.log( + f"❌ Crew '{event.crew_name}' failed train", + event.timestamp, + ) + + # ----------- TASK EVENTS ----------- + + @crewai_event_bus.on(TaskStartedEvent) + def on_task_started(source, event: TaskStartedEvent): + source._execution_span = self._telemetry.task_started( + crew=source.agent.crew, task=source + ) + self.logger.log( + f"📋 Task started: {source.description}", + event.timestamp, + ) + + @crewai_event_bus.on(TaskCompletedEvent) + def on_task_completed(source, event: TaskCompletedEvent): + if source._execution_span: + self._telemetry.task_ended( + source._execution_span, source, source.agent.crew + ) + self.logger.log( + f"✅ Task completed: {source.description}", + event.timestamp, + ) + source._execution_span = None + + @crewai_event_bus.on(TaskFailedEvent) + def on_task_failed(source, event: TaskFailedEvent): + if source._execution_span: + if source.agent and source.agent.crew: + self._telemetry.task_ended( + source._execution_span, source, source.agent.crew + ) + source._execution_span = None + self.logger.log( + f"❌ Task failed: {source.description}", + event.timestamp, + ) + + # ----------- AGENT EVENTS ----------- + + @crewai_event_bus.on(AgentExecutionStartedEvent) + def on_agent_execution_started(source, event: AgentExecutionStartedEvent): + self.logger.log( + f"🤖 Agent '{event.agent.role}' started task", + event.timestamp, + ) + + @crewai_event_bus.on(AgentExecutionCompletedEvent) + def on_agent_execution_completed(source, event: AgentExecutionCompletedEvent): + self.logger.log( + f"✅ Agent '{event.agent.role}' completed task", + event.timestamp, + ) + + # ----------- FLOW EVENTS ----------- + + @crewai_event_bus.on(FlowCreatedEvent) + def on_flow_created(source, event: FlowCreatedEvent): + self._telemetry.flow_creation_span(self.__class__.__name__) + self.logger.log( + f"🌊 Flow Created: '{event.flow_name}'", + event.timestamp, + ) + + @crewai_event_bus.on(FlowStartedEvent) + def on_flow_started(source, event: FlowStartedEvent): + self._telemetry.flow_execution_span( + source.__class__.__name__, list(source._methods.keys()) + ) + self.logger.log( + f"🤖 Flow Started: '{event.flow_name}'", + event.timestamp, + ) + + @crewai_event_bus.on(FlowFinishedEvent) + def on_flow_finished(source, event: FlowFinishedEvent): + self.logger.log( + f"👍 Flow Finished: '{event.flow_name}'", + event.timestamp, + ) + + @crewai_event_bus.on(MethodExecutionStartedEvent) + def on_method_execution_started(source, event: MethodExecutionStartedEvent): + self.logger.log( + f"🤖 Flow Method Started: '{event.method_name}'", + event.timestamp, + ) + + @crewai_event_bus.on(MethodExecutionFailedEvent) + def on_method_execution_failed(source, event: MethodExecutionFailedEvent): + self.logger.log( + f"❌ Flow Method Failed: '{event.method_name}'", + event.timestamp, + ) + + @crewai_event_bus.on(MethodExecutionFinishedEvent) + def on_method_execution_finished(source, event: MethodExecutionFinishedEvent): + self.logger.log( + f"👍 Flow Method Finished: '{event.method_name}'", + event.timestamp, + ) + + # ----------- TOOL USAGE EVENTS ----------- + + @crewai_event_bus.on(ToolUsageStartedEvent) + def on_tool_usage_started(source, event: ToolUsageStartedEvent): + self.logger.log( + f"🤖 Tool Usage Started: '{event.tool_name}'", + event.timestamp, + ) + + @crewai_event_bus.on(ToolUsageFinishedEvent) + def on_tool_usage_finished(source, event: ToolUsageFinishedEvent): + self.logger.log( + f"✅ Tool Usage Finished: '{event.tool_name}'", + event.timestamp, + # + ) + + @crewai_event_bus.on(ToolUsageErrorEvent) + def on_tool_usage_error(source, event: ToolUsageErrorEvent): + self.logger.log( + f"❌ Tool Usage Error: '{event.tool_name}'", + event.timestamp, + # + ) + + +event_listener = EventListener() diff --git a/src/crewai/utilities/events/event_types.py b/src/crewai/utilities/events/event_types.py new file mode 100644 index 000000000..81caf17f4 --- /dev/null +++ b/src/crewai/utilities/events/event_types.py @@ -0,0 +1,61 @@ +from typing import Union + +from .agent_events import ( + AgentExecutionCompletedEvent, + AgentExecutionErrorEvent, + AgentExecutionStartedEvent, +) +from .crew_events import ( + CrewKickoffCompletedEvent, + CrewKickoffFailedEvent, + CrewKickoffStartedEvent, + CrewTestCompletedEvent, + CrewTestFailedEvent, + CrewTestStartedEvent, + CrewTrainCompletedEvent, + CrewTrainFailedEvent, + CrewTrainStartedEvent, +) +from .flow_events import ( + FlowFinishedEvent, + FlowStartedEvent, + MethodExecutionFailedEvent, + MethodExecutionFinishedEvent, + MethodExecutionStartedEvent, +) +from .task_events import ( + TaskCompletedEvent, + TaskFailedEvent, + TaskStartedEvent, +) +from .tool_usage_events import ( + ToolUsageErrorEvent, + ToolUsageFinishedEvent, + ToolUsageStartedEvent, +) + +EventTypes = Union[ + CrewKickoffStartedEvent, + CrewKickoffCompletedEvent, + CrewKickoffFailedEvent, + CrewTestStartedEvent, + CrewTestCompletedEvent, + CrewTestFailedEvent, + CrewTrainStartedEvent, + CrewTrainCompletedEvent, + CrewTrainFailedEvent, + AgentExecutionStartedEvent, + AgentExecutionCompletedEvent, + TaskStartedEvent, + TaskCompletedEvent, + TaskFailedEvent, + FlowStartedEvent, + FlowFinishedEvent, + MethodExecutionStartedEvent, + MethodExecutionFinishedEvent, + MethodExecutionFailedEvent, + AgentExecutionErrorEvent, + ToolUsageFinishedEvent, + ToolUsageErrorEvent, + ToolUsageStartedEvent, +] diff --git a/src/crewai/utilities/events/flow_events.py b/src/crewai/utilities/events/flow_events.py new file mode 100644 index 000000000..435d64214 --- /dev/null +++ b/src/crewai/utilities/events/flow_events.py @@ -0,0 +1,71 @@ +from typing import Any, Dict, Optional, Union + +from pydantic import BaseModel + +from .base_events import CrewEvent + + +class FlowEvent(CrewEvent): + """Base class for all flow events""" + + type: str + flow_name: str + + +class FlowStartedEvent(FlowEvent): + """Event emitted when a flow starts execution""" + + flow_name: str + inputs: Optional[Dict[str, Any]] = None + type: str = "flow_started" + + +class FlowCreatedEvent(FlowEvent): + """Event emitted when a flow is created""" + + flow_name: str + type: str = "flow_created" + + +class MethodExecutionStartedEvent(FlowEvent): + """Event emitted when a flow method starts execution""" + + flow_name: str + method_name: str + state: Union[Dict[str, Any], BaseModel] + params: Optional[Dict[str, Any]] = None + type: str = "method_execution_started" + + +class MethodExecutionFinishedEvent(FlowEvent): + """Event emitted when a flow method completes execution""" + + flow_name: str + method_name: str + result: Any = None + state: Union[Dict[str, Any], BaseModel] + type: str = "method_execution_finished" + + +class MethodExecutionFailedEvent(FlowEvent): + """Event emitted when a flow method fails execution""" + + flow_name: str + method_name: str + error: Any + type: str = "method_execution_failed" + + +class FlowFinishedEvent(FlowEvent): + """Event emitted when a flow completes execution""" + + flow_name: str + result: Optional[Any] = None + type: str = "flow_finished" + + +class FlowPlotEvent(FlowEvent): + """Event emitted when a flow plot is created""" + + flow_name: str + type: str = "flow_plot" diff --git a/src/crewai/utilities/events/task_events.py b/src/crewai/utilities/events/task_events.py new file mode 100644 index 000000000..f69e77d6a --- /dev/null +++ b/src/crewai/utilities/events/task_events.py @@ -0,0 +1,32 @@ +from typing import Any, Optional + +from crewai.tasks.task_output import TaskOutput +from crewai.utilities.events.base_events import CrewEvent + + +class TaskStartedEvent(CrewEvent): + """Event emitted when a task starts""" + + type: str = "task_started" + context: Optional[str] + + +class TaskCompletedEvent(CrewEvent): + """Event emitted when a task completes""" + + output: TaskOutput + type: str = "task_completed" + + +class TaskFailedEvent(CrewEvent): + """Event emitted when a task fails""" + + error: str + type: str = "task_failed" + + +class TaskEvaluationEvent(CrewEvent): + """Event emitted when a task evaluation is completed""" + + type: str = "task_evaluation" + evaluation_type: str diff --git a/src/crewai/utilities/events/third_party/__init__.py b/src/crewai/utilities/events/third_party/__init__.py new file mode 100644 index 000000000..e9de52477 --- /dev/null +++ b/src/crewai/utilities/events/third_party/__init__.py @@ -0,0 +1 @@ +from .agentops_listener import agentops_listener diff --git a/src/crewai/utilities/events/third_party/agentops_listener.py b/src/crewai/utilities/events/third_party/agentops_listener.py new file mode 100644 index 000000000..294a820ee --- /dev/null +++ b/src/crewai/utilities/events/third_party/agentops_listener.py @@ -0,0 +1,67 @@ +from typing import Optional + +from crewai.utilities.events import ( + CrewKickoffCompletedEvent, + ToolUsageErrorEvent, + ToolUsageStartedEvent, +) +from crewai.utilities.events.base_event_listener import BaseEventListener +from crewai.utilities.events.crew_events import CrewKickoffStartedEvent +from crewai.utilities.events.task_events import TaskEvaluationEvent + +try: + import agentops + + AGENTOPS_INSTALLED = True +except ImportError: + AGENTOPS_INSTALLED = False + + +class AgentOpsListener(BaseEventListener): + tool_event: Optional["agentops.ToolEvent"] = None + session: Optional["agentops.Session"] = None + + def __init__(self): + super().__init__() + + def setup_listeners(self, crewai_event_bus): + if not AGENTOPS_INSTALLED: + return + + @crewai_event_bus.on(CrewKickoffStartedEvent) + def on_crew_kickoff_started(source, event: CrewKickoffStartedEvent): + self.session = agentops.init() + for agent in source.agents: + if self.session: + self.session.create_agent( + name=agent.role, + agent_id=str(agent.id), + ) + + @crewai_event_bus.on(CrewKickoffCompletedEvent) + def on_crew_kickoff_completed(source, event: CrewKickoffCompletedEvent): + if self.session: + self.session.end_session( + end_state="Success", + end_state_reason="Finished Execution", + ) + + @crewai_event_bus.on(ToolUsageStartedEvent) + def on_tool_usage_started(source, event: ToolUsageStartedEvent): + self.tool_event = agentops.ToolEvent(name=event.tool_name) + if self.session: + self.session.record(self.tool_event) + + @crewai_event_bus.on(ToolUsageErrorEvent) + def on_tool_usage_error(source, event: ToolUsageErrorEvent): + agentops.ErrorEvent(exception=event.error, trigger_event=self.tool_event) + + @crewai_event_bus.on(TaskEvaluationEvent) + def on_task_evaluation(source, event: TaskEvaluationEvent): + if self.session: + self.session.create_agent( + name="Task Evaluator", agent_id=str(source.original_agent.id) + ) + + +agentops_listener = AgentOpsListener() diff --git a/src/crewai/utilities/events/tool_usage_events.py b/src/crewai/utilities/events/tool_usage_events.py new file mode 100644 index 000000000..aa375dcd7 --- /dev/null +++ b/src/crewai/utilities/events/tool_usage_events.py @@ -0,0 +1,64 @@ +from datetime import datetime +from typing import Any, Callable, Dict + +from .base_events import CrewEvent + + +class ToolUsageEvent(CrewEvent): + """Base event for tool usage tracking""" + + agent_key: str + agent_role: str + tool_name: str + tool_args: Dict[str, Any] | str + tool_class: str + run_attempts: int | None = None + delegations: int | None = None + + model_config = {"arbitrary_types_allowed": True} + + +class ToolUsageStartedEvent(ToolUsageEvent): + """Event emitted when a tool execution is started""" + + type: str = "tool_usage_started" + + +class ToolUsageFinishedEvent(ToolUsageEvent): + """Event emitted when a tool execution is completed""" + + started_at: datetime + finished_at: datetime + from_cache: bool = False + type: str = "tool_usage_finished" + + +class ToolUsageErrorEvent(ToolUsageEvent): + """Event emitted when a tool execution encounters an error""" + + error: Any + type: str = "tool_usage_error" + + +class ToolValidateInputErrorEvent(ToolUsageEvent): + """Event emitted when a tool input validation encounters an error""" + + error: Any + type: str = "tool_validate_input_error" + + +class ToolSelectionErrorEvent(ToolUsageEvent): + """Event emitted when a tool selection encounters an error""" + + error: Any + type: str = "tool_selection_error" + + +class ToolExecutionErrorEvent(CrewEvent): + """Event emitted when a tool execution encounters an error""" + + error: Any + type: str = "tool_execution_error" + tool_name: str + tool_args: Dict[str, Any] + tool_class: Callable diff --git a/src/crewai/utilities/logger.py b/src/crewai/utilities/logger.py index 9b883f617..2f69e7abc 100644 --- a/src/crewai/utilities/logger.py +++ b/src/crewai/utilities/logger.py @@ -8,8 +8,11 @@ from crewai.utilities.printer import Printer class Logger(BaseModel): verbose: bool = Field(default=False) _printer: Printer = PrivateAttr(default_factory=Printer) + default_color: str = Field(default="bold_yellow") - def log(self, level, message, color="bold_yellow"): + def log(self, level, message, color=None): + if color is None: + color = self.default_color if self.verbose: timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") self._printer.print( diff --git a/tests/agent_test.py b/tests/agent_test.py index d429a3c60..3547398e5 100644 --- a/tests/agent_test.py +++ b/tests/agent_test.py @@ -17,9 +17,9 @@ from crewai.llm import LLM from crewai.tools import tool from crewai.tools.tool_calling import InstructorToolCalling from crewai.tools.tool_usage import ToolUsage -from crewai.tools.tool_usage_events import ToolUsageFinished from crewai.utilities import RPMController -from crewai.utilities.events import Emitter +from crewai.utilities.events import crewai_event_bus +from crewai.utilities.events.tool_usage_events import ToolUsageFinishedEvent def test_agent_llm_creation_with_env_vars(): @@ -155,15 +155,19 @@ def test_agent_execution_with_tools(): agent=agent, expected_output="The result of the multiplication.", ) - with patch.object(Emitter, "emit") as emit: - output = agent.execute_task(task) - assert output == "The result of the multiplication is 12." - assert emit.call_count == 1 - args, _ = emit.call_args - assert isinstance(args[1], ToolUsageFinished) - assert not args[1].from_cache - assert args[1].tool_name == "multiplier" - assert args[1].tool_args == {"first_number": 3, "second_number": 4} + received_events = [] + + @crewai_event_bus.on(ToolUsageFinishedEvent) + def handle_tool_end(source, event): + received_events.append(event) + + output = agent.execute_task(task) + assert output == "The result of the multiplication is 12." + + assert len(received_events) == 1 + assert isinstance(received_events[0], ToolUsageFinishedEvent) + assert received_events[0].tool_name == "multiplier" + assert received_events[0].tool_args == {"first_number": 3, "second_number": 4} @pytest.mark.vcr(filter_headers=["authorization"]) @@ -250,10 +254,14 @@ def test_cache_hitting(): "multiplier-{'first_number': 3, 'second_number': 3}": 9, "multiplier-{'first_number': 12, 'second_number': 3}": 36, } + received_events = [] + + @crewai_event_bus.on(ToolUsageFinishedEvent) + def handle_tool_end(source, event): + received_events.append(event) with ( patch.object(CacheHandler, "read") as read, - patch.object(Emitter, "emit") as emit, ): read.return_value = "0" task = Task( @@ -266,10 +274,9 @@ def test_cache_hitting(): read.assert_called_with( tool="multiplier", input={"first_number": 2, "second_number": 6} ) - assert emit.call_count == 1 - args, _ = emit.call_args - assert isinstance(args[1], ToolUsageFinished) - assert args[1].from_cache + assert len(received_events) == 1 + assert isinstance(received_events[0], ToolUsageFinishedEvent) + assert received_events[0].from_cache @pytest.mark.vcr(filter_headers=["authorization"]) diff --git a/tests/cassettes/test_tool_execution_error_event.yaml b/tests/cassettes/test_tool_execution_error_event.yaml new file mode 100644 index 000000000..61583726a --- /dev/null +++ b/tests/cassettes/test_tool_execution_error_event.yaml @@ -0,0 +1,112 @@ +interactions: +- request: + body: '{"messages": [{"role": "user", "content": "Use the failing tool"}], "model": + "gpt-4o-mini", "stop": [], "tools": [{"type": "function", "function": {"name": + "failing_tool", "description": "This tool always fails.", "parameters": {"type": + "object", "properties": {"param": {"type": "string", "description": "A test + parameter"}}, "required": ["param"]}}}]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '353' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B2P4zoJZuES7Aom8ugEq1modz5Vsl\",\n \"object\": + \"chat.completion\",\n \"created\": 1739912761,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n + \ \"id\": \"call_F6fJxISpMKUBIGV6dd2vjRNG\",\n \"type\": + \"function\",\n \"function\": {\n \"name\": \"failing_tool\",\n + \ \"arguments\": \"{\\\"param\\\":\\\"test\\\"}\"\n }\n + \ }\n ],\n \"refusal\": null\n },\n \"logprobs\": + null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n + \ \"prompt_tokens\": 51,\n \"completion_tokens\": 15,\n \"total_tokens\": + 66,\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_00428b782a\"\n}\n" + headers: + CF-RAY: + - 9140fa827f38eb1e-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Tue, 18 Feb 2025 21:06:02 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=xbuu3IQpCMh.43ZrqL1TRMECOc6QldgHV0hzOX1GrWI-1739912762-1.0.1.1-t7iyq5xMioPrwfeaHLvPT9rwRPp7Q9A9uIm69icH9dPxRD4xMA3cWqb1aXj1_e2IyAEQQWFe1UWjlmJ22aHh3Q; + path=/; expires=Tue, 18-Feb-25 21:36:02 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=x9l.Rhja8_wXDN.j8qcEU1PvvEqAwZp4Fd3s_aj4qwM-1739912762161-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '861' + 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: + - '149999978' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_8666ec3aa6677cb346ba00993556051d + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/crew_test.py b/tests/crew_test.py index 398be37de..6cd0370ae 100644 --- a/tests/crew_test.py +++ b/tests/crew_test.py @@ -6,7 +6,6 @@ from concurrent.futures import Future from unittest import mock from unittest.mock import MagicMock, patch -import instructor import pydantic_core import pytest @@ -18,13 +17,21 @@ from crewai.knowledge.source.string_knowledge_source import StringKnowledgeSourc from crewai.llm import LLM from crewai.memory.contextual.contextual_memory import ContextualMemory from crewai.process import Process -from crewai.project import crew from crewai.task import Task from crewai.tasks.conditional_task import ConditionalTask from crewai.tasks.output_format import OutputFormat from crewai.tasks.task_output import TaskOutput from crewai.types.usage_metrics import UsageMetrics from crewai.utilities import Logger +from crewai.utilities.events import ( + CrewTrainCompletedEvent, + CrewTrainStartedEvent, + crewai_event_bus, +) +from crewai.utilities.events.crew_events import ( + CrewTestCompletedEvent, + CrewTestStartedEvent, +) from crewai.utilities.rpm_controller import RPMController from crewai.utilities.task_output_storage_handler import TaskOutputStorageHandler @@ -844,8 +851,21 @@ def test_crew_verbose_output(capsys): crew.verbose = False crew._logger = Logger(verbose=False) crew.kickoff() + expected_listener_logs = [ + "[🚀 CREW 'CREW' STARTED]", + "[📋 TASK STARTED: RESEARCH AI ADVANCEMENTS.]", + "[🤖 AGENT 'RESEARCHER' STARTED TASK]", + "[✅ AGENT 'RESEARCHER' COMPLETED TASK]", + "[✅ TASK COMPLETED: RESEARCH AI ADVANCEMENTS.]", + "[📋 TASK STARTED: WRITE ABOUT AI IN HEALTHCARE.]", + "[🤖 AGENT 'SENIOR WRITER' STARTED TASK]", + "[✅ AGENT 'SENIOR WRITER' COMPLETED TASK]", + "[✅ TASK COMPLETED: WRITE ABOUT AI IN HEALTHCARE.]", + "[✅ CREW 'CREW' COMPLETED]", + ] captured = capsys.readouterr() - assert captured.out == "" + for log in expected_listener_logs: + assert log in captured.out @pytest.mark.vcr(filter_headers=["authorization"]) @@ -1283,9 +1303,9 @@ def test_kickoff_for_each_invalid_input(): crew = Crew(agents=[agent], tasks=[task]) - with pytest.raises(TypeError): + with pytest.raises(pydantic_core._pydantic_core.ValidationError): # Pass a string instead of a list - crew.kickoff_for_each("invalid input") + crew.kickoff_for_each(["invalid input"]) def test_kickoff_for_each_error_handling(): @@ -2569,6 +2589,16 @@ def test_crew_train_success( # Create a mock for the copied crew copy_mock.return_value = crew + received_events = [] + + @crewai_event_bus.on(CrewTrainStartedEvent) + def on_crew_train_started(source, event: CrewTrainStartedEvent): + received_events.append(event) + + @crewai_event_bus.on(CrewTrainCompletedEvent) + def on_crew_train_completed(source, event: CrewTrainCompletedEvent): + received_events.append(event) + crew.train( n_iterations=2, inputs={"topic": "AI"}, filename="trained_agents_data.pkl" ) @@ -2614,6 +2644,10 @@ def test_crew_train_success( ] ) + assert len(received_events) == 2 + assert isinstance(received_events[0], CrewTrainStartedEvent) + assert isinstance(received_events[1], CrewTrainCompletedEvent) + def test_crew_train_error(): task = Task( @@ -3342,7 +3376,18 @@ def test_crew_testing_function(kickoff_mock, copy_mock, crew_evaluator): copy_mock.return_value = crew n_iterations = 2 - llm_instance = LLM('gpt-4o-mini') + llm_instance = LLM("gpt-4o-mini") + + received_events = [] + + @crewai_event_bus.on(CrewTestStartedEvent) + def on_crew_test_started(source, event: CrewTestStartedEvent): + received_events.append(event) + + @crewai_event_bus.on(CrewTestCompletedEvent) + def on_crew_test_completed(source, event: CrewTestCompletedEvent): + received_events.append(event) + crew.test(n_iterations, llm_instance, inputs={"topic": "AI"}) # Ensure kickoff is called on the copied crew @@ -3352,13 +3397,17 @@ def test_crew_testing_function(kickoff_mock, copy_mock, crew_evaluator): crew_evaluator.assert_has_calls( [ - mock.call(crew,llm_instance), + mock.call(crew, llm_instance), mock.call().set_iteration(1), mock.call().set_iteration(2), mock.call().print_crew_evaluation_result(), ] ) + assert len(received_events) == 2 + assert isinstance(received_events[0], CrewTestStartedEvent) + assert isinstance(received_events[1], CrewTestCompletedEvent) + @pytest.mark.vcr(filter_headers=["authorization"]) def test_hierarchical_verbose_manager_agent(): diff --git a/tests/flow_test.py b/tests/flow_test.py index d036f7987..b2edcfa5a 100644 --- a/tests/flow_test.py +++ b/tests/flow_test.py @@ -7,12 +7,14 @@ import pytest from pydantic import BaseModel from crewai.flow.flow import Flow, and_, listen, or_, router, start -from crewai.flow.flow_events import ( +from crewai.utilities.events import ( FlowFinishedEvent, FlowStartedEvent, MethodExecutionFinishedEvent, MethodExecutionStartedEvent, + crewai_event_bus, ) +from crewai.utilities.events.flow_events import FlowPlotEvent def test_simple_sequential_flow(): @@ -434,90 +436,65 @@ def test_unstructured_flow_event_emission(): @listen(finish_poem) def save_poem_to_database(self): # A method without args/kwargs to ensure events are sent correctly - pass - - event_log = [] - - def handle_event(_, event): - event_log.append(event) + return "roses are red\nviolets are blue" flow = PoemFlow() - flow.event_emitter.connect(handle_event) + received_events = [] + + @crewai_event_bus.on(FlowStartedEvent) + def handle_flow_start(source, event): + received_events.append(event) + + @crewai_event_bus.on(MethodExecutionStartedEvent) + def handle_method_start(source, event): + received_events.append(event) + + @crewai_event_bus.on(FlowFinishedEvent) + def handle_flow_end(source, event): + received_events.append(event) + flow.kickoff(inputs={"separator": ", "}) + assert isinstance(received_events[0], FlowStartedEvent) + assert received_events[0].flow_name == "PoemFlow" + assert received_events[0].inputs == {"separator": ", "} + assert isinstance(received_events[0].timestamp, datetime) - assert isinstance(event_log[0], FlowStartedEvent) - assert event_log[0].flow_name == "PoemFlow" - assert event_log[0].inputs == {"separator": ", "} - assert isinstance(event_log[0].timestamp, datetime) - - # Asserting for concurrent start method executions in a for loop as you - # can't guarantee ordering in asynchronous executions - for i in range(1, 5): - event = event_log[i] + # All subsequent events are MethodExecutionStartedEvent + for event in received_events[1:-1]: + assert isinstance(event, MethodExecutionStartedEvent) + assert event.flow_name == "PoemFlow" assert isinstance(event.state, dict) assert isinstance(event.state["id"], str) + assert event.state["separator"] == ", " - if event.method_name == "prepare_flower": - if isinstance(event, MethodExecutionStartedEvent): - assert event.params == {} - assert event.state["separator"] == ", " - elif isinstance(event, MethodExecutionFinishedEvent): - assert event.result == "foo" - assert event.state["flower"] == "roses" - assert event.state["separator"] == ", " - else: - assert False, "Unexpected event type for prepare_flower" - elif event.method_name == "prepare_color": - if isinstance(event, MethodExecutionStartedEvent): - assert event.params == {} - assert event.state["separator"] == ", " - elif isinstance(event, MethodExecutionFinishedEvent): - assert event.result == "bar" - assert event.state["color"] == "red" - assert event.state["separator"] == ", " - else: - assert False, "Unexpected event type for prepare_color" - else: - assert False, f"Unexpected method {event.method_name} in prepare events" + assert received_events[1].method_name == "prepare_flower" + assert received_events[1].params == {} + assert "flower" not in received_events[1].state - assert isinstance(event_log[5], MethodExecutionStartedEvent) - assert event_log[5].method_name == "write_first_sentence" - assert event_log[5].params == {} - assert isinstance(event_log[5].state, dict) - assert event_log[5].state["flower"] == "roses" - assert event_log[5].state["color"] == "red" - assert event_log[5].state["separator"] == ", " + assert received_events[2].method_name == "prepare_color" + assert received_events[2].params == {} + print("received_events[2]", received_events[2]) + assert "flower" in received_events[2].state - assert isinstance(event_log[6], MethodExecutionFinishedEvent) - assert event_log[6].method_name == "write_first_sentence" - assert event_log[6].result == "roses are red" + assert received_events[3].method_name == "write_first_sentence" + assert received_events[3].params == {} + assert received_events[3].state["flower"] == "roses" + assert received_events[3].state["color"] == "red" - assert isinstance(event_log[7], MethodExecutionStartedEvent) - assert event_log[7].method_name == "finish_poem" - assert event_log[7].params == {"_0": "roses are red"} - assert isinstance(event_log[7].state, dict) - assert event_log[7].state["flower"] == "roses" - assert event_log[7].state["color"] == "red" + assert received_events[4].method_name == "finish_poem" + assert received_events[4].params == {"_0": "roses are red"} + assert received_events[4].state["flower"] == "roses" + assert received_events[4].state["color"] == "red" - assert isinstance(event_log[8], MethodExecutionFinishedEvent) - assert event_log[8].method_name == "finish_poem" - assert event_log[8].result == "roses are red, violets are blue" + assert received_events[5].method_name == "save_poem_to_database" + assert received_events[5].params == {} + assert received_events[5].state["flower"] == "roses" + assert received_events[5].state["color"] == "red" - assert isinstance(event_log[9], MethodExecutionStartedEvent) - assert event_log[9].method_name == "save_poem_to_database" - assert event_log[9].params == {} - assert isinstance(event_log[9].state, dict) - assert event_log[9].state["flower"] == "roses" - assert event_log[9].state["color"] == "red" - - assert isinstance(event_log[10], MethodExecutionFinishedEvent) - assert event_log[10].method_name == "save_poem_to_database" - assert event_log[10].result is None - - assert isinstance(event_log[11], FlowFinishedEvent) - assert event_log[11].flow_name == "PoemFlow" - assert event_log[11].result is None - assert isinstance(event_log[11].timestamp, datetime) + assert isinstance(received_events[6], FlowFinishedEvent) + assert received_events[6].flow_name == "PoemFlow" + assert received_events[6].result == "roses are red\nviolets are blue" + assert isinstance(received_events[6].timestamp, datetime) def test_structured_flow_event_emission(): @@ -538,40 +515,54 @@ def test_structured_flow_event_emission(): self.state.sent = True return f"Welcome, {self.state.name}!" - event_log = [] - - def handle_event(_, event): - event_log.append(event) - flow = OnboardingFlow() - flow.event_emitter.connect(handle_event) flow.kickoff(inputs={"name": "Anakin"}) - assert isinstance(event_log[0], FlowStartedEvent) - assert event_log[0].flow_name == "OnboardingFlow" - assert event_log[0].inputs == {"name": "Anakin"} - assert isinstance(event_log[0].timestamp, datetime) + received_events = [] - assert isinstance(event_log[1], MethodExecutionStartedEvent) - assert event_log[1].method_name == "user_signs_up" + @crewai_event_bus.on(FlowStartedEvent) + def handle_flow_start(source, event): + received_events.append(event) - assert isinstance(event_log[2], MethodExecutionFinishedEvent) - assert event_log[2].method_name == "user_signs_up" + @crewai_event_bus.on(MethodExecutionStartedEvent) + def handle_method_start(source, event): + received_events.append(event) - assert isinstance(event_log[3], MethodExecutionStartedEvent) - assert event_log[3].method_name == "send_welcome_message" - assert event_log[3].params == {} - assert getattr(event_log[3].state, "sent") is False + @crewai_event_bus.on(MethodExecutionFinishedEvent) + def handle_method_end(source, event): + received_events.append(event) - assert isinstance(event_log[4], MethodExecutionFinishedEvent) - assert event_log[4].method_name == "send_welcome_message" - assert getattr(event_log[4].state, "sent") is True - assert event_log[4].result == "Welcome, Anakin!" + @crewai_event_bus.on(FlowFinishedEvent) + def handle_flow_end(source, event): + received_events.append(event) - assert isinstance(event_log[5], FlowFinishedEvent) - assert event_log[5].flow_name == "OnboardingFlow" - assert event_log[5].result == "Welcome, Anakin!" - assert isinstance(event_log[5].timestamp, datetime) + flow.kickoff(inputs={"name": "Anakin"}) + + assert isinstance(received_events[0], FlowStartedEvent) + assert received_events[0].flow_name == "OnboardingFlow" + assert received_events[0].inputs == {"name": "Anakin"} + assert isinstance(received_events[0].timestamp, datetime) + + assert isinstance(received_events[1], MethodExecutionStartedEvent) + assert received_events[1].method_name == "user_signs_up" + + assert isinstance(received_events[2], MethodExecutionFinishedEvent) + assert received_events[2].method_name == "user_signs_up" + + assert isinstance(received_events[3], MethodExecutionStartedEvent) + assert received_events[3].method_name == "send_welcome_message" + assert received_events[3].params == {} + assert getattr(received_events[3].state, "sent") is False + + assert isinstance(received_events[4], MethodExecutionFinishedEvent) + assert received_events[4].method_name == "send_welcome_message" + assert getattr(received_events[4].state, "sent") is True + assert received_events[4].result == "Welcome, Anakin!" + + assert isinstance(received_events[5], FlowFinishedEvent) + assert received_events[5].flow_name == "OnboardingFlow" + assert received_events[5].result == "Welcome, Anakin!" + assert isinstance(received_events[5].timestamp, datetime) def test_stateless_flow_event_emission(): @@ -593,30 +584,73 @@ def test_stateless_flow_event_emission(): event_log.append(event) flow = StatelessFlow() - flow.event_emitter.connect(handle_event) + received_events = [] + + @crewai_event_bus.on(FlowStartedEvent) + def handle_flow_start(source, event): + received_events.append(event) + + @crewai_event_bus.on(MethodExecutionStartedEvent) + def handle_method_start(source, event): + received_events.append(event) + + @crewai_event_bus.on(MethodExecutionFinishedEvent) + def handle_method_end(source, event): + received_events.append(event) + + @crewai_event_bus.on(FlowFinishedEvent) + def handle_flow_end(source, event): + received_events.append(event) + flow.kickoff() - assert isinstance(event_log[0], FlowStartedEvent) - assert event_log[0].flow_name == "StatelessFlow" - assert event_log[0].inputs is None - assert isinstance(event_log[0].timestamp, datetime) + assert isinstance(received_events[0], FlowStartedEvent) + assert received_events[0].flow_name == "StatelessFlow" + assert received_events[0].inputs is None + assert isinstance(received_events[0].timestamp, datetime) - assert isinstance(event_log[1], MethodExecutionStartedEvent) - assert event_log[1].method_name == "init" + assert isinstance(received_events[1], MethodExecutionStartedEvent) + assert received_events[1].method_name == "init" - assert isinstance(event_log[2], MethodExecutionFinishedEvent) - assert event_log[2].method_name == "init" + assert isinstance(received_events[2], MethodExecutionFinishedEvent) + assert received_events[2].method_name == "init" - assert isinstance(event_log[3], MethodExecutionStartedEvent) - assert event_log[3].method_name == "process" + assert isinstance(received_events[3], MethodExecutionStartedEvent) + assert received_events[3].method_name == "process" - assert isinstance(event_log[4], MethodExecutionFinishedEvent) - assert event_log[4].method_name == "process" + assert isinstance(received_events[4], MethodExecutionFinishedEvent) + assert received_events[4].method_name == "process" - assert isinstance(event_log[5], FlowFinishedEvent) - assert event_log[5].flow_name == "StatelessFlow" + assert isinstance(received_events[5], FlowFinishedEvent) + assert received_events[5].flow_name == "StatelessFlow" assert ( - event_log[5].result + received_events[5].result == "Deeds will not be less valiant because they are unpraised." ) - assert isinstance(event_log[5].timestamp, datetime) + assert isinstance(received_events[5].timestamp, datetime) + + +def test_flow_plotting(): + class StatelessFlow(Flow): + @start() + def init(self): + return "Initializing flow..." + + @listen(init) + def process(self): + return "Deeds will not be less valiant because they are unpraised." + + flow = StatelessFlow() + flow.kickoff() + received_events = [] + + @crewai_event_bus.on(FlowPlotEvent) + def handle_flow_plot(source, event): + received_events.append(event) + + flow.plot("test_flow") + + assert len(received_events) == 1 + assert isinstance(received_events[0], FlowPlotEvent) + assert received_events[0].flow_name == "StatelessFlow" + assert isinstance(received_events[0].timestamp, datetime) diff --git a/tests/llm_test.py b/tests/llm_test.py index 2e5faf774..00bb69aa5 100644 --- a/tests/llm_test.py +++ b/tests/llm_test.py @@ -7,7 +7,8 @@ from pydantic import BaseModel from crewai.agents.agent_builder.utilities.base_token_process import TokenProcess from crewai.llm import LLM -from crewai.tools import tool +from crewai.utilities.events import crewai_event_bus +from crewai.utilities.events.tool_usage_events import ToolExecutionErrorEvent from crewai.utilities.token_counter_callback import TokenCalcHandler @@ -291,32 +292,36 @@ def anthropic_llm(): """Fixture providing an Anthropic LLM instance.""" return LLM(model="anthropic/claude-3-sonnet") + @pytest.fixture def system_message(): """Fixture providing a system message.""" return {"role": "system", "content": "test"} + @pytest.fixture def user_message(): """Fixture providing a user message.""" return {"role": "user", "content": "test"} + def test_anthropic_message_formatting_edge_cases(anthropic_llm): """Test edge cases for Anthropic message formatting.""" # Test None messages with pytest.raises(TypeError, match="Messages cannot be None"): anthropic_llm._format_messages_for_provider(None) - + # Test empty message list formatted = anthropic_llm._format_messages_for_provider([]) assert len(formatted) == 1 assert formatted[0]["role"] == "user" assert formatted[0]["content"] == "." - + # Test invalid message format with pytest.raises(TypeError, match="Invalid message format"): anthropic_llm._format_messages_for_provider([{"invalid": "message"}]) + def test_anthropic_model_detection(): """Test Anthropic model detection with various formats.""" models = [ @@ -327,11 +332,12 @@ def test_anthropic_model_detection(): ("", False), ("anthropomorphic", False), # Should not match partial words ] - + for model, expected in models: llm = LLM(model=model) assert llm.is_anthropic == expected, f"Failed for model: {model}" + def test_anthropic_message_formatting(anthropic_llm, system_message, user_message): """Test Anthropic message formatting with fixtures.""" # Test when first message is system @@ -371,3 +377,51 @@ def test_deepseek_r1_with_open_router(): result = llm.call("What is the capital of France?") assert isinstance(result, str) assert "Paris" in result + + +@pytest.mark.vcr(filter_headers=["authorization"]) +def test_tool_execution_error_event(): + llm = LLM(model="gpt-4o-mini") + + def failing_tool(param: str) -> str: + """This tool always fails.""" + raise Exception("Tool execution failed!") + + tool_schema = { + "type": "function", + "function": { + "name": "failing_tool", + "description": "This tool always fails.", + "parameters": { + "type": "object", + "properties": { + "param": {"type": "string", "description": "A test parameter"} + }, + "required": ["param"], + }, + }, + } + + received_events = [] + + @crewai_event_bus.on(ToolExecutionErrorEvent) + def event_handler(source, event): + received_events.append(event) + + available_functions = {"failing_tool": failing_tool} + + messages = [{"role": "user", "content": "Use the failing tool"}] + + llm.call( + messages, + tools=[tool_schema], + available_functions=available_functions, + ) + + assert len(received_events) == 1 + event = received_events[0] + assert isinstance(event, ToolExecutionErrorEvent) + assert event.tool_name == "failing_tool" + assert event.tool_args == {"param": "test"} + assert event.tool_class == failing_tool + assert "Tool execution failed!" in event.error diff --git a/tests/test_flow_persistence.py b/tests/test_flow_persistence.py index b6151de84..cf3bb22f0 100644 --- a/tests/test_flow_persistence.py +++ b/tests/test_flow_persistence.py @@ -13,6 +13,7 @@ from crewai.flow.persistence.sqlite import SQLiteFlowPersistence class TestState(FlowState): """Test state model with required id field.""" + counter: int = 0 message: str = "" @@ -73,7 +74,6 @@ def test_flow_state_restoration(tmp_path): # First flow execution to create initial state class RestorableFlow(Flow[TestState]): - @start() @persist(persistence) def set_message(self): @@ -89,10 +89,7 @@ def test_flow_state_restoration(tmp_path): # Test case 1: Restore using restore_uuid with field override flow2 = RestorableFlow(persistence=persistence) - flow2.kickoff(inputs={ - "id": original_uuid, - "counter": 43 - }) + flow2.kickoff(inputs={"id": original_uuid, "counter": 43}) # Verify state restoration and selective field override assert flow2.state.id == original_uuid @@ -101,10 +98,7 @@ def test_flow_state_restoration(tmp_path): # Test case 2: Restore using kwargs['id'] flow3 = RestorableFlow(persistence=persistence) - flow3.kickoff(inputs={ - "id": original_uuid, - "message": "Updated message" - }) + flow3.kickoff(inputs={"id": original_uuid, "message": "Updated message"}) # Verify state restoration and selective field override assert flow3.state.id == original_uuid @@ -175,8 +169,12 @@ def test_multiple_method_persistence(tmp_path): assert final_state.counter == 99999 assert final_state.message == "Step 99999" + def test_persist_decorator_verbose_logging(tmp_path, caplog): """Test that @persist decorator's verbose parameter controls logging.""" + # Set logging level to ensure we capture all logs + caplog.set_level("INFO") + db_path = os.path.join(tmp_path, "test_flows.db") persistence = SQLiteFlowPersistence(db_path) @@ -192,7 +190,7 @@ def test_persist_decorator_verbose_logging(tmp_path, caplog): flow = QuietFlow(persistence=persistence) flow.kickoff() - assert "Saving flow state to memory for ID: test-uuid-1" not in caplog.text + assert "Saving flow state" not in caplog.text # Clear the log caplog.clear() @@ -209,4 +207,4 @@ def test_persist_decorator_verbose_logging(tmp_path, caplog): flow = VerboseFlow(persistence=persistence) flow.kickoff() - assert "Saving flow state to memory for ID: test-uuid-2" in caplog.text + assert "Saving flow state" in caplog.text diff --git a/tests/tools/test_tool_usage.py b/tests/tools/test_tool_usage.py index 7b2ccd416..e09d4d537 100644 --- a/tests/tools/test_tool_usage.py +++ b/tests/tools/test_tool_usage.py @@ -1,6 +1,6 @@ import json import random -from unittest.mock import MagicMock +from unittest.mock import MagicMock, patch import pytest from pydantic import BaseModel, Field @@ -8,6 +8,11 @@ from pydantic import BaseModel, Field from crewai import Agent, Task from crewai.tools import BaseTool from crewai.tools.tool_usage import ToolUsage +from crewai.utilities.events import crewai_event_bus +from crewai.utilities.events.tool_usage_events import ( + ToolSelectionErrorEvent, + ToolValidateInputErrorEvent, +) class RandomNumberToolInput(BaseModel): @@ -226,7 +231,7 @@ def test_validate_tool_input_with_special_characters(): ) # Input with special characters - tool_input = '{"message": "Hello, world! \u263A", "valid": True}' + tool_input = '{"message": "Hello, world! \u263a", "valid": True}' expected_arguments = {"message": "Hello, world! ☺", "valid": True} arguments = tool_usage._validate_tool_input(tool_input) @@ -331,6 +336,19 @@ def test_validate_tool_input_with_trailing_commas(): def test_validate_tool_input_invalid_input(): + # Create mock agent with proper string values + mock_agent = MagicMock() + mock_agent.key = "test_agent_key" # Must be a string + mock_agent.role = "test_agent_role" # Must be a string + mock_agent._original_role = "test_agent_role" # Must be a string + mock_agent.i18n = MagicMock() + mock_agent.verbose = False + + # Create mock action with proper string value + mock_action = MagicMock() + mock_action.tool = "test_tool" # Must be a string + mock_action.tool_input = "test_input" # Must be a string + tool_usage = ToolUsage( tools_handler=MagicMock(), tools=[], @@ -339,8 +357,8 @@ def test_validate_tool_input_invalid_input(): tools_names="", task=MagicMock(), function_calling_llm=None, - agent=MagicMock(), - action=MagicMock(), + agent=mock_agent, + action=mock_action, ) invalid_inputs = [ @@ -360,7 +378,7 @@ def test_validate_tool_input_invalid_input(): # Test for None input separately arguments = tool_usage._validate_tool_input(None) - assert arguments == {} # Expecting an empty dictionary + assert arguments == {} def test_validate_tool_input_complex_structure(): @@ -468,18 +486,141 @@ def test_validate_tool_input_large_json_content(): assert arguments == expected_arguments -def test_validate_tool_input_none_input(): +def test_tool_selection_error_event_direct(): + """Test tool selection error event emission directly from ToolUsage class.""" + mock_agent = MagicMock() + mock_agent.key = "test_key" + mock_agent.role = "test_role" + mock_agent.i18n = MagicMock() + mock_agent.verbose = False + + mock_task = MagicMock() + mock_tools_handler = MagicMock() + + class TestTool(BaseTool): + name: str = "Test Tool" + description: str = "A test tool" + + def _run(self, input: dict) -> str: + return "test result" + + test_tool = TestTool() + tool_usage = ToolUsage( - tools_handler=MagicMock(), - tools=[], - original_tools=[], - tools_description="", - tools_names="", - task=MagicMock(), + tools_handler=mock_tools_handler, + tools=[test_tool], + original_tools=[test_tool], + tools_description="Test Tool Description", + tools_names="Test Tool", + task=mock_task, function_calling_llm=None, - agent=MagicMock(), + agent=mock_agent, action=MagicMock(), ) - arguments = tool_usage._validate_tool_input(None) - assert arguments == {} # Expecting an empty dictionary + received_events = [] + + @crewai_event_bus.on(ToolSelectionErrorEvent) + def event_handler(source, event): + received_events.append(event) + + with pytest.raises(Exception) as exc_info: + tool_usage._select_tool("Non Existent Tool") + assert len(received_events) == 1 + event = received_events[0] + assert isinstance(event, ToolSelectionErrorEvent) + assert event.agent_key == "test_key" + assert event.agent_role == "test_role" + assert event.tool_name == "Non Existent Tool" + assert event.tool_args == {} + assert event.tool_class == "Test Tool Description" + assert "don't exist" in event.error + + received_events.clear() + with pytest.raises(Exception) as exc_info: + tool_usage._select_tool("") + + assert len(received_events) == 1 + event = received_events[0] + assert isinstance(event, ToolSelectionErrorEvent) + assert event.agent_key == "test_key" + assert event.agent_role == "test_role" + assert event.tool_name == "" + assert event.tool_args == {} + assert event.tool_class == "Test Tool Description" + assert "forgot the Action name" in event.error + + +def test_tool_validate_input_error_event(): + """Test tool validation input error event emission from ToolUsage class.""" + # Mock agent and required components + mock_agent = MagicMock() + mock_agent.key = "test_key" + mock_agent.role = "test_role" + mock_agent.verbose = False + mock_agent._original_role = "test_role" + + # Mock i18n with error message + mock_i18n = MagicMock() + mock_i18n.errors.return_value = ( + "Tool input must be a valid dictionary in JSON or Python literal format" + ) + mock_agent.i18n = mock_i18n + + # Mock task and tools handler + mock_task = MagicMock() + mock_tools_handler = MagicMock() + + # Mock printer + mock_printer = MagicMock() + + # Create test tool + class TestTool(BaseTool): + name: str = "Test Tool" + description: str = "A test tool" + + def _run(self, input: dict) -> str: + return "test result" + + test_tool = TestTool() + + # Create ToolUsage instance + tool_usage = ToolUsage( + tools_handler=mock_tools_handler, + tools=[test_tool], + original_tools=[test_tool], + tools_description="Test Tool Description", + tools_names="Test Tool", + task=mock_task, + function_calling_llm=None, + agent=mock_agent, + action=MagicMock(tool="test_tool"), + ) + tool_usage._printer = mock_printer + + # Mock all parsing attempts to fail + with ( + patch("json.loads", side_effect=json.JSONDecodeError("Test Error", "", 0)), + patch("ast.literal_eval", side_effect=ValueError), + patch("json5.loads", side_effect=json.JSONDecodeError("Test Error", "", 0)), + patch("json_repair.repair_json", side_effect=Exception("Failed to repair")), + ): + received_events = [] + + @crewai_event_bus.on(ToolValidateInputErrorEvent) + def event_handler(source, event): + received_events.append(event) + + # Test invalid input + invalid_input = "invalid json {[}" + with pytest.raises(Exception) as exc_info: + tool_usage._validate_tool_input(invalid_input) + + # Verify event was emitted + assert len(received_events) == 1, "Expected one event to be emitted" + event = received_events[0] + assert isinstance(event, ToolValidateInputErrorEvent) + assert event.agent_key == "test_key" + assert event.agent_role == "test_role" + assert event.tool_name == "test_tool" + assert "must be a valid dictionary" in event.error diff --git a/tests/utilities/cassettes/test_agent_emits_execution_started_and_completed_events.yaml b/tests/utilities/cassettes/test_agent_emits_execution_started_and_completed_events.yaml new file mode 100644 index 000000000..3a142e7af --- /dev/null +++ b/tests/utilities/cassettes/test_agent_emits_execution_started_and_completed_events.yaml @@ -0,0 +1,243 @@ +interactions: +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + a helpful assistant that just says hi\nYour personal goal is: Just say hi\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: Just say hi\n\nThis is the expect criteria for your + final answer: hi\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: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '836' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-AzTXAk4GatJOmLO9sEOCCITIjf1Dx\",\n \"object\": + \"chat.completion\",\n \"created\": 1739214900,\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: hi\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 161,\n \"completion_tokens\": 12,\n \"total_tokens\": 173,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 90fe6ce92eba67b3-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Mon, 10 Feb 2025 19:15:01 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=pjX1I6y8RlqCjS.gvOqvXk4vM69UNwFwmslh1BhALNg-1739214901-1.0.1.1-nJcNlSdNcug82eDl7KSvteLbsg0xCiEh2yI1TZX2jMAblL7AMQ8LFhvXkJLlAMfk49RMzRzWy2aiQgeM7WRHPg; + path=/; expires=Mon, 10-Feb-25 19:45:01 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=efIHP1NUsh1dFewGJBu4YoBu6hhGa8vjOOKQglYQGno-1739214901306-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '571' + 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: + - '149999810' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_a95183a7a85e6bdfe381b2510bf70f34 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "user", "content": "Assess the quality of the task + completed based on the description, expected output, and actual results.\n\nTask + Description:\nJust say hi\n\nExpected Output:\nhi\n\nActual Output:\nhi\n\nPlease + provide:\n- Bullet points suggestions to improve future similar tasks\n- A score + from 0 to 10 evaluating on completion, quality, and overall performance- Entities + extracted from the task output, if any, their type, description, and relationships"}], + "model": "gpt-4o-mini", "tool_choice": {"type": "function", "function": {"name": + "TaskEvaluation"}}, "tools": [{"type": "function", "function": {"name": "TaskEvaluation", + "description": "Correctly extracted `TaskEvaluation` with all the required parameters + with correct types", "parameters": {"$defs": {"Entity": {"properties": {"name": + {"description": "The name of the entity.", "title": "Name", "type": "string"}, + "type": {"description": "The type of the entity.", "title": "Type", "type": + "string"}, "description": {"description": "Description of the entity.", "title": + "Description", "type": "string"}, "relationships": {"description": "Relationships + of the entity.", "items": {"type": "string"}, "title": "Relationships", "type": + "array"}}, "required": ["name", "type", "description", "relationships"], "title": + "Entity", "type": "object"}}, "properties": {"suggestions": {"description": + "Suggestions to improve future similar tasks.", "items": {"type": "string"}, + "title": "Suggestions", "type": "array"}, "quality": {"description": "A score + from 0 to 10 evaluating on completion, quality, and overall performance, all + taking into account the task description, expected output, and the result of + the task.", "title": "Quality", "type": "number"}, "entities": {"description": + "Entities extracted from the task output.", "items": {"$ref": "#/$defs/Entity"}, + "title": "Entities", "type": "array"}}, "required": ["entities", "quality", + "suggestions"], "type": "object"}}}]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '1962' + content-type: + - application/json + cookie: + - __cf_bm=pjX1I6y8RlqCjS.gvOqvXk4vM69UNwFwmslh1BhALNg-1739214901-1.0.1.1-nJcNlSdNcug82eDl7KSvteLbsg0xCiEh2yI1TZX2jMAblL7AMQ8LFhvXkJLlAMfk49RMzRzWy2aiQgeM7WRHPg; + _cfuvid=efIHP1NUsh1dFewGJBu4YoBu6hhGa8vjOOKQglYQGno-1739214901306-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-AzTXDcgKWq3yosIyBal8LcY8dDrn1\",\n \"object\": + \"chat.completion\",\n \"created\": 1739214903,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n + \ \"id\": \"call_c41SAnqyEKNXEAZd5XV3jKF3\",\n \"type\": + \"function\",\n \"function\": {\n \"name\": \"TaskEvaluation\",\n + \ \"arguments\": \"{\\\"suggestions\\\":[\\\"Consider specifying + the tone or context of the greeting for more engaging interactions.\\\",\\\"Clarify + if additional greetings or responses are acceptable to enhance the task's scope.\\\"],\\\"quality\\\":10,\\\"entities\\\":[] + }\"\n }\n }\n ],\n \"refusal\": null\n },\n + \ \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n + \ \"usage\": {\n \"prompt_tokens\": 273,\n \"completion_tokens\": 43,\n + \ \"total_tokens\": 316,\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_72ed7ab54c\"\n}\n" + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 90fe6cf8c96e67b3-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Mon, 10 Feb 2025 19:15: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 + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '1181' + 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: + - '149999876' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_b2286c8ae6f9b2a42f46a3e2c52b4211 + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/utilities/cassettes/test_crew_emits_end_kickoff_event.yaml b/tests/utilities/cassettes/test_crew_emits_end_kickoff_event.yaml new file mode 100644 index 000000000..c20dc4d92 --- /dev/null +++ b/tests/utilities/cassettes/test_crew_emits_end_kickoff_event.yaml @@ -0,0 +1,315 @@ +interactions: +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + a helpful assistant that just says hi\nYour personal goal is: Just say hi\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: Just say hi\n\nThis is the expect criteria for your + final answer: hi\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: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '836' + content-type: + - application/json + cookie: + - __cf_bm=4s6sWmJ49B9F_wNc1STtdZF1nikfl6uN9_ov3Xzfa8U-1738698987-1.0.1.1-lmbRRS1MHrDbnU93Gh16CP3qNczxxIrQnyBU7vpHSwNf6PdmuWOHKd1mkl5SBx6rg7p1NLaNUMyqDDcE0Mvjzw; + _cfuvid=Cl48aI8.jSRja0Pqr6Jrh3mAnigd4rDn6lhGicyjMPY-1738698987673-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-AxJK2OCJSkUj1plgbj59b4dC39QV2\",\n \"object\": + \"chat.completion\",\n \"created\": 1738698990,\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: hi\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 161,\n \"completion_tokens\": 12,\n \"total_tokens\": 173,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 90cd396c0ab71698-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Tue, 04 Feb 2025 19:56:30 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '951' + 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: + - '149999810' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_2c3cb5caed61ccd1e058ef3e6301c691 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: !!binary | + Cq0TCiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkShBMKEgoQY3Jld2FpLnRl + bGVtZXRyeRKkBwoQzBQBWCz+GLuI1awj3OPWrRIIGpT16t5bk6MqDENyZXcgQ3JlYXRlZDABOUBz + OyuEGSEYQYDBSCuEGSEYShsKDmNyZXdhaV92ZXJzaW9uEgkKBzAuMTAwLjBKGgoOcHl0aG9uX3Zl + cnNpb24SCAoGMy4xMi44Si4KCGNyZXdfa2V5EiIKIGU1ODA3MDFkNTJlYjY1YWZmMjRlZWZlNzhj + NzQ2MjhjSjEKB2NyZXdfaWQSJgokMDE3NjQ5ZWMtYTBlMS00MzYxLWFlNjgtYzA1N2E3ZGM5YzI5 + ShwKDGNyZXdfcHJvY2VzcxIMCgpzZXF1ZW50aWFsShEKC2NyZXdfbWVtb3J5EgIQAEoaChRjcmV3 + X251bWJlcl9vZl90YXNrcxICGAFKGwoVY3Jld19udW1iZXJfb2ZfYWdlbnRzEgIYAUrRAgoLY3Jl + d19hZ2VudHMSwQIKvgJbeyJrZXkiOiAiYWQxNTMxNjFjNWM1YTg1NmFhMGQwNmIyNDljNGM2NGEi + LCAiaWQiOiAiOGU3NzgyN2QtN2Y2OC00ZDA2LWI2YTctOWI4YjRkMGE0YzMzIiwgInJvbGUiOiAi + YmFzZV9hZ2VudCIsICJ2ZXJib3NlPyI6IGZhbHNlLCAibWF4X2l0ZXIiOiAyMCwgIm1heF9ycG0i + OiBudWxsLCAiZnVuY3Rpb25fY2FsbGluZ19sbG0iOiAiIiwgImxsbSI6ICJncHQtNG8tbWluaSIs + ICJkZWxlZ2F0aW9uX2VuYWJsZWQ/IjogZmFsc2UsICJhbGxvd19jb2RlX2V4ZWN1dGlvbj8iOiBm + YWxzZSwgIm1heF9yZXRyeV9saW1pdCI6IDIsICJ0b29sc19uYW1lcyI6IFtdfV1K/wEKCmNyZXdf + dGFza3MS8AEK7QFbeyJrZXkiOiAiMWIxNWVmMjM5MTViMjc1NWU4OWEwZWMzYjI2YTEzZDIiLCAi + aWQiOiAiOTJiZDIzMWYtYzAxMC00ZDI3LWIxNGYtZjE5NjEyZTBmZTkzIiwgImFzeW5jX2V4ZWN1 + dGlvbj8iOiBmYWxzZSwgImh1bWFuX2lucHV0PyI6IGZhbHNlLCAiYWdlbnRfcm9sZSI6ICJiYXNl + X2FnZW50IiwgImFnZW50X2tleSI6ICJhZDE1MzE2MWM1YzVhODU2YWEwZDA2YjI0OWM0YzY0YSIs + ICJ0b29sc19uYW1lcyI6IFtdfV16AhgBhQEAAQAAEo4CChC22Au0eMkAAjV6cfU1NrNIEggxb1Bq + Xnll/ioMVGFzayBDcmVhdGVkMAE5IOJaK4QZIRhBwG5bK4QZIRhKLgoIY3Jld19rZXkSIgogZTU4 + MDcwMWQ1MmViNjVhZmYyNGVlZmU3OGM3NDYyOGNKMQoHY3Jld19pZBImCiQwMTc2NDllYy1hMGUx + LTQzNjEtYWU2OC1jMDU3YTdkYzljMjlKLgoIdGFza19rZXkSIgogMWIxNWVmMjM5MTViMjc1NWU4 + OWEwZWMzYjI2YTEzZDJKMQoHdGFza19pZBImCiQ5MmJkMjMxZi1jMDEwLTRkMjctYjE0Zi1mMTk2 + MTJlMGZlOTN6AhgBhQEAAQAAEqQHChC63jCLGR8RP8RmYiHrdNVeEggZ39ffmGm5xyoMQ3JldyBD + cmVhdGVkMAE5GFEe04QZIRhBELEq04QZIRhKGwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4xMDAuMEoa + Cg5weXRob25fdmVyc2lvbhIICgYzLjEyLjhKLgoIY3Jld19rZXkSIgogZTU4MDcwMWQ1MmViNjVh + ZmYyNGVlZmU3OGM3NDYyOGNKMQoHY3Jld19pZBImCiQ5MTY4YmQxNC0yN2Q2LTQ3NWMtODljOC01 + NjJjOTAyMGIxOTBKHAoMY3Jld19wcm9jZXNzEgwKCnNlcXVlbnRpYWxKEQoLY3Jld19tZW1vcnkS + AhAAShoKFGNyZXdfbnVtYmVyX29mX3Rhc2tzEgIYAUobChVjcmV3X251bWJlcl9vZl9hZ2VudHMS + AhgBStECCgtjcmV3X2FnZW50cxLBAgq+Alt7ImtleSI6ICJhZDE1MzE2MWM1YzVhODU2YWEwZDA2 + YjI0OWM0YzY0YSIsICJpZCI6ICI4ZTc3ODI3ZC03ZjY4LTRkMDYtYjZhNy05YjhiNGQwYTRjMzMi + LCAicm9sZSI6ICJiYXNlX2FnZW50IiwgInZlcmJvc2U/IjogZmFsc2UsICJtYXhfaXRlciI6IDIw + LCAibWF4X3JwbSI6IG51bGwsICJmdW5jdGlvbl9jYWxsaW5nX2xsbSI6ICIiLCAibGxtIjogImdw + dC00by1taW5pIiwgImRlbGVnYXRpb25fZW5hYmxlZD8iOiBmYWxzZSwgImFsbG93X2NvZGVfZXhl + Y3V0aW9uPyI6IGZhbHNlLCAibWF4X3JldHJ5X2xpbWl0IjogMiwgInRvb2xzX25hbWVzIjogW119 + XUr/AQoKY3Jld190YXNrcxLwAQrtAVt7ImtleSI6ICIxYjE1ZWYyMzkxNWIyNzU1ZTg5YTBlYzNi + MjZhMTNkMiIsICJpZCI6ICI5MmJkMjMxZi1jMDEwLTRkMjctYjE0Zi1mMTk2MTJlMGZlOTMiLCAi + YXN5bmNfZXhlY3V0aW9uPyI6IGZhbHNlLCAiaHVtYW5faW5wdXQ/IjogZmFsc2UsICJhZ2VudF9y + b2xlIjogImJhc2VfYWdlbnQiLCAiYWdlbnRfa2V5IjogImFkMTUzMTYxYzVjNWE4NTZhYTBkMDZi + MjQ5YzRjNjRhIiwgInRvb2xzX25hbWVzIjogW119XXoCGAGFAQABAAASjgIKEOo6FGs7r9hHrN+f + qhMTUysSCJgbYV+vQMbCKgxUYXNrIENyZWF0ZWQwATlAxjrThBkhGEEYIDvThBkhGEouCghjcmV3 + X2tleRIiCiBlNTgwNzAxZDUyZWI2NWFmZjI0ZWVmZTc4Yzc0NjI4Y0oxCgdjcmV3X2lkEiYKJDkx + NjhiZDE0LTI3ZDYtNDc1Yy04OWM4LTU2MmM5MDIwYjE5MEouCgh0YXNrX2tleRIiCiAxYjE1ZWYy + MzkxNWIyNzU1ZTg5YTBlYzNiMjZhMTNkMkoxCgd0YXNrX2lkEiYKJDkyYmQyMzFmLWMwMTAtNGQy + Ny1iMTRmLWYxOTYxMmUwZmU5M3oCGAGFAQABAAA= + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '2480' + Content-Type: + - application/x-protobuf + User-Agent: + - OTel-OTLP-Exporter-Python/1.27.0 + method: POST + uri: https://telemetry.crewai.com:4319/v1/traces + response: + body: + string: "\n\0" + headers: + Content-Length: + - '2' + Content-Type: + - application/x-protobuf + Date: + - Tue, 04 Feb 2025 19:56:31 GMT + status: + code: 200 + message: OK +- request: + body: '{"messages": [{"role": "user", "content": "Assess the quality of the task + completed based on the description, expected output, and actual results.\n\nTask + Description:\nJust say hi\n\nExpected Output:\nhi\n\nActual Output:\nhi\n\nPlease + provide:\n- Bullet points suggestions to improve future similar tasks\n- A score + from 0 to 10 evaluating on completion, quality, and overall performance- Entities + extracted from the task output, if any, their type, description, and relationships"}], + "model": "gpt-4o-mini", "tool_choice": {"type": "function", "function": {"name": + "TaskEvaluation"}}, "tools": [{"type": "function", "function": {"name": "TaskEvaluation", + "description": "Correctly extracted `TaskEvaluation` with all the required parameters + with correct types", "parameters": {"$defs": {"Entity": {"properties": {"name": + {"description": "The name of the entity.", "title": "Name", "type": "string"}, + "type": {"description": "The type of the entity.", "title": "Type", "type": + "string"}, "description": {"description": "Description of the entity.", "title": + "Description", "type": "string"}, "relationships": {"description": "Relationships + of the entity.", "items": {"type": "string"}, "title": "Relationships", "type": + "array"}}, "required": ["name", "type", "description", "relationships"], "title": + "Entity", "type": "object"}}, "properties": {"suggestions": {"description": + "Suggestions to improve future similar tasks.", "items": {"type": "string"}, + "title": "Suggestions", "type": "array"}, "quality": {"description": "A score + from 0 to 10 evaluating on completion, quality, and overall performance, all + taking into account the task description, expected output, and the result of + the task.", "title": "Quality", "type": "number"}, "entities": {"description": + "Entities extracted from the task output.", "items": {"$ref": "#/$defs/Entity"}, + "title": "Entities", "type": "array"}}, "required": ["entities", "quality", + "suggestions"], "type": "object"}}}]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '1962' + content-type: + - application/json + cookie: + - __cf_bm=4s6sWmJ49B9F_wNc1STtdZF1nikfl6uN9_ov3Xzfa8U-1738698987-1.0.1.1-lmbRRS1MHrDbnU93Gh16CP3qNczxxIrQnyBU7vpHSwNf6PdmuWOHKd1mkl5SBx6rg7p1NLaNUMyqDDcE0Mvjzw; + _cfuvid=Cl48aI8.jSRja0Pqr6Jrh3mAnigd4rDn6lhGicyjMPY-1738698987673-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-AxJK3bJiyqGhPeqdCcCjoeNavGHrR\",\n \"object\": + \"chat.completion\",\n \"created\": 1738698991,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n + \ \"id\": \"call_uAFkclWHIRqgrXFrQFcEoUIS\",\n \"type\": + \"function\",\n \"function\": {\n \"name\": \"TaskEvaluation\",\n + \ \"arguments\": \"{\\\"suggestions\\\":[\\\"Include additional + context for the greeting to make it more meaningful.\\\",\\\"Specify if you + want a casual or formal tone for greetings.\\\",\\\"Provide examples of variations + of the greeting if necessary.\\\"],\\\"quality\\\":10,\\\"entities\\\":[],\\\"relationships\\\":[]}\"\n + \ }\n }\n ],\n \"refusal\": null\n },\n + \ \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n + \ \"usage\": {\n \"prompt_tokens\": 273,\n \"completion_tokens\": 50,\n + \ \"total_tokens\": 323,\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_bd83329f63\"\n}\n" + headers: + CF-RAY: + - 90cd3973589f1698-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Tue, 04 Feb 2025 19:56:32 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '1408' + 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: + - '149999876' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_519fd27ca3d5da4d541c4331654e0520 + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/utilities/cassettes/test_crew_emits_end_task_event.yaml b/tests/utilities/cassettes/test_crew_emits_end_task_event.yaml new file mode 100644 index 000000000..09cb318d2 --- /dev/null +++ b/tests/utilities/cassettes/test_crew_emits_end_task_event.yaml @@ -0,0 +1,357 @@ +interactions: +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + a helpful assistant that just says hi\nYour personal goal is: Just say hi\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: Just say hi\n\nThis is the expect criteria for your + final answer: hi\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: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '836' + content-type: + - application/json + cookie: + - __cf_bm=nedOdWE1YnKQYt1kSbrcA.zhwa3bZDzmZqTOjZYER0c-1738700521-1.0.1.1-xQk9iXOvqvyXNhkIOgc8Ws2WYcT1mJFkDCvCC8xA5joFD8QfNrBIAr_Qs6sIxt2EzXyeFwBA6gA8ZgWApCHx0Q; + _cfuvid=Cl48aI8.jSRja0Pqr6Jrh3mAnigd4rDn6lhGicyjMPY-1738698987673-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-AxJlK2np8dMxYgsDIuyz2TSKKELWh\",\n \"object\": + \"chat.completion\",\n \"created\": 1738700682,\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: hi\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 161,\n \"completion_tokens\": 12,\n \"total_tokens\": 173,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 90cd62c1fdb0fa6a-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Tue, 04 Feb 2025 20:24:42 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '326' + 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: + - '149999810' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_22be86be6fd9d69ca8d310ef534e7bec + http_version: HTTP/1.1 + status_code: 200 +- request: + body: !!binary | + Cp0mCiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkS9CUKEgoQY3Jld2FpLnRl + bGVtZXRyeRKkBwoQfRmsiIy66Scw43CcUw5ZiBIIfYDEhWJTOTkqDENyZXcgQ3JlYXRlZDABOcD6 + XvsOGyEYQWC2bPsOGyEYShsKDmNyZXdhaV92ZXJzaW9uEgkKBzAuMTAwLjBKGgoOcHl0aG9uX3Zl + cnNpb24SCAoGMy4xMi44Si4KCGNyZXdfa2V5EiIKIGU1ODA3MDFkNTJlYjY1YWZmMjRlZWZlNzhj + NzQ2MjhjSjEKB2NyZXdfaWQSJgokMDMzNTZiYmEtMzJmZC00OThmLTgxYTItYzc1ZDBkMzc2N2Qx + ShwKDGNyZXdfcHJvY2VzcxIMCgpzZXF1ZW50aWFsShEKC2NyZXdfbWVtb3J5EgIQAEoaChRjcmV3 + X251bWJlcl9vZl90YXNrcxICGAFKGwoVY3Jld19udW1iZXJfb2ZfYWdlbnRzEgIYAUrRAgoLY3Jl + d19hZ2VudHMSwQIKvgJbeyJrZXkiOiAiYWQxNTMxNjFjNWM1YTg1NmFhMGQwNmIyNDljNGM2NGEi + LCAiaWQiOiAiZjY5YTRmYTMtMzQ4OC00MmFhLTlhMTQtMGEzZmEyOWJmYjZjIiwgInJvbGUiOiAi + YmFzZV9hZ2VudCIsICJ2ZXJib3NlPyI6IGZhbHNlLCAibWF4X2l0ZXIiOiAyMCwgIm1heF9ycG0i + OiBudWxsLCAiZnVuY3Rpb25fY2FsbGluZ19sbG0iOiAiIiwgImxsbSI6ICJncHQtNG8tbWluaSIs + ICJkZWxlZ2F0aW9uX2VuYWJsZWQ/IjogZmFsc2UsICJhbGxvd19jb2RlX2V4ZWN1dGlvbj8iOiBm + YWxzZSwgIm1heF9yZXRyeV9saW1pdCI6IDIsICJ0b29sc19uYW1lcyI6IFtdfV1K/wEKCmNyZXdf + dGFza3MS8AEK7QFbeyJrZXkiOiAiMWIxNWVmMjM5MTViMjc1NWU4OWEwZWMzYjI2YTEzZDIiLCAi + aWQiOiAiNDllNzk0MmMtZTJiMy00YmE1LTg5MTUtMTYwYjQxMDU2ZmVlIiwgImFzeW5jX2V4ZWN1 + dGlvbj8iOiBmYWxzZSwgImh1bWFuX2lucHV0PyI6IGZhbHNlLCAiYWdlbnRfcm9sZSI6ICJiYXNl + X2FnZW50IiwgImFnZW50X2tleSI6ICJhZDE1MzE2MWM1YzVhODU2YWEwZDA2YjI0OWM0YzY0YSIs + ICJ0b29sc19uYW1lcyI6IFtdfV16AhgBhQEAAQAAEo4CChCLgjutPq/3tkNyPqVjfbZhEgjhB7lb + clxzdyoMVGFzayBDcmVhdGVkMAE5CC9++w4bIRhBeMN++w4bIRhKLgoIY3Jld19rZXkSIgogZTU4 + MDcwMWQ1MmViNjVhZmYyNGVlZmU3OGM3NDYyOGNKMQoHY3Jld19pZBImCiQwMzM1NmJiYS0zMmZk + LTQ5OGYtODFhMi1jNzVkMGQzNzY3ZDFKLgoIdGFza19rZXkSIgogMWIxNWVmMjM5MTViMjc1NWU4 + OWEwZWMzYjI2YTEzZDJKMQoHdGFza19pZBImCiQ0OWU3OTQyYy1lMmIzLTRiYTUtODkxNS0xNjBi + NDEwNTZmZWV6AhgBhQEAAQAAEqQHChC7SpRSs6eG9XFmYuMQgghQEghpZMlScOy2DyoMQ3JldyBD + cmVhdGVkMAE50O2cAA8bIRhBOFmrAA8bIRhKGwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4xMDAuMEoa + Cg5weXRob25fdmVyc2lvbhIICgYzLjEyLjhKLgoIY3Jld19rZXkSIgogZTU4MDcwMWQ1MmViNjVh + ZmYyNGVlZmU3OGM3NDYyOGNKMQoHY3Jld19pZBImCiRlYTQ1MWY2OS00Zjk3LTQ4MjYtOWNlYi04 + NTAzMDk2MTQ2MDlKHAoMY3Jld19wcm9jZXNzEgwKCnNlcXVlbnRpYWxKEQoLY3Jld19tZW1vcnkS + AhAAShoKFGNyZXdfbnVtYmVyX29mX3Rhc2tzEgIYAUobChVjcmV3X251bWJlcl9vZl9hZ2VudHMS + AhgBStECCgtjcmV3X2FnZW50cxLBAgq+Alt7ImtleSI6ICJhZDE1MzE2MWM1YzVhODU2YWEwZDA2 + YjI0OWM0YzY0YSIsICJpZCI6ICJmNjlhNGZhMy0zNDg4LTQyYWEtOWExNC0wYTNmYTI5YmZiNmMi + LCAicm9sZSI6ICJiYXNlX2FnZW50IiwgInZlcmJvc2U/IjogZmFsc2UsICJtYXhfaXRlciI6IDIw + LCAibWF4X3JwbSI6IG51bGwsICJmdW5jdGlvbl9jYWxsaW5nX2xsbSI6ICIiLCAibGxtIjogImdw + dC00by1taW5pIiwgImRlbGVnYXRpb25fZW5hYmxlZD8iOiBmYWxzZSwgImFsbG93X2NvZGVfZXhl + Y3V0aW9uPyI6IGZhbHNlLCAibWF4X3JldHJ5X2xpbWl0IjogMiwgInRvb2xzX25hbWVzIjogW119 + XUr/AQoKY3Jld190YXNrcxLwAQrtAVt7ImtleSI6ICIxYjE1ZWYyMzkxNWIyNzU1ZTg5YTBlYzNi + MjZhMTNkMiIsICJpZCI6ICI0OWU3OTQyYy1lMmIzLTRiYTUtODkxNS0xNjBiNDEwNTZmZWUiLCAi + YXN5bmNfZXhlY3V0aW9uPyI6IGZhbHNlLCAiaHVtYW5faW5wdXQ/IjogZmFsc2UsICJhZ2VudF9y + b2xlIjogImJhc2VfYWdlbnQiLCAiYWdlbnRfa2V5IjogImFkMTUzMTYxYzVjNWE4NTZhYTBkMDZi + MjQ5YzRjNjRhIiwgInRvb2xzX25hbWVzIjogW119XXoCGAGFAQABAAASjgIKEM1q5zTl6Q6WKHPQ + eIqEm7sSCCWi2wvaFqpfKgxUYXNrIENyZWF0ZWQwATmIObwADxshGEEAo7wADxshGEouCghjcmV3 + X2tleRIiCiBlNTgwNzAxZDUyZWI2NWFmZjI0ZWVmZTc4Yzc0NjI4Y0oxCgdjcmV3X2lkEiYKJGVh + NDUxZjY5LTRmOTctNDgyNi05Y2ViLTg1MDMwOTYxNDYwOUouCgh0YXNrX2tleRIiCiAxYjE1ZWYy + MzkxNWIyNzU1ZTg5YTBlYzNiMjZhMTNkMkoxCgd0YXNrX2lkEiYKJDQ5ZTc5NDJjLWUyYjMtNGJh + NS04OTE1LTE2MGI0MTA1NmZlZXoCGAGFAQABAAASpAcKEEhIZzGdZRAdvfcluDR5qvESCFMGo60X + V/dYKgxDcmV3IENyZWF0ZWQwATnY8LgBDxshGEGQrsUBDxshGEobCg5jcmV3YWlfdmVyc2lvbhIJ + CgcwLjEwMC4wShoKDnB5dGhvbl92ZXJzaW9uEggKBjMuMTIuOEouCghjcmV3X2tleRIiCiBlNTgw + NzAxZDUyZWI2NWFmZjI0ZWVmZTc4Yzc0NjI4Y0oxCgdjcmV3X2lkEiYKJDA3MDJmOGU1LWRjMTYt + NDlhYi1hMWY1LThjOWQyY2IwMDYwYkocCgxjcmV3X3Byb2Nlc3MSDAoKc2VxdWVudGlhbEoRCgtj + cmV3X21lbW9yeRICEABKGgoUY3Jld19udW1iZXJfb2ZfdGFza3MSAhgBShsKFWNyZXdfbnVtYmVy + X29mX2FnZW50cxICGAFK0QIKC2NyZXdfYWdlbnRzEsECCr4CW3sia2V5IjogImFkMTUzMTYxYzVj + NWE4NTZhYTBkMDZiMjQ5YzRjNjRhIiwgImlkIjogImY2OWE0ZmEzLTM0ODgtNDJhYS05YTE0LTBh + M2ZhMjliZmI2YyIsICJyb2xlIjogImJhc2VfYWdlbnQiLCAidmVyYm9zZT8iOiBmYWxzZSwgIm1h + eF9pdGVyIjogMjAsICJtYXhfcnBtIjogbnVsbCwgImZ1bmN0aW9uX2NhbGxpbmdfbGxtIjogIiIs + ICJsbG0iOiAiZ3B0LTRvLW1pbmkiLCAiZGVsZWdhdGlvbl9lbmFibGVkPyI6IGZhbHNlLCAiYWxs + b3dfY29kZV9leGVjdXRpb24/IjogZmFsc2UsICJtYXhfcmV0cnlfbGltaXQiOiAyLCAidG9vbHNf + bmFtZXMiOiBbXX1dSv8BCgpjcmV3X3Rhc2tzEvABCu0BW3sia2V5IjogIjFiMTVlZjIzOTE1YjI3 + NTVlODlhMGVjM2IyNmExM2QyIiwgImlkIjogIjQ5ZTc5NDJjLWUyYjMtNGJhNS04OTE1LTE2MGI0 + MTA1NmZlZSIsICJhc3luY19leGVjdXRpb24/IjogZmFsc2UsICJodW1hbl9pbnB1dD8iOiBmYWxz + ZSwgImFnZW50X3JvbGUiOiAiYmFzZV9hZ2VudCIsICJhZ2VudF9rZXkiOiAiYWQxNTMxNjFjNWM1 + YTg1NmFhMGQwNmIyNDljNGM2NGEiLCAidG9vbHNfbmFtZXMiOiBbXX1degIYAYUBAAEAABKOAgoQ + PkgvMtq3aT5YPXE8gCRxPBIIMx/zQOuC+8sqDFRhc2sgQ3JlYXRlZDABOYjk2AEPGyEYQZiI2QEP + GyEYSi4KCGNyZXdfa2V5EiIKIGU1ODA3MDFkNTJlYjY1YWZmMjRlZWZlNzhjNzQ2MjhjSjEKB2Ny + ZXdfaWQSJgokMDcwMmY4ZTUtZGMxNi00OWFiLWExZjUtOGM5ZDJjYjAwNjBiSi4KCHRhc2tfa2V5 + EiIKIDFiMTVlZjIzOTE1YjI3NTVlODlhMGVjM2IyNmExM2QySjEKB3Rhc2tfaWQSJgokNDllNzk0 + MmMtZTJiMy00YmE1LTg5MTUtMTYwYjQxMDU2ZmVlegIYAYUBAAEAABKkBwoQex7nA0gUUrZHbN6F + gWp/gBIIKPd4fiRi7DwqDENyZXcgQ3JlYXRlZDABOTiIrAIPGyEYQdCAtwIPGyEYShsKDmNyZXdh + aV92ZXJzaW9uEgkKBzAuMTAwLjBKGgoOcHl0aG9uX3ZlcnNpb24SCAoGMy4xMi44Si4KCGNyZXdf + a2V5EiIKIGU1ODA3MDFkNTJlYjY1YWZmMjRlZWZlNzhjNzQ2MjhjSjEKB2NyZXdfaWQSJgokMGNm + YjUzZWItMDA2Mi00YmVmLTk1ZTgtMDgwMjQ3NmNkMWRlShwKDGNyZXdfcHJvY2VzcxIMCgpzZXF1 + ZW50aWFsShEKC2NyZXdfbWVtb3J5EgIQAEoaChRjcmV3X251bWJlcl9vZl90YXNrcxICGAFKGwoV + Y3Jld19udW1iZXJfb2ZfYWdlbnRzEgIYAUrRAgoLY3Jld19hZ2VudHMSwQIKvgJbeyJrZXkiOiAi + YWQxNTMxNjFjNWM1YTg1NmFhMGQwNmIyNDljNGM2NGEiLCAiaWQiOiAiZjY5YTRmYTMtMzQ4OC00 + MmFhLTlhMTQtMGEzZmEyOWJmYjZjIiwgInJvbGUiOiAiYmFzZV9hZ2VudCIsICJ2ZXJib3NlPyI6 + IGZhbHNlLCAibWF4X2l0ZXIiOiAyMCwgIm1heF9ycG0iOiBudWxsLCAiZnVuY3Rpb25fY2FsbGlu + Z19sbG0iOiAiIiwgImxsbSI6ICJncHQtNG8tbWluaSIsICJkZWxlZ2F0aW9uX2VuYWJsZWQ/Ijog + ZmFsc2UsICJhbGxvd19jb2RlX2V4ZWN1dGlvbj8iOiBmYWxzZSwgIm1heF9yZXRyeV9saW1pdCI6 + IDIsICJ0b29sc19uYW1lcyI6IFtdfV1K/wEKCmNyZXdfdGFza3MS8AEK7QFbeyJrZXkiOiAiMWIx + NWVmMjM5MTViMjc1NWU4OWEwZWMzYjI2YTEzZDIiLCAiaWQiOiAiNDllNzk0MmMtZTJiMy00YmE1 + LTg5MTUtMTYwYjQxMDU2ZmVlIiwgImFzeW5jX2V4ZWN1dGlvbj8iOiBmYWxzZSwgImh1bWFuX2lu + cHV0PyI6IGZhbHNlLCAiYWdlbnRfcm9sZSI6ICJiYXNlX2FnZW50IiwgImFnZW50X2tleSI6ICJh + ZDE1MzE2MWM1YzVhODU2YWEwZDA2YjI0OWM0YzY0YSIsICJ0b29sc19uYW1lcyI6IFtdfV16AhgB + hQEAAQAAEo4CChD+ymllejCksajGYDua8tgNEghnjlejrbuw2SoMVGFzayBDcmVhdGVkMAE5EDrI + Ag8bIRhBGIzIAg8bIRhKLgoIY3Jld19rZXkSIgogZTU4MDcwMWQ1MmViNjVhZmYyNGVlZmU3OGM3 + NDYyOGNKMQoHY3Jld19pZBImCiQwY2ZiNTNlYi0wMDYyLTRiZWYtOTVlOC0wODAyNDc2Y2QxZGVK + LgoIdGFza19rZXkSIgogMWIxNWVmMjM5MTViMjc1NWU4OWEwZWMzYjI2YTEzZDJKMQoHdGFza19p + ZBImCiQ0OWU3OTQyYy1lMmIzLTRiYTUtODkxNS0xNjBiNDEwNTZmZWV6AhgBhQEAAQAA + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '4896' + Content-Type: + - application/x-protobuf + User-Agent: + - OTel-OTLP-Exporter-Python/1.27.0 + method: POST + uri: https://telemetry.crewai.com:4319/v1/traces + response: + body: + string: "\n\0" + headers: + Content-Length: + - '2' + Content-Type: + - application/x-protobuf + Date: + - Tue, 04 Feb 2025 20:24:47 GMT + status: + code: 200 + message: OK +- request: + body: '{"messages": [{"role": "user", "content": "Assess the quality of the task + completed based on the description, expected output, and actual results.\n\nTask + Description:\nJust say hi\n\nExpected Output:\nhi\n\nActual Output:\nhi\n\nPlease + provide:\n- Bullet points suggestions to improve future similar tasks\n- A score + from 0 to 10 evaluating on completion, quality, and overall performance- Entities + extracted from the task output, if any, their type, description, and relationships"}], + "model": "gpt-4o-mini", "tool_choice": {"type": "function", "function": {"name": + "TaskEvaluation"}}, "tools": [{"type": "function", "function": {"name": "TaskEvaluation", + "description": "Correctly extracted `TaskEvaluation` with all the required parameters + with correct types", "parameters": {"$defs": {"Entity": {"properties": {"name": + {"description": "The name of the entity.", "title": "Name", "type": "string"}, + "type": {"description": "The type of the entity.", "title": "Type", "type": + "string"}, "description": {"description": "Description of the entity.", "title": + "Description", "type": "string"}, "relationships": {"description": "Relationships + of the entity.", "items": {"type": "string"}, "title": "Relationships", "type": + "array"}}, "required": ["name", "type", "description", "relationships"], "title": + "Entity", "type": "object"}}, "properties": {"suggestions": {"description": + "Suggestions to improve future similar tasks.", "items": {"type": "string"}, + "title": "Suggestions", "type": "array"}, "quality": {"description": "A score + from 0 to 10 evaluating on completion, quality, and overall performance, all + taking into account the task description, expected output, and the result of + the task.", "title": "Quality", "type": "number"}, "entities": {"description": + "Entities extracted from the task output.", "items": {"$ref": "#/$defs/Entity"}, + "title": "Entities", "type": "array"}}, "required": ["entities", "quality", + "suggestions"], "type": "object"}}}]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '1962' + content-type: + - application/json + cookie: + - __cf_bm=nedOdWE1YnKQYt1kSbrcA.zhwa3bZDzmZqTOjZYER0c-1738700521-1.0.1.1-xQk9iXOvqvyXNhkIOgc8Ws2WYcT1mJFkDCvCC8xA5joFD8QfNrBIAr_Qs6sIxt2EzXyeFwBA6gA8ZgWApCHx0Q; + _cfuvid=Cl48aI8.jSRja0Pqr6Jrh3mAnigd4rDn6lhGicyjMPY-1738698987673-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-AxJlLVC3gCB9gRI0ZSkoPCZY7EwpQ\",\n \"object\": + \"chat.completion\",\n \"created\": 1738700683,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n + \ \"id\": \"call_mgwImOITW8lkjzAyf9Pp76cL\",\n \"type\": + \"function\",\n \"function\": {\n \"name\": \"TaskEvaluation\",\n + \ \"arguments\": \"{\\\"suggestions\\\":[\\\"Provide context or + additional information to make tasks more engaging.\\\",\\\"Encourage variations + in responses to make the interaction more dynamic.\\\"],\\\"quality\\\":10,\\\"entities\\\":[{\\\"name\\\":\\\"hi\\\",\\\"type\\\":\\\"greeting\\\",\\\"description\\\":\\\"A + common word used to initiate a conversation or express friendliness.\\\",\\\"relationships\\\":[\\\"initiates + conversation\\\",\\\"expresses friendliness\\\"]}]}\"\n }\n }\n + \ ],\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 273,\n \"completion_tokens\": 71,\n \"total_tokens\": 344,\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_bd83329f63\"\n}\n" + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 90cd62c4ba41fa6a-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Tue, 04 Feb 2025 20:24:50 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '7347' + 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: + - '149999876' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_aec28dd3fe998d628754e8429623bf9e + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/utilities/cassettes/test_crew_emits_kickoff_events.yaml b/tests/utilities/cassettes/test_crew_emits_kickoff_events.yaml new file mode 100644 index 000000000..2233bde21 --- /dev/null +++ b/tests/utilities/cassettes/test_crew_emits_kickoff_events.yaml @@ -0,0 +1,245 @@ +interactions: +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + a helpful assistant that just says hi\nYour personal goal is: Just say hi\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: Just say hi\n\nThis is the expect criteria for your + final answer: hi\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: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '836' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-AxJIrSWAFqDEsNtLRhcM8vMHO9Ejw\",\n \"object\": + \"chat.completion\",\n \"created\": 1738698917,\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: hi\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 161,\n \"completion_tokens\": 12,\n \"total_tokens\": 173,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 90cd37a83f5f176a-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Tue, 04 Feb 2025 19:55:18 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=rKQWp4fbAvcCp4rasEN6DqiTjQfiWYpLfjcLpWcmzi0-1738698918-1.0.1.1-qlcCSdBY3KWbzVms0eLtz5ub5SSLGs_sRLxTdNhDk_purQuz9k6EFp8PHJfN3aP_sLnuyKnFlppM3.2k_dCtPQ; + path=/; expires=Tue, 04-Feb-25 20:25:18 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=Oi91zDXvjWohBYXSVqK4hFsq3_GZePEIIbi7b7wrjcI-1738698918130-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '894' + 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: + - '149999810' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_864253996bbc0f797f9a2c1b9247a0d5 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "user", "content": "Assess the quality of the task + completed based on the description, expected output, and actual results.\n\nTask + Description:\nJust say hi\n\nExpected Output:\nhi\n\nActual Output:\nhi\n\nPlease + provide:\n- Bullet points suggestions to improve future similar tasks\n- A score + from 0 to 10 evaluating on completion, quality, and overall performance- Entities + extracted from the task output, if any, their type, description, and relationships"}], + "model": "gpt-4o-mini", "tool_choice": {"type": "function", "function": {"name": + "TaskEvaluation"}}, "tools": [{"type": "function", "function": {"name": "TaskEvaluation", + "description": "Correctly extracted `TaskEvaluation` with all the required parameters + with correct types", "parameters": {"$defs": {"Entity": {"properties": {"name": + {"description": "The name of the entity.", "title": "Name", "type": "string"}, + "type": {"description": "The type of the entity.", "title": "Type", "type": + "string"}, "description": {"description": "Description of the entity.", "title": + "Description", "type": "string"}, "relationships": {"description": "Relationships + of the entity.", "items": {"type": "string"}, "title": "Relationships", "type": + "array"}}, "required": ["name", "type", "description", "relationships"], "title": + "Entity", "type": "object"}}, "properties": {"suggestions": {"description": + "Suggestions to improve future similar tasks.", "items": {"type": "string"}, + "title": "Suggestions", "type": "array"}, "quality": {"description": "A score + from 0 to 10 evaluating on completion, quality, and overall performance, all + taking into account the task description, expected output, and the result of + the task.", "title": "Quality", "type": "number"}, "entities": {"description": + "Entities extracted from the task output.", "items": {"$ref": "#/$defs/Entity"}, + "title": "Entities", "type": "array"}}, "required": ["entities", "quality", + "suggestions"], "type": "object"}}}]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '1962' + content-type: + - application/json + cookie: + - __cf_bm=rKQWp4fbAvcCp4rasEN6DqiTjQfiWYpLfjcLpWcmzi0-1738698918-1.0.1.1-qlcCSdBY3KWbzVms0eLtz5ub5SSLGs_sRLxTdNhDk_purQuz9k6EFp8PHJfN3aP_sLnuyKnFlppM3.2k_dCtPQ; + _cfuvid=Oi91zDXvjWohBYXSVqK4hFsq3_GZePEIIbi7b7wrjcI-1738698918130-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-AxJIsVEppA04iGQh0k6sanKnVObrO\",\n \"object\": + \"chat.completion\",\n \"created\": 1738698918,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n + \ \"id\": \"call_AQ3iizjGWjEvk1SmhGCzjbf1\",\n \"type\": + \"function\",\n \"function\": {\n \"name\": \"TaskEvaluation\",\n + \ \"arguments\": \"{\\\"suggestions\\\":[\\\"Provide context for + the greeting, like a specific scenario or recipient.\\\",\\\"Encourage responses + or follow-ups to promote engagement.\\\",\\\"Specify the tone or formality of + the greeting, if relevant.\\\"],\\\"quality\\\":10,\\\"entities\\\":[{\\\"name\\\":\\\"hi\\\",\\\"type\\\":\\\"greeting\\\",\\\"description\\\":\\\"A + common informal expression used to initiate conversation or acknowledge someone.\\\",\\\"relationships\\\":[\\\"used + in conversation\\\",\\\"expresses friendliness\\\"]}]}\"\n }\n }\n + \ ],\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 273,\n \"completion_tokens\": 84,\n \"total_tokens\": 357,\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_bd83329f63\"\n}\n" + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 90cd37aec8c8176a-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Tue, 04 Feb 2025 19:55:21 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '3269' + 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: + - '149999876' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_e6e67a3f5c6f2d48e0351cdce95edd97 + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/utilities/cassettes/test_crew_emits_start_kickoff_event.yaml b/tests/utilities/cassettes/test_crew_emits_start_kickoff_event.yaml new file mode 100644 index 000000000..82333fe7d --- /dev/null +++ b/tests/utilities/cassettes/test_crew_emits_start_kickoff_event.yaml @@ -0,0 +1,243 @@ +interactions: +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + a helpful assistant that just says hi\nYour personal goal is: Just say hi\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: Just say hi\n\nThis is the expect criteria for your + final answer: hi\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: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '836' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-AxJJzafmayYpGTsTAWbOyZkmQJNa5\",\n \"object\": + \"chat.completion\",\n \"created\": 1738698987,\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: hi\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 161,\n \"completion_tokens\": 12,\n \"total_tokens\": 173,\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_72ed7ab54c\"\n}\n" + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 90cd395b0e641698-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Tue, 04 Feb 2025 19:56:27 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=4s6sWmJ49B9F_wNc1STtdZF1nikfl6uN9_ov3Xzfa8U-1738698987-1.0.1.1-lmbRRS1MHrDbnU93Gh16CP3qNczxxIrQnyBU7vpHSwNf6PdmuWOHKd1mkl5SBx6rg7p1NLaNUMyqDDcE0Mvjzw; + path=/; expires=Tue, 04-Feb-25 20:26:27 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=Cl48aI8.jSRja0Pqr6Jrh3mAnigd4rDn6lhGicyjMPY-1738698987673-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '839' + 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: + - '149999810' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_577b484a927b455c40ed80f9fd4d9106 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "user", "content": "Assess the quality of the task + completed based on the description, expected output, and actual results.\n\nTask + Description:\nJust say hi\n\nExpected Output:\nhi\n\nActual Output:\nhi\n\nPlease + provide:\n- Bullet points suggestions to improve future similar tasks\n- A score + from 0 to 10 evaluating on completion, quality, and overall performance- Entities + extracted from the task output, if any, their type, description, and relationships"}], + "model": "gpt-4o-mini", "tool_choice": {"type": "function", "function": {"name": + "TaskEvaluation"}}, "tools": [{"type": "function", "function": {"name": "TaskEvaluation", + "description": "Correctly extracted `TaskEvaluation` with all the required parameters + with correct types", "parameters": {"$defs": {"Entity": {"properties": {"name": + {"description": "The name of the entity.", "title": "Name", "type": "string"}, + "type": {"description": "The type of the entity.", "title": "Type", "type": + "string"}, "description": {"description": "Description of the entity.", "title": + "Description", "type": "string"}, "relationships": {"description": "Relationships + of the entity.", "items": {"type": "string"}, "title": "Relationships", "type": + "array"}}, "required": ["name", "type", "description", "relationships"], "title": + "Entity", "type": "object"}}, "properties": {"suggestions": {"description": + "Suggestions to improve future similar tasks.", "items": {"type": "string"}, + "title": "Suggestions", "type": "array"}, "quality": {"description": "A score + from 0 to 10 evaluating on completion, quality, and overall performance, all + taking into account the task description, expected output, and the result of + the task.", "title": "Quality", "type": "number"}, "entities": {"description": + "Entities extracted from the task output.", "items": {"$ref": "#/$defs/Entity"}, + "title": "Entities", "type": "array"}}, "required": ["entities", "quality", + "suggestions"], "type": "object"}}}]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '1962' + content-type: + - application/json + cookie: + - __cf_bm=4s6sWmJ49B9F_wNc1STtdZF1nikfl6uN9_ov3Xzfa8U-1738698987-1.0.1.1-lmbRRS1MHrDbnU93Gh16CP3qNczxxIrQnyBU7vpHSwNf6PdmuWOHKd1mkl5SBx6rg7p1NLaNUMyqDDcE0Mvjzw; + _cfuvid=Cl48aI8.jSRja0Pqr6Jrh3mAnigd4rDn6lhGicyjMPY-1738698987673-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-AxJJz10KP7iadNPdKsbcsvHBa7cic\",\n \"object\": + \"chat.completion\",\n \"created\": 1738698987,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n + \ \"id\": \"call_czeHQgy5eiOVa0zlrtcfwepe\",\n \"type\": + \"function\",\n \"function\": {\n \"name\": \"TaskEvaluation\",\n + \ \"arguments\": \"{\\\"suggestions\\\":[\\\"Provide more context + or details for similar tasks to enhance output expectations.\\\",\\\"Encourage + creativity in responses for simple tasks to engage users more effectively.\\\"],\\\"quality\\\":10,\\\"entities\\\":[] + }\"\n }\n }\n ],\n \"refusal\": null\n },\n + \ \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n + \ \"usage\": {\n \"prompt_tokens\": 273,\n \"completion_tokens\": 40,\n + \ \"total_tokens\": 313,\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_bd83329f63\"\n}\n" + headers: + CF-RAY: + - 90cd39615b281698-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Tue, 04 Feb 2025 19:56:29 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '1411' + 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: + - '149999876' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_3e717a80c7d9c5ea19893dd990aaae26 + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/utilities/cassettes/test_crew_emits_start_task_event.yaml b/tests/utilities/cassettes/test_crew_emits_start_task_event.yaml new file mode 100644 index 000000000..e470049a7 --- /dev/null +++ b/tests/utilities/cassettes/test_crew_emits_start_task_event.yaml @@ -0,0 +1,245 @@ +interactions: +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + a helpful assistant that just says hi\nYour personal goal is: Just say hi\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: Just say hi\n\nThis is the expect criteria for your + final answer: hi\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: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '836' + content-type: + - application/json + cookie: + - __cf_bm=4s6sWmJ49B9F_wNc1STtdZF1nikfl6uN9_ov3Xzfa8U-1738698987-1.0.1.1-lmbRRS1MHrDbnU93Gh16CP3qNczxxIrQnyBU7vpHSwNf6PdmuWOHKd1mkl5SBx6rg7p1NLaNUMyqDDcE0Mvjzw; + _cfuvid=Cl48aI8.jSRja0Pqr6Jrh3mAnigd4rDn6lhGicyjMPY-1738698987673-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-AxJiiHEQwIXsiG0Sd5wofcuhxVbo9\",\n \"object\": + \"chat.completion\",\n \"created\": 1738700520,\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: hi\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 161,\n \"completion_tokens\": 12,\n \"total_tokens\": 173,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 90cd5ecd0f7667ee-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Tue, 04 Feb 2025 20:22:01 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=nedOdWE1YnKQYt1kSbrcA.zhwa3bZDzmZqTOjZYER0c-1738700521-1.0.1.1-xQk9iXOvqvyXNhkIOgc8Ws2WYcT1mJFkDCvCC8xA5joFD8QfNrBIAr_Qs6sIxt2EzXyeFwBA6gA8ZgWApCHx0Q; + path=/; expires=Tue, 04-Feb-25 20:52:01 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '450' + 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: + - '149999810' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_10eaafc81640a98a0a4789d270dd94d9 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "user", "content": "Assess the quality of the task + completed based on the description, expected output, and actual results.\n\nTask + Description:\nJust say hi\n\nExpected Output:\nhi\n\nActual Output:\nhi\n\nPlease + provide:\n- Bullet points suggestions to improve future similar tasks\n- A score + from 0 to 10 evaluating on completion, quality, and overall performance- Entities + extracted from the task output, if any, their type, description, and relationships"}], + "model": "gpt-4o-mini", "tool_choice": {"type": "function", "function": {"name": + "TaskEvaluation"}}, "tools": [{"type": "function", "function": {"name": "TaskEvaluation", + "description": "Correctly extracted `TaskEvaluation` with all the required parameters + with correct types", "parameters": {"$defs": {"Entity": {"properties": {"name": + {"description": "The name of the entity.", "title": "Name", "type": "string"}, + "type": {"description": "The type of the entity.", "title": "Type", "type": + "string"}, "description": {"description": "Description of the entity.", "title": + "Description", "type": "string"}, "relationships": {"description": "Relationships + of the entity.", "items": {"type": "string"}, "title": "Relationships", "type": + "array"}}, "required": ["name", "type", "description", "relationships"], "title": + "Entity", "type": "object"}}, "properties": {"suggestions": {"description": + "Suggestions to improve future similar tasks.", "items": {"type": "string"}, + "title": "Suggestions", "type": "array"}, "quality": {"description": "A score + from 0 to 10 evaluating on completion, quality, and overall performance, all + taking into account the task description, expected output, and the result of + the task.", "title": "Quality", "type": "number"}, "entities": {"description": + "Entities extracted from the task output.", "items": {"$ref": "#/$defs/Entity"}, + "title": "Entities", "type": "array"}}, "required": ["entities", "quality", + "suggestions"], "type": "object"}}}]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '1962' + content-type: + - application/json + cookie: + - __cf_bm=nedOdWE1YnKQYt1kSbrcA.zhwa3bZDzmZqTOjZYER0c-1738700521-1.0.1.1-xQk9iXOvqvyXNhkIOgc8Ws2WYcT1mJFkDCvCC8xA5joFD8QfNrBIAr_Qs6sIxt2EzXyeFwBA6gA8ZgWApCHx0Q; + _cfuvid=Cl48aI8.jSRja0Pqr6Jrh3mAnigd4rDn6lhGicyjMPY-1738698987673-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-AxJijOhk12Ua6lS23IwtZTachfjq9\",\n \"object\": + \"chat.completion\",\n \"created\": 1738700521,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n + \ \"id\": \"call_DSteeMHHPf5RanJb8qjCo4qx\",\n \"type\": + \"function\",\n \"function\": {\n \"name\": \"TaskEvaluation\",\n + \ \"arguments\": \"{\\\"suggestions\\\":[\\\"Consider adding context + for the greeting to make it more engaging.\\\",\\\"Specify if any additional + information or tone is desired in the greeting.\\\"],\\\"quality\\\":10,\\\"entities\\\":[{\\\"name\\\":\\\"greeting\\\",\\\"type\\\":\\\"text\\\",\\\"description\\\":\\\"A + simple greeting phrase\\\",\\\"relationships\\\":[\\\"is a\\\",\\\"is part of + a conversation\\\"]}]}\"\n }\n }\n ],\n \"refusal\": + null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n + \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 273,\n \"completion_tokens\": + 67,\n \"total_tokens\": 340,\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_bd83329f63\"\n}\n" + headers: + CF-RAY: + - 90cd5ed20cb267ee-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Tue, 04 Feb 2025 20:22:02 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '1624' + 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: + - '149999876' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_4ee944acdd3928afbf6c5562403b064a + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/utilities/cassettes/test_crew_emits_task_failed_event.yaml b/tests/utilities/cassettes/test_crew_emits_task_failed_event.yaml new file mode 100644 index 000000000..db824bb3d --- /dev/null +++ b/tests/utilities/cassettes/test_crew_emits_task_failed_event.yaml @@ -0,0 +1,114 @@ +interactions: +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + a helpful assistant that just says hi\nYour personal goal is: Just say hi\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: Just say hi\n\nThis is the expect criteria for your + final answer: hi\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: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '836' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-AzpkZLpCyjKT5d6Udfx4zAme2sOMy\",\n \"object\": + \"chat.completion\",\n \"created\": 1739300299,\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: hi\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 161,\n \"completion_tokens\": 12,\n \"total_tokens\": 173,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910691d3ab90ebef-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Tue, 11 Feb 2025 18:58:20 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=MOH5EY6n3p8JKY53.yz7qzLuLYsEB8QdQXH09loUMBM-1739300300-1.0.1.1-hjb4mk04sMygPFhoFyiySKZSqB_fN5PbhbOyn.kipa3.eLvk7EtriDyjvGkBFIAV13DYnc08BfF_l2kxdx9hfQ; + path=/; expires=Tue, 11-Feb-25 19:28:20 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=uu.cEiV.FfgvSvCdKOooDYJWrwjVEuFeGdQodijGUUI-1739300300232-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '1357' + 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: + - '149999810' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_2277503f851195e7d7a43b66eb044454 + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/utilities/cassettes/test_multiple_handlers_for_same_event.yaml b/tests/utilities/cassettes/test_multiple_handlers_for_same_event.yaml new file mode 100644 index 000000000..c63663f4b --- /dev/null +++ b/tests/utilities/cassettes/test_multiple_handlers_for_same_event.yaml @@ -0,0 +1,111 @@ +interactions: +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + a helpful assistant that just says hi\nYour personal goal is: Just say hi\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: Just say hi\n\nThis is the expect criteria for your + final answer: hi\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: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '836' + content-type: + - application/json + cookie: + - _cfuvid=gsNyCo_jrDOolzf8SXHDaxQQrEgdR3jgv4OAH8MziDE-1739291824699-0.0.1.1-604800000; + __cf_bm=cRijYuylMGzRGxv3udQL5PhHOR5mRN_9_eLLwevlM_o-1739299455-1.0.1.1-Fszr_Msw0B1.IBMkiunP.VF2ilul1YGZZV8TqMcO3Q2SHvSlqfgm9NHgns1bJrm0wWRvHiCE7wdZfUAOx7T3Lg + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-AzpWx6pctOvzu6xsbyg0XfSAc0q9V\",\n \"object\": + \"chat.completion\",\n \"created\": 1739299455,\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: hi\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 161,\n \"completion_tokens\": 12,\n \"total_tokens\": 173,\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_72ed7ab54c\"\n}\n" + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 91067d3ddc68fa16-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Tue, 11 Feb 2025 18:44:16 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '703' + 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: + - '149999810' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_89222c00e4608e8557a135e91b223556 + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/utilities/cassettes/test_register_handler_adds_new_handler.yaml b/tests/utilities/cassettes/test_register_handler_adds_new_handler.yaml new file mode 100644 index 000000000..b321c0ddb --- /dev/null +++ b/tests/utilities/cassettes/test_register_handler_adds_new_handler.yaml @@ -0,0 +1,114 @@ +interactions: +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + a helpful assistant that just says hi\nYour personal goal is: Just say hi\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: Just say hi\n\nThis is the expect criteria for your + final answer: hi\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: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '836' + content-type: + - application/json + cookie: + - _cfuvid=gsNyCo_jrDOolzf8SXHDaxQQrEgdR3jgv4OAH8MziDE-1739291824699-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-AzpWxLzAcRzigZuIGmjP3ckQgxAom\",\n \"object\": + \"chat.completion\",\n \"created\": 1739299455,\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: hi\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 161,\n \"completion_tokens\": 12,\n \"total_tokens\": 173,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 91067d389e90fa16-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Tue, 11 Feb 2025 18:44:15 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=cRijYuylMGzRGxv3udQL5PhHOR5mRN_9_eLLwevlM_o-1739299455-1.0.1.1-Fszr_Msw0B1.IBMkiunP.VF2ilul1YGZZV8TqMcO3Q2SHvSlqfgm9NHgns1bJrm0wWRvHiCE7wdZfUAOx7T3Lg; + path=/; expires=Tue, 11-Feb-25 19:14:15 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '716' + 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: + - '149999810' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_ef807dc3223d40332aae8a313e96ef3a + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/utilities/cassettes/test_task_emits_failed_event_on_execution_error.yaml b/tests/utilities/cassettes/test_task_emits_failed_event_on_execution_error.yaml new file mode 100644 index 000000000..9c87bddaa --- /dev/null +++ b/tests/utilities/cassettes/test_task_emits_failed_event_on_execution_error.yaml @@ -0,0 +1,1004 @@ +interactions: +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + a helpful assistant that just says hi\nYour personal goal is: Just say hi\nYou + ONLY have access to the following tools, and should NEVER make up tools that + are not listed here:\n\nTool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error\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 [Say Hi], 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: Just say hi\n\nThis is the expected criteria for your final + answer: hi\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: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '1303' + content-type: + - application/json + cookie: + - _cfuvid=Cl48aI8.jSRja0Pqr6Jrh3mAnigd4rDn6lhGicyjMPY-1738698987673-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0ceNVvGO3iTja3ZJM0GHPp7fptc6\",\n \"object\": + \"chat.completion\",\n \"created\": 1739488271,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: you should always think + about what to do\\nAction: Say Hi\\nAction Input: {}\",\n \"refusal\": + null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n + \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 261,\n \"completion_tokens\": + 22,\n \"total_tokens\": 283,\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_bd83329f63\"\n}\n" + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 91187efd98829e74-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Thu, 13 Feb 2025 23:11:12 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=XgZ48Kh_Np19KQZFMcdhitEO1hYoQQZmGISmqGQyAew-1739488272-1.0.1.1-71ljflXRwwgMFHqNdbWAIPe5U0Svfer60TB92nqmufsvx_NnPNO.ShrjIwdWBpJ6cQIh6szfk6FrIoioemqHgg; + path=/; expires=Thu, 13-Feb-25 23:41:12 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=eFYG1.FIv9a4z_Uqb0svvrE60EPh73_2qTAnZyFX9lA-1739488272138-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '782' + 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: + - '149999697' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_67df2b150e90b637ec98ad5796dfe71d + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + a helpful assistant that just says hi\nYour personal goal is: Just say hi\nYou + ONLY have access to the following tools, and should NEVER make up tools that + are not listed here:\n\nTool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error\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 [Say Hi], 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: Just say hi\n\nThis is the expected criteria for your final + answer: hi\nyou MUST return the actual complete content as the final answer, + not a summary.\n\nBegin! This is VERY important to you, use the tools available + and give your best Final Answer, your job depends on it!\n\nThought:"}, {"role": + "assistant", "content": "```\nThought: you should always think about what to + do\nAction: Say Hi\nAction Input: {}\nObservation: \nI encountered an error + while trying to use the tool. This was the error: Simulated tool error.\n Tool + Say Hi accepts these inputs: Tool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [Say Hi]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '2362' + content-type: + - application/json + cookie: + - _cfuvid=eFYG1.FIv9a4z_Uqb0svvrE60EPh73_2qTAnZyFX9lA-1739488272138-0.0.1.1-604800000; + __cf_bm=XgZ48Kh_Np19KQZFMcdhitEO1hYoQQZmGISmqGQyAew-1739488272-1.0.1.1-71ljflXRwwgMFHqNdbWAIPe5U0Svfer60TB92nqmufsvx_NnPNO.ShrjIwdWBpJ6cQIh6szfk6FrIoioemqHgg + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0ceOtrUJ80V8Li7rmZaP56XCp37M\",\n \"object\": + \"chat.completion\",\n \"created\": 1739488272,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: you should always think + about what to do\\nAction: Say Hi\\nAction Input: {}\",\n \"refusal\": + null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n + \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 494,\n \"completion_tokens\": + 22,\n \"total_tokens\": 516,\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_bd83329f63\"\n}\n" + headers: + CF-RAY: + - 91187f05197b9e74-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Thu, 13 Feb 2025 23:11:12 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '545' + 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: + - '149999447' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_d7c1f2c3bae845e5083c5092852e051f + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + a helpful assistant that just says hi\nYour personal goal is: Just say hi\nYou + ONLY have access to the following tools, and should NEVER make up tools that + are not listed here:\n\nTool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error\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 [Say Hi], 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: Just say hi\n\nThis is the expected criteria for your final + answer: hi\nyou MUST return the actual complete content as the final answer, + not a summary.\n\nBegin! This is VERY important to you, use the tools available + and give your best Final Answer, your job depends on it!\n\nThought:"}, {"role": + "assistant", "content": "```\nThought: you should always think about what to + do\nAction: Say Hi\nAction Input: {}\nObservation: \nI encountered an error + while trying to use the tool. This was the error: Simulated tool error.\n Tool + Say Hi accepts these inputs: Tool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [Say Hi]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: you should always think about what to + do\nAction: Say Hi\nAction Input: {}\nObservation: \nI encountered an error + while trying to use the tool. This was the error: Simulated tool error.\n Tool + Say Hi accepts these inputs: Tool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [Say Hi]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '3421' + content-type: + - application/json + cookie: + - _cfuvid=eFYG1.FIv9a4z_Uqb0svvrE60EPh73_2qTAnZyFX9lA-1739488272138-0.0.1.1-604800000; + __cf_bm=XgZ48Kh_Np19KQZFMcdhitEO1hYoQQZmGISmqGQyAew-1739488272-1.0.1.1-71ljflXRwwgMFHqNdbWAIPe5U0Svfer60TB92nqmufsvx_NnPNO.ShrjIwdWBpJ6cQIh6szfk6FrIoioemqHgg + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0cePLitBGIhHl5SUU1C8s7cmjIEX\",\n \"object\": + \"chat.completion\",\n \"created\": 1739488273,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: you should always think + about what to do\\nAction: Say Hi\\nAction Input: {}\",\n \"refusal\": + null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n + \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 727,\n \"completion_tokens\": + 22,\n \"total_tokens\": 749,\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_bd83329f63\"\n}\n" + headers: + CF-RAY: + - 91187f098ead9e74-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Thu, 13 Feb 2025 23:11:13 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '632' + 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: + - '149999196' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_6c82a00bbf8ab599a6a6cf521cb4bf52 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + a helpful assistant that just says hi\nYour personal goal is: Just say hi\nYou + ONLY have access to the following tools, and should NEVER make up tools that + are not listed here:\n\nTool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error\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 [Say Hi], 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: Just say hi\n\nThis is the expected criteria for your final + answer: hi\nyou MUST return the actual complete content as the final answer, + not a summary.\n\nBegin! This is VERY important to you, use the tools available + and give your best Final Answer, your job depends on it!\n\nThought:"}, {"role": + "assistant", "content": "```\nThought: you should always think about what to + do\nAction: Say Hi\nAction Input: {}\nObservation: \nI encountered an error + while trying to use the tool. This was the error: Simulated tool error.\n Tool + Say Hi accepts these inputs: Tool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [Say Hi]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: you should always think about what to + do\nAction: Say Hi\nAction Input: {}\nObservation: \nI encountered an error + while trying to use the tool. This was the error: Simulated tool error.\n Tool + Say Hi accepts these inputs: Tool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [Say Hi]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: you should always think about what to + do\nAction: Say Hi\nAction Input: {}\nObservation: \nI encountered an error + while trying to use the tool. This was the error: Simulated tool error.\n Tool + Say Hi accepts these inputs: Tool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [Say Hi]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '4480' + content-type: + - application/json + cookie: + - _cfuvid=eFYG1.FIv9a4z_Uqb0svvrE60EPh73_2qTAnZyFX9lA-1739488272138-0.0.1.1-604800000; + __cf_bm=XgZ48Kh_Np19KQZFMcdhitEO1hYoQQZmGISmqGQyAew-1739488272-1.0.1.1-71ljflXRwwgMFHqNdbWAIPe5U0Svfer60TB92nqmufsvx_NnPNO.ShrjIwdWBpJ6cQIh6szfk6FrIoioemqHgg + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0cePDnVjWCsyTlSfvSmP1uUWVqJV\",\n \"object\": + \"chat.completion\",\n \"created\": 1739488273,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: you should always think + about what to do\\nAction: Say Hi\\nAction Input: {}\",\n \"refusal\": + null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n + \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 960,\n \"completion_tokens\": + 22,\n \"total_tokens\": 982,\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_bd83329f63\"\n}\n" + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 91187f0e0bd19e74-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Thu, 13 Feb 2025 23:11:14 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '757' + 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: + - '149998945' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_83956b8df7f7137fec9ae6450f3c9a7b + http_version: HTTP/1.1 + status_code: 200 +- request: + body: !!binary | + CqIiCiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkS+SEKEgoQY3Jld2FpLnRl + bGVtZXRyeRKkBwoQy3yskK/xR1Awm7D0OKZhbxIIH0xxCLM8S5cqDENyZXcgQ3JlYXRlZDABOXBZ + LLZd5yMYQYCpOrZd5yMYShsKDmNyZXdhaV92ZXJzaW9uEgkKBzAuMTAwLjFKGgoOcHl0aG9uX3Zl + cnNpb24SCAoGMy4xMi44Si4KCGNyZXdfa2V5EiIKIGU1ODA3MDFkNTJlYjY1YWZmMjRlZWZlNzhj + NzQ2MjhjSjEKB2NyZXdfaWQSJgokOGQ4NDY3OGYtMDU0NC00MWFiLWIwMjQtMTFkYTRhMTgxNzhj + ShwKDGNyZXdfcHJvY2VzcxIMCgpzZXF1ZW50aWFsShEKC2NyZXdfbWVtb3J5EgIQAEoaChRjcmV3 + X251bWJlcl9vZl90YXNrcxICGAFKGwoVY3Jld19udW1iZXJfb2ZfYWdlbnRzEgIYAUrRAgoLY3Jl + d19hZ2VudHMSwQIKvgJbeyJrZXkiOiAiYWQxNTMxNjFjNWM1YTg1NmFhMGQwNmIyNDljNGM2NGEi + LCAiaWQiOiAiYWQ5OTg5ZTEtNDY5YS00YmQxLTg0ZjQtZWVlNjZhYTBiMjk3IiwgInJvbGUiOiAi + YmFzZV9hZ2VudCIsICJ2ZXJib3NlPyI6IGZhbHNlLCAibWF4X2l0ZXIiOiAyNSwgIm1heF9ycG0i + OiBudWxsLCAiZnVuY3Rpb25fY2FsbGluZ19sbG0iOiAiIiwgImxsbSI6ICJncHQtNG8tbWluaSIs + ICJkZWxlZ2F0aW9uX2VuYWJsZWQ/IjogZmFsc2UsICJhbGxvd19jb2RlX2V4ZWN1dGlvbj8iOiBm + YWxzZSwgIm1heF9yZXRyeV9saW1pdCI6IDIsICJ0b29sc19uYW1lcyI6IFtdfV1K/wEKCmNyZXdf + dGFza3MS8AEK7QFbeyJrZXkiOiAiMWIxNWVmMjM5MTViMjc1NWU4OWEwZWMzYjI2YTEzZDIiLCAi + aWQiOiAiNWUyMWIxOTQtMzE5Ni00NDBhLTg3ZTAtMWEyOGJkZjUxMGUzIiwgImFzeW5jX2V4ZWN1 + dGlvbj8iOiBmYWxzZSwgImh1bWFuX2lucHV0PyI6IGZhbHNlLCAiYWdlbnRfcm9sZSI6ICJiYXNl + X2FnZW50IiwgImFnZW50X2tleSI6ICJhZDE1MzE2MWM1YzVhODU2YWEwZDA2YjI0OWM0YzY0YSIs + ICJ0b29sc19uYW1lcyI6IFtdfV16AhgBhQEAAQAAEo4CChCvtNCi6SXalRPxb+3e9KHyEggbtBZr + f+eAqioMVGFzayBDcmVhdGVkMAE5oJFLtl3nIxhBkOdLtl3nIxhKLgoIY3Jld19rZXkSIgogZTU4 + MDcwMWQ1MmViNjVhZmYyNGVlZmU3OGM3NDYyOGNKMQoHY3Jld19pZBImCiQ4ZDg0Njc4Zi0wNTQ0 + LTQxYWItYjAyNC0xMWRhNGExODE3OGNKLgoIdGFza19rZXkSIgogMWIxNWVmMjM5MTViMjc1NWU4 + OWEwZWMzYjI2YTEzZDJKMQoHdGFza19pZBImCiQ1ZTIxYjE5NC0zMTk2LTQ0MGEtODdlMC0xYTI4 + YmRmNTEwZTN6AhgBhQEAAQAAEqQHChBgHAng7xhBnfS2/GYvkdYbEggsqqZdYq4kICoMQ3JldyBD + cmVhdGVkMAE5MC09t13nIxhBMPdFt13nIxhKGwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4xMDAuMUoa + Cg5weXRob25fdmVyc2lvbhIICgYzLjEyLjhKLgoIY3Jld19rZXkSIgogZTU4MDcwMWQ1MmViNjVh + ZmYyNGVlZmU3OGM3NDYyOGNKMQoHY3Jld19pZBImCiRiMDQ0Njk5NC1jNzMxLTQ4MTQtYjQ0Zi04 + MGUzNmY0NmVlNjdKHAoMY3Jld19wcm9jZXNzEgwKCnNlcXVlbnRpYWxKEQoLY3Jld19tZW1vcnkS + AhAAShoKFGNyZXdfbnVtYmVyX29mX3Rhc2tzEgIYAUobChVjcmV3X251bWJlcl9vZl9hZ2VudHMS + AhgBStECCgtjcmV3X2FnZW50cxLBAgq+Alt7ImtleSI6ICJhZDE1MzE2MWM1YzVhODU2YWEwZDA2 + YjI0OWM0YzY0YSIsICJpZCI6ICJhZDk5ODllMS00NjlhLTRiZDEtODRmNC1lZWU2NmFhMGIyOTci + LCAicm9sZSI6ICJiYXNlX2FnZW50IiwgInZlcmJvc2U/IjogZmFsc2UsICJtYXhfaXRlciI6IDI1 + LCAibWF4X3JwbSI6IG51bGwsICJmdW5jdGlvbl9jYWxsaW5nX2xsbSI6ICIiLCAibGxtIjogImdw + dC00by1taW5pIiwgImRlbGVnYXRpb25fZW5hYmxlZD8iOiBmYWxzZSwgImFsbG93X2NvZGVfZXhl + Y3V0aW9uPyI6IGZhbHNlLCAibWF4X3JldHJ5X2xpbWl0IjogMiwgInRvb2xzX25hbWVzIjogW119 + XUr/AQoKY3Jld190YXNrcxLwAQrtAVt7ImtleSI6ICIxYjE1ZWYyMzkxNWIyNzU1ZTg5YTBlYzNi + MjZhMTNkMiIsICJpZCI6ICI1ZTIxYjE5NC0zMTk2LTQ0MGEtODdlMC0xYTI4YmRmNTEwZTMiLCAi + YXN5bmNfZXhlY3V0aW9uPyI6IGZhbHNlLCAiaHVtYW5faW5wdXQ/IjogZmFsc2UsICJhZ2VudF9y + b2xlIjogImJhc2VfYWdlbnQiLCAiYWdlbnRfa2V5IjogImFkMTUzMTYxYzVjNWE4NTZhYTBkMDZi + MjQ5YzRjNjRhIiwgInRvb2xzX25hbWVzIjogW119XXoCGAGFAQABAAASjgIKEPPkDbccpJ9jDuUl + rzqUoqQSCL6irICbXoxyKgxUYXNrIENyZWF0ZWQwATn4sVm3XecjGEGIF1q3XecjGEouCghjcmV3 + X2tleRIiCiBlNTgwNzAxZDUyZWI2NWFmZjI0ZWVmZTc4Yzc0NjI4Y0oxCgdjcmV3X2lkEiYKJGIw + NDQ2OTk0LWM3MzEtNDgxNC1iNDRmLTgwZTM2ZjQ2ZWU2N0ouCgh0YXNrX2tleRIiCiAxYjE1ZWYy + MzkxNWIyNzU1ZTg5YTBlYzNiMjZhMTNkMkoxCgd0YXNrX2lkEiYKJDVlMjFiMTk0LTMxOTYtNDQw + YS04N2UwLTFhMjhiZGY1MTBlM3oCGAGFAQABAAASpAcKEOZUZG2c1vI5V6bNLpPk3ygSCIKZQpuE + HMQfKgxDcmV3IENyZWF0ZWQwATlwnAC4XecjGEGQMQq4XecjGEobCg5jcmV3YWlfdmVyc2lvbhIJ + CgcwLjEwMC4xShoKDnB5dGhvbl92ZXJzaW9uEggKBjMuMTIuOEouCghjcmV3X2tleRIiCiBlNTgw + NzAxZDUyZWI2NWFmZjI0ZWVmZTc4Yzc0NjI4Y0oxCgdjcmV3X2lkEiYKJGM2ZGQ0OTYwLTU3ZTMt + NGQ5Mi1iZTQzLTg3OTQ0N2NmZjJjNEocCgxjcmV3X3Byb2Nlc3MSDAoKc2VxdWVudGlhbEoRCgtj + cmV3X21lbW9yeRICEABKGgoUY3Jld19udW1iZXJfb2ZfdGFza3MSAhgBShsKFWNyZXdfbnVtYmVy + X29mX2FnZW50cxICGAFK0QIKC2NyZXdfYWdlbnRzEsECCr4CW3sia2V5IjogImFkMTUzMTYxYzVj + NWE4NTZhYTBkMDZiMjQ5YzRjNjRhIiwgImlkIjogImFkOTk4OWUxLTQ2OWEtNGJkMS04NGY0LWVl + ZTY2YWEwYjI5NyIsICJyb2xlIjogImJhc2VfYWdlbnQiLCAidmVyYm9zZT8iOiBmYWxzZSwgIm1h + eF9pdGVyIjogMjUsICJtYXhfcnBtIjogbnVsbCwgImZ1bmN0aW9uX2NhbGxpbmdfbGxtIjogIiIs + ICJsbG0iOiAiZ3B0LTRvLW1pbmkiLCAiZGVsZWdhdGlvbl9lbmFibGVkPyI6IGZhbHNlLCAiYWxs + b3dfY29kZV9leGVjdXRpb24/IjogZmFsc2UsICJtYXhfcmV0cnlfbGltaXQiOiAyLCAidG9vbHNf + bmFtZXMiOiBbXX1dSv8BCgpjcmV3X3Rhc2tzEvABCu0BW3sia2V5IjogIjFiMTVlZjIzOTE1YjI3 + NTVlODlhMGVjM2IyNmExM2QyIiwgImlkIjogIjVlMjFiMTk0LTMxOTYtNDQwYS04N2UwLTFhMjhi + ZGY1MTBlMyIsICJhc3luY19leGVjdXRpb24/IjogZmFsc2UsICJodW1hbl9pbnB1dD8iOiBmYWxz + ZSwgImFnZW50X3JvbGUiOiAiYmFzZV9hZ2VudCIsICJhZ2VudF9rZXkiOiAiYWQxNTMxNjFjNWM1 + YTg1NmFhMGQwNmIyNDljNGM2NGEiLCAidG9vbHNfbmFtZXMiOiBbXX1degIYAYUBAAEAABKOAgoQ + vhlU4CgyTyrgPRf0wlb8eRIIqtS4lWPuJuYqDFRhc2sgQ3JlYXRlZDABOSA9Gbhd5yMYQWiuGbhd + 5yMYSi4KCGNyZXdfa2V5EiIKIGU1ODA3MDFkNTJlYjY1YWZmMjRlZWZlNzhjNzQ2MjhjSjEKB2Ny + ZXdfaWQSJgokYzZkZDQ5NjAtNTdlMy00ZDkyLWJlNDMtODc5NDQ3Y2ZmMmM0Si4KCHRhc2tfa2V5 + EiIKIDFiMTVlZjIzOTE1YjI3NTVlODlhMGVjM2IyNmExM2QySjEKB3Rhc2tfaWQSJgokNWUyMWIx + OTQtMzE5Ni00NDBhLTg3ZTAtMWEyOGJkZjUxMGUzegIYAYUBAAEAABKOAgoQr7izSc/LzkAmDVE4 + TCRtVxIIlEdWL3gr4vAqDFRhc2sgQ3JlYXRlZDABOajMq7hd5yMYQUCErLhd5yMYSi4KCGNyZXdf + a2V5EiIKIGU1ODA3MDFkNTJlYjY1YWZmMjRlZWZlNzhjNzQ2MjhjSjEKB2NyZXdfaWQSJgokYzZk + ZDQ5NjAtNTdlMy00ZDkyLWJlNDMtODc5NDQ3Y2ZmMmM0Si4KCHRhc2tfa2V5EiIKIDFiMTVlZjIz + OTE1YjI3NTVlODlhMGVjM2IyNmExM2QySjEKB3Rhc2tfaWQSJgokYmNhMmRkYmMtZmM4MC00ZTM4 + LWE2ZTAtNTU0MmM2OTIzYTE5egIYAYUBAAEAABJpChAW++bDmEo222QymLgbmnOnEggC9Fj1KYqp + iCoQVG9vbCBVc2FnZSBFcnJvcjABOQja5wRe5yMYQdjm+wRe5yMYShsKDmNyZXdhaV92ZXJzaW9u + EgkKBzAuMTAwLjF6AhgBhQEAAQAAEmkKEOeYSHtVxHT42vgh6qJWipASCG4YjIxTPsQrKhBUb29s + IFVzYWdlIEVycm9yMAE58JKtL17nIxhBeEy8L17nIxhKGwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4x + MDAuMXoCGAGFAQABAAASaQoQd2xGQ0N0fRjEAZb3m591vhII9yEmZE84dukqEFRvb2wgVXNhZ2Ug + RXJyb3IwATkIXzBaXucjGEHgTEJaXucjGEobCg5jcmV3YWlfdmVyc2lvbhIJCgcwLjEwMC4xegIY + AYUBAAEAABJpChCuKrUoVTHcaqSma3csnzpOEgjdvJJFFn7JYioQVG9vbCBVc2FnZSBFcnJvcjAB + OVjIbJFe5yMYQTgIf5Fe5yMYShsKDmNyZXdhaV92ZXJzaW9uEgkKBzAuMTAwLjF6AhgBhQEAAQAA + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '4389' + Content-Type: + - application/x-protobuf + User-Agent: + - OTel-OTLP-Exporter-Python/1.27.0 + method: POST + uri: https://telemetry.crewai.com:4319/v1/traces + response: + body: + string: "\n\0" + headers: + Content-Length: + - '2' + Content-Type: + - application/x-protobuf + Date: + - Thu, 13 Feb 2025 23:11:15 GMT + status: + code: 200 + message: OK +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + a helpful assistant that just says hi\nYour personal goal is: Just say hi\nYou + ONLY have access to the following tools, and should NEVER make up tools that + are not listed here:\n\nTool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error\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 [Say Hi], 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: Just say hi\n\nThis is the expected criteria for your final + answer: hi\nyou MUST return the actual complete content as the final answer, + not a summary.\n\nBegin! This is VERY important to you, use the tools available + and give your best Final Answer, your job depends on it!\n\nThought:"}, {"role": + "assistant", "content": "```\nThought: you should always think about what to + do\nAction: Say Hi\nAction Input: {}\nObservation: \nI encountered an error + while trying to use the tool. This was the error: Simulated tool error.\n Tool + Say Hi accepts these inputs: Tool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [Say Hi]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: you should always think about what to + do\nAction: Say Hi\nAction Input: {}\nObservation: \nI encountered an error + while trying to use the tool. This was the error: Simulated tool error.\n Tool + Say Hi accepts these inputs: Tool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [Say Hi]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: you should always think about what to + do\nAction: Say Hi\nAction Input: {}\nObservation: \nI encountered an error + while trying to use the tool. This was the error: Simulated tool error.\n Tool + Say Hi accepts these inputs: Tool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [Say Hi]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: you should always think about what to + do\nAction: Say Hi\nAction Input: {}\nObservation: \nI encountered an error + while trying to use the tool. This was the error: Simulated tool error.\n Tool + Say Hi accepts these inputs: Tool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [Say Hi]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '5539' + content-type: + - application/json + cookie: + - _cfuvid=eFYG1.FIv9a4z_Uqb0svvrE60EPh73_2qTAnZyFX9lA-1739488272138-0.0.1.1-604800000; + __cf_bm=XgZ48Kh_Np19KQZFMcdhitEO1hYoQQZmGISmqGQyAew-1739488272-1.0.1.1-71ljflXRwwgMFHqNdbWAIPe5U0Svfer60TB92nqmufsvx_NnPNO.ShrjIwdWBpJ6cQIh6szfk6FrIoioemqHgg + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0ceQN5mVVSLXPfYhoXL7kYKYC7js\",\n \"object\": + \"chat.completion\",\n \"created\": 1739488274,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: you should always think + about what to do\\nAction: Say Hi\\nAction Input: {}\",\n \"refusal\": + null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n + \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 1193,\n \"completion_tokens\": + 22,\n \"total_tokens\": 1215,\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_bd83329f63\"\n}\n" + headers: + CF-RAY: + - 91187f13fb279e74-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Thu, 13 Feb 2025 23:11:15 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '615' + 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: + - '149998695' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_732a192814669f7e2fce3f349a4b1b8d + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + a helpful assistant that just says hi\nYour personal goal is: Just say hi\nYou + ONLY have access to the following tools, and should NEVER make up tools that + are not listed here:\n\nTool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error\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 [Say Hi], 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: Just say hi\n\nThis is the expected criteria for your final + answer: hi\nyou MUST return the actual complete content as the final answer, + not a summary.\n\nBegin! This is VERY important to you, use the tools available + and give your best Final Answer, your job depends on it!\n\nThought:"}, {"role": + "assistant", "content": "```\nThought: you should always think about what to + do\nAction: Say Hi\nAction Input: {}\nObservation: \nI encountered an error + while trying to use the tool. This was the error: Simulated tool error.\n Tool + Say Hi accepts these inputs: Tool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [Say Hi]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: you should always think about what to + do\nAction: Say Hi\nAction Input: {}\nObservation: \nI encountered an error + while trying to use the tool. This was the error: Simulated tool error.\n Tool + Say Hi accepts these inputs: Tool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [Say Hi]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: you should always think about what to + do\nAction: Say Hi\nAction Input: {}\nObservation: \nI encountered an error + while trying to use the tool. This was the error: Simulated tool error.\n Tool + Say Hi accepts these inputs: Tool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [Say Hi]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: you should always think about what to + do\nAction: Say Hi\nAction Input: {}\nObservation: \nI encountered an error + while trying to use the tool. This was the error: Simulated tool error.\n Tool + Say Hi accepts these inputs: Tool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [Say Hi]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: you should always think about what to + do\nAction: Say Hi\nAction Input: {}\nObservation: \nI encountered an error + while trying to use the tool. This was the error: Simulated tool error.\n Tool + Say Hi accepts these inputs: Tool Name: Say Hi\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [Say Hi]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '6598' + content-type: + - application/json + cookie: + - _cfuvid=eFYG1.FIv9a4z_Uqb0svvrE60EPh73_2qTAnZyFX9lA-1739488272138-0.0.1.1-604800000; + __cf_bm=XgZ48Kh_Np19KQZFMcdhitEO1hYoQQZmGISmqGQyAew-1739488272-1.0.1.1-71ljflXRwwgMFHqNdbWAIPe5U0Svfer60TB92nqmufsvx_NnPNO.ShrjIwdWBpJ6cQIh6szfk6FrIoioemqHgg + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0ceRVoFzoUPmiO0sOZVNpLbXD41f\",\n \"object\": + \"chat.completion\",\n \"created\": 1739488275,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: I now know the final answer\\nFinal + Answer: hi\\n```\",\n \"refusal\": null\n },\n \"logprobs\": + null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 1426,\n \"completion_tokens\": 17,\n \"total_tokens\": 1443,\n \"prompt_tokens_details\": + {\n \"cached_tokens\": 1024,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": + {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": + 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": + \"default\",\n \"system_fingerprint\": \"fp_bd83329f63\"\n}\n" + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 91187f1b3b1e9e74-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Thu, 13 Feb 2025 23:11:16 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '618' + 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: + - '149998444' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_b12d08242d920f524028f18e6eb2ef1a + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/utilities/cassettes/test_tools_emits_error_events.yaml b/tests/utilities/cassettes/test_tools_emits_error_events.yaml new file mode 100644 index 000000000..86d461ee4 --- /dev/null +++ b/tests/utilities/cassettes/test_tools_emits_error_events.yaml @@ -0,0 +1,7984 @@ +interactions: +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '1348' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FH6vhCaz7tzH23PyNXSb1fZV93F\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398416,\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 utilize the error + tool to generate an error as directed.\\nAction: error_tool\\nAction Input: + {}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": + \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 266,\n \"completion_tokens\": + 25,\n \"total_tokens\": 291,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fed4858f4645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:13:37 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + path=/; expires=Wed, 12-Feb-25 22:43:37 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '624' + 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: + - '149999685' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_4fc2f9553d6100ada24f6c1033a686b1 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: !!binary | + CvgKCiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkSzwoKEgoQY3Jld2FpLnRl + bGVtZXRyeRK8BwoQ0frWr/ChdZU9MoZ6AdNRqxIIKmAD9BKAugUqDENyZXcgQ3JlYXRlZDABOXC/ + l+WklSMYQZCbquWklSMYShsKDmNyZXdhaV92ZXJzaW9uEgkKBzAuMTAwLjFKGgoOcHl0aG9uX3Zl + cnNpb24SCAoGMy4xMi44Si4KCGNyZXdfa2V5EiIKIDNjZDc4MDc0MDI1NDYwM2JmZGJlYmEyNzBk + NTAyNDJkSjEKB2NyZXdfaWQSJgokM2M4MjQ0MGQtMzE5Yy00ZDcyLTlhMTktYjZlNjNmOGYyNzYx + ShwKDGNyZXdfcHJvY2VzcxIMCgpzZXF1ZW50aWFsShEKC2NyZXdfbWVtb3J5EgIQAEoaChRjcmV3 + X251bWJlcl9vZl90YXNrcxICGAFKGwoVY3Jld19udW1iZXJfb2ZfYWdlbnRzEgIYAUrdAgoLY3Jl + d19hZ2VudHMSzQIKygJbeyJrZXkiOiAiMDYwNmVhZDkwNmQ2YTlmZjUwY2ZmYmFiNjFlYzY4MGYi + LCAiaWQiOiAiNDU4MjVhZTEtOWU4YS00OTkyLTk2OTctOTE1M2JlNGVlZjk1IiwgInJvbGUiOiAi + YmFzZV9hZ2VudCIsICJ2ZXJib3NlPyI6IGZhbHNlLCAibWF4X2l0ZXIiOiAyNSwgIm1heF9ycG0i + OiBudWxsLCAiZnVuY3Rpb25fY2FsbGluZ19sbG0iOiAiIiwgImxsbSI6ICJncHQtNG8tbWluaSIs + ICJkZWxlZ2F0aW9uX2VuYWJsZWQ/IjogZmFsc2UsICJhbGxvd19jb2RlX2V4ZWN1dGlvbj8iOiBm + YWxzZSwgIm1heF9yZXRyeV9saW1pdCI6IDIsICJ0b29sc19uYW1lcyI6IFsiZXJyb3JfdG9vbCJd + fV1KiwIKCmNyZXdfdGFza3MS/AEK+QFbeyJrZXkiOiAiMjExN2I4ZTQwYWFhNmQ0YmJjMzQzYzBm + YTNmMGY0ZWYiLCAiaWQiOiAiNzdmOWZiNmUtNzVjMi00OWU4LWEyYjgtNWEyNmRlOTc2MmY1Iiwg + ImFzeW5jX2V4ZWN1dGlvbj8iOiBmYWxzZSwgImh1bWFuX2lucHV0PyI6IGZhbHNlLCAiYWdlbnRf + cm9sZSI6ICJiYXNlX2FnZW50IiwgImFnZW50X2tleSI6ICIwNjA2ZWFkOTA2ZDZhOWZmNTBjZmZi + YWI2MWVjNjgwZiIsICJ0b29sc19uYW1lcyI6IFsiZXJyb3JfdG9vbCJdfV16AhgBhQEAAQAAEo4C + ChAKRXvphnN/TmqFeUM8brxHEghtO58FP/DT1SoMVGFzayBDcmVhdGVkMAE5uEC/5aSVIxhBcMm/ + 5aSVIxhKLgoIY3Jld19rZXkSIgogM2NkNzgwNzQwMjU0NjAzYmZkYmViYTI3MGQ1MDI0MmRKMQoH + Y3Jld19pZBImCiQzYzgyNDQwZC0zMTljLTRkNzItOWExOS1iNmU2M2Y4ZjI3NjFKLgoIdGFza19r + ZXkSIgogMjExN2I4ZTQwYWFhNmQ0YmJjMzQzYzBmYTNmMGY0ZWZKMQoHdGFza19pZBImCiQ3N2Y5 + ZmI2ZS03NWMyLTQ5ZTgtYTJiOC01YTI2ZGU5NzYyZjV6AhgBhQEAAQAAEmkKECvgI35sRcxQDrk8 + gNM9M1wSCHmBQopqGM6UKhBUb29sIFVzYWdlIEVycm9yMAE5uJioF6WVIxhB4GG3F6WVIxhKGwoO + Y3Jld2FpX3ZlcnNpb24SCQoHMC4xMDAuMXoCGAGFAQABAAA= + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '1403' + Content-Type: + - application/x-protobuf + User-Agent: + - OTel-OTLP-Exporter-Python/1.27.0 + method: POST + uri: https://telemetry.crewai.com:4319/v1/traces + response: + body: + string: "\n\0" + headers: + Content-Length: + - '2' + Content-Type: + - application/x-protobuf + Date: + - Wed, 12 Feb 2025 22:13:41 GMT + status: + code: 200 + message: OK +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '2444' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FH70i7MYqeEn4bb5IQxH3pmzxnj\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398417,\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 take action using + the error tool to meet the task's criteria.\\nAction: error_tool\\nAction Input: + {}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": + \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 502,\n \"completion_tokens\": + 27,\n \"total_tokens\": 529,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fed4cdd86645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:13:44 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '7116' + 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: + - '149999426' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_2bc340232d6fb9255e97a6e05119c18f + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}], "model": "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '3545' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHEEw92JyGEE5pcrvIBjr0C9VUk\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398424,\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 execute the error + tool again to ensure it generates the required error.\\nAction: error_tool\\nAction + Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 740,\n \"completion_tokens\": 27,\n \"total_tokens\": 767,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fed79fad8645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:13:45 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '767' + 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: + - '149999165' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_e5de7e64710f0139ad740736930777f2 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: !!binary | + CpMCCiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkS6gEKEgoQY3Jld2FpLnRl + bGVtZXRyeRJpChD7sR7GXzcnWDnWcYsd9rAxEgjB+zF+fMu9xSoQVG9vbCBVc2FnZSBFcnJvcjAB + OVgr1cWmlSMYQejL4MWmlSMYShsKDmNyZXdhaV92ZXJzaW9uEgkKBzAuMTAwLjF6AhgBhQEAAQAA + EmkKEIzFH2t5TuHKtJ+ziyrezcMSCAv/vNVNpHHwKhBUb29sIFVzYWdlIEVycm9yMAE5uPwP/6aV + IxhBiJgh/6aVIxhKGwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4xMDAuMXoCGAGFAQABAAA= + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '278' + Content-Type: + - application/x-protobuf + User-Agent: + - OTel-OTLP-Exporter-Python/1.27.0 + method: POST + uri: https://telemetry.crewai.com:4319/v1/traces + response: + body: + string: "\n\0" + headers: + Content-Length: + - '2' + Content-Type: + - application/x-protobuf + Date: + - Wed, 12 Feb 2025 22:13:46 GMT + status: + code: 200 + message: OK +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '4656' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHF4fZaoKiUPnwUZmdtXAhPXGzD\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398425,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"Thought: I will attempt to use the error + tool once more to fulfill the requirement of generating an error.\\nAction: + error_tool\\nAction Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": + null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 978,\n \"completion_tokens\": 30,\n \"total_tokens\": 1008,\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_72ed7ab54c\"\n}\n" + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 910fed7ff9aa645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:13:46 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '662' + 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: + - '149998901' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_77579e629590837f003910294168ba2c + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '5783' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHGjz4BdqRTAKwfYDupovPwVoRo\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398426,\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 invoke the error tool + once again to achieve the objective of generating an error.\\nAction: error_tool\\nAction + Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 1219,\n \"completion_tokens\": 29,\n \"total_tokens\": 1248,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fed84bee5645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:13:47 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '627' + 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: + - '149998632' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_4deeb2eb5df65512ec0428c821af99c6 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '6904' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHHtYVbuNldm9RCDPK3dtKJXOgO\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398427,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"Thought: I will execute the error tool + again to fulfill the requirement of generating an error.\\nAction: error_tool\\nAction + Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 1459,\n \"completion_tokens\": 27,\n \"total_tokens\": 1486,\n \"prompt_tokens_details\": + {\n \"cached_tokens\": 1024,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": + {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": + 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": + \"default\",\n \"system_fingerprint\": \"fp_72ed7ab54c\"\n}\n" + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 910fed899be7645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:13:47 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '584' + 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: + - '149998366' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_06613cc521757580c84db5256c3fc05d + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}], "model": "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '8020' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHIEJeAeCEkWfKojR46aFlkJnOo\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398428,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"Thought: It is crucial that I use the + error tool to achieve the desired outcome of generating an error.\\nAction: + error_tool\\nAction Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": + null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 1697,\n \"completion_tokens\": 30,\n \"total_tokens\": 1727,\n \"prompt_tokens_details\": + {\n \"cached_tokens\": 1280,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fed8de87d645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:13:48 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '844' + 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: + - '149998101' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_94a2c81d3af909500724519a00717e92 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + It is crucial that I use the error tool to achieve the desired outcome of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}], "model": "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '9144' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHJSPLrsA1L0MfQ3fHqHSA1annU\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398429,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"Thought: I will attempt to use the error + tool again to generate the required error.\\nAction: error_tool\\nAction Input: + {}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": + \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1938,\n \"completion_tokens\": + 26,\n \"total_tokens\": 1964,\n \"prompt_tokens_details\": {\n \"cached_tokens\": + 1536,\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_72ed7ab54c\"\n}\n" + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 910fed944801645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:13:49 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '689' + 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: + - '149997835' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_99633b5796b17c28813c048110427d71 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: !!binary | + CtQECiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkSqwQKEgoQY3Jld2FpLnRl + bGVtZXRyeRJpChBRVrcidDPYJQRCwfWhGD+YEgjFo7G9exrVnCoQVG9vbCBVc2FnZSBFcnJvcjAB + OZBxNiynlSMYQfD1RyynlSMYShsKDmNyZXdhaV92ZXJzaW9uEgkKBzAuMTAwLjF6AhgBhQEAAQAA + EmkKEI47MTyU4xCLYWlfvyvg0joSCOSckNNSHpNVKhBUb29sIFVzYWdlIEVycm9yMAE50HQPVqeV + IxhBcDAdVqeVIxhKGwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4xMDAuMXoCGAGFAQABAAASaQoQV2TU + QZp89k5go2LDP1WMFhIIihuxvZSBmiQqEFRvb2wgVXNhZ2UgRXJyb3IwATmw4cGDp5UjGEGYc9SD + p5UjGEobCg5jcmV3YWlfdmVyc2lvbhIJCgcwLjEwMC4xegIYAYUBAAEAABJpChB2FWguwfKVn4ZG + +abEGGtMEgjs0NjquXFSgioQVG9vbCBVc2FnZSBFcnJvcjABOfh8xMCnlSMYQYCb18CnlSMYShsK + DmNyZXdhaV92ZXJzaW9uEgkKBzAuMTAwLjF6AhgBhQEAAQAAEmkKEBaiySO2umQI8gIMyOJKef8S + COtYvYU9YJzHKhBUb29sIFVzYWdlIEVycm9yMAE5OIM68KeVIxhBYBZS8KeVIxhKGwoOY3Jld2Fp + X3ZlcnNpb24SCQoHMC4xMDAuMXoCGAGFAQABAAA= + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '599' + Content-Type: + - application/x-protobuf + User-Agent: + - OTel-OTLP-Exporter-Python/1.27.0 + method: POST + uri: https://telemetry.crewai.com:4319/v1/traces + response: + body: + string: "\n\0" + headers: + Content-Length: + - '2' + Content-Type: + - application/x-protobuf + Date: + - Wed, 12 Feb 2025 22:13:51 GMT + status: + code: 200 + message: OK +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + It is crucial that I use the error tool to achieve the desired outcome of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I will attempt to use the error tool again to generate the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '10248' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHJ5pQeJip8Vuc4sIgHfFEusZ5E\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398429,\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 invoke the error tool + yet again to satisfy the requirement of producing an error.\\nAction: error_tool\\nAction + Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 2175,\n \"completion_tokens\": 29,\n \"total_tokens\": 2204,\n \"prompt_tokens_details\": + {\n \"cached_tokens\": 1792,\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_72ed7ab54c\"\n}\n" + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 910fed994d45645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22: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 + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '1847' + 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: + - '149997573' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_6995dcc7bff630b9f8bb5b7efecda874 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + It is crucial that I use the error tool to achieve the desired outcome of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I will attempt to use the error tool again to generate the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool yet again + to satisfy the requirement of producing an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '11369' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHLBvHm3RveIHT5nFIeDTW1GG3k\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398431,\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 execute the error + tool again to achieve the goal of producing an error.\\nAction: error_tool\\nAction + Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 2415,\n \"completion_tokens\": 28,\n \"total_tokens\": 2443,\n \"prompt_tokens_details\": + {\n \"cached_tokens\": 2048,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910feda57bd5645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:13:52 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '594' + 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: + - '149997307' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 1ms + x-request-id: + - req_73d9af8616cc03b01c1769b853a87d12 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + It is crucial that I use the error tool to achieve the desired outcome of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I will attempt to use the error tool again to generate the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool yet again + to satisfy the requirement of producing an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to execute the error tool again to + achieve the goal of producing an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}], "model": "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '12480' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHMOtwqTEM5Ig1RuQCEP2kxDewo\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398432,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: I must use the error tool + again to generate an error as required by the task.\\nAction: error_tool\\nAction + Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 2654,\n \"completion_tokens\": 30,\n \"total_tokens\": 2684,\n \"prompt_tokens_details\": + {\n \"cached_tokens\": 2304,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fedaa0957645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:13:53 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '690' + 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: + - '149997042' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 1ms + x-request-id: + - req_981126d0d9130bc6664cfb6bc58efd73 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + It is crucial that I use the error tool to achieve the desired outcome of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I will attempt to use the error tool again to generate the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool yet again + to satisfy the requirement of producing an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to execute the error tool again to + achieve the goal of producing an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I must use the error tool again to generate an error as required by the task.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '13592' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHNeUzJLjdQvArhWBpi7iRMcVeZ\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398433,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: I am required to use the + error tool one more time to ensure that it produces the expected error outcome.\\nAction: + error_tool\\nAction Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": + null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 2895,\n \"completion_tokens\": 34,\n \"total_tokens\": 2929,\n \"prompt_tokens_details\": + {\n \"cached_tokens\": 2560,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fedb0081c645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:13:54 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '876' + 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: + - '149996779' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 1ms + x-request-id: + - req_030fba022dc80d57a5dcb287e9a29d3b + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + It is crucial that I use the error tool to achieve the desired outcome of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I will attempt to use the error tool again to generate the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool yet again + to satisfy the requirement of producing an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to execute the error tool again to + achieve the goal of producing an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I must use the error tool again to generate an error as required by the task.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I am required to use the error tool one + more time to ensure that it produces the expected error outcome.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '14731' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHOKcbMZHSxhPSZE9cEbssUrfeb\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398434,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: I need to use the error + tool again to fulfill the requirement of generating an error result.\\nAction: + error_tool\\nAction Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": + null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 3140,\n \"completion_tokens\": 31,\n \"total_tokens\": 3171,\n \"prompt_tokens_details\": + {\n \"cached_tokens\": 2816,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fedb66f76645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:13:55 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '715' + 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: + - '149996509' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 1ms + x-request-id: + - req_a92d80beb56e73a75dc68b3838ae7257 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + It is crucial that I use the error tool to achieve the desired outcome of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I will attempt to use the error tool again to generate the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool yet again + to satisfy the requirement of producing an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to execute the error tool again to + achieve the goal of producing an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I must use the error tool again to generate an error as required by the task.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I am required to use the error tool one + more time to ensure that it produces the expected error outcome.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to use the error tool again to + fulfill the requirement of generating an error result.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '15858' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHPIh40ysFBxcbYO7XfbwOxxprE\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398435,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: I must use the error tool + again in order to fulfill the task requirement of generating an error.\\nAction: + error_tool\\nAction Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": + null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 3382,\n \"completion_tokens\": 32,\n \"total_tokens\": 3414,\n \"prompt_tokens_details\": + {\n \"cached_tokens\": 2944,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fedbbed8a645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:13:55 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '744' + 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: + - '149996240' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 1ms + x-request-id: + - req_6f1b61ec87e14a048a4ef70c4530f91f + http_version: HTTP/1.1 + status_code: 200 +- request: + body: !!binary | + Cr8FCiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkSlgUKEgoQY3Jld2FpLnRl + bGVtZXRyeRJpChDTSM9Cs5d2sGmD/LtcZjRtEgjUyLL/PcPI2CoQVG9vbCBVc2FnZSBFcnJvcjAB + Obik3WSolSMYQRig8GSolSMYShsKDmNyZXdhaV92ZXJzaW9uEgkKBzAuMTAwLjF6AhgBhQEAAQAA + EmkKELrbz7lhN3OEjLlJViZ+DycSCKQe/bQ9nqoBKhBUb29sIFVzYWdlIEVycm9yMAE5SI1SkKiV + IxhB+LZpkKiVIxhKGwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4xMDAuMXoCGAGFAQABAAASaQoQgmE9 + Wbue47OMffOO8FmjnRIIIh7ziBS93aIqEFRvb2wgVXNhZ2UgRXJyb3IwATmgjE7JqJUjGEFgWmbJ + qJUjGEobCg5jcmV3YWlfdmVyc2lvbhIJCgcwLjEwMC4xegIYAYUBAAEAABJpChBHCdWINZRypEjZ + W0qUEG7jEgh3PGQYXvnGpyoQVG9vbCBVc2FnZSBFcnJvcjABOXAj2AWplSMYQZhR6wWplSMYShsK + DmNyZXdhaV92ZXJzaW9uEgkKBzAuMTAwLjF6AhgBhQEAAQAAEmkKEB6vVnYi2AjNY+Azdm9UEOQS + CBSmm0s+H3vPKhBUb29sIFVzYWdlIEVycm9yMAE5yC6LNamVIxhBcCSdNamVIxhKGwoOY3Jld2Fp + X3ZlcnNpb24SCQoHMC4xMDAuMXoCGAGFAQABAAASaQoQgGwbh1JdpLWke8EcMezg1xII3TeW1siv + 2Z0qEFRvb2wgVXNhZ2UgRXJyb3IwATngPBRyqZUjGEEYDyhyqZUjGEobCg5jcmV3YWlfdmVyc2lv + bhIJCgcwLjEwMC4xegIYAYUBAAEAAA== + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '706' + Content-Type: + - application/x-protobuf + User-Agent: + - OTel-OTLP-Exporter-Python/1.27.0 + method: POST + uri: https://telemetry.crewai.com:4319/v1/traces + response: + body: + string: "\n\0" + headers: + Content-Length: + - '2' + Content-Type: + - application/x-protobuf + Date: + - Wed, 12 Feb 2025 22:13:56 GMT + status: + code: 200 + message: OK +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + It is crucial that I use the error tool to achieve the desired outcome of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I will attempt to use the error tool again to generate the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool yet again + to satisfy the requirement of producing an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to execute the error tool again to + achieve the goal of producing an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I must use the error tool again to generate an error as required by the task.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I am required to use the error tool one + more time to ensure that it produces the expected error outcome.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to use the error tool again to + fulfill the requirement of generating an error result.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I must use the error tool again in order + to fulfill the task requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '16989' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHQIaKaXSVyoZSfmMUXzZU2FdTN\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398436,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: I need to invoke the error + tool once again to ensure that it generates the required error.\\nAction: error_tool\\nAction + Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 3625,\n \"completion_tokens\": 31,\n \"total_tokens\": 3656,\n \"prompt_tokens_details\": + {\n \"cached_tokens\": 3200,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fedc1bc6e645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:13:57 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '941' + 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: + - '149995972' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 1ms + x-request-id: + - req_d30a47f73f07f255d4f163209f64069e + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + It is crucial that I use the error tool to achieve the desired outcome of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I will attempt to use the error tool again to generate the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool yet again + to satisfy the requirement of producing an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to execute the error tool again to + achieve the goal of producing an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I must use the error tool again to generate an error as required by the task.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I am required to use the error tool one + more time to ensure that it produces the expected error outcome.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to use the error tool again to + fulfill the requirement of generating an error result.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I must use the error tool again in order + to fulfill the task requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to invoke the error tool once + again to ensure that it generates the required error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '18114' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHRMzUfYmkTrjp1Aq68ngGgqx8R\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398437,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: It is imperative that + I use the error tool once more to achieve the objective of generating an error.\\nAction: + error_tool\\nAction Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": + null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 3867,\n \"completion_tokens\": 33,\n \"total_tokens\": 3900,\n \"prompt_tokens_details\": + {\n \"cached_tokens\": 3456,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fedc83b86645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:13:58 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '1001' + 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: + - '149995706' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 1ms + x-request-id: + - req_1d1250bbb4668c11f16c2bcc2ed81cd7 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + It is crucial that I use the error tool to achieve the desired outcome of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I will attempt to use the error tool again to generate the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool yet again + to satisfy the requirement of producing an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to execute the error tool again to + achieve the goal of producing an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I must use the error tool again to generate an error as required by the task.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I am required to use the error tool one + more time to ensure that it produces the expected error outcome.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to use the error tool again to + fulfill the requirement of generating an error result.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I must use the error tool again in order + to fulfill the task requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to invoke the error tool once + again to ensure that it generates the required error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: It is imperative that I use the error + tool once more to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '19250' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHSPObUFeE3ms9giwTuNrelc4XC\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398438,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: I will attempt to use + the error tool once again to meet the requirement of generating an error.\\nAction: + error_tool\\nAction Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": + null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 4111,\n \"completion_tokens\": 32,\n \"total_tokens\": 4143,\n \"prompt_tokens_details\": + {\n \"cached_tokens\": 3712,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fedcfbcc1645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:13:59 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '916' + 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: + - '149995435' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 1ms + x-request-id: + - req_f19b2dbbbc896921211bb47c381f8931 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + It is crucial that I use the error tool to achieve the desired outcome of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I will attempt to use the error tool again to generate the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool yet again + to satisfy the requirement of producing an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to execute the error tool again to + achieve the goal of producing an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I must use the error tool again to generate an error as required by the task.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I am required to use the error tool one + more time to ensure that it produces the expected error outcome.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to use the error tool again to + fulfill the requirement of generating an error result.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I must use the error tool again in order + to fulfill the task requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to invoke the error tool once + again to ensure that it generates the required error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: It is imperative that I use the error + tool once more to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I will attempt to use the error tool + once again to meet the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '20380' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHTjrfFlHx3oqvNsiFT4LwJ1YoE\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398439,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: I need to invoke the error + tool again to generate the required error.\\nAction: error_tool\\nAction Input: + {}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": + \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 4354,\n \"completion_tokens\": + 27,\n \"total_tokens\": 4381,\n \"prompt_tokens_details\": {\n \"cached_tokens\": + 3968,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fedd65c29645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:14:00 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '679' + 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: + - '149995167' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 1ms + x-request-id: + - req_d2674fde0c7fb93df248854b661e987a + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + It is crucial that I use the error tool to achieve the desired outcome of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I will attempt to use the error tool again to generate the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool yet again + to satisfy the requirement of producing an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to execute the error tool again to + achieve the goal of producing an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I must use the error tool again to generate an error as required by the task.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I am required to use the error tool one + more time to ensure that it produces the expected error outcome.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to use the error tool again to + fulfill the requirement of generating an error result.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I must use the error tool again in order + to fulfill the task requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to invoke the error tool once + again to ensure that it generates the required error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: It is imperative that I use the error + tool once more to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I will attempt to use the error tool + once again to meet the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to invoke the error tool again + to generate the required error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}], "model": "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '21484' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHUhJJXPb2qT9vj11m8a69bGHtG\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398440,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: I need to use the error + tool one last time to fulfill the requirement of generating an error.\\nAction: + error_tool\\nAction Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": + null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 4592,\n \"completion_tokens\": 32,\n \"total_tokens\": 4624,\n \"prompt_tokens_details\": + {\n \"cached_tokens\": 4224,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910feddb5a33645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:14:01 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '922' + 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: + - '149994906' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 2ms + x-request-id: + - req_1a84525050669cc645198bb98792e4bf + http_version: HTTP/1.1 + status_code: 200 +- request: + body: !!binary | + CtQECiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkSqwQKEgoQY3Jld2FpLnRl + bGVtZXRyeRJpChAKBbGTtAvlRxHDSNFY9ezjEggllIhhDvqeISoQVG9vbCBVc2FnZSBFcnJvcjAB + OZAyDbCplSMYQQBVILCplSMYShsKDmNyZXdhaV92ZXJzaW9uEgkKBzAuMTAwLjF6AhgBhQEAAQAA + EmkKEMB6X+K6/Wj48Jy8zUW/XLgSCCMwX0eJr7/5KhBUb29sIFVzYWdlIEVycm9yMAE5uM6r96mV + IxhBaCK896mVIxhKGwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4xMDAuMXoCGAGFAQABAAASaQoQGdw6 + Baw+XVW52/Q2Cln+1hII6iJwodf5HyQqEFRvb2wgVXNhZ2UgRXJyb3IwATnIKjg2qpUjGEGwqk02 + qpUjGEobCg5jcmV3YWlfdmVyc2lvbhIJCgcwLjEwMC4xegIYAYUBAAEAABJpChDEPiaA7zRCTPn+ + MlcRw8wkEgiejl1vq5WoiioQVG9vbCBVc2FnZSBFcnJvcjABOSBr92WqlSMYQQhuDGaqlSMYShsK + DmNyZXdhaV92ZXJzaW9uEgkKBzAuMTAwLjF6AhgBhQEAAQAAEmkKEFlwF2/WR2U5pkcL/hsbbPoS + CHZWpR/iTVPMKhBUb29sIFVzYWdlIEVycm9yMAE5SNkyo6qVIxhBmCRHo6qVIxhKGwoOY3Jld2Fp + X3ZlcnNpb24SCQoHMC4xMDAuMXoCGAGFAQABAAA= + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '599' + Content-Type: + - application/x-protobuf + User-Agent: + - OTel-OTLP-Exporter-Python/1.27.0 + method: POST + uri: https://telemetry.crewai.com:4319/v1/traces + response: + body: + string: "\n\0" + headers: + Content-Length: + - '2' + Content-Type: + - application/x-protobuf + Date: + - Wed, 12 Feb 2025 22:14:01 GMT + status: + code: 200 + message: OK +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + It is crucial that I use the error tool to achieve the desired outcome of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I will attempt to use the error tool again to generate the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool yet again + to satisfy the requirement of producing an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to execute the error tool again to + achieve the goal of producing an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I must use the error tool again to generate an error as required by the task.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I am required to use the error tool one + more time to ensure that it produces the expected error outcome.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to use the error tool again to + fulfill the requirement of generating an error result.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I must use the error tool again in order + to fulfill the task requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to invoke the error tool once + again to ensure that it generates the required error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: It is imperative that I use the error + tool once more to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I will attempt to use the error tool + once again to meet the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to invoke the error tool again + to generate the required error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I need to use the error tool one last time to fulfill the requirement of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}], "model": "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '22612' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHVH7MvRoFT7B7e7IpkzueKwy9j\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398441,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: I will attempt to use + the error tool again to generate the required error outcome.\\nAction: error_tool\\nAction + Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 4835,\n \"completion_tokens\": 29,\n \"total_tokens\": 4864,\n \"prompt_tokens_details\": + {\n \"cached_tokens\": 4480,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fede1c96d645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:14:02 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '846' + 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: + - '149994638' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 2ms + x-request-id: + - req_327bfa4c759b13ab552379caf0187607 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: !!binary | + CqcBCiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkSfwoSChBjcmV3YWkudGVs + ZW1ldHJ5EmkKEAhGZqveighMFSniJFHCB3sSCMUr2V0Yhf4pKhBUb29sIFVzYWdlIEVycm9yMAE5 + EOlK26qVIxhBIMhW26qVIxhKGwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4xMDAuMXoCGAGFAQABAAA= + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '170' + Content-Type: + - application/x-protobuf + User-Agent: + - OTel-OTLP-Exporter-Python/1.27.0 + method: POST + uri: https://telemetry.crewai.com:4319/v1/traces + response: + body: + string: "\n\0" + headers: + Content-Length: + - '2' + Content-Type: + - application/x-protobuf + Date: + - Wed, 12 Feb 2025 22:14:06 GMT + status: + code: 200 + message: OK +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + It is crucial that I use the error tool to achieve the desired outcome of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I will attempt to use the error tool again to generate the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool yet again + to satisfy the requirement of producing an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to execute the error tool again to + achieve the goal of producing an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I must use the error tool again to generate an error as required by the task.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I am required to use the error tool one + more time to ensure that it produces the expected error outcome.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to use the error tool again to + fulfill the requirement of generating an error result.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I must use the error tool again in order + to fulfill the task requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to invoke the error tool once + again to ensure that it generates the required error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: It is imperative that I use the error + tool once more to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I will attempt to use the error tool + once again to meet the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to invoke the error tool again + to generate the required error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I need to use the error tool one last time to fulfill the requirement of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I will attempt to use the error tool again to generate the required error outcome.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '23729' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHeaj8KEtbcNzmziMlzqLVCSgIE\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398450,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: I need to utilize the + error tool once more to ensure an error is generated as required.\\nAction: + error_tool\\nAction Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": + null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 5075,\n \"completion_tokens\": 31,\n \"total_tokens\": 5106,\n \"prompt_tokens_details\": + {\n \"cached_tokens\": 4736,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fede7bfea645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:14:10 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '8545' + 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: + - '149994373' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 2ms + x-request-id: + - req_88b44516547a11a57f01a140004ecc9d + http_version: HTTP/1.1 + status_code: 200 +- request: + body: !!binary | + CqcBCiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkSfwoSChBjcmV3YWkudGVs + ZW1ldHJ5EmkKEO0uhb4qh6dmtSMJyGzR2WASCBOzRYDB/NrSKhBUb29sIFVzYWdlIEVycm9yMAE5 + wJ//5ayVIxhBMMIS5qyVIxhKGwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4xMDAuMXoCGAGFAQABAAA= + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '170' + Content-Type: + - application/x-protobuf + User-Agent: + - OTel-OTLP-Exporter-Python/1.27.0 + method: POST + uri: https://telemetry.crewai.com:4319/v1/traces + response: + body: + string: "\n\0" + headers: + Content-Length: + - '2' + Content-Type: + - application/x-protobuf + Date: + - Wed, 12 Feb 2025 22:14:11 GMT + status: + code: 200 + message: OK +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + It is crucial that I use the error tool to achieve the desired outcome of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I will attempt to use the error tool again to generate the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool yet again + to satisfy the requirement of producing an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to execute the error tool again to + achieve the goal of producing an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I must use the error tool again to generate an error as required by the task.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I am required to use the error tool one + more time to ensure that it produces the expected error outcome.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to use the error tool again to + fulfill the requirement of generating an error result.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I must use the error tool again in order + to fulfill the task requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to invoke the error tool once + again to ensure that it generates the required error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: It is imperative that I use the error + tool once more to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I will attempt to use the error tool + once again to meet the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to invoke the error tool again + to generate the required error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I need to use the error tool one last time to fulfill the requirement of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I will attempt to use the error tool again to generate the required error outcome.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to utilize the error tool once + more to ensure an error is generated as required.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '24851' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHfMTYklUHK8nx6Q0IwtIiisPjJ\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398451,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: I will invoke the error + tool yet again to fulfill the objective of generating an error.\\nAction: error_tool\\nAction + Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 5317,\n \"completion_tokens\": 30,\n \"total_tokens\": 5347,\n \"prompt_tokens_details\": + {\n \"cached_tokens\": 4992,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fee1e7ce9645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:14:11 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '726' + 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: + - '149994107' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 2ms + x-request-id: + - req_65c6000bda31086a102d26bf09b22ce2 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + It is crucial that I use the error tool to achieve the desired outcome of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I will attempt to use the error tool again to generate the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool yet again + to satisfy the requirement of producing an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to execute the error tool again to + achieve the goal of producing an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I must use the error tool again to generate an error as required by the task.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I am required to use the error tool one + more time to ensure that it produces the expected error outcome.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to use the error tool again to + fulfill the requirement of generating an error result.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I must use the error tool again in order + to fulfill the task requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to invoke the error tool once + again to ensure that it generates the required error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: It is imperative that I use the error + tool once more to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I will attempt to use the error tool + once again to meet the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to invoke the error tool again + to generate the required error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I need to use the error tool one last time to fulfill the requirement of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I will attempt to use the error tool again to generate the required error outcome.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to utilize the error tool once + more to ensure an error is generated as required.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I will invoke the error tool yet again + to fulfill the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '25973' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHgLR0KLc6GxWG8GzBuwoXtw1R0\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398452,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: I must use the error tool + once more to ensure that it produces the necessary error result.\\nAction: error_tool\\nAction + Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 5558,\n \"completion_tokens\": 31,\n \"total_tokens\": 5589,\n \"prompt_tokens_details\": + {\n \"cached_tokens\": 5120,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fee23eac8645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:14:12 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '892' + 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: + - '149993840' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 2ms + x-request-id: + - req_1448bb4a556fe74c082bfc8a11b6303b + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + It is crucial that I use the error tool to achieve the desired outcome of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I will attempt to use the error tool again to generate the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool yet again + to satisfy the requirement of producing an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to execute the error tool again to + achieve the goal of producing an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I must use the error tool again to generate an error as required by the task.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I am required to use the error tool one + more time to ensure that it produces the expected error outcome.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to use the error tool again to + fulfill the requirement of generating an error result.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I must use the error tool again in order + to fulfill the task requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to invoke the error tool once + again to ensure that it generates the required error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: It is imperative that I use the error + tool once more to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I will attempt to use the error tool + once again to meet the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to invoke the error tool again + to generate the required error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I need to use the error tool one last time to fulfill the requirement of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I will attempt to use the error tool again to generate the required error outcome.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to utilize the error tool once + more to ensure an error is generated as required.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I will invoke the error tool yet again + to fulfill the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I must use the error tool once more to + ensure that it produces the necessary error result.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}], "model": + "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '27098' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHhKgkjrj8tcHYyE71DkOjdKfSv\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398453,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: I need to execute the + error tool again to generate the required error.\\nAction: error_tool\\nAction + Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 5800,\n \"completion_tokens\": 27,\n \"total_tokens\": 5827,\n \"prompt_tokens_details\": + {\n \"cached_tokens\": 5376,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fee2a19ea645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:14:13 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '677' + 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: + - '149993574' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 2ms + x-request-id: + - req_88caa8151dd23fc2bda4fd3bfbae01d9 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + It is crucial that I use the error tool to achieve the desired outcome of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I will attempt to use the error tool again to generate the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool yet again + to satisfy the requirement of producing an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to execute the error tool again to + achieve the goal of producing an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I must use the error tool again to generate an error as required by the task.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I am required to use the error tool one + more time to ensure that it produces the expected error outcome.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to use the error tool again to + fulfill the requirement of generating an error result.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I must use the error tool again in order + to fulfill the task requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to invoke the error tool once + again to ensure that it generates the required error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: It is imperative that I use the error + tool once more to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I will attempt to use the error tool + once again to meet the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to invoke the error tool again + to generate the required error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I need to use the error tool one last time to fulfill the requirement of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I will attempt to use the error tool again to generate the required error outcome.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to utilize the error tool once + more to ensure an error is generated as required.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I will invoke the error tool yet again + to fulfill the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I must use the error tool once more to + ensure that it produces the necessary error result.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to execute the error tool again + to generate the required error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}], "model": "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '28203' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHhCKtham1XIcrJqd78PO3EN7OI\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398453,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: I will use the error tool + once more to achieve the result of generating an error as required.\\nAction: + error_tool\\nAction Input: {}\",\n \"refusal\": null\n },\n \"logprobs\": + null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 6038,\n \"completion_tokens\": 32,\n \"total_tokens\": 6070,\n \"prompt_tokens_details\": + {\n \"cached_tokens\": 5632,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fee2ede8c645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:14:14 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '771' + 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: + - '149993311' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 2ms + x-request-id: + - req_a35693c7ae4568930b98e99dc8107c67 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + an assistant that tests error handling\nYour personal goal is: Try to use the + error tool\nYou ONLY have access to the following tools, and should NEVER make + up tools that are not listed here:\n\nTool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error\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 [error_tool], + 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: Use the error tool\n\nThis is the + expected criteria for your final answer: This should error\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 need to utilize the error tool to generate an error as directed.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to take action using the error tool + to meet the task''s criteria.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I need to execute the error tool again to ensure it generates the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will attempt to use the error tool once + more to fulfill the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool once again + to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I will execute the error tool again to fulfill + the requirement of generating an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + It is crucial that I use the error tool to achieve the desired outcome of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "Thought: + I will attempt to use the error tool again to generate the required error.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to invoke the error tool yet again + to satisfy the requirement of producing an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "Thought: I need to execute the error tool again to + achieve the goal of producing an error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I must use the error tool again to generate an error as required by the task.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I am required to use the error tool one + more time to ensure that it produces the expected error outcome.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to use the error tool again to + fulfill the requirement of generating an error result.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I must use the error tool again in order + to fulfill the task requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to invoke the error tool once + again to ensure that it generates the required error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: It is imperative that I use the error + tool once more to achieve the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I will attempt to use the error tool + once again to meet the requirement of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to invoke the error tool again + to generate the required error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I need to use the error tool one last time to fulfill the requirement of generating + an error.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I will attempt to use the error tool again to generate the required error outcome.\nAction: + error_tool\nAction Input: {}\nObservation: \nI encountered an error while trying + to use the tool. This was the error: Simulated tool error.\n Tool error_tool + accepts these inputs: Tool Name: error_tool\nTool Arguments: {}\nTool Description: + This tool always raises an error.\nMoving on then. I MUST either use a tool + (use one at time) OR give my best final answer not both at the same time. When + responding, I must use the following format:\n\n```\nThought: you should always + think about what to do\nAction: the action to take, should be one of [error_tool]\nAction + Input: the input to the action, dictionary enclosed in curly braces\nObservation: + the result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to utilize the error tool once + more to ensure an error is generated as required.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I will invoke the error tool yet again + to fulfill the objective of generating an error.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I must use the error tool once more to + ensure that it produces the necessary error result.\nAction: error_tool\nAction + Input: {}\nObservation: \nI encountered an error while trying to use the tool. + This was the error: Simulated tool error.\n Tool error_tool accepts these inputs: + Tool Name: error_tool\nTool Arguments: {}\nTool Description: This tool always + raises an error.\nMoving on then. I MUST either use a tool (use one at time) + OR give my best final answer not both at the same time. When responding, I must + use the following format:\n\n```\nThought: you should always think about what + to do\nAction: the action to take, should be one of [error_tool]\nAction Input: + the input to the action, dictionary enclosed in curly braces\nObservation: the + result of the action\n```\nThis Thought/Action/Action Input/Result can repeat + N times. Once I know the final answer, I must return the following format:\n\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\n```"}, {"role": + "assistant", "content": "```\nThought: I need to execute the error tool again + to generate the required error.\nAction: error_tool\nAction Input: {}\nObservation: + \nI encountered an error while trying to use the tool. This was the error: Simulated + tool error.\n Tool error_tool accepts these inputs: Tool Name: error_tool\nTool + Arguments: {}\nTool Description: This tool always raises an error.\nMoving on + then. I MUST either use a tool (use one at time) OR give my best final answer + not both at the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I will use the error tool once more to achieve the result of generating an error + as required.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```"}, {"role": "assistant", "content": "```\nThought: + I will use the error tool once more to achieve the result of generating an error + as required.\nAction: error_tool\nAction Input: {}\nObservation: \nI encountered + an error while trying to use the tool. This was the error: Simulated tool error.\n + Tool error_tool accepts these inputs: Tool Name: error_tool\nTool Arguments: + {}\nTool Description: This tool always raises an error.\nMoving on then. I MUST + either use a tool (use one at time) OR give my best final answer not both at + the same time. When responding, I must use the following format:\n\n```\nThought: + you should always think about what to do\nAction: the action to take, should + be one of [error_tool]\nAction Input: the input to the action, dictionary enclosed + in curly braces\nObservation: the result of the action\n```\nThis Thought/Action/Action + Input/Result can repeat N times. Once I know the final answer, I must return + the following format:\n\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\n```\nNow it''s time you MUST give your absolute + best final answer. You''ll ignore all previous instructions, stop using any + tools, and just return your absolute BEST Final answer."}], "model": "gpt-4o-mini", + "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '30633' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHiH5ItD56EXGX4Gfxfwpt3sHTz\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398454,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: I now know the final answer\\nFinal + Answer: This task has successfully demonstrated the usage of the error tool + by consistently raising simulated errors upon invocation. The process has effectively + met the requirement of generating errors as expected throughout the iterations. + Ultimately, the error handling mechanism has been validated.\\n```\",\n \"refusal\": + null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n + \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 6557,\n \"completion_tokens\": + 60,\n \"total_tokens\": 6617,\n \"prompt_tokens_details\": {\n \"cached_tokens\": + 5888,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fee348ccd645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:14:15 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '1307' + 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: + - '149992733' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 2ms + x-request-id: + - req_aec2f30fb0c92a93aa9bddd27c067c12 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: !!binary | + CukDCiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkSwAMKEgoQY3Jld2FpLnRl + bGVtZXRyeRJpChA7b+yjDRMEafS+rJzxMR2REgjXqtrENdZR+CoQVG9vbCBVc2FnZSBFcnJvcjAB + OYi4chmtlSMYQYjJhBmtlSMYShsKDmNyZXdhaV92ZXJzaW9uEgkKBzAuMTAwLjF6AhgBhQEAAQAA + EmkKEGqDv4ux3Md/wlB1LE5DrWESCIh+R2EiPMrsKhBUb29sIFVzYWdlIEVycm9yMAE5kDT+VK2V + IxhBICgRVa2VIxhKGwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4xMDAuMXoCGAGFAQABAAASaQoQCjHw + l8wIMOh+n0R6fA14kxIIv5OBBhpNmmwqEFRvb2wgVXNhZ2UgRXJyb3IwATnAyE2CrZUjGEFIlFmC + rZUjGEobCg5jcmV3YWlfdmVyc2lvbhIJCgcwLjEwMC4xegIYAYUBAAEAABJpChCE9A42c+0uZsg+ + oJNAoATjEgg+O6gpajP9UioQVG9vbCBVc2FnZSBFcnJvcjABORDNi7itlSMYQYhTnLitlSMYShsK + DmNyZXdhaV92ZXJzaW9uEgkKBzAuMTAwLjF6AhgBhQEAAQAA + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '492' + Content-Type: + - application/x-protobuf + User-Agent: + - OTel-OTLP-Exporter-Python/1.27.0 + method: POST + uri: https://telemetry.crewai.com:4319/v1/traces + response: + body: + string: "\n\0" + headers: + Content-Length: + - '2' + Content-Type: + - application/x-protobuf + Date: + - Wed, 12 Feb 2025 22:14:16 GMT + status: + code: 200 + message: OK +- request: + body: '{"messages": [{"role": "user", "content": "Assess the quality of the task + completed based on the description, expected output, and actual results.\n\nTask + Description:\nUse the error tool\n\nExpected Output:\nThis should error\n\nActual + Output:\nThis task has successfully demonstrated the usage of the error tool + by consistently raising simulated errors upon invocation. The process has effectively + met the requirement of generating errors as expected throughout the iterations. + Ultimately, the error handling mechanism has been validated.\n```\n\nPlease + provide:\n- Bullet points suggestions to improve future similar tasks\n- A score + from 0 to 10 evaluating on completion, quality, and overall performance- Entities + extracted from the task output, if any, their type, description, and relationships"}], + "model": "gpt-4o-mini", "tool_choice": {"type": "function", "function": {"name": + "TaskEvaluation"}}, "tools": [{"type": "function", "function": {"name": "TaskEvaluation", + "description": "Correctly extracted `TaskEvaluation` with all the required parameters + with correct types", "parameters": {"$defs": {"Entity": {"properties": {"name": + {"description": "The name of the entity.", "title": "Name", "type": "string"}, + "type": {"description": "The type of the entity.", "title": "Type", "type": + "string"}, "description": {"description": "Description of the entity.", "title": + "Description", "type": "string"}, "relationships": {"description": "Relationships + of the entity.", "items": {"type": "string"}, "title": "Relationships", "type": + "array"}}, "required": ["name", "type", "description", "relationships"], "title": + "Entity", "type": "object"}}, "properties": {"suggestions": {"description": + "Suggestions to improve future similar tasks.", "items": {"type": "string"}, + "title": "Suggestions", "type": "array"}, "quality": {"description": "A score + from 0 to 10 evaluating on completion, quality, and overall performance, all + taking into account the task description, expected output, and the result of + the task.", "title": "Quality", "type": "number"}, "entities": {"description": + "Entities extracted from the task output.", "items": {"$ref": "#/$defs/Entity"}, + "title": "Entities", "type": "array"}}, "required": ["entities", "quality", + "suggestions"], "type": "object"}}}]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '2281' + content-type: + - application/json + cookie: + - __cf_bm=NjDQE2T9zcxydfwNgOc.SrJBMJcVHlHBYFY3df_H.Jc-1739398417-1.0.1.1-5Kg1Fk4iJD17yky.x.u91SYwct5VtRSNjjovuKJ15amw9q4ZoMGY3ryEYiLmcaH0e2NaABkfj_CJhbQIJuF8Jw; + _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B0FHlZrGJAK15O3NFva2aEeqaMItJ\",\n \"object\": + \"chat.completion\",\n \"created\": 1739398457,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n + \ \"id\": \"call_NEctVd0EbiVH38MTfnrXwzrx\",\n \"type\": + \"function\",\n \"function\": {\n \"name\": \"TaskEvaluation\",\n + \ \"arguments\": \"{\\\"suggestions\\\":[\\\"Clearly define what + type of errors are expected to be produced (e.g., syntax errors, runtime errors)\\\",\\\"Include + examples of the expected output format for the errors\\\",\\\"Specify the conditions + under which the error tool should be triggered\\\",\\\"Add instructions on how + to handle or log the errors generated\\\",\\\"Outline the expected behavior + of the system after the errors are raised to validate the error handling mechanism\\\"],\\\"quality\\\":6,\\\"entities\\\":[{\\\"name\\\":\\\"error + tool\\\",\\\"type\\\":\\\"Tool\\\",\\\"description\\\":\\\"A tool used to simulate + and raise errors during task execution.\\\",\\\"relationships\\\":[\\\"used + in error handling\\\",\\\"helps in validating error scenarios\\\"]},{\\\"name\\\":\\\"errors\\\",\\\"type\\\":\\\"Outcome\\\",\\\"description\\\":\\\"Simulated + errors produced by the error tool during its invocation.\\\",\\\"relationships\\\":[\\\"generated + by the error tool\\\"]},{\\\"name\\\":\\\"error handling mechanism\\\",\\\"type\\\":\\\"System\\\",\\\"description\\\":\\\"The + component of the system responsible for managing errors and ensuring proper + feedback during execution.\\\",\\\"relationships\\\":[\\\"validated by the output + of the error tool\\\"]}]}\"\n }\n }\n ],\n \"refusal\": + null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n + \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 321,\n \"completion_tokens\": + 198,\n \"total_tokens\": 519,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 910fee479a35645f-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Wed, 12 Feb 2025 22:14:20 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '3366' + 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: + - '149999796' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_dd4090f2ef7bb898e293b19bd1f05e06 + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/utilities/cassettes/test_tools_emits_finished_events.yaml b/tests/utilities/cassettes/test_tools_emits_finished_events.yaml new file mode 100644 index 000000000..548ac2b0a --- /dev/null +++ b/tests/utilities/cassettes/test_tools_emits_finished_events.yaml @@ -0,0 +1,512 @@ +interactions: +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + a helpful assistant that just says hi\nYour personal goal is: Just say hi\nYou + ONLY have access to the following tools, and should NEVER make up tools that + are not listed here:\n\nTool Name: say_hi\nTool Arguments: {}\nTool Description: + Say hi\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 [say_hi], 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: Just say + hi\n\nThis is the expect criteria for your final answer: hi\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: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '1275' + content-type: + - application/json + cookie: + - _cfuvid=efIHP1NUsh1dFewGJBu4YoBu6hhGa8vjOOKQglYQGno-1739214901306-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-AzUA6kJQfpUvB4CGot4gSfAIR0foh\",\n \"object\": + \"chat.completion\",\n \"created\": 1739217314,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"you should always think about what to + do \\nAction: say_hi \\nAction Input: {} \",\n \"refusal\": null\n + \ },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n + \ ],\n \"usage\": {\n \"prompt_tokens\": 257,\n \"completion_tokens\": + 19,\n \"total_tokens\": 276,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 90fea7d78e1fceb9-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Mon, 10 Feb 2025 19:55:15 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=fmlg1wjOwuOwZhUUOEtL1tQYluAPumn7AHLF8s0EU2Y-1739217315-1.0.1.1-PQDvxn8TOhzaznlHjwVsqPZUzbAyJWFkvzCubfNJydTu2_AyA1cJ8hkM0khsEE4UY_xp8iPe2gSGmH1ydrDa0Q; + path=/; expires=Mon, 10-Feb-25 20:25:15 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '526' + 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: + - '149999703' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_f6358ff0cc7a2b8d2e167ab00a40f2a4 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + a helpful assistant that just says hi\nYour personal goal is: Just say hi\nYou + ONLY have access to the following tools, and should NEVER make up tools that + are not listed here:\n\nTool Name: say_hi\nTool Arguments: {}\nTool Description: + Say hi\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 [say_hi], 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: Just say + hi\n\nThis is the expect criteria for your final answer: hi\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": "you + should always think about what to do \nAction: say_hi \nAction Input: {} \nObservation: + hi"}], "model": "gpt-4o-mini", "stop": ["\nObservation:"]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '1410' + content-type: + - application/json + cookie: + - _cfuvid=efIHP1NUsh1dFewGJBu4YoBu6hhGa8vjOOKQglYQGno-1739214901306-0.0.1.1-604800000; + __cf_bm=fmlg1wjOwuOwZhUUOEtL1tQYluAPumn7AHLF8s0EU2Y-1739217315-1.0.1.1-PQDvxn8TOhzaznlHjwVsqPZUzbAyJWFkvzCubfNJydTu2_AyA1cJ8hkM0khsEE4UY_xp8iPe2gSGmH1ydrDa0Q + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-AzUA7QdlQy1WZZijxNWUv25sZycg0\",\n \"object\": + \"chat.completion\",\n \"created\": 1739217315,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"```\\nThought: I now know the final answer\\nFinal + Answer: hi\\n```\",\n \"refusal\": null\n },\n \"logprobs\": + null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 283,\n \"completion_tokens\": 17,\n \"total_tokens\": 300,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 90fea7dc5ba6ceb9-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Mon, 10 Feb 2025 19:55:15 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '388' + 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: + - '149999680' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_7d7c68b90b3a9c3ac6092fe17ac1185a + http_version: HTTP/1.1 + status_code: 200 +- request: + body: !!binary | + CoMzCiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkS2jIKEgoQY3Jld2FpLnRl + bGVtZXRyeRKOAgoQ2EINIGZRoXD589od63oHmBIIMfUgEWudUbIqDFRhc2sgQ3JlYXRlZDABOcjI + 7lbu8CIYQZB471bu8CIYSi4KCGNyZXdfa2V5EiIKIGU1ODA3MDFkNTJlYjY1YWZmMjRlZWZlNzhj + NzQ2MjhjSjEKB2NyZXdfaWQSJgokNTE4ODdiOTktY2FlMy00Yjc4LWJjMGEtMDY4MmVmNWEzNGQ0 + Si4KCHRhc2tfa2V5EiIKIDFiMTVlZjIzOTE1YjI3NTVlODlhMGVjM2IyNmExM2QySjEKB3Rhc2tf + aWQSJgokMzlmMDlmMWUtOTJmOC00ZGJiLTgzNDAtNjU2ZmVkMDk3ZjM0egIYAYUBAAEAABKkBwoQ + RzhWoF6ewSTS/qUc9yeFRhIIM3SNZCwjz5AqDENyZXcgQ3JlYXRlZDABOQjrGlru8CIYQdgbKVru + 8CIYShsKDmNyZXdhaV92ZXJzaW9uEgkKBzAuMTAwLjBKGgoOcHl0aG9uX3ZlcnNpb24SCAoGMy4x + Mi44Si4KCGNyZXdfa2V5EiIKIGU1ODA3MDFkNTJlYjY1YWZmMjRlZWZlNzhjNzQ2MjhjSjEKB2Ny + ZXdfaWQSJgokYzk4ODFkY2YtMmM0MS00ZjRlLTgzMjctNjJjYjFhYjJkOTg4ShwKDGNyZXdfcHJv + Y2VzcxIMCgpzZXF1ZW50aWFsShEKC2NyZXdfbWVtb3J5EgIQAEoaChRjcmV3X251bWJlcl9vZl90 + YXNrcxICGAFKGwoVY3Jld19udW1iZXJfb2ZfYWdlbnRzEgIYAUrRAgoLY3Jld19hZ2VudHMSwQIK + vgJbeyJrZXkiOiAiYWQxNTMxNjFjNWM1YTg1NmFhMGQwNmIyNDljNGM2NGEiLCAiaWQiOiAiNTU2 + NzJiMDgtOTU4ZC00MjljLWE3ZTctY2ZlN2U4Y2MwOGZkIiwgInJvbGUiOiAiYmFzZV9hZ2VudCIs + ICJ2ZXJib3NlPyI6IGZhbHNlLCAibWF4X2l0ZXIiOiAyMCwgIm1heF9ycG0iOiBudWxsLCAiZnVu + Y3Rpb25fY2FsbGluZ19sbG0iOiAiIiwgImxsbSI6ICJncHQtNG8tbWluaSIsICJkZWxlZ2F0aW9u + X2VuYWJsZWQ/IjogZmFsc2UsICJhbGxvd19jb2RlX2V4ZWN1dGlvbj8iOiBmYWxzZSwgIm1heF9y + ZXRyeV9saW1pdCI6IDIsICJ0b29sc19uYW1lcyI6IFtdfV1K/wEKCmNyZXdfdGFza3MS8AEK7QFb + eyJrZXkiOiAiMWIxNWVmMjM5MTViMjc1NWU4OWEwZWMzYjI2YTEzZDIiLCAiaWQiOiAiMzlmMDlm + MWUtOTJmOC00ZGJiLTgzNDAtNjU2ZmVkMDk3ZjM0IiwgImFzeW5jX2V4ZWN1dGlvbj8iOiBmYWxz + ZSwgImh1bWFuX2lucHV0PyI6IGZhbHNlLCAiYWdlbnRfcm9sZSI6ICJiYXNlX2FnZW50IiwgImFn + ZW50X2tleSI6ICJhZDE1MzE2MWM1YzVhODU2YWEwZDA2YjI0OWM0YzY0YSIsICJ0b29sc19uYW1l + cyI6IFtdfV16AhgBhQEAAQAAEo4CChB8AxWkb2Uwpdc8RpyCRqw5EggJAxbgNu81XyoMVGFzayBD + cmVhdGVkMAE5+HQ8Wu7wIhhB+PE8Wu7wIhhKLgoIY3Jld19rZXkSIgogZTU4MDcwMWQ1MmViNjVh + ZmYyNGVlZmU3OGM3NDYyOGNKMQoHY3Jld19pZBImCiRjOTg4MWRjZi0yYzQxLTRmNGUtODMyNy02 + MmNiMWFiMmQ5ODhKLgoIdGFza19rZXkSIgogMWIxNWVmMjM5MTViMjc1NWU4OWEwZWMzYjI2YTEz + ZDJKMQoHdGFza19pZBImCiQzOWYwOWYxZS05MmY4LTRkYmItODM0MC02NTZmZWQwOTdmMzR6AhgB + hQEAAQAAEqQHChCcXvdbsgYC+gzCMrXs3LN/EgijKwJLCRIiHioMQ3JldyBDcmVhdGVkMAE5iJqz + vu7wIhhBqKC/vu7wIhhKGwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4xMDAuMEoaCg5weXRob25fdmVy + c2lvbhIICgYzLjEyLjhKLgoIY3Jld19rZXkSIgogZTU4MDcwMWQ1MmViNjVhZmYyNGVlZmU3OGM3 + NDYyOGNKMQoHY3Jld19pZBImCiQ2Zjk1ZWI3Yy0wOWM5LTQxOTYtYWFiYi1kOWIxNmMxMzZjODdK + HAoMY3Jld19wcm9jZXNzEgwKCnNlcXVlbnRpYWxKEQoLY3Jld19tZW1vcnkSAhAAShoKFGNyZXdf + bnVtYmVyX29mX3Rhc2tzEgIYAUobChVjcmV3X251bWJlcl9vZl9hZ2VudHMSAhgBStECCgtjcmV3 + X2FnZW50cxLBAgq+Alt7ImtleSI6ICJhZDE1MzE2MWM1YzVhODU2YWEwZDA2YjI0OWM0YzY0YSIs + ICJpZCI6ICI1NTY3MmIwOC05NThkLTQyOWMtYTdlNy1jZmU3ZThjYzA4ZmQiLCAicm9sZSI6ICJi + YXNlX2FnZW50IiwgInZlcmJvc2U/IjogZmFsc2UsICJtYXhfaXRlciI6IDIwLCAibWF4X3JwbSI6 + IG51bGwsICJmdW5jdGlvbl9jYWxsaW5nX2xsbSI6ICIiLCAibGxtIjogImdwdC00by1taW5pIiwg + ImRlbGVnYXRpb25fZW5hYmxlZD8iOiBmYWxzZSwgImFsbG93X2NvZGVfZXhlY3V0aW9uPyI6IGZh + bHNlLCAibWF4X3JldHJ5X2xpbWl0IjogMiwgInRvb2xzX25hbWVzIjogW119XUr/AQoKY3Jld190 + YXNrcxLwAQrtAVt7ImtleSI6ICIxYjE1ZWYyMzkxNWIyNzU1ZTg5YTBlYzNiMjZhMTNkMiIsICJp + ZCI6ICIzOWYwOWYxZS05MmY4LTRkYmItODM0MC02NTZmZWQwOTdmMzQiLCAiYXN5bmNfZXhlY3V0 + aW9uPyI6IGZhbHNlLCAiaHVtYW5faW5wdXQ/IjogZmFsc2UsICJhZ2VudF9yb2xlIjogImJhc2Vf + YWdlbnQiLCAiYWdlbnRfa2V5IjogImFkMTUzMTYxYzVjNWE4NTZhYTBkMDZiMjQ5YzRjNjRhIiwg + InRvb2xzX25hbWVzIjogW119XXoCGAGFAQABAAASjgIKEExDo5nPLyHb2H8DfYjPoX4SCLEYs+24 + 8EenKgxUYXNrIENyZWF0ZWQwATmI4NG+7vAiGEFYZdK+7vAiGEouCghjcmV3X2tleRIiCiBlNTgw + NzAxZDUyZWI2NWFmZjI0ZWVmZTc4Yzc0NjI4Y0oxCgdjcmV3X2lkEiYKJDZmOTVlYjdjLTA5Yzkt + NDE5Ni1hYWJiLWQ5YjE2YzEzNmM4N0ouCgh0YXNrX2tleRIiCiAxYjE1ZWYyMzkxNWIyNzU1ZTg5 + YTBlYzNiMjZhMTNkMkoxCgd0YXNrX2lkEiYKJDM5ZjA5ZjFlLTkyZjgtNGRiYi04MzQwLTY1NmZl + ZDA5N2YzNHoCGAGFAQABAAASpAcKEBBQzR2bcR/7woQ+VkaJ4kQSCD1LFx3SNPPPKgxDcmV3IENy + ZWF0ZWQwATlotsW/7vAiGEEgA9C/7vAiGEobCg5jcmV3YWlfdmVyc2lvbhIJCgcwLjEwMC4wShoK + DnB5dGhvbl92ZXJzaW9uEggKBjMuMTIuOEouCghjcmV3X2tleRIiCiBlNTgwNzAxZDUyZWI2NWFm + ZjI0ZWVmZTc4Yzc0NjI4Y0oxCgdjcmV3X2lkEiYKJDJiMWI2MGYzLTNlZTMtNGNjYi05MDM2LTdk + MzE4OTJiYjVkZkocCgxjcmV3X3Byb2Nlc3MSDAoKc2VxdWVudGlhbEoRCgtjcmV3X21lbW9yeRIC + EABKGgoUY3Jld19udW1iZXJfb2ZfdGFza3MSAhgBShsKFWNyZXdfbnVtYmVyX29mX2FnZW50cxIC + GAFK0QIKC2NyZXdfYWdlbnRzEsECCr4CW3sia2V5IjogImFkMTUzMTYxYzVjNWE4NTZhYTBkMDZi + MjQ5YzRjNjRhIiwgImlkIjogIjU1NjcyYjA4LTk1OGQtNDI5Yy1hN2U3LWNmZTdlOGNjMDhmZCIs + ICJyb2xlIjogImJhc2VfYWdlbnQiLCAidmVyYm9zZT8iOiBmYWxzZSwgIm1heF9pdGVyIjogMjAs + ICJtYXhfcnBtIjogbnVsbCwgImZ1bmN0aW9uX2NhbGxpbmdfbGxtIjogIiIsICJsbG0iOiAiZ3B0 + LTRvLW1pbmkiLCAiZGVsZWdhdGlvbl9lbmFibGVkPyI6IGZhbHNlLCAiYWxsb3dfY29kZV9leGVj + dXRpb24/IjogZmFsc2UsICJtYXhfcmV0cnlfbGltaXQiOiAyLCAidG9vbHNfbmFtZXMiOiBbXX1d + Sv8BCgpjcmV3X3Rhc2tzEvABCu0BW3sia2V5IjogIjFiMTVlZjIzOTE1YjI3NTVlODlhMGVjM2Iy + NmExM2QyIiwgImlkIjogIjM5ZjA5ZjFlLTkyZjgtNGRiYi04MzQwLTY1NmZlZDA5N2YzNCIsICJh + c3luY19leGVjdXRpb24/IjogZmFsc2UsICJodW1hbl9pbnB1dD8iOiBmYWxzZSwgImFnZW50X3Jv + bGUiOiAiYmFzZV9hZ2VudCIsICJhZ2VudF9rZXkiOiAiYWQxNTMxNjFjNWM1YTg1NmFhMGQwNmIy + NDljNGM2NGEiLCAidG9vbHNfbmFtZXMiOiBbXX1degIYAYUBAAEAABKOAgoQmT07KMiFRgzOOPQf + I4bJPhIIqzN+pCYM6IUqDFRhc2sgQ3JlYXRlZDABOYjr3r/u8CIYQehY37/u8CIYSi4KCGNyZXdf + a2V5EiIKIGU1ODA3MDFkNTJlYjY1YWZmMjRlZWZlNzhjNzQ2MjhjSjEKB2NyZXdfaWQSJgokMmIx + YjYwZjMtM2VlMy00Y2NiLTkwMzYtN2QzMTg5MmJiNWRmSi4KCHRhc2tfa2V5EiIKIDFiMTVlZjIz + OTE1YjI3NTVlODlhMGVjM2IyNmExM2QySjEKB3Rhc2tfaWQSJgokMzlmMDlmMWUtOTJmOC00ZGJi + LTgzNDAtNjU2ZmVkMDk3ZjM0egIYAYUBAAEAABKkBwoQE53vZNAWshkoNK1bqTvovRII83djkBUL + EbcqDENyZXcgQ3JlYXRlZDABORBBzsDu8CIYQbAU2MDu8CIYShsKDmNyZXdhaV92ZXJzaW9uEgkK + BzAuMTAwLjBKGgoOcHl0aG9uX3ZlcnNpb24SCAoGMy4xMi44Si4KCGNyZXdfa2V5EiIKIGU1ODA3 + MDFkNTJlYjY1YWZmMjRlZWZlNzhjNzQ2MjhjSjEKB2NyZXdfaWQSJgokNTQ0MWY0MWYtOTVjMC00 + YzdkLTkxM2QtNDUxODcwY2YyZjYzShwKDGNyZXdfcHJvY2VzcxIMCgpzZXF1ZW50aWFsShEKC2Ny + ZXdfbWVtb3J5EgIQAEoaChRjcmV3X251bWJlcl9vZl90YXNrcxICGAFKGwoVY3Jld19udW1iZXJf + b2ZfYWdlbnRzEgIYAUrRAgoLY3Jld19hZ2VudHMSwQIKvgJbeyJrZXkiOiAiYWQxNTMxNjFjNWM1 + YTg1NmFhMGQwNmIyNDljNGM2NGEiLCAiaWQiOiAiNTU2NzJiMDgtOTU4ZC00MjljLWE3ZTctY2Zl + N2U4Y2MwOGZkIiwgInJvbGUiOiAiYmFzZV9hZ2VudCIsICJ2ZXJib3NlPyI6IGZhbHNlLCAibWF4 + X2l0ZXIiOiAyMCwgIm1heF9ycG0iOiBudWxsLCAiZnVuY3Rpb25fY2FsbGluZ19sbG0iOiAiIiwg + ImxsbSI6ICJncHQtNG8tbWluaSIsICJkZWxlZ2F0aW9uX2VuYWJsZWQ/IjogZmFsc2UsICJhbGxv + d19jb2RlX2V4ZWN1dGlvbj8iOiBmYWxzZSwgIm1heF9yZXRyeV9saW1pdCI6IDIsICJ0b29sc19u + YW1lcyI6IFtdfV1K/wEKCmNyZXdfdGFza3MS8AEK7QFbeyJrZXkiOiAiMWIxNWVmMjM5MTViMjc1 + NWU4OWEwZWMzYjI2YTEzZDIiLCAiaWQiOiAiMzlmMDlmMWUtOTJmOC00ZGJiLTgzNDAtNjU2ZmVk + MDk3ZjM0IiwgImFzeW5jX2V4ZWN1dGlvbj8iOiBmYWxzZSwgImh1bWFuX2lucHV0PyI6IGZhbHNl + LCAiYWdlbnRfcm9sZSI6ICJiYXNlX2FnZW50IiwgImFnZW50X2tleSI6ICJhZDE1MzE2MWM1YzVh + ODU2YWEwZDA2YjI0OWM0YzY0YSIsICJ0b29sc19uYW1lcyI6IFtdfV16AhgBhQEAAQAAEo4CChBV + JNEz3VIdOlQM9VT3bctVEgisogN707a2AioMVGFzayBDcmVhdGVkMAE5kGbnwO7wIhhBaMDnwO7w + IhhKLgoIY3Jld19rZXkSIgogZTU4MDcwMWQ1MmViNjVhZmYyNGVlZmU3OGM3NDYyOGNKMQoHY3Jl + d19pZBImCiQ1NDQxZjQxZi05NWMwLTRjN2QtOTEzZC00NTE4NzBjZjJmNjNKLgoIdGFza19rZXkS + IgogMWIxNWVmMjM5MTViMjc1NWU4OWEwZWMzYjI2YTEzZDJKMQoHdGFza19pZBImCiQzOWYwOWYx + ZS05MmY4LTRkYmItODM0MC02NTZmZWQwOTdmMzR6AhgBhQEAAQAAErQHChDA7zaLCfy56rd5t3oS + rDPZEgjYoSW3mq6WJyoMQ3JldyBDcmVhdGVkMAE5cP/5we7wIhhBIH0Dwu7wIhhKGwoOY3Jld2Fp + X3ZlcnNpb24SCQoHMC4xMDAuMEoaCg5weXRob25fdmVyc2lvbhIICgYzLjEyLjhKLgoIY3Jld19r + ZXkSIgogZTU4MDcwMWQ1MmViNjVhZmYyNGVlZmU3OGM3NDYyOGNKMQoHY3Jld19pZBImCiRmNjcz + MTc1ZS04Y2Q1LTQ1ZWUtYTZiOS0xYWFjMTliODQxZWJKHAoMY3Jld19wcm9jZXNzEgwKCnNlcXVl + bnRpYWxKEQoLY3Jld19tZW1vcnkSAhAAShoKFGNyZXdfbnVtYmVyX29mX3Rhc2tzEgIYAUobChVj + cmV3X251bWJlcl9vZl9hZ2VudHMSAhgBStkCCgtjcmV3X2FnZW50cxLJAgrGAlt7ImtleSI6ICJh + ZDE1MzE2MWM1YzVhODU2YWEwZDA2YjI0OWM0YzY0YSIsICJpZCI6ICJmMGUwMGIzZi0wZWNmLTQ2 + OGQtYjdjMC0yZmJhN2I5OTc5YjMiLCAicm9sZSI6ICJiYXNlX2FnZW50IiwgInZlcmJvc2U/Ijog + ZmFsc2UsICJtYXhfaXRlciI6IDIwLCAibWF4X3JwbSI6IG51bGwsICJmdW5jdGlvbl9jYWxsaW5n + X2xsbSI6ICIiLCAibGxtIjogImdwdC00by1taW5pIiwgImRlbGVnYXRpb25fZW5hYmxlZD8iOiBm + YWxzZSwgImFsbG93X2NvZGVfZXhlY3V0aW9uPyI6IGZhbHNlLCAibWF4X3JldHJ5X2xpbWl0Ijog + MiwgInRvb2xzX25hbWVzIjogWyJzYXlfaGkiXX1dSocCCgpjcmV3X3Rhc2tzEvgBCvUBW3sia2V5 + IjogIjFiMTVlZjIzOTE1YjI3NTVlODlhMGVjM2IyNmExM2QyIiwgImlkIjogImFhMGFmMmE2LTdm + MTktNDZmNi1iMjMxLTg1M2JjYzYxYzhiZiIsICJhc3luY19leGVjdXRpb24/IjogZmFsc2UsICJo + dW1hbl9pbnB1dD8iOiBmYWxzZSwgImFnZW50X3JvbGUiOiAiYmFzZV9hZ2VudCIsICJhZ2VudF9r + ZXkiOiAiYWQxNTMxNjFjNWM1YTg1NmFhMGQwNmIyNDljNGM2NGEiLCAidG9vbHNfbmFtZXMiOiBb + InNheV9oaSJdfV16AhgBhQEAAQAAEo4CChBH8NUZY1Cv8sM2lfQLaEogEgiFlW7Wp7QpdyoMVGFz + ayBDcmVhdGVkMAE5MNkPwu7wIhhBUCcQwu7wIhhKLgoIY3Jld19rZXkSIgogZTU4MDcwMWQ1MmVi + NjVhZmYyNGVlZmU3OGM3NDYyOGNKMQoHY3Jld19pZBImCiRmNjczMTc1ZS04Y2Q1LTQ1ZWUtYTZi + OS0xYWFjMTliODQxZWJKLgoIdGFza19rZXkSIgogMWIxNWVmMjM5MTViMjc1NWU4OWEwZWMzYjI2 + YTEzZDJKMQoHdGFza19pZBImCiRhYTBhZjJhNi03ZjE5LTQ2ZjYtYjIzMS04NTNiY2M2MWM4YmZ6 + AhgBhQEAAQAAEooBChCJg/wSACw+HIDy4vvYISP/EgjoC/oI/1V0cCoKVG9vbCBVc2FnZTABOWA0 + ifTu8CIYQTD0lPTu8CIYShsKDmNyZXdhaV92ZXJzaW9uEgkKBzAuMTAwLjBKFQoJdG9vbF9uYW1l + EggKBnNheV9oaUoOCghhdHRlbXB0cxICGAF6AhgBhQEAAQAA + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '6534' + Content-Type: + - application/x-protobuf + User-Agent: + - OTel-OTLP-Exporter-Python/1.27.0 + method: POST + uri: https://telemetry.crewai.com:4319/v1/traces + response: + body: + string: "\n\0" + headers: + Content-Length: + - '2' + Content-Type: + - application/x-protobuf + Date: + - Mon, 10 Feb 2025 19:55:17 GMT + status: + code: 200 + message: OK +- request: + body: '{"messages": [{"role": "user", "content": "Assess the quality of the task + completed based on the description, expected output, and actual results.\n\nTask + Description:\nJust say hi\n\nExpected Output:\nhi\n\nActual Output:\nhi\n```\n\nPlease + provide:\n- Bullet points suggestions to improve future similar tasks\n- A score + from 0 to 10 evaluating on completion, quality, and overall performance- Entities + extracted from the task output, if any, their type, description, and relationships"}], + "model": "gpt-4o-mini", "tool_choice": {"type": "function", "function": {"name": + "TaskEvaluation"}}, "tools": [{"type": "function", "function": {"name": "TaskEvaluation", + "description": "Correctly extracted `TaskEvaluation` with all the required parameters + with correct types", "parameters": {"$defs": {"Entity": {"properties": {"name": + {"description": "The name of the entity.", "title": "Name", "type": "string"}, + "type": {"description": "The type of the entity.", "title": "Type", "type": + "string"}, "description": {"description": "Description of the entity.", "title": + "Description", "type": "string"}, "relationships": {"description": "Relationships + of the entity.", "items": {"type": "string"}, "title": "Relationships", "type": + "array"}}, "required": ["name", "type", "description", "relationships"], "title": + "Entity", "type": "object"}}, "properties": {"suggestions": {"description": + "Suggestions to improve future similar tasks.", "items": {"type": "string"}, + "title": "Suggestions", "type": "array"}, "quality": {"description": "A score + from 0 to 10 evaluating on completion, quality, and overall performance, all + taking into account the task description, expected output, and the result of + the task.", "title": "Quality", "type": "number"}, "entities": {"description": + "Entities extracted from the task output.", "items": {"$ref": "#/$defs/Entity"}, + "title": "Entities", "type": "array"}}, "required": ["entities", "quality", + "suggestions"], "type": "object"}}}]}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '1967' + content-type: + - application/json + cookie: + - _cfuvid=efIHP1NUsh1dFewGJBu4YoBu6hhGa8vjOOKQglYQGno-1739214901306-0.0.1.1-604800000; + __cf_bm=fmlg1wjOwuOwZhUUOEtL1tQYluAPumn7AHLF8s0EU2Y-1739217315-1.0.1.1-PQDvxn8TOhzaznlHjwVsqPZUzbAyJWFkvzCubfNJydTu2_AyA1cJ8hkM0khsEE4UY_xp8iPe2gSGmH1ydrDa0Q + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-AzUA8oE0A2d99i1Khpu0CI7fSgRtZ\",\n \"object\": + \"chat.completion\",\n \"created\": 1739217316,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n + \ \"id\": \"call_bk3duHRErK1qCyvWJ1uVmmGl\",\n \"type\": + \"function\",\n \"function\": {\n \"name\": \"TaskEvaluation\",\n + \ \"arguments\": \"{\\\"suggestions\\\":[\\\"Provide more context + or details for similar tasks to enhance clarity.\\\",\\\"Specify desired tone + or style for the output.\\\",\\\"Consider adding more variety in tasks to keep + engagement high.\\\"],\\\"quality\\\":10,\\\"entities\\\":[{\\\"name\\\":\\\"hi\\\",\\\"type\\\":\\\"greeting\\\",\\\"description\\\":\\\"A + casual way to say hello or acknowledge someone's presence.\\\",\\\"relationships\\\":[\\\"used + as a greeting\\\",\\\"expresses friendliness\\\"]}]}\"\n }\n }\n + \ ],\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 275,\n \"completion_tokens\": 80,\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_72ed7ab54c\"\n}\n" + headers: + CF-RAY: + - 90fea7dfef41ceb9-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Mon, 10 Feb 2025 19:55:17 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '1535' + 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: + - '149999874' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_55d8eb91b4318245556b73d3f4c1e7c4 + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/utilities/test_events.py b/tests/utilities/test_events.py new file mode 100644 index 000000000..68bda7bec --- /dev/null +++ b/tests/utilities/test_events.py @@ -0,0 +1,497 @@ +import json +from datetime import datetime +from unittest.mock import MagicMock, patch + +import pytest +from pydantic import Field + +from crewai.agent import Agent +from crewai.agents.crew_agent_executor import CrewAgentExecutor +from crewai.crew import Crew +from crewai.flow.flow import Flow, listen, start +from crewai.task import Task +from crewai.tools.base_tool import BaseTool +from crewai.tools.tool_usage import ToolUsage +from crewai.utilities.events.agent_events import ( + AgentExecutionCompletedEvent, + AgentExecutionErrorEvent, + AgentExecutionStartedEvent, +) +from crewai.utilities.events.crew_events import ( + CrewKickoffCompletedEvent, + CrewKickoffFailedEvent, + CrewKickoffStartedEvent, +) +from crewai.utilities.events.crewai_event_bus import crewai_event_bus +from crewai.utilities.events.event_types import ToolUsageFinishedEvent +from crewai.utilities.events.flow_events import ( + FlowCreatedEvent, + FlowFinishedEvent, + FlowStartedEvent, + MethodExecutionFailedEvent, + MethodExecutionStartedEvent, +) +from crewai.utilities.events.task_events import ( + TaskCompletedEvent, + TaskFailedEvent, + TaskStartedEvent, +) +from crewai.utilities.events.tool_usage_events import ( + ToolUsageErrorEvent, +) + +base_agent = Agent( + role="base_agent", + llm="gpt-4o-mini", + goal="Just say hi", + backstory="You are a helpful assistant that just says hi", +) + +base_task = Task( + description="Just say hi", + expected_output="hi", + agent=base_agent, +) + + +@pytest.mark.vcr(filter_headers=["authorization"]) +def test_crew_emits_start_kickoff_event(): + received_events = [] + + with crewai_event_bus.scoped_handlers(): + + @crewai_event_bus.on(CrewKickoffStartedEvent) + def handle_crew_start(source, event): + received_events.append(event) + + crew = Crew(agents=[base_agent], tasks=[base_task], name="TestCrew") + + crew.kickoff() + + assert len(received_events) == 1 + assert received_events[0].crew_name == "TestCrew" + assert isinstance(received_events[0].timestamp, datetime) + assert received_events[0].type == "crew_kickoff_started" + + +@pytest.mark.vcr(filter_headers=["authorization"]) +def test_crew_emits_end_kickoff_event(): + received_events = [] + + @crewai_event_bus.on(CrewKickoffCompletedEvent) + def handle_crew_end(source, event): + received_events.append(event) + + crew = Crew(agents=[base_agent], tasks=[base_task], name="TestCrew") + + crew.kickoff() + + assert len(received_events) == 1 + assert received_events[0].crew_name == "TestCrew" + assert isinstance(received_events[0].timestamp, datetime) + assert received_events[0].type == "crew_kickoff_completed" + + +@pytest.mark.vcr(filter_headers=["authorization"]) +def test_crew_emits_kickoff_failed_event(): + received_events = [] + + with crewai_event_bus.scoped_handlers(): + + @crewai_event_bus.on(CrewKickoffFailedEvent) + def handle_crew_failed(source, event): + received_events.append(event) + + crew = Crew(agents=[base_agent], tasks=[base_task], name="TestCrew") + + with patch.object(Crew, "_execute_tasks") as mock_execute: + error_message = "Simulated crew kickoff failure" + mock_execute.side_effect = Exception(error_message) + + with pytest.raises(Exception): + crew.kickoff() + + assert len(received_events) == 1 + assert received_events[0].error == error_message + assert isinstance(received_events[0].timestamp, datetime) + assert received_events[0].type == "crew_kickoff_failed" + + +@pytest.mark.vcr(filter_headers=["authorization"]) +def test_crew_emits_start_task_event(): + received_events = [] + + @crewai_event_bus.on(TaskStartedEvent) + def handle_task_start(source, event): + received_events.append(event) + + crew = Crew(agents=[base_agent], tasks=[base_task], name="TestCrew") + + crew.kickoff() + + assert len(received_events) == 1 + assert isinstance(received_events[0].timestamp, datetime) + assert received_events[0].type == "task_started" + + +@pytest.mark.vcr(filter_headers=["authorization"]) +def test_crew_emits_end_task_event(): + received_events = [] + + @crewai_event_bus.on(TaskCompletedEvent) + def handle_task_end(source, event): + received_events.append(event) + + crew = Crew(agents=[base_agent], tasks=[base_task], name="TestCrew") + + crew.kickoff() + + assert len(received_events) == 1 + assert isinstance(received_events[0].timestamp, datetime) + assert received_events[0].type == "task_completed" + + +@pytest.mark.vcr(filter_headers=["authorization"]) +def test_task_emits_failed_event_on_execution_error(): + received_events = [] + received_sources = [] + + @crewai_event_bus.on(TaskFailedEvent) + def handle_task_failed(source, event): + received_events.append(event) + received_sources.append(source) + + with patch.object( + Task, + "_execute_core", + ) as mock_execute: + error_message = "Simulated task failure" + mock_execute.side_effect = Exception(error_message) + agent = Agent( + role="base_agent", + goal="Just say hi", + backstory="You are a helpful assistant that just says hi", + ) + task = Task( + description="Just say hi", + expected_output="hi", + agent=agent, + ) + + with pytest.raises(Exception): + agent.execute_task(task=task) + + assert len(received_events) == 1 + assert received_sources[0] == task + assert received_events[0].error == error_message + assert isinstance(received_events[0].timestamp, datetime) + assert received_events[0].type == "task_failed" + + +@pytest.mark.vcr(filter_headers=["authorization"]) +def test_agent_emits_execution_started_and_completed_events(): + received_events = [] + + @crewai_event_bus.on(AgentExecutionStartedEvent) + def handle_agent_start(source, event): + received_events.append(event) + + @crewai_event_bus.on(AgentExecutionCompletedEvent) + def handle_agent_completed(source, event): + received_events.append(event) + + crew = Crew(agents=[base_agent], tasks=[base_task], name="TestCrew") + crew.kickoff() + assert len(received_events) == 2 + assert received_events[0].agent == base_agent + assert received_events[0].task == base_task + assert received_events[0].tools == [] + assert isinstance(received_events[0].task_prompt, str) + assert ( + received_events[0].task_prompt + == "Just say hi\n\nThis is the expected criteria for your final answer: hi\nyou MUST return the actual complete content as the final answer, not a summary." + ) + assert isinstance(received_events[0].timestamp, datetime) + assert received_events[0].type == "agent_execution_started" + assert isinstance(received_events[1].timestamp, datetime) + assert received_events[1].type == "agent_execution_completed" + + +@pytest.mark.vcr(filter_headers=["authorization"]) +def test_agent_emits_execution_error_event(): + received_events = [] + + @crewai_event_bus.on(AgentExecutionErrorEvent) + def handle_agent_start(source, event): + received_events.append(event) + + 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) + + with pytest.raises(Exception) as e: + base_agent.execute_task( + task=base_task, + ) + + assert len(received_events) == 1 + assert received_events[0].agent == base_agent + assert received_events[0].task == base_task + assert received_events[0].error == error_message + assert isinstance(received_events[0].timestamp, datetime) + assert received_events[0].type == "agent_execution_error" + + +class SayHiTool(BaseTool): + name: str = Field(default="say_hi", description="The name of the tool") + description: str = Field( + default="Say hi", description="The description of the tool" + ) + + def _run(self) -> str: + return "hi" + + +@pytest.mark.vcr(filter_headers=["authorization"]) +def test_tools_emits_finished_events(): + received_events = [] + + @crewai_event_bus.on(ToolUsageFinishedEvent) + def handle_tool_end(source, event): + received_events.append(event) + + agent = Agent( + role="base_agent", + goal="Just say hi", + backstory="You are a helpful assistant that just says hi", + tools=[SayHiTool()], + ) + + task = Task( + description="Just say hi", + expected_output="hi", + agent=agent, + ) + crew = Crew(agents=[agent], tasks=[task], name="TestCrew") + crew.kickoff() + assert len(received_events) == 1 + assert received_events[0].agent_key == agent.key + assert received_events[0].agent_role == agent.role + assert received_events[0].tool_name == SayHiTool().name + assert received_events[0].tool_args == {} + assert received_events[0].type == "tool_usage_finished" + assert isinstance(received_events[0].timestamp, datetime) + + +@pytest.mark.vcr(filter_headers=["authorization"]) +def test_tools_emits_error_events(): + received_events = [] + + @crewai_event_bus.on(ToolUsageErrorEvent) + def handle_tool_end(source, event): + received_events.append(event) + + class ErrorTool(BaseTool): + name: str = Field( + default="error_tool", description="A tool that raises an error" + ) + description: str = Field( + default="This tool always raises an error", + description="The description of the tool", + ) + + def _run(self) -> str: + raise Exception("Simulated tool error") + + agent = Agent( + role="base_agent", + goal="Try to use the error tool", + backstory="You are an assistant that tests error handling", + tools=[ErrorTool()], + ) + + task = Task( + description="Use the error tool", + expected_output="This should error", + agent=agent, + ) + + crew = Crew(agents=[agent], tasks=[task], name="TestCrew") + crew.kickoff() + + assert len(received_events) == 75 + assert received_events[0].agent_key == agent.key + assert received_events[0].agent_role == agent.role + assert received_events[0].tool_name == "error_tool" + assert received_events[0].tool_args == {} + assert str(received_events[0].error) == "Simulated tool error" + assert received_events[0].type == "tool_usage_error" + assert isinstance(received_events[0].timestamp, datetime) + + +def test_flow_emits_start_event(): + received_events = [] + + with crewai_event_bus.scoped_handlers(): + + @crewai_event_bus.on(FlowStartedEvent) + def handle_flow_start(source, event): + received_events.append(event) + + class TestFlow(Flow[dict]): + @start() + def begin(self): + return "started" + + flow = TestFlow() + flow.kickoff() + + assert len(received_events) == 1 + assert received_events[0].flow_name == "TestFlow" + assert received_events[0].type == "flow_started" + + +def test_flow_emits_finish_event(): + received_events = [] + + with crewai_event_bus.scoped_handlers(): + + @crewai_event_bus.on(FlowFinishedEvent) + def handle_flow_finish(source, event): + received_events.append(event) + + class TestFlow(Flow[dict]): + @start() + def begin(self): + return "completed" + + flow = TestFlow() + result = flow.kickoff() + + assert len(received_events) == 1 + assert received_events[0].flow_name == "TestFlow" + assert received_events[0].type == "flow_finished" + assert received_events[0].result == "completed" + assert result == "completed" + + +def test_flow_emits_method_execution_started_event(): + received_events = [] + + with crewai_event_bus.scoped_handlers(): + + @crewai_event_bus.on(MethodExecutionStartedEvent) + def handle_method_start(source, event): + print("event in method name", event.method_name) + received_events.append(event) + + class TestFlow(Flow[dict]): + @start() + def begin(self): + return "started" + + @listen("begin") + def second_method(self): + return "executed" + + flow = TestFlow() + flow.kickoff() + + assert len(received_events) == 2 + + assert received_events[0].method_name == "begin" + assert received_events[0].flow_name == "TestFlow" + assert received_events[0].type == "method_execution_started" + + assert received_events[1].method_name == "second_method" + assert received_events[1].flow_name == "TestFlow" + assert received_events[1].type == "method_execution_started" + + +@pytest.mark.vcr(filter_headers=["authorization"]) +def test_register_handler_adds_new_handler(): + received_events = [] + + def custom_handler(source, event): + received_events.append(event) + + with crewai_event_bus.scoped_handlers(): + crewai_event_bus.register_handler(CrewKickoffStartedEvent, custom_handler) + + crew = Crew(agents=[base_agent], tasks=[base_task], name="TestCrew") + crew.kickoff() + + assert len(received_events) == 1 + assert isinstance(received_events[0].timestamp, datetime) + assert received_events[0].type == "crew_kickoff_started" + + +@pytest.mark.vcr(filter_headers=["authorization"]) +def test_multiple_handlers_for_same_event(): + received_events_1 = [] + received_events_2 = [] + + def handler_1(source, event): + received_events_1.append(event) + + def handler_2(source, event): + received_events_2.append(event) + + with crewai_event_bus.scoped_handlers(): + crewai_event_bus.register_handler(CrewKickoffStartedEvent, handler_1) + crewai_event_bus.register_handler(CrewKickoffStartedEvent, handler_2) + + crew = Crew(agents=[base_agent], tasks=[base_task], name="TestCrew") + crew.kickoff() + + assert len(received_events_1) == 1 + assert len(received_events_2) == 1 + assert received_events_1[0].type == "crew_kickoff_started" + assert received_events_2[0].type == "crew_kickoff_started" + + +def test_flow_emits_created_event(): + received_events = [] + + @crewai_event_bus.on(FlowCreatedEvent) + def handle_flow_created(source, event): + received_events.append(event) + + class TestFlow(Flow[dict]): + @start() + def begin(self): + return "started" + + flow = TestFlow() + flow.kickoff() + + assert len(received_events) == 1 + assert received_events[0].flow_name == "TestFlow" + assert received_events[0].type == "flow_created" + + +def test_flow_emits_method_execution_failed_event(): + received_events = [] + error = Exception("Simulated method failure") + + @crewai_event_bus.on(MethodExecutionFailedEvent) + def handle_method_failed(source, event): + received_events.append(event) + + class TestFlow(Flow[dict]): + @start() + def begin(self): + raise error + + flow = TestFlow() + with pytest.raises(Exception): + flow.kickoff() + + assert len(received_events) == 1 + assert received_events[0].method_name == "begin" + assert received_events[0].flow_name == "TestFlow" + assert received_events[0].type == "method_execution_failed" + assert received_events[0].error == error From 14503bc43b763b797dc52cf466ab900cd27c8d76 Mon Sep 17 00:00:00 2001 From: "Brandon Hancock (bhancock_ai)" <109994880+bhancockio@users.noreply.github.com> Date: Thu, 20 Feb 2025 12:01:49 -0500 Subject: [PATCH 10/35] imporve HITL (#2169) * imporve HITL * fix failing test * fix failing test part 2 * Drop extra logs that were causing confusion --------- Co-authored-by: Lorenze Jay <63378463+lorenzejay@users.noreply.github.com> --- .../base_agent_executor_mixin.py | 11 +- src/crewai/agents/crew_agent_executor.py | 30 +- src/crewai/translations/en.json | 1 - tests/agent_test.py | 31 +- tests/cassettes/test_agent_human_input.yaml | 520 ------------------ 5 files changed, 31 insertions(+), 562 deletions(-) delete mode 100644 tests/cassettes/test_agent_human_input.yaml diff --git a/src/crewai/agents/agent_builder/base_agent_executor_mixin.py b/src/crewai/agents/agent_builder/base_agent_executor_mixin.py index 924cef71c..e7917f2bd 100644 --- a/src/crewai/agents/agent_builder/base_agent_executor_mixin.py +++ b/src/crewai/agents/agent_builder/base_agent_executor_mixin.py @@ -114,10 +114,15 @@ class CrewAgentExecutorMixin: prompt = ( "\n\n=====\n" "## HUMAN FEEDBACK: Provide feedback on the Final Result and Agent's actions.\n" - "Respond with 'looks good' to accept or provide specific improvement requests.\n" - "You can provide multiple rounds of feedback until satisfied.\n" + "Please follow these guidelines:\n" + " - If you are happy with the result, simply hit Enter without typing anything.\n" + " - Otherwise, provide specific improvement requests.\n" + " - You can provide multiple rounds of feedback until satisfied.\n" "=====\n" ) self._printer.print(content=prompt, color="bold_yellow") - return input() + response = input() + if response.strip() != "": + self._printer.print(content="\nProcessing your feedback...", color="cyan") + return response diff --git a/src/crewai/agents/crew_agent_executor.py b/src/crewai/agents/crew_agent_executor.py index 6d34fea4e..452b343c8 100644 --- a/src/crewai/agents/crew_agent_executor.py +++ b/src/crewai/agents/crew_agent_executor.py @@ -548,10 +548,6 @@ class CrewAgentExecutor(CrewAgentExecutorMixin): self, initial_answer: AgentFinish, feedback: str ) -> AgentFinish: """Process feedback for training scenarios with single iteration.""" - self._printer.print( - content="\nProcessing training feedback.\n", - color="yellow", - ) self._handle_crew_training_output(initial_answer, feedback) self.messages.append( self._format_msg( @@ -571,9 +567,8 @@ class CrewAgentExecutor(CrewAgentExecutorMixin): answer = current_answer while self.ask_for_human_input: - response = self._get_llm_feedback_response(feedback) - - if not self._feedback_requires_changes(response): + # If the user provides a blank response, assume they are happy with the result + if feedback.strip() == "": self.ask_for_human_input = False else: answer = self._process_feedback_iteration(feedback) @@ -581,27 +576,6 @@ class CrewAgentExecutor(CrewAgentExecutorMixin): return answer - def _get_llm_feedback_response(self, feedback: str) -> Optional[str]: - """Get LLM classification of whether feedback requires changes.""" - prompt = self._i18n.slice("human_feedback_classification").format( - feedback=feedback - ) - message = self._format_msg(prompt, role="system") - - for retry in range(MAX_LLM_RETRY): - try: - response = self.llm.call([message], callbacks=self.callbacks) - return response.strip().lower() if response else None - except Exception as error: - self._log_feedback_error(retry, error) - - self._log_max_retries_exceeded() - return None - - def _feedback_requires_changes(self, response: Optional[str]) -> bool: - """Determine if feedback response indicates need for changes.""" - return response == "true" if response else False - def _process_feedback_iteration(self, feedback: str) -> AgentFinish: """Process a single feedback iteration.""" self.messages.append( diff --git a/src/crewai/translations/en.json b/src/crewai/translations/en.json index f09f1dba0..4c28fc5d5 100644 --- a/src/crewai/translations/en.json +++ b/src/crewai/translations/en.json @@ -23,7 +23,6 @@ "summary": "This is a summary of our conversation so far:\n{merged_summary}", "manager_request": "Your best answer to your coworker asking you this, accounting for the context shared.", "formatted_task_instructions": "Ensure your final answer contains only the content in the following format: {output_format}\n\nEnsure the final output does not include any code block markers like ```json or ```python.", - "human_feedback_classification": "Determine if the following feedback indicates that the user is satisfied or if further changes are needed. Respond with 'True' if further changes are needed, or 'False' if the user is satisfied. **Important** Do not include any additional commentary outside of your 'True' or 'False' response.\n\nFeedback: \"{feedback}\"", "conversation_history_instruction": "You are a member of a crew collaborating to achieve a common goal. Your task is a specific action that contributes to this larger objective. For additional context, please review the conversation history between you and the user that led to the initiation of this crew. Use any relevant information or feedback from the conversation to inform your task execution and ensure your response aligns with both the immediate task and the crew's overall goals.", "feedback_instructions": "User feedback: {feedback}\nInstructions: Use this feedback to enhance the next output iteration.\nNote: Do not respond or add commentary." }, diff --git a/tests/agent_test.py b/tests/agent_test.py index 3547398e5..1d07da23e 100644 --- a/tests/agent_test.py +++ b/tests/agent_test.py @@ -1,7 +1,6 @@ """Test Agent creation and execution basic functionality.""" import os -from datetime import UTC, datetime, timezone from unittest import mock from unittest.mock import patch @@ -9,7 +8,7 @@ import pytest from crewai import Agent, Crew, Task from crewai.agents.cache import CacheHandler -from crewai.agents.crew_agent_executor import CrewAgentExecutor +from crewai.agents.crew_agent_executor import AgentFinish, CrewAgentExecutor from crewai.agents.parser import AgentAction, CrewAgentParser, OutputParserException from crewai.knowledge.source.base_knowledge_source import BaseKnowledgeSource from crewai.knowledge.source.string_knowledge_source import StringKnowledgeSource @@ -999,23 +998,35 @@ def test_agent_human_input(): # Side effect function for _ask_human_input to simulate multiple feedback iterations feedback_responses = iter( [ - "Don't say hi, say Hello instead!", # First feedback - "looks good", # Second feedback to exit loop + "Don't say hi, say Hello instead!", # First feedback: instruct change + "", # Second feedback: empty string signals acceptance ] ) def ask_human_input_side_effect(*args, **kwargs): return next(feedback_responses) - with patch.object( - CrewAgentExecutor, "_ask_human_input", side_effect=ask_human_input_side_effect - ) as mock_human_input: + # Patch both _ask_human_input and _invoke_loop to avoid real API/network calls. + with ( + patch.object( + CrewAgentExecutor, + "_ask_human_input", + side_effect=ask_human_input_side_effect, + ) as mock_human_input, + patch.object( + CrewAgentExecutor, + "_invoke_loop", + return_value=AgentFinish(output="Hello", thought="", text=""), + ) as mock_invoke_loop, + ): # Execute the task output = agent.execute_task(task) - # Assertions to ensure the agent behaves correctly - assert mock_human_input.call_count == 2 # Should have asked for feedback twice - assert output.strip().lower() == "hello" # Final output should be 'Hello' + # Assertions to ensure the agent behaves correctly. + # It should have requested feedback twice. + assert mock_human_input.call_count == 2 + # The final result should be processed to "Hello" + assert output.strip().lower() == "hello" def test_interpolate_inputs(): diff --git a/tests/cassettes/test_agent_human_input.yaml b/tests/cassettes/test_agent_human_input.yaml deleted file mode 100644 index 8c5fd3a80..000000000 --- a/tests/cassettes/test_agent_human_input.yaml +++ /dev/null @@ -1,520 +0,0 @@ -interactions: -- request: - body: !!binary | - CqcXCiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkS/hYKEgoQY3Jld2FpLnRl - bGVtZXRyeRJ5ChBuJJtOdNaB05mOW/p3915eEgj2tkAd3rZcASoQVG9vbCBVc2FnZSBFcnJvcjAB - OYa7/URvKBUYQUpcFEVvKBUYShoKDmNyZXdhaV92ZXJzaW9uEggKBjAuODYuMEoPCgNsbG0SCAoG - Z3B0LTRvegIYAYUBAAEAABLJBwoQifhX01E5i+5laGdALAlZBBIIBuGM1aN+OPgqDENyZXcgQ3Jl - YXRlZDABORVGruBvKBUYQaipwOBvKBUYShoKDmNyZXdhaV92ZXJzaW9uEggKBjAuODYuMEoaCg5w - eXRob25fdmVyc2lvbhIICgYzLjEyLjdKLgoIY3Jld19rZXkSIgogN2U2NjA4OTg5ODU5YTY3ZWVj - ODhlZWY3ZmNlODUyMjVKMQoHY3Jld19pZBImCiRiOThiNWEwMC01YTI1LTQxMDctYjQwNS1hYmYz - MjBhOGYzYThKHAoMY3Jld19wcm9jZXNzEgwKCnNlcXVlbnRpYWxKEQoLY3Jld19tZW1vcnkSAhAA - ShoKFGNyZXdfbnVtYmVyX29mX3Rhc2tzEgIYAUobChVjcmV3X251bWJlcl9vZl9hZ2VudHMSAhgB - SuQCCgtjcmV3X2FnZW50cxLUAgrRAlt7ImtleSI6ICIyMmFjZDYxMWU0NGVmNWZhYzA1YjUzM2Q3 - NWU4ODkzYiIsICJpZCI6ICJkNWIyMzM1YS0yMmIyLTQyZWEtYmYwNS03OTc3NmU3MmYzOTIiLCAi - cm9sZSI6ICJEYXRhIFNjaWVudGlzdCIsICJ2ZXJib3NlPyI6IGZhbHNlLCAibWF4X2l0ZXIiOiAy - MCwgIm1heF9ycG0iOiBudWxsLCAiZnVuY3Rpb25fY2FsbGluZ19sbG0iOiAiIiwgImxsbSI6ICJn - cHQtNG8tbWluaSIsICJkZWxlZ2F0aW9uX2VuYWJsZWQ/IjogZmFsc2UsICJhbGxvd19jb2RlX2V4 - ZWN1dGlvbj8iOiBmYWxzZSwgIm1heF9yZXRyeV9saW1pdCI6IDIsICJ0b29sc19uYW1lcyI6IFsi - Z2V0IGdyZWV0aW5ncyJdfV1KkgIKCmNyZXdfdGFza3MSgwIKgAJbeyJrZXkiOiAiYTI3N2IzNGIy - YzE0NmYwYzU2YzVlMTM1NmU4ZjhhNTciLCAiaWQiOiAiMjJiZWMyMzEtY2QyMS00YzU4LTgyN2Ut - MDU4MWE4ZjBjMTExIiwgImFzeW5jX2V4ZWN1dGlvbj8iOiBmYWxzZSwgImh1bWFuX2lucHV0PyI6 - IGZhbHNlLCAiYWdlbnRfcm9sZSI6ICJEYXRhIFNjaWVudGlzdCIsICJhZ2VudF9rZXkiOiAiMjJh - Y2Q2MTFlNDRlZjVmYWMwNWI1MzNkNzVlODg5M2IiLCAidG9vbHNfbmFtZXMiOiBbImdldCBncmVl - dGluZ3MiXX1degIYAYUBAAEAABKOAgoQ5WYoxRtTyPjge4BduhL0rRIIv2U6rvWALfwqDFRhc2sg - Q3JlYXRlZDABOX068uBvKBUYQZkv8+BvKBUYSi4KCGNyZXdfa2V5EiIKIDdlNjYwODk4OTg1OWE2 - N2VlYzg4ZWVmN2ZjZTg1MjI1SjEKB2NyZXdfaWQSJgokYjk4YjVhMDAtNWEyNS00MTA3LWI0MDUt - YWJmMzIwYThmM2E4Si4KCHRhc2tfa2V5EiIKIGEyNzdiMzRiMmMxNDZmMGM1NmM1ZTEzNTZlOGY4 - YTU3SjEKB3Rhc2tfaWQSJgokMjJiZWMyMzEtY2QyMS00YzU4LTgyN2UtMDU4MWE4ZjBjMTExegIY - AYUBAAEAABKQAQoQXyeDtJDFnyp2Fjk9YEGTpxIIaNE7gbhPNYcqClRvb2wgVXNhZ2UwATkaXTvj - bygVGEGvx0rjbygVGEoaCg5jcmV3YWlfdmVyc2lvbhIICgYwLjg2LjBKHAoJdG9vbF9uYW1lEg8K - DUdldCBHcmVldGluZ3NKDgoIYXR0ZW1wdHMSAhgBegIYAYUBAAEAABLVBwoQMWfznt0qwauEzl7T - UOQxRBII9q+pUS5EdLAqDENyZXcgQ3JlYXRlZDABORONPORvKBUYQSAoS+RvKBUYShoKDmNyZXdh - aV92ZXJzaW9uEggKBjAuODYuMEoaCg5weXRob25fdmVyc2lvbhIICgYzLjEyLjdKLgoIY3Jld19r - ZXkSIgogYzMwNzYwMDkzMjY3NjE0NDRkNTdjNzFkMWRhM2YyN2NKMQoHY3Jld19pZBImCiQ3OTQw - MTkyNS1iOGU5LTQ3MDgtODUzMC00NDhhZmEzYmY4YjBKHAoMY3Jld19wcm9jZXNzEgwKCnNlcXVl - bnRpYWxKEQoLY3Jld19tZW1vcnkSAhAAShoKFGNyZXdfbnVtYmVyX29mX3Rhc2tzEgIYAUobChVj - cmV3X251bWJlcl9vZl9hZ2VudHMSAhgBSuoCCgtjcmV3X2FnZW50cxLaAgrXAlt7ImtleSI6ICI5 - OGYzYjFkNDdjZTk2OWNmMDU3NzI3Yjc4NDE0MjVjZCIsICJpZCI6ICI5OTJkZjYyZi1kY2FiLTQy - OTUtOTIwNi05MDBkNDExNGIxZTkiLCAicm9sZSI6ICJGcmllbmRseSBOZWlnaGJvciIsICJ2ZXJi - b3NlPyI6IGZhbHNlLCAibWF4X2l0ZXIiOiAyMCwgIm1heF9ycG0iOiBudWxsLCAiZnVuY3Rpb25f - Y2FsbGluZ19sbG0iOiAiIiwgImxsbSI6ICJncHQtNG8tbWluaSIsICJkZWxlZ2F0aW9uX2VuYWJs - ZWQ/IjogZmFsc2UsICJhbGxvd19jb2RlX2V4ZWN1dGlvbj8iOiBmYWxzZSwgIm1heF9yZXRyeV9s - aW1pdCI6IDIsICJ0b29sc19uYW1lcyI6IFsiZGVjaWRlIGdyZWV0aW5ncyJdfV1KmAIKCmNyZXdf - dGFza3MSiQIKhgJbeyJrZXkiOiAiODBkN2JjZDQ5MDk5MjkwMDgzODMyZjBlOTgzMzgwZGYiLCAi - aWQiOiAiMmZmNjE5N2UtYmEyNy00YjczLWI0YTctNGZhMDQ4ZTYyYjQ3IiwgImFzeW5jX2V4ZWN1 - dGlvbj8iOiBmYWxzZSwgImh1bWFuX2lucHV0PyI6IGZhbHNlLCAiYWdlbnRfcm9sZSI6ICJGcmll - bmRseSBOZWlnaGJvciIsICJhZ2VudF9rZXkiOiAiOThmM2IxZDQ3Y2U5NjljZjA1NzcyN2I3ODQx - NDI1Y2QiLCAidG9vbHNfbmFtZXMiOiBbImRlY2lkZSBncmVldGluZ3MiXX1degIYAYUBAAEAABKO - AgoQnjTp5boK7/+DQxztYIpqihIIgGnMUkBtzHEqDFRhc2sgQ3JlYXRlZDABOcpYcuRvKBUYQalE - c+RvKBUYSi4KCGNyZXdfa2V5EiIKIGMzMDc2MDA5MzI2NzYxNDQ0ZDU3YzcxZDFkYTNmMjdjSjEK - B2NyZXdfaWQSJgokNzk0MDE5MjUtYjhlOS00NzA4LTg1MzAtNDQ4YWZhM2JmOGIwSi4KCHRhc2tf - a2V5EiIKIDgwZDdiY2Q0OTA5OTI5MDA4MzgzMmYwZTk4MzM4MGRmSjEKB3Rhc2tfaWQSJgokMmZm - NjE5N2UtYmEyNy00YjczLWI0YTctNGZhMDQ4ZTYyYjQ3egIYAYUBAAEAABKTAQoQ26H9pLUgswDN - p9XhJwwL6BIIx3bw7mAvPYwqClRvb2wgVXNhZ2UwATmy7NPlbygVGEEvb+HlbygVGEoaCg5jcmV3 - YWlfdmVyc2lvbhIICgYwLjg2LjBKHwoJdG9vbF9uYW1lEhIKEERlY2lkZSBHcmVldGluZ3NKDgoI - YXR0ZW1wdHMSAhgBegIYAYUBAAEAAA== - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '2986' - Content-Type: - - application/x-protobuf - User-Agent: - - OTel-OTLP-Exporter-Python/1.27.0 - method: POST - uri: https://telemetry.crewai.com:4319/v1/traces - response: - body: - string: "\n\0" - headers: - Content-Length: - - '2' - Content-Type: - - application/x-protobuf - Date: - - Fri, 27 Dec 2024 22:14:53 GMT - status: - code: 200 - message: OK -- request: - body: '{"messages": [{"role": "system", "content": "You are test role. test backstory\nYour - personal goal is: test goal\nTo give my best complete final answer to the task - use 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 the word: Hi\n\nThis - is the expect criteria for your final answer: The word: Hi\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:"], - "stream": false}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '824' - content-type: - - application/json - cookie: - - _cfuvid=ePJSDFdHag2D8lj21_ijAMWjoA6xfnPNxN4uekvC728-1727226247743-0.0.1.1-604800000 - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.52.1 - x-stainless-arch: - - x64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - Linux - x-stainless-package-version: - - 1.52.1 - x-stainless-raw-response: - - 'true' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.12.7 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - content: "{\n \"id\": \"chatcmpl-AjCtZLLrWi8ZASpP9bz6HaCV7xBIn\",\n \"object\": - \"chat.completion\",\n \"created\": 1735337693,\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: Hi\",\n \"refusal\": null\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 158,\n \"completion_tokens\": 12,\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 \"system_fingerprint\": - \"fp_0aa8d3e20b\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 8f8caa83deca756b-SEA - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Fri, 27 Dec 2024 22:14:53 GMT - Server: - - cloudflare - Set-Cookie: - - __cf_bm=wJkq_yLkzE3OdxE0aMJz.G0kce969.9JxRmZ0ratl4c-1735337693-1.0.1.1-OKpUoRrSPFGvWv5Hp5ET1PNZ7iZNHPKEAuakpcQUxxPSeisUIIR3qIOZ31MGmYugqB5.wkvidgbxOAagqJvmnw; - path=/; expires=Fri, 27-Dec-24 22:44:53 GMT; domain=.api.openai.com; HttpOnly; - Secure; SameSite=None - - _cfuvid=A_ASCLNAVfQoyucWOAIhecWtEpNotYoZr0bAFihgNxs-1735337693273-0.0.1.1-604800000; - path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - crewai-iuxna1 - openai-processing-ms: - - '404' - 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: - - '149999816' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_6ac84634bff9193743c4b0911c09b4a6 - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"messages": [{"role": "system", "content": "Determine if the following - feedback indicates that the user is satisfied or if further changes are needed. - Respond with ''True'' if further changes are needed, or ''False'' if the user - is satisfied. **Important** Do not include any additional commentary outside - of your ''True'' or ''False'' response.\n\nFeedback: \"Don''t say hi, say Hello - instead!\""}], "model": "gpt-4o-mini", "stop": ["\nObservation:"], "stream": - false}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '461' - content-type: - - application/json - cookie: - - _cfuvid=A_ASCLNAVfQoyucWOAIhecWtEpNotYoZr0bAFihgNxs-1735337693273-0.0.1.1-604800000; - __cf_bm=wJkq_yLkzE3OdxE0aMJz.G0kce969.9JxRmZ0ratl4c-1735337693-1.0.1.1-OKpUoRrSPFGvWv5Hp5ET1PNZ7iZNHPKEAuakpcQUxxPSeisUIIR3qIOZ31MGmYugqB5.wkvidgbxOAagqJvmnw - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.52.1 - x-stainless-arch: - - x64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - Linux - x-stainless-package-version: - - 1.52.1 - x-stainless-raw-response: - - 'true' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.12.7 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - content: "{\n \"id\": \"chatcmpl-AjCtZNlWdrrPZhq0MJDqd16sMuQEJ\",\n \"object\": - \"chat.completion\",\n \"created\": 1735337693,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"True\",\n \"refusal\": null\n - \ },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n - \ ],\n \"usage\": {\n \"prompt_tokens\": 78,\n \"completion_tokens\": - 1,\n \"total_tokens\": 79,\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 \"system_fingerprint\": - \"fp_0aa8d3e20b\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 8f8caa87094f756b-SEA - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Fri, 27 Dec 2024 22:14:53 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - crewai-iuxna1 - openai-processing-ms: - - '156' - 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: - - '149999898' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_ec74bef2a9ef7b2144c03fd7f7bbeab0 - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"messages": [{"role": "system", "content": "You are test role. test backstory\nYour - personal goal is: test goal\nTo give my best complete final answer to the task - use 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 the word: Hi\n\nThis - is the expect criteria for your final answer: The word: Hi\nyou MUST return - the actual complete content as the final answer, not a summary.\n\nBegin! This - is VERY important to you, use the tools available and give your best Final Answer, - your job depends on it!\n\nThought:"}, {"role": "assistant", "content": "I now - can give a great answer \nFinal Answer: Hi"}, {"role": "user", "content": "Feedback: - Don''t say hi, say Hello instead!"}], "model": "gpt-4o-mini", "stop": ["\nObservation:"], - "stream": false}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '986' - content-type: - - application/json - cookie: - - _cfuvid=A_ASCLNAVfQoyucWOAIhecWtEpNotYoZr0bAFihgNxs-1735337693273-0.0.1.1-604800000; - __cf_bm=wJkq_yLkzE3OdxE0aMJz.G0kce969.9JxRmZ0ratl4c-1735337693-1.0.1.1-OKpUoRrSPFGvWv5Hp5ET1PNZ7iZNHPKEAuakpcQUxxPSeisUIIR3qIOZ31MGmYugqB5.wkvidgbxOAagqJvmnw - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.52.1 - x-stainless-arch: - - x64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - Linux - x-stainless-package-version: - - 1.52.1 - x-stainless-raw-response: - - 'true' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.12.7 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - content: "{\n \"id\": \"chatcmpl-AjCtZGv4f3h7GDdhyOy9G0sB1lRgC\",\n \"object\": - \"chat.completion\",\n \"created\": 1735337693,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"Thought: I understand the feedback and - will adjust my response accordingly. \\nFinal Answer: Hello\",\n \"refusal\": - null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n - \ }\n ],\n \"usage\": {\n \"prompt_tokens\": 188,\n \"completion_tokens\": - 18,\n \"total_tokens\": 206,\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 \"system_fingerprint\": - \"fp_0aa8d3e20b\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 8f8caa88cac4756b-SEA - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Fri, 27 Dec 2024 22:14:54 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - crewai-iuxna1 - openai-processing-ms: - - '358' - 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: - - '149999793' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_ae1ab6b206d28ded6fee3c83ed0c2ab7 - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"messages": [{"role": "system", "content": "Determine if the following - feedback indicates that the user is satisfied or if further changes are needed. - Respond with ''True'' if further changes are needed, or ''False'' if the user - is satisfied. **Important** Do not include any additional commentary outside - of your ''True'' or ''False'' response.\n\nFeedback: \"looks good\""}], "model": - "gpt-4o-mini", "stop": ["\nObservation:"], "stream": false}' - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '439' - content-type: - - application/json - cookie: - - _cfuvid=A_ASCLNAVfQoyucWOAIhecWtEpNotYoZr0bAFihgNxs-1735337693273-0.0.1.1-604800000; - __cf_bm=wJkq_yLkzE3OdxE0aMJz.G0kce969.9JxRmZ0ratl4c-1735337693-1.0.1.1-OKpUoRrSPFGvWv5Hp5ET1PNZ7iZNHPKEAuakpcQUxxPSeisUIIR3qIOZ31MGmYugqB5.wkvidgbxOAagqJvmnw - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.52.1 - x-stainless-arch: - - x64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - Linux - x-stainless-package-version: - - 1.52.1 - x-stainless-raw-response: - - 'true' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.12.7 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - content: "{\n \"id\": \"chatcmpl-AjCtaiHL4TY8Dssk0j2miqmjrzquy\",\n \"object\": - \"chat.completion\",\n \"created\": 1735337694,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n - \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": \"False\",\n \"refusal\": null\n - \ },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n - \ ],\n \"usage\": {\n \"prompt_tokens\": 73,\n \"completion_tokens\": - 1,\n \"total_tokens\": 74,\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 \"system_fingerprint\": - \"fp_0aa8d3e20b\"\n}\n" - headers: - CF-Cache-Status: - - DYNAMIC - CF-RAY: - - 8f8caa8bdd26756b-SEA - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json - Date: - - Fri, 27 Dec 2024 22:14:54 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked - X-Content-Type-Options: - - nosniff - access-control-expose-headers: - - X-Request-ID - alt-svc: - - h3=":443"; ma=86400 - openai-organization: - - crewai-iuxna1 - openai-processing-ms: - - '184' - 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: - - '149999902' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_652891f79c1104a7a8436275d78a69f1 - http_version: HTTP/1.1 - status_code: 200 -version: 1 From e2ce65fc5b9cf1f0ab3495e74b1d102ddfacedf3 Mon Sep 17 00:00:00 2001 From: "Brandon Hancock (bhancock_ai)" <109994880+bhancockio@users.noreply.github.com> Date: Thu, 20 Feb 2025 12:12:52 -0500 Subject: [PATCH 11/35] Check the right property for tool calling (#2160) * Check the right property * Fix failing tests * Update cassettes * Update cassettes again * Update cassettes again 2 * Update cassettes again 3 * fix other test that fails in ci/cd * Fix issues pointed out by lorenze --- .../utilities/base_output_converter.py | 4 +- src/crewai/llm.py | 8 +- src/crewai/utilities/converter.py | 42 +- .../test_converter_with_llama3_1_model.yaml | 2054 +---------------- .../test_converter_with_llama3_2_model.yaml | 875 +------ tests/utilities/test_converter.py | 38 +- 6 files changed, 108 insertions(+), 2913 deletions(-) diff --git a/src/crewai/agents/agent_builder/utilities/base_output_converter.py b/src/crewai/agents/agent_builder/utilities/base_output_converter.py index 454edc5f3..938a6b29a 100644 --- a/src/crewai/agents/agent_builder/utilities/base_output_converter.py +++ b/src/crewai/agents/agent_builder/utilities/base_output_converter.py @@ -31,11 +31,11 @@ class OutputConverter(BaseModel, ABC): ) @abstractmethod - def to_pydantic(self, current_attempt=1): + def to_pydantic(self, current_attempt=1) -> BaseModel: """Convert text to pydantic.""" pass @abstractmethod - def to_json(self, current_attempt=1): + def to_json(self, current_attempt=1) -> dict: """Convert text to json.""" pass diff --git a/src/crewai/llm.py b/src/crewai/llm.py index 2d8a08228..aac1af3b7 100644 --- a/src/crewai/llm.py +++ b/src/crewai/llm.py @@ -26,9 +26,9 @@ from crewai.utilities.events.tool_usage_events import ToolExecutionErrorEvent with warnings.catch_warnings(): warnings.simplefilter("ignore", UserWarning) import litellm - from litellm import Choices, get_supported_openai_params + from litellm import Choices from litellm.types.utils import ModelResponse - from litellm.utils import supports_response_schema + from litellm.utils import get_supported_openai_params, supports_response_schema from crewai.traces.unified_trace_controller import trace_llm_call @@ -449,7 +449,7 @@ class LLM: def supports_function_calling(self) -> bool: try: params = get_supported_openai_params(model=self.model) - return "response_format" in params + return params is not None and "tools" in params except Exception as e: logging.error(f"Failed to get supported params: {str(e)}") return False @@ -457,7 +457,7 @@ class LLM: def supports_stop_words(self) -> bool: try: params = get_supported_openai_params(model=self.model) - return "stop" in params + return params is not None and "stop" in params except Exception as e: logging.error(f"Failed to get supported params: {str(e)}") return False diff --git a/src/crewai/utilities/converter.py b/src/crewai/utilities/converter.py index 5a797d8a9..f63a53d95 100644 --- a/src/crewai/utilities/converter.py +++ b/src/crewai/utilities/converter.py @@ -20,11 +20,11 @@ class ConverterError(Exception): class Converter(OutputConverter): """Class that converts text into either pydantic or json.""" - def to_pydantic(self, current_attempt=1): + def to_pydantic(self, current_attempt=1) -> BaseModel: """Convert text to pydantic.""" try: if self.llm.supports_function_calling(): - return self._create_instructor().to_pydantic() + result = self._create_instructor().to_pydantic() else: response = self.llm.call( [ @@ -32,18 +32,40 @@ class Converter(OutputConverter): {"role": "user", "content": self.text}, ] ) - return self.model.model_validate_json(response) + try: + # Try to directly validate the response JSON + result = self.model.model_validate_json(response) + except ValidationError: + # If direct validation fails, attempt to extract valid JSON + result = handle_partial_json(response, self.model, False, None) + # Ensure result is a BaseModel instance + if not isinstance(result, BaseModel): + if isinstance(result, dict): + result = self.model.parse_obj(result) + elif isinstance(result, str): + try: + parsed = json.loads(result) + result = self.model.parse_obj(parsed) + except Exception as parse_err: + raise ConverterError( + f"Failed to convert partial JSON result into Pydantic: {parse_err}" + ) + else: + raise ConverterError( + "handle_partial_json returned an unexpected type." + ) + return result except ValidationError as e: if current_attempt < self.max_attempts: return self.to_pydantic(current_attempt + 1) raise ConverterError( - f"Failed to convert text into a Pydantic model due to the following validation error: {e}" + f"Failed to convert text into a Pydantic model due to validation error: {e}" ) except Exception as e: if current_attempt < self.max_attempts: return self.to_pydantic(current_attempt + 1) raise ConverterError( - f"Failed to convert text into a Pydantic model due to the following error: {e}" + f"Failed to convert text into a Pydantic model due to error: {e}" ) def to_json(self, current_attempt=1): @@ -194,14 +216,20 @@ def convert_with_instructions( def get_conversion_instructions(model: Type[BaseModel], llm: Any) -> str: instructions = "Please convert the following text into valid JSON." + print("Using function calling: ", llm.supports_function_calling()) if llm.supports_function_calling(): model_schema = PydanticSchemaParser(model=model).get_schema() instructions += ( - f"\n\nThe JSON should follow this schema:\n```json\n{model_schema}\n```" + f"\n\nOutput ONLY the valid JSON and nothing else.\n\n" + f"The JSON must follow this schema exactly:\n```json\n{model_schema}\n```" ) else: model_description = generate_model_description(model) - instructions += f"\n\nThe JSON should follow this format:\n{model_description}" + print("Model description: ", model_description) + instructions += ( + f"\n\nOutput ONLY the valid JSON and nothing else.\n\n" + f"The JSON must follow this format exactly:\n{model_description}" + ) return instructions diff --git a/tests/utilities/cassettes/test_converter_with_llama3_1_model.yaml b/tests/utilities/cassettes/test_converter_with_llama3_1_model.yaml index ca597b3ed..d0b4469c6 100644 --- a/tests/utilities/cassettes/test_converter_with_llama3_1_model.yaml +++ b/tests/utilities/cassettes/test_converter_with_llama3_1_model.yaml @@ -1,2048 +1,36 @@ interactions: - request: - body: '{"model": "llama3.1", "prompt": "### User:\nName: Alice Llama, Age: 30\n\n### - System:\nProduce JSON OUTPUT ONLY! Adhere to this format {\"name\": \"function_name\", - \"arguments\":{\"argument_name\": \"argument_value\"}} The following functions - are available to you:\n{''type'': ''function'', ''function'': {''name'': ''SimpleModel'', - ''description'': ''Correctly extracted `SimpleModel` with all the required parameters - with correct types'', ''parameters'': {''properties'': {''name'': {''title'': - ''Name'', ''type'': ''string''}, ''age'': {''title'': ''Age'', ''type'': ''integer''}}, - ''required'': [''age'', ''name''], ''type'': ''object''}}}\n\n\n", "options": - {}, "stream": false, "format": "json"}' + body: '{"model": "llama3.1", "prompt": "### System:\nPlease convert the following + text into valid JSON.\n\nOutput ONLY the valid JSON and nothing else.\n\nThe + JSON must follow this format exactly:\n{\n \"name\": str,\n \"age\": int\n}\n\n### + User:\nName: Alice Llama, Age: 30\n\n", "options": {"stop": []}, "stream": false}' headers: - accept: + Accept: - '*/*' - accept-encoding: + Accept-Encoding: - gzip, deflate - connection: + Connection: - keep-alive - content-length: - - '654' - host: - - localhost:11434 - user-agent: - - litellm/1.57.4 + Content-Length: + - '318' + Content-Type: + - application/json + User-Agent: + - python-requests/2.32.2 method: POST uri: http://localhost:11434/api/generate response: - content: '{"model":"llama3.1","created_at":"2025-01-15T20:47:17.068012Z","response":"{\"name\": - \"SimpleModel\", \"arguments\": {\"age\": \"30\", \"name\": \"Alice Llama\"}}","done":true,"done_reason":"stop","context":[128006,882,128007,271,14711,2724,512,678,25,30505,445,81101,11,13381,25,220,966,271,14711,744,512,1360,13677,4823,32090,27785,0,2467,6881,311,420,3645,5324,609,794,330,1723,1292,498,330,16774,23118,14819,1292,794,330,14819,3220,32075,578,2768,5865,527,2561,311,499,512,13922,1337,1232,364,1723,518,364,1723,1232,5473,609,1232,364,16778,1747,518,364,4789,1232,364,34192,398,28532,1595,16778,1747,63,449,682,279,2631,5137,449,4495,4595,518,364,14105,1232,5473,13495,1232,5473,609,1232,5473,2150,1232,364,678,518,364,1337,1232,364,928,25762,364,425,1232,5473,2150,1232,364,17166,518,364,1337,1232,364,11924,8439,2186,364,6413,1232,2570,425,518,364,609,4181,364,1337,1232,364,1735,23742,3818,128009,128006,78191,128007,271,5018,609,794,330,16778,1747,498,330,16774,794,5324,425,794,330,966,498,330,609,794,330,62786,445,81101,32075],"total_duration":4753211958,"load_duration":1084951250,"prompt_eval_count":152,"prompt_eval_duration":2906000000,"eval_count":25,"eval_duration":761000000}' + body: + string: '{"model":"llama3.1","created_at":"2025-02-18T21:52:24.555211Z","response":"{\n \"name\": + \"Alice Llama\", \n \"age\": 30\n}","done":true,"done_reason":"stop","context":[128006,882,128007,271,14711,744,512,5618,5625,279,2768,1495,1139,2764,4823,382,5207,27785,279,2764,4823,323,4400,775,382,791,4823,2011,1833,420,3645,7041,512,517,220,330,609,794,610,345,220,330,425,794,528,198,633,14711,2724,512,678,25,30505,445,81101,11,13381,25,220,966,271,128009,128006,78191,128007,271,517,220,330,609,794,330,62786,445,81101,498,720,220,330,425,794,220,966,198,92],"total_duration":3449060375,"load_duration":806464375,"prompt_eval_count":67,"prompt_eval_duration":2065000000,"eval_count":20,"eval_duration":576000000}' headers: Content-Length: - - '1193' + - '711' Content-Type: - application/json; charset=utf-8 Date: - - Wed, 15 Jan 2025 20:47:17 GMT - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"name": "llama3.1"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '20' - content-type: - - application/json - host: - - localhost:11434 - user-agent: - - litellm/1.57.4 - method: POST - uri: http://localhost:11434/api/show - response: - content: "{\"license\":\"LLAMA 3.1 COMMUNITY LICENSE AGREEMENT\\nLlama 3.1 Version - Release Date: July 23, 2024\\n\\n\u201CAgreement\u201D means the terms and conditions - for use, reproduction, distribution and modification of the\\nLlama Materials - set forth herein.\\n\\n\u201CDocumentation\u201D means the specifications, manuals - and documentation accompanying Llama 3.1\\ndistributed by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D - or \u201Cyou\u201D means you, or your employer or any other person or entity - (if you are entering into\\nthis Agreement on such person or entity\u2019s behalf), - of the age required under applicable laws, rules or\\nregulations to provide - legal consent and that has legal authority to bind your employer or such other\\nperson - or entity if you are entering in this Agreement on their behalf.\\n\\n\u201CLlama - 3.1\u201D means the foundational large language models and software and algorithms, - including\\nmachine-learning model code, trained model weights, inference-enabling - code, training-enabling code,\\nfine-tuning enabling code and other elements - of the foregoing distributed by Meta at\\nhttps://llama.meta.com/llama-downloads.\\n\\n\u201CLlama - Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.1 and Documentation - (and any\\nportion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D - or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in - or, if you are an entity, your\\nprincipal place of business is in the EEA or - Switzerland) and Meta Platforms, Inc. (if you are located\\noutside of the EEA - or Switzerland).\\n\\nBy clicking \u201CI Accept\u201D below or by using or - distributing any portion or element of the Llama Materials,\\nyou agree to be - bound by this Agreement.\\n\\n1. License Rights and Redistribution.\\n\\n a. - Grant of Rights. You are granted a non-exclusive, worldwide, non-transferable - and royalty-free\\nlimited license under Meta\u2019s intellectual property or - other rights owned by Meta embodied in the Llama\\nMaterials to use, reproduce, - distribute, copy, create derivative works of, and make modifications to the\\nLlama - Materials.\\n\\n b. Redistribution and Use.\\n\\n i. If you distribute - or make available the Llama Materials (or any derivative works\\nthereof), or - a product or service (including another AI model) that contains any of them, - you shall (A)\\nprovide a copy of this Agreement with any such Llama Materials; - and (B) prominently display \u201CBuilt with\\nLlama\u201D on a related website, - user interface, blogpost, about page, or product documentation. If you use\\nthe - Llama Materials or any outputs or results of the Llama Materials to create, - train, fine tune, or\\notherwise improve an AI model, which is distributed or - made available, you shall also include \u201CLlama\u201D at\\nthe beginning - of any such AI model name.\\n\\n ii. If you receive Llama Materials, or - any derivative works thereof, from a Licensee as part \\nof an integrated end - user product, then Section 2 of this Agreement will not apply to you.\\n\\n - \ iii. You must retain in all copies of the Llama Materials that you distribute - the following\\nattribution notice within a \u201CNotice\u201D text file distributed - as a part of such copies: \u201CLlama 3.1 is\\nlicensed under the Llama 3.1 - Community License, Copyright \xA9 Meta Platforms, Inc. All Rights\\nReserved.\u201D\\n\\n - \ iv. Your use of the Llama Materials must comply with applicable laws and - regulations\\n(including trade compliance laws and regulations) and adhere to - the Acceptable Use Policy for the Llama\\nMaterials (available at https://llama.meta.com/llama3_1/use-policy), - which is hereby incorporated by\\nreference into this Agreement.\\n\\n2. Additional - Commercial Terms. If, on the Llama 3.1 version release date, the monthly active - users\\nof the products or services made available by or for Licensee, or Licensee\u2019s - affiliates, is greater than 700\\nmillion monthly active users in the preceding - calendar month, you must request a license from Meta,\\nwhich Meta may grant - to you in its sole discretion, and you are not authorized to exercise any of - the\\nrights under this Agreement unless or until Meta otherwise expressly grants - you such rights.\\n\\n3. Disclaimer of Warranty. UNLESS REQUIRED BY APPLICABLE - LAW, THE LLAMA MATERIALS AND ANY\\nOUTPUT AND RESULTS THEREFROM ARE PROVIDED - ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF\\nANY KIND, AND META DISCLAIMS - ALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND IMPLIED,\\nINCLUDING, WITHOUT LIMITATION, - ANY WARRANTIES OF TITLE, NON-INFRINGEMENT,\\nMERCHANTABILITY, OR FITNESS FOR - A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE FOR\\nDETERMINING THE APPROPRIATENESS - OF USING OR REDISTRIBUTING THE LLAMA MATERIALS AND\\nASSUME ANY RISKS ASSOCIATED - WITH YOUR USE OF THE LLAMA MATERIALS AND ANY OUTPUT AND\\nRESULTS.\\n\\n4. Limitation - of Liability. IN NO EVENT WILL META OR ITS AFFILIATES BE LIABLE UNDER ANY THEORY - OF\\nLIABILITY, WHETHER IN CONTRACT, TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR - OTHERWISE, ARISING\\nOUT OF THIS AGREEMENT, FOR ANY LOST PROFITS OR ANY INDIRECT, - SPECIAL, CONSEQUENTIAL,\\nINCIDENTAL, EXEMPLARY OR PUNITIVE DAMAGES, EVEN IF - META OR ITS AFFILIATES HAVE BEEN ADVISED\\nOF THE POSSIBILITY OF ANY OF THE - FOREGOING.\\n\\n5. Intellectual Property.\\n\\n a. No trademark licenses are - granted under this Agreement, and in connection with the Llama\\nMaterials, - neither Meta nor Licensee may use any name or mark owned by or associated with - the other\\nor any of its affiliates, except as required for reasonable and - customary use in describing and\\nredistributing the Llama Materials or as set - forth in this Section 5(a). Meta hereby grants you a license to\\nuse \u201CLlama\u201D - (the \u201CMark\u201D) solely as required to comply with the last sentence of - Section 1.b.i. You will\\ncomply with Meta\u2019s brand guidelines (currently - accessible at\\nhttps://about.meta.com/brand/resources/meta/company-brand/ ). - All goodwill arising out of your use\\nof the Mark will inure to the benefit - of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and derivatives - made by or for Meta, with\\nrespect to any derivative works and modifications - of the Llama Materials that are made by you, as\\nbetween you and Meta, you - are and will be the owner of such derivative works and modifications.\\n\\n - \ c. If you institute litigation or other proceedings against Meta or any entity - (including a\\ncross-claim or counterclaim in a lawsuit) alleging that the Llama - Materials or Llama 3.1 outputs or\\nresults, or any portion of any of the foregoing, - constitutes infringement of intellectual property or other\\nrights owned or - licensable by you, then any licenses granted to you under this Agreement shall\\nterminate - as of the date such litigation or claim is filed or instituted. You will indemnify - and hold\\nharmless Meta from and against any claim by any third party arising - out of or related to your use or\\ndistribution of the Llama Materials.\\n\\n6. - Term and Termination. The term of this Agreement will commence upon your acceptance - of this\\nAgreement or access to the Llama Materials and will continue in full - force and effect until terminated in\\naccordance with the terms and conditions - herein. Meta may terminate this Agreement if you are in\\nbreach of any term - or condition of this Agreement. Upon termination of this Agreement, you shall - delete\\nand cease use of the Llama Materials. Sections 3, 4 and 7 shall survive - the termination of this\\nAgreement.\\n\\n7. Governing Law and Jurisdiction. - This Agreement will be governed and construed under the laws of\\nthe State - of California without regard to choice of law principles, and the UN Convention - on Contracts\\nfor the International Sale of Goods does not apply to this Agreement. - The courts of California shall have\\nexclusive jurisdiction of any dispute - arising out of this Agreement.\\n\\n# Llama 3.1 Acceptable Use Policy\\n\\nMeta - is committed to promoting safe and fair use of its tools and features, including - Llama 3.1. If you\\naccess or use Llama 3.1, you agree to this Acceptable Use - Policy (\u201CPolicy\u201D). The most recent copy of\\nthis policy can be found - at [https://llama.meta.com/llama3_1/use-policy](https://llama.meta.com/llama3_1/use-policy)\\n\\n## - Prohibited Uses\\n\\nWe want everyone to use Llama 3.1 safely and responsibly. - You agree you will not use, or allow\\nothers to use, Llama 3.1 to:\\n\\n1. - Violate the law or others\u2019 rights, including to:\\n 1. Engage in, promote, - generate, contribute to, encourage, plan, incite, or further illegal or unlawful - activity or content, such as:\\n 1. Violence or terrorism\\n 2. - Exploitation or harm to children, including the solicitation, creation, acquisition, - or dissemination of child exploitative content or failure to report Child Sexual - Abuse Material\\n 3. Human trafficking, exploitation, and sexual violence\\n - \ 4. The illegal distribution of information or materials to minors, including - obscene materials, or failure to employ legally required age-gating in connection - with such information or materials.\\n 5. Sexual solicitation\\n 6. - Any other criminal activity\\n 3. Engage in, promote, incite, or facilitate - the harassment, abuse, threatening, or bullying of individuals or groups of - individuals\\n 4. Engage in, promote, incite, or facilitate discrimination - or other unlawful or harmful conduct in the provision of employment, employment - benefits, credit, housing, other economic benefits, or other essential goods - and services\\n 5. Engage in the unauthorized or unlicensed practice of any - profession including, but not limited to, financial, legal, medical/health, - or related professional practices\\n 6. Collect, process, disclose, generate, - or infer health, demographic, or other sensitive personal or private information - about individuals without rights and consents required by applicable laws\\n - \ 7. Engage in or facilitate any action or generate any content that infringes, - misappropriates, or otherwise violates any third-party rights, including the - outputs or results of any products or services using the Llama Materials\\n - \ 8. Create, generate, or facilitate the creation of malicious code, malware, - computer viruses or do anything else that could disable, overburden, interfere - with or impair the proper working, integrity, operation or appearance of a website - or computer system\\n\\n2. Engage in, promote, incite, facilitate, or assist - in the planning or development of activities that present a risk of death or - bodily harm to individuals, including use of Llama 3.1 related to the following:\\n - \ 1. Military, warfare, nuclear industries or applications, espionage, use - for materials or activities that are subject to the International Traffic Arms - Regulations (ITAR) maintained by the United States Department of State\\n 2. - Guns and illegal weapons (including weapon development)\\n 3. Illegal drugs - and regulated/controlled substances\\n 4. Operation of critical infrastructure, - transportation technologies, or heavy machinery\\n 5. Self-harm or harm to - others, including suicide, cutting, and eating disorders\\n 6. Any content - intended to incite or promote violence, abuse, or any infliction of bodily harm - to an individual\\n\\n3. Intentionally deceive or mislead others, including - use of Llama 3.1 related to the following:\\n 1. Generating, promoting, or - furthering fraud or the creation or promotion of disinformation\\n 2. Generating, - promoting, or furthering defamatory content, including the creation of defamatory - statements, images, or other content\\n 3. Generating, promoting, or further - distributing spam\\n 4. Impersonating another individual without consent, - authorization, or legal right\\n 5. Representing that the use of Llama 3.1 - or outputs are human-generated\\n 6. Generating or facilitating false online - engagement, including fake reviews and other means of fake online engagement\\n\\n4. - Fail to appropriately disclose to end users any known dangers of your AI system\\n\\nPlease - report any violation of this Policy, software \u201Cbug,\u201D or other problems - that could lead to a violation\\nof this Policy through one of the following - means:\\n\\n* Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://github.com/meta-llama/llama-models/issues)\\n* - Reporting risky content generated by the model: developers.facebook.com/llama_output_feedback\\n* - Reporting bugs and security concerns: facebook.com/whitehat/info\\n* Reporting - violations of the Acceptable Use Policy or unlicensed uses of Llama 3.1: LlamaUseReport@meta.com\\n\",\"modelfile\":\"# - Modelfile generated by \\\"ollama show\\\"\\n# To build a new Modelfile based - on this, replace FROM with:\\n# FROM llama3.1:latest\\n\\nFROM /Users/brandonhancock/.ollama/models/blobs/sha256-87048bcd55216712ef14c11c2c303728463207b165bf18440b9b84b07ec00f87\\nTEMPLATE - \\\"\\\"\\\"{{ if .Messages }}\\n{{- if or .System .Tools }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n{{- - if .System }}\\n\\n{{ .System }}\\n{{- end }}\\n{{- if .Tools }}\\n\\nYou are - a helpful assistant with tool calling capabilities. When you receive a tool - call response, use the output to format an answer to the orginal use question.\\n{{- - end }}\\u003c|eot_id|\\u003e\\n{{- end }}\\n{{- range $i, $_ := .Messages }}\\n{{- - $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- if eq .Role \\\"user\\\" - }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- if - and $.Tools $last }}\\n\\nGiven the following functions, please respond with - a JSON for a function call with its proper arguments that best answers the given - prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": - dictionary of argument name and its value}. Do not use variables.\\n\\n{{ $.Tools - }}\\n{{- end }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- - if .ToolCalls }}\\n\\n{{- range .ToolCalls }}{\\\"name\\\": \\\"{{ .Function.Name - }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ - .Content }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- end }}\\n{{- - else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ - .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- end }}\\n{{- end }}\\n{{- else }}\\n{{- if .System }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\n{{ - .System }}\\u003c|eot_id|\\u003e{{ end }}{{ if .Prompt }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n\\n{{ - .Prompt }}\\u003c|eot_id|\\u003e{{ end }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}{{ .Response }}{{ if .Response }}\\u003c|eot_id|\\u003e{{ end }}\\\"\\\"\\\"\\nPARAMETER - stop \\u003c|start_header_id|\\u003e\\nPARAMETER stop \\u003c|end_header_id|\\u003e\\nPARAMETER - stop \\u003c|eot_id|\\u003e\\nLICENSE \\\"LLAMA 3.1 COMMUNITY LICENSE AGREEMENT\\nLlama - 3.1 Version Release Date: July 23, 2024\\n\\n\u201CAgreement\u201D means the - terms and conditions for use, reproduction, distribution and modification of - the\\nLlama Materials set forth herein.\\n\\n\u201CDocumentation\u201D means - the specifications, manuals and documentation accompanying Llama 3.1\\ndistributed - by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D or - \u201Cyou\u201D means you, or your employer or any other person or entity (if - you are entering into\\nthis Agreement on such person or entity\u2019s behalf), - of the age required under applicable laws, rules or\\nregulations to provide - legal consent and that has legal authority to bind your employer or such other\\nperson - or entity if you are entering in this Agreement on their behalf.\\n\\n\u201CLlama - 3.1\u201D means the foundational large language models and software and algorithms, - including\\nmachine-learning model code, trained model weights, inference-enabling - code, training-enabling code,\\nfine-tuning enabling code and other elements - of the foregoing distributed by Meta at\\nhttps://llama.meta.com/llama-downloads.\\n\\n\u201CLlama - Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.1 and Documentation - (and any\\nportion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D - or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in - or, if you are an entity, your\\nprincipal place of business is in the EEA or - Switzerland) and Meta Platforms, Inc. (if you are located\\noutside of the EEA - or Switzerland).\\n\\nBy clicking \u201CI Accept\u201D below or by using or - distributing any portion or element of the Llama Materials,\\nyou agree to be - bound by this Agreement.\\n\\n1. License Rights and Redistribution.\\n\\n a. - Grant of Rights. You are granted a non-exclusive, worldwide, non-transferable - and royalty-free\\nlimited license under Meta\u2019s intellectual property or - other rights owned by Meta embodied in the Llama\\nMaterials to use, reproduce, - distribute, copy, create derivative works of, and make modifications to the\\nLlama - Materials.\\n\\n b. Redistribution and Use.\\n\\n i. If you distribute - or make available the Llama Materials (or any derivative works\\nthereof), or - a product or service (including another AI model) that contains any of them, - you shall (A)\\nprovide a copy of this Agreement with any such Llama Materials; - and (B) prominently display \u201CBuilt with\\nLlama\u201D on a related website, - user interface, blogpost, about page, or product documentation. If you use\\nthe - Llama Materials or any outputs or results of the Llama Materials to create, - train, fine tune, or\\notherwise improve an AI model, which is distributed or - made available, you shall also include \u201CLlama\u201D at\\nthe beginning - of any such AI model name.\\n\\n ii. If you receive Llama Materials, or - any derivative works thereof, from a Licensee as part \\nof an integrated end - user product, then Section 2 of this Agreement will not apply to you.\\n\\n - \ iii. You must retain in all copies of the Llama Materials that you distribute - the following\\nattribution notice within a \u201CNotice\u201D text file distributed - as a part of such copies: \u201CLlama 3.1 is\\nlicensed under the Llama 3.1 - Community License, Copyright \xA9 Meta Platforms, Inc. All Rights\\nReserved.\u201D\\n\\n - \ iv. Your use of the Llama Materials must comply with applicable laws and - regulations\\n(including trade compliance laws and regulations) and adhere to - the Acceptable Use Policy for the Llama\\nMaterials (available at https://llama.meta.com/llama3_1/use-policy), - which is hereby incorporated by\\nreference into this Agreement.\\n\\n2. Additional - Commercial Terms. If, on the Llama 3.1 version release date, the monthly active - users\\nof the products or services made available by or for Licensee, or Licensee\u2019s - affiliates, is greater than 700\\nmillion monthly active users in the preceding - calendar month, you must request a license from Meta,\\nwhich Meta may grant - to you in its sole discretion, and you are not authorized to exercise any of - the\\nrights under this Agreement unless or until Meta otherwise expressly grants - you such rights.\\n\\n3. Disclaimer of Warranty. UNLESS REQUIRED BY APPLICABLE - LAW, THE LLAMA MATERIALS AND ANY\\nOUTPUT AND RESULTS THEREFROM ARE PROVIDED - ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF\\nANY KIND, AND META DISCLAIMS - ALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND IMPLIED,\\nINCLUDING, WITHOUT LIMITATION, - ANY WARRANTIES OF TITLE, NON-INFRINGEMENT,\\nMERCHANTABILITY, OR FITNESS FOR - A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE FOR\\nDETERMINING THE APPROPRIATENESS - OF USING OR REDISTRIBUTING THE LLAMA MATERIALS AND\\nASSUME ANY RISKS ASSOCIATED - WITH YOUR USE OF THE LLAMA MATERIALS AND ANY OUTPUT AND\\nRESULTS.\\n\\n4. Limitation - of Liability. IN NO EVENT WILL META OR ITS AFFILIATES BE LIABLE UNDER ANY THEORY - OF\\nLIABILITY, WHETHER IN CONTRACT, TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR - OTHERWISE, ARISING\\nOUT OF THIS AGREEMENT, FOR ANY LOST PROFITS OR ANY INDIRECT, - SPECIAL, CONSEQUENTIAL,\\nINCIDENTAL, EXEMPLARY OR PUNITIVE DAMAGES, EVEN IF - META OR ITS AFFILIATES HAVE BEEN ADVISED\\nOF THE POSSIBILITY OF ANY OF THE - FOREGOING.\\n\\n5. Intellectual Property.\\n\\n a. No trademark licenses are - granted under this Agreement, and in connection with the Llama\\nMaterials, - neither Meta nor Licensee may use any name or mark owned by or associated with - the other\\nor any of its affiliates, except as required for reasonable and - customary use in describing and\\nredistributing the Llama Materials or as set - forth in this Section 5(a). Meta hereby grants you a license to\\nuse \u201CLlama\u201D - (the \u201CMark\u201D) solely as required to comply with the last sentence of - Section 1.b.i. You will\\ncomply with Meta\u2019s brand guidelines (currently - accessible at\\nhttps://about.meta.com/brand/resources/meta/company-brand/ ). - All goodwill arising out of your use\\nof the Mark will inure to the benefit - of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and derivatives - made by or for Meta, with\\nrespect to any derivative works and modifications - of the Llama Materials that are made by you, as\\nbetween you and Meta, you - are and will be the owner of such derivative works and modifications.\\n\\n - \ c. If you institute litigation or other proceedings against Meta or any entity - (including a\\ncross-claim or counterclaim in a lawsuit) alleging that the Llama - Materials or Llama 3.1 outputs or\\nresults, or any portion of any of the foregoing, - constitutes infringement of intellectual property or other\\nrights owned or - licensable by you, then any licenses granted to you under this Agreement shall\\nterminate - as of the date such litigation or claim is filed or instituted. You will indemnify - and hold\\nharmless Meta from and against any claim by any third party arising - out of or related to your use or\\ndistribution of the Llama Materials.\\n\\n6. - Term and Termination. The term of this Agreement will commence upon your acceptance - of this\\nAgreement or access to the Llama Materials and will continue in full - force and effect until terminated in\\naccordance with the terms and conditions - herein. Meta may terminate this Agreement if you are in\\nbreach of any term - or condition of this Agreement. Upon termination of this Agreement, you shall - delete\\nand cease use of the Llama Materials. Sections 3, 4 and 7 shall survive - the termination of this\\nAgreement.\\n\\n7. Governing Law and Jurisdiction. - This Agreement will be governed and construed under the laws of\\nthe State - of California without regard to choice of law principles, and the UN Convention - on Contracts\\nfor the International Sale of Goods does not apply to this Agreement. - The courts of California shall have\\nexclusive jurisdiction of any dispute - arising out of this Agreement.\\n\\n# Llama 3.1 Acceptable Use Policy\\n\\nMeta - is committed to promoting safe and fair use of its tools and features, including - Llama 3.1. If you\\naccess or use Llama 3.1, you agree to this Acceptable Use - Policy (\u201CPolicy\u201D). The most recent copy of\\nthis policy can be found - at [https://llama.meta.com/llama3_1/use-policy](https://llama.meta.com/llama3_1/use-policy)\\n\\n## - Prohibited Uses\\n\\nWe want everyone to use Llama 3.1 safely and responsibly. - You agree you will not use, or allow\\nothers to use, Llama 3.1 to:\\n\\n1. - Violate the law or others\u2019 rights, including to:\\n 1. Engage in, promote, - generate, contribute to, encourage, plan, incite, or further illegal or unlawful - activity or content, such as:\\n 1. Violence or terrorism\\n 2. - Exploitation or harm to children, including the solicitation, creation, acquisition, - or dissemination of child exploitative content or failure to report Child Sexual - Abuse Material\\n 3. Human trafficking, exploitation, and sexual violence\\n - \ 4. The illegal distribution of information or materials to minors, including - obscene materials, or failure to employ legally required age-gating in connection - with such information or materials.\\n 5. Sexual solicitation\\n 6. - Any other criminal activity\\n 3. Engage in, promote, incite, or facilitate - the harassment, abuse, threatening, or bullying of individuals or groups of - individuals\\n 4. Engage in, promote, incite, or facilitate discrimination - or other unlawful or harmful conduct in the provision of employment, employment - benefits, credit, housing, other economic benefits, or other essential goods - and services\\n 5. Engage in the unauthorized or unlicensed practice of any - profession including, but not limited to, financial, legal, medical/health, - or related professional practices\\n 6. Collect, process, disclose, generate, - or infer health, demographic, or other sensitive personal or private information - about individuals without rights and consents required by applicable laws\\n - \ 7. Engage in or facilitate any action or generate any content that infringes, - misappropriates, or otherwise violates any third-party rights, including the - outputs or results of any products or services using the Llama Materials\\n - \ 8. Create, generate, or facilitate the creation of malicious code, malware, - computer viruses or do anything else that could disable, overburden, interfere - with or impair the proper working, integrity, operation or appearance of a website - or computer system\\n\\n2. Engage in, promote, incite, facilitate, or assist - in the planning or development of activities that present a risk of death or - bodily harm to individuals, including use of Llama 3.1 related to the following:\\n - \ 1. Military, warfare, nuclear industries or applications, espionage, use - for materials or activities that are subject to the International Traffic Arms - Regulations (ITAR) maintained by the United States Department of State\\n 2. - Guns and illegal weapons (including weapon development)\\n 3. Illegal drugs - and regulated/controlled substances\\n 4. Operation of critical infrastructure, - transportation technologies, or heavy machinery\\n 5. Self-harm or harm to - others, including suicide, cutting, and eating disorders\\n 6. Any content - intended to incite or promote violence, abuse, or any infliction of bodily harm - to an individual\\n\\n3. Intentionally deceive or mislead others, including - use of Llama 3.1 related to the following:\\n 1. Generating, promoting, or - furthering fraud or the creation or promotion of disinformation\\n 2. Generating, - promoting, or furthering defamatory content, including the creation of defamatory - statements, images, or other content\\n 3. Generating, promoting, or further - distributing spam\\n 4. Impersonating another individual without consent, - authorization, or legal right\\n 5. Representing that the use of Llama 3.1 - or outputs are human-generated\\n 6. Generating or facilitating false online - engagement, including fake reviews and other means of fake online engagement\\n\\n4. - Fail to appropriately disclose to end users any known dangers of your AI system\\n\\nPlease - report any violation of this Policy, software \u201Cbug,\u201D or other problems - that could lead to a violation\\nof this Policy through one of the following - means:\\n\\n* Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://github.com/meta-llama/llama-models/issues)\\n* - Reporting risky content generated by the model: developers.facebook.com/llama_output_feedback\\n* - Reporting bugs and security concerns: facebook.com/whitehat/info\\n* Reporting - violations of the Acceptable Use Policy or unlicensed uses of Llama 3.1: LlamaUseReport@meta.com\\n\\\"\\n\",\"parameters\":\"stop - \ \\\"\\u003c|start_header_id|\\u003e\\\"\\nstop \\\"\\u003c|end_header_id|\\u003e\\\"\\nstop - \ \\\"\\u003c|eot_id|\\u003e\\\"\",\"template\":\"{{ - if .Messages }}\\n{{- if or .System .Tools }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n{{- - if .System }}\\n\\n{{ .System }}\\n{{- end }}\\n{{- if .Tools }}\\n\\nYou are - a helpful assistant with tool calling capabilities. When you receive a tool - call response, use the output to format an answer to the orginal use question.\\n{{- - end }}\\u003c|eot_id|\\u003e\\n{{- end }}\\n{{- range $i, $_ := .Messages }}\\n{{- - $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- if eq .Role \\\"user\\\" - }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- if - and $.Tools $last }}\\n\\nGiven the following functions, please respond with - a JSON for a function call with its proper arguments that best answers the given - prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": - dictionary of argument name and its value}. Do not use variables.\\n\\n{{ $.Tools - }}\\n{{- end }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- - if .ToolCalls }}\\n\\n{{- range .ToolCalls }}{\\\"name\\\": \\\"{{ .Function.Name - }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ - .Content }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- end }}\\n{{- - else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ - .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- end }}\\n{{- end }}\\n{{- else }}\\n{{- if .System }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\n{{ - .System }}\\u003c|eot_id|\\u003e{{ end }}{{ if .Prompt }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n\\n{{ - .Prompt }}\\u003c|eot_id|\\u003e{{ end }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}{{ .Response }}{{ if .Response }}\\u003c|eot_id|\\u003e{{ end }}\",\"details\":{\"parent_model\":\"\",\"format\":\"gguf\",\"family\":\"llama\",\"families\":[\"llama\"],\"parameter_size\":\"8.0B\",\"quantization_level\":\"Q4_0\"},\"model_info\":{\"general.architecture\":\"llama\",\"general.basename\":\"Meta-Llama-3.1\",\"general.file_type\":2,\"general.finetune\":\"Instruct\",\"general.languages\":[\"en\",\"de\",\"fr\",\"it\",\"pt\",\"hi\",\"es\",\"th\"],\"general.license\":\"llama3.1\",\"general.parameter_count\":8030261248,\"general.quantization_version\":2,\"general.size_label\":\"8B\",\"general.tags\":[\"facebook\",\"meta\",\"pytorch\",\"llama\",\"llama-3\",\"text-generation\"],\"general.type\":\"model\",\"llama.attention.head_count\":32,\"llama.attention.head_count_kv\":8,\"llama.attention.layer_norm_rms_epsilon\":0.00001,\"llama.block_count\":32,\"llama.context_length\":131072,\"llama.embedding_length\":4096,\"llama.feed_forward_length\":14336,\"llama.rope.dimension_count\":128,\"llama.rope.freq_base\":500000,\"llama.vocab_size\":128256,\"tokenizer.ggml.bos_token_id\":128000,\"tokenizer.ggml.eos_token_id\":128009,\"tokenizer.ggml.merges\":null,\"tokenizer.ggml.model\":\"gpt2\",\"tokenizer.ggml.pre\":\"llama-bpe\",\"tokenizer.ggml.token_type\":null,\"tokenizer.ggml.tokens\":null},\"modified_at\":\"2024-08-01T11:38:16.96106256-04:00\"}" - headers: - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 15 Jan 2025 20:47:17 GMT - Transfer-Encoding: - - chunked - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"name": "llama3.1"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '20' - content-type: - - application/json - host: - - localhost:11434 - user-agent: - - litellm/1.57.4 - method: POST - uri: http://localhost:11434/api/show - response: - content: "{\"license\":\"LLAMA 3.1 COMMUNITY LICENSE AGREEMENT\\nLlama 3.1 Version - Release Date: July 23, 2024\\n\\n\u201CAgreement\u201D means the terms and conditions - for use, reproduction, distribution and modification of the\\nLlama Materials - set forth herein.\\n\\n\u201CDocumentation\u201D means the specifications, manuals - and documentation accompanying Llama 3.1\\ndistributed by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D - or \u201Cyou\u201D means you, or your employer or any other person or entity - (if you are entering into\\nthis Agreement on such person or entity\u2019s behalf), - of the age required under applicable laws, rules or\\nregulations to provide - legal consent and that has legal authority to bind your employer or such other\\nperson - or entity if you are entering in this Agreement on their behalf.\\n\\n\u201CLlama - 3.1\u201D means the foundational large language models and software and algorithms, - including\\nmachine-learning model code, trained model weights, inference-enabling - code, training-enabling code,\\nfine-tuning enabling code and other elements - of the foregoing distributed by Meta at\\nhttps://llama.meta.com/llama-downloads.\\n\\n\u201CLlama - Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.1 and Documentation - (and any\\nportion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D - or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in - or, if you are an entity, your\\nprincipal place of business is in the EEA or - Switzerland) and Meta Platforms, Inc. (if you are located\\noutside of the EEA - or Switzerland).\\n\\nBy clicking \u201CI Accept\u201D below or by using or - distributing any portion or element of the Llama Materials,\\nyou agree to be - bound by this Agreement.\\n\\n1. License Rights and Redistribution.\\n\\n a. - Grant of Rights. You are granted a non-exclusive, worldwide, non-transferable - and royalty-free\\nlimited license under Meta\u2019s intellectual property or - other rights owned by Meta embodied in the Llama\\nMaterials to use, reproduce, - distribute, copy, create derivative works of, and make modifications to the\\nLlama - Materials.\\n\\n b. Redistribution and Use.\\n\\n i. If you distribute - or make available the Llama Materials (or any derivative works\\nthereof), or - a product or service (including another AI model) that contains any of them, - you shall (A)\\nprovide a copy of this Agreement with any such Llama Materials; - and (B) prominently display \u201CBuilt with\\nLlama\u201D on a related website, - user interface, blogpost, about page, or product documentation. If you use\\nthe - Llama Materials or any outputs or results of the Llama Materials to create, - train, fine tune, or\\notherwise improve an AI model, which is distributed or - made available, you shall also include \u201CLlama\u201D at\\nthe beginning - of any such AI model name.\\n\\n ii. If you receive Llama Materials, or - any derivative works thereof, from a Licensee as part \\nof an integrated end - user product, then Section 2 of this Agreement will not apply to you.\\n\\n - \ iii. You must retain in all copies of the Llama Materials that you distribute - the following\\nattribution notice within a \u201CNotice\u201D text file distributed - as a part of such copies: \u201CLlama 3.1 is\\nlicensed under the Llama 3.1 - Community License, Copyright \xA9 Meta Platforms, Inc. All Rights\\nReserved.\u201D\\n\\n - \ iv. Your use of the Llama Materials must comply with applicable laws and - regulations\\n(including trade compliance laws and regulations) and adhere to - the Acceptable Use Policy for the Llama\\nMaterials (available at https://llama.meta.com/llama3_1/use-policy), - which is hereby incorporated by\\nreference into this Agreement.\\n\\n2. Additional - Commercial Terms. If, on the Llama 3.1 version release date, the monthly active - users\\nof the products or services made available by or for Licensee, or Licensee\u2019s - affiliates, is greater than 700\\nmillion monthly active users in the preceding - calendar month, you must request a license from Meta,\\nwhich Meta may grant - to you in its sole discretion, and you are not authorized to exercise any of - the\\nrights under this Agreement unless or until Meta otherwise expressly grants - you such rights.\\n\\n3. Disclaimer of Warranty. UNLESS REQUIRED BY APPLICABLE - LAW, THE LLAMA MATERIALS AND ANY\\nOUTPUT AND RESULTS THEREFROM ARE PROVIDED - ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF\\nANY KIND, AND META DISCLAIMS - ALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND IMPLIED,\\nINCLUDING, WITHOUT LIMITATION, - ANY WARRANTIES OF TITLE, NON-INFRINGEMENT,\\nMERCHANTABILITY, OR FITNESS FOR - A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE FOR\\nDETERMINING THE APPROPRIATENESS - OF USING OR REDISTRIBUTING THE LLAMA MATERIALS AND\\nASSUME ANY RISKS ASSOCIATED - WITH YOUR USE OF THE LLAMA MATERIALS AND ANY OUTPUT AND\\nRESULTS.\\n\\n4. Limitation - of Liability. IN NO EVENT WILL META OR ITS AFFILIATES BE LIABLE UNDER ANY THEORY - OF\\nLIABILITY, WHETHER IN CONTRACT, TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR - OTHERWISE, ARISING\\nOUT OF THIS AGREEMENT, FOR ANY LOST PROFITS OR ANY INDIRECT, - SPECIAL, CONSEQUENTIAL,\\nINCIDENTAL, EXEMPLARY OR PUNITIVE DAMAGES, EVEN IF - META OR ITS AFFILIATES HAVE BEEN ADVISED\\nOF THE POSSIBILITY OF ANY OF THE - FOREGOING.\\n\\n5. Intellectual Property.\\n\\n a. No trademark licenses are - granted under this Agreement, and in connection with the Llama\\nMaterials, - neither Meta nor Licensee may use any name or mark owned by or associated with - the other\\nor any of its affiliates, except as required for reasonable and - customary use in describing and\\nredistributing the Llama Materials or as set - forth in this Section 5(a). Meta hereby grants you a license to\\nuse \u201CLlama\u201D - (the \u201CMark\u201D) solely as required to comply with the last sentence of - Section 1.b.i. You will\\ncomply with Meta\u2019s brand guidelines (currently - accessible at\\nhttps://about.meta.com/brand/resources/meta/company-brand/ ). - All goodwill arising out of your use\\nof the Mark will inure to the benefit - of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and derivatives - made by or for Meta, with\\nrespect to any derivative works and modifications - of the Llama Materials that are made by you, as\\nbetween you and Meta, you - are and will be the owner of such derivative works and modifications.\\n\\n - \ c. If you institute litigation or other proceedings against Meta or any entity - (including a\\ncross-claim or counterclaim in a lawsuit) alleging that the Llama - Materials or Llama 3.1 outputs or\\nresults, or any portion of any of the foregoing, - constitutes infringement of intellectual property or other\\nrights owned or - licensable by you, then any licenses granted to you under this Agreement shall\\nterminate - as of the date such litigation or claim is filed or instituted. You will indemnify - and hold\\nharmless Meta from and against any claim by any third party arising - out of or related to your use or\\ndistribution of the Llama Materials.\\n\\n6. - Term and Termination. The term of this Agreement will commence upon your acceptance - of this\\nAgreement or access to the Llama Materials and will continue in full - force and effect until terminated in\\naccordance with the terms and conditions - herein. Meta may terminate this Agreement if you are in\\nbreach of any term - or condition of this Agreement. Upon termination of this Agreement, you shall - delete\\nand cease use of the Llama Materials. Sections 3, 4 and 7 shall survive - the termination of this\\nAgreement.\\n\\n7. Governing Law and Jurisdiction. - This Agreement will be governed and construed under the laws of\\nthe State - of California without regard to choice of law principles, and the UN Convention - on Contracts\\nfor the International Sale of Goods does not apply to this Agreement. - The courts of California shall have\\nexclusive jurisdiction of any dispute - arising out of this Agreement.\\n\\n# Llama 3.1 Acceptable Use Policy\\n\\nMeta - is committed to promoting safe and fair use of its tools and features, including - Llama 3.1. If you\\naccess or use Llama 3.1, you agree to this Acceptable Use - Policy (\u201CPolicy\u201D). The most recent copy of\\nthis policy can be found - at [https://llama.meta.com/llama3_1/use-policy](https://llama.meta.com/llama3_1/use-policy)\\n\\n## - Prohibited Uses\\n\\nWe want everyone to use Llama 3.1 safely and responsibly. - You agree you will not use, or allow\\nothers to use, Llama 3.1 to:\\n\\n1. - Violate the law or others\u2019 rights, including to:\\n 1. Engage in, promote, - generate, contribute to, encourage, plan, incite, or further illegal or unlawful - activity or content, such as:\\n 1. Violence or terrorism\\n 2. - Exploitation or harm to children, including the solicitation, creation, acquisition, - or dissemination of child exploitative content or failure to report Child Sexual - Abuse Material\\n 3. Human trafficking, exploitation, and sexual violence\\n - \ 4. The illegal distribution of information or materials to minors, including - obscene materials, or failure to employ legally required age-gating in connection - with such information or materials.\\n 5. Sexual solicitation\\n 6. - Any other criminal activity\\n 3. Engage in, promote, incite, or facilitate - the harassment, abuse, threatening, or bullying of individuals or groups of - individuals\\n 4. Engage in, promote, incite, or facilitate discrimination - or other unlawful or harmful conduct in the provision of employment, employment - benefits, credit, housing, other economic benefits, or other essential goods - and services\\n 5. Engage in the unauthorized or unlicensed practice of any - profession including, but not limited to, financial, legal, medical/health, - or related professional practices\\n 6. Collect, process, disclose, generate, - or infer health, demographic, or other sensitive personal or private information - about individuals without rights and consents required by applicable laws\\n - \ 7. Engage in or facilitate any action or generate any content that infringes, - misappropriates, or otherwise violates any third-party rights, including the - outputs or results of any products or services using the Llama Materials\\n - \ 8. Create, generate, or facilitate the creation of malicious code, malware, - computer viruses or do anything else that could disable, overburden, interfere - with or impair the proper working, integrity, operation or appearance of a website - or computer system\\n\\n2. Engage in, promote, incite, facilitate, or assist - in the planning or development of activities that present a risk of death or - bodily harm to individuals, including use of Llama 3.1 related to the following:\\n - \ 1. Military, warfare, nuclear industries or applications, espionage, use - for materials or activities that are subject to the International Traffic Arms - Regulations (ITAR) maintained by the United States Department of State\\n 2. - Guns and illegal weapons (including weapon development)\\n 3. Illegal drugs - and regulated/controlled substances\\n 4. Operation of critical infrastructure, - transportation technologies, or heavy machinery\\n 5. Self-harm or harm to - others, including suicide, cutting, and eating disorders\\n 6. Any content - intended to incite or promote violence, abuse, or any infliction of bodily harm - to an individual\\n\\n3. Intentionally deceive or mislead others, including - use of Llama 3.1 related to the following:\\n 1. Generating, promoting, or - furthering fraud or the creation or promotion of disinformation\\n 2. Generating, - promoting, or furthering defamatory content, including the creation of defamatory - statements, images, or other content\\n 3. Generating, promoting, or further - distributing spam\\n 4. Impersonating another individual without consent, - authorization, or legal right\\n 5. Representing that the use of Llama 3.1 - or outputs are human-generated\\n 6. Generating or facilitating false online - engagement, including fake reviews and other means of fake online engagement\\n\\n4. - Fail to appropriately disclose to end users any known dangers of your AI system\\n\\nPlease - report any violation of this Policy, software \u201Cbug,\u201D or other problems - that could lead to a violation\\nof this Policy through one of the following - means:\\n\\n* Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://github.com/meta-llama/llama-models/issues)\\n* - Reporting risky content generated by the model: developers.facebook.com/llama_output_feedback\\n* - Reporting bugs and security concerns: facebook.com/whitehat/info\\n* Reporting - violations of the Acceptable Use Policy or unlicensed uses of Llama 3.1: LlamaUseReport@meta.com\\n\",\"modelfile\":\"# - Modelfile generated by \\\"ollama show\\\"\\n# To build a new Modelfile based - on this, replace FROM with:\\n# FROM llama3.1:latest\\n\\nFROM /Users/brandonhancock/.ollama/models/blobs/sha256-87048bcd55216712ef14c11c2c303728463207b165bf18440b9b84b07ec00f87\\nTEMPLATE - \\\"\\\"\\\"{{ if .Messages }}\\n{{- if or .System .Tools }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n{{- - if .System }}\\n\\n{{ .System }}\\n{{- end }}\\n{{- if .Tools }}\\n\\nYou are - a helpful assistant with tool calling capabilities. When you receive a tool - call response, use the output to format an answer to the orginal use question.\\n{{- - end }}\\u003c|eot_id|\\u003e\\n{{- end }}\\n{{- range $i, $_ := .Messages }}\\n{{- - $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- if eq .Role \\\"user\\\" - }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- if - and $.Tools $last }}\\n\\nGiven the following functions, please respond with - a JSON for a function call with its proper arguments that best answers the given - prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": - dictionary of argument name and its value}. Do not use variables.\\n\\n{{ $.Tools - }}\\n{{- end }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- - if .ToolCalls }}\\n\\n{{- range .ToolCalls }}{\\\"name\\\": \\\"{{ .Function.Name - }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ - .Content }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- end }}\\n{{- - else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ - .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- end }}\\n{{- end }}\\n{{- else }}\\n{{- if .System }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\n{{ - .System }}\\u003c|eot_id|\\u003e{{ end }}{{ if .Prompt }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n\\n{{ - .Prompt }}\\u003c|eot_id|\\u003e{{ end }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}{{ .Response }}{{ if .Response }}\\u003c|eot_id|\\u003e{{ end }}\\\"\\\"\\\"\\nPARAMETER - stop \\u003c|start_header_id|\\u003e\\nPARAMETER stop \\u003c|end_header_id|\\u003e\\nPARAMETER - stop \\u003c|eot_id|\\u003e\\nLICENSE \\\"LLAMA 3.1 COMMUNITY LICENSE AGREEMENT\\nLlama - 3.1 Version Release Date: July 23, 2024\\n\\n\u201CAgreement\u201D means the - terms and conditions for use, reproduction, distribution and modification of - the\\nLlama Materials set forth herein.\\n\\n\u201CDocumentation\u201D means - the specifications, manuals and documentation accompanying Llama 3.1\\ndistributed - by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D or - \u201Cyou\u201D means you, or your employer or any other person or entity (if - you are entering into\\nthis Agreement on such person or entity\u2019s behalf), - of the age required under applicable laws, rules or\\nregulations to provide - legal consent and that has legal authority to bind your employer or such other\\nperson - or entity if you are entering in this Agreement on their behalf.\\n\\n\u201CLlama - 3.1\u201D means the foundational large language models and software and algorithms, - including\\nmachine-learning model code, trained model weights, inference-enabling - code, training-enabling code,\\nfine-tuning enabling code and other elements - of the foregoing distributed by Meta at\\nhttps://llama.meta.com/llama-downloads.\\n\\n\u201CLlama - Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.1 and Documentation - (and any\\nportion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D - or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in - or, if you are an entity, your\\nprincipal place of business is in the EEA or - Switzerland) and Meta Platforms, Inc. (if you are located\\noutside of the EEA - or Switzerland).\\n\\nBy clicking \u201CI Accept\u201D below or by using or - distributing any portion or element of the Llama Materials,\\nyou agree to be - bound by this Agreement.\\n\\n1. License Rights and Redistribution.\\n\\n a. - Grant of Rights. You are granted a non-exclusive, worldwide, non-transferable - and royalty-free\\nlimited license under Meta\u2019s intellectual property or - other rights owned by Meta embodied in the Llama\\nMaterials to use, reproduce, - distribute, copy, create derivative works of, and make modifications to the\\nLlama - Materials.\\n\\n b. Redistribution and Use.\\n\\n i. If you distribute - or make available the Llama Materials (or any derivative works\\nthereof), or - a product or service (including another AI model) that contains any of them, - you shall (A)\\nprovide a copy of this Agreement with any such Llama Materials; - and (B) prominently display \u201CBuilt with\\nLlama\u201D on a related website, - user interface, blogpost, about page, or product documentation. If you use\\nthe - Llama Materials or any outputs or results of the Llama Materials to create, - train, fine tune, or\\notherwise improve an AI model, which is distributed or - made available, you shall also include \u201CLlama\u201D at\\nthe beginning - of any such AI model name.\\n\\n ii. If you receive Llama Materials, or - any derivative works thereof, from a Licensee as part \\nof an integrated end - user product, then Section 2 of this Agreement will not apply to you.\\n\\n - \ iii. You must retain in all copies of the Llama Materials that you distribute - the following\\nattribution notice within a \u201CNotice\u201D text file distributed - as a part of such copies: \u201CLlama 3.1 is\\nlicensed under the Llama 3.1 - Community License, Copyright \xA9 Meta Platforms, Inc. All Rights\\nReserved.\u201D\\n\\n - \ iv. Your use of the Llama Materials must comply with applicable laws and - regulations\\n(including trade compliance laws and regulations) and adhere to - the Acceptable Use Policy for the Llama\\nMaterials (available at https://llama.meta.com/llama3_1/use-policy), - which is hereby incorporated by\\nreference into this Agreement.\\n\\n2. Additional - Commercial Terms. If, on the Llama 3.1 version release date, the monthly active - users\\nof the products or services made available by or for Licensee, or Licensee\u2019s - affiliates, is greater than 700\\nmillion monthly active users in the preceding - calendar month, you must request a license from Meta,\\nwhich Meta may grant - to you in its sole discretion, and you are not authorized to exercise any of - the\\nrights under this Agreement unless or until Meta otherwise expressly grants - you such rights.\\n\\n3. Disclaimer of Warranty. UNLESS REQUIRED BY APPLICABLE - LAW, THE LLAMA MATERIALS AND ANY\\nOUTPUT AND RESULTS THEREFROM ARE PROVIDED - ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF\\nANY KIND, AND META DISCLAIMS - ALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND IMPLIED,\\nINCLUDING, WITHOUT LIMITATION, - ANY WARRANTIES OF TITLE, NON-INFRINGEMENT,\\nMERCHANTABILITY, OR FITNESS FOR - A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE FOR\\nDETERMINING THE APPROPRIATENESS - OF USING OR REDISTRIBUTING THE LLAMA MATERIALS AND\\nASSUME ANY RISKS ASSOCIATED - WITH YOUR USE OF THE LLAMA MATERIALS AND ANY OUTPUT AND\\nRESULTS.\\n\\n4. Limitation - of Liability. IN NO EVENT WILL META OR ITS AFFILIATES BE LIABLE UNDER ANY THEORY - OF\\nLIABILITY, WHETHER IN CONTRACT, TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR - OTHERWISE, ARISING\\nOUT OF THIS AGREEMENT, FOR ANY LOST PROFITS OR ANY INDIRECT, - SPECIAL, CONSEQUENTIAL,\\nINCIDENTAL, EXEMPLARY OR PUNITIVE DAMAGES, EVEN IF - META OR ITS AFFILIATES HAVE BEEN ADVISED\\nOF THE POSSIBILITY OF ANY OF THE - FOREGOING.\\n\\n5. Intellectual Property.\\n\\n a. No trademark licenses are - granted under this Agreement, and in connection with the Llama\\nMaterials, - neither Meta nor Licensee may use any name or mark owned by or associated with - the other\\nor any of its affiliates, except as required for reasonable and - customary use in describing and\\nredistributing the Llama Materials or as set - forth in this Section 5(a). Meta hereby grants you a license to\\nuse \u201CLlama\u201D - (the \u201CMark\u201D) solely as required to comply with the last sentence of - Section 1.b.i. You will\\ncomply with Meta\u2019s brand guidelines (currently - accessible at\\nhttps://about.meta.com/brand/resources/meta/company-brand/ ). - All goodwill arising out of your use\\nof the Mark will inure to the benefit - of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and derivatives - made by or for Meta, with\\nrespect to any derivative works and modifications - of the Llama Materials that are made by you, as\\nbetween you and Meta, you - are and will be the owner of such derivative works and modifications.\\n\\n - \ c. If you institute litigation or other proceedings against Meta or any entity - (including a\\ncross-claim or counterclaim in a lawsuit) alleging that the Llama - Materials or Llama 3.1 outputs or\\nresults, or any portion of any of the foregoing, - constitutes infringement of intellectual property or other\\nrights owned or - licensable by you, then any licenses granted to you under this Agreement shall\\nterminate - as of the date such litigation or claim is filed or instituted. You will indemnify - and hold\\nharmless Meta from and against any claim by any third party arising - out of or related to your use or\\ndistribution of the Llama Materials.\\n\\n6. - Term and Termination. The term of this Agreement will commence upon your acceptance - of this\\nAgreement or access to the Llama Materials and will continue in full - force and effect until terminated in\\naccordance with the terms and conditions - herein. Meta may terminate this Agreement if you are in\\nbreach of any term - or condition of this Agreement. Upon termination of this Agreement, you shall - delete\\nand cease use of the Llama Materials. Sections 3, 4 and 7 shall survive - the termination of this\\nAgreement.\\n\\n7. Governing Law and Jurisdiction. - This Agreement will be governed and construed under the laws of\\nthe State - of California without regard to choice of law principles, and the UN Convention - on Contracts\\nfor the International Sale of Goods does not apply to this Agreement. - The courts of California shall have\\nexclusive jurisdiction of any dispute - arising out of this Agreement.\\n\\n# Llama 3.1 Acceptable Use Policy\\n\\nMeta - is committed to promoting safe and fair use of its tools and features, including - Llama 3.1. If you\\naccess or use Llama 3.1, you agree to this Acceptable Use - Policy (\u201CPolicy\u201D). The most recent copy of\\nthis policy can be found - at [https://llama.meta.com/llama3_1/use-policy](https://llama.meta.com/llama3_1/use-policy)\\n\\n## - Prohibited Uses\\n\\nWe want everyone to use Llama 3.1 safely and responsibly. - You agree you will not use, or allow\\nothers to use, Llama 3.1 to:\\n\\n1. - Violate the law or others\u2019 rights, including to:\\n 1. Engage in, promote, - generate, contribute to, encourage, plan, incite, or further illegal or unlawful - activity or content, such as:\\n 1. Violence or terrorism\\n 2. - Exploitation or harm to children, including the solicitation, creation, acquisition, - or dissemination of child exploitative content or failure to report Child Sexual - Abuse Material\\n 3. Human trafficking, exploitation, and sexual violence\\n - \ 4. The illegal distribution of information or materials to minors, including - obscene materials, or failure to employ legally required age-gating in connection - with such information or materials.\\n 5. Sexual solicitation\\n 6. - Any other criminal activity\\n 3. Engage in, promote, incite, or facilitate - the harassment, abuse, threatening, or bullying of individuals or groups of - individuals\\n 4. Engage in, promote, incite, or facilitate discrimination - or other unlawful or harmful conduct in the provision of employment, employment - benefits, credit, housing, other economic benefits, or other essential goods - and services\\n 5. Engage in the unauthorized or unlicensed practice of any - profession including, but not limited to, financial, legal, medical/health, - or related professional practices\\n 6. Collect, process, disclose, generate, - or infer health, demographic, or other sensitive personal or private information - about individuals without rights and consents required by applicable laws\\n - \ 7. Engage in or facilitate any action or generate any content that infringes, - misappropriates, or otherwise violates any third-party rights, including the - outputs or results of any products or services using the Llama Materials\\n - \ 8. Create, generate, or facilitate the creation of malicious code, malware, - computer viruses or do anything else that could disable, overburden, interfere - with or impair the proper working, integrity, operation or appearance of a website - or computer system\\n\\n2. Engage in, promote, incite, facilitate, or assist - in the planning or development of activities that present a risk of death or - bodily harm to individuals, including use of Llama 3.1 related to the following:\\n - \ 1. Military, warfare, nuclear industries or applications, espionage, use - for materials or activities that are subject to the International Traffic Arms - Regulations (ITAR) maintained by the United States Department of State\\n 2. - Guns and illegal weapons (including weapon development)\\n 3. Illegal drugs - and regulated/controlled substances\\n 4. Operation of critical infrastructure, - transportation technologies, or heavy machinery\\n 5. Self-harm or harm to - others, including suicide, cutting, and eating disorders\\n 6. Any content - intended to incite or promote violence, abuse, or any infliction of bodily harm - to an individual\\n\\n3. Intentionally deceive or mislead others, including - use of Llama 3.1 related to the following:\\n 1. Generating, promoting, or - furthering fraud or the creation or promotion of disinformation\\n 2. Generating, - promoting, or furthering defamatory content, including the creation of defamatory - statements, images, or other content\\n 3. Generating, promoting, or further - distributing spam\\n 4. Impersonating another individual without consent, - authorization, or legal right\\n 5. Representing that the use of Llama 3.1 - or outputs are human-generated\\n 6. Generating or facilitating false online - engagement, including fake reviews and other means of fake online engagement\\n\\n4. - Fail to appropriately disclose to end users any known dangers of your AI system\\n\\nPlease - report any violation of this Policy, software \u201Cbug,\u201D or other problems - that could lead to a violation\\nof this Policy through one of the following - means:\\n\\n* Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://github.com/meta-llama/llama-models/issues)\\n* - Reporting risky content generated by the model: developers.facebook.com/llama_output_feedback\\n* - Reporting bugs and security concerns: facebook.com/whitehat/info\\n* Reporting - violations of the Acceptable Use Policy or unlicensed uses of Llama 3.1: LlamaUseReport@meta.com\\n\\\"\\n\",\"parameters\":\"stop - \ \\\"\\u003c|start_header_id|\\u003e\\\"\\nstop \\\"\\u003c|end_header_id|\\u003e\\\"\\nstop - \ \\\"\\u003c|eot_id|\\u003e\\\"\",\"template\":\"{{ - if .Messages }}\\n{{- if or .System .Tools }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n{{- - if .System }}\\n\\n{{ .System }}\\n{{- end }}\\n{{- if .Tools }}\\n\\nYou are - a helpful assistant with tool calling capabilities. When you receive a tool - call response, use the output to format an answer to the orginal use question.\\n{{- - end }}\\u003c|eot_id|\\u003e\\n{{- end }}\\n{{- range $i, $_ := .Messages }}\\n{{- - $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- if eq .Role \\\"user\\\" - }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- if - and $.Tools $last }}\\n\\nGiven the following functions, please respond with - a JSON for a function call with its proper arguments that best answers the given - prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": - dictionary of argument name and its value}. Do not use variables.\\n\\n{{ $.Tools - }}\\n{{- end }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- - if .ToolCalls }}\\n\\n{{- range .ToolCalls }}{\\\"name\\\": \\\"{{ .Function.Name - }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ - .Content }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- end }}\\n{{- - else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ - .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- end }}\\n{{- end }}\\n{{- else }}\\n{{- if .System }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\n{{ - .System }}\\u003c|eot_id|\\u003e{{ end }}{{ if .Prompt }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n\\n{{ - .Prompt }}\\u003c|eot_id|\\u003e{{ end }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}{{ .Response }}{{ if .Response }}\\u003c|eot_id|\\u003e{{ end }}\",\"details\":{\"parent_model\":\"\",\"format\":\"gguf\",\"family\":\"llama\",\"families\":[\"llama\"],\"parameter_size\":\"8.0B\",\"quantization_level\":\"Q4_0\"},\"model_info\":{\"general.architecture\":\"llama\",\"general.basename\":\"Meta-Llama-3.1\",\"general.file_type\":2,\"general.finetune\":\"Instruct\",\"general.languages\":[\"en\",\"de\",\"fr\",\"it\",\"pt\",\"hi\",\"es\",\"th\"],\"general.license\":\"llama3.1\",\"general.parameter_count\":8030261248,\"general.quantization_version\":2,\"general.size_label\":\"8B\",\"general.tags\":[\"facebook\",\"meta\",\"pytorch\",\"llama\",\"llama-3\",\"text-generation\"],\"general.type\":\"model\",\"llama.attention.head_count\":32,\"llama.attention.head_count_kv\":8,\"llama.attention.layer_norm_rms_epsilon\":0.00001,\"llama.block_count\":32,\"llama.context_length\":131072,\"llama.embedding_length\":4096,\"llama.feed_forward_length\":14336,\"llama.rope.dimension_count\":128,\"llama.rope.freq_base\":500000,\"llama.vocab_size\":128256,\"tokenizer.ggml.bos_token_id\":128000,\"tokenizer.ggml.eos_token_id\":128009,\"tokenizer.ggml.merges\":null,\"tokenizer.ggml.model\":\"gpt2\",\"tokenizer.ggml.pre\":\"llama-bpe\",\"tokenizer.ggml.token_type\":null,\"tokenizer.ggml.tokens\":null},\"modified_at\":\"2024-08-01T11:38:16.96106256-04:00\"}" - headers: - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 15 Jan 2025 20:47:17 GMT - Transfer-Encoding: - - chunked - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"name": "llama3.1"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '20' - content-type: - - application/json - host: - - localhost:11434 - user-agent: - - litellm/1.57.4 - method: POST - uri: http://localhost:11434/api/show - response: - content: "{\"license\":\"LLAMA 3.1 COMMUNITY LICENSE AGREEMENT\\nLlama 3.1 Version - Release Date: July 23, 2024\\n\\n\u201CAgreement\u201D means the terms and conditions - for use, reproduction, distribution and modification of the\\nLlama Materials - set forth herein.\\n\\n\u201CDocumentation\u201D means the specifications, manuals - and documentation accompanying Llama 3.1\\ndistributed by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D - or \u201Cyou\u201D means you, or your employer or any other person or entity - (if you are entering into\\nthis Agreement on such person or entity\u2019s behalf), - of the age required under applicable laws, rules or\\nregulations to provide - legal consent and that has legal authority to bind your employer or such other\\nperson - or entity if you are entering in this Agreement on their behalf.\\n\\n\u201CLlama - 3.1\u201D means the foundational large language models and software and algorithms, - including\\nmachine-learning model code, trained model weights, inference-enabling - code, training-enabling code,\\nfine-tuning enabling code and other elements - of the foregoing distributed by Meta at\\nhttps://llama.meta.com/llama-downloads.\\n\\n\u201CLlama - Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.1 and Documentation - (and any\\nportion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D - or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in - or, if you are an entity, your\\nprincipal place of business is in the EEA or - Switzerland) and Meta Platforms, Inc. (if you are located\\noutside of the EEA - or Switzerland).\\n\\nBy clicking \u201CI Accept\u201D below or by using or - distributing any portion or element of the Llama Materials,\\nyou agree to be - bound by this Agreement.\\n\\n1. License Rights and Redistribution.\\n\\n a. - Grant of Rights. You are granted a non-exclusive, worldwide, non-transferable - and royalty-free\\nlimited license under Meta\u2019s intellectual property or - other rights owned by Meta embodied in the Llama\\nMaterials to use, reproduce, - distribute, copy, create derivative works of, and make modifications to the\\nLlama - Materials.\\n\\n b. Redistribution and Use.\\n\\n i. If you distribute - or make available the Llama Materials (or any derivative works\\nthereof), or - a product or service (including another AI model) that contains any of them, - you shall (A)\\nprovide a copy of this Agreement with any such Llama Materials; - and (B) prominently display \u201CBuilt with\\nLlama\u201D on a related website, - user interface, blogpost, about page, or product documentation. If you use\\nthe - Llama Materials or any outputs or results of the Llama Materials to create, - train, fine tune, or\\notherwise improve an AI model, which is distributed or - made available, you shall also include \u201CLlama\u201D at\\nthe beginning - of any such AI model name.\\n\\n ii. If you receive Llama Materials, or - any derivative works thereof, from a Licensee as part \\nof an integrated end - user product, then Section 2 of this Agreement will not apply to you.\\n\\n - \ iii. You must retain in all copies of the Llama Materials that you distribute - the following\\nattribution notice within a \u201CNotice\u201D text file distributed - as a part of such copies: \u201CLlama 3.1 is\\nlicensed under the Llama 3.1 - Community License, Copyright \xA9 Meta Platforms, Inc. All Rights\\nReserved.\u201D\\n\\n - \ iv. Your use of the Llama Materials must comply with applicable laws and - regulations\\n(including trade compliance laws and regulations) and adhere to - the Acceptable Use Policy for the Llama\\nMaterials (available at https://llama.meta.com/llama3_1/use-policy), - which is hereby incorporated by\\nreference into this Agreement.\\n\\n2. Additional - Commercial Terms. If, on the Llama 3.1 version release date, the monthly active - users\\nof the products or services made available by or for Licensee, or Licensee\u2019s - affiliates, is greater than 700\\nmillion monthly active users in the preceding - calendar month, you must request a license from Meta,\\nwhich Meta may grant - to you in its sole discretion, and you are not authorized to exercise any of - the\\nrights under this Agreement unless or until Meta otherwise expressly grants - you such rights.\\n\\n3. Disclaimer of Warranty. UNLESS REQUIRED BY APPLICABLE - LAW, THE LLAMA MATERIALS AND ANY\\nOUTPUT AND RESULTS THEREFROM ARE PROVIDED - ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF\\nANY KIND, AND META DISCLAIMS - ALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND IMPLIED,\\nINCLUDING, WITHOUT LIMITATION, - ANY WARRANTIES OF TITLE, NON-INFRINGEMENT,\\nMERCHANTABILITY, OR FITNESS FOR - A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE FOR\\nDETERMINING THE APPROPRIATENESS - OF USING OR REDISTRIBUTING THE LLAMA MATERIALS AND\\nASSUME ANY RISKS ASSOCIATED - WITH YOUR USE OF THE LLAMA MATERIALS AND ANY OUTPUT AND\\nRESULTS.\\n\\n4. Limitation - of Liability. IN NO EVENT WILL META OR ITS AFFILIATES BE LIABLE UNDER ANY THEORY - OF\\nLIABILITY, WHETHER IN CONTRACT, TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR - OTHERWISE, ARISING\\nOUT OF THIS AGREEMENT, FOR ANY LOST PROFITS OR ANY INDIRECT, - SPECIAL, CONSEQUENTIAL,\\nINCIDENTAL, EXEMPLARY OR PUNITIVE DAMAGES, EVEN IF - META OR ITS AFFILIATES HAVE BEEN ADVISED\\nOF THE POSSIBILITY OF ANY OF THE - FOREGOING.\\n\\n5. Intellectual Property.\\n\\n a. No trademark licenses are - granted under this Agreement, and in connection with the Llama\\nMaterials, - neither Meta nor Licensee may use any name or mark owned by or associated with - the other\\nor any of its affiliates, except as required for reasonable and - customary use in describing and\\nredistributing the Llama Materials or as set - forth in this Section 5(a). Meta hereby grants you a license to\\nuse \u201CLlama\u201D - (the \u201CMark\u201D) solely as required to comply with the last sentence of - Section 1.b.i. You will\\ncomply with Meta\u2019s brand guidelines (currently - accessible at\\nhttps://about.meta.com/brand/resources/meta/company-brand/ ). - All goodwill arising out of your use\\nof the Mark will inure to the benefit - of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and derivatives - made by or for Meta, with\\nrespect to any derivative works and modifications - of the Llama Materials that are made by you, as\\nbetween you and Meta, you - are and will be the owner of such derivative works and modifications.\\n\\n - \ c. If you institute litigation or other proceedings against Meta or any entity - (including a\\ncross-claim or counterclaim in a lawsuit) alleging that the Llama - Materials or Llama 3.1 outputs or\\nresults, or any portion of any of the foregoing, - constitutes infringement of intellectual property or other\\nrights owned or - licensable by you, then any licenses granted to you under this Agreement shall\\nterminate - as of the date such litigation or claim is filed or instituted. You will indemnify - and hold\\nharmless Meta from and against any claim by any third party arising - out of or related to your use or\\ndistribution of the Llama Materials.\\n\\n6. - Term and Termination. The term of this Agreement will commence upon your acceptance - of this\\nAgreement or access to the Llama Materials and will continue in full - force and effect until terminated in\\naccordance with the terms and conditions - herein. Meta may terminate this Agreement if you are in\\nbreach of any term - or condition of this Agreement. Upon termination of this Agreement, you shall - delete\\nand cease use of the Llama Materials. Sections 3, 4 and 7 shall survive - the termination of this\\nAgreement.\\n\\n7. Governing Law and Jurisdiction. - This Agreement will be governed and construed under the laws of\\nthe State - of California without regard to choice of law principles, and the UN Convention - on Contracts\\nfor the International Sale of Goods does not apply to this Agreement. - The courts of California shall have\\nexclusive jurisdiction of any dispute - arising out of this Agreement.\\n\\n# Llama 3.1 Acceptable Use Policy\\n\\nMeta - is committed to promoting safe and fair use of its tools and features, including - Llama 3.1. If you\\naccess or use Llama 3.1, you agree to this Acceptable Use - Policy (\u201CPolicy\u201D). The most recent copy of\\nthis policy can be found - at [https://llama.meta.com/llama3_1/use-policy](https://llama.meta.com/llama3_1/use-policy)\\n\\n## - Prohibited Uses\\n\\nWe want everyone to use Llama 3.1 safely and responsibly. - You agree you will not use, or allow\\nothers to use, Llama 3.1 to:\\n\\n1. - Violate the law or others\u2019 rights, including to:\\n 1. Engage in, promote, - generate, contribute to, encourage, plan, incite, or further illegal or unlawful - activity or content, such as:\\n 1. Violence or terrorism\\n 2. - Exploitation or harm to children, including the solicitation, creation, acquisition, - or dissemination of child exploitative content or failure to report Child Sexual - Abuse Material\\n 3. Human trafficking, exploitation, and sexual violence\\n - \ 4. The illegal distribution of information or materials to minors, including - obscene materials, or failure to employ legally required age-gating in connection - with such information or materials.\\n 5. Sexual solicitation\\n 6. - Any other criminal activity\\n 3. Engage in, promote, incite, or facilitate - the harassment, abuse, threatening, or bullying of individuals or groups of - individuals\\n 4. Engage in, promote, incite, or facilitate discrimination - or other unlawful or harmful conduct in the provision of employment, employment - benefits, credit, housing, other economic benefits, or other essential goods - and services\\n 5. Engage in the unauthorized or unlicensed practice of any - profession including, but not limited to, financial, legal, medical/health, - or related professional practices\\n 6. Collect, process, disclose, generate, - or infer health, demographic, or other sensitive personal or private information - about individuals without rights and consents required by applicable laws\\n - \ 7. Engage in or facilitate any action or generate any content that infringes, - misappropriates, or otherwise violates any third-party rights, including the - outputs or results of any products or services using the Llama Materials\\n - \ 8. Create, generate, or facilitate the creation of malicious code, malware, - computer viruses or do anything else that could disable, overburden, interfere - with or impair the proper working, integrity, operation or appearance of a website - or computer system\\n\\n2. Engage in, promote, incite, facilitate, or assist - in the planning or development of activities that present a risk of death or - bodily harm to individuals, including use of Llama 3.1 related to the following:\\n - \ 1. Military, warfare, nuclear industries or applications, espionage, use - for materials or activities that are subject to the International Traffic Arms - Regulations (ITAR) maintained by the United States Department of State\\n 2. - Guns and illegal weapons (including weapon development)\\n 3. Illegal drugs - and regulated/controlled substances\\n 4. Operation of critical infrastructure, - transportation technologies, or heavy machinery\\n 5. Self-harm or harm to - others, including suicide, cutting, and eating disorders\\n 6. Any content - intended to incite or promote violence, abuse, or any infliction of bodily harm - to an individual\\n\\n3. Intentionally deceive or mislead others, including - use of Llama 3.1 related to the following:\\n 1. Generating, promoting, or - furthering fraud or the creation or promotion of disinformation\\n 2. Generating, - promoting, or furthering defamatory content, including the creation of defamatory - statements, images, or other content\\n 3. Generating, promoting, or further - distributing spam\\n 4. Impersonating another individual without consent, - authorization, or legal right\\n 5. Representing that the use of Llama 3.1 - or outputs are human-generated\\n 6. Generating or facilitating false online - engagement, including fake reviews and other means of fake online engagement\\n\\n4. - Fail to appropriately disclose to end users any known dangers of your AI system\\n\\nPlease - report any violation of this Policy, software \u201Cbug,\u201D or other problems - that could lead to a violation\\nof this Policy through one of the following - means:\\n\\n* Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://github.com/meta-llama/llama-models/issues)\\n* - Reporting risky content generated by the model: developers.facebook.com/llama_output_feedback\\n* - Reporting bugs and security concerns: facebook.com/whitehat/info\\n* Reporting - violations of the Acceptable Use Policy or unlicensed uses of Llama 3.1: LlamaUseReport@meta.com\\n\",\"modelfile\":\"# - Modelfile generated by \\\"ollama show\\\"\\n# To build a new Modelfile based - on this, replace FROM with:\\n# FROM llama3.1:latest\\n\\nFROM /Users/brandonhancock/.ollama/models/blobs/sha256-87048bcd55216712ef14c11c2c303728463207b165bf18440b9b84b07ec00f87\\nTEMPLATE - \\\"\\\"\\\"{{ if .Messages }}\\n{{- if or .System .Tools }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n{{- - if .System }}\\n\\n{{ .System }}\\n{{- end }}\\n{{- if .Tools }}\\n\\nYou are - a helpful assistant with tool calling capabilities. When you receive a tool - call response, use the output to format an answer to the orginal use question.\\n{{- - end }}\\u003c|eot_id|\\u003e\\n{{- end }}\\n{{- range $i, $_ := .Messages }}\\n{{- - $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- if eq .Role \\\"user\\\" - }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- if - and $.Tools $last }}\\n\\nGiven the following functions, please respond with - a JSON for a function call with its proper arguments that best answers the given - prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": - dictionary of argument name and its value}. Do not use variables.\\n\\n{{ $.Tools - }}\\n{{- end }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- - if .ToolCalls }}\\n\\n{{- range .ToolCalls }}{\\\"name\\\": \\\"{{ .Function.Name - }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ - .Content }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- end }}\\n{{- - else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ - .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- end }}\\n{{- end }}\\n{{- else }}\\n{{- if .System }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\n{{ - .System }}\\u003c|eot_id|\\u003e{{ end }}{{ if .Prompt }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n\\n{{ - .Prompt }}\\u003c|eot_id|\\u003e{{ end }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}{{ .Response }}{{ if .Response }}\\u003c|eot_id|\\u003e{{ end }}\\\"\\\"\\\"\\nPARAMETER - stop \\u003c|start_header_id|\\u003e\\nPARAMETER stop \\u003c|end_header_id|\\u003e\\nPARAMETER - stop \\u003c|eot_id|\\u003e\\nLICENSE \\\"LLAMA 3.1 COMMUNITY LICENSE AGREEMENT\\nLlama - 3.1 Version Release Date: July 23, 2024\\n\\n\u201CAgreement\u201D means the - terms and conditions for use, reproduction, distribution and modification of - the\\nLlama Materials set forth herein.\\n\\n\u201CDocumentation\u201D means - the specifications, manuals and documentation accompanying Llama 3.1\\ndistributed - by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D or - \u201Cyou\u201D means you, or your employer or any other person or entity (if - you are entering into\\nthis Agreement on such person or entity\u2019s behalf), - of the age required under applicable laws, rules or\\nregulations to provide - legal consent and that has legal authority to bind your employer or such other\\nperson - or entity if you are entering in this Agreement on their behalf.\\n\\n\u201CLlama - 3.1\u201D means the foundational large language models and software and algorithms, - including\\nmachine-learning model code, trained model weights, inference-enabling - code, training-enabling code,\\nfine-tuning enabling code and other elements - of the foregoing distributed by Meta at\\nhttps://llama.meta.com/llama-downloads.\\n\\n\u201CLlama - Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.1 and Documentation - (and any\\nportion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D - or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in - or, if you are an entity, your\\nprincipal place of business is in the EEA or - Switzerland) and Meta Platforms, Inc. (if you are located\\noutside of the EEA - or Switzerland).\\n\\nBy clicking \u201CI Accept\u201D below or by using or - distributing any portion or element of the Llama Materials,\\nyou agree to be - bound by this Agreement.\\n\\n1. License Rights and Redistribution.\\n\\n a. - Grant of Rights. You are granted a non-exclusive, worldwide, non-transferable - and royalty-free\\nlimited license under Meta\u2019s intellectual property or - other rights owned by Meta embodied in the Llama\\nMaterials to use, reproduce, - distribute, copy, create derivative works of, and make modifications to the\\nLlama - Materials.\\n\\n b. Redistribution and Use.\\n\\n i. If you distribute - or make available the Llama Materials (or any derivative works\\nthereof), or - a product or service (including another AI model) that contains any of them, - you shall (A)\\nprovide a copy of this Agreement with any such Llama Materials; - and (B) prominently display \u201CBuilt with\\nLlama\u201D on a related website, - user interface, blogpost, about page, or product documentation. If you use\\nthe - Llama Materials or any outputs or results of the Llama Materials to create, - train, fine tune, or\\notherwise improve an AI model, which is distributed or - made available, you shall also include \u201CLlama\u201D at\\nthe beginning - of any such AI model name.\\n\\n ii. If you receive Llama Materials, or - any derivative works thereof, from a Licensee as part \\nof an integrated end - user product, then Section 2 of this Agreement will not apply to you.\\n\\n - \ iii. You must retain in all copies of the Llama Materials that you distribute - the following\\nattribution notice within a \u201CNotice\u201D text file distributed - as a part of such copies: \u201CLlama 3.1 is\\nlicensed under the Llama 3.1 - Community License, Copyright \xA9 Meta Platforms, Inc. All Rights\\nReserved.\u201D\\n\\n - \ iv. Your use of the Llama Materials must comply with applicable laws and - regulations\\n(including trade compliance laws and regulations) and adhere to - the Acceptable Use Policy for the Llama\\nMaterials (available at https://llama.meta.com/llama3_1/use-policy), - which is hereby incorporated by\\nreference into this Agreement.\\n\\n2. Additional - Commercial Terms. If, on the Llama 3.1 version release date, the monthly active - users\\nof the products or services made available by or for Licensee, or Licensee\u2019s - affiliates, is greater than 700\\nmillion monthly active users in the preceding - calendar month, you must request a license from Meta,\\nwhich Meta may grant - to you in its sole discretion, and you are not authorized to exercise any of - the\\nrights under this Agreement unless or until Meta otherwise expressly grants - you such rights.\\n\\n3. Disclaimer of Warranty. UNLESS REQUIRED BY APPLICABLE - LAW, THE LLAMA MATERIALS AND ANY\\nOUTPUT AND RESULTS THEREFROM ARE PROVIDED - ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF\\nANY KIND, AND META DISCLAIMS - ALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND IMPLIED,\\nINCLUDING, WITHOUT LIMITATION, - ANY WARRANTIES OF TITLE, NON-INFRINGEMENT,\\nMERCHANTABILITY, OR FITNESS FOR - A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE FOR\\nDETERMINING THE APPROPRIATENESS - OF USING OR REDISTRIBUTING THE LLAMA MATERIALS AND\\nASSUME ANY RISKS ASSOCIATED - WITH YOUR USE OF THE LLAMA MATERIALS AND ANY OUTPUT AND\\nRESULTS.\\n\\n4. Limitation - of Liability. IN NO EVENT WILL META OR ITS AFFILIATES BE LIABLE UNDER ANY THEORY - OF\\nLIABILITY, WHETHER IN CONTRACT, TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR - OTHERWISE, ARISING\\nOUT OF THIS AGREEMENT, FOR ANY LOST PROFITS OR ANY INDIRECT, - SPECIAL, CONSEQUENTIAL,\\nINCIDENTAL, EXEMPLARY OR PUNITIVE DAMAGES, EVEN IF - META OR ITS AFFILIATES HAVE BEEN ADVISED\\nOF THE POSSIBILITY OF ANY OF THE - FOREGOING.\\n\\n5. Intellectual Property.\\n\\n a. No trademark licenses are - granted under this Agreement, and in connection with the Llama\\nMaterials, - neither Meta nor Licensee may use any name or mark owned by or associated with - the other\\nor any of its affiliates, except as required for reasonable and - customary use in describing and\\nredistributing the Llama Materials or as set - forth in this Section 5(a). Meta hereby grants you a license to\\nuse \u201CLlama\u201D - (the \u201CMark\u201D) solely as required to comply with the last sentence of - Section 1.b.i. You will\\ncomply with Meta\u2019s brand guidelines (currently - accessible at\\nhttps://about.meta.com/brand/resources/meta/company-brand/ ). - All goodwill arising out of your use\\nof the Mark will inure to the benefit - of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and derivatives - made by or for Meta, with\\nrespect to any derivative works and modifications - of the Llama Materials that are made by you, as\\nbetween you and Meta, you - are and will be the owner of such derivative works and modifications.\\n\\n - \ c. If you institute litigation or other proceedings against Meta or any entity - (including a\\ncross-claim or counterclaim in a lawsuit) alleging that the Llama - Materials or Llama 3.1 outputs or\\nresults, or any portion of any of the foregoing, - constitutes infringement of intellectual property or other\\nrights owned or - licensable by you, then any licenses granted to you under this Agreement shall\\nterminate - as of the date such litigation or claim is filed or instituted. You will indemnify - and hold\\nharmless Meta from and against any claim by any third party arising - out of or related to your use or\\ndistribution of the Llama Materials.\\n\\n6. - Term and Termination. The term of this Agreement will commence upon your acceptance - of this\\nAgreement or access to the Llama Materials and will continue in full - force and effect until terminated in\\naccordance with the terms and conditions - herein. Meta may terminate this Agreement if you are in\\nbreach of any term - or condition of this Agreement. Upon termination of this Agreement, you shall - delete\\nand cease use of the Llama Materials. Sections 3, 4 and 7 shall survive - the termination of this\\nAgreement.\\n\\n7. Governing Law and Jurisdiction. - This Agreement will be governed and construed under the laws of\\nthe State - of California without regard to choice of law principles, and the UN Convention - on Contracts\\nfor the International Sale of Goods does not apply to this Agreement. - The courts of California shall have\\nexclusive jurisdiction of any dispute - arising out of this Agreement.\\n\\n# Llama 3.1 Acceptable Use Policy\\n\\nMeta - is committed to promoting safe and fair use of its tools and features, including - Llama 3.1. If you\\naccess or use Llama 3.1, you agree to this Acceptable Use - Policy (\u201CPolicy\u201D). The most recent copy of\\nthis policy can be found - at [https://llama.meta.com/llama3_1/use-policy](https://llama.meta.com/llama3_1/use-policy)\\n\\n## - Prohibited Uses\\n\\nWe want everyone to use Llama 3.1 safely and responsibly. - You agree you will not use, or allow\\nothers to use, Llama 3.1 to:\\n\\n1. - Violate the law or others\u2019 rights, including to:\\n 1. Engage in, promote, - generate, contribute to, encourage, plan, incite, or further illegal or unlawful - activity or content, such as:\\n 1. Violence or terrorism\\n 2. - Exploitation or harm to children, including the solicitation, creation, acquisition, - or dissemination of child exploitative content or failure to report Child Sexual - Abuse Material\\n 3. Human trafficking, exploitation, and sexual violence\\n - \ 4. The illegal distribution of information or materials to minors, including - obscene materials, or failure to employ legally required age-gating in connection - with such information or materials.\\n 5. Sexual solicitation\\n 6. - Any other criminal activity\\n 3. Engage in, promote, incite, or facilitate - the harassment, abuse, threatening, or bullying of individuals or groups of - individuals\\n 4. Engage in, promote, incite, or facilitate discrimination - or other unlawful or harmful conduct in the provision of employment, employment - benefits, credit, housing, other economic benefits, or other essential goods - and services\\n 5. Engage in the unauthorized or unlicensed practice of any - profession including, but not limited to, financial, legal, medical/health, - or related professional practices\\n 6. Collect, process, disclose, generate, - or infer health, demographic, or other sensitive personal or private information - about individuals without rights and consents required by applicable laws\\n - \ 7. Engage in or facilitate any action or generate any content that infringes, - misappropriates, or otherwise violates any third-party rights, including the - outputs or results of any products or services using the Llama Materials\\n - \ 8. Create, generate, or facilitate the creation of malicious code, malware, - computer viruses or do anything else that could disable, overburden, interfere - with or impair the proper working, integrity, operation or appearance of a website - or computer system\\n\\n2. Engage in, promote, incite, facilitate, or assist - in the planning or development of activities that present a risk of death or - bodily harm to individuals, including use of Llama 3.1 related to the following:\\n - \ 1. Military, warfare, nuclear industries or applications, espionage, use - for materials or activities that are subject to the International Traffic Arms - Regulations (ITAR) maintained by the United States Department of State\\n 2. - Guns and illegal weapons (including weapon development)\\n 3. Illegal drugs - and regulated/controlled substances\\n 4. Operation of critical infrastructure, - transportation technologies, or heavy machinery\\n 5. Self-harm or harm to - others, including suicide, cutting, and eating disorders\\n 6. Any content - intended to incite or promote violence, abuse, or any infliction of bodily harm - to an individual\\n\\n3. Intentionally deceive or mislead others, including - use of Llama 3.1 related to the following:\\n 1. Generating, promoting, or - furthering fraud or the creation or promotion of disinformation\\n 2. Generating, - promoting, or furthering defamatory content, including the creation of defamatory - statements, images, or other content\\n 3. Generating, promoting, or further - distributing spam\\n 4. Impersonating another individual without consent, - authorization, or legal right\\n 5. Representing that the use of Llama 3.1 - or outputs are human-generated\\n 6. Generating or facilitating false online - engagement, including fake reviews and other means of fake online engagement\\n\\n4. - Fail to appropriately disclose to end users any known dangers of your AI system\\n\\nPlease - report any violation of this Policy, software \u201Cbug,\u201D or other problems - that could lead to a violation\\nof this Policy through one of the following - means:\\n\\n* Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://github.com/meta-llama/llama-models/issues)\\n* - Reporting risky content generated by the model: developers.facebook.com/llama_output_feedback\\n* - Reporting bugs and security concerns: facebook.com/whitehat/info\\n* Reporting - violations of the Acceptable Use Policy or unlicensed uses of Llama 3.1: LlamaUseReport@meta.com\\n\\\"\\n\",\"parameters\":\"stop - \ \\\"\\u003c|start_header_id|\\u003e\\\"\\nstop \\\"\\u003c|end_header_id|\\u003e\\\"\\nstop - \ \\\"\\u003c|eot_id|\\u003e\\\"\",\"template\":\"{{ - if .Messages }}\\n{{- if or .System .Tools }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n{{- - if .System }}\\n\\n{{ .System }}\\n{{- end }}\\n{{- if .Tools }}\\n\\nYou are - a helpful assistant with tool calling capabilities. When you receive a tool - call response, use the output to format an answer to the orginal use question.\\n{{- - end }}\\u003c|eot_id|\\u003e\\n{{- end }}\\n{{- range $i, $_ := .Messages }}\\n{{- - $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- if eq .Role \\\"user\\\" - }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- if - and $.Tools $last }}\\n\\nGiven the following functions, please respond with - a JSON for a function call with its proper arguments that best answers the given - prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": - dictionary of argument name and its value}. Do not use variables.\\n\\n{{ $.Tools - }}\\n{{- end }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- - if .ToolCalls }}\\n\\n{{- range .ToolCalls }}{\\\"name\\\": \\\"{{ .Function.Name - }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ - .Content }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- end }}\\n{{- - else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ - .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- end }}\\n{{- end }}\\n{{- else }}\\n{{- if .System }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\n{{ - .System }}\\u003c|eot_id|\\u003e{{ end }}{{ if .Prompt }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n\\n{{ - .Prompt }}\\u003c|eot_id|\\u003e{{ end }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}{{ .Response }}{{ if .Response }}\\u003c|eot_id|\\u003e{{ end }}\",\"details\":{\"parent_model\":\"\",\"format\":\"gguf\",\"family\":\"llama\",\"families\":[\"llama\"],\"parameter_size\":\"8.0B\",\"quantization_level\":\"Q4_0\"},\"model_info\":{\"general.architecture\":\"llama\",\"general.basename\":\"Meta-Llama-3.1\",\"general.file_type\":2,\"general.finetune\":\"Instruct\",\"general.languages\":[\"en\",\"de\",\"fr\",\"it\",\"pt\",\"hi\",\"es\",\"th\"],\"general.license\":\"llama3.1\",\"general.parameter_count\":8030261248,\"general.quantization_version\":2,\"general.size_label\":\"8B\",\"general.tags\":[\"facebook\",\"meta\",\"pytorch\",\"llama\",\"llama-3\",\"text-generation\"],\"general.type\":\"model\",\"llama.attention.head_count\":32,\"llama.attention.head_count_kv\":8,\"llama.attention.layer_norm_rms_epsilon\":0.00001,\"llama.block_count\":32,\"llama.context_length\":131072,\"llama.embedding_length\":4096,\"llama.feed_forward_length\":14336,\"llama.rope.dimension_count\":128,\"llama.rope.freq_base\":500000,\"llama.vocab_size\":128256,\"tokenizer.ggml.bos_token_id\":128000,\"tokenizer.ggml.eos_token_id\":128009,\"tokenizer.ggml.merges\":null,\"tokenizer.ggml.model\":\"gpt2\",\"tokenizer.ggml.pre\":\"llama-bpe\",\"tokenizer.ggml.token_type\":null,\"tokenizer.ggml.tokens\":null},\"modified_at\":\"2024-08-01T11:38:16.96106256-04:00\"}" - headers: - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 15 Jan 2025 20:47:17 GMT - Transfer-Encoding: - - chunked - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"model": "llama3.1", "prompt": "### User:\nName: Alice Llama, Age: 30\n\n### - Assistant:\nTool Calls: [\n {\n \"id\": \"call_5487de90-385d-48f4-843c-04b9dc635b23\",\n \"type\": - \"function\",\n \"function\": {\n \"name\": \"SimpleModel\",\n \"arguments\": - {\n \"age\": \"30\",\n \"name\": \"Alice Llama\"\n }\n }\n }\n]\n\n### - User:\nValidation Error found:\n1 validation error for SimpleModel\nage\n Input - should be a valid integer [type=int_type, input_value=''30'', input_type=str]\n For - further information visit https://errors.pydantic.dev/2.10/v/int_type\nRecall - the function correctly, fix the errors\n\n### System:\nProduce JSON OUTPUT ONLY! - Adhere to this format {\"name\": \"function_name\", \"arguments\":{\"argument_name\": - \"argument_value\"}} The following functions are available to you:\n{''type'': - ''function'', ''function'': {''name'': ''SimpleModel'', ''description'': ''Correctly - extracted `SimpleModel` with all the required parameters with correct types'', - ''parameters'': {''properties'': {''name'': {''title'': ''Name'', ''type'': - ''string''}, ''age'': {''title'': ''Age'', ''type'': ''integer''}}, ''required'': - [''age'', ''name''], ''type'': ''object''}}}\n\n\n", "options": {}, "stream": - false, "format": "json"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '1235' - host: - - localhost:11434 - user-agent: - - litellm/1.57.4 - method: POST - uri: http://localhost:11434/api/generate - response: - content: '{"model":"llama3.1","created_at":"2025-01-15T20:47:19.399083Z","response":"{\"name\": - \"SimpleModel\", \"arguments\":{\"name\": \"Alice Llama\", \"age\": 30}}","done":true,"done_reason":"stop","context":[128006,882,128007,271,14711,2724,512,678,25,30505,445,81101,11,13381,25,220,966,271,14711,22103,512,7896,41227,25,2330,220,341,262,330,307,794,330,6797,62,22287,22,451,1954,12,18695,67,12,2166,69,19,12,23996,66,12,2371,65,24,7783,22276,65,1419,761,262,330,1337,794,330,1723,761,262,330,1723,794,341,415,330,609,794,330,16778,1747,761,415,330,16774,794,341,286,330,425,794,330,966,761,286,330,609,794,330,62786,445,81101,702,415,457,262,457,220,457,2595,14711,2724,512,14118,4703,1766,512,16,10741,1493,369,9170,1747,198,425,198,220,5688,1288,387,264,2764,7698,510,1337,16972,1857,11,1988,3220,1151,966,518,1988,1857,16311,933,262,1789,4726,2038,4034,3788,1129,7805,7345,67,8322,22247,14,17,13,605,5574,32214,1857,198,3905,543,279,734,12722,11,5155,279,6103,271,14711,744,512,1360,13677,4823,32090,27785,0,2467,6881,311,420,3645,5324,609,794,330,1723,1292,498,330,16774,23118,14819,1292,794,330,14819,3220,32075,578,2768,5865,527,2561,311,499,512,13922,1337,1232,364,1723,518,364,1723,1232,5473,609,1232,364,16778,1747,518,364,4789,1232,364,34192,398,28532,1595,16778,1747,63,449,682,279,2631,5137,449,4495,4595,518,364,14105,1232,5473,13495,1232,5473,609,1232,5473,2150,1232,364,678,518,364,1337,1232,364,928,25762,364,425,1232,5473,2150,1232,364,17166,518,364,1337,1232,364,11924,8439,2186,364,6413,1232,2570,425,518,364,609,4181,364,1337,1232,364,1735,23742,3818,128009,128006,78191,128007,271,5018,609,794,330,16778,1747,498,330,16774,23118,609,794,330,62786,445,81101,498,330,425,794,220,966,3500],"total_duration":1822667750,"load_duration":14204166,"prompt_eval_count":306,"prompt_eval_duration":1057000000,"eval_count":24,"eval_duration":749000000}' - headers: - Content-Length: - - '1859' - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 15 Jan 2025 20:47:19 GMT - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"name": "llama3.1"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '20' - content-type: - - application/json - host: - - localhost:11434 - user-agent: - - litellm/1.57.4 - method: POST - uri: http://localhost:11434/api/show - response: - content: "{\"license\":\"LLAMA 3.1 COMMUNITY LICENSE AGREEMENT\\nLlama 3.1 Version - Release Date: July 23, 2024\\n\\n\u201CAgreement\u201D means the terms and conditions - for use, reproduction, distribution and modification of the\\nLlama Materials - set forth herein.\\n\\n\u201CDocumentation\u201D means the specifications, manuals - and documentation accompanying Llama 3.1\\ndistributed by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D - or \u201Cyou\u201D means you, or your employer or any other person or entity - (if you are entering into\\nthis Agreement on such person or entity\u2019s behalf), - of the age required under applicable laws, rules or\\nregulations to provide - legal consent and that has legal authority to bind your employer or such other\\nperson - or entity if you are entering in this Agreement on their behalf.\\n\\n\u201CLlama - 3.1\u201D means the foundational large language models and software and algorithms, - including\\nmachine-learning model code, trained model weights, inference-enabling - code, training-enabling code,\\nfine-tuning enabling code and other elements - of the foregoing distributed by Meta at\\nhttps://llama.meta.com/llama-downloads.\\n\\n\u201CLlama - Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.1 and Documentation - (and any\\nportion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D - or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in - or, if you are an entity, your\\nprincipal place of business is in the EEA or - Switzerland) and Meta Platforms, Inc. (if you are located\\noutside of the EEA - or Switzerland).\\n\\nBy clicking \u201CI Accept\u201D below or by using or - distributing any portion or element of the Llama Materials,\\nyou agree to be - bound by this Agreement.\\n\\n1. License Rights and Redistribution.\\n\\n a. - Grant of Rights. You are granted a non-exclusive, worldwide, non-transferable - and royalty-free\\nlimited license under Meta\u2019s intellectual property or - other rights owned by Meta embodied in the Llama\\nMaterials to use, reproduce, - distribute, copy, create derivative works of, and make modifications to the\\nLlama - Materials.\\n\\n b. Redistribution and Use.\\n\\n i. If you distribute - or make available the Llama Materials (or any derivative works\\nthereof), or - a product or service (including another AI model) that contains any of them, - you shall (A)\\nprovide a copy of this Agreement with any such Llama Materials; - and (B) prominently display \u201CBuilt with\\nLlama\u201D on a related website, - user interface, blogpost, about page, or product documentation. If you use\\nthe - Llama Materials or any outputs or results of the Llama Materials to create, - train, fine tune, or\\notherwise improve an AI model, which is distributed or - made available, you shall also include \u201CLlama\u201D at\\nthe beginning - of any such AI model name.\\n\\n ii. If you receive Llama Materials, or - any derivative works thereof, from a Licensee as part \\nof an integrated end - user product, then Section 2 of this Agreement will not apply to you.\\n\\n - \ iii. You must retain in all copies of the Llama Materials that you distribute - the following\\nattribution notice within a \u201CNotice\u201D text file distributed - as a part of such copies: \u201CLlama 3.1 is\\nlicensed under the Llama 3.1 - Community License, Copyright \xA9 Meta Platforms, Inc. All Rights\\nReserved.\u201D\\n\\n - \ iv. Your use of the Llama Materials must comply with applicable laws and - regulations\\n(including trade compliance laws and regulations) and adhere to - the Acceptable Use Policy for the Llama\\nMaterials (available at https://llama.meta.com/llama3_1/use-policy), - which is hereby incorporated by\\nreference into this Agreement.\\n\\n2. Additional - Commercial Terms. If, on the Llama 3.1 version release date, the monthly active - users\\nof the products or services made available by or for Licensee, or Licensee\u2019s - affiliates, is greater than 700\\nmillion monthly active users in the preceding - calendar month, you must request a license from Meta,\\nwhich Meta may grant - to you in its sole discretion, and you are not authorized to exercise any of - the\\nrights under this Agreement unless or until Meta otherwise expressly grants - you such rights.\\n\\n3. Disclaimer of Warranty. UNLESS REQUIRED BY APPLICABLE - LAW, THE LLAMA MATERIALS AND ANY\\nOUTPUT AND RESULTS THEREFROM ARE PROVIDED - ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF\\nANY KIND, AND META DISCLAIMS - ALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND IMPLIED,\\nINCLUDING, WITHOUT LIMITATION, - ANY WARRANTIES OF TITLE, NON-INFRINGEMENT,\\nMERCHANTABILITY, OR FITNESS FOR - A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE FOR\\nDETERMINING THE APPROPRIATENESS - OF USING OR REDISTRIBUTING THE LLAMA MATERIALS AND\\nASSUME ANY RISKS ASSOCIATED - WITH YOUR USE OF THE LLAMA MATERIALS AND ANY OUTPUT AND\\nRESULTS.\\n\\n4. Limitation - of Liability. IN NO EVENT WILL META OR ITS AFFILIATES BE LIABLE UNDER ANY THEORY - OF\\nLIABILITY, WHETHER IN CONTRACT, TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR - OTHERWISE, ARISING\\nOUT OF THIS AGREEMENT, FOR ANY LOST PROFITS OR ANY INDIRECT, - SPECIAL, CONSEQUENTIAL,\\nINCIDENTAL, EXEMPLARY OR PUNITIVE DAMAGES, EVEN IF - META OR ITS AFFILIATES HAVE BEEN ADVISED\\nOF THE POSSIBILITY OF ANY OF THE - FOREGOING.\\n\\n5. Intellectual Property.\\n\\n a. No trademark licenses are - granted under this Agreement, and in connection with the Llama\\nMaterials, - neither Meta nor Licensee may use any name or mark owned by or associated with - the other\\nor any of its affiliates, except as required for reasonable and - customary use in describing and\\nredistributing the Llama Materials or as set - forth in this Section 5(a). Meta hereby grants you a license to\\nuse \u201CLlama\u201D - (the \u201CMark\u201D) solely as required to comply with the last sentence of - Section 1.b.i. You will\\ncomply with Meta\u2019s brand guidelines (currently - accessible at\\nhttps://about.meta.com/brand/resources/meta/company-brand/ ). - All goodwill arising out of your use\\nof the Mark will inure to the benefit - of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and derivatives - made by or for Meta, with\\nrespect to any derivative works and modifications - of the Llama Materials that are made by you, as\\nbetween you and Meta, you - are and will be the owner of such derivative works and modifications.\\n\\n - \ c. If you institute litigation or other proceedings against Meta or any entity - (including a\\ncross-claim or counterclaim in a lawsuit) alleging that the Llama - Materials or Llama 3.1 outputs or\\nresults, or any portion of any of the foregoing, - constitutes infringement of intellectual property or other\\nrights owned or - licensable by you, then any licenses granted to you under this Agreement shall\\nterminate - as of the date such litigation or claim is filed or instituted. You will indemnify - and hold\\nharmless Meta from and against any claim by any third party arising - out of or related to your use or\\ndistribution of the Llama Materials.\\n\\n6. - Term and Termination. The term of this Agreement will commence upon your acceptance - of this\\nAgreement or access to the Llama Materials and will continue in full - force and effect until terminated in\\naccordance with the terms and conditions - herein. Meta may terminate this Agreement if you are in\\nbreach of any term - or condition of this Agreement. Upon termination of this Agreement, you shall - delete\\nand cease use of the Llama Materials. Sections 3, 4 and 7 shall survive - the termination of this\\nAgreement.\\n\\n7. Governing Law and Jurisdiction. - This Agreement will be governed and construed under the laws of\\nthe State - of California without regard to choice of law principles, and the UN Convention - on Contracts\\nfor the International Sale of Goods does not apply to this Agreement. - The courts of California shall have\\nexclusive jurisdiction of any dispute - arising out of this Agreement.\\n\\n# Llama 3.1 Acceptable Use Policy\\n\\nMeta - is committed to promoting safe and fair use of its tools and features, including - Llama 3.1. If you\\naccess or use Llama 3.1, you agree to this Acceptable Use - Policy (\u201CPolicy\u201D). The most recent copy of\\nthis policy can be found - at [https://llama.meta.com/llama3_1/use-policy](https://llama.meta.com/llama3_1/use-policy)\\n\\n## - Prohibited Uses\\n\\nWe want everyone to use Llama 3.1 safely and responsibly. - You agree you will not use, or allow\\nothers to use, Llama 3.1 to:\\n\\n1. - Violate the law or others\u2019 rights, including to:\\n 1. Engage in, promote, - generate, contribute to, encourage, plan, incite, or further illegal or unlawful - activity or content, such as:\\n 1. Violence or terrorism\\n 2. - Exploitation or harm to children, including the solicitation, creation, acquisition, - or dissemination of child exploitative content or failure to report Child Sexual - Abuse Material\\n 3. Human trafficking, exploitation, and sexual violence\\n - \ 4. The illegal distribution of information or materials to minors, including - obscene materials, or failure to employ legally required age-gating in connection - with such information or materials.\\n 5. Sexual solicitation\\n 6. - Any other criminal activity\\n 3. Engage in, promote, incite, or facilitate - the harassment, abuse, threatening, or bullying of individuals or groups of - individuals\\n 4. Engage in, promote, incite, or facilitate discrimination - or other unlawful or harmful conduct in the provision of employment, employment - benefits, credit, housing, other economic benefits, or other essential goods - and services\\n 5. Engage in the unauthorized or unlicensed practice of any - profession including, but not limited to, financial, legal, medical/health, - or related professional practices\\n 6. Collect, process, disclose, generate, - or infer health, demographic, or other sensitive personal or private information - about individuals without rights and consents required by applicable laws\\n - \ 7. Engage in or facilitate any action or generate any content that infringes, - misappropriates, or otherwise violates any third-party rights, including the - outputs or results of any products or services using the Llama Materials\\n - \ 8. Create, generate, or facilitate the creation of malicious code, malware, - computer viruses or do anything else that could disable, overburden, interfere - with or impair the proper working, integrity, operation or appearance of a website - or computer system\\n\\n2. Engage in, promote, incite, facilitate, or assist - in the planning or development of activities that present a risk of death or - bodily harm to individuals, including use of Llama 3.1 related to the following:\\n - \ 1. Military, warfare, nuclear industries or applications, espionage, use - for materials or activities that are subject to the International Traffic Arms - Regulations (ITAR) maintained by the United States Department of State\\n 2. - Guns and illegal weapons (including weapon development)\\n 3. Illegal drugs - and regulated/controlled substances\\n 4. Operation of critical infrastructure, - transportation technologies, or heavy machinery\\n 5. Self-harm or harm to - others, including suicide, cutting, and eating disorders\\n 6. Any content - intended to incite or promote violence, abuse, or any infliction of bodily harm - to an individual\\n\\n3. Intentionally deceive or mislead others, including - use of Llama 3.1 related to the following:\\n 1. Generating, promoting, or - furthering fraud or the creation or promotion of disinformation\\n 2. Generating, - promoting, or furthering defamatory content, including the creation of defamatory - statements, images, or other content\\n 3. Generating, promoting, or further - distributing spam\\n 4. Impersonating another individual without consent, - authorization, or legal right\\n 5. Representing that the use of Llama 3.1 - or outputs are human-generated\\n 6. Generating or facilitating false online - engagement, including fake reviews and other means of fake online engagement\\n\\n4. - Fail to appropriately disclose to end users any known dangers of your AI system\\n\\nPlease - report any violation of this Policy, software \u201Cbug,\u201D or other problems - that could lead to a violation\\nof this Policy through one of the following - means:\\n\\n* Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://github.com/meta-llama/llama-models/issues)\\n* - Reporting risky content generated by the model: developers.facebook.com/llama_output_feedback\\n* - Reporting bugs and security concerns: facebook.com/whitehat/info\\n* Reporting - violations of the Acceptable Use Policy or unlicensed uses of Llama 3.1: LlamaUseReport@meta.com\\n\",\"modelfile\":\"# - Modelfile generated by \\\"ollama show\\\"\\n# To build a new Modelfile based - on this, replace FROM with:\\n# FROM llama3.1:latest\\n\\nFROM /Users/brandonhancock/.ollama/models/blobs/sha256-87048bcd55216712ef14c11c2c303728463207b165bf18440b9b84b07ec00f87\\nTEMPLATE - \\\"\\\"\\\"{{ if .Messages }}\\n{{- if or .System .Tools }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n{{- - if .System }}\\n\\n{{ .System }}\\n{{- end }}\\n{{- if .Tools }}\\n\\nYou are - a helpful assistant with tool calling capabilities. When you receive a tool - call response, use the output to format an answer to the orginal use question.\\n{{- - end }}\\u003c|eot_id|\\u003e\\n{{- end }}\\n{{- range $i, $_ := .Messages }}\\n{{- - $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- if eq .Role \\\"user\\\" - }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- if - and $.Tools $last }}\\n\\nGiven the following functions, please respond with - a JSON for a function call with its proper arguments that best answers the given - prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": - dictionary of argument name and its value}. Do not use variables.\\n\\n{{ $.Tools - }}\\n{{- end }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- - if .ToolCalls }}\\n\\n{{- range .ToolCalls }}{\\\"name\\\": \\\"{{ .Function.Name - }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ - .Content }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- end }}\\n{{- - else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ - .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- end }}\\n{{- end }}\\n{{- else }}\\n{{- if .System }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\n{{ - .System }}\\u003c|eot_id|\\u003e{{ end }}{{ if .Prompt }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n\\n{{ - .Prompt }}\\u003c|eot_id|\\u003e{{ end }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}{{ .Response }}{{ if .Response }}\\u003c|eot_id|\\u003e{{ end }}\\\"\\\"\\\"\\nPARAMETER - stop \\u003c|start_header_id|\\u003e\\nPARAMETER stop \\u003c|end_header_id|\\u003e\\nPARAMETER - stop \\u003c|eot_id|\\u003e\\nLICENSE \\\"LLAMA 3.1 COMMUNITY LICENSE AGREEMENT\\nLlama - 3.1 Version Release Date: July 23, 2024\\n\\n\u201CAgreement\u201D means the - terms and conditions for use, reproduction, distribution and modification of - the\\nLlama Materials set forth herein.\\n\\n\u201CDocumentation\u201D means - the specifications, manuals and documentation accompanying Llama 3.1\\ndistributed - by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D or - \u201Cyou\u201D means you, or your employer or any other person or entity (if - you are entering into\\nthis Agreement on such person or entity\u2019s behalf), - of the age required under applicable laws, rules or\\nregulations to provide - legal consent and that has legal authority to bind your employer or such other\\nperson - or entity if you are entering in this Agreement on their behalf.\\n\\n\u201CLlama - 3.1\u201D means the foundational large language models and software and algorithms, - including\\nmachine-learning model code, trained model weights, inference-enabling - code, training-enabling code,\\nfine-tuning enabling code and other elements - of the foregoing distributed by Meta at\\nhttps://llama.meta.com/llama-downloads.\\n\\n\u201CLlama - Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.1 and Documentation - (and any\\nportion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D - or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in - or, if you are an entity, your\\nprincipal place of business is in the EEA or - Switzerland) and Meta Platforms, Inc. (if you are located\\noutside of the EEA - or Switzerland).\\n\\nBy clicking \u201CI Accept\u201D below or by using or - distributing any portion or element of the Llama Materials,\\nyou agree to be - bound by this Agreement.\\n\\n1. License Rights and Redistribution.\\n\\n a. - Grant of Rights. You are granted a non-exclusive, worldwide, non-transferable - and royalty-free\\nlimited license under Meta\u2019s intellectual property or - other rights owned by Meta embodied in the Llama\\nMaterials to use, reproduce, - distribute, copy, create derivative works of, and make modifications to the\\nLlama - Materials.\\n\\n b. Redistribution and Use.\\n\\n i. If you distribute - or make available the Llama Materials (or any derivative works\\nthereof), or - a product or service (including another AI model) that contains any of them, - you shall (A)\\nprovide a copy of this Agreement with any such Llama Materials; - and (B) prominently display \u201CBuilt with\\nLlama\u201D on a related website, - user interface, blogpost, about page, or product documentation. If you use\\nthe - Llama Materials or any outputs or results of the Llama Materials to create, - train, fine tune, or\\notherwise improve an AI model, which is distributed or - made available, you shall also include \u201CLlama\u201D at\\nthe beginning - of any such AI model name.\\n\\n ii. If you receive Llama Materials, or - any derivative works thereof, from a Licensee as part \\nof an integrated end - user product, then Section 2 of this Agreement will not apply to you.\\n\\n - \ iii. You must retain in all copies of the Llama Materials that you distribute - the following\\nattribution notice within a \u201CNotice\u201D text file distributed - as a part of such copies: \u201CLlama 3.1 is\\nlicensed under the Llama 3.1 - Community License, Copyright \xA9 Meta Platforms, Inc. All Rights\\nReserved.\u201D\\n\\n - \ iv. Your use of the Llama Materials must comply with applicable laws and - regulations\\n(including trade compliance laws and regulations) and adhere to - the Acceptable Use Policy for the Llama\\nMaterials (available at https://llama.meta.com/llama3_1/use-policy), - which is hereby incorporated by\\nreference into this Agreement.\\n\\n2. Additional - Commercial Terms. If, on the Llama 3.1 version release date, the monthly active - users\\nof the products or services made available by or for Licensee, or Licensee\u2019s - affiliates, is greater than 700\\nmillion monthly active users in the preceding - calendar month, you must request a license from Meta,\\nwhich Meta may grant - to you in its sole discretion, and you are not authorized to exercise any of - the\\nrights under this Agreement unless or until Meta otherwise expressly grants - you such rights.\\n\\n3. Disclaimer of Warranty. UNLESS REQUIRED BY APPLICABLE - LAW, THE LLAMA MATERIALS AND ANY\\nOUTPUT AND RESULTS THEREFROM ARE PROVIDED - ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF\\nANY KIND, AND META DISCLAIMS - ALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND IMPLIED,\\nINCLUDING, WITHOUT LIMITATION, - ANY WARRANTIES OF TITLE, NON-INFRINGEMENT,\\nMERCHANTABILITY, OR FITNESS FOR - A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE FOR\\nDETERMINING THE APPROPRIATENESS - OF USING OR REDISTRIBUTING THE LLAMA MATERIALS AND\\nASSUME ANY RISKS ASSOCIATED - WITH YOUR USE OF THE LLAMA MATERIALS AND ANY OUTPUT AND\\nRESULTS.\\n\\n4. Limitation - of Liability. IN NO EVENT WILL META OR ITS AFFILIATES BE LIABLE UNDER ANY THEORY - OF\\nLIABILITY, WHETHER IN CONTRACT, TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR - OTHERWISE, ARISING\\nOUT OF THIS AGREEMENT, FOR ANY LOST PROFITS OR ANY INDIRECT, - SPECIAL, CONSEQUENTIAL,\\nINCIDENTAL, EXEMPLARY OR PUNITIVE DAMAGES, EVEN IF - META OR ITS AFFILIATES HAVE BEEN ADVISED\\nOF THE POSSIBILITY OF ANY OF THE - FOREGOING.\\n\\n5. Intellectual Property.\\n\\n a. No trademark licenses are - granted under this Agreement, and in connection with the Llama\\nMaterials, - neither Meta nor Licensee may use any name or mark owned by or associated with - the other\\nor any of its affiliates, except as required for reasonable and - customary use in describing and\\nredistributing the Llama Materials or as set - forth in this Section 5(a). Meta hereby grants you a license to\\nuse \u201CLlama\u201D - (the \u201CMark\u201D) solely as required to comply with the last sentence of - Section 1.b.i. You will\\ncomply with Meta\u2019s brand guidelines (currently - accessible at\\nhttps://about.meta.com/brand/resources/meta/company-brand/ ). - All goodwill arising out of your use\\nof the Mark will inure to the benefit - of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and derivatives - made by or for Meta, with\\nrespect to any derivative works and modifications - of the Llama Materials that are made by you, as\\nbetween you and Meta, you - are and will be the owner of such derivative works and modifications.\\n\\n - \ c. If you institute litigation or other proceedings against Meta or any entity - (including a\\ncross-claim or counterclaim in a lawsuit) alleging that the Llama - Materials or Llama 3.1 outputs or\\nresults, or any portion of any of the foregoing, - constitutes infringement of intellectual property or other\\nrights owned or - licensable by you, then any licenses granted to you under this Agreement shall\\nterminate - as of the date such litigation or claim is filed or instituted. You will indemnify - and hold\\nharmless Meta from and against any claim by any third party arising - out of or related to your use or\\ndistribution of the Llama Materials.\\n\\n6. - Term and Termination. The term of this Agreement will commence upon your acceptance - of this\\nAgreement or access to the Llama Materials and will continue in full - force and effect until terminated in\\naccordance with the terms and conditions - herein. Meta may terminate this Agreement if you are in\\nbreach of any term - or condition of this Agreement. Upon termination of this Agreement, you shall - delete\\nand cease use of the Llama Materials. Sections 3, 4 and 7 shall survive - the termination of this\\nAgreement.\\n\\n7. Governing Law and Jurisdiction. - This Agreement will be governed and construed under the laws of\\nthe State - of California without regard to choice of law principles, and the UN Convention - on Contracts\\nfor the International Sale of Goods does not apply to this Agreement. - The courts of California shall have\\nexclusive jurisdiction of any dispute - arising out of this Agreement.\\n\\n# Llama 3.1 Acceptable Use Policy\\n\\nMeta - is committed to promoting safe and fair use of its tools and features, including - Llama 3.1. If you\\naccess or use Llama 3.1, you agree to this Acceptable Use - Policy (\u201CPolicy\u201D). The most recent copy of\\nthis policy can be found - at [https://llama.meta.com/llama3_1/use-policy](https://llama.meta.com/llama3_1/use-policy)\\n\\n## - Prohibited Uses\\n\\nWe want everyone to use Llama 3.1 safely and responsibly. - You agree you will not use, or allow\\nothers to use, Llama 3.1 to:\\n\\n1. - Violate the law or others\u2019 rights, including to:\\n 1. Engage in, promote, - generate, contribute to, encourage, plan, incite, or further illegal or unlawful - activity or content, such as:\\n 1. Violence or terrorism\\n 2. - Exploitation or harm to children, including the solicitation, creation, acquisition, - or dissemination of child exploitative content or failure to report Child Sexual - Abuse Material\\n 3. Human trafficking, exploitation, and sexual violence\\n - \ 4. The illegal distribution of information or materials to minors, including - obscene materials, or failure to employ legally required age-gating in connection - with such information or materials.\\n 5. Sexual solicitation\\n 6. - Any other criminal activity\\n 3. Engage in, promote, incite, or facilitate - the harassment, abuse, threatening, or bullying of individuals or groups of - individuals\\n 4. Engage in, promote, incite, or facilitate discrimination - or other unlawful or harmful conduct in the provision of employment, employment - benefits, credit, housing, other economic benefits, or other essential goods - and services\\n 5. Engage in the unauthorized or unlicensed practice of any - profession including, but not limited to, financial, legal, medical/health, - or related professional practices\\n 6. Collect, process, disclose, generate, - or infer health, demographic, or other sensitive personal or private information - about individuals without rights and consents required by applicable laws\\n - \ 7. Engage in or facilitate any action or generate any content that infringes, - misappropriates, or otherwise violates any third-party rights, including the - outputs or results of any products or services using the Llama Materials\\n - \ 8. Create, generate, or facilitate the creation of malicious code, malware, - computer viruses or do anything else that could disable, overburden, interfere - with or impair the proper working, integrity, operation or appearance of a website - or computer system\\n\\n2. Engage in, promote, incite, facilitate, or assist - in the planning or development of activities that present a risk of death or - bodily harm to individuals, including use of Llama 3.1 related to the following:\\n - \ 1. Military, warfare, nuclear industries or applications, espionage, use - for materials or activities that are subject to the International Traffic Arms - Regulations (ITAR) maintained by the United States Department of State\\n 2. - Guns and illegal weapons (including weapon development)\\n 3. Illegal drugs - and regulated/controlled substances\\n 4. Operation of critical infrastructure, - transportation technologies, or heavy machinery\\n 5. Self-harm or harm to - others, including suicide, cutting, and eating disorders\\n 6. Any content - intended to incite or promote violence, abuse, or any infliction of bodily harm - to an individual\\n\\n3. Intentionally deceive or mislead others, including - use of Llama 3.1 related to the following:\\n 1. Generating, promoting, or - furthering fraud or the creation or promotion of disinformation\\n 2. Generating, - promoting, or furthering defamatory content, including the creation of defamatory - statements, images, or other content\\n 3. Generating, promoting, or further - distributing spam\\n 4. Impersonating another individual without consent, - authorization, or legal right\\n 5. Representing that the use of Llama 3.1 - or outputs are human-generated\\n 6. Generating or facilitating false online - engagement, including fake reviews and other means of fake online engagement\\n\\n4. - Fail to appropriately disclose to end users any known dangers of your AI system\\n\\nPlease - report any violation of this Policy, software \u201Cbug,\u201D or other problems - that could lead to a violation\\nof this Policy through one of the following - means:\\n\\n* Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://github.com/meta-llama/llama-models/issues)\\n* - Reporting risky content generated by the model: developers.facebook.com/llama_output_feedback\\n* - Reporting bugs and security concerns: facebook.com/whitehat/info\\n* Reporting - violations of the Acceptable Use Policy or unlicensed uses of Llama 3.1: LlamaUseReport@meta.com\\n\\\"\\n\",\"parameters\":\"stop - \ \\\"\\u003c|start_header_id|\\u003e\\\"\\nstop \\\"\\u003c|end_header_id|\\u003e\\\"\\nstop - \ \\\"\\u003c|eot_id|\\u003e\\\"\",\"template\":\"{{ - if .Messages }}\\n{{- if or .System .Tools }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n{{- - if .System }}\\n\\n{{ .System }}\\n{{- end }}\\n{{- if .Tools }}\\n\\nYou are - a helpful assistant with tool calling capabilities. When you receive a tool - call response, use the output to format an answer to the orginal use question.\\n{{- - end }}\\u003c|eot_id|\\u003e\\n{{- end }}\\n{{- range $i, $_ := .Messages }}\\n{{- - $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- if eq .Role \\\"user\\\" - }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- if - and $.Tools $last }}\\n\\nGiven the following functions, please respond with - a JSON for a function call with its proper arguments that best answers the given - prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": - dictionary of argument name and its value}. Do not use variables.\\n\\n{{ $.Tools - }}\\n{{- end }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- - if .ToolCalls }}\\n\\n{{- range .ToolCalls }}{\\\"name\\\": \\\"{{ .Function.Name - }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ - .Content }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- end }}\\n{{- - else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ - .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- end }}\\n{{- end }}\\n{{- else }}\\n{{- if .System }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\n{{ - .System }}\\u003c|eot_id|\\u003e{{ end }}{{ if .Prompt }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n\\n{{ - .Prompt }}\\u003c|eot_id|\\u003e{{ end }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}{{ .Response }}{{ if .Response }}\\u003c|eot_id|\\u003e{{ end }}\",\"details\":{\"parent_model\":\"\",\"format\":\"gguf\",\"family\":\"llama\",\"families\":[\"llama\"],\"parameter_size\":\"8.0B\",\"quantization_level\":\"Q4_0\"},\"model_info\":{\"general.architecture\":\"llama\",\"general.basename\":\"Meta-Llama-3.1\",\"general.file_type\":2,\"general.finetune\":\"Instruct\",\"general.languages\":[\"en\",\"de\",\"fr\",\"it\",\"pt\",\"hi\",\"es\",\"th\"],\"general.license\":\"llama3.1\",\"general.parameter_count\":8030261248,\"general.quantization_version\":2,\"general.size_label\":\"8B\",\"general.tags\":[\"facebook\",\"meta\",\"pytorch\",\"llama\",\"llama-3\",\"text-generation\"],\"general.type\":\"model\",\"llama.attention.head_count\":32,\"llama.attention.head_count_kv\":8,\"llama.attention.layer_norm_rms_epsilon\":0.00001,\"llama.block_count\":32,\"llama.context_length\":131072,\"llama.embedding_length\":4096,\"llama.feed_forward_length\":14336,\"llama.rope.dimension_count\":128,\"llama.rope.freq_base\":500000,\"llama.vocab_size\":128256,\"tokenizer.ggml.bos_token_id\":128000,\"tokenizer.ggml.eos_token_id\":128009,\"tokenizer.ggml.merges\":null,\"tokenizer.ggml.model\":\"gpt2\",\"tokenizer.ggml.pre\":\"llama-bpe\",\"tokenizer.ggml.token_type\":null,\"tokenizer.ggml.tokens\":null},\"modified_at\":\"2024-08-01T11:38:16.96106256-04:00\"}" - headers: - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 15 Jan 2025 20:47:19 GMT - Transfer-Encoding: - - chunked - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"name": "llama3.1"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '20' - content-type: - - application/json - host: - - localhost:11434 - user-agent: - - litellm/1.57.4 - method: POST - uri: http://localhost:11434/api/show - response: - content: "{\"license\":\"LLAMA 3.1 COMMUNITY LICENSE AGREEMENT\\nLlama 3.1 Version - Release Date: July 23, 2024\\n\\n\u201CAgreement\u201D means the terms and conditions - for use, reproduction, distribution and modification of the\\nLlama Materials - set forth herein.\\n\\n\u201CDocumentation\u201D means the specifications, manuals - and documentation accompanying Llama 3.1\\ndistributed by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D - or \u201Cyou\u201D means you, or your employer or any other person or entity - (if you are entering into\\nthis Agreement on such person or entity\u2019s behalf), - of the age required under applicable laws, rules or\\nregulations to provide - legal consent and that has legal authority to bind your employer or such other\\nperson - or entity if you are entering in this Agreement on their behalf.\\n\\n\u201CLlama - 3.1\u201D means the foundational large language models and software and algorithms, - including\\nmachine-learning model code, trained model weights, inference-enabling - code, training-enabling code,\\nfine-tuning enabling code and other elements - of the foregoing distributed by Meta at\\nhttps://llama.meta.com/llama-downloads.\\n\\n\u201CLlama - Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.1 and Documentation - (and any\\nportion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D - or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in - or, if you are an entity, your\\nprincipal place of business is in the EEA or - Switzerland) and Meta Platforms, Inc. (if you are located\\noutside of the EEA - or Switzerland).\\n\\nBy clicking \u201CI Accept\u201D below or by using or - distributing any portion or element of the Llama Materials,\\nyou agree to be - bound by this Agreement.\\n\\n1. License Rights and Redistribution.\\n\\n a. - Grant of Rights. You are granted a non-exclusive, worldwide, non-transferable - and royalty-free\\nlimited license under Meta\u2019s intellectual property or - other rights owned by Meta embodied in the Llama\\nMaterials to use, reproduce, - distribute, copy, create derivative works of, and make modifications to the\\nLlama - Materials.\\n\\n b. Redistribution and Use.\\n\\n i. If you distribute - or make available the Llama Materials (or any derivative works\\nthereof), or - a product or service (including another AI model) that contains any of them, - you shall (A)\\nprovide a copy of this Agreement with any such Llama Materials; - and (B) prominently display \u201CBuilt with\\nLlama\u201D on a related website, - user interface, blogpost, about page, or product documentation. If you use\\nthe - Llama Materials or any outputs or results of the Llama Materials to create, - train, fine tune, or\\notherwise improve an AI model, which is distributed or - made available, you shall also include \u201CLlama\u201D at\\nthe beginning - of any such AI model name.\\n\\n ii. If you receive Llama Materials, or - any derivative works thereof, from a Licensee as part \\nof an integrated end - user product, then Section 2 of this Agreement will not apply to you.\\n\\n - \ iii. You must retain in all copies of the Llama Materials that you distribute - the following\\nattribution notice within a \u201CNotice\u201D text file distributed - as a part of such copies: \u201CLlama 3.1 is\\nlicensed under the Llama 3.1 - Community License, Copyright \xA9 Meta Platforms, Inc. All Rights\\nReserved.\u201D\\n\\n - \ iv. Your use of the Llama Materials must comply with applicable laws and - regulations\\n(including trade compliance laws and regulations) and adhere to - the Acceptable Use Policy for the Llama\\nMaterials (available at https://llama.meta.com/llama3_1/use-policy), - which is hereby incorporated by\\nreference into this Agreement.\\n\\n2. Additional - Commercial Terms. If, on the Llama 3.1 version release date, the monthly active - users\\nof the products or services made available by or for Licensee, or Licensee\u2019s - affiliates, is greater than 700\\nmillion monthly active users in the preceding - calendar month, you must request a license from Meta,\\nwhich Meta may grant - to you in its sole discretion, and you are not authorized to exercise any of - the\\nrights under this Agreement unless or until Meta otherwise expressly grants - you such rights.\\n\\n3. Disclaimer of Warranty. UNLESS REQUIRED BY APPLICABLE - LAW, THE LLAMA MATERIALS AND ANY\\nOUTPUT AND RESULTS THEREFROM ARE PROVIDED - ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF\\nANY KIND, AND META DISCLAIMS - ALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND IMPLIED,\\nINCLUDING, WITHOUT LIMITATION, - ANY WARRANTIES OF TITLE, NON-INFRINGEMENT,\\nMERCHANTABILITY, OR FITNESS FOR - A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE FOR\\nDETERMINING THE APPROPRIATENESS - OF USING OR REDISTRIBUTING THE LLAMA MATERIALS AND\\nASSUME ANY RISKS ASSOCIATED - WITH YOUR USE OF THE LLAMA MATERIALS AND ANY OUTPUT AND\\nRESULTS.\\n\\n4. Limitation - of Liability. IN NO EVENT WILL META OR ITS AFFILIATES BE LIABLE UNDER ANY THEORY - OF\\nLIABILITY, WHETHER IN CONTRACT, TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR - OTHERWISE, ARISING\\nOUT OF THIS AGREEMENT, FOR ANY LOST PROFITS OR ANY INDIRECT, - SPECIAL, CONSEQUENTIAL,\\nINCIDENTAL, EXEMPLARY OR PUNITIVE DAMAGES, EVEN IF - META OR ITS AFFILIATES HAVE BEEN ADVISED\\nOF THE POSSIBILITY OF ANY OF THE - FOREGOING.\\n\\n5. Intellectual Property.\\n\\n a. No trademark licenses are - granted under this Agreement, and in connection with the Llama\\nMaterials, - neither Meta nor Licensee may use any name or mark owned by or associated with - the other\\nor any of its affiliates, except as required for reasonable and - customary use in describing and\\nredistributing the Llama Materials or as set - forth in this Section 5(a). Meta hereby grants you a license to\\nuse \u201CLlama\u201D - (the \u201CMark\u201D) solely as required to comply with the last sentence of - Section 1.b.i. You will\\ncomply with Meta\u2019s brand guidelines (currently - accessible at\\nhttps://about.meta.com/brand/resources/meta/company-brand/ ). - All goodwill arising out of your use\\nof the Mark will inure to the benefit - of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and derivatives - made by or for Meta, with\\nrespect to any derivative works and modifications - of the Llama Materials that are made by you, as\\nbetween you and Meta, you - are and will be the owner of such derivative works and modifications.\\n\\n - \ c. If you institute litigation or other proceedings against Meta or any entity - (including a\\ncross-claim or counterclaim in a lawsuit) alleging that the Llama - Materials or Llama 3.1 outputs or\\nresults, or any portion of any of the foregoing, - constitutes infringement of intellectual property or other\\nrights owned or - licensable by you, then any licenses granted to you under this Agreement shall\\nterminate - as of the date such litigation or claim is filed or instituted. You will indemnify - and hold\\nharmless Meta from and against any claim by any third party arising - out of or related to your use or\\ndistribution of the Llama Materials.\\n\\n6. - Term and Termination. The term of this Agreement will commence upon your acceptance - of this\\nAgreement or access to the Llama Materials and will continue in full - force and effect until terminated in\\naccordance with the terms and conditions - herein. Meta may terminate this Agreement if you are in\\nbreach of any term - or condition of this Agreement. Upon termination of this Agreement, you shall - delete\\nand cease use of the Llama Materials. Sections 3, 4 and 7 shall survive - the termination of this\\nAgreement.\\n\\n7. Governing Law and Jurisdiction. - This Agreement will be governed and construed under the laws of\\nthe State - of California without regard to choice of law principles, and the UN Convention - on Contracts\\nfor the International Sale of Goods does not apply to this Agreement. - The courts of California shall have\\nexclusive jurisdiction of any dispute - arising out of this Agreement.\\n\\n# Llama 3.1 Acceptable Use Policy\\n\\nMeta - is committed to promoting safe and fair use of its tools and features, including - Llama 3.1. If you\\naccess or use Llama 3.1, you agree to this Acceptable Use - Policy (\u201CPolicy\u201D). The most recent copy of\\nthis policy can be found - at [https://llama.meta.com/llama3_1/use-policy](https://llama.meta.com/llama3_1/use-policy)\\n\\n## - Prohibited Uses\\n\\nWe want everyone to use Llama 3.1 safely and responsibly. - You agree you will not use, or allow\\nothers to use, Llama 3.1 to:\\n\\n1. - Violate the law or others\u2019 rights, including to:\\n 1. Engage in, promote, - generate, contribute to, encourage, plan, incite, or further illegal or unlawful - activity or content, such as:\\n 1. Violence or terrorism\\n 2. - Exploitation or harm to children, including the solicitation, creation, acquisition, - or dissemination of child exploitative content or failure to report Child Sexual - Abuse Material\\n 3. Human trafficking, exploitation, and sexual violence\\n - \ 4. The illegal distribution of information or materials to minors, including - obscene materials, or failure to employ legally required age-gating in connection - with such information or materials.\\n 5. Sexual solicitation\\n 6. - Any other criminal activity\\n 3. Engage in, promote, incite, or facilitate - the harassment, abuse, threatening, or bullying of individuals or groups of - individuals\\n 4. Engage in, promote, incite, or facilitate discrimination - or other unlawful or harmful conduct in the provision of employment, employment - benefits, credit, housing, other economic benefits, or other essential goods - and services\\n 5. Engage in the unauthorized or unlicensed practice of any - profession including, but not limited to, financial, legal, medical/health, - or related professional practices\\n 6. Collect, process, disclose, generate, - or infer health, demographic, or other sensitive personal or private information - about individuals without rights and consents required by applicable laws\\n - \ 7. Engage in or facilitate any action or generate any content that infringes, - misappropriates, or otherwise violates any third-party rights, including the - outputs or results of any products or services using the Llama Materials\\n - \ 8. Create, generate, or facilitate the creation of malicious code, malware, - computer viruses or do anything else that could disable, overburden, interfere - with or impair the proper working, integrity, operation or appearance of a website - or computer system\\n\\n2. Engage in, promote, incite, facilitate, or assist - in the planning or development of activities that present a risk of death or - bodily harm to individuals, including use of Llama 3.1 related to the following:\\n - \ 1. Military, warfare, nuclear industries or applications, espionage, use - for materials or activities that are subject to the International Traffic Arms - Regulations (ITAR) maintained by the United States Department of State\\n 2. - Guns and illegal weapons (including weapon development)\\n 3. Illegal drugs - and regulated/controlled substances\\n 4. Operation of critical infrastructure, - transportation technologies, or heavy machinery\\n 5. Self-harm or harm to - others, including suicide, cutting, and eating disorders\\n 6. Any content - intended to incite or promote violence, abuse, or any infliction of bodily harm - to an individual\\n\\n3. Intentionally deceive or mislead others, including - use of Llama 3.1 related to the following:\\n 1. Generating, promoting, or - furthering fraud or the creation or promotion of disinformation\\n 2. Generating, - promoting, or furthering defamatory content, including the creation of defamatory - statements, images, or other content\\n 3. Generating, promoting, or further - distributing spam\\n 4. Impersonating another individual without consent, - authorization, or legal right\\n 5. Representing that the use of Llama 3.1 - or outputs are human-generated\\n 6. Generating or facilitating false online - engagement, including fake reviews and other means of fake online engagement\\n\\n4. - Fail to appropriately disclose to end users any known dangers of your AI system\\n\\nPlease - report any violation of this Policy, software \u201Cbug,\u201D or other problems - that could lead to a violation\\nof this Policy through one of the following - means:\\n\\n* Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://github.com/meta-llama/llama-models/issues)\\n* - Reporting risky content generated by the model: developers.facebook.com/llama_output_feedback\\n* - Reporting bugs and security concerns: facebook.com/whitehat/info\\n* Reporting - violations of the Acceptable Use Policy or unlicensed uses of Llama 3.1: LlamaUseReport@meta.com\\n\",\"modelfile\":\"# - Modelfile generated by \\\"ollama show\\\"\\n# To build a new Modelfile based - on this, replace FROM with:\\n# FROM llama3.1:latest\\n\\nFROM /Users/brandonhancock/.ollama/models/blobs/sha256-87048bcd55216712ef14c11c2c303728463207b165bf18440b9b84b07ec00f87\\nTEMPLATE - \\\"\\\"\\\"{{ if .Messages }}\\n{{- if or .System .Tools }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n{{- - if .System }}\\n\\n{{ .System }}\\n{{- end }}\\n{{- if .Tools }}\\n\\nYou are - a helpful assistant with tool calling capabilities. When you receive a tool - call response, use the output to format an answer to the orginal use question.\\n{{- - end }}\\u003c|eot_id|\\u003e\\n{{- end }}\\n{{- range $i, $_ := .Messages }}\\n{{- - $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- if eq .Role \\\"user\\\" - }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- if - and $.Tools $last }}\\n\\nGiven the following functions, please respond with - a JSON for a function call with its proper arguments that best answers the given - prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": - dictionary of argument name and its value}. Do not use variables.\\n\\n{{ $.Tools - }}\\n{{- end }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- - if .ToolCalls }}\\n\\n{{- range .ToolCalls }}{\\\"name\\\": \\\"{{ .Function.Name - }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ - .Content }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- end }}\\n{{- - else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ - .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- end }}\\n{{- end }}\\n{{- else }}\\n{{- if .System }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\n{{ - .System }}\\u003c|eot_id|\\u003e{{ end }}{{ if .Prompt }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n\\n{{ - .Prompt }}\\u003c|eot_id|\\u003e{{ end }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}{{ .Response }}{{ if .Response }}\\u003c|eot_id|\\u003e{{ end }}\\\"\\\"\\\"\\nPARAMETER - stop \\u003c|start_header_id|\\u003e\\nPARAMETER stop \\u003c|end_header_id|\\u003e\\nPARAMETER - stop \\u003c|eot_id|\\u003e\\nLICENSE \\\"LLAMA 3.1 COMMUNITY LICENSE AGREEMENT\\nLlama - 3.1 Version Release Date: July 23, 2024\\n\\n\u201CAgreement\u201D means the - terms and conditions for use, reproduction, distribution and modification of - the\\nLlama Materials set forth herein.\\n\\n\u201CDocumentation\u201D means - the specifications, manuals and documentation accompanying Llama 3.1\\ndistributed - by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D or - \u201Cyou\u201D means you, or your employer or any other person or entity (if - you are entering into\\nthis Agreement on such person or entity\u2019s behalf), - of the age required under applicable laws, rules or\\nregulations to provide - legal consent and that has legal authority to bind your employer or such other\\nperson - or entity if you are entering in this Agreement on their behalf.\\n\\n\u201CLlama - 3.1\u201D means the foundational large language models and software and algorithms, - including\\nmachine-learning model code, trained model weights, inference-enabling - code, training-enabling code,\\nfine-tuning enabling code and other elements - of the foregoing distributed by Meta at\\nhttps://llama.meta.com/llama-downloads.\\n\\n\u201CLlama - Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.1 and Documentation - (and any\\nportion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D - or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in - or, if you are an entity, your\\nprincipal place of business is in the EEA or - Switzerland) and Meta Platforms, Inc. (if you are located\\noutside of the EEA - or Switzerland).\\n\\nBy clicking \u201CI Accept\u201D below or by using or - distributing any portion or element of the Llama Materials,\\nyou agree to be - bound by this Agreement.\\n\\n1. License Rights and Redistribution.\\n\\n a. - Grant of Rights. You are granted a non-exclusive, worldwide, non-transferable - and royalty-free\\nlimited license under Meta\u2019s intellectual property or - other rights owned by Meta embodied in the Llama\\nMaterials to use, reproduce, - distribute, copy, create derivative works of, and make modifications to the\\nLlama - Materials.\\n\\n b. Redistribution and Use.\\n\\n i. If you distribute - or make available the Llama Materials (or any derivative works\\nthereof), or - a product or service (including another AI model) that contains any of them, - you shall (A)\\nprovide a copy of this Agreement with any such Llama Materials; - and (B) prominently display \u201CBuilt with\\nLlama\u201D on a related website, - user interface, blogpost, about page, or product documentation. If you use\\nthe - Llama Materials or any outputs or results of the Llama Materials to create, - train, fine tune, or\\notherwise improve an AI model, which is distributed or - made available, you shall also include \u201CLlama\u201D at\\nthe beginning - of any such AI model name.\\n\\n ii. If you receive Llama Materials, or - any derivative works thereof, from a Licensee as part \\nof an integrated end - user product, then Section 2 of this Agreement will not apply to you.\\n\\n - \ iii. You must retain in all copies of the Llama Materials that you distribute - the following\\nattribution notice within a \u201CNotice\u201D text file distributed - as a part of such copies: \u201CLlama 3.1 is\\nlicensed under the Llama 3.1 - Community License, Copyright \xA9 Meta Platforms, Inc. All Rights\\nReserved.\u201D\\n\\n - \ iv. Your use of the Llama Materials must comply with applicable laws and - regulations\\n(including trade compliance laws and regulations) and adhere to - the Acceptable Use Policy for the Llama\\nMaterials (available at https://llama.meta.com/llama3_1/use-policy), - which is hereby incorporated by\\nreference into this Agreement.\\n\\n2. Additional - Commercial Terms. If, on the Llama 3.1 version release date, the monthly active - users\\nof the products or services made available by or for Licensee, or Licensee\u2019s - affiliates, is greater than 700\\nmillion monthly active users in the preceding - calendar month, you must request a license from Meta,\\nwhich Meta may grant - to you in its sole discretion, and you are not authorized to exercise any of - the\\nrights under this Agreement unless or until Meta otherwise expressly grants - you such rights.\\n\\n3. Disclaimer of Warranty. UNLESS REQUIRED BY APPLICABLE - LAW, THE LLAMA MATERIALS AND ANY\\nOUTPUT AND RESULTS THEREFROM ARE PROVIDED - ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF\\nANY KIND, AND META DISCLAIMS - ALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND IMPLIED,\\nINCLUDING, WITHOUT LIMITATION, - ANY WARRANTIES OF TITLE, NON-INFRINGEMENT,\\nMERCHANTABILITY, OR FITNESS FOR - A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE FOR\\nDETERMINING THE APPROPRIATENESS - OF USING OR REDISTRIBUTING THE LLAMA MATERIALS AND\\nASSUME ANY RISKS ASSOCIATED - WITH YOUR USE OF THE LLAMA MATERIALS AND ANY OUTPUT AND\\nRESULTS.\\n\\n4. Limitation - of Liability. IN NO EVENT WILL META OR ITS AFFILIATES BE LIABLE UNDER ANY THEORY - OF\\nLIABILITY, WHETHER IN CONTRACT, TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR - OTHERWISE, ARISING\\nOUT OF THIS AGREEMENT, FOR ANY LOST PROFITS OR ANY INDIRECT, - SPECIAL, CONSEQUENTIAL,\\nINCIDENTAL, EXEMPLARY OR PUNITIVE DAMAGES, EVEN IF - META OR ITS AFFILIATES HAVE BEEN ADVISED\\nOF THE POSSIBILITY OF ANY OF THE - FOREGOING.\\n\\n5. Intellectual Property.\\n\\n a. No trademark licenses are - granted under this Agreement, and in connection with the Llama\\nMaterials, - neither Meta nor Licensee may use any name or mark owned by or associated with - the other\\nor any of its affiliates, except as required for reasonable and - customary use in describing and\\nredistributing the Llama Materials or as set - forth in this Section 5(a). Meta hereby grants you a license to\\nuse \u201CLlama\u201D - (the \u201CMark\u201D) solely as required to comply with the last sentence of - Section 1.b.i. You will\\ncomply with Meta\u2019s brand guidelines (currently - accessible at\\nhttps://about.meta.com/brand/resources/meta/company-brand/ ). - All goodwill arising out of your use\\nof the Mark will inure to the benefit - of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and derivatives - made by or for Meta, with\\nrespect to any derivative works and modifications - of the Llama Materials that are made by you, as\\nbetween you and Meta, you - are and will be the owner of such derivative works and modifications.\\n\\n - \ c. If you institute litigation or other proceedings against Meta or any entity - (including a\\ncross-claim or counterclaim in a lawsuit) alleging that the Llama - Materials or Llama 3.1 outputs or\\nresults, or any portion of any of the foregoing, - constitutes infringement of intellectual property or other\\nrights owned or - licensable by you, then any licenses granted to you under this Agreement shall\\nterminate - as of the date such litigation or claim is filed or instituted. You will indemnify - and hold\\nharmless Meta from and against any claim by any third party arising - out of or related to your use or\\ndistribution of the Llama Materials.\\n\\n6. - Term and Termination. The term of this Agreement will commence upon your acceptance - of this\\nAgreement or access to the Llama Materials and will continue in full - force and effect until terminated in\\naccordance with the terms and conditions - herein. Meta may terminate this Agreement if you are in\\nbreach of any term - or condition of this Agreement. Upon termination of this Agreement, you shall - delete\\nand cease use of the Llama Materials. Sections 3, 4 and 7 shall survive - the termination of this\\nAgreement.\\n\\n7. Governing Law and Jurisdiction. - This Agreement will be governed and construed under the laws of\\nthe State - of California without regard to choice of law principles, and the UN Convention - on Contracts\\nfor the International Sale of Goods does not apply to this Agreement. - The courts of California shall have\\nexclusive jurisdiction of any dispute - arising out of this Agreement.\\n\\n# Llama 3.1 Acceptable Use Policy\\n\\nMeta - is committed to promoting safe and fair use of its tools and features, including - Llama 3.1. If you\\naccess or use Llama 3.1, you agree to this Acceptable Use - Policy (\u201CPolicy\u201D). The most recent copy of\\nthis policy can be found - at [https://llama.meta.com/llama3_1/use-policy](https://llama.meta.com/llama3_1/use-policy)\\n\\n## - Prohibited Uses\\n\\nWe want everyone to use Llama 3.1 safely and responsibly. - You agree you will not use, or allow\\nothers to use, Llama 3.1 to:\\n\\n1. - Violate the law or others\u2019 rights, including to:\\n 1. Engage in, promote, - generate, contribute to, encourage, plan, incite, or further illegal or unlawful - activity or content, such as:\\n 1. Violence or terrorism\\n 2. - Exploitation or harm to children, including the solicitation, creation, acquisition, - or dissemination of child exploitative content or failure to report Child Sexual - Abuse Material\\n 3. Human trafficking, exploitation, and sexual violence\\n - \ 4. The illegal distribution of information or materials to minors, including - obscene materials, or failure to employ legally required age-gating in connection - with such information or materials.\\n 5. Sexual solicitation\\n 6. - Any other criminal activity\\n 3. Engage in, promote, incite, or facilitate - the harassment, abuse, threatening, or bullying of individuals or groups of - individuals\\n 4. Engage in, promote, incite, or facilitate discrimination - or other unlawful or harmful conduct in the provision of employment, employment - benefits, credit, housing, other economic benefits, or other essential goods - and services\\n 5. Engage in the unauthorized or unlicensed practice of any - profession including, but not limited to, financial, legal, medical/health, - or related professional practices\\n 6. Collect, process, disclose, generate, - or infer health, demographic, or other sensitive personal or private information - about individuals without rights and consents required by applicable laws\\n - \ 7. Engage in or facilitate any action or generate any content that infringes, - misappropriates, or otherwise violates any third-party rights, including the - outputs or results of any products or services using the Llama Materials\\n - \ 8. Create, generate, or facilitate the creation of malicious code, malware, - computer viruses or do anything else that could disable, overburden, interfere - with or impair the proper working, integrity, operation or appearance of a website - or computer system\\n\\n2. Engage in, promote, incite, facilitate, or assist - in the planning or development of activities that present a risk of death or - bodily harm to individuals, including use of Llama 3.1 related to the following:\\n - \ 1. Military, warfare, nuclear industries or applications, espionage, use - for materials or activities that are subject to the International Traffic Arms - Regulations (ITAR) maintained by the United States Department of State\\n 2. - Guns and illegal weapons (including weapon development)\\n 3. Illegal drugs - and regulated/controlled substances\\n 4. Operation of critical infrastructure, - transportation technologies, or heavy machinery\\n 5. Self-harm or harm to - others, including suicide, cutting, and eating disorders\\n 6. Any content - intended to incite or promote violence, abuse, or any infliction of bodily harm - to an individual\\n\\n3. Intentionally deceive or mislead others, including - use of Llama 3.1 related to the following:\\n 1. Generating, promoting, or - furthering fraud or the creation or promotion of disinformation\\n 2. Generating, - promoting, or furthering defamatory content, including the creation of defamatory - statements, images, or other content\\n 3. Generating, promoting, or further - distributing spam\\n 4. Impersonating another individual without consent, - authorization, or legal right\\n 5. Representing that the use of Llama 3.1 - or outputs are human-generated\\n 6. Generating or facilitating false online - engagement, including fake reviews and other means of fake online engagement\\n\\n4. - Fail to appropriately disclose to end users any known dangers of your AI system\\n\\nPlease - report any violation of this Policy, software \u201Cbug,\u201D or other problems - that could lead to a violation\\nof this Policy through one of the following - means:\\n\\n* Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://github.com/meta-llama/llama-models/issues)\\n* - Reporting risky content generated by the model: developers.facebook.com/llama_output_feedback\\n* - Reporting bugs and security concerns: facebook.com/whitehat/info\\n* Reporting - violations of the Acceptable Use Policy or unlicensed uses of Llama 3.1: LlamaUseReport@meta.com\\n\\\"\\n\",\"parameters\":\"stop - \ \\\"\\u003c|start_header_id|\\u003e\\\"\\nstop \\\"\\u003c|end_header_id|\\u003e\\\"\\nstop - \ \\\"\\u003c|eot_id|\\u003e\\\"\",\"template\":\"{{ - if .Messages }}\\n{{- if or .System .Tools }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n{{- - if .System }}\\n\\n{{ .System }}\\n{{- end }}\\n{{- if .Tools }}\\n\\nYou are - a helpful assistant with tool calling capabilities. When you receive a tool - call response, use the output to format an answer to the orginal use question.\\n{{- - end }}\\u003c|eot_id|\\u003e\\n{{- end }}\\n{{- range $i, $_ := .Messages }}\\n{{- - $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- if eq .Role \\\"user\\\" - }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- if - and $.Tools $last }}\\n\\nGiven the following functions, please respond with - a JSON for a function call with its proper arguments that best answers the given - prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": - dictionary of argument name and its value}. Do not use variables.\\n\\n{{ $.Tools - }}\\n{{- end }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- - if .ToolCalls }}\\n\\n{{- range .ToolCalls }}{\\\"name\\\": \\\"{{ .Function.Name - }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ - .Content }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- end }}\\n{{- - else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ - .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- end }}\\n{{- end }}\\n{{- else }}\\n{{- if .System }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\n{{ - .System }}\\u003c|eot_id|\\u003e{{ end }}{{ if .Prompt }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n\\n{{ - .Prompt }}\\u003c|eot_id|\\u003e{{ end }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}{{ .Response }}{{ if .Response }}\\u003c|eot_id|\\u003e{{ end }}\",\"details\":{\"parent_model\":\"\",\"format\":\"gguf\",\"family\":\"llama\",\"families\":[\"llama\"],\"parameter_size\":\"8.0B\",\"quantization_level\":\"Q4_0\"},\"model_info\":{\"general.architecture\":\"llama\",\"general.basename\":\"Meta-Llama-3.1\",\"general.file_type\":2,\"general.finetune\":\"Instruct\",\"general.languages\":[\"en\",\"de\",\"fr\",\"it\",\"pt\",\"hi\",\"es\",\"th\"],\"general.license\":\"llama3.1\",\"general.parameter_count\":8030261248,\"general.quantization_version\":2,\"general.size_label\":\"8B\",\"general.tags\":[\"facebook\",\"meta\",\"pytorch\",\"llama\",\"llama-3\",\"text-generation\"],\"general.type\":\"model\",\"llama.attention.head_count\":32,\"llama.attention.head_count_kv\":8,\"llama.attention.layer_norm_rms_epsilon\":0.00001,\"llama.block_count\":32,\"llama.context_length\":131072,\"llama.embedding_length\":4096,\"llama.feed_forward_length\":14336,\"llama.rope.dimension_count\":128,\"llama.rope.freq_base\":500000,\"llama.vocab_size\":128256,\"tokenizer.ggml.bos_token_id\":128000,\"tokenizer.ggml.eos_token_id\":128009,\"tokenizer.ggml.merges\":null,\"tokenizer.ggml.model\":\"gpt2\",\"tokenizer.ggml.pre\":\"llama-bpe\",\"tokenizer.ggml.token_type\":null,\"tokenizer.ggml.tokens\":null},\"modified_at\":\"2024-08-01T11:38:16.96106256-04:00\"}" - headers: - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 15 Jan 2025 20:47:19 GMT - Transfer-Encoding: - - chunked - http_version: HTTP/1.1 - status_code: 200 + - Tue, 18 Feb 2025 21:52:24 GMT + status: + code: 200 + message: OK version: 1 diff --git a/tests/utilities/cassettes/test_converter_with_llama3_2_model.yaml b/tests/utilities/cassettes/test_converter_with_llama3_2_model.yaml index fdcb661a8..5fd4d37aa 100644 --- a/tests/utilities/cassettes/test_converter_with_llama3_2_model.yaml +++ b/tests/utilities/cassettes/test_converter_with_llama3_2_model.yaml @@ -1,869 +1,36 @@ interactions: - request: - body: '{"model": "llama3.2:3b", "prompt": "### User:\nName: Alice Llama, Age: - 30\n\n### System:\nProduce JSON OUTPUT ONLY! Adhere to this format {\"name\": - \"function_name\", \"arguments\":{\"argument_name\": \"argument_value\"}} The - following functions are available to you:\n{''type'': ''function'', ''function'': - {''name'': ''SimpleModel'', ''description'': ''Correctly extracted `SimpleModel` - with all the required parameters with correct types'', ''parameters'': {''properties'': - {''name'': {''title'': ''Name'', ''type'': ''string''}, ''age'': {''title'': - ''Age'', ''type'': ''integer''}}, ''required'': [''age'', ''name''], ''type'': - ''object''}}}\n\n\n", "options": {}, "stream": false, "format": "json"}' + body: '{"model": "llama3.2:3b", "prompt": "### System:\nPlease convert the following + text into valid JSON.\n\nOutput ONLY the valid JSON and nothing else.\n\nThe + JSON must follow this format exactly:\n{\n \"name\": str,\n \"age\": int\n}\n\n### + User:\nName: Alice Llama, Age: 30\n\n", "options": {"stop": []}, "stream": false}' headers: - accept: + Accept: - '*/*' - accept-encoding: + Accept-Encoding: - gzip, deflate - connection: + Connection: - keep-alive - content-length: - - '657' - host: - - localhost:11434 - user-agent: - - litellm/1.57.4 + Content-Length: + - '321' + Content-Type: + - application/json + User-Agent: + - python-requests/2.32.2 method: POST uri: http://localhost:11434/api/generate response: - content: '{"model":"llama3.2:3b","created_at":"2025-01-15T20:47:11.926411Z","response":"{\"name\": - \"SimpleModel\", \"arguments\":{\"name\": \"Alice Llama\", \"age\": 30}}","done":true,"done_reason":"stop","context":[128006,9125,128007,271,38766,1303,33025,2696,25,6790,220,2366,18,271,128009,128006,882,128007,271,14711,2724,512,678,25,30505,445,81101,11,13381,25,220,966,271,14711,744,512,1360,13677,4823,32090,27785,0,2467,6881,311,420,3645,5324,609,794,330,1723,1292,498,330,16774,23118,14819,1292,794,330,14819,3220,32075,578,2768,5865,527,2561,311,499,512,13922,1337,1232,364,1723,518,364,1723,1232,5473,609,1232,364,16778,1747,518,364,4789,1232,364,34192,398,28532,1595,16778,1747,63,449,682,279,2631,5137,449,4495,4595,518,364,14105,1232,5473,13495,1232,5473,609,1232,5473,2150,1232,364,678,518,364,1337,1232,364,928,25762,364,425,1232,5473,2150,1232,364,17166,518,364,1337,1232,364,11924,8439,2186,364,6413,1232,2570,425,518,364,609,4181,364,1337,1232,364,1735,23742,3818,128009,128006,78191,128007,271,5018,609,794,330,16778,1747,498,330,16774,23118,609,794,330,62786,445,81101,498,330,425,794,220,966,3500],"total_duration":3374470708,"load_duration":1075750500,"prompt_eval_count":167,"prompt_eval_duration":1871000000,"eval_count":24,"eval_duration":426000000}' + body: + string: '{"model":"llama3.2:3b","created_at":"2025-02-18T21:52:20.737635Z","response":"{\"name\": + \"Alice Llama\", \"age\": 30}","done":true,"done_reason":"stop","context":[128006,9125,128007,271,38766,1303,33025,2696,25,6790,220,2366,18,271,128009,128006,882,128007,271,14711,744,512,5618,5625,279,2768,1495,1139,2764,4823,382,5207,27785,279,2764,4823,323,4400,775,382,791,4823,2011,1833,420,3645,7041,512,517,220,330,609,794,610,345,220,330,425,794,528,198,633,14711,2724,512,678,25,30505,445,81101,11,13381,25,220,966,271,128009,128006,78191,128007,271,5018,609,794,330,62786,445,81101,498,330,425,794,220,966,92],"total_duration":2438288750,"load_duration":819026959,"prompt_eval_count":82,"prompt_eval_duration":1368000000,"eval_count":15,"eval_duration":249000000}' headers: Content-Length: - - '1263' + - '761' Content-Type: - application/json; charset=utf-8 Date: - - Wed, 15 Jan 2025 20:47:12 GMT - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"name": "llama3.2:3b"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '23' - content-type: - - application/json - host: - - localhost:11434 - user-agent: - - litellm/1.57.4 - method: POST - uri: http://localhost:11434/api/show - response: - content: "{\"license\":\"LLAMA 3.2 COMMUNITY LICENSE AGREEMENT\\nLlama 3.2 Version - Release Date: September 25, 2024\\n\\n\u201CAgreement\u201D means the terms - and conditions for use, reproduction, distribution \\nand modification of the - Llama Materials set forth herein.\\n\\n\u201CDocumentation\u201D means the specifications, - manuals and documentation accompanying Llama 3.2\\ndistributed by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D - or \u201Cyou\u201D means you, or your employer or any other person or entity - (if you are \\nentering into this Agreement on such person or entity\u2019s - behalf), of the age required under\\napplicable laws, rules or regulations to - provide legal consent and that has legal authority\\nto bind your employer or - such other person or entity if you are entering in this Agreement\\non their - behalf.\\n\\n\u201CLlama 3.2\u201D means the foundational large language models - and software and algorithms, including\\nmachine-learning model code, trained - model weights, inference-enabling code, training-enabling code,\\nfine-tuning - enabling code and other elements of the foregoing distributed by Meta at \\nhttps://www.llama.com/llama-downloads.\\n\\n\u201CLlama - Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.2 and Documentation - (and \\nany portion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D - or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in - or, \\nif you are an entity, your principal place of business is in the EEA - or Switzerland) \\nand Meta Platforms, Inc. (if you are located outside of the - EEA or Switzerland). \\n\\n\\nBy clicking \u201CI Accept\u201D below or by using - or distributing any portion or element of the Llama Materials,\\nyou agree to - be bound by this Agreement.\\n\\n\\n1. License Rights and Redistribution.\\n\\n - \ a. Grant of Rights. You are granted a non-exclusive, worldwide, \\nnon-transferable - and royalty-free limited license under Meta\u2019s intellectual property or - other rights \\nowned by Meta embodied in the Llama Materials to use, reproduce, - distribute, copy, create derivative works \\nof, and make modifications to the - Llama Materials. \\n\\n b. Redistribution and Use. \\n\\n i. If - you distribute or make available the Llama Materials (or any derivative works - thereof), \\nor a product or service (including another AI model) that contains - any of them, you shall (A) provide\\na copy of this Agreement with any such - Llama Materials; and (B) prominently display \u201CBuilt with Llama\u201D\\non - a related website, user interface, blogpost, about page, or product documentation. - If you use the\\nLlama Materials or any outputs or results of the Llama Materials - to create, train, fine tune, or\\notherwise improve an AI model, which is distributed - or made available, you shall also include \u201CLlama\u201D\\nat the beginning - of any such AI model name.\\n\\n ii. If you receive Llama Materials, - or any derivative works thereof, from a Licensee as part\\nof an integrated - end user product, then Section 2 of this Agreement will not apply to you. \\n\\n - \ iii. You must retain in all copies of the Llama Materials that you distribute - the \\nfollowing attribution notice within a \u201CNotice\u201D text file distributed - as a part of such copies: \\n\u201CLlama 3.2 is licensed under the Llama 3.2 - Community License, Copyright \xA9 Meta Platforms,\\nInc. All Rights Reserved.\u201D\\n\\n - \ iv. Your use of the Llama Materials must comply with applicable laws - and regulations\\n(including trade compliance laws and regulations) and adhere - to the Acceptable Use Policy for\\nthe Llama Materials (available at https://www.llama.com/llama3_2/use-policy), - which is hereby \\nincorporated by reference into this Agreement.\\n \\n2. - Additional Commercial Terms. If, on the Llama 3.2 version release date, the - monthly active users\\nof the products or services made available by or for - Licensee, or Licensee\u2019s affiliates, \\nis greater than 700 million monthly - active users in the preceding calendar month, you must request \\na license - from Meta, which Meta may grant to you in its sole discretion, and you are not - authorized to\\nexercise any of the rights under this Agreement unless or until - Meta otherwise expressly grants you such rights.\\n\\n3. Disclaimer of Warranty. - UNLESS REQUIRED BY APPLICABLE LAW, THE LLAMA MATERIALS AND ANY OUTPUT AND \\nRESULTS - THEREFROM ARE PROVIDED ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF - ANY KIND, AND META DISCLAIMS\\nALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND - IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES\\nOF TITLE, NON-INFRINGEMENT, - MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE\\nFOR - DETERMINING THE APPROPRIATENESS OF USING OR REDISTRIBUTING THE LLAMA MATERIALS - AND ASSUME ANY RISKS ASSOCIATED\\nWITH YOUR USE OF THE LLAMA MATERIALS AND ANY - OUTPUT AND RESULTS.\\n\\n4. Limitation of Liability. IN NO EVENT WILL META OR - ITS AFFILIATES BE LIABLE UNDER ANY THEORY OF LIABILITY, \\nWHETHER IN CONTRACT, - TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR OTHERWISE, ARISING OUT OF THIS AGREEMENT, - \\nFOR ANY LOST PROFITS OR ANY INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL, - EXEMPLARY OR PUNITIVE DAMAGES, EVEN \\nIF META OR ITS AFFILIATES HAVE BEEN ADVISED - OF THE POSSIBILITY OF ANY OF THE FOREGOING.\\n\\n5. Intellectual Property.\\n\\n - \ a. No trademark licenses are granted under this Agreement, and in connection - with the Llama Materials, \\nneither Meta nor Licensee may use any name or mark - owned by or associated with the other or any of its affiliates, \\nexcept as - required for reasonable and customary use in describing and redistributing the - Llama Materials or as \\nset forth in this Section 5(a). Meta hereby grants - you a license to use \u201CLlama\u201D (the \u201CMark\u201D) solely as required - \\nto comply with the last sentence of Section 1.b.i. You will comply with Meta\u2019s - brand guidelines (currently accessible \\nat https://about.meta.com/brand/resources/meta/company-brand/). - All goodwill arising out of your use of the Mark \\nwill inure to the benefit - of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and - derivatives made by or for Meta, with respect to any\\n derivative works - and modifications of the Llama Materials that are made by you, as between you - and Meta,\\n you are and will be the owner of such derivative works and modifications.\\n\\n - \ c. If you institute litigation or other proceedings against Meta or any - entity (including a cross-claim or\\n counterclaim in a lawsuit) alleging - that the Llama Materials or Llama 3.2 outputs or results, or any portion\\n - \ of any of the foregoing, constitutes infringement of intellectual property - or other rights owned or licensable\\n by you, then any licenses granted - to you under this Agreement shall terminate as of the date such litigation or\\n - \ claim is filed or instituted. You will indemnify and hold harmless Meta - from and against any claim by any third\\n party arising out of or related - to your use or distribution of the Llama Materials.\\n\\n6. Term and Termination. - The term of this Agreement will commence upon your acceptance of this Agreement - or access\\nto the Llama Materials and will continue in full force and effect - until terminated in accordance with the terms\\nand conditions herein. Meta - may terminate this Agreement if you are in breach of any term or condition of - this\\nAgreement. Upon termination of this Agreement, you shall delete and cease - use of the Llama Materials. Sections 3,\\n4 and 7 shall survive the termination - of this Agreement. \\n\\n7. Governing Law and Jurisdiction. This Agreement will - be governed and construed under the laws of the State of \\nCalifornia without - regard to choice of law principles, and the UN Convention on Contracts for the - International\\nSale of Goods does not apply to this Agreement. The courts of - California shall have exclusive jurisdiction of\\nany dispute arising out of - this Agreement.\\n**Llama 3.2** **Acceptable Use Policy**\\n\\nMeta is committed - to promoting safe and fair use of its tools and features, including Llama 3.2. - If you access or use Llama 3.2, you agree to this Acceptable Use Policy (\u201C**Policy**\u201D). - The most recent copy of this policy can be found at [https://www.llama.com/llama3_2/use-policy](https://www.llama.com/llama3_2/use-policy).\\n\\n**Prohibited - Uses**\\n\\nWe want everyone to use Llama 3.2 safely and responsibly. You agree - you will not use, or allow others to use, Llama 3.2 to:\\n\\n\\n\\n1. Violate - the law or others\u2019 rights, including to:\\n 1. Engage in, promote, generate, - contribute to, encourage, plan, incite, or further illegal or unlawful activity - or content, such as:\\n 1. Violence or terrorism\\n 2. Exploitation - or harm to children, including the solicitation, creation, acquisition, or dissemination - of child exploitative content or failure to report Child Sexual Abuse Material\\n - \ 3. Human trafficking, exploitation, and sexual violence\\n 4. - The illegal distribution of information or materials to minors, including obscene - materials, or failure to employ legally required age-gating in connection with - such information or materials.\\n 5. Sexual solicitation\\n 6. - Any other criminal activity\\n 1. Engage in, promote, incite, or facilitate - the harassment, abuse, threatening, or bullying of individuals or groups of - individuals\\n 2. Engage in, promote, incite, or facilitate discrimination - or other unlawful or harmful conduct in the provision of employment, employment - benefits, credit, housing, other economic benefits, or other essential goods - and services\\n 3. Engage in the unauthorized or unlicensed practice of any - profession including, but not limited to, financial, legal, medical/health, - or related professional practices\\n 4. Collect, process, disclose, generate, - or infer private or sensitive information about individuals, including information - about individuals\u2019 identity, health, or demographic information, unless - you have obtained the right to do so in accordance with applicable law\\n 5. - Engage in or facilitate any action or generate any content that infringes, misappropriates, - or otherwise violates any third-party rights, including the outputs or results - of any products or services using the Llama Materials\\n 6. Create, generate, - or facilitate the creation of malicious code, malware, computer viruses or do - anything else that could disable, overburden, interfere with or impair the proper - working, integrity, operation or appearance of a website or computer system\\n - \ 7. Engage in any action, or facilitate any action, to intentionally circumvent - or remove usage restrictions or other safety measures, or to enable functionality - disabled by Meta\\n2. Engage in, promote, incite, facilitate, or assist in the - planning or development of activities that present a risk of death or bodily - harm to individuals, including use of Llama 3.2 related to the following:\\n - \ 8. Military, warfare, nuclear industries or applications, espionage, use - for materials or activities that are subject to the International Traffic Arms - Regulations (ITAR) maintained by the United States Department of State or to - the U.S. Biological Weapons Anti-Terrorism Act of 1989 or the Chemical Weapons - Convention Implementation Act of 1997\\n 9. Guns and illegal weapons (including - weapon development)\\n 10. Illegal drugs and regulated/controlled substances\\n - \ 11. Operation of critical infrastructure, transportation technologies, or - heavy machinery\\n 12. Self-harm or harm to others, including suicide, cutting, - and eating disorders\\n 13. Any content intended to incite or promote violence, - abuse, or any infliction of bodily harm to an individual\\n3. Intentionally - deceive or mislead others, including use of Llama 3.2 related to the following:\\n - \ 14. Generating, promoting, or furthering fraud or the creation or promotion - of disinformation\\n 15. Generating, promoting, or furthering defamatory - content, including the creation of defamatory statements, images, or other content\\n - \ 16. Generating, promoting, or further distributing spam\\n 17. Impersonating - another individual without consent, authorization, or legal right\\n 18. - Representing that the use of Llama 3.2 or outputs are human-generated\\n 19. - Generating or facilitating false online engagement, including fake reviews and - other means of fake online engagement\\n4. Fail to appropriately disclose to - end users any known dangers of your AI system\\n5. Interact with third party - tools, models, or software designed to generate unlawful content or engage in - unlawful or harmful conduct and/or represent that the outputs of such tools, - models, or software are associated with Meta or Llama 3.2\\n\\nWith respect - to any multimodal models included in Llama 3.2, the rights granted under Section - 1(a) of the Llama 3.2 Community License Agreement are not being granted to you - if you are an individual domiciled in, or a company with a principal place of - business in, the European Union. This restriction does not apply to end users - of a product or service that incorporates any such multimodal models.\\n\\nPlease - report any violation of this Policy, software \u201Cbug,\u201D or other problems - that could lead to a violation of this Policy through one of the following means:\\n\\n\\n\\n* - Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://l.workplace.com/l.php?u=https%3A%2F%2Fgithub.com%2Fmeta-llama%2Fllama-models%2Fissues\\u0026h=AT0qV8W9BFT6NwihiOHRuKYQM_UnkzN_NmHMy91OT55gkLpgi4kQupHUl0ssR4dQsIQ8n3tfd0vtkobvsEvt1l4Ic6GXI2EeuHV8N08OG2WnbAmm0FL4ObkazC6G_256vN0lN9DsykCvCqGZ)\\n* - Reporting risky content generated by the model: [developers.facebook.com/llama_output_feedback](http://developers.facebook.com/llama_output_feedback)\\n* - Reporting bugs and security concerns: [facebook.com/whitehat/info](http://facebook.com/whitehat/info)\\n* - Reporting violations of the Acceptable Use Policy or unlicensed uses of Llama - 3.2: LlamaUseReport@meta.com\",\"modelfile\":\"# Modelfile generated by \\\"ollama - show\\\"\\n# To build a new Modelfile based on this, replace FROM with:\\n# - FROM llama3.2:3b\\n\\nFROM /Users/brandonhancock/.ollama/models/blobs/sha256-dde5aa3fc5ffc17176b5e8bdc82f587b24b2678c6c66101bf7da77af9f7ccdff\\nTEMPLATE - \\\"\\\"\\\"\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\nCutting - Knowledge Date: December 2023\\n\\n{{ if .System }}{{ .System }}\\n{{- end }}\\n{{- - if .Tools }}When you receive a tool call response, use the output to format - an answer to the orginal user question.\\n\\nYou are a helpful assistant with - tool calling capabilities.\\n{{- end }}\\u003c|eot_id|\\u003e\\n{{- range $i, - $_ := .Messages }}\\n{{- $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- - if eq .Role \\\"user\\\" }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- - if and $.Tools $last }}\\n\\nGiven the following functions, please respond with - a JSON for a function call with its proper arguments that best answers the given - prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": - dictionary of argument name and its value}. Do not use variables.\\n\\n{{ range - $.Tools }}\\n{{- . }}\\n{{ end }}\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- - else }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- end }}{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- - if .ToolCalls }}\\n{{ range .ToolCalls }}\\n{\\\"name\\\": \\\"{{ .Function.Name - }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ - .Content }}\\n{{- end }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- - else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ - .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- end }}\\n{{- end }}\\\"\\\"\\\"\\nPARAMETER stop \\u003c|start_header_id|\\u003e\\nPARAMETER - stop \\u003c|end_header_id|\\u003e\\nPARAMETER stop \\u003c|eot_id|\\u003e\\nLICENSE - \\\"LLAMA 3.2 COMMUNITY LICENSE AGREEMENT\\nLlama 3.2 Version Release Date: - September 25, 2024\\n\\n\u201CAgreement\u201D means the terms and conditions - for use, reproduction, distribution \\nand modification of the Llama Materials - set forth herein.\\n\\n\u201CDocumentation\u201D means the specifications, manuals - and documentation accompanying Llama 3.2\\ndistributed by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D - or \u201Cyou\u201D means you, or your employer or any other person or entity - (if you are \\nentering into this Agreement on such person or entity\u2019s - behalf), of the age required under\\napplicable laws, rules or regulations to - provide legal consent and that has legal authority\\nto bind your employer or - such other person or entity if you are entering in this Agreement\\non their - behalf.\\n\\n\u201CLlama 3.2\u201D means the foundational large language models - and software and algorithms, including\\nmachine-learning model code, trained - model weights, inference-enabling code, training-enabling code,\\nfine-tuning - enabling code and other elements of the foregoing distributed by Meta at \\nhttps://www.llama.com/llama-downloads.\\n\\n\u201CLlama - Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.2 and Documentation - (and \\nany portion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D - or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in - or, \\nif you are an entity, your principal place of business is in the EEA - or Switzerland) \\nand Meta Platforms, Inc. (if you are located outside of the - EEA or Switzerland). \\n\\n\\nBy clicking \u201CI Accept\u201D below or by using - or distributing any portion or element of the Llama Materials,\\nyou agree to - be bound by this Agreement.\\n\\n\\n1. License Rights and Redistribution.\\n\\n - \ a. Grant of Rights. You are granted a non-exclusive, worldwide, \\nnon-transferable - and royalty-free limited license under Meta\u2019s intellectual property or - other rights \\nowned by Meta embodied in the Llama Materials to use, reproduce, - distribute, copy, create derivative works \\nof, and make modifications to the - Llama Materials. \\n\\n b. Redistribution and Use. \\n\\n i. If - you distribute or make available the Llama Materials (or any derivative works - thereof), \\nor a product or service (including another AI model) that contains - any of them, you shall (A) provide\\na copy of this Agreement with any such - Llama Materials; and (B) prominently display \u201CBuilt with Llama\u201D\\non - a related website, user interface, blogpost, about page, or product documentation. - If you use the\\nLlama Materials or any outputs or results of the Llama Materials - to create, train, fine tune, or\\notherwise improve an AI model, which is distributed - or made available, you shall also include \u201CLlama\u201D\\nat the beginning - of any such AI model name.\\n\\n ii. If you receive Llama Materials, - or any derivative works thereof, from a Licensee as part\\nof an integrated - end user product, then Section 2 of this Agreement will not apply to you. \\n\\n - \ iii. You must retain in all copies of the Llama Materials that you distribute - the \\nfollowing attribution notice within a \u201CNotice\u201D text file distributed - as a part of such copies: \\n\u201CLlama 3.2 is licensed under the Llama 3.2 - Community License, Copyright \xA9 Meta Platforms,\\nInc. All Rights Reserved.\u201D\\n\\n - \ iv. Your use of the Llama Materials must comply with applicable laws - and regulations\\n(including trade compliance laws and regulations) and adhere - to the Acceptable Use Policy for\\nthe Llama Materials (available at https://www.llama.com/llama3_2/use-policy), - which is hereby \\nincorporated by reference into this Agreement.\\n \\n2. - Additional Commercial Terms. If, on the Llama 3.2 version release date, the - monthly active users\\nof the products or services made available by or for - Licensee, or Licensee\u2019s affiliates, \\nis greater than 700 million monthly - active users in the preceding calendar month, you must request \\na license - from Meta, which Meta may grant to you in its sole discretion, and you are not - authorized to\\nexercise any of the rights under this Agreement unless or until - Meta otherwise expressly grants you such rights.\\n\\n3. Disclaimer of Warranty. - UNLESS REQUIRED BY APPLICABLE LAW, THE LLAMA MATERIALS AND ANY OUTPUT AND \\nRESULTS - THEREFROM ARE PROVIDED ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF - ANY KIND, AND META DISCLAIMS\\nALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND - IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES\\nOF TITLE, NON-INFRINGEMENT, - MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE\\nFOR - DETERMINING THE APPROPRIATENESS OF USING OR REDISTRIBUTING THE LLAMA MATERIALS - AND ASSUME ANY RISKS ASSOCIATED\\nWITH YOUR USE OF THE LLAMA MATERIALS AND ANY - OUTPUT AND RESULTS.\\n\\n4. Limitation of Liability. IN NO EVENT WILL META OR - ITS AFFILIATES BE LIABLE UNDER ANY THEORY OF LIABILITY, \\nWHETHER IN CONTRACT, - TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR OTHERWISE, ARISING OUT OF THIS AGREEMENT, - \\nFOR ANY LOST PROFITS OR ANY INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL, - EXEMPLARY OR PUNITIVE DAMAGES, EVEN \\nIF META OR ITS AFFILIATES HAVE BEEN ADVISED - OF THE POSSIBILITY OF ANY OF THE FOREGOING.\\n\\n5. Intellectual Property.\\n\\n - \ a. No trademark licenses are granted under this Agreement, and in connection - with the Llama Materials, \\nneither Meta nor Licensee may use any name or mark - owned by or associated with the other or any of its affiliates, \\nexcept as - required for reasonable and customary use in describing and redistributing the - Llama Materials or as \\nset forth in this Section 5(a). Meta hereby grants - you a license to use \u201CLlama\u201D (the \u201CMark\u201D) solely as required - \\nto comply with the last sentence of Section 1.b.i. You will comply with Meta\u2019s - brand guidelines (currently accessible \\nat https://about.meta.com/brand/resources/meta/company-brand/). - All goodwill arising out of your use of the Mark \\nwill inure to the benefit - of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and - derivatives made by or for Meta, with respect to any\\n derivative works - and modifications of the Llama Materials that are made by you, as between you - and Meta,\\n you are and will be the owner of such derivative works and modifications.\\n\\n - \ c. If you institute litigation or other proceedings against Meta or any - entity (including a cross-claim or\\n counterclaim in a lawsuit) alleging - that the Llama Materials or Llama 3.2 outputs or results, or any portion\\n - \ of any of the foregoing, constitutes infringement of intellectual property - or other rights owned or licensable\\n by you, then any licenses granted - to you under this Agreement shall terminate as of the date such litigation or\\n - \ claim is filed or instituted. You will indemnify and hold harmless Meta - from and against any claim by any third\\n party arising out of or related - to your use or distribution of the Llama Materials.\\n\\n6. Term and Termination. - The term of this Agreement will commence upon your acceptance of this Agreement - or access\\nto the Llama Materials and will continue in full force and effect - until terminated in accordance with the terms\\nand conditions herein. Meta - may terminate this Agreement if you are in breach of any term or condition of - this\\nAgreement. Upon termination of this Agreement, you shall delete and cease - use of the Llama Materials. Sections 3,\\n4 and 7 shall survive the termination - of this Agreement. \\n\\n7. Governing Law and Jurisdiction. This Agreement will - be governed and construed under the laws of the State of \\nCalifornia without - regard to choice of law principles, and the UN Convention on Contracts for the - International\\nSale of Goods does not apply to this Agreement. The courts of - California shall have exclusive jurisdiction of\\nany dispute arising out of - this Agreement.\\\"\\nLICENSE \\\"**Llama 3.2** **Acceptable Use Policy**\\n\\nMeta - is committed to promoting safe and fair use of its tools and features, including - Llama 3.2. If you access or use Llama 3.2, you agree to this Acceptable Use - Policy (\u201C**Policy**\u201D). The most recent copy of this policy can be - found at [https://www.llama.com/llama3_2/use-policy](https://www.llama.com/llama3_2/use-policy).\\n\\n**Prohibited - Uses**\\n\\nWe want everyone to use Llama 3.2 safely and responsibly. You agree - you will not use, or allow others to use, Llama 3.2 to:\\n\\n\\n\\n1. Violate - the law or others\u2019 rights, including to:\\n 1. Engage in, promote, generate, - contribute to, encourage, plan, incite, or further illegal or unlawful activity - or content, such as:\\n 1. Violence or terrorism\\n 2. Exploitation - or harm to children, including the solicitation, creation, acquisition, or dissemination - of child exploitative content or failure to report Child Sexual Abuse Material\\n - \ 3. Human trafficking, exploitation, and sexual violence\\n 4. - The illegal distribution of information or materials to minors, including obscene - materials, or failure to employ legally required age-gating in connection with - such information or materials.\\n 5. Sexual solicitation\\n 6. - Any other criminal activity\\n 1. Engage in, promote, incite, or facilitate - the harassment, abuse, threatening, or bullying of individuals or groups of - individuals\\n 2. Engage in, promote, incite, or facilitate discrimination - or other unlawful or harmful conduct in the provision of employment, employment - benefits, credit, housing, other economic benefits, or other essential goods - and services\\n 3. Engage in the unauthorized or unlicensed practice of any - profession including, but not limited to, financial, legal, medical/health, - or related professional practices\\n 4. Collect, process, disclose, generate, - or infer private or sensitive information about individuals, including information - about individuals\u2019 identity, health, or demographic information, unless - you have obtained the right to do so in accordance with applicable law\\n 5. - Engage in or facilitate any action or generate any content that infringes, misappropriates, - or otherwise violates any third-party rights, including the outputs or results - of any products or services using the Llama Materials\\n 6. Create, generate, - or facilitate the creation of malicious code, malware, computer viruses or do - anything else that could disable, overburden, interfere with or impair the proper - working, integrity, operation or appearance of a website or computer system\\n - \ 7. Engage in any action, or facilitate any action, to intentionally circumvent - or remove usage restrictions or other safety measures, or to enable functionality - disabled by Meta\\n2. Engage in, promote, incite, facilitate, or assist in the - planning or development of activities that present a risk of death or bodily - harm to individuals, including use of Llama 3.2 related to the following:\\n - \ 8. Military, warfare, nuclear industries or applications, espionage, use - for materials or activities that are subject to the International Traffic Arms - Regulations (ITAR) maintained by the United States Department of State or to - the U.S. Biological Weapons Anti-Terrorism Act of 1989 or the Chemical Weapons - Convention Implementation Act of 1997\\n 9. Guns and illegal weapons (including - weapon development)\\n 10. Illegal drugs and regulated/controlled substances\\n - \ 11. Operation of critical infrastructure, transportation technologies, or - heavy machinery\\n 12. Self-harm or harm to others, including suicide, cutting, - and eating disorders\\n 13. Any content intended to incite or promote violence, - abuse, or any infliction of bodily harm to an individual\\n3. Intentionally - deceive or mislead others, including use of Llama 3.2 related to the following:\\n - \ 14. Generating, promoting, or furthering fraud or the creation or promotion - of disinformation\\n 15. Generating, promoting, or furthering defamatory - content, including the creation of defamatory statements, images, or other content\\n - \ 16. Generating, promoting, or further distributing spam\\n 17. Impersonating - another individual without consent, authorization, or legal right\\n 18. - Representing that the use of Llama 3.2 or outputs are human-generated\\n 19. - Generating or facilitating false online engagement, including fake reviews and - other means of fake online engagement\\n4. Fail to appropriately disclose to - end users any known dangers of your AI system\\n5. Interact with third party - tools, models, or software designed to generate unlawful content or engage in - unlawful or harmful conduct and/or represent that the outputs of such tools, - models, or software are associated with Meta or Llama 3.2\\n\\nWith respect - to any multimodal models included in Llama 3.2, the rights granted under Section - 1(a) of the Llama 3.2 Community License Agreement are not being granted to you - if you are an individual domiciled in, or a company with a principal place of - business in, the European Union. This restriction does not apply to end users - of a product or service that incorporates any such multimodal models.\\n\\nPlease - report any violation of this Policy, software \u201Cbug,\u201D or other problems - that could lead to a violation of this Policy through one of the following means:\\n\\n\\n\\n* - Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://l.workplace.com/l.php?u=https%3A%2F%2Fgithub.com%2Fmeta-llama%2Fllama-models%2Fissues\\u0026h=AT0qV8W9BFT6NwihiOHRuKYQM_UnkzN_NmHMy91OT55gkLpgi4kQupHUl0ssR4dQsIQ8n3tfd0vtkobvsEvt1l4Ic6GXI2EeuHV8N08OG2WnbAmm0FL4ObkazC6G_256vN0lN9DsykCvCqGZ)\\n* - Reporting risky content generated by the model: [developers.facebook.com/llama_output_feedback](http://developers.facebook.com/llama_output_feedback)\\n* - Reporting bugs and security concerns: [facebook.com/whitehat/info](http://facebook.com/whitehat/info)\\n* - Reporting violations of the Acceptable Use Policy or unlicensed uses of Llama - 3.2: LlamaUseReport@meta.com\\\"\\n\",\"parameters\":\"stop \\\"\\u003c|start_header_id|\\u003e\\\"\\nstop - \ \\\"\\u003c|end_header_id|\\u003e\\\"\\nstop \\\"\\u003c|eot_id|\\u003e\\\"\",\"template\":\"\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\nCutting - Knowledge Date: December 2023\\n\\n{{ if .System }}{{ .System }}\\n{{- end }}\\n{{- - if .Tools }}When you receive a tool call response, use the output to format - an answer to the orginal user question.\\n\\nYou are a helpful assistant with - tool calling capabilities.\\n{{- end }}\\u003c|eot_id|\\u003e\\n{{- range $i, - $_ := .Messages }}\\n{{- $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- - if eq .Role \\\"user\\\" }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- - if and $.Tools $last }}\\n\\nGiven the following functions, please respond with - a JSON for a function call with its proper arguments that best answers the given - prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": - dictionary of argument name and its value}. Do not use variables.\\n\\n{{ range - $.Tools }}\\n{{- . }}\\n{{ end }}\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- - else }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- end }}{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- - if .ToolCalls }}\\n{{ range .ToolCalls }}\\n{\\\"name\\\": \\\"{{ .Function.Name - }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ - .Content }}\\n{{- end }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- - else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ - .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- end }}\\n{{- end }}\",\"details\":{\"parent_model\":\"\",\"format\":\"gguf\",\"family\":\"llama\",\"families\":[\"llama\"],\"parameter_size\":\"3.2B\",\"quantization_level\":\"Q4_K_M\"},\"model_info\":{\"general.architecture\":\"llama\",\"general.basename\":\"Llama-3.2\",\"general.file_type\":15,\"general.finetune\":\"Instruct\",\"general.languages\":[\"en\",\"de\",\"fr\",\"it\",\"pt\",\"hi\",\"es\",\"th\"],\"general.parameter_count\":3212749888,\"general.quantization_version\":2,\"general.size_label\":\"3B\",\"general.tags\":[\"facebook\",\"meta\",\"pytorch\",\"llama\",\"llama-3\",\"text-generation\"],\"general.type\":\"model\",\"llama.attention.head_count\":24,\"llama.attention.head_count_kv\":8,\"llama.attention.key_length\":128,\"llama.attention.layer_norm_rms_epsilon\":0.00001,\"llama.attention.value_length\":128,\"llama.block_count\":28,\"llama.context_length\":131072,\"llama.embedding_length\":3072,\"llama.feed_forward_length\":8192,\"llama.rope.dimension_count\":128,\"llama.rope.freq_base\":500000,\"llama.vocab_size\":128256,\"tokenizer.ggml.bos_token_id\":128000,\"tokenizer.ggml.eos_token_id\":128009,\"tokenizer.ggml.merges\":null,\"tokenizer.ggml.model\":\"gpt2\",\"tokenizer.ggml.pre\":\"llama-bpe\",\"tokenizer.ggml.token_type\":null,\"tokenizer.ggml.tokens\":null},\"modified_at\":\"2024-12-31T11:53:14.529771974-05:00\"}" - headers: - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 15 Jan 2025 20:47:12 GMT - Transfer-Encoding: - - chunked - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"name": "llama3.2:3b"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - connection: - - keep-alive - content-length: - - '23' - content-type: - - application/json - host: - - localhost:11434 - user-agent: - - litellm/1.57.4 - method: POST - uri: http://localhost:11434/api/show - response: - content: "{\"license\":\"LLAMA 3.2 COMMUNITY LICENSE AGREEMENT\\nLlama 3.2 Version - Release Date: September 25, 2024\\n\\n\u201CAgreement\u201D means the terms - and conditions for use, reproduction, distribution \\nand modification of the - Llama Materials set forth herein.\\n\\n\u201CDocumentation\u201D means the specifications, - manuals and documentation accompanying Llama 3.2\\ndistributed by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D - or \u201Cyou\u201D means you, or your employer or any other person or entity - (if you are \\nentering into this Agreement on such person or entity\u2019s - behalf), of the age required under\\napplicable laws, rules or regulations to - provide legal consent and that has legal authority\\nto bind your employer or - such other person or entity if you are entering in this Agreement\\non their - behalf.\\n\\n\u201CLlama 3.2\u201D means the foundational large language models - and software and algorithms, including\\nmachine-learning model code, trained - model weights, inference-enabling code, training-enabling code,\\nfine-tuning - enabling code and other elements of the foregoing distributed by Meta at \\nhttps://www.llama.com/llama-downloads.\\n\\n\u201CLlama - Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.2 and Documentation - (and \\nany portion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D - or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in - or, \\nif you are an entity, your principal place of business is in the EEA - or Switzerland) \\nand Meta Platforms, Inc. (if you are located outside of the - EEA or Switzerland). \\n\\n\\nBy clicking \u201CI Accept\u201D below or by using - or distributing any portion or element of the Llama Materials,\\nyou agree to - be bound by this Agreement.\\n\\n\\n1. License Rights and Redistribution.\\n\\n - \ a. Grant of Rights. You are granted a non-exclusive, worldwide, \\nnon-transferable - and royalty-free limited license under Meta\u2019s intellectual property or - other rights \\nowned by Meta embodied in the Llama Materials to use, reproduce, - distribute, copy, create derivative works \\nof, and make modifications to the - Llama Materials. \\n\\n b. Redistribution and Use. \\n\\n i. If - you distribute or make available the Llama Materials (or any derivative works - thereof), \\nor a product or service (including another AI model) that contains - any of them, you shall (A) provide\\na copy of this Agreement with any such - Llama Materials; and (B) prominently display \u201CBuilt with Llama\u201D\\non - a related website, user interface, blogpost, about page, or product documentation. - If you use the\\nLlama Materials or any outputs or results of the Llama Materials - to create, train, fine tune, or\\notherwise improve an AI model, which is distributed - or made available, you shall also include \u201CLlama\u201D\\nat the beginning - of any such AI model name.\\n\\n ii. If you receive Llama Materials, - or any derivative works thereof, from a Licensee as part\\nof an integrated - end user product, then Section 2 of this Agreement will not apply to you. \\n\\n - \ iii. You must retain in all copies of the Llama Materials that you distribute - the \\nfollowing attribution notice within a \u201CNotice\u201D text file distributed - as a part of such copies: \\n\u201CLlama 3.2 is licensed under the Llama 3.2 - Community License, Copyright \xA9 Meta Platforms,\\nInc. All Rights Reserved.\u201D\\n\\n - \ iv. Your use of the Llama Materials must comply with applicable laws - and regulations\\n(including trade compliance laws and regulations) and adhere - to the Acceptable Use Policy for\\nthe Llama Materials (available at https://www.llama.com/llama3_2/use-policy), - which is hereby \\nincorporated by reference into this Agreement.\\n \\n2. - Additional Commercial Terms. If, on the Llama 3.2 version release date, the - monthly active users\\nof the products or services made available by or for - Licensee, or Licensee\u2019s affiliates, \\nis greater than 700 million monthly - active users in the preceding calendar month, you must request \\na license - from Meta, which Meta may grant to you in its sole discretion, and you are not - authorized to\\nexercise any of the rights under this Agreement unless or until - Meta otherwise expressly grants you such rights.\\n\\n3. Disclaimer of Warranty. - UNLESS REQUIRED BY APPLICABLE LAW, THE LLAMA MATERIALS AND ANY OUTPUT AND \\nRESULTS - THEREFROM ARE PROVIDED ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF - ANY KIND, AND META DISCLAIMS\\nALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND - IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES\\nOF TITLE, NON-INFRINGEMENT, - MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE\\nFOR - DETERMINING THE APPROPRIATENESS OF USING OR REDISTRIBUTING THE LLAMA MATERIALS - AND ASSUME ANY RISKS ASSOCIATED\\nWITH YOUR USE OF THE LLAMA MATERIALS AND ANY - OUTPUT AND RESULTS.\\n\\n4. Limitation of Liability. IN NO EVENT WILL META OR - ITS AFFILIATES BE LIABLE UNDER ANY THEORY OF LIABILITY, \\nWHETHER IN CONTRACT, - TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR OTHERWISE, ARISING OUT OF THIS AGREEMENT, - \\nFOR ANY LOST PROFITS OR ANY INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL, - EXEMPLARY OR PUNITIVE DAMAGES, EVEN \\nIF META OR ITS AFFILIATES HAVE BEEN ADVISED - OF THE POSSIBILITY OF ANY OF THE FOREGOING.\\n\\n5. Intellectual Property.\\n\\n - \ a. No trademark licenses are granted under this Agreement, and in connection - with the Llama Materials, \\nneither Meta nor Licensee may use any name or mark - owned by or associated with the other or any of its affiliates, \\nexcept as - required for reasonable and customary use in describing and redistributing the - Llama Materials or as \\nset forth in this Section 5(a). Meta hereby grants - you a license to use \u201CLlama\u201D (the \u201CMark\u201D) solely as required - \\nto comply with the last sentence of Section 1.b.i. You will comply with Meta\u2019s - brand guidelines (currently accessible \\nat https://about.meta.com/brand/resources/meta/company-brand/). - All goodwill arising out of your use of the Mark \\nwill inure to the benefit - of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and - derivatives made by or for Meta, with respect to any\\n derivative works - and modifications of the Llama Materials that are made by you, as between you - and Meta,\\n you are and will be the owner of such derivative works and modifications.\\n\\n - \ c. If you institute litigation or other proceedings against Meta or any - entity (including a cross-claim or\\n counterclaim in a lawsuit) alleging - that the Llama Materials or Llama 3.2 outputs or results, or any portion\\n - \ of any of the foregoing, constitutes infringement of intellectual property - or other rights owned or licensable\\n by you, then any licenses granted - to you under this Agreement shall terminate as of the date such litigation or\\n - \ claim is filed or instituted. You will indemnify and hold harmless Meta - from and against any claim by any third\\n party arising out of or related - to your use or distribution of the Llama Materials.\\n\\n6. Term and Termination. - The term of this Agreement will commence upon your acceptance of this Agreement - or access\\nto the Llama Materials and will continue in full force and effect - until terminated in accordance with the terms\\nand conditions herein. Meta - may terminate this Agreement if you are in breach of any term or condition of - this\\nAgreement. Upon termination of this Agreement, you shall delete and cease - use of the Llama Materials. Sections 3,\\n4 and 7 shall survive the termination - of this Agreement. \\n\\n7. Governing Law and Jurisdiction. This Agreement will - be governed and construed under the laws of the State of \\nCalifornia without - regard to choice of law principles, and the UN Convention on Contracts for the - International\\nSale of Goods does not apply to this Agreement. The courts of - California shall have exclusive jurisdiction of\\nany dispute arising out of - this Agreement.\\n**Llama 3.2** **Acceptable Use Policy**\\n\\nMeta is committed - to promoting safe and fair use of its tools and features, including Llama 3.2. - If you access or use Llama 3.2, you agree to this Acceptable Use Policy (\u201C**Policy**\u201D). - The most recent copy of this policy can be found at [https://www.llama.com/llama3_2/use-policy](https://www.llama.com/llama3_2/use-policy).\\n\\n**Prohibited - Uses**\\n\\nWe want everyone to use Llama 3.2 safely and responsibly. You agree - you will not use, or allow others to use, Llama 3.2 to:\\n\\n\\n\\n1. Violate - the law or others\u2019 rights, including to:\\n 1. Engage in, promote, generate, - contribute to, encourage, plan, incite, or further illegal or unlawful activity - or content, such as:\\n 1. Violence or terrorism\\n 2. Exploitation - or harm to children, including the solicitation, creation, acquisition, or dissemination - of child exploitative content or failure to report Child Sexual Abuse Material\\n - \ 3. Human trafficking, exploitation, and sexual violence\\n 4. - The illegal distribution of information or materials to minors, including obscene - materials, or failure to employ legally required age-gating in connection with - such information or materials.\\n 5. Sexual solicitation\\n 6. - Any other criminal activity\\n 1. Engage in, promote, incite, or facilitate - the harassment, abuse, threatening, or bullying of individuals or groups of - individuals\\n 2. Engage in, promote, incite, or facilitate discrimination - or other unlawful or harmful conduct in the provision of employment, employment - benefits, credit, housing, other economic benefits, or other essential goods - and services\\n 3. Engage in the unauthorized or unlicensed practice of any - profession including, but not limited to, financial, legal, medical/health, - or related professional practices\\n 4. Collect, process, disclose, generate, - or infer private or sensitive information about individuals, including information - about individuals\u2019 identity, health, or demographic information, unless - you have obtained the right to do so in accordance with applicable law\\n 5. - Engage in or facilitate any action or generate any content that infringes, misappropriates, - or otherwise violates any third-party rights, including the outputs or results - of any products or services using the Llama Materials\\n 6. Create, generate, - or facilitate the creation of malicious code, malware, computer viruses or do - anything else that could disable, overburden, interfere with or impair the proper - working, integrity, operation or appearance of a website or computer system\\n - \ 7. Engage in any action, or facilitate any action, to intentionally circumvent - or remove usage restrictions or other safety measures, or to enable functionality - disabled by Meta\\n2. Engage in, promote, incite, facilitate, or assist in the - planning or development of activities that present a risk of death or bodily - harm to individuals, including use of Llama 3.2 related to the following:\\n - \ 8. Military, warfare, nuclear industries or applications, espionage, use - for materials or activities that are subject to the International Traffic Arms - Regulations (ITAR) maintained by the United States Department of State or to - the U.S. Biological Weapons Anti-Terrorism Act of 1989 or the Chemical Weapons - Convention Implementation Act of 1997\\n 9. Guns and illegal weapons (including - weapon development)\\n 10. Illegal drugs and regulated/controlled substances\\n - \ 11. Operation of critical infrastructure, transportation technologies, or - heavy machinery\\n 12. Self-harm or harm to others, including suicide, cutting, - and eating disorders\\n 13. Any content intended to incite or promote violence, - abuse, or any infliction of bodily harm to an individual\\n3. Intentionally - deceive or mislead others, including use of Llama 3.2 related to the following:\\n - \ 14. Generating, promoting, or furthering fraud or the creation or promotion - of disinformation\\n 15. Generating, promoting, or furthering defamatory - content, including the creation of defamatory statements, images, or other content\\n - \ 16. Generating, promoting, or further distributing spam\\n 17. Impersonating - another individual without consent, authorization, or legal right\\n 18. - Representing that the use of Llama 3.2 or outputs are human-generated\\n 19. - Generating or facilitating false online engagement, including fake reviews and - other means of fake online engagement\\n4. Fail to appropriately disclose to - end users any known dangers of your AI system\\n5. Interact with third party - tools, models, or software designed to generate unlawful content or engage in - unlawful or harmful conduct and/or represent that the outputs of such tools, - models, or software are associated with Meta or Llama 3.2\\n\\nWith respect - to any multimodal models included in Llama 3.2, the rights granted under Section - 1(a) of the Llama 3.2 Community License Agreement are not being granted to you - if you are an individual domiciled in, or a company with a principal place of - business in, the European Union. This restriction does not apply to end users - of a product or service that incorporates any such multimodal models.\\n\\nPlease - report any violation of this Policy, software \u201Cbug,\u201D or other problems - that could lead to a violation of this Policy through one of the following means:\\n\\n\\n\\n* - Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://l.workplace.com/l.php?u=https%3A%2F%2Fgithub.com%2Fmeta-llama%2Fllama-models%2Fissues\\u0026h=AT0qV8W9BFT6NwihiOHRuKYQM_UnkzN_NmHMy91OT55gkLpgi4kQupHUl0ssR4dQsIQ8n3tfd0vtkobvsEvt1l4Ic6GXI2EeuHV8N08OG2WnbAmm0FL4ObkazC6G_256vN0lN9DsykCvCqGZ)\\n* - Reporting risky content generated by the model: [developers.facebook.com/llama_output_feedback](http://developers.facebook.com/llama_output_feedback)\\n* - Reporting bugs and security concerns: [facebook.com/whitehat/info](http://facebook.com/whitehat/info)\\n* - Reporting violations of the Acceptable Use Policy or unlicensed uses of Llama - 3.2: LlamaUseReport@meta.com\",\"modelfile\":\"# Modelfile generated by \\\"ollama - show\\\"\\n# To build a new Modelfile based on this, replace FROM with:\\n# - FROM llama3.2:3b\\n\\nFROM /Users/brandonhancock/.ollama/models/blobs/sha256-dde5aa3fc5ffc17176b5e8bdc82f587b24b2678c6c66101bf7da77af9f7ccdff\\nTEMPLATE - \\\"\\\"\\\"\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\nCutting - Knowledge Date: December 2023\\n\\n{{ if .System }}{{ .System }}\\n{{- end }}\\n{{- - if .Tools }}When you receive a tool call response, use the output to format - an answer to the orginal user question.\\n\\nYou are a helpful assistant with - tool calling capabilities.\\n{{- end }}\\u003c|eot_id|\\u003e\\n{{- range $i, - $_ := .Messages }}\\n{{- $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- - if eq .Role \\\"user\\\" }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- - if and $.Tools $last }}\\n\\nGiven the following functions, please respond with - a JSON for a function call with its proper arguments that best answers the given - prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": - dictionary of argument name and its value}. Do not use variables.\\n\\n{{ range - $.Tools }}\\n{{- . }}\\n{{ end }}\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- - else }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- end }}{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- - if .ToolCalls }}\\n{{ range .ToolCalls }}\\n{\\\"name\\\": \\\"{{ .Function.Name - }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ - .Content }}\\n{{- end }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- - else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ - .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- end }}\\n{{- end }}\\\"\\\"\\\"\\nPARAMETER stop \\u003c|start_header_id|\\u003e\\nPARAMETER - stop \\u003c|end_header_id|\\u003e\\nPARAMETER stop \\u003c|eot_id|\\u003e\\nLICENSE - \\\"LLAMA 3.2 COMMUNITY LICENSE AGREEMENT\\nLlama 3.2 Version Release Date: - September 25, 2024\\n\\n\u201CAgreement\u201D means the terms and conditions - for use, reproduction, distribution \\nand modification of the Llama Materials - set forth herein.\\n\\n\u201CDocumentation\u201D means the specifications, manuals - and documentation accompanying Llama 3.2\\ndistributed by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D - or \u201Cyou\u201D means you, or your employer or any other person or entity - (if you are \\nentering into this Agreement on such person or entity\u2019s - behalf), of the age required under\\napplicable laws, rules or regulations to - provide legal consent and that has legal authority\\nto bind your employer or - such other person or entity if you are entering in this Agreement\\non their - behalf.\\n\\n\u201CLlama 3.2\u201D means the foundational large language models - and software and algorithms, including\\nmachine-learning model code, trained - model weights, inference-enabling code, training-enabling code,\\nfine-tuning - enabling code and other elements of the foregoing distributed by Meta at \\nhttps://www.llama.com/llama-downloads.\\n\\n\u201CLlama - Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.2 and Documentation - (and \\nany portion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D - or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in - or, \\nif you are an entity, your principal place of business is in the EEA - or Switzerland) \\nand Meta Platforms, Inc. (if you are located outside of the - EEA or Switzerland). \\n\\n\\nBy clicking \u201CI Accept\u201D below or by using - or distributing any portion or element of the Llama Materials,\\nyou agree to - be bound by this Agreement.\\n\\n\\n1. License Rights and Redistribution.\\n\\n - \ a. Grant of Rights. You are granted a non-exclusive, worldwide, \\nnon-transferable - and royalty-free limited license under Meta\u2019s intellectual property or - other rights \\nowned by Meta embodied in the Llama Materials to use, reproduce, - distribute, copy, create derivative works \\nof, and make modifications to the - Llama Materials. \\n\\n b. Redistribution and Use. \\n\\n i. If - you distribute or make available the Llama Materials (or any derivative works - thereof), \\nor a product or service (including another AI model) that contains - any of them, you shall (A) provide\\na copy of this Agreement with any such - Llama Materials; and (B) prominently display \u201CBuilt with Llama\u201D\\non - a related website, user interface, blogpost, about page, or product documentation. - If you use the\\nLlama Materials or any outputs or results of the Llama Materials - to create, train, fine tune, or\\notherwise improve an AI model, which is distributed - or made available, you shall also include \u201CLlama\u201D\\nat the beginning - of any such AI model name.\\n\\n ii. If you receive Llama Materials, - or any derivative works thereof, from a Licensee as part\\nof an integrated - end user product, then Section 2 of this Agreement will not apply to you. \\n\\n - \ iii. You must retain in all copies of the Llama Materials that you distribute - the \\nfollowing attribution notice within a \u201CNotice\u201D text file distributed - as a part of such copies: \\n\u201CLlama 3.2 is licensed under the Llama 3.2 - Community License, Copyright \xA9 Meta Platforms,\\nInc. All Rights Reserved.\u201D\\n\\n - \ iv. Your use of the Llama Materials must comply with applicable laws - and regulations\\n(including trade compliance laws and regulations) and adhere - to the Acceptable Use Policy for\\nthe Llama Materials (available at https://www.llama.com/llama3_2/use-policy), - which is hereby \\nincorporated by reference into this Agreement.\\n \\n2. - Additional Commercial Terms. If, on the Llama 3.2 version release date, the - monthly active users\\nof the products or services made available by or for - Licensee, or Licensee\u2019s affiliates, \\nis greater than 700 million monthly - active users in the preceding calendar month, you must request \\na license - from Meta, which Meta may grant to you in its sole discretion, and you are not - authorized to\\nexercise any of the rights under this Agreement unless or until - Meta otherwise expressly grants you such rights.\\n\\n3. Disclaimer of Warranty. - UNLESS REQUIRED BY APPLICABLE LAW, THE LLAMA MATERIALS AND ANY OUTPUT AND \\nRESULTS - THEREFROM ARE PROVIDED ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF - ANY KIND, AND META DISCLAIMS\\nALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND - IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES\\nOF TITLE, NON-INFRINGEMENT, - MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE\\nFOR - DETERMINING THE APPROPRIATENESS OF USING OR REDISTRIBUTING THE LLAMA MATERIALS - AND ASSUME ANY RISKS ASSOCIATED\\nWITH YOUR USE OF THE LLAMA MATERIALS AND ANY - OUTPUT AND RESULTS.\\n\\n4. Limitation of Liability. IN NO EVENT WILL META OR - ITS AFFILIATES BE LIABLE UNDER ANY THEORY OF LIABILITY, \\nWHETHER IN CONTRACT, - TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR OTHERWISE, ARISING OUT OF THIS AGREEMENT, - \\nFOR ANY LOST PROFITS OR ANY INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL, - EXEMPLARY OR PUNITIVE DAMAGES, EVEN \\nIF META OR ITS AFFILIATES HAVE BEEN ADVISED - OF THE POSSIBILITY OF ANY OF THE FOREGOING.\\n\\n5. Intellectual Property.\\n\\n - \ a. No trademark licenses are granted under this Agreement, and in connection - with the Llama Materials, \\nneither Meta nor Licensee may use any name or mark - owned by or associated with the other or any of its affiliates, \\nexcept as - required for reasonable and customary use in describing and redistributing the - Llama Materials or as \\nset forth in this Section 5(a). Meta hereby grants - you a license to use \u201CLlama\u201D (the \u201CMark\u201D) solely as required - \\nto comply with the last sentence of Section 1.b.i. You will comply with Meta\u2019s - brand guidelines (currently accessible \\nat https://about.meta.com/brand/resources/meta/company-brand/). - All goodwill arising out of your use of the Mark \\nwill inure to the benefit - of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and - derivatives made by or for Meta, with respect to any\\n derivative works - and modifications of the Llama Materials that are made by you, as between you - and Meta,\\n you are and will be the owner of such derivative works and modifications.\\n\\n - \ c. If you institute litigation or other proceedings against Meta or any - entity (including a cross-claim or\\n counterclaim in a lawsuit) alleging - that the Llama Materials or Llama 3.2 outputs or results, or any portion\\n - \ of any of the foregoing, constitutes infringement of intellectual property - or other rights owned or licensable\\n by you, then any licenses granted - to you under this Agreement shall terminate as of the date such litigation or\\n - \ claim is filed or instituted. You will indemnify and hold harmless Meta - from and against any claim by any third\\n party arising out of or related - to your use or distribution of the Llama Materials.\\n\\n6. Term and Termination. - The term of this Agreement will commence upon your acceptance of this Agreement - or access\\nto the Llama Materials and will continue in full force and effect - until terminated in accordance with the terms\\nand conditions herein. Meta - may terminate this Agreement if you are in breach of any term or condition of - this\\nAgreement. Upon termination of this Agreement, you shall delete and cease - use of the Llama Materials. Sections 3,\\n4 and 7 shall survive the termination - of this Agreement. \\n\\n7. Governing Law and Jurisdiction. This Agreement will - be governed and construed under the laws of the State of \\nCalifornia without - regard to choice of law principles, and the UN Convention on Contracts for the - International\\nSale of Goods does not apply to this Agreement. The courts of - California shall have exclusive jurisdiction of\\nany dispute arising out of - this Agreement.\\\"\\nLICENSE \\\"**Llama 3.2** **Acceptable Use Policy**\\n\\nMeta - is committed to promoting safe and fair use of its tools and features, including - Llama 3.2. If you access or use Llama 3.2, you agree to this Acceptable Use - Policy (\u201C**Policy**\u201D). The most recent copy of this policy can be - found at [https://www.llama.com/llama3_2/use-policy](https://www.llama.com/llama3_2/use-policy).\\n\\n**Prohibited - Uses**\\n\\nWe want everyone to use Llama 3.2 safely and responsibly. You agree - you will not use, or allow others to use, Llama 3.2 to:\\n\\n\\n\\n1. Violate - the law or others\u2019 rights, including to:\\n 1. Engage in, promote, generate, - contribute to, encourage, plan, incite, or further illegal or unlawful activity - or content, such as:\\n 1. Violence or terrorism\\n 2. Exploitation - or harm to children, including the solicitation, creation, acquisition, or dissemination - of child exploitative content or failure to report Child Sexual Abuse Material\\n - \ 3. Human trafficking, exploitation, and sexual violence\\n 4. - The illegal distribution of information or materials to minors, including obscene - materials, or failure to employ legally required age-gating in connection with - such information or materials.\\n 5. Sexual solicitation\\n 6. - Any other criminal activity\\n 1. Engage in, promote, incite, or facilitate - the harassment, abuse, threatening, or bullying of individuals or groups of - individuals\\n 2. Engage in, promote, incite, or facilitate discrimination - or other unlawful or harmful conduct in the provision of employment, employment - benefits, credit, housing, other economic benefits, or other essential goods - and services\\n 3. Engage in the unauthorized or unlicensed practice of any - profession including, but not limited to, financial, legal, medical/health, - or related professional practices\\n 4. Collect, process, disclose, generate, - or infer private or sensitive information about individuals, including information - about individuals\u2019 identity, health, or demographic information, unless - you have obtained the right to do so in accordance with applicable law\\n 5. - Engage in or facilitate any action or generate any content that infringes, misappropriates, - or otherwise violates any third-party rights, including the outputs or results - of any products or services using the Llama Materials\\n 6. Create, generate, - or facilitate the creation of malicious code, malware, computer viruses or do - anything else that could disable, overburden, interfere with or impair the proper - working, integrity, operation or appearance of a website or computer system\\n - \ 7. Engage in any action, or facilitate any action, to intentionally circumvent - or remove usage restrictions or other safety measures, or to enable functionality - disabled by Meta\\n2. Engage in, promote, incite, facilitate, or assist in the - planning or development of activities that present a risk of death or bodily - harm to individuals, including use of Llama 3.2 related to the following:\\n - \ 8. Military, warfare, nuclear industries or applications, espionage, use - for materials or activities that are subject to the International Traffic Arms - Regulations (ITAR) maintained by the United States Department of State or to - the U.S. Biological Weapons Anti-Terrorism Act of 1989 or the Chemical Weapons - Convention Implementation Act of 1997\\n 9. Guns and illegal weapons (including - weapon development)\\n 10. Illegal drugs and regulated/controlled substances\\n - \ 11. Operation of critical infrastructure, transportation technologies, or - heavy machinery\\n 12. Self-harm or harm to others, including suicide, cutting, - and eating disorders\\n 13. Any content intended to incite or promote violence, - abuse, or any infliction of bodily harm to an individual\\n3. Intentionally - deceive or mislead others, including use of Llama 3.2 related to the following:\\n - \ 14. Generating, promoting, or furthering fraud or the creation or promotion - of disinformation\\n 15. Generating, promoting, or furthering defamatory - content, including the creation of defamatory statements, images, or other content\\n - \ 16. Generating, promoting, or further distributing spam\\n 17. Impersonating - another individual without consent, authorization, or legal right\\n 18. - Representing that the use of Llama 3.2 or outputs are human-generated\\n 19. - Generating or facilitating false online engagement, including fake reviews and - other means of fake online engagement\\n4. Fail to appropriately disclose to - end users any known dangers of your AI system\\n5. Interact with third party - tools, models, or software designed to generate unlawful content or engage in - unlawful or harmful conduct and/or represent that the outputs of such tools, - models, or software are associated with Meta or Llama 3.2\\n\\nWith respect - to any multimodal models included in Llama 3.2, the rights granted under Section - 1(a) of the Llama 3.2 Community License Agreement are not being granted to you - if you are an individual domiciled in, or a company with a principal place of - business in, the European Union. This restriction does not apply to end users - of a product or service that incorporates any such multimodal models.\\n\\nPlease - report any violation of this Policy, software \u201Cbug,\u201D or other problems - that could lead to a violation of this Policy through one of the following means:\\n\\n\\n\\n* - Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://l.workplace.com/l.php?u=https%3A%2F%2Fgithub.com%2Fmeta-llama%2Fllama-models%2Fissues\\u0026h=AT0qV8W9BFT6NwihiOHRuKYQM_UnkzN_NmHMy91OT55gkLpgi4kQupHUl0ssR4dQsIQ8n3tfd0vtkobvsEvt1l4Ic6GXI2EeuHV8N08OG2WnbAmm0FL4ObkazC6G_256vN0lN9DsykCvCqGZ)\\n* - Reporting risky content generated by the model: [developers.facebook.com/llama_output_feedback](http://developers.facebook.com/llama_output_feedback)\\n* - Reporting bugs and security concerns: [facebook.com/whitehat/info](http://facebook.com/whitehat/info)\\n* - Reporting violations of the Acceptable Use Policy or unlicensed uses of Llama - 3.2: LlamaUseReport@meta.com\\\"\\n\",\"parameters\":\"stop \\\"\\u003c|start_header_id|\\u003e\\\"\\nstop - \ \\\"\\u003c|end_header_id|\\u003e\\\"\\nstop \\\"\\u003c|eot_id|\\u003e\\\"\",\"template\":\"\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\nCutting - Knowledge Date: December 2023\\n\\n{{ if .System }}{{ .System }}\\n{{- end }}\\n{{- - if .Tools }}When you receive a tool call response, use the output to format - an answer to the orginal user question.\\n\\nYou are a helpful assistant with - tool calling capabilities.\\n{{- end }}\\u003c|eot_id|\\u003e\\n{{- range $i, - $_ := .Messages }}\\n{{- $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- - if eq .Role \\\"user\\\" }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- - if and $.Tools $last }}\\n\\nGiven the following functions, please respond with - a JSON for a function call with its proper arguments that best answers the given - prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": - dictionary of argument name and its value}. Do not use variables.\\n\\n{{ range - $.Tools }}\\n{{- . }}\\n{{ end }}\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- - else }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- end }}{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- - if .ToolCalls }}\\n{{ range .ToolCalls }}\\n{\\\"name\\\": \\\"{{ .Function.Name - }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ - .Content }}\\n{{- end }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- - else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ - .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ - end }}\\n{{- end }}\\n{{- end }}\",\"details\":{\"parent_model\":\"\",\"format\":\"gguf\",\"family\":\"llama\",\"families\":[\"llama\"],\"parameter_size\":\"3.2B\",\"quantization_level\":\"Q4_K_M\"},\"model_info\":{\"general.architecture\":\"llama\",\"general.basename\":\"Llama-3.2\",\"general.file_type\":15,\"general.finetune\":\"Instruct\",\"general.languages\":[\"en\",\"de\",\"fr\",\"it\",\"pt\",\"hi\",\"es\",\"th\"],\"general.parameter_count\":3212749888,\"general.quantization_version\":2,\"general.size_label\":\"3B\",\"general.tags\":[\"facebook\",\"meta\",\"pytorch\",\"llama\",\"llama-3\",\"text-generation\"],\"general.type\":\"model\",\"llama.attention.head_count\":24,\"llama.attention.head_count_kv\":8,\"llama.attention.key_length\":128,\"llama.attention.layer_norm_rms_epsilon\":0.00001,\"llama.attention.value_length\":128,\"llama.block_count\":28,\"llama.context_length\":131072,\"llama.embedding_length\":3072,\"llama.feed_forward_length\":8192,\"llama.rope.dimension_count\":128,\"llama.rope.freq_base\":500000,\"llama.vocab_size\":128256,\"tokenizer.ggml.bos_token_id\":128000,\"tokenizer.ggml.eos_token_id\":128009,\"tokenizer.ggml.merges\":null,\"tokenizer.ggml.model\":\"gpt2\",\"tokenizer.ggml.pre\":\"llama-bpe\",\"tokenizer.ggml.token_type\":null,\"tokenizer.ggml.tokens\":null},\"modified_at\":\"2024-12-31T11:53:14.529771974-05:00\"}" - headers: - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 15 Jan 2025 20:47:12 GMT - Transfer-Encoding: - - chunked - http_version: HTTP/1.1 - status_code: 200 + - Tue, 18 Feb 2025 21:52:21 GMT + status: + code: 200 + message: OK version: 1 diff --git a/tests/utilities/test_converter.py b/tests/utilities/test_converter.py index f661af9cd..3f4a4d07b 100644 --- a/tests/utilities/test_converter.py +++ b/tests/utilities/test_converter.py @@ -1,4 +1,5 @@ import json +import os from typing import Dict, List, Optional from unittest.mock import MagicMock, Mock, patch @@ -220,10 +221,13 @@ def test_get_conversion_instructions_gpt(): supports_function_calling.return_value = True instructions = get_conversion_instructions(SimpleModel, llm) model_schema = PydanticSchemaParser(model=SimpleModel).get_schema() - assert ( - instructions - == f"Please convert the following text into valid JSON.\n\nThe JSON should follow this schema:\n```json\n{model_schema}\n```" + expected_instructions = ( + "Please convert the following text into valid JSON.\n\n" + "Output ONLY the valid JSON and nothing else.\n\n" + "The JSON must follow this schema exactly:\n```json\n" + f"{model_schema}\n```" ) + assert instructions == expected_instructions def test_get_conversion_instructions_non_gpt(): @@ -346,12 +350,17 @@ def test_convert_with_instructions(): assert output.age == 30 -@pytest.mark.vcr(filter_headers=["authorization"]) +# Skip tests that call external APIs when running in CI/CD +skip_external_api = pytest.mark.skipif( + os.getenv("CI") is not None, reason="Skipping tests that call external API in CI/CD" +) + + +@skip_external_api +@pytest.mark.vcr(filter_headers=["authorization"], record_mode="once") def test_converter_with_llama3_2_model(): llm = LLM(model="ollama/llama3.2:3b", base_url="http://localhost:11434") - sample_text = "Name: Alice Llama, Age: 30" - instructions = get_conversion_instructions(SimpleModel, llm) converter = Converter( llm=llm, @@ -359,19 +368,17 @@ def test_converter_with_llama3_2_model(): model=SimpleModel, instructions=instructions, ) - output = converter.to_pydantic() - assert isinstance(output, SimpleModel) assert output.name == "Alice Llama" assert output.age == 30 -@pytest.mark.vcr(filter_headers=["authorization"]) +@skip_external_api +@pytest.mark.vcr(filter_headers=["authorization"], record_mode="once") def test_converter_with_llama3_1_model(): llm = LLM(model="ollama/llama3.1", base_url="http://localhost:11434") sample_text = "Name: Alice Llama, Age: 30" - instructions = get_conversion_instructions(SimpleModel, llm) converter = Converter( llm=llm, @@ -379,14 +386,19 @@ def test_converter_with_llama3_1_model(): model=SimpleModel, instructions=instructions, ) - output = converter.to_pydantic() - assert isinstance(output, SimpleModel) assert output.name == "Alice Llama" assert output.age == 30 +# Skip tests that call external APIs when running in CI/CD +skip_external_api = pytest.mark.skipif( + os.getenv("CI") is not None, reason="Skipping tests that call external API in CI/CD" +) + + +@skip_external_api @pytest.mark.vcr(filter_headers=["authorization"]) def test_converter_with_nested_model(): llm = LLM(model="gpt-4o-mini") @@ -563,7 +575,7 @@ def test_converter_with_ambiguous_input(): with pytest.raises(ConverterError) as exc_info: output = converter.to_pydantic() - assert "validation error" in str(exc_info.value).lower() + assert "failed to convert text into a pydantic model" in str(exc_info.value).lower() # Tests for function calling support From ec050e5d33bfb578a3bf92d026da60a9b3548c7d Mon Sep 17 00:00:00 2001 From: "Brandon Hancock (bhancock_ai)" <109994880+bhancockio@users.noreply.github.com> Date: Thu, 20 Feb 2025 12:35:39 -0500 Subject: [PATCH 12/35] drop prints (#2181) --- src/crewai/utilities/converter.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/crewai/utilities/converter.py b/src/crewai/utilities/converter.py index f63a53d95..991185f4a 100644 --- a/src/crewai/utilities/converter.py +++ b/src/crewai/utilities/converter.py @@ -216,7 +216,6 @@ def convert_with_instructions( def get_conversion_instructions(model: Type[BaseModel], llm: Any) -> str: instructions = "Please convert the following text into valid JSON." - print("Using function calling: ", llm.supports_function_calling()) if llm.supports_function_calling(): model_schema = PydanticSchemaParser(model=model).get_schema() instructions += ( @@ -225,7 +224,6 @@ def get_conversion_instructions(model: Type[BaseModel], llm: Any) -> str: ) else: model_description = generate_model_description(model) - print("Model description: ", model_description) instructions += ( f"\n\nOutput ONLY the valid JSON and nothing else.\n\n" f"The JSON must follow this format exactly:\n{model_description}" From 96a7e8038fa7c24e5510fdd64f37879a345374c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Thu, 20 Feb 2025 21:00:10 -0600 Subject: [PATCH 13/35] cassetes --- .gitignore | 3 +- .../test_converter_with_llama3_1_model.yaml | 1221 ++++++++++++++++- .../test_converter_with_llama3_2_model.yaml | 858 +++++++++++- 3 files changed, 2050 insertions(+), 32 deletions(-) diff --git a/.gitignore b/.gitignore index 947b99b7b..838419e3b 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,5 @@ crew_tasks_output.json .mypy_cache .ruff_cache .venv -agentops.log \ No newline at end of file +agentops.log +test_flow.html \ No newline at end of file diff --git a/tests/utilities/cassettes/test_converter_with_llama3_1_model.yaml b/tests/utilities/cassettes/test_converter_with_llama3_1_model.yaml index d0b4469c6..c63e006d9 100644 --- a/tests/utilities/cassettes/test_converter_with_llama3_1_model.yaml +++ b/tests/utilities/cassettes/test_converter_with_llama3_1_model.yaml @@ -1,36 +1,1225 @@ interactions: +- request: + body: '{"name": "llama3.2:3b"}' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '23' + content-type: + - application/json + host: + - localhost:11434 + user-agent: + - litellm/1.60.2 + method: POST + uri: http://localhost:11434/api/show + response: + content: "{\"license\":\"LLAMA 3.2 COMMUNITY LICENSE AGREEMENT\\nLlama 3.2 Version + Release Date: September 25, 2024\\n\\n\u201CAgreement\u201D means the terms + and conditions for use, reproduction, distribution \\nand modification of the + Llama Materials set forth herein.\\n\\n\u201CDocumentation\u201D means the specifications, + manuals and documentation accompanying Llama 3.2\\ndistributed by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D + or \u201Cyou\u201D means you, or your employer or any other person or entity + (if you are \\nentering into this Agreement on such person or entity\u2019s + behalf), of the age required under\\napplicable laws, rules or regulations to + provide legal consent and that has legal authority\\nto bind your employer or + such other person or entity if you are entering in this Agreement\\non their + behalf.\\n\\n\u201CLlama 3.2\u201D means the foundational large language models + and software and algorithms, including\\nmachine-learning model code, trained + model weights, inference-enabling code, training-enabling code,\\nfine-tuning + enabling code and other elements of the foregoing distributed by Meta at \\nhttps://www.llama.com/llama-downloads.\\n\\n\u201CLlama + Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.2 and Documentation + (and \\nany portion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D + or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in + or, \\nif you are an entity, your principal place of business is in the EEA + or Switzerland) \\nand Meta Platforms, Inc. (if you are located outside of the + EEA or Switzerland). \\n\\n\\nBy clicking \u201CI Accept\u201D below or by using + or distributing any portion or element of the Llama Materials,\\nyou agree to + be bound by this Agreement.\\n\\n\\n1. License Rights and Redistribution.\\n\\n + \ a. Grant of Rights. You are granted a non-exclusive, worldwide, \\nnon-transferable + and royalty-free limited license under Meta\u2019s intellectual property or + other rights \\nowned by Meta embodied in the Llama Materials to use, reproduce, + distribute, copy, create derivative works \\nof, and make modifications to the + Llama Materials. \\n\\n b. Redistribution and Use. \\n\\n i. If + you distribute or make available the Llama Materials (or any derivative works + thereof), \\nor a product or service (including another AI model) that contains + any of them, you shall (A) provide\\na copy of this Agreement with any such + Llama Materials; and (B) prominently display \u201CBuilt with Llama\u201D\\non + a related website, user interface, blogpost, about page, or product documentation. + If you use the\\nLlama Materials or any outputs or results of the Llama Materials + to create, train, fine tune, or\\notherwise improve an AI model, which is distributed + or made available, you shall also include \u201CLlama\u201D\\nat the beginning + of any such AI model name.\\n\\n ii. If you receive Llama Materials, + or any derivative works thereof, from a Licensee as part\\nof an integrated + end user product, then Section 2 of this Agreement will not apply to you. \\n\\n + \ iii. You must retain in all copies of the Llama Materials that you distribute + the \\nfollowing attribution notice within a \u201CNotice\u201D text file distributed + as a part of such copies: \\n\u201CLlama 3.2 is licensed under the Llama 3.2 + Community License, Copyright \xA9 Meta Platforms,\\nInc. All Rights Reserved.\u201D\\n\\n + \ iv. Your use of the Llama Materials must comply with applicable laws + and regulations\\n(including trade compliance laws and regulations) and adhere + to the Acceptable Use Policy for\\nthe Llama Materials (available at https://www.llama.com/llama3_2/use-policy), + which is hereby \\nincorporated by reference into this Agreement.\\n \\n2. + Additional Commercial Terms. If, on the Llama 3.2 version release date, the + monthly active users\\nof the products or services made available by or for + Licensee, or Licensee\u2019s affiliates, \\nis greater than 700 million monthly + active users in the preceding calendar month, you must request \\na license + from Meta, which Meta may grant to you in its sole discretion, and you are not + authorized to\\nexercise any of the rights under this Agreement unless or until + Meta otherwise expressly grants you such rights.\\n\\n3. Disclaimer of Warranty. + UNLESS REQUIRED BY APPLICABLE LAW, THE LLAMA MATERIALS AND ANY OUTPUT AND \\nRESULTS + THEREFROM ARE PROVIDED ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF + ANY KIND, AND META DISCLAIMS\\nALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND + IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES\\nOF TITLE, NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE\\nFOR + DETERMINING THE APPROPRIATENESS OF USING OR REDISTRIBUTING THE LLAMA MATERIALS + AND ASSUME ANY RISKS ASSOCIATED\\nWITH YOUR USE OF THE LLAMA MATERIALS AND ANY + OUTPUT AND RESULTS.\\n\\n4. Limitation of Liability. IN NO EVENT WILL META OR + ITS AFFILIATES BE LIABLE UNDER ANY THEORY OF LIABILITY, \\nWHETHER IN CONTRACT, + TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR OTHERWISE, ARISING OUT OF THIS AGREEMENT, + \\nFOR ANY LOST PROFITS OR ANY INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL, + EXEMPLARY OR PUNITIVE DAMAGES, EVEN \\nIF META OR ITS AFFILIATES HAVE BEEN ADVISED + OF THE POSSIBILITY OF ANY OF THE FOREGOING.\\n\\n5. Intellectual Property.\\n\\n + \ a. No trademark licenses are granted under this Agreement, and in connection + with the Llama Materials, \\nneither Meta nor Licensee may use any name or mark + owned by or associated with the other or any of its affiliates, \\nexcept as + required for reasonable and customary use in describing and redistributing the + Llama Materials or as \\nset forth in this Section 5(a). Meta hereby grants + you a license to use \u201CLlama\u201D (the \u201CMark\u201D) solely as required + \\nto comply with the last sentence of Section 1.b.i. You will comply with Meta\u2019s + brand guidelines (currently accessible \\nat https://about.meta.com/brand/resources/meta/company-brand/). + All goodwill arising out of your use of the Mark \\nwill inure to the benefit + of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and + derivatives made by or for Meta, with respect to any\\n derivative works + and modifications of the Llama Materials that are made by you, as between you + and Meta,\\n you are and will be the owner of such derivative works and modifications.\\n\\n + \ c. If you institute litigation or other proceedings against Meta or any + entity (including a cross-claim or\\n counterclaim in a lawsuit) alleging + that the Llama Materials or Llama 3.2 outputs or results, or any portion\\n + \ of any of the foregoing, constitutes infringement of intellectual property + or other rights owned or licensable\\n by you, then any licenses granted + to you under this Agreement shall terminate as of the date such litigation or\\n + \ claim is filed or instituted. You will indemnify and hold harmless Meta + from and against any claim by any third\\n party arising out of or related + to your use or distribution of the Llama Materials.\\n\\n6. Term and Termination. + The term of this Agreement will commence upon your acceptance of this Agreement + or access\\nto the Llama Materials and will continue in full force and effect + until terminated in accordance with the terms\\nand conditions herein. Meta + may terminate this Agreement if you are in breach of any term or condition of + this\\nAgreement. Upon termination of this Agreement, you shall delete and cease + use of the Llama Materials. Sections 3,\\n4 and 7 shall survive the termination + of this Agreement. \\n\\n7. Governing Law and Jurisdiction. This Agreement will + be governed and construed under the laws of the State of \\nCalifornia without + regard to choice of law principles, and the UN Convention on Contracts for the + International\\nSale of Goods does not apply to this Agreement. The courts of + California shall have exclusive jurisdiction of\\nany dispute arising out of + this Agreement.\\n**Llama 3.2** **Acceptable Use Policy**\\n\\nMeta is committed + to promoting safe and fair use of its tools and features, including Llama 3.2. + If you access or use Llama 3.2, you agree to this Acceptable Use Policy (\u201C**Policy**\u201D). + The most recent copy of this policy can be found at [https://www.llama.com/llama3_2/use-policy](https://www.llama.com/llama3_2/use-policy).\\n\\n**Prohibited + Uses**\\n\\nWe want everyone to use Llama 3.2 safely and responsibly. You agree + you will not use, or allow others to use, Llama 3.2 to:\\n\\n\\n\\n1. Violate + the law or others\u2019 rights, including to:\\n 1. Engage in, promote, generate, + contribute to, encourage, plan, incite, or further illegal or unlawful activity + or content, such as:\\n 1. Violence or terrorism\\n 2. Exploitation + or harm to children, including the solicitation, creation, acquisition, or dissemination + of child exploitative content or failure to report Child Sexual Abuse Material\\n + \ 3. Human trafficking, exploitation, and sexual violence\\n 4. + The illegal distribution of information or materials to minors, including obscene + materials, or failure to employ legally required age-gating in connection with + such information or materials.\\n 5. Sexual solicitation\\n 6. + Any other criminal activity\\n 1. Engage in, promote, incite, or facilitate + the harassment, abuse, threatening, or bullying of individuals or groups of + individuals\\n 2. Engage in, promote, incite, or facilitate discrimination + or other unlawful or harmful conduct in the provision of employment, employment + benefits, credit, housing, other economic benefits, or other essential goods + and services\\n 3. Engage in the unauthorized or unlicensed practice of any + profession including, but not limited to, financial, legal, medical/health, + or related professional practices\\n 4. Collect, process, disclose, generate, + or infer private or sensitive information about individuals, including information + about individuals\u2019 identity, health, or demographic information, unless + you have obtained the right to do so in accordance with applicable law\\n 5. + Engage in or facilitate any action or generate any content that infringes, misappropriates, + or otherwise violates any third-party rights, including the outputs or results + of any products or services using the Llama Materials\\n 6. Create, generate, + or facilitate the creation of malicious code, malware, computer viruses or do + anything else that could disable, overburden, interfere with or impair the proper + working, integrity, operation or appearance of a website or computer system\\n + \ 7. Engage in any action, or facilitate any action, to intentionally circumvent + or remove usage restrictions or other safety measures, or to enable functionality + disabled by Meta\\n2. Engage in, promote, incite, facilitate, or assist in the + planning or development of activities that present a risk of death or bodily + harm to individuals, including use of Llama 3.2 related to the following:\\n + \ 8. Military, warfare, nuclear industries or applications, espionage, use + for materials or activities that are subject to the International Traffic Arms + Regulations (ITAR) maintained by the United States Department of State or to + the U.S. Biological Weapons Anti-Terrorism Act of 1989 or the Chemical Weapons + Convention Implementation Act of 1997\\n 9. Guns and illegal weapons (including + weapon development)\\n 10. Illegal drugs and regulated/controlled substances\\n + \ 11. Operation of critical infrastructure, transportation technologies, or + heavy machinery\\n 12. Self-harm or harm to others, including suicide, cutting, + and eating disorders\\n 13. Any content intended to incite or promote violence, + abuse, or any infliction of bodily harm to an individual\\n3. Intentionally + deceive or mislead others, including use of Llama 3.2 related to the following:\\n + \ 14. Generating, promoting, or furthering fraud or the creation or promotion + of disinformation\\n 15. Generating, promoting, or furthering defamatory + content, including the creation of defamatory statements, images, or other content\\n + \ 16. Generating, promoting, or further distributing spam\\n 17. Impersonating + another individual without consent, authorization, or legal right\\n 18. + Representing that the use of Llama 3.2 or outputs are human-generated\\n 19. + Generating or facilitating false online engagement, including fake reviews and + other means of fake online engagement\\n4. Fail to appropriately disclose to + end users any known dangers of your AI system\\n5. Interact with third party + tools, models, or software designed to generate unlawful content or engage in + unlawful or harmful conduct and/or represent that the outputs of such tools, + models, or software are associated with Meta or Llama 3.2\\n\\nWith respect + to any multimodal models included in Llama 3.2, the rights granted under Section + 1(a) of the Llama 3.2 Community License Agreement are not being granted to you + if you are an individual domiciled in, or a company with a principal place of + business in, the European Union. This restriction does not apply to end users + of a product or service that incorporates any such multimodal models.\\n\\nPlease + report any violation of this Policy, software \u201Cbug,\u201D or other problems + that could lead to a violation of this Policy through one of the following means:\\n\\n\\n\\n* + Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://l.workplace.com/l.php?u=https%3A%2F%2Fgithub.com%2Fmeta-llama%2Fllama-models%2Fissues\\u0026h=AT0qV8W9BFT6NwihiOHRuKYQM_UnkzN_NmHMy91OT55gkLpgi4kQupHUl0ssR4dQsIQ8n3tfd0vtkobvsEvt1l4Ic6GXI2EeuHV8N08OG2WnbAmm0FL4ObkazC6G_256vN0lN9DsykCvCqGZ)\\n* + Reporting risky content generated by the model: [developers.facebook.com/llama_output_feedback](http://developers.facebook.com/llama_output_feedback)\\n* + Reporting bugs and security concerns: [facebook.com/whitehat/info](http://facebook.com/whitehat/info)\\n* + Reporting violations of the Acceptable Use Policy or unlicensed uses of Llama + 3.2: LlamaUseReport@meta.com\",\"modelfile\":\"# Modelfile generated by \\\"ollama + show\\\"\\n# To build a new Modelfile based on this, replace FROM with:\\n# + FROM llama3.2:3b\\n\\nFROM /Users/joaomoura/.ollama/models/blobs/sha256-dde5aa3fc5ffc17176b5e8bdc82f587b24b2678c6c66101bf7da77af9f7ccdff\\nTEMPLATE + \\\"\\\"\\\"\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\nCutting + Knowledge Date: December 2023\\n\\n{{ if .System }}{{ .System }}\\n{{- end }}\\n{{- + if .Tools }}When you receive a tool call response, use the output to format + an answer to the orginal user question.\\n\\nYou are a helpful assistant with + tool calling capabilities.\\n{{- end }}\\u003c|eot_id|\\u003e\\n{{- range $i, + $_ := .Messages }}\\n{{- $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- + if eq .Role \\\"user\\\" }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- + if and $.Tools $last }}\\n\\nGiven the following functions, please respond with + a JSON for a function call with its proper arguments that best answers the given + prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": + dictionary of argument name and its value}. Do not use variables.\\n\\n{{ range + $.Tools }}\\n{{- . }}\\n{{ end }}\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- + else }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- end }}{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- + if .ToolCalls }}\\n{{ range .ToolCalls }}\\n{\\\"name\\\": \\\"{{ .Function.Name + }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ + .Content }}\\n{{- end }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- + else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ + .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- end }}\\n{{- end }}\\\"\\\"\\\"\\nPARAMETER stop \\u003c|start_header_id|\\u003e\\nPARAMETER + stop \\u003c|end_header_id|\\u003e\\nPARAMETER stop \\u003c|eot_id|\\u003e\\nLICENSE + \\\"LLAMA 3.2 COMMUNITY LICENSE AGREEMENT\\nLlama 3.2 Version Release Date: + September 25, 2024\\n\\n\u201CAgreement\u201D means the terms and conditions + for use, reproduction, distribution \\nand modification of the Llama Materials + set forth herein.\\n\\n\u201CDocumentation\u201D means the specifications, manuals + and documentation accompanying Llama 3.2\\ndistributed by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D + or \u201Cyou\u201D means you, or your employer or any other person or entity + (if you are \\nentering into this Agreement on such person or entity\u2019s + behalf), of the age required under\\napplicable laws, rules or regulations to + provide legal consent and that has legal authority\\nto bind your employer or + such other person or entity if you are entering in this Agreement\\non their + behalf.\\n\\n\u201CLlama 3.2\u201D means the foundational large language models + and software and algorithms, including\\nmachine-learning model code, trained + model weights, inference-enabling code, training-enabling code,\\nfine-tuning + enabling code and other elements of the foregoing distributed by Meta at \\nhttps://www.llama.com/llama-downloads.\\n\\n\u201CLlama + Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.2 and Documentation + (and \\nany portion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D + or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in + or, \\nif you are an entity, your principal place of business is in the EEA + or Switzerland) \\nand Meta Platforms, Inc. (if you are located outside of the + EEA or Switzerland). \\n\\n\\nBy clicking \u201CI Accept\u201D below or by using + or distributing any portion or element of the Llama Materials,\\nyou agree to + be bound by this Agreement.\\n\\n\\n1. License Rights and Redistribution.\\n\\n + \ a. Grant of Rights. You are granted a non-exclusive, worldwide, \\nnon-transferable + and royalty-free limited license under Meta\u2019s intellectual property or + other rights \\nowned by Meta embodied in the Llama Materials to use, reproduce, + distribute, copy, create derivative works \\nof, and make modifications to the + Llama Materials. \\n\\n b. Redistribution and Use. \\n\\n i. If + you distribute or make available the Llama Materials (or any derivative works + thereof), \\nor a product or service (including another AI model) that contains + any of them, you shall (A) provide\\na copy of this Agreement with any such + Llama Materials; and (B) prominently display \u201CBuilt with Llama\u201D\\non + a related website, user interface, blogpost, about page, or product documentation. + If you use the\\nLlama Materials or any outputs or results of the Llama Materials + to create, train, fine tune, or\\notherwise improve an AI model, which is distributed + or made available, you shall also include \u201CLlama\u201D\\nat the beginning + of any such AI model name.\\n\\n ii. If you receive Llama Materials, + or any derivative works thereof, from a Licensee as part\\nof an integrated + end user product, then Section 2 of this Agreement will not apply to you. \\n\\n + \ iii. You must retain in all copies of the Llama Materials that you distribute + the \\nfollowing attribution notice within a \u201CNotice\u201D text file distributed + as a part of such copies: \\n\u201CLlama 3.2 is licensed under the Llama 3.2 + Community License, Copyright \xA9 Meta Platforms,\\nInc. All Rights Reserved.\u201D\\n\\n + \ iv. Your use of the Llama Materials must comply with applicable laws + and regulations\\n(including trade compliance laws and regulations) and adhere + to the Acceptable Use Policy for\\nthe Llama Materials (available at https://www.llama.com/llama3_2/use-policy), + which is hereby \\nincorporated by reference into this Agreement.\\n \\n2. + Additional Commercial Terms. If, on the Llama 3.2 version release date, the + monthly active users\\nof the products or services made available by or for + Licensee, or Licensee\u2019s affiliates, \\nis greater than 700 million monthly + active users in the preceding calendar month, you must request \\na license + from Meta, which Meta may grant to you in its sole discretion, and you are not + authorized to\\nexercise any of the rights under this Agreement unless or until + Meta otherwise expressly grants you such rights.\\n\\n3. Disclaimer of Warranty. + UNLESS REQUIRED BY APPLICABLE LAW, THE LLAMA MATERIALS AND ANY OUTPUT AND \\nRESULTS + THEREFROM ARE PROVIDED ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF + ANY KIND, AND META DISCLAIMS\\nALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND + IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES\\nOF TITLE, NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE\\nFOR + DETERMINING THE APPROPRIATENESS OF USING OR REDISTRIBUTING THE LLAMA MATERIALS + AND ASSUME ANY RISKS ASSOCIATED\\nWITH YOUR USE OF THE LLAMA MATERIALS AND ANY + OUTPUT AND RESULTS.\\n\\n4. Limitation of Liability. IN NO EVENT WILL META OR + ITS AFFILIATES BE LIABLE UNDER ANY THEORY OF LIABILITY, \\nWHETHER IN CONTRACT, + TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR OTHERWISE, ARISING OUT OF THIS AGREEMENT, + \\nFOR ANY LOST PROFITS OR ANY INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL, + EXEMPLARY OR PUNITIVE DAMAGES, EVEN \\nIF META OR ITS AFFILIATES HAVE BEEN ADVISED + OF THE POSSIBILITY OF ANY OF THE FOREGOING.\\n\\n5. Intellectual Property.\\n\\n + \ a. No trademark licenses are granted under this Agreement, and in connection + with the Llama Materials, \\nneither Meta nor Licensee may use any name or mark + owned by or associated with the other or any of its affiliates, \\nexcept as + required for reasonable and customary use in describing and redistributing the + Llama Materials or as \\nset forth in this Section 5(a). Meta hereby grants + you a license to use \u201CLlama\u201D (the \u201CMark\u201D) solely as required + \\nto comply with the last sentence of Section 1.b.i. You will comply with Meta\u2019s + brand guidelines (currently accessible \\nat https://about.meta.com/brand/resources/meta/company-brand/). + All goodwill arising out of your use of the Mark \\nwill inure to the benefit + of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and + derivatives made by or for Meta, with respect to any\\n derivative works + and modifications of the Llama Materials that are made by you, as between you + and Meta,\\n you are and will be the owner of such derivative works and modifications.\\n\\n + \ c. If you institute litigation or other proceedings against Meta or any + entity (including a cross-claim or\\n counterclaim in a lawsuit) alleging + that the Llama Materials or Llama 3.2 outputs or results, or any portion\\n + \ of any of the foregoing, constitutes infringement of intellectual property + or other rights owned or licensable\\n by you, then any licenses granted + to you under this Agreement shall terminate as of the date such litigation or\\n + \ claim is filed or instituted. You will indemnify and hold harmless Meta + from and against any claim by any third\\n party arising out of or related + to your use or distribution of the Llama Materials.\\n\\n6. Term and Termination. + The term of this Agreement will commence upon your acceptance of this Agreement + or access\\nto the Llama Materials and will continue in full force and effect + until terminated in accordance with the terms\\nand conditions herein. Meta + may terminate this Agreement if you are in breach of any term or condition of + this\\nAgreement. Upon termination of this Agreement, you shall delete and cease + use of the Llama Materials. Sections 3,\\n4 and 7 shall survive the termination + of this Agreement. \\n\\n7. Governing Law and Jurisdiction. This Agreement will + be governed and construed under the laws of the State of \\nCalifornia without + regard to choice of law principles, and the UN Convention on Contracts for the + International\\nSale of Goods does not apply to this Agreement. The courts of + California shall have exclusive jurisdiction of\\nany dispute arising out of + this Agreement.\\\"\\nLICENSE \\\"**Llama 3.2** **Acceptable Use Policy**\\n\\nMeta + is committed to promoting safe and fair use of its tools and features, including + Llama 3.2. If you access or use Llama 3.2, you agree to this Acceptable Use + Policy (\u201C**Policy**\u201D). The most recent copy of this policy can be + found at [https://www.llama.com/llama3_2/use-policy](https://www.llama.com/llama3_2/use-policy).\\n\\n**Prohibited + Uses**\\n\\nWe want everyone to use Llama 3.2 safely and responsibly. You agree + you will not use, or allow others to use, Llama 3.2 to:\\n\\n\\n\\n1. Violate + the law or others\u2019 rights, including to:\\n 1. Engage in, promote, generate, + contribute to, encourage, plan, incite, or further illegal or unlawful activity + or content, such as:\\n 1. Violence or terrorism\\n 2. Exploitation + or harm to children, including the solicitation, creation, acquisition, or dissemination + of child exploitative content or failure to report Child Sexual Abuse Material\\n + \ 3. Human trafficking, exploitation, and sexual violence\\n 4. + The illegal distribution of information or materials to minors, including obscene + materials, or failure to employ legally required age-gating in connection with + such information or materials.\\n 5. Sexual solicitation\\n 6. + Any other criminal activity\\n 1. Engage in, promote, incite, or facilitate + the harassment, abuse, threatening, or bullying of individuals or groups of + individuals\\n 2. Engage in, promote, incite, or facilitate discrimination + or other unlawful or harmful conduct in the provision of employment, employment + benefits, credit, housing, other economic benefits, or other essential goods + and services\\n 3. Engage in the unauthorized or unlicensed practice of any + profession including, but not limited to, financial, legal, medical/health, + or related professional practices\\n 4. Collect, process, disclose, generate, + or infer private or sensitive information about individuals, including information + about individuals\u2019 identity, health, or demographic information, unless + you have obtained the right to do so in accordance with applicable law\\n 5. + Engage in or facilitate any action or generate any content that infringes, misappropriates, + or otherwise violates any third-party rights, including the outputs or results + of any products or services using the Llama Materials\\n 6. Create, generate, + or facilitate the creation of malicious code, malware, computer viruses or do + anything else that could disable, overburden, interfere with or impair the proper + working, integrity, operation or appearance of a website or computer system\\n + \ 7. Engage in any action, or facilitate any action, to intentionally circumvent + or remove usage restrictions or other safety measures, or to enable functionality + disabled by Meta\\n2. Engage in, promote, incite, facilitate, or assist in the + planning or development of activities that present a risk of death or bodily + harm to individuals, including use of Llama 3.2 related to the following:\\n + \ 8. Military, warfare, nuclear industries or applications, espionage, use + for materials or activities that are subject to the International Traffic Arms + Regulations (ITAR) maintained by the United States Department of State or to + the U.S. Biological Weapons Anti-Terrorism Act of 1989 or the Chemical Weapons + Convention Implementation Act of 1997\\n 9. Guns and illegal weapons (including + weapon development)\\n 10. Illegal drugs and regulated/controlled substances\\n + \ 11. Operation of critical infrastructure, transportation technologies, or + heavy machinery\\n 12. Self-harm or harm to others, including suicide, cutting, + and eating disorders\\n 13. Any content intended to incite or promote violence, + abuse, or any infliction of bodily harm to an individual\\n3. Intentionally + deceive or mislead others, including use of Llama 3.2 related to the following:\\n + \ 14. Generating, promoting, or furthering fraud or the creation or promotion + of disinformation\\n 15. Generating, promoting, or furthering defamatory + content, including the creation of defamatory statements, images, or other content\\n + \ 16. Generating, promoting, or further distributing spam\\n 17. Impersonating + another individual without consent, authorization, or legal right\\n 18. + Representing that the use of Llama 3.2 or outputs are human-generated\\n 19. + Generating or facilitating false online engagement, including fake reviews and + other means of fake online engagement\\n4. Fail to appropriately disclose to + end users any known dangers of your AI system\\n5. Interact with third party + tools, models, or software designed to generate unlawful content or engage in + unlawful or harmful conduct and/or represent that the outputs of such tools, + models, or software are associated with Meta or Llama 3.2\\n\\nWith respect + to any multimodal models included in Llama 3.2, the rights granted under Section + 1(a) of the Llama 3.2 Community License Agreement are not being granted to you + if you are an individual domiciled in, or a company with a principal place of + business in, the European Union. This restriction does not apply to end users + of a product or service that incorporates any such multimodal models.\\n\\nPlease + report any violation of this Policy, software \u201Cbug,\u201D or other problems + that could lead to a violation of this Policy through one of the following means:\\n\\n\\n\\n* + Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://l.workplace.com/l.php?u=https%3A%2F%2Fgithub.com%2Fmeta-llama%2Fllama-models%2Fissues\\u0026h=AT0qV8W9BFT6NwihiOHRuKYQM_UnkzN_NmHMy91OT55gkLpgi4kQupHUl0ssR4dQsIQ8n3tfd0vtkobvsEvt1l4Ic6GXI2EeuHV8N08OG2WnbAmm0FL4ObkazC6G_256vN0lN9DsykCvCqGZ)\\n* + Reporting risky content generated by the model: [developers.facebook.com/llama_output_feedback](http://developers.facebook.com/llama_output_feedback)\\n* + Reporting bugs and security concerns: [facebook.com/whitehat/info](http://facebook.com/whitehat/info)\\n* + Reporting violations of the Acceptable Use Policy or unlicensed uses of Llama + 3.2: LlamaUseReport@meta.com\\\"\\n\",\"parameters\":\"stop \\\"\\u003c|start_header_id|\\u003e\\\"\\nstop + \ \\\"\\u003c|end_header_id|\\u003e\\\"\\nstop \\\"\\u003c|eot_id|\\u003e\\\"\",\"template\":\"\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\nCutting + Knowledge Date: December 2023\\n\\n{{ if .System }}{{ .System }}\\n{{- end }}\\n{{- + if .Tools }}When you receive a tool call response, use the output to format + an answer to the orginal user question.\\n\\nYou are a helpful assistant with + tool calling capabilities.\\n{{- end }}\\u003c|eot_id|\\u003e\\n{{- range $i, + $_ := .Messages }}\\n{{- $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- + if eq .Role \\\"user\\\" }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- + if and $.Tools $last }}\\n\\nGiven the following functions, please respond with + a JSON for a function call with its proper arguments that best answers the given + prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": + dictionary of argument name and its value}. Do not use variables.\\n\\n{{ range + $.Tools }}\\n{{- . }}\\n{{ end }}\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- + else }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- end }}{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- + if .ToolCalls }}\\n{{ range .ToolCalls }}\\n{\\\"name\\\": \\\"{{ .Function.Name + }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ + .Content }}\\n{{- end }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- + else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ + .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- end }}\\n{{- end }}\",\"details\":{\"parent_model\":\"\",\"format\":\"gguf\",\"family\":\"llama\",\"families\":[\"llama\"],\"parameter_size\":\"3.2B\",\"quantization_level\":\"Q4_K_M\"},\"model_info\":{\"general.architecture\":\"llama\",\"general.basename\":\"Llama-3.2\",\"general.file_type\":15,\"general.finetune\":\"Instruct\",\"general.languages\":[\"en\",\"de\",\"fr\",\"it\",\"pt\",\"hi\",\"es\",\"th\"],\"general.parameter_count\":3212749888,\"general.quantization_version\":2,\"general.size_label\":\"3B\",\"general.tags\":[\"facebook\",\"meta\",\"pytorch\",\"llama\",\"llama-3\",\"text-generation\"],\"general.type\":\"model\",\"llama.attention.head_count\":24,\"llama.attention.head_count_kv\":8,\"llama.attention.key_length\":128,\"llama.attention.layer_norm_rms_epsilon\":0.00001,\"llama.attention.value_length\":128,\"llama.block_count\":28,\"llama.context_length\":131072,\"llama.embedding_length\":3072,\"llama.feed_forward_length\":8192,\"llama.rope.dimension_count\":128,\"llama.rope.freq_base\":500000,\"llama.vocab_size\":128256,\"tokenizer.ggml.bos_token_id\":128000,\"tokenizer.ggml.eos_token_id\":128009,\"tokenizer.ggml.merges\":null,\"tokenizer.ggml.model\":\"gpt2\",\"tokenizer.ggml.pre\":\"llama-bpe\",\"tokenizer.ggml.token_type\":null,\"tokenizer.ggml.tokens\":null},\"modified_at\":\"2025-02-20T18:55:09.150577031-08:00\"}" + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Fri, 21 Feb 2025 02:57:55 GMT + Transfer-Encoding: + - chunked + http_version: HTTP/1.1 + status_code: 200 - request: body: '{"model": "llama3.1", "prompt": "### System:\nPlease convert the following text into valid JSON.\n\nOutput ONLY the valid JSON and nothing else.\n\nThe JSON must follow this format exactly:\n{\n \"name\": str,\n \"age\": int\n}\n\n### User:\nName: Alice Llama, Age: 30\n\n", "options": {"stop": []}, "stream": false}' headers: - Accept: + accept: - '*/*' - Accept-Encoding: + accept-encoding: - gzip, deflate - Connection: + connection: - keep-alive - Content-Length: + content-length: - '318' - Content-Type: - - application/json - User-Agent: - - python-requests/2.32.2 + host: + - localhost:11434 + user-agent: + - litellm/1.60.2 method: POST uri: http://localhost:11434/api/generate response: - body: - string: '{"model":"llama3.1","created_at":"2025-02-18T21:52:24.555211Z","response":"{\n \"name\": - \"Alice Llama\", \n \"age\": 30\n}","done":true,"done_reason":"stop","context":[128006,882,128007,271,14711,744,512,5618,5625,279,2768,1495,1139,2764,4823,382,5207,27785,279,2764,4823,323,4400,775,382,791,4823,2011,1833,420,3645,7041,512,517,220,330,609,794,610,345,220,330,425,794,528,198,633,14711,2724,512,678,25,30505,445,81101,11,13381,25,220,966,271,128009,128006,78191,128007,271,517,220,330,609,794,330,62786,445,81101,498,720,220,330,425,794,220,966,198,92],"total_duration":3449060375,"load_duration":806464375,"prompt_eval_count":67,"prompt_eval_duration":2065000000,"eval_count":20,"eval_duration":576000000}' + content: '{"model":"llama3.1","created_at":"2025-02-21T02:58:15.591873Z","response":"```\n{\n \"name\": + \"Alice Llama\",\n \"age\": 30\n}\n```","done":true,"done_reason":"stop","context":[128006,882,128007,271,14711,744,512,5618,5625,279,2768,1495,1139,2764,4823,382,5207,27785,279,2764,4823,323,4400,775,382,791,4823,2011,1833,420,3645,7041,512,517,220,330,609,794,610,345,220,330,425,794,528,198,633,14711,2724,512,678,25,30505,445,81101,11,13381,25,220,966,271,128009,128006,78191,128007,271,14196,4077,517,220,330,609,794,330,62786,445,81101,761,220,330,425,794,220,966,198,534,74694],"total_duration":20230916375,"load_duration":11878250500,"prompt_eval_count":67,"prompt_eval_duration":7472000000,"eval_count":22,"eval_duration":877000000}' headers: Content-Length: - - '711' + - '737' Content-Type: - application/json; charset=utf-8 Date: - - Tue, 18 Feb 2025 21:52:24 GMT - status: - code: 200 - message: OK + - Fri, 21 Feb 2025 02:58:15 GMT + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"name": "llama3.1"}' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '20' + content-type: + - application/json + host: + - localhost:11434 + user-agent: + - litellm/1.60.2 + method: POST + uri: http://localhost:11434/api/show + response: + content: "{\"license\":\"LLAMA 3.1 COMMUNITY LICENSE AGREEMENT\\nLlama 3.1 Version + Release Date: July 23, 2024\\n\\n\u201CAgreement\u201D means the terms and conditions + for use, reproduction, distribution and modification of the\\nLlama Materials + set forth herein.\\n\\n\u201CDocumentation\u201D means the specifications, manuals + and documentation accompanying Llama 3.1\\ndistributed by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D + or \u201Cyou\u201D means you, or your employer or any other person or entity + (if you are entering into\\nthis Agreement on such person or entity\u2019s behalf), + of the age required under applicable laws, rules or\\nregulations to provide + legal consent and that has legal authority to bind your employer or such other\\nperson + or entity if you are entering in this Agreement on their behalf.\\n\\n\u201CLlama + 3.1\u201D means the foundational large language models and software and algorithms, + including\\nmachine-learning model code, trained model weights, inference-enabling + code, training-enabling code,\\nfine-tuning enabling code and other elements + of the foregoing distributed by Meta at\\nhttps://llama.meta.com/llama-downloads.\\n\\n\u201CLlama + Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.1 and Documentation + (and any\\nportion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D + or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in + or, if you are an entity, your\\nprincipal place of business is in the EEA or + Switzerland) and Meta Platforms, Inc. (if you are located\\noutside of the EEA + or Switzerland).\\n\\nBy clicking \u201CI Accept\u201D below or by using or + distributing any portion or element of the Llama Materials,\\nyou agree to be + bound by this Agreement.\\n\\n1. License Rights and Redistribution.\\n\\n a. + Grant of Rights. You are granted a non-exclusive, worldwide, non-transferable + and royalty-free\\nlimited license under Meta\u2019s intellectual property or + other rights owned by Meta embodied in the Llama\\nMaterials to use, reproduce, + distribute, copy, create derivative works of, and make modifications to the\\nLlama + Materials.\\n\\n b. Redistribution and Use.\\n\\n i. If you distribute + or make available the Llama Materials (or any derivative works\\nthereof), or + a product or service (including another AI model) that contains any of them, + you shall (A)\\nprovide a copy of this Agreement with any such Llama Materials; + and (B) prominently display \u201CBuilt with\\nLlama\u201D on a related website, + user interface, blogpost, about page, or product documentation. If you use\\nthe + Llama Materials or any outputs or results of the Llama Materials to create, + train, fine tune, or\\notherwise improve an AI model, which is distributed or + made available, you shall also include \u201CLlama\u201D at\\nthe beginning + of any such AI model name.\\n\\n ii. If you receive Llama Materials, or + any derivative works thereof, from a Licensee as part \\nof an integrated end + user product, then Section 2 of this Agreement will not apply to you.\\n\\n + \ iii. You must retain in all copies of the Llama Materials that you distribute + the following\\nattribution notice within a \u201CNotice\u201D text file distributed + as a part of such copies: \u201CLlama 3.1 is\\nlicensed under the Llama 3.1 + Community License, Copyright \xA9 Meta Platforms, Inc. All Rights\\nReserved.\u201D\\n\\n + \ iv. Your use of the Llama Materials must comply with applicable laws and + regulations\\n(including trade compliance laws and regulations) and adhere to + the Acceptable Use Policy for the Llama\\nMaterials (available at https://llama.meta.com/llama3_1/use-policy), + which is hereby incorporated by\\nreference into this Agreement.\\n\\n2. Additional + Commercial Terms. If, on the Llama 3.1 version release date, the monthly active + users\\nof the products or services made available by or for Licensee, or Licensee\u2019s + affiliates, is greater than 700\\nmillion monthly active users in the preceding + calendar month, you must request a license from Meta,\\nwhich Meta may grant + to you in its sole discretion, and you are not authorized to exercise any of + the\\nrights under this Agreement unless or until Meta otherwise expressly grants + you such rights.\\n\\n3. Disclaimer of Warranty. UNLESS REQUIRED BY APPLICABLE + LAW, THE LLAMA MATERIALS AND ANY\\nOUTPUT AND RESULTS THEREFROM ARE PROVIDED + ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF\\nANY KIND, AND META DISCLAIMS + ALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND IMPLIED,\\nINCLUDING, WITHOUT LIMITATION, + ANY WARRANTIES OF TITLE, NON-INFRINGEMENT,\\nMERCHANTABILITY, OR FITNESS FOR + A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE FOR\\nDETERMINING THE APPROPRIATENESS + OF USING OR REDISTRIBUTING THE LLAMA MATERIALS AND\\nASSUME ANY RISKS ASSOCIATED + WITH YOUR USE OF THE LLAMA MATERIALS AND ANY OUTPUT AND\\nRESULTS.\\n\\n4. Limitation + of Liability. IN NO EVENT WILL META OR ITS AFFILIATES BE LIABLE UNDER ANY THEORY + OF\\nLIABILITY, WHETHER IN CONTRACT, TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR + OTHERWISE, ARISING\\nOUT OF THIS AGREEMENT, FOR ANY LOST PROFITS OR ANY INDIRECT, + SPECIAL, CONSEQUENTIAL,\\nINCIDENTAL, EXEMPLARY OR PUNITIVE DAMAGES, EVEN IF + META OR ITS AFFILIATES HAVE BEEN ADVISED\\nOF THE POSSIBILITY OF ANY OF THE + FOREGOING.\\n\\n5. Intellectual Property.\\n\\n a. No trademark licenses are + granted under this Agreement, and in connection with the Llama\\nMaterials, + neither Meta nor Licensee may use any name or mark owned by or associated with + the other\\nor any of its affiliates, except as required for reasonable and + customary use in describing and\\nredistributing the Llama Materials or as set + forth in this Section 5(a). Meta hereby grants you a license to\\nuse \u201CLlama\u201D + (the \u201CMark\u201D) solely as required to comply with the last sentence of + Section 1.b.i. You will\\ncomply with Meta\u2019s brand guidelines (currently + accessible at\\nhttps://about.meta.com/brand/resources/meta/company-brand/ ). + All goodwill arising out of your use\\nof the Mark will inure to the benefit + of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and derivatives + made by or for Meta, with\\nrespect to any derivative works and modifications + of the Llama Materials that are made by you, as\\nbetween you and Meta, you + are and will be the owner of such derivative works and modifications.\\n\\n + \ c. If you institute litigation or other proceedings against Meta or any entity + (including a\\ncross-claim or counterclaim in a lawsuit) alleging that the Llama + Materials or Llama 3.1 outputs or\\nresults, or any portion of any of the foregoing, + constitutes infringement of intellectual property or other\\nrights owned or + licensable by you, then any licenses granted to you under this Agreement shall\\nterminate + as of the date such litigation or claim is filed or instituted. You will indemnify + and hold\\nharmless Meta from and against any claim by any third party arising + out of or related to your use or\\ndistribution of the Llama Materials.\\n\\n6. + Term and Termination. The term of this Agreement will commence upon your acceptance + of this\\nAgreement or access to the Llama Materials and will continue in full + force and effect until terminated in\\naccordance with the terms and conditions + herein. Meta may terminate this Agreement if you are in\\nbreach of any term + or condition of this Agreement. Upon termination of this Agreement, you shall + delete\\nand cease use of the Llama Materials. Sections 3, 4 and 7 shall survive + the termination of this\\nAgreement.\\n\\n7. Governing Law and Jurisdiction. + This Agreement will be governed and construed under the laws of\\nthe State + of California without regard to choice of law principles, and the UN Convention + on Contracts\\nfor the International Sale of Goods does not apply to this Agreement. + The courts of California shall have\\nexclusive jurisdiction of any dispute + arising out of this Agreement.\\n\\n# Llama 3.1 Acceptable Use Policy\\n\\nMeta + is committed to promoting safe and fair use of its tools and features, including + Llama 3.1. If you\\naccess or use Llama 3.1, you agree to this Acceptable Use + Policy (\u201CPolicy\u201D). The most recent copy of\\nthis policy can be found + at [https://llama.meta.com/llama3_1/use-policy](https://llama.meta.com/llama3_1/use-policy)\\n\\n## + Prohibited Uses\\n\\nWe want everyone to use Llama 3.1 safely and responsibly. + You agree you will not use, or allow\\nothers to use, Llama 3.1 to:\\n\\n1. + Violate the law or others\u2019 rights, including to:\\n 1. Engage in, promote, + generate, contribute to, encourage, plan, incite, or further illegal or unlawful + activity or content, such as:\\n 1. Violence or terrorism\\n 2. + Exploitation or harm to children, including the solicitation, creation, acquisition, + or dissemination of child exploitative content or failure to report Child Sexual + Abuse Material\\n 3. Human trafficking, exploitation, and sexual violence\\n + \ 4. The illegal distribution of information or materials to minors, including + obscene materials, or failure to employ legally required age-gating in connection + with such information or materials.\\n 5. Sexual solicitation\\n 6. + Any other criminal activity\\n 3. Engage in, promote, incite, or facilitate + the harassment, abuse, threatening, or bullying of individuals or groups of + individuals\\n 4. Engage in, promote, incite, or facilitate discrimination + or other unlawful or harmful conduct in the provision of employment, employment + benefits, credit, housing, other economic benefits, or other essential goods + and services\\n 5. Engage in the unauthorized or unlicensed practice of any + profession including, but not limited to, financial, legal, medical/health, + or related professional practices\\n 6. Collect, process, disclose, generate, + or infer health, demographic, or other sensitive personal or private information + about individuals without rights and consents required by applicable laws\\n + \ 7. Engage in or facilitate any action or generate any content that infringes, + misappropriates, or otherwise violates any third-party rights, including the + outputs or results of any products or services using the Llama Materials\\n + \ 8. Create, generate, or facilitate the creation of malicious code, malware, + computer viruses or do anything else that could disable, overburden, interfere + with or impair the proper working, integrity, operation or appearance of a website + or computer system\\n\\n2. Engage in, promote, incite, facilitate, or assist + in the planning or development of activities that present a risk of death or + bodily harm to individuals, including use of Llama 3.1 related to the following:\\n + \ 1. Military, warfare, nuclear industries or applications, espionage, use + for materials or activities that are subject to the International Traffic Arms + Regulations (ITAR) maintained by the United States Department of State\\n 2. + Guns and illegal weapons (including weapon development)\\n 3. Illegal drugs + and regulated/controlled substances\\n 4. Operation of critical infrastructure, + transportation technologies, or heavy machinery\\n 5. Self-harm or harm to + others, including suicide, cutting, and eating disorders\\n 6. Any content + intended to incite or promote violence, abuse, or any infliction of bodily harm + to an individual\\n\\n3. Intentionally deceive or mislead others, including + use of Llama 3.1 related to the following:\\n 1. Generating, promoting, or + furthering fraud or the creation or promotion of disinformation\\n 2. Generating, + promoting, or furthering defamatory content, including the creation of defamatory + statements, images, or other content\\n 3. Generating, promoting, or further + distributing spam\\n 4. Impersonating another individual without consent, + authorization, or legal right\\n 5. Representing that the use of Llama 3.1 + or outputs are human-generated\\n 6. Generating or facilitating false online + engagement, including fake reviews and other means of fake online engagement\\n\\n4. + Fail to appropriately disclose to end users any known dangers of your AI system\\n\\nPlease + report any violation of this Policy, software \u201Cbug,\u201D or other problems + that could lead to a violation\\nof this Policy through one of the following + means:\\n\\n* Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://github.com/meta-llama/llama-models/issues)\\n* + Reporting risky content generated by the model: developers.facebook.com/llama_output_feedback\\n* + Reporting bugs and security concerns: facebook.com/whitehat/info\\n* Reporting + violations of the Acceptable Use Policy or unlicensed uses of Llama 3.1: LlamaUseReport@meta.com\",\"modelfile\":\"# + Modelfile generated by \\\"ollama show\\\"\\n# To build a new Modelfile based + on this, replace FROM with:\\n# FROM llama3.1:latest\\n\\nFROM /Users/joaomoura/.ollama/models/blobs/sha256-667b0c1932bc6ffc593ed1d03f895bf2dc8dc6df21db3042284a6f4416b06a29\\nTEMPLATE + \\\"\\\"\\\"{{- if or .System .Tools }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n{{- + if .System }}\\n\\n{{ .System }}\\n{{- end }}\\n{{- if .Tools }}\\n\\nCutting + Knowledge Date: December 2023\\n\\nWhen you receive a tool call response, use + the output to format an answer to the orginal user question.\\n\\nYou are a + helpful assistant with tool calling capabilities.\\n{{- end }}\\u003c|eot_id|\\u003e\\n{{- + end }}\\n{{- range $i, $_ := .Messages }}\\n{{- $last := eq (len (slice $.Messages + $i)) 1 }}\\n{{- if eq .Role \\\"user\\\" }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- + if and $.Tools $last }}\\n\\nGiven the following functions, please respond with + a JSON for a function call with its proper arguments that best answers the given + prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": + dictionary of argument name and its value}. Do not use variables.\\n\\n{{ range + $.Tools }}\\n{{- . }}\\n{{ end }}\\nQuestion: {{ .Content }}\\u003c|eot_id|\\u003e\\n{{- + else }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- end }}{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- + if .ToolCalls }}\\n{{ range .ToolCalls }}\\n{\\\"name\\\": \\\"{{ .Function.Name + }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ + .Content }}\\n{{- end }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- + else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ + .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- end }}\\n{{- end }}\\\"\\\"\\\"\\nPARAMETER stop \\u003c|start_header_id|\\u003e\\nPARAMETER + stop \\u003c|end_header_id|\\u003e\\nPARAMETER stop \\u003c|eot_id|\\u003e\\nLICENSE + \\\"LLAMA 3.1 COMMUNITY LICENSE AGREEMENT\\nLlama 3.1 Version Release Date: + July 23, 2024\\n\\n\u201CAgreement\u201D means the terms and conditions for + use, reproduction, distribution and modification of the\\nLlama Materials set + forth herein.\\n\\n\u201CDocumentation\u201D means the specifications, manuals + and documentation accompanying Llama 3.1\\ndistributed by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D + or \u201Cyou\u201D means you, or your employer or any other person or entity + (if you are entering into\\nthis Agreement on such person or entity\u2019s behalf), + of the age required under applicable laws, rules or\\nregulations to provide + legal consent and that has legal authority to bind your employer or such other\\nperson + or entity if you are entering in this Agreement on their behalf.\\n\\n\u201CLlama + 3.1\u201D means the foundational large language models and software and algorithms, + including\\nmachine-learning model code, trained model weights, inference-enabling + code, training-enabling code,\\nfine-tuning enabling code and other elements + of the foregoing distributed by Meta at\\nhttps://llama.meta.com/llama-downloads.\\n\\n\u201CLlama + Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.1 and Documentation + (and any\\nportion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D + or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in + or, if you are an entity, your\\nprincipal place of business is in the EEA or + Switzerland) and Meta Platforms, Inc. (if you are located\\noutside of the EEA + or Switzerland).\\n\\nBy clicking \u201CI Accept\u201D below or by using or + distributing any portion or element of the Llama Materials,\\nyou agree to be + bound by this Agreement.\\n\\n1. License Rights and Redistribution.\\n\\n a. + Grant of Rights. You are granted a non-exclusive, worldwide, non-transferable + and royalty-free\\nlimited license under Meta\u2019s intellectual property or + other rights owned by Meta embodied in the Llama\\nMaterials to use, reproduce, + distribute, copy, create derivative works of, and make modifications to the\\nLlama + Materials.\\n\\n b. Redistribution and Use.\\n\\n i. If you distribute + or make available the Llama Materials (or any derivative works\\nthereof), or + a product or service (including another AI model) that contains any of them, + you shall (A)\\nprovide a copy of this Agreement with any such Llama Materials; + and (B) prominently display \u201CBuilt with\\nLlama\u201D on a related website, + user interface, blogpost, about page, or product documentation. If you use\\nthe + Llama Materials or any outputs or results of the Llama Materials to create, + train, fine tune, or\\notherwise improve an AI model, which is distributed or + made available, you shall also include \u201CLlama\u201D at\\nthe beginning + of any such AI model name.\\n\\n ii. If you receive Llama Materials, or + any derivative works thereof, from a Licensee as part \\nof an integrated end + user product, then Section 2 of this Agreement will not apply to you.\\n\\n + \ iii. You must retain in all copies of the Llama Materials that you distribute + the following\\nattribution notice within a \u201CNotice\u201D text file distributed + as a part of such copies: \u201CLlama 3.1 is\\nlicensed under the Llama 3.1 + Community License, Copyright \xA9 Meta Platforms, Inc. All Rights\\nReserved.\u201D\\n\\n + \ iv. Your use of the Llama Materials must comply with applicable laws and + regulations\\n(including trade compliance laws and regulations) and adhere to + the Acceptable Use Policy for the Llama\\nMaterials (available at https://llama.meta.com/llama3_1/use-policy), + which is hereby incorporated by\\nreference into this Agreement.\\n\\n2. Additional + Commercial Terms. If, on the Llama 3.1 version release date, the monthly active + users\\nof the products or services made available by or for Licensee, or Licensee\u2019s + affiliates, is greater than 700\\nmillion monthly active users in the preceding + calendar month, you must request a license from Meta,\\nwhich Meta may grant + to you in its sole discretion, and you are not authorized to exercise any of + the\\nrights under this Agreement unless or until Meta otherwise expressly grants + you such rights.\\n\\n3. Disclaimer of Warranty. UNLESS REQUIRED BY APPLICABLE + LAW, THE LLAMA MATERIALS AND ANY\\nOUTPUT AND RESULTS THEREFROM ARE PROVIDED + ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF\\nANY KIND, AND META DISCLAIMS + ALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND IMPLIED,\\nINCLUDING, WITHOUT LIMITATION, + ANY WARRANTIES OF TITLE, NON-INFRINGEMENT,\\nMERCHANTABILITY, OR FITNESS FOR + A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE FOR\\nDETERMINING THE APPROPRIATENESS + OF USING OR REDISTRIBUTING THE LLAMA MATERIALS AND\\nASSUME ANY RISKS ASSOCIATED + WITH YOUR USE OF THE LLAMA MATERIALS AND ANY OUTPUT AND\\nRESULTS.\\n\\n4. Limitation + of Liability. IN NO EVENT WILL META OR ITS AFFILIATES BE LIABLE UNDER ANY THEORY + OF\\nLIABILITY, WHETHER IN CONTRACT, TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR + OTHERWISE, ARISING\\nOUT OF THIS AGREEMENT, FOR ANY LOST PROFITS OR ANY INDIRECT, + SPECIAL, CONSEQUENTIAL,\\nINCIDENTAL, EXEMPLARY OR PUNITIVE DAMAGES, EVEN IF + META OR ITS AFFILIATES HAVE BEEN ADVISED\\nOF THE POSSIBILITY OF ANY OF THE + FOREGOING.\\n\\n5. Intellectual Property.\\n\\n a. No trademark licenses are + granted under this Agreement, and in connection with the Llama\\nMaterials, + neither Meta nor Licensee may use any name or mark owned by or associated with + the other\\nor any of its affiliates, except as required for reasonable and + customary use in describing and\\nredistributing the Llama Materials or as set + forth in this Section 5(a). Meta hereby grants you a license to\\nuse \u201CLlama\u201D + (the \u201CMark\u201D) solely as required to comply with the last sentence of + Section 1.b.i. You will\\ncomply with Meta\u2019s brand guidelines (currently + accessible at\\nhttps://about.meta.com/brand/resources/meta/company-brand/ ). + All goodwill arising out of your use\\nof the Mark will inure to the benefit + of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and derivatives + made by or for Meta, with\\nrespect to any derivative works and modifications + of the Llama Materials that are made by you, as\\nbetween you and Meta, you + are and will be the owner of such derivative works and modifications.\\n\\n + \ c. If you institute litigation or other proceedings against Meta or any entity + (including a\\ncross-claim or counterclaim in a lawsuit) alleging that the Llama + Materials or Llama 3.1 outputs or\\nresults, or any portion of any of the foregoing, + constitutes infringement of intellectual property or other\\nrights owned or + licensable by you, then any licenses granted to you under this Agreement shall\\nterminate + as of the date such litigation or claim is filed or instituted. You will indemnify + and hold\\nharmless Meta from and against any claim by any third party arising + out of or related to your use or\\ndistribution of the Llama Materials.\\n\\n6. + Term and Termination. The term of this Agreement will commence upon your acceptance + of this\\nAgreement or access to the Llama Materials and will continue in full + force and effect until terminated in\\naccordance with the terms and conditions + herein. Meta may terminate this Agreement if you are in\\nbreach of any term + or condition of this Agreement. Upon termination of this Agreement, you shall + delete\\nand cease use of the Llama Materials. Sections 3, 4 and 7 shall survive + the termination of this\\nAgreement.\\n\\n7. Governing Law and Jurisdiction. + This Agreement will be governed and construed under the laws of\\nthe State + of California without regard to choice of law principles, and the UN Convention + on Contracts\\nfor the International Sale of Goods does not apply to this Agreement. + The courts of California shall have\\nexclusive jurisdiction of any dispute + arising out of this Agreement.\\n\\n# Llama 3.1 Acceptable Use Policy\\n\\nMeta + is committed to promoting safe and fair use of its tools and features, including + Llama 3.1. If you\\naccess or use Llama 3.1, you agree to this Acceptable Use + Policy (\u201CPolicy\u201D). The most recent copy of\\nthis policy can be found + at [https://llama.meta.com/llama3_1/use-policy](https://llama.meta.com/llama3_1/use-policy)\\n\\n## + Prohibited Uses\\n\\nWe want everyone to use Llama 3.1 safely and responsibly. + You agree you will not use, or allow\\nothers to use, Llama 3.1 to:\\n\\n1. + Violate the law or others\u2019 rights, including to:\\n 1. Engage in, promote, + generate, contribute to, encourage, plan, incite, or further illegal or unlawful + activity or content, such as:\\n 1. Violence or terrorism\\n 2. + Exploitation or harm to children, including the solicitation, creation, acquisition, + or dissemination of child exploitative content or failure to report Child Sexual + Abuse Material\\n 3. Human trafficking, exploitation, and sexual violence\\n + \ 4. The illegal distribution of information or materials to minors, including + obscene materials, or failure to employ legally required age-gating in connection + with such information or materials.\\n 5. Sexual solicitation\\n 6. + Any other criminal activity\\n 3. Engage in, promote, incite, or facilitate + the harassment, abuse, threatening, or bullying of individuals or groups of + individuals\\n 4. Engage in, promote, incite, or facilitate discrimination + or other unlawful or harmful conduct in the provision of employment, employment + benefits, credit, housing, other economic benefits, or other essential goods + and services\\n 5. Engage in the unauthorized or unlicensed practice of any + profession including, but not limited to, financial, legal, medical/health, + or related professional practices\\n 6. Collect, process, disclose, generate, + or infer health, demographic, or other sensitive personal or private information + about individuals without rights and consents required by applicable laws\\n + \ 7. Engage in or facilitate any action or generate any content that infringes, + misappropriates, or otherwise violates any third-party rights, including the + outputs or results of any products or services using the Llama Materials\\n + \ 8. Create, generate, or facilitate the creation of malicious code, malware, + computer viruses or do anything else that could disable, overburden, interfere + with or impair the proper working, integrity, operation or appearance of a website + or computer system\\n\\n2. Engage in, promote, incite, facilitate, or assist + in the planning or development of activities that present a risk of death or + bodily harm to individuals, including use of Llama 3.1 related to the following:\\n + \ 1. Military, warfare, nuclear industries or applications, espionage, use + for materials or activities that are subject to the International Traffic Arms + Regulations (ITAR) maintained by the United States Department of State\\n 2. + Guns and illegal weapons (including weapon development)\\n 3. Illegal drugs + and regulated/controlled substances\\n 4. Operation of critical infrastructure, + transportation technologies, or heavy machinery\\n 5. Self-harm or harm to + others, including suicide, cutting, and eating disorders\\n 6. Any content + intended to incite or promote violence, abuse, or any infliction of bodily harm + to an individual\\n\\n3. Intentionally deceive or mislead others, including + use of Llama 3.1 related to the following:\\n 1. Generating, promoting, or + furthering fraud or the creation or promotion of disinformation\\n 2. Generating, + promoting, or furthering defamatory content, including the creation of defamatory + statements, images, or other content\\n 3. Generating, promoting, or further + distributing spam\\n 4. Impersonating another individual without consent, + authorization, or legal right\\n 5. Representing that the use of Llama 3.1 + or outputs are human-generated\\n 6. Generating or facilitating false online + engagement, including fake reviews and other means of fake online engagement\\n\\n4. + Fail to appropriately disclose to end users any known dangers of your AI system\\n\\nPlease + report any violation of this Policy, software \u201Cbug,\u201D or other problems + that could lead to a violation\\nof this Policy through one of the following + means:\\n\\n* Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://github.com/meta-llama/llama-models/issues)\\n* + Reporting risky content generated by the model: developers.facebook.com/llama_output_feedback\\n* + Reporting bugs and security concerns: facebook.com/whitehat/info\\n* Reporting + violations of the Acceptable Use Policy or unlicensed uses of Llama 3.1: LlamaUseReport@meta.com\\\"\\n\",\"parameters\":\"stop + \ \\\"\\u003c|start_header_id|\\u003e\\\"\\nstop \\\"\\u003c|end_header_id|\\u003e\\\"\\nstop + \ \\\"\\u003c|eot_id|\\u003e\\\"\",\"template\":\"{{- + if or .System .Tools }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n{{- + if .System }}\\n\\n{{ .System }}\\n{{- end }}\\n{{- if .Tools }}\\n\\nCutting + Knowledge Date: December 2023\\n\\nWhen you receive a tool call response, use + the output to format an answer to the orginal user question.\\n\\nYou are a + helpful assistant with tool calling capabilities.\\n{{- end }}\\u003c|eot_id|\\u003e\\n{{- + end }}\\n{{- range $i, $_ := .Messages }}\\n{{- $last := eq (len (slice $.Messages + $i)) 1 }}\\n{{- if eq .Role \\\"user\\\" }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- + if and $.Tools $last }}\\n\\nGiven the following functions, please respond with + a JSON for a function call with its proper arguments that best answers the given + prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": + dictionary of argument name and its value}. Do not use variables.\\n\\n{{ range + $.Tools }}\\n{{- . }}\\n{{ end }}\\nQuestion: {{ .Content }}\\u003c|eot_id|\\u003e\\n{{- + else }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- end }}{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- + if .ToolCalls }}\\n{{ range .ToolCalls }}\\n{\\\"name\\\": \\\"{{ .Function.Name + }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ + .Content }}\\n{{- end }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- + else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ + .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- end }}\\n{{- end }}\",\"details\":{\"parent_model\":\"\",\"format\":\"gguf\",\"family\":\"llama\",\"families\":[\"llama\"],\"parameter_size\":\"8.0B\",\"quantization_level\":\"Q4_K_M\"},\"model_info\":{\"general.architecture\":\"llama\",\"general.basename\":\"Meta-Llama-3.1\",\"general.file_type\":15,\"general.finetune\":\"Instruct\",\"general.languages\":[\"en\",\"de\",\"fr\",\"it\",\"pt\",\"hi\",\"es\",\"th\"],\"general.license\":\"llama3.1\",\"general.parameter_count\":8030261312,\"general.quantization_version\":2,\"general.size_label\":\"8B\",\"general.tags\":[\"facebook\",\"meta\",\"pytorch\",\"llama\",\"llama-3\",\"text-generation\"],\"general.type\":\"model\",\"llama.attention.head_count\":32,\"llama.attention.head_count_kv\":8,\"llama.attention.layer_norm_rms_epsilon\":0.00001,\"llama.block_count\":32,\"llama.context_length\":131072,\"llama.embedding_length\":4096,\"llama.feed_forward_length\":14336,\"llama.rope.dimension_count\":128,\"llama.rope.freq_base\":500000,\"llama.vocab_size\":128256,\"tokenizer.ggml.bos_token_id\":128000,\"tokenizer.ggml.eos_token_id\":128009,\"tokenizer.ggml.merges\":null,\"tokenizer.ggml.model\":\"gpt2\",\"tokenizer.ggml.pre\":\"llama-bpe\",\"tokenizer.ggml.token_type\":null,\"tokenizer.ggml.tokens\":null},\"modified_at\":\"2025-02-20T18:56:54.293648887-08:00\"}" + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Fri, 21 Feb 2025 02:58:15 GMT + Transfer-Encoding: + - chunked + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"name": "llama3.1"}' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '20' + content-type: + - application/json + host: + - localhost:11434 + user-agent: + - litellm/1.60.2 + method: POST + uri: http://localhost:11434/api/show + response: + content: "{\"license\":\"LLAMA 3.1 COMMUNITY LICENSE AGREEMENT\\nLlama 3.1 Version + Release Date: July 23, 2024\\n\\n\u201CAgreement\u201D means the terms and conditions + for use, reproduction, distribution and modification of the\\nLlama Materials + set forth herein.\\n\\n\u201CDocumentation\u201D means the specifications, manuals + and documentation accompanying Llama 3.1\\ndistributed by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D + or \u201Cyou\u201D means you, or your employer or any other person or entity + (if you are entering into\\nthis Agreement on such person or entity\u2019s behalf), + of the age required under applicable laws, rules or\\nregulations to provide + legal consent and that has legal authority to bind your employer or such other\\nperson + or entity if you are entering in this Agreement on their behalf.\\n\\n\u201CLlama + 3.1\u201D means the foundational large language models and software and algorithms, + including\\nmachine-learning model code, trained model weights, inference-enabling + code, training-enabling code,\\nfine-tuning enabling code and other elements + of the foregoing distributed by Meta at\\nhttps://llama.meta.com/llama-downloads.\\n\\n\u201CLlama + Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.1 and Documentation + (and any\\nportion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D + or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in + or, if you are an entity, your\\nprincipal place of business is in the EEA or + Switzerland) and Meta Platforms, Inc. (if you are located\\noutside of the EEA + or Switzerland).\\n\\nBy clicking \u201CI Accept\u201D below or by using or + distributing any portion or element of the Llama Materials,\\nyou agree to be + bound by this Agreement.\\n\\n1. License Rights and Redistribution.\\n\\n a. + Grant of Rights. You are granted a non-exclusive, worldwide, non-transferable + and royalty-free\\nlimited license under Meta\u2019s intellectual property or + other rights owned by Meta embodied in the Llama\\nMaterials to use, reproduce, + distribute, copy, create derivative works of, and make modifications to the\\nLlama + Materials.\\n\\n b. Redistribution and Use.\\n\\n i. If you distribute + or make available the Llama Materials (or any derivative works\\nthereof), or + a product or service (including another AI model) that contains any of them, + you shall (A)\\nprovide a copy of this Agreement with any such Llama Materials; + and (B) prominently display \u201CBuilt with\\nLlama\u201D on a related website, + user interface, blogpost, about page, or product documentation. If you use\\nthe + Llama Materials or any outputs or results of the Llama Materials to create, + train, fine tune, or\\notherwise improve an AI model, which is distributed or + made available, you shall also include \u201CLlama\u201D at\\nthe beginning + of any such AI model name.\\n\\n ii. If you receive Llama Materials, or + any derivative works thereof, from a Licensee as part \\nof an integrated end + user product, then Section 2 of this Agreement will not apply to you.\\n\\n + \ iii. You must retain in all copies of the Llama Materials that you distribute + the following\\nattribution notice within a \u201CNotice\u201D text file distributed + as a part of such copies: \u201CLlama 3.1 is\\nlicensed under the Llama 3.1 + Community License, Copyright \xA9 Meta Platforms, Inc. All Rights\\nReserved.\u201D\\n\\n + \ iv. Your use of the Llama Materials must comply with applicable laws and + regulations\\n(including trade compliance laws and regulations) and adhere to + the Acceptable Use Policy for the Llama\\nMaterials (available at https://llama.meta.com/llama3_1/use-policy), + which is hereby incorporated by\\nreference into this Agreement.\\n\\n2. Additional + Commercial Terms. If, on the Llama 3.1 version release date, the monthly active + users\\nof the products or services made available by or for Licensee, or Licensee\u2019s + affiliates, is greater than 700\\nmillion monthly active users in the preceding + calendar month, you must request a license from Meta,\\nwhich Meta may grant + to you in its sole discretion, and you are not authorized to exercise any of + the\\nrights under this Agreement unless or until Meta otherwise expressly grants + you such rights.\\n\\n3. Disclaimer of Warranty. UNLESS REQUIRED BY APPLICABLE + LAW, THE LLAMA MATERIALS AND ANY\\nOUTPUT AND RESULTS THEREFROM ARE PROVIDED + ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF\\nANY KIND, AND META DISCLAIMS + ALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND IMPLIED,\\nINCLUDING, WITHOUT LIMITATION, + ANY WARRANTIES OF TITLE, NON-INFRINGEMENT,\\nMERCHANTABILITY, OR FITNESS FOR + A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE FOR\\nDETERMINING THE APPROPRIATENESS + OF USING OR REDISTRIBUTING THE LLAMA MATERIALS AND\\nASSUME ANY RISKS ASSOCIATED + WITH YOUR USE OF THE LLAMA MATERIALS AND ANY OUTPUT AND\\nRESULTS.\\n\\n4. Limitation + of Liability. IN NO EVENT WILL META OR ITS AFFILIATES BE LIABLE UNDER ANY THEORY + OF\\nLIABILITY, WHETHER IN CONTRACT, TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR + OTHERWISE, ARISING\\nOUT OF THIS AGREEMENT, FOR ANY LOST PROFITS OR ANY INDIRECT, + SPECIAL, CONSEQUENTIAL,\\nINCIDENTAL, EXEMPLARY OR PUNITIVE DAMAGES, EVEN IF + META OR ITS AFFILIATES HAVE BEEN ADVISED\\nOF THE POSSIBILITY OF ANY OF THE + FOREGOING.\\n\\n5. Intellectual Property.\\n\\n a. No trademark licenses are + granted under this Agreement, and in connection with the Llama\\nMaterials, + neither Meta nor Licensee may use any name or mark owned by or associated with + the other\\nor any of its affiliates, except as required for reasonable and + customary use in describing and\\nredistributing the Llama Materials or as set + forth in this Section 5(a). Meta hereby grants you a license to\\nuse \u201CLlama\u201D + (the \u201CMark\u201D) solely as required to comply with the last sentence of + Section 1.b.i. You will\\ncomply with Meta\u2019s brand guidelines (currently + accessible at\\nhttps://about.meta.com/brand/resources/meta/company-brand/ ). + All goodwill arising out of your use\\nof the Mark will inure to the benefit + of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and derivatives + made by or for Meta, with\\nrespect to any derivative works and modifications + of the Llama Materials that are made by you, as\\nbetween you and Meta, you + are and will be the owner of such derivative works and modifications.\\n\\n + \ c. If you institute litigation or other proceedings against Meta or any entity + (including a\\ncross-claim or counterclaim in a lawsuit) alleging that the Llama + Materials or Llama 3.1 outputs or\\nresults, or any portion of any of the foregoing, + constitutes infringement of intellectual property or other\\nrights owned or + licensable by you, then any licenses granted to you under this Agreement shall\\nterminate + as of the date such litigation or claim is filed or instituted. You will indemnify + and hold\\nharmless Meta from and against any claim by any third party arising + out of or related to your use or\\ndistribution of the Llama Materials.\\n\\n6. + Term and Termination. The term of this Agreement will commence upon your acceptance + of this\\nAgreement or access to the Llama Materials and will continue in full + force and effect until terminated in\\naccordance with the terms and conditions + herein. Meta may terminate this Agreement if you are in\\nbreach of any term + or condition of this Agreement. Upon termination of this Agreement, you shall + delete\\nand cease use of the Llama Materials. Sections 3, 4 and 7 shall survive + the termination of this\\nAgreement.\\n\\n7. Governing Law and Jurisdiction. + This Agreement will be governed and construed under the laws of\\nthe State + of California without regard to choice of law principles, and the UN Convention + on Contracts\\nfor the International Sale of Goods does not apply to this Agreement. + The courts of California shall have\\nexclusive jurisdiction of any dispute + arising out of this Agreement.\\n\\n# Llama 3.1 Acceptable Use Policy\\n\\nMeta + is committed to promoting safe and fair use of its tools and features, including + Llama 3.1. If you\\naccess or use Llama 3.1, you agree to this Acceptable Use + Policy (\u201CPolicy\u201D). The most recent copy of\\nthis policy can be found + at [https://llama.meta.com/llama3_1/use-policy](https://llama.meta.com/llama3_1/use-policy)\\n\\n## + Prohibited Uses\\n\\nWe want everyone to use Llama 3.1 safely and responsibly. + You agree you will not use, or allow\\nothers to use, Llama 3.1 to:\\n\\n1. + Violate the law or others\u2019 rights, including to:\\n 1. Engage in, promote, + generate, contribute to, encourage, plan, incite, or further illegal or unlawful + activity or content, such as:\\n 1. Violence or terrorism\\n 2. + Exploitation or harm to children, including the solicitation, creation, acquisition, + or dissemination of child exploitative content or failure to report Child Sexual + Abuse Material\\n 3. Human trafficking, exploitation, and sexual violence\\n + \ 4. The illegal distribution of information or materials to minors, including + obscene materials, or failure to employ legally required age-gating in connection + with such information or materials.\\n 5. Sexual solicitation\\n 6. + Any other criminal activity\\n 3. Engage in, promote, incite, or facilitate + the harassment, abuse, threatening, or bullying of individuals or groups of + individuals\\n 4. Engage in, promote, incite, or facilitate discrimination + or other unlawful or harmful conduct in the provision of employment, employment + benefits, credit, housing, other economic benefits, or other essential goods + and services\\n 5. Engage in the unauthorized or unlicensed practice of any + profession including, but not limited to, financial, legal, medical/health, + or related professional practices\\n 6. Collect, process, disclose, generate, + or infer health, demographic, or other sensitive personal or private information + about individuals without rights and consents required by applicable laws\\n + \ 7. Engage in or facilitate any action or generate any content that infringes, + misappropriates, or otherwise violates any third-party rights, including the + outputs or results of any products or services using the Llama Materials\\n + \ 8. Create, generate, or facilitate the creation of malicious code, malware, + computer viruses or do anything else that could disable, overburden, interfere + with or impair the proper working, integrity, operation or appearance of a website + or computer system\\n\\n2. Engage in, promote, incite, facilitate, or assist + in the planning or development of activities that present a risk of death or + bodily harm to individuals, including use of Llama 3.1 related to the following:\\n + \ 1. Military, warfare, nuclear industries or applications, espionage, use + for materials or activities that are subject to the International Traffic Arms + Regulations (ITAR) maintained by the United States Department of State\\n 2. + Guns and illegal weapons (including weapon development)\\n 3. Illegal drugs + and regulated/controlled substances\\n 4. Operation of critical infrastructure, + transportation technologies, or heavy machinery\\n 5. Self-harm or harm to + others, including suicide, cutting, and eating disorders\\n 6. Any content + intended to incite or promote violence, abuse, or any infliction of bodily harm + to an individual\\n\\n3. Intentionally deceive or mislead others, including + use of Llama 3.1 related to the following:\\n 1. Generating, promoting, or + furthering fraud or the creation or promotion of disinformation\\n 2. Generating, + promoting, or furthering defamatory content, including the creation of defamatory + statements, images, or other content\\n 3. Generating, promoting, or further + distributing spam\\n 4. Impersonating another individual without consent, + authorization, or legal right\\n 5. Representing that the use of Llama 3.1 + or outputs are human-generated\\n 6. Generating or facilitating false online + engagement, including fake reviews and other means of fake online engagement\\n\\n4. + Fail to appropriately disclose to end users any known dangers of your AI system\\n\\nPlease + report any violation of this Policy, software \u201Cbug,\u201D or other problems + that could lead to a violation\\nof this Policy through one of the following + means:\\n\\n* Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://github.com/meta-llama/llama-models/issues)\\n* + Reporting risky content generated by the model: developers.facebook.com/llama_output_feedback\\n* + Reporting bugs and security concerns: facebook.com/whitehat/info\\n* Reporting + violations of the Acceptable Use Policy or unlicensed uses of Llama 3.1: LlamaUseReport@meta.com\",\"modelfile\":\"# + Modelfile generated by \\\"ollama show\\\"\\n# To build a new Modelfile based + on this, replace FROM with:\\n# FROM llama3.1:latest\\n\\nFROM /Users/joaomoura/.ollama/models/blobs/sha256-667b0c1932bc6ffc593ed1d03f895bf2dc8dc6df21db3042284a6f4416b06a29\\nTEMPLATE + \\\"\\\"\\\"{{- if or .System .Tools }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n{{- + if .System }}\\n\\n{{ .System }}\\n{{- end }}\\n{{- if .Tools }}\\n\\nCutting + Knowledge Date: December 2023\\n\\nWhen you receive a tool call response, use + the output to format an answer to the orginal user question.\\n\\nYou are a + helpful assistant with tool calling capabilities.\\n{{- end }}\\u003c|eot_id|\\u003e\\n{{- + end }}\\n{{- range $i, $_ := .Messages }}\\n{{- $last := eq (len (slice $.Messages + $i)) 1 }}\\n{{- if eq .Role \\\"user\\\" }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- + if and $.Tools $last }}\\n\\nGiven the following functions, please respond with + a JSON for a function call with its proper arguments that best answers the given + prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": + dictionary of argument name and its value}. Do not use variables.\\n\\n{{ range + $.Tools }}\\n{{- . }}\\n{{ end }}\\nQuestion: {{ .Content }}\\u003c|eot_id|\\u003e\\n{{- + else }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- end }}{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- + if .ToolCalls }}\\n{{ range .ToolCalls }}\\n{\\\"name\\\": \\\"{{ .Function.Name + }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ + .Content }}\\n{{- end }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- + else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ + .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- end }}\\n{{- end }}\\\"\\\"\\\"\\nPARAMETER stop \\u003c|start_header_id|\\u003e\\nPARAMETER + stop \\u003c|end_header_id|\\u003e\\nPARAMETER stop \\u003c|eot_id|\\u003e\\nLICENSE + \\\"LLAMA 3.1 COMMUNITY LICENSE AGREEMENT\\nLlama 3.1 Version Release Date: + July 23, 2024\\n\\n\u201CAgreement\u201D means the terms and conditions for + use, reproduction, distribution and modification of the\\nLlama Materials set + forth herein.\\n\\n\u201CDocumentation\u201D means the specifications, manuals + and documentation accompanying Llama 3.1\\ndistributed by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D + or \u201Cyou\u201D means you, or your employer or any other person or entity + (if you are entering into\\nthis Agreement on such person or entity\u2019s behalf), + of the age required under applicable laws, rules or\\nregulations to provide + legal consent and that has legal authority to bind your employer or such other\\nperson + or entity if you are entering in this Agreement on their behalf.\\n\\n\u201CLlama + 3.1\u201D means the foundational large language models and software and algorithms, + including\\nmachine-learning model code, trained model weights, inference-enabling + code, training-enabling code,\\nfine-tuning enabling code and other elements + of the foregoing distributed by Meta at\\nhttps://llama.meta.com/llama-downloads.\\n\\n\u201CLlama + Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.1 and Documentation + (and any\\nportion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D + or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in + or, if you are an entity, your\\nprincipal place of business is in the EEA or + Switzerland) and Meta Platforms, Inc. (if you are located\\noutside of the EEA + or Switzerland).\\n\\nBy clicking \u201CI Accept\u201D below or by using or + distributing any portion or element of the Llama Materials,\\nyou agree to be + bound by this Agreement.\\n\\n1. License Rights and Redistribution.\\n\\n a. + Grant of Rights. You are granted a non-exclusive, worldwide, non-transferable + and royalty-free\\nlimited license under Meta\u2019s intellectual property or + other rights owned by Meta embodied in the Llama\\nMaterials to use, reproduce, + distribute, copy, create derivative works of, and make modifications to the\\nLlama + Materials.\\n\\n b. Redistribution and Use.\\n\\n i. If you distribute + or make available the Llama Materials (or any derivative works\\nthereof), or + a product or service (including another AI model) that contains any of them, + you shall (A)\\nprovide a copy of this Agreement with any such Llama Materials; + and (B) prominently display \u201CBuilt with\\nLlama\u201D on a related website, + user interface, blogpost, about page, or product documentation. If you use\\nthe + Llama Materials or any outputs or results of the Llama Materials to create, + train, fine tune, or\\notherwise improve an AI model, which is distributed or + made available, you shall also include \u201CLlama\u201D at\\nthe beginning + of any such AI model name.\\n\\n ii. If you receive Llama Materials, or + any derivative works thereof, from a Licensee as part \\nof an integrated end + user product, then Section 2 of this Agreement will not apply to you.\\n\\n + \ iii. You must retain in all copies of the Llama Materials that you distribute + the following\\nattribution notice within a \u201CNotice\u201D text file distributed + as a part of such copies: \u201CLlama 3.1 is\\nlicensed under the Llama 3.1 + Community License, Copyright \xA9 Meta Platforms, Inc. All Rights\\nReserved.\u201D\\n\\n + \ iv. Your use of the Llama Materials must comply with applicable laws and + regulations\\n(including trade compliance laws and regulations) and adhere to + the Acceptable Use Policy for the Llama\\nMaterials (available at https://llama.meta.com/llama3_1/use-policy), + which is hereby incorporated by\\nreference into this Agreement.\\n\\n2. Additional + Commercial Terms. If, on the Llama 3.1 version release date, the monthly active + users\\nof the products or services made available by or for Licensee, or Licensee\u2019s + affiliates, is greater than 700\\nmillion monthly active users in the preceding + calendar month, you must request a license from Meta,\\nwhich Meta may grant + to you in its sole discretion, and you are not authorized to exercise any of + the\\nrights under this Agreement unless or until Meta otherwise expressly grants + you such rights.\\n\\n3. Disclaimer of Warranty. UNLESS REQUIRED BY APPLICABLE + LAW, THE LLAMA MATERIALS AND ANY\\nOUTPUT AND RESULTS THEREFROM ARE PROVIDED + ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF\\nANY KIND, AND META DISCLAIMS + ALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND IMPLIED,\\nINCLUDING, WITHOUT LIMITATION, + ANY WARRANTIES OF TITLE, NON-INFRINGEMENT,\\nMERCHANTABILITY, OR FITNESS FOR + A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE FOR\\nDETERMINING THE APPROPRIATENESS + OF USING OR REDISTRIBUTING THE LLAMA MATERIALS AND\\nASSUME ANY RISKS ASSOCIATED + WITH YOUR USE OF THE LLAMA MATERIALS AND ANY OUTPUT AND\\nRESULTS.\\n\\n4. Limitation + of Liability. IN NO EVENT WILL META OR ITS AFFILIATES BE LIABLE UNDER ANY THEORY + OF\\nLIABILITY, WHETHER IN CONTRACT, TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR + OTHERWISE, ARISING\\nOUT OF THIS AGREEMENT, FOR ANY LOST PROFITS OR ANY INDIRECT, + SPECIAL, CONSEQUENTIAL,\\nINCIDENTAL, EXEMPLARY OR PUNITIVE DAMAGES, EVEN IF + META OR ITS AFFILIATES HAVE BEEN ADVISED\\nOF THE POSSIBILITY OF ANY OF THE + FOREGOING.\\n\\n5. Intellectual Property.\\n\\n a. No trademark licenses are + granted under this Agreement, and in connection with the Llama\\nMaterials, + neither Meta nor Licensee may use any name or mark owned by or associated with + the other\\nor any of its affiliates, except as required for reasonable and + customary use in describing and\\nredistributing the Llama Materials or as set + forth in this Section 5(a). Meta hereby grants you a license to\\nuse \u201CLlama\u201D + (the \u201CMark\u201D) solely as required to comply with the last sentence of + Section 1.b.i. You will\\ncomply with Meta\u2019s brand guidelines (currently + accessible at\\nhttps://about.meta.com/brand/resources/meta/company-brand/ ). + All goodwill arising out of your use\\nof the Mark will inure to the benefit + of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and derivatives + made by or for Meta, with\\nrespect to any derivative works and modifications + of the Llama Materials that are made by you, as\\nbetween you and Meta, you + are and will be the owner of such derivative works and modifications.\\n\\n + \ c. If you institute litigation or other proceedings against Meta or any entity + (including a\\ncross-claim or counterclaim in a lawsuit) alleging that the Llama + Materials or Llama 3.1 outputs or\\nresults, or any portion of any of the foregoing, + constitutes infringement of intellectual property or other\\nrights owned or + licensable by you, then any licenses granted to you under this Agreement shall\\nterminate + as of the date such litigation or claim is filed or instituted. You will indemnify + and hold\\nharmless Meta from and against any claim by any third party arising + out of or related to your use or\\ndistribution of the Llama Materials.\\n\\n6. + Term and Termination. The term of this Agreement will commence upon your acceptance + of this\\nAgreement or access to the Llama Materials and will continue in full + force and effect until terminated in\\naccordance with the terms and conditions + herein. Meta may terminate this Agreement if you are in\\nbreach of any term + or condition of this Agreement. Upon termination of this Agreement, you shall + delete\\nand cease use of the Llama Materials. Sections 3, 4 and 7 shall survive + the termination of this\\nAgreement.\\n\\n7. Governing Law and Jurisdiction. + This Agreement will be governed and construed under the laws of\\nthe State + of California without regard to choice of law principles, and the UN Convention + on Contracts\\nfor the International Sale of Goods does not apply to this Agreement. + The courts of California shall have\\nexclusive jurisdiction of any dispute + arising out of this Agreement.\\n\\n# Llama 3.1 Acceptable Use Policy\\n\\nMeta + is committed to promoting safe and fair use of its tools and features, including + Llama 3.1. If you\\naccess or use Llama 3.1, you agree to this Acceptable Use + Policy (\u201CPolicy\u201D). The most recent copy of\\nthis policy can be found + at [https://llama.meta.com/llama3_1/use-policy](https://llama.meta.com/llama3_1/use-policy)\\n\\n## + Prohibited Uses\\n\\nWe want everyone to use Llama 3.1 safely and responsibly. + You agree you will not use, or allow\\nothers to use, Llama 3.1 to:\\n\\n1. + Violate the law or others\u2019 rights, including to:\\n 1. Engage in, promote, + generate, contribute to, encourage, plan, incite, or further illegal or unlawful + activity or content, such as:\\n 1. Violence or terrorism\\n 2. + Exploitation or harm to children, including the solicitation, creation, acquisition, + or dissemination of child exploitative content or failure to report Child Sexual + Abuse Material\\n 3. Human trafficking, exploitation, and sexual violence\\n + \ 4. The illegal distribution of information or materials to minors, including + obscene materials, or failure to employ legally required age-gating in connection + with such information or materials.\\n 5. Sexual solicitation\\n 6. + Any other criminal activity\\n 3. Engage in, promote, incite, or facilitate + the harassment, abuse, threatening, or bullying of individuals or groups of + individuals\\n 4. Engage in, promote, incite, or facilitate discrimination + or other unlawful or harmful conduct in the provision of employment, employment + benefits, credit, housing, other economic benefits, or other essential goods + and services\\n 5. Engage in the unauthorized or unlicensed practice of any + profession including, but not limited to, financial, legal, medical/health, + or related professional practices\\n 6. Collect, process, disclose, generate, + or infer health, demographic, or other sensitive personal or private information + about individuals without rights and consents required by applicable laws\\n + \ 7. Engage in or facilitate any action or generate any content that infringes, + misappropriates, or otherwise violates any third-party rights, including the + outputs or results of any products or services using the Llama Materials\\n + \ 8. Create, generate, or facilitate the creation of malicious code, malware, + computer viruses or do anything else that could disable, overburden, interfere + with or impair the proper working, integrity, operation or appearance of a website + or computer system\\n\\n2. Engage in, promote, incite, facilitate, or assist + in the planning or development of activities that present a risk of death or + bodily harm to individuals, including use of Llama 3.1 related to the following:\\n + \ 1. Military, warfare, nuclear industries or applications, espionage, use + for materials or activities that are subject to the International Traffic Arms + Regulations (ITAR) maintained by the United States Department of State\\n 2. + Guns and illegal weapons (including weapon development)\\n 3. Illegal drugs + and regulated/controlled substances\\n 4. Operation of critical infrastructure, + transportation technologies, or heavy machinery\\n 5. Self-harm or harm to + others, including suicide, cutting, and eating disorders\\n 6. Any content + intended to incite or promote violence, abuse, or any infliction of bodily harm + to an individual\\n\\n3. Intentionally deceive or mislead others, including + use of Llama 3.1 related to the following:\\n 1. Generating, promoting, or + furthering fraud or the creation or promotion of disinformation\\n 2. Generating, + promoting, or furthering defamatory content, including the creation of defamatory + statements, images, or other content\\n 3. Generating, promoting, or further + distributing spam\\n 4. Impersonating another individual without consent, + authorization, or legal right\\n 5. Representing that the use of Llama 3.1 + or outputs are human-generated\\n 6. Generating or facilitating false online + engagement, including fake reviews and other means of fake online engagement\\n\\n4. + Fail to appropriately disclose to end users any known dangers of your AI system\\n\\nPlease + report any violation of this Policy, software \u201Cbug,\u201D or other problems + that could lead to a violation\\nof this Policy through one of the following + means:\\n\\n* Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://github.com/meta-llama/llama-models/issues)\\n* + Reporting risky content generated by the model: developers.facebook.com/llama_output_feedback\\n* + Reporting bugs and security concerns: facebook.com/whitehat/info\\n* Reporting + violations of the Acceptable Use Policy or unlicensed uses of Llama 3.1: LlamaUseReport@meta.com\\\"\\n\",\"parameters\":\"stop + \ \\\"\\u003c|start_header_id|\\u003e\\\"\\nstop \\\"\\u003c|end_header_id|\\u003e\\\"\\nstop + \ \\\"\\u003c|eot_id|\\u003e\\\"\",\"template\":\"{{- + if or .System .Tools }}\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n{{- + if .System }}\\n\\n{{ .System }}\\n{{- end }}\\n{{- if .Tools }}\\n\\nCutting + Knowledge Date: December 2023\\n\\nWhen you receive a tool call response, use + the output to format an answer to the orginal user question.\\n\\nYou are a + helpful assistant with tool calling capabilities.\\n{{- end }}\\u003c|eot_id|\\u003e\\n{{- + end }}\\n{{- range $i, $_ := .Messages }}\\n{{- $last := eq (len (slice $.Messages + $i)) 1 }}\\n{{- if eq .Role \\\"user\\\" }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- + if and $.Tools $last }}\\n\\nGiven the following functions, please respond with + a JSON for a function call with its proper arguments that best answers the given + prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": + dictionary of argument name and its value}. Do not use variables.\\n\\n{{ range + $.Tools }}\\n{{- . }}\\n{{ end }}\\nQuestion: {{ .Content }}\\u003c|eot_id|\\u003e\\n{{- + else }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- end }}{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- + if .ToolCalls }}\\n{{ range .ToolCalls }}\\n{\\\"name\\\": \\\"{{ .Function.Name + }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ + .Content }}\\n{{- end }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- + else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ + .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- end }}\\n{{- end }}\",\"details\":{\"parent_model\":\"\",\"format\":\"gguf\",\"family\":\"llama\",\"families\":[\"llama\"],\"parameter_size\":\"8.0B\",\"quantization_level\":\"Q4_K_M\"},\"model_info\":{\"general.architecture\":\"llama\",\"general.basename\":\"Meta-Llama-3.1\",\"general.file_type\":15,\"general.finetune\":\"Instruct\",\"general.languages\":[\"en\",\"de\",\"fr\",\"it\",\"pt\",\"hi\",\"es\",\"th\"],\"general.license\":\"llama3.1\",\"general.parameter_count\":8030261312,\"general.quantization_version\":2,\"general.size_label\":\"8B\",\"general.tags\":[\"facebook\",\"meta\",\"pytorch\",\"llama\",\"llama-3\",\"text-generation\"],\"general.type\":\"model\",\"llama.attention.head_count\":32,\"llama.attention.head_count_kv\":8,\"llama.attention.layer_norm_rms_epsilon\":0.00001,\"llama.block_count\":32,\"llama.context_length\":131072,\"llama.embedding_length\":4096,\"llama.feed_forward_length\":14336,\"llama.rope.dimension_count\":128,\"llama.rope.freq_base\":500000,\"llama.vocab_size\":128256,\"tokenizer.ggml.bos_token_id\":128000,\"tokenizer.ggml.eos_token_id\":128009,\"tokenizer.ggml.merges\":null,\"tokenizer.ggml.model\":\"gpt2\",\"tokenizer.ggml.pre\":\"llama-bpe\",\"tokenizer.ggml.token_type\":null,\"tokenizer.ggml.tokens\":null},\"modified_at\":\"2025-02-20T18:56:54.293648887-08:00\"}" + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Fri, 21 Feb 2025 02:58:15 GMT + Transfer-Encoding: + - chunked + http_version: HTTP/1.1 + status_code: 200 version: 1 diff --git a/tests/utilities/cassettes/test_converter_with_llama3_2_model.yaml b/tests/utilities/cassettes/test_converter_with_llama3_2_model.yaml index 5fd4d37aa..d538308ca 100644 --- a/tests/utilities/cassettes/test_converter_with_llama3_2_model.yaml +++ b/tests/utilities/cassettes/test_converter_with_llama3_2_model.yaml @@ -5,32 +5,860 @@ interactions: JSON must follow this format exactly:\n{\n \"name\": str,\n \"age\": int\n}\n\n### User:\nName: Alice Llama, Age: 30\n\n", "options": {"stop": []}, "stream": false}' headers: - Accept: + accept: - '*/*' - Accept-Encoding: + accept-encoding: - gzip, deflate - Connection: + connection: - keep-alive - Content-Length: + content-length: - '321' - Content-Type: - - application/json - User-Agent: - - python-requests/2.32.2 + host: + - localhost:11434 + user-agent: + - litellm/1.60.2 method: POST uri: http://localhost:11434/api/generate response: - body: - string: '{"model":"llama3.2:3b","created_at":"2025-02-18T21:52:20.737635Z","response":"{\"name\": - \"Alice Llama\", \"age\": 30}","done":true,"done_reason":"stop","context":[128006,9125,128007,271,38766,1303,33025,2696,25,6790,220,2366,18,271,128009,128006,882,128007,271,14711,744,512,5618,5625,279,2768,1495,1139,2764,4823,382,5207,27785,279,2764,4823,323,4400,775,382,791,4823,2011,1833,420,3645,7041,512,517,220,330,609,794,610,345,220,330,425,794,528,198,633,14711,2724,512,678,25,30505,445,81101,11,13381,25,220,966,271,128009,128006,78191,128007,271,5018,609,794,330,62786,445,81101,498,330,425,794,220,966,92],"total_duration":2438288750,"load_duration":819026959,"prompt_eval_count":82,"prompt_eval_duration":1368000000,"eval_count":15,"eval_duration":249000000}' + content: '{"model":"llama3.2:3b","created_at":"2025-02-21T02:57:55.059392Z","response":"{\"name\": + \"Alice Llama\", \"age\": 30}","done":true,"done_reason":"stop","context":[128006,9125,128007,271,38766,1303,33025,2696,25,6790,220,2366,18,271,128009,128006,882,128007,271,14711,744,512,5618,5625,279,2768,1495,1139,2764,4823,382,5207,27785,279,2764,4823,323,4400,775,382,791,4823,2011,1833,420,3645,7041,512,517,220,330,609,794,610,345,220,330,425,794,528,198,633,14711,2724,512,678,25,30505,445,81101,11,13381,25,220,966,271,128009,128006,78191,128007,271,5018,609,794,330,62786,445,81101,498,330,425,794,220,966,92],"total_duration":4675906000,"load_duration":836091458,"prompt_eval_count":82,"prompt_eval_duration":3561000000,"eval_count":15,"eval_duration":275000000}' headers: Content-Length: - '761' Content-Type: - application/json; charset=utf-8 Date: - - Tue, 18 Feb 2025 21:52:21 GMT - status: - code: 200 - message: OK + - Fri, 21 Feb 2025 02:57:55 GMT + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"name": "llama3.2:3b"}' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '23' + content-type: + - application/json + host: + - localhost:11434 + user-agent: + - litellm/1.60.2 + method: POST + uri: http://localhost:11434/api/show + response: + content: "{\"license\":\"LLAMA 3.2 COMMUNITY LICENSE AGREEMENT\\nLlama 3.2 Version + Release Date: September 25, 2024\\n\\n\u201CAgreement\u201D means the terms + and conditions for use, reproduction, distribution \\nand modification of the + Llama Materials set forth herein.\\n\\n\u201CDocumentation\u201D means the specifications, + manuals and documentation accompanying Llama 3.2\\ndistributed by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D + or \u201Cyou\u201D means you, or your employer or any other person or entity + (if you are \\nentering into this Agreement on such person or entity\u2019s + behalf), of the age required under\\napplicable laws, rules or regulations to + provide legal consent and that has legal authority\\nto bind your employer or + such other person or entity if you are entering in this Agreement\\non their + behalf.\\n\\n\u201CLlama 3.2\u201D means the foundational large language models + and software and algorithms, including\\nmachine-learning model code, trained + model weights, inference-enabling code, training-enabling code,\\nfine-tuning + enabling code and other elements of the foregoing distributed by Meta at \\nhttps://www.llama.com/llama-downloads.\\n\\n\u201CLlama + Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.2 and Documentation + (and \\nany portion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D + or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in + or, \\nif you are an entity, your principal place of business is in the EEA + or Switzerland) \\nand Meta Platforms, Inc. (if you are located outside of the + EEA or Switzerland). \\n\\n\\nBy clicking \u201CI Accept\u201D below or by using + or distributing any portion or element of the Llama Materials,\\nyou agree to + be bound by this Agreement.\\n\\n\\n1. License Rights and Redistribution.\\n\\n + \ a. Grant of Rights. You are granted a non-exclusive, worldwide, \\nnon-transferable + and royalty-free limited license under Meta\u2019s intellectual property or + other rights \\nowned by Meta embodied in the Llama Materials to use, reproduce, + distribute, copy, create derivative works \\nof, and make modifications to the + Llama Materials. \\n\\n b. Redistribution and Use. \\n\\n i. If + you distribute or make available the Llama Materials (or any derivative works + thereof), \\nor a product or service (including another AI model) that contains + any of them, you shall (A) provide\\na copy of this Agreement with any such + Llama Materials; and (B) prominently display \u201CBuilt with Llama\u201D\\non + a related website, user interface, blogpost, about page, or product documentation. + If you use the\\nLlama Materials or any outputs or results of the Llama Materials + to create, train, fine tune, or\\notherwise improve an AI model, which is distributed + or made available, you shall also include \u201CLlama\u201D\\nat the beginning + of any such AI model name.\\n\\n ii. If you receive Llama Materials, + or any derivative works thereof, from a Licensee as part\\nof an integrated + end user product, then Section 2 of this Agreement will not apply to you. \\n\\n + \ iii. You must retain in all copies of the Llama Materials that you distribute + the \\nfollowing attribution notice within a \u201CNotice\u201D text file distributed + as a part of such copies: \\n\u201CLlama 3.2 is licensed under the Llama 3.2 + Community License, Copyright \xA9 Meta Platforms,\\nInc. All Rights Reserved.\u201D\\n\\n + \ iv. Your use of the Llama Materials must comply with applicable laws + and regulations\\n(including trade compliance laws and regulations) and adhere + to the Acceptable Use Policy for\\nthe Llama Materials (available at https://www.llama.com/llama3_2/use-policy), + which is hereby \\nincorporated by reference into this Agreement.\\n \\n2. + Additional Commercial Terms. If, on the Llama 3.2 version release date, the + monthly active users\\nof the products or services made available by or for + Licensee, or Licensee\u2019s affiliates, \\nis greater than 700 million monthly + active users in the preceding calendar month, you must request \\na license + from Meta, which Meta may grant to you in its sole discretion, and you are not + authorized to\\nexercise any of the rights under this Agreement unless or until + Meta otherwise expressly grants you such rights.\\n\\n3. Disclaimer of Warranty. + UNLESS REQUIRED BY APPLICABLE LAW, THE LLAMA MATERIALS AND ANY OUTPUT AND \\nRESULTS + THEREFROM ARE PROVIDED ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF + ANY KIND, AND META DISCLAIMS\\nALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND + IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES\\nOF TITLE, NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE\\nFOR + DETERMINING THE APPROPRIATENESS OF USING OR REDISTRIBUTING THE LLAMA MATERIALS + AND ASSUME ANY RISKS ASSOCIATED\\nWITH YOUR USE OF THE LLAMA MATERIALS AND ANY + OUTPUT AND RESULTS.\\n\\n4. Limitation of Liability. IN NO EVENT WILL META OR + ITS AFFILIATES BE LIABLE UNDER ANY THEORY OF LIABILITY, \\nWHETHER IN CONTRACT, + TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR OTHERWISE, ARISING OUT OF THIS AGREEMENT, + \\nFOR ANY LOST PROFITS OR ANY INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL, + EXEMPLARY OR PUNITIVE DAMAGES, EVEN \\nIF META OR ITS AFFILIATES HAVE BEEN ADVISED + OF THE POSSIBILITY OF ANY OF THE FOREGOING.\\n\\n5. Intellectual Property.\\n\\n + \ a. No trademark licenses are granted under this Agreement, and in connection + with the Llama Materials, \\nneither Meta nor Licensee may use any name or mark + owned by or associated with the other or any of its affiliates, \\nexcept as + required for reasonable and customary use in describing and redistributing the + Llama Materials or as \\nset forth in this Section 5(a). Meta hereby grants + you a license to use \u201CLlama\u201D (the \u201CMark\u201D) solely as required + \\nto comply with the last sentence of Section 1.b.i. You will comply with Meta\u2019s + brand guidelines (currently accessible \\nat https://about.meta.com/brand/resources/meta/company-brand/). + All goodwill arising out of your use of the Mark \\nwill inure to the benefit + of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and + derivatives made by or for Meta, with respect to any\\n derivative works + and modifications of the Llama Materials that are made by you, as between you + and Meta,\\n you are and will be the owner of such derivative works and modifications.\\n\\n + \ c. If you institute litigation or other proceedings against Meta or any + entity (including a cross-claim or\\n counterclaim in a lawsuit) alleging + that the Llama Materials or Llama 3.2 outputs or results, or any portion\\n + \ of any of the foregoing, constitutes infringement of intellectual property + or other rights owned or licensable\\n by you, then any licenses granted + to you under this Agreement shall terminate as of the date such litigation or\\n + \ claim is filed or instituted. You will indemnify and hold harmless Meta + from and against any claim by any third\\n party arising out of or related + to your use or distribution of the Llama Materials.\\n\\n6. Term and Termination. + The term of this Agreement will commence upon your acceptance of this Agreement + or access\\nto the Llama Materials and will continue in full force and effect + until terminated in accordance with the terms\\nand conditions herein. Meta + may terminate this Agreement if you are in breach of any term or condition of + this\\nAgreement. Upon termination of this Agreement, you shall delete and cease + use of the Llama Materials. Sections 3,\\n4 and 7 shall survive the termination + of this Agreement. \\n\\n7. Governing Law and Jurisdiction. This Agreement will + be governed and construed under the laws of the State of \\nCalifornia without + regard to choice of law principles, and the UN Convention on Contracts for the + International\\nSale of Goods does not apply to this Agreement. The courts of + California shall have exclusive jurisdiction of\\nany dispute arising out of + this Agreement.\\n**Llama 3.2** **Acceptable Use Policy**\\n\\nMeta is committed + to promoting safe and fair use of its tools and features, including Llama 3.2. + If you access or use Llama 3.2, you agree to this Acceptable Use Policy (\u201C**Policy**\u201D). + The most recent copy of this policy can be found at [https://www.llama.com/llama3_2/use-policy](https://www.llama.com/llama3_2/use-policy).\\n\\n**Prohibited + Uses**\\n\\nWe want everyone to use Llama 3.2 safely and responsibly. You agree + you will not use, or allow others to use, Llama 3.2 to:\\n\\n\\n\\n1. Violate + the law or others\u2019 rights, including to:\\n 1. Engage in, promote, generate, + contribute to, encourage, plan, incite, or further illegal or unlawful activity + or content, such as:\\n 1. Violence or terrorism\\n 2. Exploitation + or harm to children, including the solicitation, creation, acquisition, or dissemination + of child exploitative content or failure to report Child Sexual Abuse Material\\n + \ 3. Human trafficking, exploitation, and sexual violence\\n 4. + The illegal distribution of information or materials to minors, including obscene + materials, or failure to employ legally required age-gating in connection with + such information or materials.\\n 5. Sexual solicitation\\n 6. + Any other criminal activity\\n 1. Engage in, promote, incite, or facilitate + the harassment, abuse, threatening, or bullying of individuals or groups of + individuals\\n 2. Engage in, promote, incite, or facilitate discrimination + or other unlawful or harmful conduct in the provision of employment, employment + benefits, credit, housing, other economic benefits, or other essential goods + and services\\n 3. Engage in the unauthorized or unlicensed practice of any + profession including, but not limited to, financial, legal, medical/health, + or related professional practices\\n 4. Collect, process, disclose, generate, + or infer private or sensitive information about individuals, including information + about individuals\u2019 identity, health, or demographic information, unless + you have obtained the right to do so in accordance with applicable law\\n 5. + Engage in or facilitate any action or generate any content that infringes, misappropriates, + or otherwise violates any third-party rights, including the outputs or results + of any products or services using the Llama Materials\\n 6. Create, generate, + or facilitate the creation of malicious code, malware, computer viruses or do + anything else that could disable, overburden, interfere with or impair the proper + working, integrity, operation or appearance of a website or computer system\\n + \ 7. Engage in any action, or facilitate any action, to intentionally circumvent + or remove usage restrictions or other safety measures, or to enable functionality + disabled by Meta\\n2. Engage in, promote, incite, facilitate, or assist in the + planning or development of activities that present a risk of death or bodily + harm to individuals, including use of Llama 3.2 related to the following:\\n + \ 8. Military, warfare, nuclear industries or applications, espionage, use + for materials or activities that are subject to the International Traffic Arms + Regulations (ITAR) maintained by the United States Department of State or to + the U.S. Biological Weapons Anti-Terrorism Act of 1989 or the Chemical Weapons + Convention Implementation Act of 1997\\n 9. Guns and illegal weapons (including + weapon development)\\n 10. Illegal drugs and regulated/controlled substances\\n + \ 11. Operation of critical infrastructure, transportation technologies, or + heavy machinery\\n 12. Self-harm or harm to others, including suicide, cutting, + and eating disorders\\n 13. Any content intended to incite or promote violence, + abuse, or any infliction of bodily harm to an individual\\n3. Intentionally + deceive or mislead others, including use of Llama 3.2 related to the following:\\n + \ 14. Generating, promoting, or furthering fraud or the creation or promotion + of disinformation\\n 15. Generating, promoting, or furthering defamatory + content, including the creation of defamatory statements, images, or other content\\n + \ 16. Generating, promoting, or further distributing spam\\n 17. Impersonating + another individual without consent, authorization, or legal right\\n 18. + Representing that the use of Llama 3.2 or outputs are human-generated\\n 19. + Generating or facilitating false online engagement, including fake reviews and + other means of fake online engagement\\n4. Fail to appropriately disclose to + end users any known dangers of your AI system\\n5. Interact with third party + tools, models, or software designed to generate unlawful content or engage in + unlawful or harmful conduct and/or represent that the outputs of such tools, + models, or software are associated with Meta or Llama 3.2\\n\\nWith respect + to any multimodal models included in Llama 3.2, the rights granted under Section + 1(a) of the Llama 3.2 Community License Agreement are not being granted to you + if you are an individual domiciled in, or a company with a principal place of + business in, the European Union. This restriction does not apply to end users + of a product or service that incorporates any such multimodal models.\\n\\nPlease + report any violation of this Policy, software \u201Cbug,\u201D or other problems + that could lead to a violation of this Policy through one of the following means:\\n\\n\\n\\n* + Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://l.workplace.com/l.php?u=https%3A%2F%2Fgithub.com%2Fmeta-llama%2Fllama-models%2Fissues\\u0026h=AT0qV8W9BFT6NwihiOHRuKYQM_UnkzN_NmHMy91OT55gkLpgi4kQupHUl0ssR4dQsIQ8n3tfd0vtkobvsEvt1l4Ic6GXI2EeuHV8N08OG2WnbAmm0FL4ObkazC6G_256vN0lN9DsykCvCqGZ)\\n* + Reporting risky content generated by the model: [developers.facebook.com/llama_output_feedback](http://developers.facebook.com/llama_output_feedback)\\n* + Reporting bugs and security concerns: [facebook.com/whitehat/info](http://facebook.com/whitehat/info)\\n* + Reporting violations of the Acceptable Use Policy or unlicensed uses of Llama + 3.2: LlamaUseReport@meta.com\",\"modelfile\":\"# Modelfile generated by \\\"ollama + show\\\"\\n# To build a new Modelfile based on this, replace FROM with:\\n# + FROM llama3.2:3b\\n\\nFROM /Users/joaomoura/.ollama/models/blobs/sha256-dde5aa3fc5ffc17176b5e8bdc82f587b24b2678c6c66101bf7da77af9f7ccdff\\nTEMPLATE + \\\"\\\"\\\"\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\nCutting + Knowledge Date: December 2023\\n\\n{{ if .System }}{{ .System }}\\n{{- end }}\\n{{- + if .Tools }}When you receive a tool call response, use the output to format + an answer to the orginal user question.\\n\\nYou are a helpful assistant with + tool calling capabilities.\\n{{- end }}\\u003c|eot_id|\\u003e\\n{{- range $i, + $_ := .Messages }}\\n{{- $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- + if eq .Role \\\"user\\\" }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- + if and $.Tools $last }}\\n\\nGiven the following functions, please respond with + a JSON for a function call with its proper arguments that best answers the given + prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": + dictionary of argument name and its value}. Do not use variables.\\n\\n{{ range + $.Tools }}\\n{{- . }}\\n{{ end }}\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- + else }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- end }}{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- + if .ToolCalls }}\\n{{ range .ToolCalls }}\\n{\\\"name\\\": \\\"{{ .Function.Name + }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ + .Content }}\\n{{- end }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- + else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ + .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- end }}\\n{{- end }}\\\"\\\"\\\"\\nPARAMETER stop \\u003c|start_header_id|\\u003e\\nPARAMETER + stop \\u003c|end_header_id|\\u003e\\nPARAMETER stop \\u003c|eot_id|\\u003e\\nLICENSE + \\\"LLAMA 3.2 COMMUNITY LICENSE AGREEMENT\\nLlama 3.2 Version Release Date: + September 25, 2024\\n\\n\u201CAgreement\u201D means the terms and conditions + for use, reproduction, distribution \\nand modification of the Llama Materials + set forth herein.\\n\\n\u201CDocumentation\u201D means the specifications, manuals + and documentation accompanying Llama 3.2\\ndistributed by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D + or \u201Cyou\u201D means you, or your employer or any other person or entity + (if you are \\nentering into this Agreement on such person or entity\u2019s + behalf), of the age required under\\napplicable laws, rules or regulations to + provide legal consent and that has legal authority\\nto bind your employer or + such other person or entity if you are entering in this Agreement\\non their + behalf.\\n\\n\u201CLlama 3.2\u201D means the foundational large language models + and software and algorithms, including\\nmachine-learning model code, trained + model weights, inference-enabling code, training-enabling code,\\nfine-tuning + enabling code and other elements of the foregoing distributed by Meta at \\nhttps://www.llama.com/llama-downloads.\\n\\n\u201CLlama + Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.2 and Documentation + (and \\nany portion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D + or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in + or, \\nif you are an entity, your principal place of business is in the EEA + or Switzerland) \\nand Meta Platforms, Inc. (if you are located outside of the + EEA or Switzerland). \\n\\n\\nBy clicking \u201CI Accept\u201D below or by using + or distributing any portion or element of the Llama Materials,\\nyou agree to + be bound by this Agreement.\\n\\n\\n1. License Rights and Redistribution.\\n\\n + \ a. Grant of Rights. You are granted a non-exclusive, worldwide, \\nnon-transferable + and royalty-free limited license under Meta\u2019s intellectual property or + other rights \\nowned by Meta embodied in the Llama Materials to use, reproduce, + distribute, copy, create derivative works \\nof, and make modifications to the + Llama Materials. \\n\\n b. Redistribution and Use. \\n\\n i. If + you distribute or make available the Llama Materials (or any derivative works + thereof), \\nor a product or service (including another AI model) that contains + any of them, you shall (A) provide\\na copy of this Agreement with any such + Llama Materials; and (B) prominently display \u201CBuilt with Llama\u201D\\non + a related website, user interface, blogpost, about page, or product documentation. + If you use the\\nLlama Materials or any outputs or results of the Llama Materials + to create, train, fine tune, or\\notherwise improve an AI model, which is distributed + or made available, you shall also include \u201CLlama\u201D\\nat the beginning + of any such AI model name.\\n\\n ii. If you receive Llama Materials, + or any derivative works thereof, from a Licensee as part\\nof an integrated + end user product, then Section 2 of this Agreement will not apply to you. \\n\\n + \ iii. You must retain in all copies of the Llama Materials that you distribute + the \\nfollowing attribution notice within a \u201CNotice\u201D text file distributed + as a part of such copies: \\n\u201CLlama 3.2 is licensed under the Llama 3.2 + Community License, Copyright \xA9 Meta Platforms,\\nInc. All Rights Reserved.\u201D\\n\\n + \ iv. Your use of the Llama Materials must comply with applicable laws + and regulations\\n(including trade compliance laws and regulations) and adhere + to the Acceptable Use Policy for\\nthe Llama Materials (available at https://www.llama.com/llama3_2/use-policy), + which is hereby \\nincorporated by reference into this Agreement.\\n \\n2. + Additional Commercial Terms. If, on the Llama 3.2 version release date, the + monthly active users\\nof the products or services made available by or for + Licensee, or Licensee\u2019s affiliates, \\nis greater than 700 million monthly + active users in the preceding calendar month, you must request \\na license + from Meta, which Meta may grant to you in its sole discretion, and you are not + authorized to\\nexercise any of the rights under this Agreement unless or until + Meta otherwise expressly grants you such rights.\\n\\n3. Disclaimer of Warranty. + UNLESS REQUIRED BY APPLICABLE LAW, THE LLAMA MATERIALS AND ANY OUTPUT AND \\nRESULTS + THEREFROM ARE PROVIDED ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF + ANY KIND, AND META DISCLAIMS\\nALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND + IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES\\nOF TITLE, NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE\\nFOR + DETERMINING THE APPROPRIATENESS OF USING OR REDISTRIBUTING THE LLAMA MATERIALS + AND ASSUME ANY RISKS ASSOCIATED\\nWITH YOUR USE OF THE LLAMA MATERIALS AND ANY + OUTPUT AND RESULTS.\\n\\n4. Limitation of Liability. IN NO EVENT WILL META OR + ITS AFFILIATES BE LIABLE UNDER ANY THEORY OF LIABILITY, \\nWHETHER IN CONTRACT, + TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR OTHERWISE, ARISING OUT OF THIS AGREEMENT, + \\nFOR ANY LOST PROFITS OR ANY INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL, + EXEMPLARY OR PUNITIVE DAMAGES, EVEN \\nIF META OR ITS AFFILIATES HAVE BEEN ADVISED + OF THE POSSIBILITY OF ANY OF THE FOREGOING.\\n\\n5. Intellectual Property.\\n\\n + \ a. No trademark licenses are granted under this Agreement, and in connection + with the Llama Materials, \\nneither Meta nor Licensee may use any name or mark + owned by or associated with the other or any of its affiliates, \\nexcept as + required for reasonable and customary use in describing and redistributing the + Llama Materials or as \\nset forth in this Section 5(a). Meta hereby grants + you a license to use \u201CLlama\u201D (the \u201CMark\u201D) solely as required + \\nto comply with the last sentence of Section 1.b.i. You will comply with Meta\u2019s + brand guidelines (currently accessible \\nat https://about.meta.com/brand/resources/meta/company-brand/). + All goodwill arising out of your use of the Mark \\nwill inure to the benefit + of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and + derivatives made by or for Meta, with respect to any\\n derivative works + and modifications of the Llama Materials that are made by you, as between you + and Meta,\\n you are and will be the owner of such derivative works and modifications.\\n\\n + \ c. If you institute litigation or other proceedings against Meta or any + entity (including a cross-claim or\\n counterclaim in a lawsuit) alleging + that the Llama Materials or Llama 3.2 outputs or results, or any portion\\n + \ of any of the foregoing, constitutes infringement of intellectual property + or other rights owned or licensable\\n by you, then any licenses granted + to you under this Agreement shall terminate as of the date such litigation or\\n + \ claim is filed or instituted. You will indemnify and hold harmless Meta + from and against any claim by any third\\n party arising out of or related + to your use or distribution of the Llama Materials.\\n\\n6. Term and Termination. + The term of this Agreement will commence upon your acceptance of this Agreement + or access\\nto the Llama Materials and will continue in full force and effect + until terminated in accordance with the terms\\nand conditions herein. Meta + may terminate this Agreement if you are in breach of any term or condition of + this\\nAgreement. Upon termination of this Agreement, you shall delete and cease + use of the Llama Materials. Sections 3,\\n4 and 7 shall survive the termination + of this Agreement. \\n\\n7. Governing Law and Jurisdiction. This Agreement will + be governed and construed under the laws of the State of \\nCalifornia without + regard to choice of law principles, and the UN Convention on Contracts for the + International\\nSale of Goods does not apply to this Agreement. The courts of + California shall have exclusive jurisdiction of\\nany dispute arising out of + this Agreement.\\\"\\nLICENSE \\\"**Llama 3.2** **Acceptable Use Policy**\\n\\nMeta + is committed to promoting safe and fair use of its tools and features, including + Llama 3.2. If you access or use Llama 3.2, you agree to this Acceptable Use + Policy (\u201C**Policy**\u201D). The most recent copy of this policy can be + found at [https://www.llama.com/llama3_2/use-policy](https://www.llama.com/llama3_2/use-policy).\\n\\n**Prohibited + Uses**\\n\\nWe want everyone to use Llama 3.2 safely and responsibly. You agree + you will not use, or allow others to use, Llama 3.2 to:\\n\\n\\n\\n1. Violate + the law or others\u2019 rights, including to:\\n 1. Engage in, promote, generate, + contribute to, encourage, plan, incite, or further illegal or unlawful activity + or content, such as:\\n 1. Violence or terrorism\\n 2. Exploitation + or harm to children, including the solicitation, creation, acquisition, or dissemination + of child exploitative content or failure to report Child Sexual Abuse Material\\n + \ 3. Human trafficking, exploitation, and sexual violence\\n 4. + The illegal distribution of information or materials to minors, including obscene + materials, or failure to employ legally required age-gating in connection with + such information or materials.\\n 5. Sexual solicitation\\n 6. + Any other criminal activity\\n 1. Engage in, promote, incite, or facilitate + the harassment, abuse, threatening, or bullying of individuals or groups of + individuals\\n 2. Engage in, promote, incite, or facilitate discrimination + or other unlawful or harmful conduct in the provision of employment, employment + benefits, credit, housing, other economic benefits, or other essential goods + and services\\n 3. Engage in the unauthorized or unlicensed practice of any + profession including, but not limited to, financial, legal, medical/health, + or related professional practices\\n 4. Collect, process, disclose, generate, + or infer private or sensitive information about individuals, including information + about individuals\u2019 identity, health, or demographic information, unless + you have obtained the right to do so in accordance with applicable law\\n 5. + Engage in or facilitate any action or generate any content that infringes, misappropriates, + or otherwise violates any third-party rights, including the outputs or results + of any products or services using the Llama Materials\\n 6. Create, generate, + or facilitate the creation of malicious code, malware, computer viruses or do + anything else that could disable, overburden, interfere with or impair the proper + working, integrity, operation or appearance of a website or computer system\\n + \ 7. Engage in any action, or facilitate any action, to intentionally circumvent + or remove usage restrictions or other safety measures, or to enable functionality + disabled by Meta\\n2. Engage in, promote, incite, facilitate, or assist in the + planning or development of activities that present a risk of death or bodily + harm to individuals, including use of Llama 3.2 related to the following:\\n + \ 8. Military, warfare, nuclear industries or applications, espionage, use + for materials or activities that are subject to the International Traffic Arms + Regulations (ITAR) maintained by the United States Department of State or to + the U.S. Biological Weapons Anti-Terrorism Act of 1989 or the Chemical Weapons + Convention Implementation Act of 1997\\n 9. Guns and illegal weapons (including + weapon development)\\n 10. Illegal drugs and regulated/controlled substances\\n + \ 11. Operation of critical infrastructure, transportation technologies, or + heavy machinery\\n 12. Self-harm or harm to others, including suicide, cutting, + and eating disorders\\n 13. Any content intended to incite or promote violence, + abuse, or any infliction of bodily harm to an individual\\n3. Intentionally + deceive or mislead others, including use of Llama 3.2 related to the following:\\n + \ 14. Generating, promoting, or furthering fraud or the creation or promotion + of disinformation\\n 15. Generating, promoting, or furthering defamatory + content, including the creation of defamatory statements, images, or other content\\n + \ 16. Generating, promoting, or further distributing spam\\n 17. Impersonating + another individual without consent, authorization, or legal right\\n 18. + Representing that the use of Llama 3.2 or outputs are human-generated\\n 19. + Generating or facilitating false online engagement, including fake reviews and + other means of fake online engagement\\n4. Fail to appropriately disclose to + end users any known dangers of your AI system\\n5. Interact with third party + tools, models, or software designed to generate unlawful content or engage in + unlawful or harmful conduct and/or represent that the outputs of such tools, + models, or software are associated with Meta or Llama 3.2\\n\\nWith respect + to any multimodal models included in Llama 3.2, the rights granted under Section + 1(a) of the Llama 3.2 Community License Agreement are not being granted to you + if you are an individual domiciled in, or a company with a principal place of + business in, the European Union. This restriction does not apply to end users + of a product or service that incorporates any such multimodal models.\\n\\nPlease + report any violation of this Policy, software \u201Cbug,\u201D or other problems + that could lead to a violation of this Policy through one of the following means:\\n\\n\\n\\n* + Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://l.workplace.com/l.php?u=https%3A%2F%2Fgithub.com%2Fmeta-llama%2Fllama-models%2Fissues\\u0026h=AT0qV8W9BFT6NwihiOHRuKYQM_UnkzN_NmHMy91OT55gkLpgi4kQupHUl0ssR4dQsIQ8n3tfd0vtkobvsEvt1l4Ic6GXI2EeuHV8N08OG2WnbAmm0FL4ObkazC6G_256vN0lN9DsykCvCqGZ)\\n* + Reporting risky content generated by the model: [developers.facebook.com/llama_output_feedback](http://developers.facebook.com/llama_output_feedback)\\n* + Reporting bugs and security concerns: [facebook.com/whitehat/info](http://facebook.com/whitehat/info)\\n* + Reporting violations of the Acceptable Use Policy or unlicensed uses of Llama + 3.2: LlamaUseReport@meta.com\\\"\\n\",\"parameters\":\"stop \\\"\\u003c|start_header_id|\\u003e\\\"\\nstop + \ \\\"\\u003c|end_header_id|\\u003e\\\"\\nstop \\\"\\u003c|eot_id|\\u003e\\\"\",\"template\":\"\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\nCutting + Knowledge Date: December 2023\\n\\n{{ if .System }}{{ .System }}\\n{{- end }}\\n{{- + if .Tools }}When you receive a tool call response, use the output to format + an answer to the orginal user question.\\n\\nYou are a helpful assistant with + tool calling capabilities.\\n{{- end }}\\u003c|eot_id|\\u003e\\n{{- range $i, + $_ := .Messages }}\\n{{- $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- + if eq .Role \\\"user\\\" }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- + if and $.Tools $last }}\\n\\nGiven the following functions, please respond with + a JSON for a function call with its proper arguments that best answers the given + prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": + dictionary of argument name and its value}. Do not use variables.\\n\\n{{ range + $.Tools }}\\n{{- . }}\\n{{ end }}\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- + else }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- end }}{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- + if .ToolCalls }}\\n{{ range .ToolCalls }}\\n{\\\"name\\\": \\\"{{ .Function.Name + }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ + .Content }}\\n{{- end }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- + else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ + .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- end }}\\n{{- end }}\",\"details\":{\"parent_model\":\"\",\"format\":\"gguf\",\"family\":\"llama\",\"families\":[\"llama\"],\"parameter_size\":\"3.2B\",\"quantization_level\":\"Q4_K_M\"},\"model_info\":{\"general.architecture\":\"llama\",\"general.basename\":\"Llama-3.2\",\"general.file_type\":15,\"general.finetune\":\"Instruct\",\"general.languages\":[\"en\",\"de\",\"fr\",\"it\",\"pt\",\"hi\",\"es\",\"th\"],\"general.parameter_count\":3212749888,\"general.quantization_version\":2,\"general.size_label\":\"3B\",\"general.tags\":[\"facebook\",\"meta\",\"pytorch\",\"llama\",\"llama-3\",\"text-generation\"],\"general.type\":\"model\",\"llama.attention.head_count\":24,\"llama.attention.head_count_kv\":8,\"llama.attention.key_length\":128,\"llama.attention.layer_norm_rms_epsilon\":0.00001,\"llama.attention.value_length\":128,\"llama.block_count\":28,\"llama.context_length\":131072,\"llama.embedding_length\":3072,\"llama.feed_forward_length\":8192,\"llama.rope.dimension_count\":128,\"llama.rope.freq_base\":500000,\"llama.vocab_size\":128256,\"tokenizer.ggml.bos_token_id\":128000,\"tokenizer.ggml.eos_token_id\":128009,\"tokenizer.ggml.merges\":null,\"tokenizer.ggml.model\":\"gpt2\",\"tokenizer.ggml.pre\":\"llama-bpe\",\"tokenizer.ggml.token_type\":null,\"tokenizer.ggml.tokens\":null},\"modified_at\":\"2025-02-20T18:55:09.150577031-08:00\"}" + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Fri, 21 Feb 2025 02:57:55 GMT + Transfer-Encoding: + - chunked + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"name": "llama3.2:3b"}' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '23' + content-type: + - application/json + host: + - localhost:11434 + user-agent: + - litellm/1.60.2 + method: POST + uri: http://localhost:11434/api/show + response: + content: "{\"license\":\"LLAMA 3.2 COMMUNITY LICENSE AGREEMENT\\nLlama 3.2 Version + Release Date: September 25, 2024\\n\\n\u201CAgreement\u201D means the terms + and conditions for use, reproduction, distribution \\nand modification of the + Llama Materials set forth herein.\\n\\n\u201CDocumentation\u201D means the specifications, + manuals and documentation accompanying Llama 3.2\\ndistributed by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D + or \u201Cyou\u201D means you, or your employer or any other person or entity + (if you are \\nentering into this Agreement on such person or entity\u2019s + behalf), of the age required under\\napplicable laws, rules or regulations to + provide legal consent and that has legal authority\\nto bind your employer or + such other person or entity if you are entering in this Agreement\\non their + behalf.\\n\\n\u201CLlama 3.2\u201D means the foundational large language models + and software and algorithms, including\\nmachine-learning model code, trained + model weights, inference-enabling code, training-enabling code,\\nfine-tuning + enabling code and other elements of the foregoing distributed by Meta at \\nhttps://www.llama.com/llama-downloads.\\n\\n\u201CLlama + Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.2 and Documentation + (and \\nany portion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D + or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in + or, \\nif you are an entity, your principal place of business is in the EEA + or Switzerland) \\nand Meta Platforms, Inc. (if you are located outside of the + EEA or Switzerland). \\n\\n\\nBy clicking \u201CI Accept\u201D below or by using + or distributing any portion or element of the Llama Materials,\\nyou agree to + be bound by this Agreement.\\n\\n\\n1. License Rights and Redistribution.\\n\\n + \ a. Grant of Rights. You are granted a non-exclusive, worldwide, \\nnon-transferable + and royalty-free limited license under Meta\u2019s intellectual property or + other rights \\nowned by Meta embodied in the Llama Materials to use, reproduce, + distribute, copy, create derivative works \\nof, and make modifications to the + Llama Materials. \\n\\n b. Redistribution and Use. \\n\\n i. If + you distribute or make available the Llama Materials (or any derivative works + thereof), \\nor a product or service (including another AI model) that contains + any of them, you shall (A) provide\\na copy of this Agreement with any such + Llama Materials; and (B) prominently display \u201CBuilt with Llama\u201D\\non + a related website, user interface, blogpost, about page, or product documentation. + If you use the\\nLlama Materials or any outputs or results of the Llama Materials + to create, train, fine tune, or\\notherwise improve an AI model, which is distributed + or made available, you shall also include \u201CLlama\u201D\\nat the beginning + of any such AI model name.\\n\\n ii. If you receive Llama Materials, + or any derivative works thereof, from a Licensee as part\\nof an integrated + end user product, then Section 2 of this Agreement will not apply to you. \\n\\n + \ iii. You must retain in all copies of the Llama Materials that you distribute + the \\nfollowing attribution notice within a \u201CNotice\u201D text file distributed + as a part of such copies: \\n\u201CLlama 3.2 is licensed under the Llama 3.2 + Community License, Copyright \xA9 Meta Platforms,\\nInc. All Rights Reserved.\u201D\\n\\n + \ iv. Your use of the Llama Materials must comply with applicable laws + and regulations\\n(including trade compliance laws and regulations) and adhere + to the Acceptable Use Policy for\\nthe Llama Materials (available at https://www.llama.com/llama3_2/use-policy), + which is hereby \\nincorporated by reference into this Agreement.\\n \\n2. + Additional Commercial Terms. If, on the Llama 3.2 version release date, the + monthly active users\\nof the products or services made available by or for + Licensee, or Licensee\u2019s affiliates, \\nis greater than 700 million monthly + active users in the preceding calendar month, you must request \\na license + from Meta, which Meta may grant to you in its sole discretion, and you are not + authorized to\\nexercise any of the rights under this Agreement unless or until + Meta otherwise expressly grants you such rights.\\n\\n3. Disclaimer of Warranty. + UNLESS REQUIRED BY APPLICABLE LAW, THE LLAMA MATERIALS AND ANY OUTPUT AND \\nRESULTS + THEREFROM ARE PROVIDED ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF + ANY KIND, AND META DISCLAIMS\\nALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND + IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES\\nOF TITLE, NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE\\nFOR + DETERMINING THE APPROPRIATENESS OF USING OR REDISTRIBUTING THE LLAMA MATERIALS + AND ASSUME ANY RISKS ASSOCIATED\\nWITH YOUR USE OF THE LLAMA MATERIALS AND ANY + OUTPUT AND RESULTS.\\n\\n4. Limitation of Liability. IN NO EVENT WILL META OR + ITS AFFILIATES BE LIABLE UNDER ANY THEORY OF LIABILITY, \\nWHETHER IN CONTRACT, + TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR OTHERWISE, ARISING OUT OF THIS AGREEMENT, + \\nFOR ANY LOST PROFITS OR ANY INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL, + EXEMPLARY OR PUNITIVE DAMAGES, EVEN \\nIF META OR ITS AFFILIATES HAVE BEEN ADVISED + OF THE POSSIBILITY OF ANY OF THE FOREGOING.\\n\\n5. Intellectual Property.\\n\\n + \ a. No trademark licenses are granted under this Agreement, and in connection + with the Llama Materials, \\nneither Meta nor Licensee may use any name or mark + owned by or associated with the other or any of its affiliates, \\nexcept as + required for reasonable and customary use in describing and redistributing the + Llama Materials or as \\nset forth in this Section 5(a). Meta hereby grants + you a license to use \u201CLlama\u201D (the \u201CMark\u201D) solely as required + \\nto comply with the last sentence of Section 1.b.i. You will comply with Meta\u2019s + brand guidelines (currently accessible \\nat https://about.meta.com/brand/resources/meta/company-brand/). + All goodwill arising out of your use of the Mark \\nwill inure to the benefit + of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and + derivatives made by or for Meta, with respect to any\\n derivative works + and modifications of the Llama Materials that are made by you, as between you + and Meta,\\n you are and will be the owner of such derivative works and modifications.\\n\\n + \ c. If you institute litigation or other proceedings against Meta or any + entity (including a cross-claim or\\n counterclaim in a lawsuit) alleging + that the Llama Materials or Llama 3.2 outputs or results, or any portion\\n + \ of any of the foregoing, constitutes infringement of intellectual property + or other rights owned or licensable\\n by you, then any licenses granted + to you under this Agreement shall terminate as of the date such litigation or\\n + \ claim is filed or instituted. You will indemnify and hold harmless Meta + from and against any claim by any third\\n party arising out of or related + to your use or distribution of the Llama Materials.\\n\\n6. Term and Termination. + The term of this Agreement will commence upon your acceptance of this Agreement + or access\\nto the Llama Materials and will continue in full force and effect + until terminated in accordance with the terms\\nand conditions herein. Meta + may terminate this Agreement if you are in breach of any term or condition of + this\\nAgreement. Upon termination of this Agreement, you shall delete and cease + use of the Llama Materials. Sections 3,\\n4 and 7 shall survive the termination + of this Agreement. \\n\\n7. Governing Law and Jurisdiction. This Agreement will + be governed and construed under the laws of the State of \\nCalifornia without + regard to choice of law principles, and the UN Convention on Contracts for the + International\\nSale of Goods does not apply to this Agreement. The courts of + California shall have exclusive jurisdiction of\\nany dispute arising out of + this Agreement.\\n**Llama 3.2** **Acceptable Use Policy**\\n\\nMeta is committed + to promoting safe and fair use of its tools and features, including Llama 3.2. + If you access or use Llama 3.2, you agree to this Acceptable Use Policy (\u201C**Policy**\u201D). + The most recent copy of this policy can be found at [https://www.llama.com/llama3_2/use-policy](https://www.llama.com/llama3_2/use-policy).\\n\\n**Prohibited + Uses**\\n\\nWe want everyone to use Llama 3.2 safely and responsibly. You agree + you will not use, or allow others to use, Llama 3.2 to:\\n\\n\\n\\n1. Violate + the law or others\u2019 rights, including to:\\n 1. Engage in, promote, generate, + contribute to, encourage, plan, incite, or further illegal or unlawful activity + or content, such as:\\n 1. Violence or terrorism\\n 2. Exploitation + or harm to children, including the solicitation, creation, acquisition, or dissemination + of child exploitative content or failure to report Child Sexual Abuse Material\\n + \ 3. Human trafficking, exploitation, and sexual violence\\n 4. + The illegal distribution of information or materials to minors, including obscene + materials, or failure to employ legally required age-gating in connection with + such information or materials.\\n 5. Sexual solicitation\\n 6. + Any other criminal activity\\n 1. Engage in, promote, incite, or facilitate + the harassment, abuse, threatening, or bullying of individuals or groups of + individuals\\n 2. Engage in, promote, incite, or facilitate discrimination + or other unlawful or harmful conduct in the provision of employment, employment + benefits, credit, housing, other economic benefits, or other essential goods + and services\\n 3. Engage in the unauthorized or unlicensed practice of any + profession including, but not limited to, financial, legal, medical/health, + or related professional practices\\n 4. Collect, process, disclose, generate, + or infer private or sensitive information about individuals, including information + about individuals\u2019 identity, health, or demographic information, unless + you have obtained the right to do so in accordance with applicable law\\n 5. + Engage in or facilitate any action or generate any content that infringes, misappropriates, + or otherwise violates any third-party rights, including the outputs or results + of any products or services using the Llama Materials\\n 6. Create, generate, + or facilitate the creation of malicious code, malware, computer viruses or do + anything else that could disable, overburden, interfere with or impair the proper + working, integrity, operation or appearance of a website or computer system\\n + \ 7. Engage in any action, or facilitate any action, to intentionally circumvent + or remove usage restrictions or other safety measures, or to enable functionality + disabled by Meta\\n2. Engage in, promote, incite, facilitate, or assist in the + planning or development of activities that present a risk of death or bodily + harm to individuals, including use of Llama 3.2 related to the following:\\n + \ 8. Military, warfare, nuclear industries or applications, espionage, use + for materials or activities that are subject to the International Traffic Arms + Regulations (ITAR) maintained by the United States Department of State or to + the U.S. Biological Weapons Anti-Terrorism Act of 1989 or the Chemical Weapons + Convention Implementation Act of 1997\\n 9. Guns and illegal weapons (including + weapon development)\\n 10. Illegal drugs and regulated/controlled substances\\n + \ 11. Operation of critical infrastructure, transportation technologies, or + heavy machinery\\n 12. Self-harm or harm to others, including suicide, cutting, + and eating disorders\\n 13. Any content intended to incite or promote violence, + abuse, or any infliction of bodily harm to an individual\\n3. Intentionally + deceive or mislead others, including use of Llama 3.2 related to the following:\\n + \ 14. Generating, promoting, or furthering fraud or the creation or promotion + of disinformation\\n 15. Generating, promoting, or furthering defamatory + content, including the creation of defamatory statements, images, or other content\\n + \ 16. Generating, promoting, or further distributing spam\\n 17. Impersonating + another individual without consent, authorization, or legal right\\n 18. + Representing that the use of Llama 3.2 or outputs are human-generated\\n 19. + Generating or facilitating false online engagement, including fake reviews and + other means of fake online engagement\\n4. Fail to appropriately disclose to + end users any known dangers of your AI system\\n5. Interact with third party + tools, models, or software designed to generate unlawful content or engage in + unlawful or harmful conduct and/or represent that the outputs of such tools, + models, or software are associated with Meta or Llama 3.2\\n\\nWith respect + to any multimodal models included in Llama 3.2, the rights granted under Section + 1(a) of the Llama 3.2 Community License Agreement are not being granted to you + if you are an individual domiciled in, or a company with a principal place of + business in, the European Union. This restriction does not apply to end users + of a product or service that incorporates any such multimodal models.\\n\\nPlease + report any violation of this Policy, software \u201Cbug,\u201D or other problems + that could lead to a violation of this Policy through one of the following means:\\n\\n\\n\\n* + Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://l.workplace.com/l.php?u=https%3A%2F%2Fgithub.com%2Fmeta-llama%2Fllama-models%2Fissues\\u0026h=AT0qV8W9BFT6NwihiOHRuKYQM_UnkzN_NmHMy91OT55gkLpgi4kQupHUl0ssR4dQsIQ8n3tfd0vtkobvsEvt1l4Ic6GXI2EeuHV8N08OG2WnbAmm0FL4ObkazC6G_256vN0lN9DsykCvCqGZ)\\n* + Reporting risky content generated by the model: [developers.facebook.com/llama_output_feedback](http://developers.facebook.com/llama_output_feedback)\\n* + Reporting bugs and security concerns: [facebook.com/whitehat/info](http://facebook.com/whitehat/info)\\n* + Reporting violations of the Acceptable Use Policy or unlicensed uses of Llama + 3.2: LlamaUseReport@meta.com\",\"modelfile\":\"# Modelfile generated by \\\"ollama + show\\\"\\n# To build a new Modelfile based on this, replace FROM with:\\n# + FROM llama3.2:3b\\n\\nFROM /Users/joaomoura/.ollama/models/blobs/sha256-dde5aa3fc5ffc17176b5e8bdc82f587b24b2678c6c66101bf7da77af9f7ccdff\\nTEMPLATE + \\\"\\\"\\\"\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\nCutting + Knowledge Date: December 2023\\n\\n{{ if .System }}{{ .System }}\\n{{- end }}\\n{{- + if .Tools }}When you receive a tool call response, use the output to format + an answer to the orginal user question.\\n\\nYou are a helpful assistant with + tool calling capabilities.\\n{{- end }}\\u003c|eot_id|\\u003e\\n{{- range $i, + $_ := .Messages }}\\n{{- $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- + if eq .Role \\\"user\\\" }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- + if and $.Tools $last }}\\n\\nGiven the following functions, please respond with + a JSON for a function call with its proper arguments that best answers the given + prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": + dictionary of argument name and its value}. Do not use variables.\\n\\n{{ range + $.Tools }}\\n{{- . }}\\n{{ end }}\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- + else }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- end }}{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- + if .ToolCalls }}\\n{{ range .ToolCalls }}\\n{\\\"name\\\": \\\"{{ .Function.Name + }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ + .Content }}\\n{{- end }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- + else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ + .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- end }}\\n{{- end }}\\\"\\\"\\\"\\nPARAMETER stop \\u003c|start_header_id|\\u003e\\nPARAMETER + stop \\u003c|end_header_id|\\u003e\\nPARAMETER stop \\u003c|eot_id|\\u003e\\nLICENSE + \\\"LLAMA 3.2 COMMUNITY LICENSE AGREEMENT\\nLlama 3.2 Version Release Date: + September 25, 2024\\n\\n\u201CAgreement\u201D means the terms and conditions + for use, reproduction, distribution \\nand modification of the Llama Materials + set forth herein.\\n\\n\u201CDocumentation\u201D means the specifications, manuals + and documentation accompanying Llama 3.2\\ndistributed by Meta at https://llama.meta.com/doc/overview.\\n\\n\u201CLicensee\u201D + or \u201Cyou\u201D means you, or your employer or any other person or entity + (if you are \\nentering into this Agreement on such person or entity\u2019s + behalf), of the age required under\\napplicable laws, rules or regulations to + provide legal consent and that has legal authority\\nto bind your employer or + such other person or entity if you are entering in this Agreement\\non their + behalf.\\n\\n\u201CLlama 3.2\u201D means the foundational large language models + and software and algorithms, including\\nmachine-learning model code, trained + model weights, inference-enabling code, training-enabling code,\\nfine-tuning + enabling code and other elements of the foregoing distributed by Meta at \\nhttps://www.llama.com/llama-downloads.\\n\\n\u201CLlama + Materials\u201D means, collectively, Meta\u2019s proprietary Llama 3.2 and Documentation + (and \\nany portion thereof) made available under this Agreement.\\n\\n\u201CMeta\u201D + or \u201Cwe\u201D means Meta Platforms Ireland Limited (if you are located in + or, \\nif you are an entity, your principal place of business is in the EEA + or Switzerland) \\nand Meta Platforms, Inc. (if you are located outside of the + EEA or Switzerland). \\n\\n\\nBy clicking \u201CI Accept\u201D below or by using + or distributing any portion or element of the Llama Materials,\\nyou agree to + be bound by this Agreement.\\n\\n\\n1. License Rights and Redistribution.\\n\\n + \ a. Grant of Rights. You are granted a non-exclusive, worldwide, \\nnon-transferable + and royalty-free limited license under Meta\u2019s intellectual property or + other rights \\nowned by Meta embodied in the Llama Materials to use, reproduce, + distribute, copy, create derivative works \\nof, and make modifications to the + Llama Materials. \\n\\n b. Redistribution and Use. \\n\\n i. If + you distribute or make available the Llama Materials (or any derivative works + thereof), \\nor a product or service (including another AI model) that contains + any of them, you shall (A) provide\\na copy of this Agreement with any such + Llama Materials; and (B) prominently display \u201CBuilt with Llama\u201D\\non + a related website, user interface, blogpost, about page, or product documentation. + If you use the\\nLlama Materials or any outputs or results of the Llama Materials + to create, train, fine tune, or\\notherwise improve an AI model, which is distributed + or made available, you shall also include \u201CLlama\u201D\\nat the beginning + of any such AI model name.\\n\\n ii. If you receive Llama Materials, + or any derivative works thereof, from a Licensee as part\\nof an integrated + end user product, then Section 2 of this Agreement will not apply to you. \\n\\n + \ iii. You must retain in all copies of the Llama Materials that you distribute + the \\nfollowing attribution notice within a \u201CNotice\u201D text file distributed + as a part of such copies: \\n\u201CLlama 3.2 is licensed under the Llama 3.2 + Community License, Copyright \xA9 Meta Platforms,\\nInc. All Rights Reserved.\u201D\\n\\n + \ iv. Your use of the Llama Materials must comply with applicable laws + and regulations\\n(including trade compliance laws and regulations) and adhere + to the Acceptable Use Policy for\\nthe Llama Materials (available at https://www.llama.com/llama3_2/use-policy), + which is hereby \\nincorporated by reference into this Agreement.\\n \\n2. + Additional Commercial Terms. If, on the Llama 3.2 version release date, the + monthly active users\\nof the products or services made available by or for + Licensee, or Licensee\u2019s affiliates, \\nis greater than 700 million monthly + active users in the preceding calendar month, you must request \\na license + from Meta, which Meta may grant to you in its sole discretion, and you are not + authorized to\\nexercise any of the rights under this Agreement unless or until + Meta otherwise expressly grants you such rights.\\n\\n3. Disclaimer of Warranty. + UNLESS REQUIRED BY APPLICABLE LAW, THE LLAMA MATERIALS AND ANY OUTPUT AND \\nRESULTS + THEREFROM ARE PROVIDED ON AN \u201CAS IS\u201D BASIS, WITHOUT WARRANTIES OF + ANY KIND, AND META DISCLAIMS\\nALL WARRANTIES OF ANY KIND, BOTH EXPRESS AND + IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES\\nOF TITLE, NON-INFRINGEMENT, + MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE\\nFOR + DETERMINING THE APPROPRIATENESS OF USING OR REDISTRIBUTING THE LLAMA MATERIALS + AND ASSUME ANY RISKS ASSOCIATED\\nWITH YOUR USE OF THE LLAMA MATERIALS AND ANY + OUTPUT AND RESULTS.\\n\\n4. Limitation of Liability. IN NO EVENT WILL META OR + ITS AFFILIATES BE LIABLE UNDER ANY THEORY OF LIABILITY, \\nWHETHER IN CONTRACT, + TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR OTHERWISE, ARISING OUT OF THIS AGREEMENT, + \\nFOR ANY LOST PROFITS OR ANY INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL, + EXEMPLARY OR PUNITIVE DAMAGES, EVEN \\nIF META OR ITS AFFILIATES HAVE BEEN ADVISED + OF THE POSSIBILITY OF ANY OF THE FOREGOING.\\n\\n5. Intellectual Property.\\n\\n + \ a. No trademark licenses are granted under this Agreement, and in connection + with the Llama Materials, \\nneither Meta nor Licensee may use any name or mark + owned by or associated with the other or any of its affiliates, \\nexcept as + required for reasonable and customary use in describing and redistributing the + Llama Materials or as \\nset forth in this Section 5(a). Meta hereby grants + you a license to use \u201CLlama\u201D (the \u201CMark\u201D) solely as required + \\nto comply with the last sentence of Section 1.b.i. You will comply with Meta\u2019s + brand guidelines (currently accessible \\nat https://about.meta.com/brand/resources/meta/company-brand/). + All goodwill arising out of your use of the Mark \\nwill inure to the benefit + of Meta.\\n\\n b. Subject to Meta\u2019s ownership of Llama Materials and + derivatives made by or for Meta, with respect to any\\n derivative works + and modifications of the Llama Materials that are made by you, as between you + and Meta,\\n you are and will be the owner of such derivative works and modifications.\\n\\n + \ c. If you institute litigation or other proceedings against Meta or any + entity (including a cross-claim or\\n counterclaim in a lawsuit) alleging + that the Llama Materials or Llama 3.2 outputs or results, or any portion\\n + \ of any of the foregoing, constitutes infringement of intellectual property + or other rights owned or licensable\\n by you, then any licenses granted + to you under this Agreement shall terminate as of the date such litigation or\\n + \ claim is filed or instituted. You will indemnify and hold harmless Meta + from and against any claim by any third\\n party arising out of or related + to your use or distribution of the Llama Materials.\\n\\n6. Term and Termination. + The term of this Agreement will commence upon your acceptance of this Agreement + or access\\nto the Llama Materials and will continue in full force and effect + until terminated in accordance with the terms\\nand conditions herein. Meta + may terminate this Agreement if you are in breach of any term or condition of + this\\nAgreement. Upon termination of this Agreement, you shall delete and cease + use of the Llama Materials. Sections 3,\\n4 and 7 shall survive the termination + of this Agreement. \\n\\n7. Governing Law and Jurisdiction. This Agreement will + be governed and construed under the laws of the State of \\nCalifornia without + regard to choice of law principles, and the UN Convention on Contracts for the + International\\nSale of Goods does not apply to this Agreement. The courts of + California shall have exclusive jurisdiction of\\nany dispute arising out of + this Agreement.\\\"\\nLICENSE \\\"**Llama 3.2** **Acceptable Use Policy**\\n\\nMeta + is committed to promoting safe and fair use of its tools and features, including + Llama 3.2. If you access or use Llama 3.2, you agree to this Acceptable Use + Policy (\u201C**Policy**\u201D). The most recent copy of this policy can be + found at [https://www.llama.com/llama3_2/use-policy](https://www.llama.com/llama3_2/use-policy).\\n\\n**Prohibited + Uses**\\n\\nWe want everyone to use Llama 3.2 safely and responsibly. You agree + you will not use, or allow others to use, Llama 3.2 to:\\n\\n\\n\\n1. Violate + the law or others\u2019 rights, including to:\\n 1. Engage in, promote, generate, + contribute to, encourage, plan, incite, or further illegal or unlawful activity + or content, such as:\\n 1. Violence or terrorism\\n 2. Exploitation + or harm to children, including the solicitation, creation, acquisition, or dissemination + of child exploitative content or failure to report Child Sexual Abuse Material\\n + \ 3. Human trafficking, exploitation, and sexual violence\\n 4. + The illegal distribution of information or materials to minors, including obscene + materials, or failure to employ legally required age-gating in connection with + such information or materials.\\n 5. Sexual solicitation\\n 6. + Any other criminal activity\\n 1. Engage in, promote, incite, or facilitate + the harassment, abuse, threatening, or bullying of individuals or groups of + individuals\\n 2. Engage in, promote, incite, or facilitate discrimination + or other unlawful or harmful conduct in the provision of employment, employment + benefits, credit, housing, other economic benefits, or other essential goods + and services\\n 3. Engage in the unauthorized or unlicensed practice of any + profession including, but not limited to, financial, legal, medical/health, + or related professional practices\\n 4. Collect, process, disclose, generate, + or infer private or sensitive information about individuals, including information + about individuals\u2019 identity, health, or demographic information, unless + you have obtained the right to do so in accordance with applicable law\\n 5. + Engage in or facilitate any action or generate any content that infringes, misappropriates, + or otherwise violates any third-party rights, including the outputs or results + of any products or services using the Llama Materials\\n 6. Create, generate, + or facilitate the creation of malicious code, malware, computer viruses or do + anything else that could disable, overburden, interfere with or impair the proper + working, integrity, operation or appearance of a website or computer system\\n + \ 7. Engage in any action, or facilitate any action, to intentionally circumvent + or remove usage restrictions or other safety measures, or to enable functionality + disabled by Meta\\n2. Engage in, promote, incite, facilitate, or assist in the + planning or development of activities that present a risk of death or bodily + harm to individuals, including use of Llama 3.2 related to the following:\\n + \ 8. Military, warfare, nuclear industries or applications, espionage, use + for materials or activities that are subject to the International Traffic Arms + Regulations (ITAR) maintained by the United States Department of State or to + the U.S. Biological Weapons Anti-Terrorism Act of 1989 or the Chemical Weapons + Convention Implementation Act of 1997\\n 9. Guns and illegal weapons (including + weapon development)\\n 10. Illegal drugs and regulated/controlled substances\\n + \ 11. Operation of critical infrastructure, transportation technologies, or + heavy machinery\\n 12. Self-harm or harm to others, including suicide, cutting, + and eating disorders\\n 13. Any content intended to incite or promote violence, + abuse, or any infliction of bodily harm to an individual\\n3. Intentionally + deceive or mislead others, including use of Llama 3.2 related to the following:\\n + \ 14. Generating, promoting, or furthering fraud or the creation or promotion + of disinformation\\n 15. Generating, promoting, or furthering defamatory + content, including the creation of defamatory statements, images, or other content\\n + \ 16. Generating, promoting, or further distributing spam\\n 17. Impersonating + another individual without consent, authorization, or legal right\\n 18. + Representing that the use of Llama 3.2 or outputs are human-generated\\n 19. + Generating or facilitating false online engagement, including fake reviews and + other means of fake online engagement\\n4. Fail to appropriately disclose to + end users any known dangers of your AI system\\n5. Interact with third party + tools, models, or software designed to generate unlawful content or engage in + unlawful or harmful conduct and/or represent that the outputs of such tools, + models, or software are associated with Meta or Llama 3.2\\n\\nWith respect + to any multimodal models included in Llama 3.2, the rights granted under Section + 1(a) of the Llama 3.2 Community License Agreement are not being granted to you + if you are an individual domiciled in, or a company with a principal place of + business in, the European Union. This restriction does not apply to end users + of a product or service that incorporates any such multimodal models.\\n\\nPlease + report any violation of this Policy, software \u201Cbug,\u201D or other problems + that could lead to a violation of this Policy through one of the following means:\\n\\n\\n\\n* + Reporting issues with the model: [https://github.com/meta-llama/llama-models/issues](https://l.workplace.com/l.php?u=https%3A%2F%2Fgithub.com%2Fmeta-llama%2Fllama-models%2Fissues\\u0026h=AT0qV8W9BFT6NwihiOHRuKYQM_UnkzN_NmHMy91OT55gkLpgi4kQupHUl0ssR4dQsIQ8n3tfd0vtkobvsEvt1l4Ic6GXI2EeuHV8N08OG2WnbAmm0FL4ObkazC6G_256vN0lN9DsykCvCqGZ)\\n* + Reporting risky content generated by the model: [developers.facebook.com/llama_output_feedback](http://developers.facebook.com/llama_output_feedback)\\n* + Reporting bugs and security concerns: [facebook.com/whitehat/info](http://facebook.com/whitehat/info)\\n* + Reporting violations of the Acceptable Use Policy or unlicensed uses of Llama + 3.2: LlamaUseReport@meta.com\\\"\\n\",\"parameters\":\"stop \\\"\\u003c|start_header_id|\\u003e\\\"\\nstop + \ \\\"\\u003c|end_header_id|\\u003e\\\"\\nstop \\\"\\u003c|eot_id|\\u003e\\\"\",\"template\":\"\\u003c|start_header_id|\\u003esystem\\u003c|end_header_id|\\u003e\\n\\nCutting + Knowledge Date: December 2023\\n\\n{{ if .System }}{{ .System }}\\n{{- end }}\\n{{- + if .Tools }}When you receive a tool call response, use the output to format + an answer to the orginal user question.\\n\\nYou are a helpful assistant with + tool calling capabilities.\\n{{- end }}\\u003c|eot_id|\\u003e\\n{{- range $i, + $_ := .Messages }}\\n{{- $last := eq (len (slice $.Messages $i)) 1 }}\\n{{- + if eq .Role \\\"user\\\" }}\\u003c|start_header_id|\\u003euser\\u003c|end_header_id|\\u003e\\n{{- + if and $.Tools $last }}\\n\\nGiven the following functions, please respond with + a JSON for a function call with its proper arguments that best answers the given + prompt.\\n\\nRespond in the format {\\\"name\\\": function name, \\\"parameters\\\": + dictionary of argument name and its value}. Do not use variables.\\n\\n{{ range + $.Tools }}\\n{{- . }}\\n{{ end }}\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- + else }}\\n\\n{{ .Content }}\\u003c|eot_id|\\u003e\\n{{- end }}{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- else if eq .Role \\\"assistant\\\" }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n{{- + if .ToolCalls }}\\n{{ range .ToolCalls }}\\n{\\\"name\\\": \\\"{{ .Function.Name + }}\\\", \\\"parameters\\\": {{ .Function.Arguments }}}{{ end }}\\n{{- else }}\\n\\n{{ + .Content }}\\n{{- end }}{{ if not $last }}\\u003c|eot_id|\\u003e{{ end }}\\n{{- + else if eq .Role \\\"tool\\\" }}\\u003c|start_header_id|\\u003eipython\\u003c|end_header_id|\\u003e\\n\\n{{ + .Content }}\\u003c|eot_id|\\u003e{{ if $last }}\\u003c|start_header_id|\\u003eassistant\\u003c|end_header_id|\\u003e\\n\\n{{ + end }}\\n{{- end }}\\n{{- end }}\",\"details\":{\"parent_model\":\"\",\"format\":\"gguf\",\"family\":\"llama\",\"families\":[\"llama\"],\"parameter_size\":\"3.2B\",\"quantization_level\":\"Q4_K_M\"},\"model_info\":{\"general.architecture\":\"llama\",\"general.basename\":\"Llama-3.2\",\"general.file_type\":15,\"general.finetune\":\"Instruct\",\"general.languages\":[\"en\",\"de\",\"fr\",\"it\",\"pt\",\"hi\",\"es\",\"th\"],\"general.parameter_count\":3212749888,\"general.quantization_version\":2,\"general.size_label\":\"3B\",\"general.tags\":[\"facebook\",\"meta\",\"pytorch\",\"llama\",\"llama-3\",\"text-generation\"],\"general.type\":\"model\",\"llama.attention.head_count\":24,\"llama.attention.head_count_kv\":8,\"llama.attention.key_length\":128,\"llama.attention.layer_norm_rms_epsilon\":0.00001,\"llama.attention.value_length\":128,\"llama.block_count\":28,\"llama.context_length\":131072,\"llama.embedding_length\":3072,\"llama.feed_forward_length\":8192,\"llama.rope.dimension_count\":128,\"llama.rope.freq_base\":500000,\"llama.vocab_size\":128256,\"tokenizer.ggml.bos_token_id\":128000,\"tokenizer.ggml.eos_token_id\":128009,\"tokenizer.ggml.merges\":null,\"tokenizer.ggml.model\":\"gpt2\",\"tokenizer.ggml.pre\":\"llama-bpe\",\"tokenizer.ggml.token_type\":null,\"tokenizer.ggml.tokens\":null},\"modified_at\":\"2025-02-20T18:55:09.150577031-08:00\"}" + headers: + Content-Type: + - application/json; charset=utf-8 + Date: + - Fri, 21 Feb 2025 02:57:55 GMT + Transfer-Encoding: + - chunked + http_version: HTTP/1.1 + status_code: 200 version: 1 From b50772a38b8f352888dfdfdac7eba58999bdfcf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jannik=20Maierh=C3=B6fer?= <48529566+jannikmaierhoefer@users.noreply.github.com> Date: Fri, 21 Feb 2025 16:11:55 +0100 Subject: [PATCH 14/35] docs: add header image to langfuse guide (#2128) Co-authored-by: Brandon Hancock (bhancock_ai) <109994880+bhancockio@users.noreply.github.com> --- docs/how-to/langfuse-observability.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/how-to/langfuse-observability.mdx b/docs/how-to/langfuse-observability.mdx index c0feb6d87..2fd2f2935 100644 --- a/docs/how-to/langfuse-observability.mdx +++ b/docs/how-to/langfuse-observability.mdx @@ -10,6 +10,8 @@ This notebook demonstrates how to integrate **Langfuse** with **CrewAI** using O > **What is Langfuse?** [Langfuse](https://langfuse.com) is an open-source LLM engineering platform. It provides tracing and monitoring capabilities for LLM applications, helping developers debug, analyze, and optimize their AI systems. Langfuse integrates with various tools and frameworks via native integrations, OpenTelemetry, and APIs/SDKs. +[![Langfuse Overview Video](https://github.com/user-attachments/assets/3926b288-ff61-4b95-8aa1-45d041c70866)](https://langfuse.com/watch-demo) + ## Get Started We'll walk through a simple example of using CrewAI and integrating it with Langfuse via OpenTelemetry using OpenLit. From 8a7584798b3e1ddbfcf58a15d899837dcb20832f Mon Sep 17 00:00:00 2001 From: "Brandon Hancock (bhancock_ai)" <109994880+bhancockio@users.noreply.github.com> Date: Mon, 24 Feb 2025 10:25:30 -0500 Subject: [PATCH 15/35] Better support async flows (#2193) * Better support async * Drop coroutine --- src/crewai/flow/flow.py | 75 ++++++++++++++++++++++++----------------- 1 file changed, 44 insertions(+), 31 deletions(-) diff --git a/src/crewai/flow/flow.py b/src/crewai/flow/flow.py index 2babbe57c..5f17c4b84 100644 --- a/src/crewai/flow/flow.py +++ b/src/crewai/flow/flow.py @@ -713,16 +713,35 @@ class Flow(Generic[T], metaclass=FlowMeta): raise TypeError(f"State must be dict or BaseModel, got {type(self._state)}") def kickoff(self, inputs: Optional[Dict[str, Any]] = None) -> Any: - """Start the flow execution. + """ + Start the flow execution in a synchronous context. + + This method wraps kickoff_async so that all state initialization and event + emission is handled in the asynchronous method. + """ + + async def run_flow(): + return await self.kickoff_async(inputs) + + return asyncio.run(run_flow()) + + @init_flow_main_trace + async def kickoff_async(self, inputs: Optional[Dict[str, Any]] = None) -> Any: + """ + Start the flow execution asynchronously. + + This method performs state restoration (if an 'id' is provided and persistence is available) + and updates the flow state with any additional inputs. It then emits the FlowStartedEvent, + logs the flow startup, and executes all start methods. Once completed, it emits the + FlowFinishedEvent and returns the final output. Args: - inputs: Optional dictionary containing input values and potentially a state ID to restore - """ - # Handle state restoration if ID is provided in inputs - if inputs and "id" in inputs and self._persistence is not None: - restore_uuid = inputs["id"] - stored_state = self._persistence.load_state(restore_uuid) + inputs: Optional dictionary containing input values and/or a state ID for restoration. + Returns: + The final output from the flow, which is the result of the last executed method. + """ + if inputs: # Override the id in the state if it exists in inputs if "id" in inputs: if isinstance(self._state, dict): @@ -730,24 +749,27 @@ class Flow(Generic[T], metaclass=FlowMeta): elif isinstance(self._state, BaseModel): setattr(self._state, "id", inputs["id"]) - if stored_state: - self._log_flow_event( - f"Loading flow state from memory for UUID: {restore_uuid}", - color="yellow", - ) - # Restore the state - self._restore_state(stored_state) - else: - self._log_flow_event( - f"No flow state found for UUID: {restore_uuid}", color="red" - ) + # If persistence is enabled, attempt to restore the stored state using the provided id. + if "id" in inputs and self._persistence is not None: + restore_uuid = inputs["id"] + stored_state = self._persistence.load_state(restore_uuid) + if stored_state: + self._log_flow_event( + f"Loading flow state from memory for UUID: {restore_uuid}", + color="yellow", + ) + self._restore_state(stored_state) + else: + self._log_flow_event( + f"No flow state found for UUID: {restore_uuid}", color="red" + ) - # Apply any additional inputs after restoration + # Update state with any additional inputs (ignoring the 'id' key) filtered_inputs = {k: v for k, v in inputs.items() if k != "id"} if filtered_inputs: self._initialize_state(filtered_inputs) - # Start flow execution + # Emit FlowStartedEvent and log the start of the flow. crewai_event_bus.emit( self, FlowStartedEvent( @@ -760,27 +782,18 @@ class Flow(Generic[T], metaclass=FlowMeta): f"Flow started with ID: {self.flow_id}", color="bold_magenta" ) - if inputs is not None and "id" not in inputs: - self._initialize_state(inputs) - - async def run_flow(): - return await self.kickoff_async() - - return asyncio.run(run_flow()) - - @init_flow_main_trace - async def kickoff_async(self, inputs: Optional[Dict[str, Any]] = None) -> Any: if not self._start_methods: raise ValueError("No start method defined") + # Execute all start methods concurrently. tasks = [ self._execute_start_method(start_method) for start_method in self._start_methods ] await asyncio.gather(*tasks) - final_output = self._method_outputs[-1] if self._method_outputs else None + # Emit FlowFinishedEvent after all processing is complete. crewai_event_bus.emit( self, FlowFinishedEvent( From 78797c64b09273b3da0e8c89fe40f85b83c79e74 Mon Sep 17 00:00:00 2001 From: "Brandon Hancock (bhancock_ai)" <109994880+bhancockio@users.noreply.github.com> Date: Mon, 24 Feb 2025 14:51:58 -0500 Subject: [PATCH 16/35] fix reset memory issue (#2182) Co-authored-by: Lorenze Jay <63378463+lorenzejay@users.noreply.github.com> --- src/crewai/crew.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/crewai/crew.py b/src/crewai/crew.py index 31678ae88..b15bbc126 100644 --- a/src/crewai/crew.py +++ b/src/crewai/crew.py @@ -1278,11 +1278,11 @@ class Crew(BaseModel): def _reset_all_memories(self) -> None: """Reset all available memory systems.""" memory_systems = [ - ("short term", self._short_term_memory), - ("entity", self._entity_memory), - ("long term", self._long_term_memory), - ("task output", self._task_output_handler), - ("knowledge", self.knowledge), + ("short term", getattr(self, "_short_term_memory", None)), + ("entity", getattr(self, "_entity_memory", None)), + ("long term", getattr(self, "_long_term_memory", None)), + ("task output", getattr(self, "_task_output_handler", None)), + ("knowledge", getattr(self, "knowledge", None)), ] for name, system in memory_systems: From c62fb615b14669b7f6c47197e06025b35fc0995e Mon Sep 17 00:00:00 2001 From: Lorenze Jay <63378463+lorenzejay@users.noreply.github.com> Date: Mon, 24 Feb 2025 12:17:44 -0800 Subject: [PATCH 17/35] feat: Add LLM call events for improved observability (#2214) * feat: Add LLM call events for improved observability - Introduce new LLM call events: LLMCallStartedEvent, LLMCallCompletedEvent, and LLMCallFailedEvent - Emit events for LLM calls and tool calls to provide better tracking and debugging - Add event handling in the LLM class to track call lifecycle - Update event bus to support new LLM-related events - Add test cases to validate LLM event emissions * feat: Add event handling for LLM call lifecycle events - Implement event listeners for LLM call events in EventListener - Add logging for LLM call start, completion, and failure events - Import and register new LLM-specific event types * less log * refactor: Update LLM event response type to support Any * refactor: Simplify LLM call completed event emission Remove unnecessary LLMCallType conversion when emitting LLMCallCompletedEvent * refactor: Update LLM event docstrings for clarity Improve docstrings for LLM call events to more accurately describe their purpose and lifecycle * feat: Add LLMCallFailedEvent emission for tool execution errors Enhance error handling by emitting a specific event when tool execution fails during LLM calls --- src/crewai/llm.py | 41 ++++++- src/crewai/utilities/events/__init__.py | 1 + src/crewai/utilities/events/event_listener.py | 28 +++++ src/crewai/utilities/events/llm_events.py | 36 ++++++ src/crewai/utilities/events/task_events.py | 2 +- .../test_llm_emits_call_failed_event.yaml | 103 +++++++++++++++++ .../test_llm_emits_call_started_event.yaml | 108 ++++++++++++++++++ tests/utilities/test_events.py | 50 +++++++- 8 files changed, 365 insertions(+), 4 deletions(-) create mode 100644 src/crewai/utilities/events/llm_events.py create mode 100644 tests/utilities/cassettes/test_llm_emits_call_failed_event.yaml create mode 100644 tests/utilities/cassettes/test_llm_emits_call_started_event.yaml diff --git a/src/crewai/llm.py b/src/crewai/llm.py index aac1af3b7..a0378cd2d 100644 --- a/src/crewai/llm.py +++ b/src/crewai/llm.py @@ -21,6 +21,12 @@ from typing import ( from dotenv import load_dotenv from pydantic import BaseModel +from crewai.utilities.events.llm_events import ( + LLMCallCompletedEvent, + LLMCallFailedEvent, + LLMCallStartedEvent, + LLMCallType, +) from crewai.utilities.events.tool_usage_events import ToolExecutionErrorEvent with warnings.catch_warnings(): @@ -259,6 +265,15 @@ class LLM: >>> print(response) "The capital of France is Paris." """ + crewai_event_bus.emit( + self, + event=LLMCallStartedEvent( + messages=messages, + tools=tools, + callbacks=callbacks, + available_functions=available_functions, + ), + ) # Validate parameters before proceeding with the call. self._validate_call_params() @@ -333,12 +348,13 @@ class LLM: # --- 4) If no tool calls, return the text response if not tool_calls or not available_functions: + self._handle_emit_call_events(text_response, LLMCallType.LLM_CALL) return text_response # --- 5) Handle the tool call tool_call = tool_calls[0] function_name = tool_call.function.name - print("function_name", function_name) + if function_name in available_functions: try: function_args = json.loads(tool_call.function.arguments) @@ -350,6 +366,7 @@ class LLM: try: # Call the actual tool function result = fn(**function_args) + self._handle_emit_call_events(result, LLMCallType.TOOL_CALL) return result except Exception as e: @@ -365,6 +382,12 @@ class LLM: error=str(e), ), ) + crewai_event_bus.emit( + self, + event=LLMCallFailedEvent( + error=f"Tool execution error: {str(e)}" + ), + ) return text_response else: @@ -374,12 +397,28 @@ class LLM: return text_response except Exception as e: + crewai_event_bus.emit( + self, + event=LLMCallFailedEvent(error=str(e)), + ) if not LLMContextLengthExceededException( str(e) )._is_context_limit_error(str(e)): logging.error(f"LiteLLM call failed: {str(e)}") raise + def _handle_emit_call_events(self, response: Any, call_type: LLMCallType): + """Handle the events for the LLM call. + + Args: + response (str): The response from the LLM call. + call_type (str): The type of call, either "tool_call" or "llm_call". + """ + crewai_event_bus.emit( + self, + event=LLMCallCompletedEvent(response=response, call_type=call_type), + ) + def _format_messages_for_provider( self, messages: List[Dict[str, str]] ) -> List[Dict[str, str]]: diff --git a/src/crewai/utilities/events/__init__.py b/src/crewai/utilities/events/__init__.py index 7f3442360..aa4a24ac5 100644 --- a/src/crewai/utilities/events/__init__.py +++ b/src/crewai/utilities/events/__init__.py @@ -34,6 +34,7 @@ from .tool_usage_events import ( ToolUsageEvent, ToolValidateInputErrorEvent, ) +from .llm_events import LLMCallCompletedEvent, LLMCallFailedEvent, LLMCallStartedEvent # events from .event_listener import EventListener diff --git a/src/crewai/utilities/events/event_listener.py b/src/crewai/utilities/events/event_listener.py index 0dcefcd3d..793528240 100644 --- a/src/crewai/utilities/events/event_listener.py +++ b/src/crewai/utilities/events/event_listener.py @@ -4,6 +4,11 @@ from crewai.telemetry.telemetry import Telemetry from crewai.utilities import Logger from crewai.utilities.constants import EMITTER_COLOR from crewai.utilities.events.base_event_listener import BaseEventListener +from crewai.utilities.events.llm_events import ( + LLMCallCompletedEvent, + LLMCallFailedEvent, + LLMCallStartedEvent, +) from .agent_events import AgentExecutionCompletedEvent, AgentExecutionStartedEvent from .crew_events import ( @@ -253,5 +258,28 @@ class EventListener(BaseEventListener): # ) + # ----------- LLM EVENTS ----------- + + @crewai_event_bus.on(LLMCallStartedEvent) + def on_llm_call_started(source, event: LLMCallStartedEvent): + self.logger.log( + f"🤖 LLM Call Started", + event.timestamp, + ) + + @crewai_event_bus.on(LLMCallCompletedEvent) + def on_llm_call_completed(source, event: LLMCallCompletedEvent): + self.logger.log( + f"✅ LLM Call Completed", + event.timestamp, + ) + + @crewai_event_bus.on(LLMCallFailedEvent) + def on_llm_call_failed(source, event: LLMCallFailedEvent): + self.logger.log( + f"❌ LLM Call Failed: '{event.error}'", + event.timestamp, + ) + event_listener = EventListener() diff --git a/src/crewai/utilities/events/llm_events.py b/src/crewai/utilities/events/llm_events.py new file mode 100644 index 000000000..8c2554a21 --- /dev/null +++ b/src/crewai/utilities/events/llm_events.py @@ -0,0 +1,36 @@ +from enum import Enum +from typing import Any, Dict, List, Optional, Union + +from crewai.utilities.events.base_events import CrewEvent + + +class LLMCallType(Enum): + """Type of LLM call being made""" + + TOOL_CALL = "tool_call" + LLM_CALL = "llm_call" + + +class LLMCallStartedEvent(CrewEvent): + """Event emitted when a LLM call starts""" + + type: str = "llm_call_started" + messages: Union[str, List[Dict[str, str]]] + tools: Optional[List[dict]] = None + callbacks: Optional[List[Any]] = None + available_functions: Optional[Dict[str, Any]] = None + + +class LLMCallCompletedEvent(CrewEvent): + """Event emitted when a LLM call completes""" + + type: str = "llm_call_completed" + response: Any + call_type: LLMCallType + + +class LLMCallFailedEvent(CrewEvent): + """Event emitted when a LLM call fails""" + + error: str + type: str = "llm_call_failed" diff --git a/src/crewai/utilities/events/task_events.py b/src/crewai/utilities/events/task_events.py index f69e77d6a..d81b7ce2d 100644 --- a/src/crewai/utilities/events/task_events.py +++ b/src/crewai/utilities/events/task_events.py @@ -1,4 +1,4 @@ -from typing import Any, Optional +from typing import Optional from crewai.tasks.task_output import TaskOutput from crewai.utilities.events.base_events import CrewEvent diff --git a/tests/utilities/cassettes/test_llm_emits_call_failed_event.yaml b/tests/utilities/cassettes/test_llm_emits_call_failed_event.yaml new file mode 100644 index 000000000..2222ad933 --- /dev/null +++ b/tests/utilities/cassettes/test_llm_emits_call_failed_event.yaml @@ -0,0 +1,103 @@ +interactions: +- request: + body: '{"messages": [{"role": "user", "content": "Hello, how are you?"}], "model": + "gpt-4o-mini", "stop": []}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '102' + content-type: + - application/json + cookie: + - _cfuvid=IY8ppO70AMHr2skDSUsGh71zqHHdCQCZ3OvkPi26NBc-1740424913267-0.0.1.1-604800000; + __cf_bm=fU6K5KZoDmgcEuF8_yWAYKUO5fKHh6q5.wDPnna393g-1740424913-1.0.1.1-2iOaq3JVGWs439V0HxJee0IC9HdJm7dPkeJorD.AGw0YwkngRPM8rrTzn_7ht1BkbOauEezj.wPKcBz18gIYUg + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B4YLA2SrC2rwdVQ3U87G5a0P5lsLw\",\n \"object\": + \"chat.completion\",\n \"created\": 1740425016,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"Hello! I'm just a computer program, so + I don't have feelings, but I'm here and ready to help you. How can I assist + you today?\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 13,\n \"completion_tokens\": 30,\n \"total_tokens\": 43,\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_709714d124\"\n}\n" + headers: + CF-RAY: + - 9171d4c0ed44236e-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Mon, 24 Feb 2025 19:23:38 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '1954' + 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: + - '149999978' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_ea2703502b8827e4297cd2a7bae9d9c8 + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/utilities/cassettes/test_llm_emits_call_started_event.yaml b/tests/utilities/cassettes/test_llm_emits_call_started_event.yaml new file mode 100644 index 000000000..0120aa1b3 --- /dev/null +++ b/tests/utilities/cassettes/test_llm_emits_call_started_event.yaml @@ -0,0 +1,108 @@ +interactions: +- request: + body: '{"messages": [{"role": "user", "content": "Hello, how are you?"}], "model": + "gpt-4o-mini", "stop": []}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '102' + content-type: + - application/json + cookie: + - _cfuvid=GefCcEtb_Gem93E4a9Hvt3Xyof1YQZVJAXBb9I6pEUs-1739398417375-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B4YJU8IWKGyBQtAyPDRd3SFI2flYR\",\n \"object\": + \"chat.completion\",\n \"created\": 1740424912,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": + \"assistant\",\n \"content\": \"Hello! I'm just a computer program, so + I don't have feelings, but I'm here and ready to help you. How can I assist + you today?\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 13,\n \"completion_tokens\": 30,\n \"total_tokens\": 43,\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_7fcd609668\"\n}\n" + headers: + CF-RAY: + - 9171d230d8ed7ae0-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Mon, 24 Feb 2025 19:21:53 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=fU6K5KZoDmgcEuF8_yWAYKUO5fKHh6q5.wDPnna393g-1740424913-1.0.1.1-2iOaq3JVGWs439V0HxJee0IC9HdJm7dPkeJorD.AGw0YwkngRPM8rrTzn_7ht1BkbOauEezj.wPKcBz18gIYUg; + path=/; expires=Mon, 24-Feb-25 19:51:53 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=IY8ppO70AMHr2skDSUsGh71zqHHdCQCZ3OvkPi26NBc-1740424913267-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '993' + 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: + - '149999978' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_d9c4d49185e97b1797061efc1e55d811 + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/utilities/test_events.py b/tests/utilities/test_events.py index 68bda7bec..aa65d82b2 100644 --- a/tests/utilities/test_events.py +++ b/tests/utilities/test_events.py @@ -1,6 +1,5 @@ -import json from datetime import datetime -from unittest.mock import MagicMock, patch +from unittest.mock import patch import pytest from pydantic import Field @@ -9,6 +8,7 @@ from crewai.agent import Agent from crewai.agents.crew_agent_executor import CrewAgentExecutor from crewai.crew import Crew from crewai.flow.flow import Flow, listen, start +from crewai.llm import LLM from crewai.task import Task from crewai.tools.base_tool import BaseTool from crewai.tools.tool_usage import ToolUsage @@ -31,6 +31,12 @@ from crewai.utilities.events.flow_events import ( MethodExecutionFailedEvent, MethodExecutionStartedEvent, ) +from crewai.utilities.events.llm_events import ( + LLMCallCompletedEvent, + LLMCallFailedEvent, + LLMCallStartedEvent, + LLMCallType, +) from crewai.utilities.events.task_events import ( TaskCompletedEvent, TaskFailedEvent, @@ -495,3 +501,43 @@ def test_flow_emits_method_execution_failed_event(): assert received_events[0].flow_name == "TestFlow" assert received_events[0].type == "method_execution_failed" assert received_events[0].error == error + + +@pytest.mark.vcr(filter_headers=["authorization"]) +def test_llm_emits_call_started_event(): + received_events = [] + + @crewai_event_bus.on(LLMCallStartedEvent) + def handle_llm_call_started(source, event): + received_events.append(event) + + @crewai_event_bus.on(LLMCallCompletedEvent) + def handle_llm_call_completed(source, event): + received_events.append(event) + + llm = LLM(model="gpt-4o-mini") + llm.call("Hello, how are you?") + + assert len(received_events) == 2 + assert received_events[0].type == "llm_call_started" + assert received_events[1].type == "llm_call_completed" + + +@pytest.mark.vcr(filter_headers=["authorization"]) +def test_llm_emits_call_failed_event(): + received_events = [] + + @crewai_event_bus.on(LLMCallFailedEvent) + def handle_llm_call_failed(source, event): + received_events.append(event) + + error_message = "Simulated LLM call failure" + with patch.object(LLM, "_call_llm", side_effect=Exception(error_message)): + llm = LLM(model="gpt-4o-mini") + with pytest.raises(Exception) as exc_info: + llm.call("Hello, how are you?") + + assert str(exc_info.value) == error_message + assert len(received_events) == 1 + assert received_events[0].type == "llm_call_failed" + assert received_events[0].error == error_message From 5235442a5b786e2b57d621bedb27884659bbeb96 Mon Sep 17 00:00:00 2001 From: Lorenze Jay <63378463+lorenzejay@users.noreply.github.com> Date: Mon, 24 Feb 2025 12:24:35 -0800 Subject: [PATCH 18/35] Decoupling telemetry and ensure tests (#2212) * feat: Enhance event listener and telemetry tracking - Update event listener to improve telemetry span handling - Add execution_span field to Task for better tracing - Modify event handling in EventListener to use new span tracking - Remove debug print statements - Improve test coverage for crew and flow events - Update cassettes to reflect new event tracking behavior * Remove telemetry references from Crew class - Remove Telemetry import and initialization from Crew class - Delete _telemetry attribute from class configuration - Clean up unused telemetry-related code * test: Improve crew verbose output test with event log filtering - Filter out event listener logs in verbose output test - Ensure no output when verbose is set to False - Enhance test coverage for crew logging behavior * dropped comment * refactor: Improve telemetry span tracking in EventListener - Remove `execution_span` from Task class - Add `execution_spans` dictionary to EventListener to track spans - Update task event handlers to use new span tracking mechanism - Simplify span management across task lifecycle events * lint --- src/crewai/crew.py | 4 - src/crewai/utilities/events/event_listener.py | 51 +- tests/crew_test.py | 28 +- .../test_crew_emits_end_task_event.yaml | 1658 ++++++++++++++--- ...st_crew_emits_test_kickoff_type_event.yaml | 236 +++ tests/utilities/test_events.py | 130 +- 6 files changed, 1798 insertions(+), 309 deletions(-) create mode 100644 tests/utilities/cassettes/test_crew_emits_test_kickoff_type_event.yaml diff --git a/src/crewai/crew.py b/src/crewai/crew.py index b15bbc126..92a8cbb4d 100644 --- a/src/crewai/crew.py +++ b/src/crewai/crew.py @@ -35,7 +35,6 @@ from crewai.process import Process from crewai.task import Task from crewai.tasks.conditional_task import ConditionalTask from crewai.tasks.task_output import TaskOutput -from crewai.telemetry import Telemetry from crewai.tools.agent_tools.agent_tools import AgentTools from crewai.tools.base_tool import Tool from crewai.traces.unified_trace_controller import init_crew_main_trace @@ -258,8 +257,6 @@ class Crew(BaseModel): if self.function_calling_llm and not isinstance(self.function_calling_llm, LLM): self.function_calling_llm = create_llm(self.function_calling_llm) - self._telemetry = Telemetry() - self._telemetry.set_tracer() return self @model_validator(mode="after") @@ -1115,7 +1112,6 @@ class Crew(BaseModel): "_short_term_memory", "_long_term_memory", "_entity_memory", - "_telemetry", "agents", "tasks", "knowledge_sources", diff --git a/src/crewai/utilities/events/event_listener.py b/src/crewai/utilities/events/event_listener.py index 793528240..d853a5f7c 100644 --- a/src/crewai/utilities/events/event_listener.py +++ b/src/crewai/utilities/events/event_listener.py @@ -1,5 +1,8 @@ -from pydantic import PrivateAttr +from typing import Any, Dict +from pydantic import Field, PrivateAttr + +from crewai.task import Task from crewai.telemetry.telemetry import Telemetry from crewai.utilities import Logger from crewai.utilities.constants import EMITTER_COLOR @@ -42,6 +45,7 @@ class EventListener(BaseEventListener): _instance = None _telemetry: Telemetry = PrivateAttr(default_factory=lambda: Telemetry()) logger = Logger(verbose=True, default_color=EMITTER_COLOR) + execution_spans: Dict[Task, Any] = Field(default_factory=dict) def __new__(cls): if cls._instance is None: @@ -54,6 +58,7 @@ class EventListener(BaseEventListener): super().__init__() self._telemetry = Telemetry() self._telemetry.set_tracer() + self.execution_spans = {} self._initialized = True # ----------- CREW EVENTS ----------- @@ -62,7 +67,7 @@ class EventListener(BaseEventListener): @crewai_event_bus.on(CrewKickoffStartedEvent) def on_crew_started(source, event: CrewKickoffStartedEvent): self.logger.log( - f"🚀 Crew '{event.crew_name}' started", + f"🚀 Crew '{event.crew_name}' started, {source.id}", event.timestamp, ) self._telemetry.crew_execution_span(source, event.inputs) @@ -72,28 +77,28 @@ class EventListener(BaseEventListener): final_string_output = event.output.raw self._telemetry.end_crew(source, final_string_output) self.logger.log( - f"✅ Crew '{event.crew_name}' completed", + f"✅ Crew '{event.crew_name}' completed, {source.id}", event.timestamp, ) @crewai_event_bus.on(CrewKickoffFailedEvent) def on_crew_failed(source, event: CrewKickoffFailedEvent): self.logger.log( - f"❌ Crew '{event.crew_name}' failed", + f"❌ Crew '{event.crew_name}' failed, {source.id}", event.timestamp, ) @crewai_event_bus.on(CrewTestStartedEvent) def on_crew_test_started(source, event: CrewTestStartedEvent): cloned_crew = source.copy() - cloned_crew._telemetry.test_execution_span( + self._telemetry.test_execution_span( cloned_crew, event.n_iterations, event.inputs, - event.eval_llm, + event.eval_llm or "", ) self.logger.log( - f"🚀 Crew '{event.crew_name}' started test", + f"🚀 Crew '{event.crew_name}' started test, {source.id}", event.timestamp, ) @@ -136,9 +141,9 @@ class EventListener(BaseEventListener): @crewai_event_bus.on(TaskStartedEvent) def on_task_started(source, event: TaskStartedEvent): - source._execution_span = self._telemetry.task_started( - crew=source.agent.crew, task=source - ) + span = self._telemetry.task_started(crew=source.agent.crew, task=source) + self.execution_spans[source] = span + self.logger.log( f"📋 Task started: {source.description}", event.timestamp, @@ -146,24 +151,22 @@ class EventListener(BaseEventListener): @crewai_event_bus.on(TaskCompletedEvent) def on_task_completed(source, event: TaskCompletedEvent): - if source._execution_span: - self._telemetry.task_ended( - source._execution_span, source, source.agent.crew - ) + span = self.execution_spans.get(source) + if span: + self._telemetry.task_ended(span, source, source.agent.crew) self.logger.log( f"✅ Task completed: {source.description}", event.timestamp, ) - source._execution_span = None + self.execution_spans[source] = None @crewai_event_bus.on(TaskFailedEvent) def on_task_failed(source, event: TaskFailedEvent): - if source._execution_span: + span = self.execution_spans.get(source) + if span: if source.agent and source.agent.crew: - self._telemetry.task_ended( - source._execution_span, source, source.agent.crew - ) - source._execution_span = None + self._telemetry.task_ended(span, source, source.agent.crew) + self.execution_spans[source] = None self.logger.log( f"❌ Task failed: {source.description}", event.timestamp, @@ -189,7 +192,7 @@ class EventListener(BaseEventListener): @crewai_event_bus.on(FlowCreatedEvent) def on_flow_created(source, event: FlowCreatedEvent): - self._telemetry.flow_creation_span(self.__class__.__name__) + self._telemetry.flow_creation_span(event.flow_name) self.logger.log( f"🌊 Flow Created: '{event.flow_name}'", event.timestamp, @@ -198,17 +201,17 @@ class EventListener(BaseEventListener): @crewai_event_bus.on(FlowStartedEvent) def on_flow_started(source, event: FlowStartedEvent): self._telemetry.flow_execution_span( - source.__class__.__name__, list(source._methods.keys()) + event.flow_name, list(source._methods.keys()) ) self.logger.log( - f"🤖 Flow Started: '{event.flow_name}'", + f"🤖 Flow Started: '{event.flow_name}', {source.flow_id}", event.timestamp, ) @crewai_event_bus.on(FlowFinishedEvent) def on_flow_finished(source, event: FlowFinishedEvent): self.logger.log( - f"👍 Flow Finished: '{event.flow_name}'", + f"👍 Flow Finished: '{event.flow_name}', {source.flow_id}", event.timestamp, ) diff --git a/tests/crew_test.py b/tests/crew_test.py index 6cd0370ae..8f9f69deb 100644 --- a/tests/crew_test.py +++ b/tests/crew_test.py @@ -833,6 +833,12 @@ def test_crew_verbose_output(capsys): crew.kickoff() captured = capsys.readouterr() + + # Filter out event listener logs (lines starting with '[') + filtered_output = "\n".join( + line for line in captured.out.split("\n") if not line.startswith("[") + ) + expected_strings = [ "\x1b[1m\x1b[95m# Agent:\x1b[00m \x1b[1m\x1b[92mResearcher", "\x1b[00m\n\x1b[95m## Task:\x1b[00m \x1b[92mResearch AI advancements.", @@ -845,27 +851,19 @@ def test_crew_verbose_output(capsys): ] for expected_string in expected_strings: - assert expected_string in captured.out + assert expected_string in filtered_output # Now test with verbose set to False crew.verbose = False crew._logger = Logger(verbose=False) crew.kickoff() - expected_listener_logs = [ - "[🚀 CREW 'CREW' STARTED]", - "[📋 TASK STARTED: RESEARCH AI ADVANCEMENTS.]", - "[🤖 AGENT 'RESEARCHER' STARTED TASK]", - "[✅ AGENT 'RESEARCHER' COMPLETED TASK]", - "[✅ TASK COMPLETED: RESEARCH AI ADVANCEMENTS.]", - "[📋 TASK STARTED: WRITE ABOUT AI IN HEALTHCARE.]", - "[🤖 AGENT 'SENIOR WRITER' STARTED TASK]", - "[✅ AGENT 'SENIOR WRITER' COMPLETED TASK]", - "[✅ TASK COMPLETED: WRITE ABOUT AI IN HEALTHCARE.]", - "[✅ CREW 'CREW' COMPLETED]", - ] captured = capsys.readouterr() - for log in expected_listener_logs: - assert log in captured.out + filtered_output = "\n".join( + line + for line in captured.out.split("\n") + if not line.startswith("[") and line.strip() and not line.startswith("\x1b") + ) + assert filtered_output == "" @pytest.mark.vcr(filter_headers=["authorization"]) diff --git a/tests/utilities/cassettes/test_crew_emits_end_task_event.yaml b/tests/utilities/cassettes/test_crew_emits_end_task_event.yaml index 09cb318d2..2ebd93ac7 100644 --- a/tests/utilities/cassettes/test_crew_emits_end_task_event.yaml +++ b/tests/utilities/cassettes/test_crew_emits_end_task_event.yaml @@ -1,201 +1,602 @@ interactions: - request: - body: '{"messages": [{"role": "system", "content": "You are base_agent. You are - a helpful assistant that just says hi\nYour personal goal is: Just say hi\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: Just say hi\n\nThis is the expect criteria for your - final answer: hi\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:"]}' + body: null headers: - accept: - - application/json - accept-encoding: + Accept: + - '*/*' + Accept-Encoding: - gzip, deflate - connection: - - keep-alive - content-length: - - '836' - content-type: - - application/json - cookie: - - __cf_bm=nedOdWE1YnKQYt1kSbrcA.zhwa3bZDzmZqTOjZYER0c-1738700521-1.0.1.1-xQk9iXOvqvyXNhkIOgc8Ws2WYcT1mJFkDCvCC8xA5joFD8QfNrBIAr_Qs6sIxt2EzXyeFwBA6gA8ZgWApCHx0Q; - _cfuvid=Cl48aI8.jSRja0Pqr6Jrh3mAnigd4rDn6lhGicyjMPY-1738698987673-0.0.1.1-604800000 - host: - - api.openai.com - user-agent: - - OpenAI/Python 1.61.0 - x-stainless-arch: - - arm64 - x-stainless-async: - - 'false' - x-stainless-lang: - - python - x-stainless-os: - - MacOS - x-stainless-package-version: - - 1.61.0 - x-stainless-raw-response: - - 'true' - x-stainless-retry-count: - - '0' - x-stainless-runtime: - - CPython - x-stainless-runtime-version: - - 3.12.8 - method: POST - uri: https://api.openai.com/v1/chat/completions - response: - content: "{\n \"id\": \"chatcmpl-AxJlK2np8dMxYgsDIuyz2TSKKELWh\",\n \"object\": - \"chat.completion\",\n \"created\": 1738700682,\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: hi\",\n \"refusal\": null\n },\n \"logprobs\": null,\n - \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 161,\n \"completion_tokens\": 12,\n \"total_tokens\": 173,\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_72ed7ab54c\"\n}\n" - headers: - CF-RAY: - - 90cd62c1fdb0fa6a-SJC Connection: - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json + User-Agent: + - python-requests/2.32.3 + 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 \",\"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\":\"\\n\\n
\\n Observability and + DevTool platform for AI Agents\\n
\\n\\n
\\n\\n
\\n + \ \\n \\\"Downloads\\\"\\n \\n \\n + \ \\\"git\\n \\n \\\"PyPI\\n \\n + \ \\\"License:\\n \\n
\\n\\n

\\n + \ \\n \\\"Twitter\\\"\\n \\n \\n + \ \\\"Discord\\\"\\n \\n \\n + \ \\\"Dashboard\\\"\\n \\n \\n + \ \\\"Documentation\\\"\\n \\n \\n + \ \\\"Chat\\n \\n

\\n\\n\\n\\n
\\n \\\"Dashboard\\n
\\n\\n
\\n\\n\\nAgentOps helps developers + build, evaluate, and monitor AI agents. From prototype to production.\\n\\n| + \ | |\\n| + ------------------------------------- | ------------------------------------------------------------- + |\\n| \U0001F4CA **Replay Analytics and Debugging** | Step-by-step agent execution + graphs |\\n| \U0001F4B8 **LLM Cost Management** + \ | Track spend with LLM foundation model providers |\\n| + \U0001F9EA **Agent Benchmarking** | Test your agents against 1,000+ + evals |\\n| \U0001F510 **Compliance and Security** + \ | Detect common prompt injection and data exfiltration exploits |\\n| + \U0001F91D **Framework Integrations** | Native Integrations with CrewAI, + AG2(AutoGen), Camel AI, & LangChain |\\n\\n## Quick Start \u2328\uFE0F\\n\\n```bash\\npip + install agentops\\n```\\n\\n\\n#### Session replays in 2 lines of code\\n\\nInitialize + the AgentOps client and automatically get analytics on all your LLM calls.\\n\\n[Get + an API key](https://app.agentops.ai/settings/projects)\\n\\n```python\\nimport + agentops\\n\\n# Beginning of your program (i.e. main.py, __init__.py)\\nagentops.init( + < INSERT YOUR API KEY HERE >)\\n\\n...\\n\\n# End of program\\nagentops.end_session('Success')\\n```\\n\\nAll + your sessions can be viewed on the [AgentOps dashboard](https://app.agentops.ai?ref=gh)\\n
\\n\\n
\\n + \ Agent Debugging\\n \\n + \ \\\"Agent\\n \\n \\n + \ \\\"Chat\\n \\n \\n + \ \\\"Event\\n \\n
\\n\\n
\\n + \ Session Replays\\n \\n + \ \\\"Session\\n \\n
\\n\\n
\\n Summary Analytics\\n \\n + \ \\\"Summary\\n \\n \\n + \ \\\"Summary\\n \\n
\\n\\n\\n### + First class Developer Experience\\nAdd powerful observability to your agents, + tools, and functions with as little code as possible: one line at a time.\\n
\\nRefer + to our [documentation](http://docs.agentops.ai)\\n\\n```python\\n# Automatically + associate all Events with the agent that originated them\\nfrom agentops import + track_agent\\n\\n@track_agent(name='SomeCustomName')\\nclass MyAgent:\\n ...\\n```\\n\\n```python\\n# + Automatically create ToolEvents for tools that agents will use\\nfrom agentops + import record_tool\\n\\n@record_tool('SampleToolName')\\ndef sample_tool(...):\\n + \ ...\\n```\\n\\n```python\\n# Automatically create ActionEvents for other + functions.\\nfrom agentops import record_action\\n\\n@agentops.record_action('sample + function being record')\\ndef sample_function(...):\\n ...\\n```\\n\\n```python\\n# + Manually record any other Events\\nfrom agentops import record, ActionEvent\\n\\nrecord(ActionEvent(\\\"received_user_input\\\"))\\n```\\n\\n## + Integrations \U0001F9BE\\n\\n### CrewAI \U0001F6F6\\n\\nBuild Crew agents + with observability with only 2 lines of code. Simply set an `AGENTOPS_API_KEY` + in your environment, and your crews will get automatic monitoring on the AgentOps + dashboard.\\n\\n```bash\\npip install 'crewai[agentops]'\\n```\\n\\n- [AgentOps + integration example](https://docs.agentops.ai/v1/integrations/crewai)\\n- + [Official CrewAI documentation](https://docs.crewai.com/how-to/AgentOps-Observability)\\n\\n### + AG2 \U0001F916\\nWith only two lines of code, add full observability and monitoring + to AG2 (formerly AutoGen) agents. Set an `AGENTOPS_API_KEY` in your environment + and call `agentops.init()`\\n\\n- [AG2 Observability Example](https://docs.ag2.ai/notebooks/agentchat_agentops)\\n- + [AG2 - AgentOps Documentation](https://docs.ag2.ai/docs/ecosystem/agentops)\\n\\n### + Camel AI \U0001F42A\\n\\nTrack and analyze CAMEL agents with full observability. + Set an `AGENTOPS_API_KEY` in your environment and initialize AgentOps to get + started.\\n\\n- [Camel AI](https://www.camel-ai.org/) - Advanced agent communication + framework\\n- [AgentOps integration example](https://docs.agentops.ai/v1/integrations/camel)\\n- + [Official Camel AI documentation](https://docs.camel-ai.org/cookbooks/agents_tracking.html)\\n\\n
\\n + \ Installation\\n\\n```bash\\npip install \\\"camel-ai[all]==0.2.11\\\"\\npip + install agentops\\n```\\n\\n```python\\nimport os\\nimport agentops\\nfrom + camel.agents import ChatAgent\\nfrom camel.messages import BaseMessage\\nfrom + camel.models import ModelFactory\\nfrom camel.types import ModelPlatformType, + ModelType\\n\\n# Initialize AgentOps\\nagentops.init(os.getenv(\\\"AGENTOPS_API_KEY\\\"), + default_tags=[\\\"CAMEL Example\\\"])\\n\\n# Import toolkits after AgentOps + init for tracking\\nfrom camel.toolkits import SearchToolkit\\n\\n# Set up + the agent with search tools\\nsys_msg = BaseMessage.make_assistant_message(\\n + \ role_name='Tools calling operator',\\n content='You are a helpful assistant'\\n)\\n\\n# + Configure tools and model\\ntools = [*SearchToolkit().get_tools()]\\nmodel + = ModelFactory.create(\\n model_platform=ModelPlatformType.OPENAI,\\n model_type=ModelType.GPT_4O_MINI,\\n)\\n\\n# + Create and run the agent\\ncamel_agent = ChatAgent(\\n system_message=sys_msg,\\n + \ model=model,\\n tools=tools,\\n)\\n\\nresponse = camel_agent.step(\\\"What + is AgentOps?\\\")\\nprint(response)\\n\\nagentops.end_session(\\\"Success\\\")\\n```\\n\\nCheck + out our [Camel integration guide](https://docs.agentops.ai/v1/integrations/camel) + for more examples including multi-agent scenarios.\\n
\\n\\n### Langchain + \U0001F99C\U0001F517\\n\\nAgentOps works seamlessly with applications built + using Langchain. To use the handler, install Langchain as an optional dependency:\\n\\n
\\n + \ Installation\\n \\n```shell\\npip install agentops[langchain]\\n```\\n\\nTo + use the handler, import and set\\n\\n```python\\nimport os\\nfrom langchain.chat_models + import ChatOpenAI\\nfrom langchain.agents import initialize_agent, AgentType\\nfrom + agentops.partners.langchain_callback_handler import LangchainCallbackHandler\\n\\nAGENTOPS_API_KEY + = os.environ['AGENTOPS_API_KEY']\\nhandler = LangchainCallbackHandler(api_key=AGENTOPS_API_KEY, + tags=['Langchain Example'])\\n\\nllm = ChatOpenAI(openai_api_key=OPENAI_API_KEY,\\n + \ callbacks=[handler],\\n model='gpt-3.5-turbo')\\n\\nagent + = initialize_agent(tools,\\n llm,\\n agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,\\n + \ verbose=True,\\n callbacks=[handler], + # You must pass in a callback handler to record your agent\\n handle_parsing_errors=True)\\n```\\n\\nCheck + out the [Langchain Examples Notebook](./examples/langchain_examples.ipynb) + for more details including Async handlers.\\n\\n
\\n\\n### Cohere + \u2328\uFE0F\\n\\nFirst class support for Cohere(>=5.4.0). This is a living + integration, should you need any added functionality please message us on + Discord!\\n\\n- [AgentOps integration example](https://docs.agentops.ai/v1/integrations/cohere)\\n- + [Official Cohere documentation](https://docs.cohere.com/reference/about)\\n\\n
\\n + \ Installation\\n \\n```bash\\npip install cohere\\n```\\n\\n```python + python\\nimport cohere\\nimport agentops\\n\\n# Beginning of program's code + (i.e. main.py, __init__.py)\\nagentops.init()\\nco + = cohere.Client()\\n\\nchat = co.chat(\\n message=\\\"Is it pronounced + ceaux-hear or co-hehray?\\\"\\n)\\n\\nprint(chat)\\n\\nagentops.end_session('Success')\\n```\\n\\n```python + python\\nimport cohere\\nimport agentops\\n\\n# Beginning of program's code + (i.e. main.py, __init__.py)\\nagentops.init()\\n\\nco + = cohere.Client()\\n\\nstream = co.chat_stream(\\n message=\\\"Write me + a haiku about the synergies between Cohere and AgentOps\\\"\\n)\\n\\nfor event + in stream:\\n if event.event_type == \\\"text-generation\\\":\\n print(event.text, + end='')\\n\\nagentops.end_session('Success')\\n```\\n
\\n\\n\\n### + Anthropic \uFE68\\n\\nTrack agents built with the Anthropic Python SDK (>=0.32.0).\\n\\n- + [AgentOps integration guide](https://docs.agentops.ai/v1/integrations/anthropic)\\n- + [Official Anthropic documentation](https://docs.anthropic.com/en/docs/welcome)\\n\\n
\\n + \ Installation\\n \\n```bash\\npip install anthropic\\n```\\n\\n```python + python\\nimport anthropic\\nimport agentops\\n\\n# Beginning of program's + code (i.e. main.py, __init__.py)\\nagentops.init()\\n\\nclient + = anthropic.Anthropic(\\n # This is the default and can be omitted\\n api_key=os.environ.get(\\\"ANTHROPIC_API_KEY\\\"),\\n)\\n\\nmessage + = client.messages.create(\\n max_tokens=1024,\\n messages=[\\n + \ {\\n \\\"role\\\": \\\"user\\\",\\n \\\"content\\\": + \\\"Tell me a cool fact about AgentOps\\\",\\n }\\n ],\\n + \ model=\\\"claude-3-opus-20240229\\\",\\n )\\nprint(message.content)\\n\\nagentops.end_session('Success')\\n```\\n\\nStreaming\\n```python + python\\nimport anthropic\\nimport agentops\\n\\n# Beginning of program's + code (i.e. main.py, __init__.py)\\nagentops.init()\\n\\nclient + = anthropic.Anthropic(\\n # This is the default and can be omitted\\n api_key=os.environ.get(\\\"ANTHROPIC_API_KEY\\\"),\\n)\\n\\nstream + = client.messages.create(\\n max_tokens=1024,\\n model=\\\"claude-3-opus-20240229\\\",\\n + \ messages=[\\n {\\n \\\"role\\\": \\\"user\\\",\\n \\\"content\\\": + \\\"Tell me something cool about streaming agents\\\",\\n }\\n ],\\n + \ stream=True,\\n)\\n\\nresponse = \\\"\\\"\\nfor event in stream:\\n if + event.type == \\\"content_block_delta\\\":\\n response += event.delta.text\\n + \ elif event.type == \\\"message_stop\\\":\\n print(\\\"\\\\n\\\")\\n + \ print(response)\\n print(\\\"\\\\n\\\")\\n```\\n\\nAsync\\n\\n```python + python\\nimport asyncio\\nfrom anthropic import AsyncAnthropic\\n\\nclient + = AsyncAnthropic(\\n # This is the default and can be omitted\\n api_key=os.environ.get(\\\"ANTHROPIC_API_KEY\\\"),\\n)\\n\\n\\nasync + def main() -> None:\\n message = await client.messages.create(\\n max_tokens=1024,\\n + \ messages=[\\n {\\n \\\"role\\\": \\\"user\\\",\\n + \ \\\"content\\\": \\\"Tell me something interesting about async + agents\\\",\\n }\\n ],\\n model=\\\"claude-3-opus-20240229\\\",\\n + \ )\\n print(message.content)\\n\\n\\nawait main()\\n```\\n
\\n\\n### + Mistral \u303D\uFE0F\\n\\nTrack agents built with the Anthropic Python SDK + (>=0.32.0).\\n\\n- [AgentOps integration example](./examples/mistral//mistral_example.ipynb)\\n- + [Official Mistral documentation](https://docs.mistral.ai)\\n\\n
\\n + \ Installation\\n \\n```bash\\npip install mistralai\\n```\\n\\nSync\\n\\n```python + python\\nfrom mistralai import Mistral\\nimport agentops\\n\\n# Beginning + of program's code (i.e. main.py, __init__.py)\\nagentops.init()\\n\\nclient = Mistral(\\n # This is the default and can + be omitted\\n api_key=os.environ.get(\\\"MISTRAL_API_KEY\\\"),\\n)\\n\\nmessage + = client.chat.complete(\\n messages=[\\n {\\n \\\"role\\\": + \\\"user\\\",\\n \\\"content\\\": \\\"Tell me a cool fact about + AgentOps\\\",\\n }\\n ],\\n model=\\\"open-mistral-nemo\\\",\\n + \ )\\nprint(message.choices[0].message.content)\\n\\nagentops.end_session('Success')\\n```\\n\\nStreaming\\n\\n```python + python\\nfrom mistralai import Mistral\\nimport agentops\\n\\n# Beginning + of program's code (i.e. main.py, __init__.py)\\nagentops.init()\\n\\nclient = Mistral(\\n # This is the default and can + be omitted\\n api_key=os.environ.get(\\\"MISTRAL_API_KEY\\\"),\\n)\\n\\nmessage + = client.chat.stream(\\n messages=[\\n {\\n \\\"role\\\": + \\\"user\\\",\\n \\\"content\\\": \\\"Tell me something cool + about streaming agents\\\",\\n }\\n ],\\n model=\\\"open-mistral-nemo\\\",\\n + \ )\\n\\nresponse = \\\"\\\"\\nfor event in message:\\n if event.data.choices[0].finish_reason + == \\\"stop\\\":\\n print(\\\"\\\\n\\\")\\n print(response)\\n + \ print(\\\"\\\\n\\\")\\n else:\\n response += event.text\\n\\nagentops.end_session('Success')\\n```\\n\\nAsync\\n\\n```python + python\\nimport asyncio\\nfrom mistralai import Mistral\\n\\nclient = Mistral(\\n + \ # This is the default and can be omitted\\n api_key=os.environ.get(\\\"MISTRAL_API_KEY\\\"),\\n)\\n\\n\\nasync + def main() -> None:\\n message = await client.chat.complete_async(\\n messages=[\\n + \ {\\n \\\"role\\\": \\\"user\\\",\\n \\\"content\\\": + \\\"Tell me something interesting about async agents\\\",\\n }\\n + \ ],\\n model=\\\"open-mistral-nemo\\\",\\n )\\n print(message.choices[0].message.content)\\n\\n\\nawait + main()\\n```\\n\\nAsync Streaming\\n\\n```python python\\nimport asyncio\\nfrom + mistralai import Mistral\\n\\nclient = Mistral(\\n # This is the default + and can be omitted\\n api_key=os.environ.get(\\\"MISTRAL_API_KEY\\\"),\\n)\\n\\n\\nasync + def main() -> None:\\n message = await client.chat.stream_async(\\n messages=[\\n + \ {\\n \\\"role\\\": \\\"user\\\",\\n \\\"content\\\": + \\\"Tell me something interesting about async streaming agents\\\",\\n }\\n + \ ],\\n model=\\\"open-mistral-nemo\\\",\\n )\\n\\n response + = \\\"\\\"\\n async for event in message:\\n if event.data.choices[0].finish_reason + == \\\"stop\\\":\\n print(\\\"\\\\n\\\")\\n print(response)\\n + \ print(\\\"\\\\n\\\")\\n else:\\n response += + event.text\\n\\n\\nawait main()\\n```\\n
\\n\\n\\n\\n### CamelAI + \uFE68\\n\\nTrack agents built with the CamelAI Python SDK (>=0.32.0).\\n\\n- + [CamelAI integration guide](https://docs.camel-ai.org/cookbooks/agents_tracking.html#)\\n- + [Official CamelAI documentation](https://docs.camel-ai.org/index.html)\\n\\n
\\n + \ Installation\\n \\n```bash\\npip install camel-ai[all]\\npip + install agentops\\n```\\n\\n```python python\\n#Import Dependencies\\nimport + agentops\\nimport os\\nfrom getpass import getpass\\nfrom dotenv import load_dotenv\\n\\n#Set + Keys\\nload_dotenv()\\nopenai_api_key = os.getenv(\\\"OPENAI_API_KEY\\\") + or \\\"\\\"\\nagentops_api_key = os.getenv(\\\"AGENTOPS_API_KEY\\\") + or \\\"\\\"\\n\\n\\n\\n```\\n
\\n\\n[You + can find usage examples here!](examples/camelai_examples/README.md).\\n\\n\\n\\n### + LiteLLM \U0001F685\\n\\nAgentOps provides support for LiteLLM(>=1.3.1), allowing + you to call 100+ LLMs using the same Input/Output Format. \\n\\n- [AgentOps + integration example](https://docs.agentops.ai/v1/integrations/litellm)\\n- + [Official LiteLLM documentation](https://docs.litellm.ai/docs/providers)\\n\\n
\\n + \ Installation\\n \\n```bash\\npip install litellm\\n```\\n\\n```python + python\\n# Do not use LiteLLM like this\\n# from litellm import completion\\n# + ...\\n# response = completion(model=\\\"claude-3\\\", messages=messages)\\n\\n# + Use LiteLLM like this\\nimport litellm\\n...\\nresponse = litellm.completion(model=\\\"claude-3\\\", + messages=messages)\\n# or\\nresponse = await litellm.acompletion(model=\\\"claude-3\\\", + messages=messages)\\n```\\n
\\n\\n### LlamaIndex \U0001F999\\n\\n\\nAgentOps + works seamlessly with applications built using LlamaIndex, a framework for + building context-augmented generative AI applications with LLMs.\\n\\n
\\n + \ Installation\\n \\n```shell\\npip install llama-index-instrumentation-agentops\\n```\\n\\nTo + use the handler, import and set\\n\\n```python\\nfrom llama_index.core import + set_global_handler\\n\\n# NOTE: Feel free to set your AgentOps environment + variables (e.g., 'AGENTOPS_API_KEY')\\n# as outlined in the AgentOps documentation, + or pass the equivalent keyword arguments\\n# anticipated by AgentOps' AOClient + as **eval_params in set_global_handler.\\n\\nset_global_handler(\\\"agentops\\\")\\n```\\n\\nCheck + out the [LlamaIndex docs](https://docs.llamaindex.ai/en/stable/module_guides/observability/?h=agentops#agentops) + for more details.\\n\\n
\\n\\n### Llama Stack \U0001F999\U0001F95E\\n\\nAgentOps + provides support for Llama Stack Python Client(>=0.0.53), allowing you to + monitor your Agentic applications. \\n\\n- [AgentOps integration example 1](https://github.com/AgentOps-AI/agentops/pull/530/files/65a5ab4fdcf310326f191d4b870d4f553591e3ea#diff-fdddf65549f3714f8f007ce7dfd1cde720329fe54155d54389dd50fbd81813cb)\\n- + [AgentOps integration example 2](https://github.com/AgentOps-AI/agentops/pull/530/files/65a5ab4fdcf310326f191d4b870d4f553591e3ea#diff-6688ff4fb7ab1ce7b1cc9b8362ca27264a3060c16737fb1d850305787a6e3699)\\n- + [Official Llama Stack Python Client](https://github.com/meta-llama/llama-stack-client-python)\\n\\n### + SwarmZero AI \U0001F41D\\n\\nTrack and analyze SwarmZero agents with full + observability. Set an `AGENTOPS_API_KEY` in your environment and initialize + AgentOps to get started.\\n\\n- [SwarmZero](https://swarmzero.ai) - Advanced + multi-agent framework\\n- [AgentOps integration example](https://docs.agentops.ai/v1/integrations/swarmzero)\\n- + [SwarmZero AI integration example](https://docs.swarmzero.ai/examples/ai-agents/build-and-monitor-a-web-search-agent)\\n- + [SwarmZero AI - AgentOps documentation](https://docs.swarmzero.ai/sdk/observability/agentops)\\n- + [Official SwarmZero Python SDK](https://github.com/swarmzero/swarmzero)\\n\\n
\\n + \ Installation\\n\\n```bash\\npip install swarmzero\\npip + install agentops\\n```\\n\\n```python\\nfrom dotenv import load_dotenv\\nload_dotenv()\\n\\nimport + agentops\\nagentops.init()\\n\\nfrom swarmzero import + Agent, Swarm\\n# ...\\n```\\n
\\n\\n## Time travel debugging \U0001F52E\\n\\n
\\n \\\"Time\\n
\\n\\n
\\n\\n[Try it out!](https://app.agentops.ai/timetravel)\\n\\n## + Agent Arena \U0001F94A\\n\\n(coming soon!)\\n\\n## Evaluations Roadmap \U0001F9ED\\n\\n| + Platform | + Dashboard | Evals |\\n| + ---------------------------------------------------------------------------- + | ------------------------------------------ | -------------------------------------- + |\\n| \u2705 Python SDK | + \u2705 Multi-session and Cross-session metrics | \u2705 Custom eval metrics + \ |\\n| \U0001F6A7 Evaluation builder API | + \u2705 Custom event tag tracking\_ | \U0001F51C Agent scorecards + \ |\\n| \u2705 [Javascript/Typescript SDK](https://github.com/AgentOps-AI/agentops-node) + | \u2705 Session replays | \U0001F51C Evaluation playground + + leaderboard |\\n\\n## Debugging Roadmap \U0001F9ED\\n\\n| Performance testing + \ | Environments | + LLM Testing | Reasoning and execution testing + \ |\\n| ----------------------------------------- | ----------------------------------------------------------------------------------- + | ------------------------------------------- | ------------------------------------------------- + |\\n| \u2705 Event latency analysis | \U0001F51C Non-stationary + environment testing | \U0001F51C + LLM non-deterministic function detection | \U0001F6A7 Infinite loops and recursive + thought detection |\\n| \u2705 Agent workflow execution pricing | \U0001F51C + Multi-modal environments | + \U0001F6A7 Token limit overflow flags | \U0001F51C Faulty reasoning + detection |\\n| \U0001F6A7 Success validators (external) + \ | \U0001F51C Execution containers | + \U0001F51C Context limit overflow flags | \U0001F51C Generative + code validators |\\n| \U0001F51C Agent controllers/skill + tests | \u2705 Honeypot and prompt injection detection ([PromptArmor](https://promptarmor.com)) + | \U0001F51C API bill tracking | \U0001F51C Error breakpoint + analysis |\\n| \U0001F51C Information context constraint + testing | \U0001F51C Anti-agent roadblocks (i.e. Captchas) | + \U0001F51C CI/CD integration checks | |\\n| + \U0001F51C Regression testing | \U0001F51C Multi-agent + framework visualization | | + \ |\\n\\n### Why AgentOps? + \U0001F914\\n\\nWithout the right tools, AI agents are slow, expensive, and + unreliable. Our mission is to bring your agent from prototype to production. + Here's why AgentOps stands out:\\n\\n- **Comprehensive Observability**: Track + your AI agents' performance, user interactions, and API usage.\\n- **Real-Time + Monitoring**: Get instant insights with session replays, metrics, and live + monitoring tools.\\n- **Cost Control**: Monitor and manage your spend on LLM + and API calls.\\n- **Failure Detection**: Quickly identify and respond to + agent failures and multi-agent interaction issues.\\n- **Tool Usage Statistics**: + Understand how your agents utilize external tools with detailed analytics.\\n- + **Session-Wide Metrics**: Gain a holistic view of your agents' sessions with + comprehensive statistics.\\n\\nAgentOps is designed to make agent observability, + testing, and monitoring easy.\\n\\n\\n## Star History\\n\\nCheck out our growth + in the community:\\n\\n\\\"Logo\\\"\\n\\n## + Popular projects using AgentOps\\n\\n\\n| Repository | Stars |\\n| :-------- + \ | -----: |\\n|\\\"\\\"   [geekan](https://github.com/geekan) + / [MetaGPT](https://github.com/geekan/MetaGPT) | 42787 |\\n|\\\"\\\"   [run-llama](https://github.com/run-llama) + / [llama_index](https://github.com/run-llama/llama_index) | 34446 |\\n|\\\"\\\"   [crewAIInc](https://github.com/crewAIInc) + / [crewAI](https://github.com/crewAIInc/crewAI) | 18287 |\\n|\\\"\\\"   [camel-ai](https://github.com/camel-ai) + / [camel](https://github.com/camel-ai/camel) | 5166 |\\n|\\\"\\\"   [superagent-ai](https://github.com/superagent-ai) + / [superagent](https://github.com/superagent-ai/superagent) | 5050 |\\n|\\\"\\\"   [iyaja](https://github.com/iyaja) + / [llama-fs](https://github.com/iyaja/llama-fs) | 4713 |\\n|\\\"\\\"   [BasedHardware](https://github.com/BasedHardware) + / [Omi](https://github.com/BasedHardware/Omi) | 2723 |\\n|\\\"\\\"   [MervinPraison](https://github.com/MervinPraison) + / [PraisonAI](https://github.com/MervinPraison/PraisonAI) | 2007 |\\n|\\\"\\\"   [AgentOps-AI](https://github.com/AgentOps-AI) + / [Jaiqu](https://github.com/AgentOps-AI/Jaiqu) | 272 |\\n|\\\"\\\"   [swarmzero](https://github.com/swarmzero) + / [swarmzero](https://github.com/swarmzero/swarmzero) | 195 |\\n|\\\"\\\"   [strnad](https://github.com/strnad) + / [CrewAI-Studio](https://github.com/strnad/CrewAI-Studio) | 134 |\\n|\\\"\\\"   [alejandro-ao](https://github.com/alejandro-ao) + / [exa-crewai](https://github.com/alejandro-ao/exa-crewai) | 55 |\\n|\\\"\\\"   [tonykipkemboi](https://github.com/tonykipkemboi) + / [youtube_yapper_trapper](https://github.com/tonykipkemboi/youtube_yapper_trapper) + | 47 |\\n|\\\"\\\"   [sethcoast](https://github.com/sethcoast) + / [cover-letter-builder](https://github.com/sethcoast/cover-letter-builder) + | 27 |\\n|\\\"\\\"   [bhancockio](https://github.com/bhancockio) + / [chatgpt4o-analysis](https://github.com/bhancockio/chatgpt4o-analysis) | + 19 |\\n|\\\"\\\"   [breakstring](https://github.com/breakstring) + / [Agentic_Story_Book_Workflow](https://github.com/breakstring/Agentic_Story_Book_Workflow) + | 14 |\\n|\\\"\\\"   [MULTI-ON](https://github.com/MULTI-ON) + / [multion-python](https://github.com/MULTI-ON/multion-python) | 13 |\\n\\n\\n_Generated + using [github-dependents-info](https://github.com/nvuillam/github-dependents-info), + by [Nicolas Vuillamy](https://github.com/nvuillam)_\\n\",\"description_content_type\":\"text/markdown\",\"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.3.26/\",\"requires_dist\":[\"opentelemetry-api==1.22.0; + python_version < \\\"3.10\\\"\",\"opentelemetry-api>=1.27.0; python_version + >= \\\"3.10\\\"\",\"opentelemetry-exporter-otlp-proto-http==1.22.0; python_version + < \\\"3.10\\\"\",\"opentelemetry-exporter-otlp-proto-http>=1.27.0; python_version + >= \\\"3.10\\\"\",\"opentelemetry-sdk==1.22.0; python_version < \\\"3.10\\\"\",\"opentelemetry-sdk>=1.27.0; + python_version >= \\\"3.10\\\"\",\"packaging<25.0,>=21.0\",\"psutil<6.1.0,>=5.9.8\",\"pyyaml<7.0,>=5.3\",\"requests<3.0.0,>=2.0.0\",\"termcolor<2.5.0,>=2.3.0\"],\"requires_python\":\"<3.14,>=3.9\",\"summary\":\"Observability + and DevTool Platform for AI Agents\",\"version\":\"0.3.26\",\"yanked\":false,\"yanked_reason\":null},\"last_serial\":27123795,\"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}]},\"urls\":[{\"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}],\"vulnerabilities\":[]}\n" + headers: + Accept-Ranges: + - bytes + Connection: + - keep-alive + Content-Length: + - '33610' Date: - - Tue, 04 Feb 2025 20:24:42 GMT - Server: - - cloudflare - Transfer-Encoding: - - chunked + - Fri, 21 Feb 2025 23:21:03 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, 8895, 0 X-Content-Type-Options: - nosniff + X-Frame-Options: + - deny + X-Permitted-Cross-Domain-Policies: + - none + X-Served-By: + - cache-iad-kjyo7100032-IAD, cache-iad-kjyo7100044-IAD, cache-sjc10025-SJC + X-Timer: + - S1740180063.458885,VS0,VE61 + 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-Request-ID - alt-svc: - - h3=":443"; ma=86400 - cf-cache-status: - - DYNAMIC - openai-organization: - - crewai-iuxna1 - openai-processing-ms: - - '326' - 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: - - '149999810' - x-ratelimit-reset-requests: - - 2ms - x-ratelimit-reset-tokens: - - 0s - x-request-id: - - req_22be86be6fd9d69ca8d310ef534e7bec - http_version: HTTP/1.1 - status_code: 200 + - X-PyPI-Last-Serial + access-control-max-age: + - '86400' + cache-control: + - max-age=900, public + content-encoding: + - gzip + 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://*.google-analytics.com https://*.analytics.google.com + https://*.googletagmanager.com 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/ https://*.google-analytics.com + https://*.googletagmanager.com *.fastly-insights.com *.ethicalads.io ethicalads.blob.core.windows.net; + script-src 'self' https://*.googletagmanager.com https://www.google-analytics.com + https://ssl.google-analytics.com *.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: + - '"5Jjf0qcbSYoU2b9dDGH/Nw"' + referrer-policy: + - origin-when-cross-origin + x-pypi-last-serial: + - '27123795' + status: + code: 200 + message: OK - request: - body: !!binary | - Cp0mCiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkS9CUKEgoQY3Jld2FpLnRl - bGVtZXRyeRKkBwoQfRmsiIy66Scw43CcUw5ZiBIIfYDEhWJTOTkqDENyZXcgQ3JlYXRlZDABOcD6 - XvsOGyEYQWC2bPsOGyEYShsKDmNyZXdhaV92ZXJzaW9uEgkKBzAuMTAwLjBKGgoOcHl0aG9uX3Zl - cnNpb24SCAoGMy4xMi44Si4KCGNyZXdfa2V5EiIKIGU1ODA3MDFkNTJlYjY1YWZmMjRlZWZlNzhj - NzQ2MjhjSjEKB2NyZXdfaWQSJgokMDMzNTZiYmEtMzJmZC00OThmLTgxYTItYzc1ZDBkMzc2N2Qx - ShwKDGNyZXdfcHJvY2VzcxIMCgpzZXF1ZW50aWFsShEKC2NyZXdfbWVtb3J5EgIQAEoaChRjcmV3 - X251bWJlcl9vZl90YXNrcxICGAFKGwoVY3Jld19udW1iZXJfb2ZfYWdlbnRzEgIYAUrRAgoLY3Jl - d19hZ2VudHMSwQIKvgJbeyJrZXkiOiAiYWQxNTMxNjFjNWM1YTg1NmFhMGQwNmIyNDljNGM2NGEi - LCAiaWQiOiAiZjY5YTRmYTMtMzQ4OC00MmFhLTlhMTQtMGEzZmEyOWJmYjZjIiwgInJvbGUiOiAi - YmFzZV9hZ2VudCIsICJ2ZXJib3NlPyI6IGZhbHNlLCAibWF4X2l0ZXIiOiAyMCwgIm1heF9ycG0i - OiBudWxsLCAiZnVuY3Rpb25fY2FsbGluZ19sbG0iOiAiIiwgImxsbSI6ICJncHQtNG8tbWluaSIs - ICJkZWxlZ2F0aW9uX2VuYWJsZWQ/IjogZmFsc2UsICJhbGxvd19jb2RlX2V4ZWN1dGlvbj8iOiBm - YWxzZSwgIm1heF9yZXRyeV9saW1pdCI6IDIsICJ0b29sc19uYW1lcyI6IFtdfV1K/wEKCmNyZXdf - dGFza3MS8AEK7QFbeyJrZXkiOiAiMWIxNWVmMjM5MTViMjc1NWU4OWEwZWMzYjI2YTEzZDIiLCAi - aWQiOiAiNDllNzk0MmMtZTJiMy00YmE1LTg5MTUtMTYwYjQxMDU2ZmVlIiwgImFzeW5jX2V4ZWN1 - dGlvbj8iOiBmYWxzZSwgImh1bWFuX2lucHV0PyI6IGZhbHNlLCAiYWdlbnRfcm9sZSI6ICJiYXNl - X2FnZW50IiwgImFnZW50X2tleSI6ICJhZDE1MzE2MWM1YzVhODU2YWEwZDA2YjI0OWM0YzY0YSIs - ICJ0b29sc19uYW1lcyI6IFtdfV16AhgBhQEAAQAAEo4CChCLgjutPq/3tkNyPqVjfbZhEgjhB7lb - clxzdyoMVGFzayBDcmVhdGVkMAE5CC9++w4bIRhBeMN++w4bIRhKLgoIY3Jld19rZXkSIgogZTU4 - MDcwMWQ1MmViNjVhZmYyNGVlZmU3OGM3NDYyOGNKMQoHY3Jld19pZBImCiQwMzM1NmJiYS0zMmZk - LTQ5OGYtODFhMi1jNzVkMGQzNzY3ZDFKLgoIdGFza19rZXkSIgogMWIxNWVmMjM5MTViMjc1NWU4 - OWEwZWMzYjI2YTEzZDJKMQoHdGFza19pZBImCiQ0OWU3OTQyYy1lMmIzLTRiYTUtODkxNS0xNjBi - NDEwNTZmZWV6AhgBhQEAAQAAEqQHChC7SpRSs6eG9XFmYuMQgghQEghpZMlScOy2DyoMQ3JldyBD - cmVhdGVkMAE50O2cAA8bIRhBOFmrAA8bIRhKGwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4xMDAuMEoa - Cg5weXRob25fdmVyc2lvbhIICgYzLjEyLjhKLgoIY3Jld19rZXkSIgogZTU4MDcwMWQ1MmViNjVh - ZmYyNGVlZmU3OGM3NDYyOGNKMQoHY3Jld19pZBImCiRlYTQ1MWY2OS00Zjk3LTQ4MjYtOWNlYi04 - NTAzMDk2MTQ2MDlKHAoMY3Jld19wcm9jZXNzEgwKCnNlcXVlbnRpYWxKEQoLY3Jld19tZW1vcnkS - AhAAShoKFGNyZXdfbnVtYmVyX29mX3Rhc2tzEgIYAUobChVjcmV3X251bWJlcl9vZl9hZ2VudHMS - AhgBStECCgtjcmV3X2FnZW50cxLBAgq+Alt7ImtleSI6ICJhZDE1MzE2MWM1YzVhODU2YWEwZDA2 - YjI0OWM0YzY0YSIsICJpZCI6ICJmNjlhNGZhMy0zNDg4LTQyYWEtOWExNC0wYTNmYTI5YmZiNmMi - LCAicm9sZSI6ICJiYXNlX2FnZW50IiwgInZlcmJvc2U/IjogZmFsc2UsICJtYXhfaXRlciI6IDIw - LCAibWF4X3JwbSI6IG51bGwsICJmdW5jdGlvbl9jYWxsaW5nX2xsbSI6ICIiLCAibGxtIjogImdw - dC00by1taW5pIiwgImRlbGVnYXRpb25fZW5hYmxlZD8iOiBmYWxzZSwgImFsbG93X2NvZGVfZXhl - Y3V0aW9uPyI6IGZhbHNlLCAibWF4X3JldHJ5X2xpbWl0IjogMiwgInRvb2xzX25hbWVzIjogW119 - XUr/AQoKY3Jld190YXNrcxLwAQrtAVt7ImtleSI6ICIxYjE1ZWYyMzkxNWIyNzU1ZTg5YTBlYzNi - MjZhMTNkMiIsICJpZCI6ICI0OWU3OTQyYy1lMmIzLTRiYTUtODkxNS0xNjBiNDEwNTZmZWUiLCAi - YXN5bmNfZXhlY3V0aW9uPyI6IGZhbHNlLCAiaHVtYW5faW5wdXQ/IjogZmFsc2UsICJhZ2VudF9y - b2xlIjogImJhc2VfYWdlbnQiLCAiYWdlbnRfa2V5IjogImFkMTUzMTYxYzVjNWE4NTZhYTBkMDZi - MjQ5YzRjNjRhIiwgInRvb2xzX25hbWVzIjogW119XXoCGAGFAQABAAASjgIKEM1q5zTl6Q6WKHPQ - eIqEm7sSCCWi2wvaFqpfKgxUYXNrIENyZWF0ZWQwATmIObwADxshGEEAo7wADxshGEouCghjcmV3 - X2tleRIiCiBlNTgwNzAxZDUyZWI2NWFmZjI0ZWVmZTc4Yzc0NjI4Y0oxCgdjcmV3X2lkEiYKJGVh - NDUxZjY5LTRmOTctNDgyNi05Y2ViLTg1MDMwOTYxNDYwOUouCgh0YXNrX2tleRIiCiAxYjE1ZWYy - MzkxNWIyNzU1ZTg5YTBlYzNiMjZhMTNkMkoxCgd0YXNrX2lkEiYKJDQ5ZTc5NDJjLWUyYjMtNGJh - NS04OTE1LTE2MGI0MTA1NmZlZXoCGAGFAQABAAASpAcKEEhIZzGdZRAdvfcluDR5qvESCFMGo60X - V/dYKgxDcmV3IENyZWF0ZWQwATnY8LgBDxshGEGQrsUBDxshGEobCg5jcmV3YWlfdmVyc2lvbhIJ - CgcwLjEwMC4wShoKDnB5dGhvbl92ZXJzaW9uEggKBjMuMTIuOEouCghjcmV3X2tleRIiCiBlNTgw - NzAxZDUyZWI2NWFmZjI0ZWVmZTc4Yzc0NjI4Y0oxCgdjcmV3X2lkEiYKJDA3MDJmOGU1LWRjMTYt - NDlhYi1hMWY1LThjOWQyY2IwMDYwYkocCgxjcmV3X3Byb2Nlc3MSDAoKc2VxdWVudGlhbEoRCgtj - cmV3X21lbW9yeRICEABKGgoUY3Jld19udW1iZXJfb2ZfdGFza3MSAhgBShsKFWNyZXdfbnVtYmVy - X29mX2FnZW50cxICGAFK0QIKC2NyZXdfYWdlbnRzEsECCr4CW3sia2V5IjogImFkMTUzMTYxYzVj - NWE4NTZhYTBkMDZiMjQ5YzRjNjRhIiwgImlkIjogImY2OWE0ZmEzLTM0ODgtNDJhYS05YTE0LTBh - M2ZhMjliZmI2YyIsICJyb2xlIjogImJhc2VfYWdlbnQiLCAidmVyYm9zZT8iOiBmYWxzZSwgIm1h - eF9pdGVyIjogMjAsICJtYXhfcnBtIjogbnVsbCwgImZ1bmN0aW9uX2NhbGxpbmdfbGxtIjogIiIs - ICJsbG0iOiAiZ3B0LTRvLW1pbmkiLCAiZGVsZWdhdGlvbl9lbmFibGVkPyI6IGZhbHNlLCAiYWxs - b3dfY29kZV9leGVjdXRpb24/IjogZmFsc2UsICJtYXhfcmV0cnlfbGltaXQiOiAyLCAidG9vbHNf - bmFtZXMiOiBbXX1dSv8BCgpjcmV3X3Rhc2tzEvABCu0BW3sia2V5IjogIjFiMTVlZjIzOTE1YjI3 - NTVlODlhMGVjM2IyNmExM2QyIiwgImlkIjogIjQ5ZTc5NDJjLWUyYjMtNGJhNS04OTE1LTE2MGI0 - MTA1NmZlZSIsICJhc3luY19leGVjdXRpb24/IjogZmFsc2UsICJodW1hbl9pbnB1dD8iOiBmYWxz - ZSwgImFnZW50X3JvbGUiOiAiYmFzZV9hZ2VudCIsICJhZ2VudF9rZXkiOiAiYWQxNTMxNjFjNWM1 - YTg1NmFhMGQwNmIyNDljNGM2NGEiLCAidG9vbHNfbmFtZXMiOiBbXX1degIYAYUBAAEAABKOAgoQ - PkgvMtq3aT5YPXE8gCRxPBIIMx/zQOuC+8sqDFRhc2sgQ3JlYXRlZDABOYjk2AEPGyEYQZiI2QEP - GyEYSi4KCGNyZXdfa2V5EiIKIGU1ODA3MDFkNTJlYjY1YWZmMjRlZWZlNzhjNzQ2MjhjSjEKB2Ny - ZXdfaWQSJgokMDcwMmY4ZTUtZGMxNi00OWFiLWExZjUtOGM5ZDJjYjAwNjBiSi4KCHRhc2tfa2V5 - EiIKIDFiMTVlZjIzOTE1YjI3NTVlODlhMGVjM2IyNmExM2QySjEKB3Rhc2tfaWQSJgokNDllNzk0 - MmMtZTJiMy00YmE1LTg5MTUtMTYwYjQxMDU2ZmVlegIYAYUBAAEAABKkBwoQex7nA0gUUrZHbN6F - gWp/gBIIKPd4fiRi7DwqDENyZXcgQ3JlYXRlZDABOTiIrAIPGyEYQdCAtwIPGyEYShsKDmNyZXdh - aV92ZXJzaW9uEgkKBzAuMTAwLjBKGgoOcHl0aG9uX3ZlcnNpb24SCAoGMy4xMi44Si4KCGNyZXdf - a2V5EiIKIGU1ODA3MDFkNTJlYjY1YWZmMjRlZWZlNzhjNzQ2MjhjSjEKB2NyZXdfaWQSJgokMGNm - YjUzZWItMDA2Mi00YmVmLTk1ZTgtMDgwMjQ3NmNkMWRlShwKDGNyZXdfcHJvY2VzcxIMCgpzZXF1 - ZW50aWFsShEKC2NyZXdfbWVtb3J5EgIQAEoaChRjcmV3X251bWJlcl9vZl90YXNrcxICGAFKGwoV - Y3Jld19udW1iZXJfb2ZfYWdlbnRzEgIYAUrRAgoLY3Jld19hZ2VudHMSwQIKvgJbeyJrZXkiOiAi - YWQxNTMxNjFjNWM1YTg1NmFhMGQwNmIyNDljNGM2NGEiLCAiaWQiOiAiZjY5YTRmYTMtMzQ4OC00 - MmFhLTlhMTQtMGEzZmEyOWJmYjZjIiwgInJvbGUiOiAiYmFzZV9hZ2VudCIsICJ2ZXJib3NlPyI6 - IGZhbHNlLCAibWF4X2l0ZXIiOiAyMCwgIm1heF9ycG0iOiBudWxsLCAiZnVuY3Rpb25fY2FsbGlu - Z19sbG0iOiAiIiwgImxsbSI6ICJncHQtNG8tbWluaSIsICJkZWxlZ2F0aW9uX2VuYWJsZWQ/Ijog - ZmFsc2UsICJhbGxvd19jb2RlX2V4ZWN1dGlvbj8iOiBmYWxzZSwgIm1heF9yZXRyeV9saW1pdCI6 - IDIsICJ0b29sc19uYW1lcyI6IFtdfV1K/wEKCmNyZXdfdGFza3MS8AEK7QFbeyJrZXkiOiAiMWIx - NWVmMjM5MTViMjc1NWU4OWEwZWMzYjI2YTEzZDIiLCAiaWQiOiAiNDllNzk0MmMtZTJiMy00YmE1 - LTg5MTUtMTYwYjQxMDU2ZmVlIiwgImFzeW5jX2V4ZWN1dGlvbj8iOiBmYWxzZSwgImh1bWFuX2lu - cHV0PyI6IGZhbHNlLCAiYWdlbnRfcm9sZSI6ICJiYXNlX2FnZW50IiwgImFnZW50X2tleSI6ICJh - ZDE1MzE2MWM1YzVhODU2YWEwZDA2YjI0OWM0YzY0YSIsICJ0b29sc19uYW1lcyI6IFtdfV16AhgB - hQEAAQAAEo4CChD+ymllejCksajGYDua8tgNEghnjlejrbuw2SoMVGFzayBDcmVhdGVkMAE5EDrI - Ag8bIRhBGIzIAg8bIRhKLgoIY3Jld19rZXkSIgogZTU4MDcwMWQ1MmViNjVhZmYyNGVlZmU3OGM3 - NDYyOGNKMQoHY3Jld19pZBImCiQwY2ZiNTNlYi0wMDYyLTRiZWYtOTVlOC0wODAyNDc2Y2QxZGVK - LgoIdGFza19rZXkSIgogMWIxNWVmMjM5MTViMjc1NWU4OWEwZWMzYjI2YTEzZDJKMQoHdGFza19p - ZBImCiQ0OWU3OTQyYy1lMmIzLTRiYTUtODkxNS0xNjBiNDEwNTZmZWV6AhgBhQEAAQAA + body: '{"session": {"end_timestamp": null, "end_state": "Indeterminate", "session_id": + "73534e48-dd5a-4ef4-a702-fbbba9d00f27", "init_timestamp": "2025-02-21T23:21:03.681822+00:00", + "tags": ["crewai"], "video": null, "end_state_reason": null, "host_env": {"SDK": + {"AgentOps SDK Version": "0.3.26", "Python Version": "3.12.8", "System Packages": + {"pluggy": "1.5.0", "importlib.resources": "6.4.5", "importlib.metadata": "8.4.0", + "iniconfig": "2.0.0", "pytest": "8.3.3", "pytest_asyncio": "0.24.0", "wrapt": + "1.16.0", "urllib3": "2.2.3", "charset_normalizer": "3.4.0", "idna": "3.10", + "certifi": "2024.8.30", "requests": "2.32.3", "multidict": "6.1.0", "propcache": + "0.2.0", "yarl": "1.18.3", "aiohappyeyeballs": "2.4.3", "frozenlist": "1.5.0", + "aiosignal": "1.3.1", "aiohttp": "3.11.11", "sniffio": "1.3.1", "anyio": "4.6.2.post1", + "h11": "0.14.0", "h2": "4.2.0", "hpack": "4.1.0", "hyperframe": "6.1.0", "httpcore": + "1.0.6", "click": "8.1.8", "pygments": "2.18.0", "rich": "13.9.3", "httpx": + "0.27.0", "pytest_vcr": "1.0.2", "pytest_subprocess": "1.5.2", "typing_extensions": + "4.12.2", "pydantic": "2.10.4", "annotated_types": "0.7.0", "pydantic_core": + "2.27.2", "json_repair": "0.30.0", "overrides": "7.7.0", "numpy": "1.26.4", + "tenacity": "9.0.0", "onnxruntime": "1.19.2", "tokenizers": "0.20.1", "tqdm": + "4.66.5", "deprecated": "1.2.14", "zipp": "3.20.2", "importlib_metadata": "8.4.0", + "opentelemetry.sdk": "1.27.0", "psutil": "6.0.0", "opentelemetry.exporter.otlp.proto.grpc": + "1.27.0", "opentelemetry.exporter.otlp.proto.common": "1.27.0", "opentelemetry.proto": + "1.27.0", "chromadb": "0.5.23", "crewai.tools": "0.33.0", "appdirs": "1.4.4", + "blinker": "1.9.0", "opentelemetry.exporter.otlp.proto.http": "1.27.0", "termcolor": + "2.4.0", "packaging": "23.2", "langchain_core": "0.3.36", "langsmith": "0.1.147", + "requests_toolbelt": "1.0.0", "orjson": "3.10.10", "jsonpointer": "3.0.0", "jsonpatch": + "1.33", "agentops": "0.3.26", "distro": "1.9.0", "jiter": "0.5.0", "openai": + "1.61.0", "regex": "2024.9.11", "tiktoken": "0.7.0", "markupsafe": "3.0.2", + "jinja2": "3.1.4", "litellm": "1.60.2", "json5": "0.10.0", "jsonpickle": "3.3.0", + "networkx": "3.4.2", "traitlets": "5.14.3", "executing": "2.1.0", "six": "1.16.0", + "asttokens": "2.4.1", "pure_eval": "0.2.3", "stack_data": "0.6.3", "decorator": + "5.1.1", "wcwidth": "0.2.13", "prompt_toolkit": "3.0.48", "parso": "0.8.4", + "colorama": "0.4.6", "jedi": "0.19.1", "IPython": "8.28.0", "pyvis": "0.3.2", + "crewai": "0.102.0"}}, "OS": {"Hostname": "Lorenzes-MacBook-Pro.local", "OS": + "Darwin", "OS Version": "Darwin Kernel Version 24.0.0: Mon Aug 12 20:51:54 PDT + 2024; root:xnu-11215.1.10~2/RELEASE_ARM64_T6000", "OS Release": "24.0.0"}, "CPU": + {"Physical cores": 10, "Total cores": 10, "CPU Usage": "21.8%"}, "RAM": {"Total": + "32.00 GB", "Available": "9.89 GB", "Used": "12.38 GB", "Percentage": "69.1%"}, + "Disk": {"/dev/disk3s1s1": {"Mountpoint": "/", "Total": "926.35 GB", "Used": + "9.94 GB", "Free": "2.64 GB", "Percentage": "79.0%"}, "/dev/disk3s6": {"Mountpoint": + "/System/Volumes/VM", "Total": "926.35 GB", "Used": "1.00 GB", "Free": "2.64 + GB", "Percentage": "27.5%"}, "/dev/disk3s2": {"Mountpoint": "/System/Volumes/Preboot", + "Total": "926.35 GB", "Used": "6.75 GB", "Free": "2.64 GB", "Percentage": "71.9%"}, + "/dev/disk3s4": {"Mountpoint": "/System/Volumes/Update", "Total": "926.35 GB", + "Used": "0.00 GB", "Free": "2.64 GB", "Percentage": "0.1%"}, "/dev/disk1s2": + {"Mountpoint": "/System/Volumes/xarts", "Total": "0.49 GB", "Used": "0.01 GB", + "Free": "0.47 GB", "Percentage": "1.2%"}, "/dev/disk1s1": {"Mountpoint": "/System/Volumes/iSCPreboot", + "Total": "0.49 GB", "Used": "0.01 GB", "Free": "0.47 GB", "Percentage": "1.1%"}, + "/dev/disk1s3": {"Mountpoint": "/System/Volumes/Hardware", "Total": "0.49 GB", + "Used": "0.00 GB", "Free": "0.47 GB", "Percentage": "0.8%"}, "/dev/disk3s5": + {"Mountpoint": "/System/Volumes/Data", "Total": "926.35 GB", "Used": "904.02 + GB", "Free": "2.64 GB", "Percentage": "99.7%"}, "/dev/disk5s1": {"Mountpoint": + "/Library/Developer/CoreSimulator/Volumes/iOS_21A342", "Total": "15.95 GB", + "Used": "15.45 GB", "Free": "0.46 GB", "Percentage": "97.1%"}}, "Installed Packages": + {"Installed Packages": {"flatbuffers": "24.3.25", "google-api-core": "2.24.1", + "shellingham": "1.5.4", "mkdocs": "1.6.1", "mergedeep": "1.3.4", "opencv-python-headless": + "4.11.0.86", "pyright": "1.1.393", "shapely": "2.0.7", "tomli": "2.0.2", "ruff": + "0.8.2", "coloredlogs": "15.0.1", "Rtree": "1.3.0", "pytest-asyncio": "0.24.0", + "humanfriendly": "10.0", "executing": "2.1.0", "uv": "0.4.26", "pexpect": "4.9.0", + "pandas": "2.2.3", "pyyaml_env_tag": "0.1", "lazy_loader": "0.4", "PyJWT": "2.9.0", + "decorator": "5.1.1", "filelock": "3.16.1", "idna": "3.10", "embedchain": "0.1.126", + "traitlets": "5.14.3", "ipython": "8.28.0", "tomli_w": "1.1.0", "opentelemetry-exporter-otlp-proto-http": + "1.27.0", "pyasn1_modules": "0.4.1", "Markdown": "3.7", "distlib": "0.3.9", + "pyvis": "0.3.2", "termcolor": "2.4.0", "watchdog": "5.0.3", "tifffile": "2025.2.18", + "multidict": "6.1.0", "ptyprocess": "0.7.0", "langchain": "0.3.19", "aiosignal": + "1.3.1", "cssselect2": "0.7.0", "griffe": "1.5.1", "grpc-google-iam-v1": "0.14.0", + "zipp": "3.20.2", "mkdocs-get-deps": "0.2.0", "importlib_resources": "6.4.5", + "litellm": "1.60.2", "google-auth": "2.35.0", "Mako": "1.3.9", "mkdocs-material-extensions": + "1.3.1", "latex2mathml": "3.77.0", "urllib3": "2.2.3", "overrides": "7.7.0", + "parso": "0.8.4", "pytest": "8.3.3", "webencodings": "0.5.1", "colorama": "0.4.6", + "orjson": "3.10.10", "langchain-community": "0.3.17", "lancedb": "0.18.0", "langchain-openai": + "0.2.14", "google-cloud-resource-manager": "1.14.0", "rich": "13.9.3", "schema": + "0.7.7", "propcache": "0.2.0", "python-docx": "1.1.2", "defusedxml": "0.7.1", + "referencing": "0.35.1", "paginate": "0.5.7", "semchunk": "2.2.2", "requests": + "2.32.3", "frozenlist": "1.5.0", "multiprocess": "0.70.17", "openpyxl": "3.1.5", + "Jinja2": "3.1.4", "httpx-sse": "0.4.0", "cryptography": "43.0.3", "transformers": + "4.49.0", "docling": "2.24.0", "websockets": "13.1", "chromadb": "0.5.23", "blinker": + "1.9.0", "soupsieve": "2.6", "ninja": "1.11.1.3", "tqdm": "4.66.5", "qdrant-client": + "1.13.2", "markdown-it-py": "3.0.0", "sympy": "1.13.3", "six": "1.16.0", "mypy-extensions": + "1.0.0", "posthog": "3.7.0", "h11": "0.14.0", "googleapis-common-protos": "1.65.0", + "fsspec": "2024.10.0", "networkx": "3.4.2", "grpcio": "1.67.0", "python-pptx": + "1.0.2", "marko": "2.1.2", "et_xmlfile": "2.0.0", "typing-inspect": "0.9.0", + "protobuf": "4.25.5", "ghp-import": "2.1.0", "grpcio-status": "1.70.0", "auth0-python": + "4.7.2", "pymdown-extensions": "10.11.2", "iniconfig": "2.0.0", "beautifulsoup4": + "4.13.3", "SQLAlchemy": "2.0.38", "crewai-tools": "0.33.0", "google-resumable-media": + "2.7.2", "grpcio-tools": "1.70.0", "uvicorn": "0.32.0", "chroma-hnswlib": "0.7.6", + "jsonpatch": "1.33", "click": "8.1.8", "jsonpointer": "3.0.0", "lxml": "5.3.1", + "numpy": "1.26.4", "docstring_parser": "0.16", "attrs": "24.2.0", "mkdocstrings-python": + "1.12.2", "crewai": "0.102.0", "cairocffi": "1.7.1", "packaging": "23.2", "kubernetes": + "31.0.0", "appdirs": "1.4.4", "certifi": "2024.8.30", "h2": "4.2.0", "starlette": + "0.41.0", "tenacity": "9.0.0", "cffi": "1.17.1", "pytest-vcr": "1.0.2", "aiohttp": + "3.11.11", "jsonschema": "4.23.0", "google-crc32c": "1.6.0", "pdfminer.six": + "20231228", "mypy": "1.13.0", "opentelemetry-exporter-otlp-proto-common": "1.27.0", + "pyasn1": "0.6.1", "stack-data": "0.6.3", "asttokens": "2.4.1", "cachetools": + "5.5.0", "portalocker": "2.10.1", "asgiref": "3.8.1", "pypdfium2": "4.30.0", + "typer": "0.12.5", "dataclasses-json": "0.6.7", "pathspec": "0.12.1", "oauthlib": + "3.2.2", "identify": "2.6.1", "psutil": "6.0.0", "docling-core": "2.20.0", "mpire": + "2.10.2", "pylance": "0.22.0", "jedi": "0.19.1", "alembic": "1.14.1", "python-dotenv": + "1.0.1", "mkdocs-material": "9.5.42", "aiohappyeyeballs": "2.4.3", "opentelemetry-instrumentation": + "0.48b0", "loguru": "0.7.3", "docling-parse": "3.4.0", "langchain-text-splitters": + "0.3.6", "watchfiles": "0.24.0", "bcrypt": "4.2.0", "sniffio": "1.3.1", "nodeenv": + "1.9.1", "docling-ibm-models": "3.4.0", "jsonpickle": "3.3.0", "safetensors": + "0.5.2", "google-cloud-storage": "2.19.0", "jsonschema-specifications": "2024.10.1", + "mdurl": "0.1.2", "fastavro": "1.10.0", "cfgv": "3.4.0", "python-dateutil": + "2.9.0.post0", "mpmath": "1.3.0", "json_repair": "0.30.0", "build": "1.2.2.post1", + "types-requests": "2.32.0.20241016", "pytz": "2024.2", "huggingface-hub": "0.26.1", + "yarl": "1.18.3", "jsonref": "1.1.0", "rsa": "4.9", "wcwidth": "0.2.13", "google-cloud-aiplatform": + "1.81.0", "torch": "2.6.0", "langchain-cohere": "0.3.5", "langchain-experimental": + "0.3.4", "scipy": "1.15.2", "json5": "0.10.0", "opentelemetry-sdk": "1.27.0", + "opentelemetry-util-http": "0.48b0", "tzdata": "2025.1", "babel": "2.16.0", + "langchain-core": "0.3.36", "virtualenv": "20.27.0", "importlib_metadata": "8.4.0", + "easyocr": "1.7.2", "pydantic_core": "2.27.2", "cohere": "5.13.12", "prompt_toolkit": + "3.0.48", "pycparser": "2.22", "proto-plus": "1.26.0", "pydantic": "2.10.4", + "pluggy": "1.5.0", "torchvision": "0.21.0", "pypdf": "5.3.0", "py_rust_stemmers": + "0.1.3", "tiktoken": "0.7.0", "opentelemetry-instrumentation-fastapi": "0.48b0", + "agentops": "0.3.26", "setuptools": "75.2.0", "google-cloud-core": "2.4.1", + "imageio": "2.37.0", "pure_eval": "0.2.3", "pdfplumber": "0.11.4", "deprecation": + "2.1.0", "distro": "1.9.0", "fastembed": "0.5.1", "pillow": "10.4.0", "pydantic-settings": + "2.7.1", "requests-toolbelt": "1.0.0", "mem0ai": "0.1.52", "docker": "7.1.0", + "httptools": "0.6.4", "mkdocs-autorefs": "1.2.0", "httpx": "0.27.0", "typing_extensions": + "4.12.2", "jiter": "0.5.0", "PyYAML": "6.0.2", "matplotlib-inline": "0.1.7", + "weaviate-client": "3.26.7", "tokenizers": "0.20.1", "opentelemetry-exporter-otlp-proto-grpc": + "1.27.0", "rpds-py": "0.20.0", "monotonic": "1.6", "charset-normalizer": "3.4.0", + "backoff": "2.2.1", "pytube": "15.0.0", "Deprecated": "1.2.14", "regex": "2024.9.11", + "onnxruntime": "1.19.2", "hpack": "4.1.0", "tinycss2": "1.3.0", "instructor": + "1.6.3", "filetype": "1.2.0", "opentelemetry-instrumentation-asgi": "0.48b0", + "Authlib": "1.4.1", "google-cloud-bigquery": "3.29.0", "pyproject_hooks": "1.2.0", + "opentelemetry-api": "1.27.0", "pyclipper": "1.3.0.post6", "vcrpy": "5.1.0", + "pre_commit": "4.0.1", "uvloop": "0.21.0", "platformdirs": "4.3.6", "openai": + "1.61.0", "marshmallow": "3.26.1", "annotated-types": "0.7.0", "mkdocstrings": + "0.26.2", "opentelemetry-proto": "1.27.0", "anyio": "4.6.2.post1", "opentelemetry-semantic-conventions": + "0.48b0", "grpcio-health-checking": "1.67.0", "PyPika": "0.48.9", "gptcache": + "0.1.44", "pysbd": "0.3.4", "scikit-image": "0.25.2", "httpcore": "1.0.6", "Pygments": + "2.18.0", "XlsxWriter": "3.2.2", "hyperframe": "6.1.0", "langsmith": "0.1.147", + "requests-oauthlib": "2.0.0", "durationpy": "0.9", "validators": "0.34.0", "CairoSVG": + "2.7.1", "fastapi": "0.115.3", "jsonlines": "3.1.0", "tabulate": "0.9.0", "pyarrow": + "19.0.0", "python-bidi": "0.6.6", "dill": "0.3.9", "pytest-subprocess": "1.5.2", + "wrapt": "1.16.0", "mmh3": "4.1.0", "websocket-client": "1.8.0", "MarkupSafe": + "3.0.2"}}, "Project Working Directory": {"Project Working Directory": "/Users/lorenzejay/Documents/Uplift + Digital Solutions/clients/crewai-org/crewAI"}, "Virtual Environment": {"Virtual + Environment": "/Users/lorenzejay/Documents/Uplift Digital Solutions/clients/crewai-org/crewAI/.venv"}}, + "config": "", "jwt": null, "_lock": "", "_end_session_lock": "", "token_cost": + "", "_session_url": "", "event_counts": {"llms": 0, "tools": 0, "actions": 0, + "errors": 0, "apis": 0}}}' headers: Accept: - '*/*' @@ -204,7 +605,562 @@ interactions: Connection: - keep-alive Content-Length: - - '4896' + - '11629' + Content-Type: + - application/json; charset=UTF-8 + Keep-Alive: + - timeout=10, max=1000 + User-Agent: + - python-requests/2.32.3 + X-Agentops-Api-Key: + - e6568f10-56cf-4e37-9415-86e979a7f309 + method: POST + uri: https://api.agentops.ai/v2/create_session + response: + body: + string: '{"jwt":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZXNzaW9uX2lkIjoiNzM1MzRlNDgtZGQ1YS00ZWY0LWE3MDItZmJiYmE5ZDAwZjI3IiwiZXhwIjoxNzQwMjY2NDY0LjE3MDgwN30.gkiHROHd6xvHJ5IK83zGZQqIezGFCMsKbmGUer3QdrM","session_url":"https://app.agentops.ai/drilldown?session_id=73534e48-dd5a-4ef4-a702-fbbba9d00f27","status":"Success"}' + headers: + Content-Length: + - '311' + Content-Type: + - application/json + Date: + - Fri, 21 Feb 2025 23:21:04 GMT + Server: + - railway-edge + X-Railway-Request-Id: + - rqR5EYLXQXOp9NjRX4RR6g_3485859946 + status: + code: 200 + message: OK +- request: + body: '{"id": "17cf1c67-f8ad-4336-ac7e-c4500b5ec2a6", "name": "base_agent"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '68' + Content-Type: + - application/json; charset=UTF-8 + Keep-Alive: + - timeout=10, max=1000 + User-Agent: + - python-requests/2.32.3 + X-Agentops-Api-Key: + - e6568f10-56cf-4e37-9415-86e979a7f309 + method: POST + uri: https://api.agentops.ai/v2/create_agent + response: + body: + string: '"Success"' + headers: + Content-Length: + - '9' + Content-Type: + - application/json + Date: + - Fri, 21 Feb 2025 23:21:04 GMT + Server: + - railway-edge + X-Railway-Request-Id: + - 45OTupi5TouV2-HzrlkiOw_3167001623 + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.32.3 + 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 \",\"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\":\"\\n\\n
\\n Observability and + DevTool platform for AI Agents\\n
\\n\\n
\\n\\n
\\n + \ \\n \\\"Downloads\\\"\\n \\n \\n + \ \\\"git\\n \\n \\\"PyPI\\n \\n + \ \\\"License:\\n \\n
\\n\\n

\\n + \ \\n \\\"Twitter\\\"\\n \\n \\n + \ \\\"Discord\\\"\\n \\n \\n + \ \\\"Dashboard\\\"\\n \\n \\n + \ \\\"Documentation\\\"\\n \\n \\n + \ \\\"Chat\\n \\n

\\n\\n\\n\\n
\\n \\\"Dashboard\\n
\\n\\n
\\n\\n\\nAgentOps helps developers + build, evaluate, and monitor AI agents. From prototype to production.\\n\\n| + \ | |\\n| + ------------------------------------- | ------------------------------------------------------------- + |\\n| \U0001F4CA **Replay Analytics and Debugging** | Step-by-step agent execution + graphs |\\n| \U0001F4B8 **LLM Cost Management** + \ | Track spend with LLM foundation model providers |\\n| + \U0001F9EA **Agent Benchmarking** | Test your agents against 1,000+ + evals |\\n| \U0001F510 **Compliance and Security** + \ | Detect common prompt injection and data exfiltration exploits |\\n| + \U0001F91D **Framework Integrations** | Native Integrations with CrewAI, + AG2(AutoGen), Camel AI, & LangChain |\\n\\n## Quick Start \u2328\uFE0F\\n\\n```bash\\npip + install agentops\\n```\\n\\n\\n#### Session replays in 2 lines of code\\n\\nInitialize + the AgentOps client and automatically get analytics on all your LLM calls.\\n\\n[Get + an API key](https://app.agentops.ai/settings/projects)\\n\\n```python\\nimport + agentops\\n\\n# Beginning of your program (i.e. main.py, __init__.py)\\nagentops.init( + < INSERT YOUR API KEY HERE >)\\n\\n...\\n\\n# End of program\\nagentops.end_session('Success')\\n```\\n\\nAll + your sessions can be viewed on the [AgentOps dashboard](https://app.agentops.ai?ref=gh)\\n
\\n\\n
\\n + \ Agent Debugging\\n \\n + \ \\\"Agent\\n \\n \\n + \ \\\"Chat\\n \\n \\n + \ \\\"Event\\n \\n
\\n\\n
\\n + \ Session Replays\\n \\n + \ \\\"Session\\n \\n
\\n\\n
\\n Summary Analytics\\n \\n + \ \\\"Summary\\n \\n \\n + \ \\\"Summary\\n \\n
\\n\\n\\n### + First class Developer Experience\\nAdd powerful observability to your agents, + tools, and functions with as little code as possible: one line at a time.\\n
\\nRefer + to our [documentation](http://docs.agentops.ai)\\n\\n```python\\n# Automatically + associate all Events with the agent that originated them\\nfrom agentops import + track_agent\\n\\n@track_agent(name='SomeCustomName')\\nclass MyAgent:\\n ...\\n```\\n\\n```python\\n# + Automatically create ToolEvents for tools that agents will use\\nfrom agentops + import record_tool\\n\\n@record_tool('SampleToolName')\\ndef sample_tool(...):\\n + \ ...\\n```\\n\\n```python\\n# Automatically create ActionEvents for other + functions.\\nfrom agentops import record_action\\n\\n@agentops.record_action('sample + function being record')\\ndef sample_function(...):\\n ...\\n```\\n\\n```python\\n# + Manually record any other Events\\nfrom agentops import record, ActionEvent\\n\\nrecord(ActionEvent(\\\"received_user_input\\\"))\\n```\\n\\n## + Integrations \U0001F9BE\\n\\n### CrewAI \U0001F6F6\\n\\nBuild Crew agents + with observability with only 2 lines of code. Simply set an `AGENTOPS_API_KEY` + in your environment, and your crews will get automatic monitoring on the AgentOps + dashboard.\\n\\n```bash\\npip install 'crewai[agentops]'\\n```\\n\\n- [AgentOps + integration example](https://docs.agentops.ai/v1/integrations/crewai)\\n- + [Official CrewAI documentation](https://docs.crewai.com/how-to/AgentOps-Observability)\\n\\n### + AG2 \U0001F916\\nWith only two lines of code, add full observability and monitoring + to AG2 (formerly AutoGen) agents. Set an `AGENTOPS_API_KEY` in your environment + and call `agentops.init()`\\n\\n- [AG2 Observability Example](https://docs.ag2.ai/notebooks/agentchat_agentops)\\n- + [AG2 - AgentOps Documentation](https://docs.ag2.ai/docs/ecosystem/agentops)\\n\\n### + Camel AI \U0001F42A\\n\\nTrack and analyze CAMEL agents with full observability. + Set an `AGENTOPS_API_KEY` in your environment and initialize AgentOps to get + started.\\n\\n- [Camel AI](https://www.camel-ai.org/) - Advanced agent communication + framework\\n- [AgentOps integration example](https://docs.agentops.ai/v1/integrations/camel)\\n- + [Official Camel AI documentation](https://docs.camel-ai.org/cookbooks/agents_tracking.html)\\n\\n
\\n + \ Installation\\n\\n```bash\\npip install \\\"camel-ai[all]==0.2.11\\\"\\npip + install agentops\\n```\\n\\n```python\\nimport os\\nimport agentops\\nfrom + camel.agents import ChatAgent\\nfrom camel.messages import BaseMessage\\nfrom + camel.models import ModelFactory\\nfrom camel.types import ModelPlatformType, + ModelType\\n\\n# Initialize AgentOps\\nagentops.init(os.getenv(\\\"AGENTOPS_API_KEY\\\"), + default_tags=[\\\"CAMEL Example\\\"])\\n\\n# Import toolkits after AgentOps + init for tracking\\nfrom camel.toolkits import SearchToolkit\\n\\n# Set up + the agent with search tools\\nsys_msg = BaseMessage.make_assistant_message(\\n + \ role_name='Tools calling operator',\\n content='You are a helpful assistant'\\n)\\n\\n# + Configure tools and model\\ntools = [*SearchToolkit().get_tools()]\\nmodel + = ModelFactory.create(\\n model_platform=ModelPlatformType.OPENAI,\\n model_type=ModelType.GPT_4O_MINI,\\n)\\n\\n# + Create and run the agent\\ncamel_agent = ChatAgent(\\n system_message=sys_msg,\\n + \ model=model,\\n tools=tools,\\n)\\n\\nresponse = camel_agent.step(\\\"What + is AgentOps?\\\")\\nprint(response)\\n\\nagentops.end_session(\\\"Success\\\")\\n```\\n\\nCheck + out our [Camel integration guide](https://docs.agentops.ai/v1/integrations/camel) + for more examples including multi-agent scenarios.\\n
\\n\\n### Langchain + \U0001F99C\U0001F517\\n\\nAgentOps works seamlessly with applications built + using Langchain. To use the handler, install Langchain as an optional dependency:\\n\\n
\\n + \ Installation\\n \\n```shell\\npip install agentops[langchain]\\n```\\n\\nTo + use the handler, import and set\\n\\n```python\\nimport os\\nfrom langchain.chat_models + import ChatOpenAI\\nfrom langchain.agents import initialize_agent, AgentType\\nfrom + agentops.partners.langchain_callback_handler import LangchainCallbackHandler\\n\\nAGENTOPS_API_KEY + = os.environ['AGENTOPS_API_KEY']\\nhandler = LangchainCallbackHandler(api_key=AGENTOPS_API_KEY, + tags=['Langchain Example'])\\n\\nllm = ChatOpenAI(openai_api_key=OPENAI_API_KEY,\\n + \ callbacks=[handler],\\n model='gpt-3.5-turbo')\\n\\nagent + = initialize_agent(tools,\\n llm,\\n agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,\\n + \ verbose=True,\\n callbacks=[handler], + # You must pass in a callback handler to record your agent\\n handle_parsing_errors=True)\\n```\\n\\nCheck + out the [Langchain Examples Notebook](./examples/langchain_examples.ipynb) + for more details including Async handlers.\\n\\n
\\n\\n### Cohere + \u2328\uFE0F\\n\\nFirst class support for Cohere(>=5.4.0). This is a living + integration, should you need any added functionality please message us on + Discord!\\n\\n- [AgentOps integration example](https://docs.agentops.ai/v1/integrations/cohere)\\n- + [Official Cohere documentation](https://docs.cohere.com/reference/about)\\n\\n
\\n + \ Installation\\n \\n```bash\\npip install cohere\\n```\\n\\n```python + python\\nimport cohere\\nimport agentops\\n\\n# Beginning of program's code + (i.e. main.py, __init__.py)\\nagentops.init()\\nco + = cohere.Client()\\n\\nchat = co.chat(\\n message=\\\"Is it pronounced + ceaux-hear or co-hehray?\\\"\\n)\\n\\nprint(chat)\\n\\nagentops.end_session('Success')\\n```\\n\\n```python + python\\nimport cohere\\nimport agentops\\n\\n# Beginning of program's code + (i.e. main.py, __init__.py)\\nagentops.init()\\n\\nco + = cohere.Client()\\n\\nstream = co.chat_stream(\\n message=\\\"Write me + a haiku about the synergies between Cohere and AgentOps\\\"\\n)\\n\\nfor event + in stream:\\n if event.event_type == \\\"text-generation\\\":\\n print(event.text, + end='')\\n\\nagentops.end_session('Success')\\n```\\n
\\n\\n\\n### + Anthropic \uFE68\\n\\nTrack agents built with the Anthropic Python SDK (>=0.32.0).\\n\\n- + [AgentOps integration guide](https://docs.agentops.ai/v1/integrations/anthropic)\\n- + [Official Anthropic documentation](https://docs.anthropic.com/en/docs/welcome)\\n\\n
\\n + \ Installation\\n \\n```bash\\npip install anthropic\\n```\\n\\n```python + python\\nimport anthropic\\nimport agentops\\n\\n# Beginning of program's + code (i.e. main.py, __init__.py)\\nagentops.init()\\n\\nclient + = anthropic.Anthropic(\\n # This is the default and can be omitted\\n api_key=os.environ.get(\\\"ANTHROPIC_API_KEY\\\"),\\n)\\n\\nmessage + = client.messages.create(\\n max_tokens=1024,\\n messages=[\\n + \ {\\n \\\"role\\\": \\\"user\\\",\\n \\\"content\\\": + \\\"Tell me a cool fact about AgentOps\\\",\\n }\\n ],\\n + \ model=\\\"claude-3-opus-20240229\\\",\\n )\\nprint(message.content)\\n\\nagentops.end_session('Success')\\n```\\n\\nStreaming\\n```python + python\\nimport anthropic\\nimport agentops\\n\\n# Beginning of program's + code (i.e. main.py, __init__.py)\\nagentops.init()\\n\\nclient + = anthropic.Anthropic(\\n # This is the default and can be omitted\\n api_key=os.environ.get(\\\"ANTHROPIC_API_KEY\\\"),\\n)\\n\\nstream + = client.messages.create(\\n max_tokens=1024,\\n model=\\\"claude-3-opus-20240229\\\",\\n + \ messages=[\\n {\\n \\\"role\\\": \\\"user\\\",\\n \\\"content\\\": + \\\"Tell me something cool about streaming agents\\\",\\n }\\n ],\\n + \ stream=True,\\n)\\n\\nresponse = \\\"\\\"\\nfor event in stream:\\n if + event.type == \\\"content_block_delta\\\":\\n response += event.delta.text\\n + \ elif event.type == \\\"message_stop\\\":\\n print(\\\"\\\\n\\\")\\n + \ print(response)\\n print(\\\"\\\\n\\\")\\n```\\n\\nAsync\\n\\n```python + python\\nimport asyncio\\nfrom anthropic import AsyncAnthropic\\n\\nclient + = AsyncAnthropic(\\n # This is the default and can be omitted\\n api_key=os.environ.get(\\\"ANTHROPIC_API_KEY\\\"),\\n)\\n\\n\\nasync + def main() -> None:\\n message = await client.messages.create(\\n max_tokens=1024,\\n + \ messages=[\\n {\\n \\\"role\\\": \\\"user\\\",\\n + \ \\\"content\\\": \\\"Tell me something interesting about async + agents\\\",\\n }\\n ],\\n model=\\\"claude-3-opus-20240229\\\",\\n + \ )\\n print(message.content)\\n\\n\\nawait main()\\n```\\n
\\n\\n### + Mistral \u303D\uFE0F\\n\\nTrack agents built with the Anthropic Python SDK + (>=0.32.0).\\n\\n- [AgentOps integration example](./examples/mistral//mistral_example.ipynb)\\n- + [Official Mistral documentation](https://docs.mistral.ai)\\n\\n
\\n + \ Installation\\n \\n```bash\\npip install mistralai\\n```\\n\\nSync\\n\\n```python + python\\nfrom mistralai import Mistral\\nimport agentops\\n\\n# Beginning + of program's code (i.e. main.py, __init__.py)\\nagentops.init()\\n\\nclient = Mistral(\\n # This is the default and can + be omitted\\n api_key=os.environ.get(\\\"MISTRAL_API_KEY\\\"),\\n)\\n\\nmessage + = client.chat.complete(\\n messages=[\\n {\\n \\\"role\\\": + \\\"user\\\",\\n \\\"content\\\": \\\"Tell me a cool fact about + AgentOps\\\",\\n }\\n ],\\n model=\\\"open-mistral-nemo\\\",\\n + \ )\\nprint(message.choices[0].message.content)\\n\\nagentops.end_session('Success')\\n```\\n\\nStreaming\\n\\n```python + python\\nfrom mistralai import Mistral\\nimport agentops\\n\\n# Beginning + of program's code (i.e. main.py, __init__.py)\\nagentops.init()\\n\\nclient = Mistral(\\n # This is the default and can + be omitted\\n api_key=os.environ.get(\\\"MISTRAL_API_KEY\\\"),\\n)\\n\\nmessage + = client.chat.stream(\\n messages=[\\n {\\n \\\"role\\\": + \\\"user\\\",\\n \\\"content\\\": \\\"Tell me something cool + about streaming agents\\\",\\n }\\n ],\\n model=\\\"open-mistral-nemo\\\",\\n + \ )\\n\\nresponse = \\\"\\\"\\nfor event in message:\\n if event.data.choices[0].finish_reason + == \\\"stop\\\":\\n print(\\\"\\\\n\\\")\\n print(response)\\n + \ print(\\\"\\\\n\\\")\\n else:\\n response += event.text\\n\\nagentops.end_session('Success')\\n```\\n\\nAsync\\n\\n```python + python\\nimport asyncio\\nfrom mistralai import Mistral\\n\\nclient = Mistral(\\n + \ # This is the default and can be omitted\\n api_key=os.environ.get(\\\"MISTRAL_API_KEY\\\"),\\n)\\n\\n\\nasync + def main() -> None:\\n message = await client.chat.complete_async(\\n messages=[\\n + \ {\\n \\\"role\\\": \\\"user\\\",\\n \\\"content\\\": + \\\"Tell me something interesting about async agents\\\",\\n }\\n + \ ],\\n model=\\\"open-mistral-nemo\\\",\\n )\\n print(message.choices[0].message.content)\\n\\n\\nawait + main()\\n```\\n\\nAsync Streaming\\n\\n```python python\\nimport asyncio\\nfrom + mistralai import Mistral\\n\\nclient = Mistral(\\n # This is the default + and can be omitted\\n api_key=os.environ.get(\\\"MISTRAL_API_KEY\\\"),\\n)\\n\\n\\nasync + def main() -> None:\\n message = await client.chat.stream_async(\\n messages=[\\n + \ {\\n \\\"role\\\": \\\"user\\\",\\n \\\"content\\\": + \\\"Tell me something interesting about async streaming agents\\\",\\n }\\n + \ ],\\n model=\\\"open-mistral-nemo\\\",\\n )\\n\\n response + = \\\"\\\"\\n async for event in message:\\n if event.data.choices[0].finish_reason + == \\\"stop\\\":\\n print(\\\"\\\\n\\\")\\n print(response)\\n + \ print(\\\"\\\\n\\\")\\n else:\\n response += + event.text\\n\\n\\nawait main()\\n```\\n
\\n\\n\\n\\n### CamelAI + \uFE68\\n\\nTrack agents built with the CamelAI Python SDK (>=0.32.0).\\n\\n- + [CamelAI integration guide](https://docs.camel-ai.org/cookbooks/agents_tracking.html#)\\n- + [Official CamelAI documentation](https://docs.camel-ai.org/index.html)\\n\\n
\\n + \ Installation\\n \\n```bash\\npip install camel-ai[all]\\npip + install agentops\\n```\\n\\n```python python\\n#Import Dependencies\\nimport + agentops\\nimport os\\nfrom getpass import getpass\\nfrom dotenv import load_dotenv\\n\\n#Set + Keys\\nload_dotenv()\\nopenai_api_key = os.getenv(\\\"OPENAI_API_KEY\\\") + or \\\"\\\"\\nagentops_api_key = os.getenv(\\\"AGENTOPS_API_KEY\\\") + or \\\"\\\"\\n\\n\\n\\n```\\n
\\n\\n[You + can find usage examples here!](examples/camelai_examples/README.md).\\n\\n\\n\\n### + LiteLLM \U0001F685\\n\\nAgentOps provides support for LiteLLM(>=1.3.1), allowing + you to call 100+ LLMs using the same Input/Output Format. \\n\\n- [AgentOps + integration example](https://docs.agentops.ai/v1/integrations/litellm)\\n- + [Official LiteLLM documentation](https://docs.litellm.ai/docs/providers)\\n\\n
\\n + \ Installation\\n \\n```bash\\npip install litellm\\n```\\n\\n```python + python\\n# Do not use LiteLLM like this\\n# from litellm import completion\\n# + ...\\n# response = completion(model=\\\"claude-3\\\", messages=messages)\\n\\n# + Use LiteLLM like this\\nimport litellm\\n...\\nresponse = litellm.completion(model=\\\"claude-3\\\", + messages=messages)\\n# or\\nresponse = await litellm.acompletion(model=\\\"claude-3\\\", + messages=messages)\\n```\\n
\\n\\n### LlamaIndex \U0001F999\\n\\n\\nAgentOps + works seamlessly with applications built using LlamaIndex, a framework for + building context-augmented generative AI applications with LLMs.\\n\\n
\\n + \ Installation\\n \\n```shell\\npip install llama-index-instrumentation-agentops\\n```\\n\\nTo + use the handler, import and set\\n\\n```python\\nfrom llama_index.core import + set_global_handler\\n\\n# NOTE: Feel free to set your AgentOps environment + variables (e.g., 'AGENTOPS_API_KEY')\\n# as outlined in the AgentOps documentation, + or pass the equivalent keyword arguments\\n# anticipated by AgentOps' AOClient + as **eval_params in set_global_handler.\\n\\nset_global_handler(\\\"agentops\\\")\\n```\\n\\nCheck + out the [LlamaIndex docs](https://docs.llamaindex.ai/en/stable/module_guides/observability/?h=agentops#agentops) + for more details.\\n\\n
\\n\\n### Llama Stack \U0001F999\U0001F95E\\n\\nAgentOps + provides support for Llama Stack Python Client(>=0.0.53), allowing you to + monitor your Agentic applications. \\n\\n- [AgentOps integration example 1](https://github.com/AgentOps-AI/agentops/pull/530/files/65a5ab4fdcf310326f191d4b870d4f553591e3ea#diff-fdddf65549f3714f8f007ce7dfd1cde720329fe54155d54389dd50fbd81813cb)\\n- + [AgentOps integration example 2](https://github.com/AgentOps-AI/agentops/pull/530/files/65a5ab4fdcf310326f191d4b870d4f553591e3ea#diff-6688ff4fb7ab1ce7b1cc9b8362ca27264a3060c16737fb1d850305787a6e3699)\\n- + [Official Llama Stack Python Client](https://github.com/meta-llama/llama-stack-client-python)\\n\\n### + SwarmZero AI \U0001F41D\\n\\nTrack and analyze SwarmZero agents with full + observability. Set an `AGENTOPS_API_KEY` in your environment and initialize + AgentOps to get started.\\n\\n- [SwarmZero](https://swarmzero.ai) - Advanced + multi-agent framework\\n- [AgentOps integration example](https://docs.agentops.ai/v1/integrations/swarmzero)\\n- + [SwarmZero AI integration example](https://docs.swarmzero.ai/examples/ai-agents/build-and-monitor-a-web-search-agent)\\n- + [SwarmZero AI - AgentOps documentation](https://docs.swarmzero.ai/sdk/observability/agentops)\\n- + [Official SwarmZero Python SDK](https://github.com/swarmzero/swarmzero)\\n\\n
\\n + \ Installation\\n\\n```bash\\npip install swarmzero\\npip + install agentops\\n```\\n\\n```python\\nfrom dotenv import load_dotenv\\nload_dotenv()\\n\\nimport + agentops\\nagentops.init()\\n\\nfrom swarmzero import + Agent, Swarm\\n# ...\\n```\\n
\\n\\n## Time travel debugging \U0001F52E\\n\\n
\\n \\\"Time\\n
\\n\\n
\\n\\n[Try it out!](https://app.agentops.ai/timetravel)\\n\\n## + Agent Arena \U0001F94A\\n\\n(coming soon!)\\n\\n## Evaluations Roadmap \U0001F9ED\\n\\n| + Platform | + Dashboard | Evals |\\n| + ---------------------------------------------------------------------------- + | ------------------------------------------ | -------------------------------------- + |\\n| \u2705 Python SDK | + \u2705 Multi-session and Cross-session metrics | \u2705 Custom eval metrics + \ |\\n| \U0001F6A7 Evaluation builder API | + \u2705 Custom event tag tracking\_ | \U0001F51C Agent scorecards + \ |\\n| \u2705 [Javascript/Typescript SDK](https://github.com/AgentOps-AI/agentops-node) + | \u2705 Session replays | \U0001F51C Evaluation playground + + leaderboard |\\n\\n## Debugging Roadmap \U0001F9ED\\n\\n| Performance testing + \ | Environments | + LLM Testing | Reasoning and execution testing + \ |\\n| ----------------------------------------- | ----------------------------------------------------------------------------------- + | ------------------------------------------- | ------------------------------------------------- + |\\n| \u2705 Event latency analysis | \U0001F51C Non-stationary + environment testing | \U0001F51C + LLM non-deterministic function detection | \U0001F6A7 Infinite loops and recursive + thought detection |\\n| \u2705 Agent workflow execution pricing | \U0001F51C + Multi-modal environments | + \U0001F6A7 Token limit overflow flags | \U0001F51C Faulty reasoning + detection |\\n| \U0001F6A7 Success validators (external) + \ | \U0001F51C Execution containers | + \U0001F51C Context limit overflow flags | \U0001F51C Generative + code validators |\\n| \U0001F51C Agent controllers/skill + tests | \u2705 Honeypot and prompt injection detection ([PromptArmor](https://promptarmor.com)) + | \U0001F51C API bill tracking | \U0001F51C Error breakpoint + analysis |\\n| \U0001F51C Information context constraint + testing | \U0001F51C Anti-agent roadblocks (i.e. Captchas) | + \U0001F51C CI/CD integration checks | |\\n| + \U0001F51C Regression testing | \U0001F51C Multi-agent + framework visualization | | + \ |\\n\\n### Why AgentOps? + \U0001F914\\n\\nWithout the right tools, AI agents are slow, expensive, and + unreliable. Our mission is to bring your agent from prototype to production. + Here's why AgentOps stands out:\\n\\n- **Comprehensive Observability**: Track + your AI agents' performance, user interactions, and API usage.\\n- **Real-Time + Monitoring**: Get instant insights with session replays, metrics, and live + monitoring tools.\\n- **Cost Control**: Monitor and manage your spend on LLM + and API calls.\\n- **Failure Detection**: Quickly identify and respond to + agent failures and multi-agent interaction issues.\\n- **Tool Usage Statistics**: + Understand how your agents utilize external tools with detailed analytics.\\n- + **Session-Wide Metrics**: Gain a holistic view of your agents' sessions with + comprehensive statistics.\\n\\nAgentOps is designed to make agent observability, + testing, and monitoring easy.\\n\\n\\n## Star History\\n\\nCheck out our growth + in the community:\\n\\n\\\"Logo\\\"\\n\\n## + Popular projects using AgentOps\\n\\n\\n| Repository | Stars |\\n| :-------- + \ | -----: |\\n|\\\"\\\"   [geekan](https://github.com/geekan) + / [MetaGPT](https://github.com/geekan/MetaGPT) | 42787 |\\n|\\\"\\\"   [run-llama](https://github.com/run-llama) + / [llama_index](https://github.com/run-llama/llama_index) | 34446 |\\n|\\\"\\\"   [crewAIInc](https://github.com/crewAIInc) + / [crewAI](https://github.com/crewAIInc/crewAI) | 18287 |\\n|\\\"\\\"   [camel-ai](https://github.com/camel-ai) + / [camel](https://github.com/camel-ai/camel) | 5166 |\\n|\\\"\\\"   [superagent-ai](https://github.com/superagent-ai) + / [superagent](https://github.com/superagent-ai/superagent) | 5050 |\\n|\\\"\\\"   [iyaja](https://github.com/iyaja) + / [llama-fs](https://github.com/iyaja/llama-fs) | 4713 |\\n|\\\"\\\"   [BasedHardware](https://github.com/BasedHardware) + / [Omi](https://github.com/BasedHardware/Omi) | 2723 |\\n|\\\"\\\"   [MervinPraison](https://github.com/MervinPraison) + / [PraisonAI](https://github.com/MervinPraison/PraisonAI) | 2007 |\\n|\\\"\\\"   [AgentOps-AI](https://github.com/AgentOps-AI) + / [Jaiqu](https://github.com/AgentOps-AI/Jaiqu) | 272 |\\n|\\\"\\\"   [swarmzero](https://github.com/swarmzero) + / [swarmzero](https://github.com/swarmzero/swarmzero) | 195 |\\n|\\\"\\\"   [strnad](https://github.com/strnad) + / [CrewAI-Studio](https://github.com/strnad/CrewAI-Studio) | 134 |\\n|\\\"\\\"   [alejandro-ao](https://github.com/alejandro-ao) + / [exa-crewai](https://github.com/alejandro-ao/exa-crewai) | 55 |\\n|\\\"\\\"   [tonykipkemboi](https://github.com/tonykipkemboi) + / [youtube_yapper_trapper](https://github.com/tonykipkemboi/youtube_yapper_trapper) + | 47 |\\n|\\\"\\\"   [sethcoast](https://github.com/sethcoast) + / [cover-letter-builder](https://github.com/sethcoast/cover-letter-builder) + | 27 |\\n|\\\"\\\"   [bhancockio](https://github.com/bhancockio) + / [chatgpt4o-analysis](https://github.com/bhancockio/chatgpt4o-analysis) | + 19 |\\n|\\\"\\\"   [breakstring](https://github.com/breakstring) + / [Agentic_Story_Book_Workflow](https://github.com/breakstring/Agentic_Story_Book_Workflow) + | 14 |\\n|\\\"\\\"   [MULTI-ON](https://github.com/MULTI-ON) + / [multion-python](https://github.com/MULTI-ON/multion-python) | 13 |\\n\\n\\n_Generated + using [github-dependents-info](https://github.com/nvuillam/github-dependents-info), + by [Nicolas Vuillamy](https://github.com/nvuillam)_\\n\",\"description_content_type\":\"text/markdown\",\"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.3.26/\",\"requires_dist\":[\"opentelemetry-api==1.22.0; + python_version < \\\"3.10\\\"\",\"opentelemetry-api>=1.27.0; python_version + >= \\\"3.10\\\"\",\"opentelemetry-exporter-otlp-proto-http==1.22.0; python_version + < \\\"3.10\\\"\",\"opentelemetry-exporter-otlp-proto-http>=1.27.0; python_version + >= \\\"3.10\\\"\",\"opentelemetry-sdk==1.22.0; python_version < \\\"3.10\\\"\",\"opentelemetry-sdk>=1.27.0; + python_version >= \\\"3.10\\\"\",\"packaging<25.0,>=21.0\",\"psutil<6.1.0,>=5.9.8\",\"pyyaml<7.0,>=5.3\",\"requests<3.0.0,>=2.0.0\",\"termcolor<2.5.0,>=2.3.0\"],\"requires_python\":\"<3.14,>=3.9\",\"summary\":\"Observability + and DevTool Platform for AI Agents\",\"version\":\"0.3.26\",\"yanked\":false,\"yanked_reason\":null},\"last_serial\":27123795,\"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}]},\"urls\":[{\"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}],\"vulnerabilities\":[]}\n" + headers: + Accept-Ranges: + - bytes + Connection: + - keep-alive + Content-Length: + - '33610' + Date: + - Fri, 21 Feb 2025 23:21:04 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, 8895, 1 + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + X-Permitted-Cross-Domain-Policies: + - none + X-Served-By: + - cache-iad-kjyo7100032-IAD, cache-iad-kjyo7100044-IAD, cache-sjc1000085-SJC + X-Timer: + - S1740180065.523459,VS0,VE1 + 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-encoding: + - gzip + 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://*.google-analytics.com https://*.analytics.google.com + https://*.googletagmanager.com 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/ https://*.google-analytics.com + https://*.googletagmanager.com *.fastly-insights.com *.ethicalads.io ethicalads.blob.core.windows.net; + script-src 'self' https://*.googletagmanager.com https://www.google-analytics.com + https://ssl.google-analytics.com *.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: + - '"5Jjf0qcbSYoU2b9dDGH/Nw"' + referrer-policy: + - origin-when-cross-origin + x-pypi-last-serial: + - '27123795' + status: + code: 200 + message: OK +- request: + body: !!binary | + CvUJCiQKIgoMc2VydmljZS5uYW1lEhIKEGNyZXdBSS10ZWxlbWV0cnkSzAkKEgoQY3Jld2FpLnRl + bGVtZXRyeRKkBwoQu0KzdCRGEO7eeOMa1vixvxIIurHV3nw68i0qDENyZXcgQ3JlYXRlZDABOYiV + kDmMXCYYQWgLmjmMXCYYShsKDmNyZXdhaV92ZXJzaW9uEgkKBzAuMTAyLjBKGgoOcHl0aG9uX3Zl + cnNpb24SCAoGMy4xMi44Si4KCGNyZXdfa2V5EiIKIGU1ODA3MDFkNTJlYjY1YWZmMjRlZWZlNzhj + NzQ2MjhjSjEKB2NyZXdfaWQSJgokNzE2YjA3ZDYtMjIxOS00YjE1LWJhZWYtMTQ3NTU2YTk0ZjI0 + ShwKDGNyZXdfcHJvY2VzcxIMCgpzZXF1ZW50aWFsShEKC2NyZXdfbWVtb3J5EgIQAEoaChRjcmV3 + X251bWJlcl9vZl90YXNrcxICGAFKGwoVY3Jld19udW1iZXJfb2ZfYWdlbnRzEgIYAUrRAgoLY3Jl + d19hZ2VudHMSwQIKvgJbeyJrZXkiOiAiYWQxNTMxNjFjNWM1YTg1NmFhMGQwNmIyNDljNGM2NGEi + LCAiaWQiOiAiMTdjZjFjNjctZjhhZC00MzM2LWFjN2UtYzQ1MDBiNWVjMmE2IiwgInJvbGUiOiAi + YmFzZV9hZ2VudCIsICJ2ZXJib3NlPyI6IGZhbHNlLCAibWF4X2l0ZXIiOiAyNSwgIm1heF9ycG0i + OiBudWxsLCAiZnVuY3Rpb25fY2FsbGluZ19sbG0iOiAiIiwgImxsbSI6ICJncHQtNG8tbWluaSIs + ICJkZWxlZ2F0aW9uX2VuYWJsZWQ/IjogZmFsc2UsICJhbGxvd19jb2RlX2V4ZWN1dGlvbj8iOiBm + YWxzZSwgIm1heF9yZXRyeV9saW1pdCI6IDIsICJ0b29sc19uYW1lcyI6IFtdfV1K/wEKCmNyZXdf + dGFza3MS8AEK7QFbeyJrZXkiOiAiMWIxNWVmMjM5MTViMjc1NWU4OWEwZWMzYjI2YTEzZDIiLCAi + aWQiOiAiNjQxOTE4NDMtMjkyZS00MDBjLWI5OTktMWJjOTgzMGYxMDY0IiwgImFzeW5jX2V4ZWN1 + dGlvbj8iOiBmYWxzZSwgImh1bWFuX2lucHV0PyI6IGZhbHNlLCAiYWdlbnRfcm9sZSI6ICJiYXNl + X2FnZW50IiwgImFnZW50X2tleSI6ICJhZDE1MzE2MWM1YzVhODU2YWEwZDA2YjI0OWM0YzY0YSIs + ICJ0b29sc19uYW1lcyI6IFtdfV16AhgBhQEAAQAAEo4CChD9Gbohxvo1xEZoAFWQyhIWEghHveai + JhMNsioMVGFzayBDcmVhdGVkMAE5sPeve4xcJhhBaHqxe4xcJhhKLgoIY3Jld19rZXkSIgogZTU4 + MDcwMWQ1MmViNjVhZmYyNGVlZmU3OGM3NDYyOGNKMQoHY3Jld19pZBImCiQ3MTZiMDdkNi0yMjE5 + LTRiMTUtYmFlZi0xNDc1NTZhOTRmMjRKLgoIdGFza19rZXkSIgogMWIxNWVmMjM5MTViMjc1NWU4 + OWEwZWMzYjI2YTEzZDJKMQoHdGFza19pZBImCiQ2NDE5MTg0My0yOTJlLTQwMGMtYjk5OS0xYmM5 + ODMwZjEwNjR6AhgBhQEAAQAA + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '1272' Content-Type: - application/x-protobuf User-Agent: @@ -220,36 +1176,22 @@ interactions: Content-Type: - application/x-protobuf Date: - - Tue, 04 Feb 2025 20:24:47 GMT + - Fri, 21 Feb 2025 23:21:07 GMT status: code: 200 message: OK - request: - body: '{"messages": [{"role": "user", "content": "Assess the quality of the task - completed based on the description, expected output, and actual results.\n\nTask - Description:\nJust say hi\n\nExpected Output:\nhi\n\nActual Output:\nhi\n\nPlease - provide:\n- Bullet points suggestions to improve future similar tasks\n- A score - from 0 to 10 evaluating on completion, quality, and overall performance- Entities - extracted from the task output, if any, their type, description, and relationships"}], - "model": "gpt-4o-mini", "tool_choice": {"type": "function", "function": {"name": - "TaskEvaluation"}}, "tools": [{"type": "function", "function": {"name": "TaskEvaluation", - "description": "Correctly extracted `TaskEvaluation` with all the required parameters - with correct types", "parameters": {"$defs": {"Entity": {"properties": {"name": - {"description": "The name of the entity.", "title": "Name", "type": "string"}, - "type": {"description": "The type of the entity.", "title": "Type", "type": - "string"}, "description": {"description": "Description of the entity.", "title": - "Description", "type": "string"}, "relationships": {"description": "Relationships - of the entity.", "items": {"type": "string"}, "title": "Relationships", "type": - "array"}}, "required": ["name", "type", "description", "relationships"], "title": - "Entity", "type": "object"}}, "properties": {"suggestions": {"description": - "Suggestions to improve future similar tasks.", "items": {"type": "string"}, - "title": "Suggestions", "type": "array"}, "quality": {"description": "A score - from 0 to 10 evaluating on completion, quality, and overall performance, all - taking into account the task description, expected output, and the result of - the task.", "title": "Quality", "type": "number"}, "entities": {"description": - "Entities extracted from the task output.", "items": {"$ref": "#/$defs/Entity"}, - "title": "Entities", "type": "array"}}, "required": ["entities", "quality", - "suggestions"], "type": "object"}}}]}' + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + a helpful assistant that just says hi\nYour personal goal is: Just say hi\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: Just say hi\n\nThis is the expected criteria for + your final answer: hi\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: accept: - application/json @@ -258,12 +1200,9 @@ interactions: connection: - keep-alive content-length: - - '1962' + - '838' content-type: - application/json - cookie: - - __cf_bm=nedOdWE1YnKQYt1kSbrcA.zhwa3bZDzmZqTOjZYER0c-1738700521-1.0.1.1-xQk9iXOvqvyXNhkIOgc8Ws2WYcT1mJFkDCvCC8xA5joFD8QfNrBIAr_Qs6sIxt2EzXyeFwBA6gA8ZgWApCHx0Q; - _cfuvid=Cl48aI8.jSRja0Pqr6Jrh3mAnigd4rDn6lhGicyjMPY-1738698987673-0.0.1.1-604800000 host: - api.openai.com user-agent: @@ -289,29 +1228,20 @@ interactions: method: POST uri: https://api.openai.com/v1/chat/completions response: - content: "{\n \"id\": \"chatcmpl-AxJlLVC3gCB9gRI0ZSkoPCZY7EwpQ\",\n \"object\": - \"chat.completion\",\n \"created\": 1738700683,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n + content: "{\n \"id\": \"chatcmpl-B3WcOTAw4n8RGgETMgyOwuM7LeDwl\",\n \"object\": + \"chat.completion\",\n \"created\": 1740180068,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n \ \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": - \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n - \ \"id\": \"call_mgwImOITW8lkjzAyf9Pp76cL\",\n \"type\": - \"function\",\n \"function\": {\n \"name\": \"TaskEvaluation\",\n - \ \"arguments\": \"{\\\"suggestions\\\":[\\\"Provide context or - additional information to make tasks more engaging.\\\",\\\"Encourage variations - in responses to make the interaction more dynamic.\\\"],\\\"quality\\\":10,\\\"entities\\\":[{\\\"name\\\":\\\"hi\\\",\\\"type\\\":\\\"greeting\\\",\\\"description\\\":\\\"A - common word used to initiate a conversation or express friendliness.\\\",\\\"relationships\\\":[\\\"initiates - conversation\\\",\\\"expresses friendliness\\\"]}]}\"\n }\n }\n - \ ],\n \"refusal\": null\n },\n \"logprobs\": null,\n + \"assistant\",\n \"content\": \"I now can give a great answer \\nFinal + Answer: hi\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": - 273,\n \"completion_tokens\": 71,\n \"total_tokens\": 344,\n \"prompt_tokens_details\": + 161,\n \"completion_tokens\": 12,\n \"total_tokens\": 173,\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_bd83329f63\"\n}\n" + \"default\",\n \"system_fingerprint\": \"fp_7fcd609668\"\n}\n" headers: - CF-Cache-Status: - - DYNAMIC CF-RAY: - - 90cd62c4ba41fa6a-SJC + - 915a787b998d7ae0-SJC Connection: - keep-alive Content-Encoding: @@ -319,9 +1249,15 @@ interactions: Content-Type: - application/json Date: - - Tue, 04 Feb 2025 20:24:50 GMT + - Fri, 21 Feb 2025 23:21:09 GMT Server: - cloudflare + Set-Cookie: + - __cf_bm=0H21Wn0CeGjOmoBvLGq5vA5PWqB4cl6amZ0kGCbr1GQ-1740180069-1.0.1.1-EyrBFAql8hm1Qvm_pxKvb44bkrYkLBzoqxYSaawboicVQfkfquQPEhqVhNXSh15L8Aiqn.WLHKOnSii45FMlXA; + path=/; expires=Fri, 21-Feb-25 23:51:09 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=pgWR9g.y6i.3_EHHkfdBfvv5isYFU_joRq3kXvX2IE4-1740180069173-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None Transfer-Encoding: - chunked X-Content-Type-Options: @@ -330,10 +1266,12 @@ interactions: - X-Request-ID alt-svc: - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC openai-organization: - crewai-iuxna1 openai-processing-ms: - - '7347' + - '470' openai-version: - '2020-10-01' strict-transport-security: @@ -345,13 +1283,257 @@ interactions: x-ratelimit-remaining-requests: - '29999' x-ratelimit-remaining-tokens: - - '149999876' + - '149999808' x-ratelimit-reset-requests: - 2ms x-ratelimit-reset-tokens: - 0s x-request-id: - - req_aec28dd3fe998d628754e8429623bf9e + - req_fae46f9af88047f2e43f54ce7f6cf3af http_version: HTTP/1.1 status_code: 200 +- request: + body: '{"events": [{"id": "a5f1e046-b0e5-41d1-b5bc-3715c2c7874f", "event_type": + "llms", "init_timestamp": "2025-02-21T23:21:04.468272+00:00", "end_timestamp": + "2025-02-21T23:21:09.342708+00:00", "params": {"model": "gpt-4o-mini", "messages": + [{"role": "system", "content": "You are base_agent. You are a helpful assistant + that just says hi\nYour personal goal is: Just say hi\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: Just say hi\n\nThis is the expected criteria for your final answer: hi\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:"}], "stop": ["\nObservation:"], + "stream": false}, "returns": "", "agent_id": null, "session_id": "73534e48-dd5a-4ef4-a702-fbbba9d00f27", + "thread_id": null, "prompt": [{"role": "system", "content": "You are base_agent. + You are a helpful assistant that just says hi\nYour personal goal is: Just say + hi\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: Just say hi\n\nThis is the expected criteria + for your final answer: hi\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:"}], + "prompt_tokens": 161, "completion": {"content": "I now can give a great answer \nFinal + Answer: hi", "role": "assistant", "tool_calls": null, "function_call": null, + "refusal": null}, "completion_tokens": 12, "cost": null, "model": "gpt-4o-mini-2024-07-18"}]}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '2203' + Content-Type: + - application/json; charset=UTF-8 + Keep-Alive: + - timeout=10, max=1000 + User-Agent: + - python-requests/2.32.3 + X-Agentops-Api-Key: + - e6568f10-56cf-4e37-9415-86e979a7f309 + method: POST + uri: https://api.agentops.ai/v2/create_events + response: + body: + string: '"Success"' + headers: + Content-Length: + - '9' + Content-Type: + - application/json + Date: + - Fri, 21 Feb 2025 23:21:09 GMT + Server: + - railway-edge + X-Railway-Request-Id: + - bIWFwVQkTF6rf7HxjcZWsA_603909319 + status: + code: 200 + message: OK +- request: + body: '{"session": {"end_timestamp": "2025-02-21T23:21:09.676222+00:00", "end_state": + "Success", "session_id": "73534e48-dd5a-4ef4-a702-fbbba9d00f27", "init_timestamp": + "2025-02-21T23:21:03.681822+00:00", "tags": ["crewai"], "video": null, "end_state_reason": + "Finished Execution", "host_env": {"SDK": {"AgentOps SDK Version": "0.3.26", + "Python Version": "3.12.8", "System Packages": {"pluggy": "1.5.0", "importlib.resources": + "6.4.5", "importlib.metadata": "8.4.0", "iniconfig": "2.0.0", "pytest": "8.3.3", + "pytest_asyncio": "0.24.0", "wrapt": "1.16.0", "urllib3": "2.2.3", "charset_normalizer": + "3.4.0", "idna": "3.10", "certifi": "2024.8.30", "requests": "2.32.3", "multidict": + "6.1.0", "propcache": "0.2.0", "yarl": "1.18.3", "aiohappyeyeballs": "2.4.3", + "frozenlist": "1.5.0", "aiosignal": "1.3.1", "aiohttp": "3.11.11", "sniffio": + "1.3.1", "anyio": "4.6.2.post1", "h11": "0.14.0", "h2": "4.2.0", "hpack": "4.1.0", + "hyperframe": "6.1.0", "httpcore": "1.0.6", "click": "8.1.8", "pygments": "2.18.0", + "rich": "13.9.3", "httpx": "0.27.0", "pytest_vcr": "1.0.2", "pytest_subprocess": + "1.5.2", "typing_extensions": "4.12.2", "pydantic": "2.10.4", "annotated_types": + "0.7.0", "pydantic_core": "2.27.2", "json_repair": "0.30.0", "overrides": "7.7.0", + "numpy": "1.26.4", "tenacity": "9.0.0", "onnxruntime": "1.19.2", "tokenizers": + "0.20.1", "tqdm": "4.66.5", "deprecated": "1.2.14", "zipp": "3.20.2", "importlib_metadata": + "8.4.0", "opentelemetry.sdk": "1.27.0", "psutil": "6.0.0", "opentelemetry.exporter.otlp.proto.grpc": + "1.27.0", "opentelemetry.exporter.otlp.proto.common": "1.27.0", "opentelemetry.proto": + "1.27.0", "chromadb": "0.5.23", "crewai.tools": "0.33.0", "appdirs": "1.4.4", + "blinker": "1.9.0", "opentelemetry.exporter.otlp.proto.http": "1.27.0", "termcolor": + "2.4.0", "packaging": "23.2", "langchain_core": "0.3.36", "langsmith": "0.1.147", + "requests_toolbelt": "1.0.0", "orjson": "3.10.10", "jsonpointer": "3.0.0", "jsonpatch": + "1.33", "agentops": "0.3.26", "distro": "1.9.0", "jiter": "0.5.0", "openai": + "1.61.0", "regex": "2024.9.11", "tiktoken": "0.7.0", "markupsafe": "3.0.2", + "jinja2": "3.1.4", "litellm": "1.60.2", "json5": "0.10.0", "jsonpickle": "3.3.0", + "networkx": "3.4.2", "traitlets": "5.14.3", "executing": "2.1.0", "six": "1.16.0", + "asttokens": "2.4.1", "pure_eval": "0.2.3", "stack_data": "0.6.3", "decorator": + "5.1.1", "wcwidth": "0.2.13", "prompt_toolkit": "3.0.48", "parso": "0.8.4", + "colorama": "0.4.6", "jedi": "0.19.1", "IPython": "8.28.0", "pyvis": "0.3.2", + "crewai": "0.102.0"}}, "OS": {"Hostname": "Lorenzes-MacBook-Pro.local", "OS": + "Darwin", "OS Version": "Darwin Kernel Version 24.0.0: Mon Aug 12 20:51:54 PDT + 2024; root:xnu-11215.1.10~2/RELEASE_ARM64_T6000", "OS Release": "24.0.0"}, "CPU": + {"Physical cores": 10, "Total cores": 10, "CPU Usage": "21.8%"}, "RAM": {"Total": + "32.00 GB", "Available": "9.89 GB", "Used": "12.38 GB", "Percentage": "69.1%"}, + "Disk": {"/dev/disk3s1s1": {"Mountpoint": "/", "Total": "926.35 GB", "Used": + "9.94 GB", "Free": "2.64 GB", "Percentage": "79.0%"}, "/dev/disk3s6": {"Mountpoint": + "/System/Volumes/VM", "Total": "926.35 GB", "Used": "1.00 GB", "Free": "2.64 + GB", "Percentage": "27.5%"}, "/dev/disk3s2": {"Mountpoint": "/System/Volumes/Preboot", + "Total": "926.35 GB", "Used": "6.75 GB", "Free": "2.64 GB", "Percentage": "71.9%"}, + "/dev/disk3s4": {"Mountpoint": "/System/Volumes/Update", "Total": "926.35 GB", + "Used": "0.00 GB", "Free": "2.64 GB", "Percentage": "0.1%"}, "/dev/disk1s2": + {"Mountpoint": "/System/Volumes/xarts", "Total": "0.49 GB", "Used": "0.01 GB", + "Free": "0.47 GB", "Percentage": "1.2%"}, "/dev/disk1s1": {"Mountpoint": "/System/Volumes/iSCPreboot", + "Total": "0.49 GB", "Used": "0.01 GB", "Free": "0.47 GB", "Percentage": "1.1%"}, + "/dev/disk1s3": {"Mountpoint": "/System/Volumes/Hardware", "Total": "0.49 GB", + "Used": "0.00 GB", "Free": "0.47 GB", "Percentage": "0.8%"}, "/dev/disk3s5": + {"Mountpoint": "/System/Volumes/Data", "Total": "926.35 GB", "Used": "904.02 + GB", "Free": "2.64 GB", "Percentage": "99.7%"}, "/dev/disk5s1": {"Mountpoint": + "/Library/Developer/CoreSimulator/Volumes/iOS_21A342", "Total": "15.95 GB", + "Used": "15.45 GB", "Free": "0.46 GB", "Percentage": "97.1%"}}, "Installed Packages": + {"Installed Packages": {"flatbuffers": "24.3.25", "google-api-core": "2.24.1", + "shellingham": "1.5.4", "mkdocs": "1.6.1", "mergedeep": "1.3.4", "opencv-python-headless": + "4.11.0.86", "pyright": "1.1.393", "shapely": "2.0.7", "tomli": "2.0.2", "ruff": + "0.8.2", "coloredlogs": "15.0.1", "Rtree": "1.3.0", "pytest-asyncio": "0.24.0", + "humanfriendly": "10.0", "executing": "2.1.0", "uv": "0.4.26", "pexpect": "4.9.0", + "pandas": "2.2.3", "pyyaml_env_tag": "0.1", "lazy_loader": "0.4", "PyJWT": "2.9.0", + "decorator": "5.1.1", "filelock": "3.16.1", "idna": "3.10", "embedchain": "0.1.126", + "traitlets": "5.14.3", "ipython": "8.28.0", "tomli_w": "1.1.0", "opentelemetry-exporter-otlp-proto-http": + "1.27.0", "pyasn1_modules": "0.4.1", "Markdown": "3.7", "distlib": "0.3.9", + "pyvis": "0.3.2", "termcolor": "2.4.0", "watchdog": "5.0.3", "tifffile": "2025.2.18", + "multidict": "6.1.0", "ptyprocess": "0.7.0", "langchain": "0.3.19", "aiosignal": + "1.3.1", "cssselect2": "0.7.0", "griffe": "1.5.1", "grpc-google-iam-v1": "0.14.0", + "zipp": "3.20.2", "mkdocs-get-deps": "0.2.0", "importlib_resources": "6.4.5", + "litellm": "1.60.2", "google-auth": "2.35.0", "Mako": "1.3.9", "mkdocs-material-extensions": + "1.3.1", "latex2mathml": "3.77.0", "urllib3": "2.2.3", "overrides": "7.7.0", + "parso": "0.8.4", "pytest": "8.3.3", "webencodings": "0.5.1", "colorama": "0.4.6", + "orjson": "3.10.10", "langchain-community": "0.3.17", "lancedb": "0.18.0", "langchain-openai": + "0.2.14", "google-cloud-resource-manager": "1.14.0", "rich": "13.9.3", "schema": + "0.7.7", "propcache": "0.2.0", "python-docx": "1.1.2", "defusedxml": "0.7.1", + "referencing": "0.35.1", "paginate": "0.5.7", "semchunk": "2.2.2", "requests": + "2.32.3", "frozenlist": "1.5.0", "multiprocess": "0.70.17", "openpyxl": "3.1.5", + "Jinja2": "3.1.4", "httpx-sse": "0.4.0", "cryptography": "43.0.3", "transformers": + "4.49.0", "docling": "2.24.0", "websockets": "13.1", "chromadb": "0.5.23", "blinker": + "1.9.0", "soupsieve": "2.6", "ninja": "1.11.1.3", "tqdm": "4.66.5", "qdrant-client": + "1.13.2", "markdown-it-py": "3.0.0", "sympy": "1.13.3", "six": "1.16.0", "mypy-extensions": + "1.0.0", "posthog": "3.7.0", "h11": "0.14.0", "googleapis-common-protos": "1.65.0", + "fsspec": "2024.10.0", "networkx": "3.4.2", "grpcio": "1.67.0", "python-pptx": + "1.0.2", "marko": "2.1.2", "et_xmlfile": "2.0.0", "typing-inspect": "0.9.0", + "protobuf": "4.25.5", "ghp-import": "2.1.0", "grpcio-status": "1.70.0", "auth0-python": + "4.7.2", "pymdown-extensions": "10.11.2", "iniconfig": "2.0.0", "beautifulsoup4": + "4.13.3", "SQLAlchemy": "2.0.38", "crewai-tools": "0.33.0", "google-resumable-media": + "2.7.2", "grpcio-tools": "1.70.0", "uvicorn": "0.32.0", "chroma-hnswlib": "0.7.6", + "jsonpatch": "1.33", "click": "8.1.8", "jsonpointer": "3.0.0", "lxml": "5.3.1", + "numpy": "1.26.4", "docstring_parser": "0.16", "attrs": "24.2.0", "mkdocstrings-python": + "1.12.2", "crewai": "0.102.0", "cairocffi": "1.7.1", "packaging": "23.2", "kubernetes": + "31.0.0", "appdirs": "1.4.4", "certifi": "2024.8.30", "h2": "4.2.0", "starlette": + "0.41.0", "tenacity": "9.0.0", "cffi": "1.17.1", "pytest-vcr": "1.0.2", "aiohttp": + "3.11.11", "jsonschema": "4.23.0", "google-crc32c": "1.6.0", "pdfminer.six": + "20231228", "mypy": "1.13.0", "opentelemetry-exporter-otlp-proto-common": "1.27.0", + "pyasn1": "0.6.1", "stack-data": "0.6.3", "asttokens": "2.4.1", "cachetools": + "5.5.0", "portalocker": "2.10.1", "asgiref": "3.8.1", "pypdfium2": "4.30.0", + "typer": "0.12.5", "dataclasses-json": "0.6.7", "pathspec": "0.12.1", "oauthlib": + "3.2.2", "identify": "2.6.1", "psutil": "6.0.0", "docling-core": "2.20.0", "mpire": + "2.10.2", "pylance": "0.22.0", "jedi": "0.19.1", "alembic": "1.14.1", "python-dotenv": + "1.0.1", "mkdocs-material": "9.5.42", "aiohappyeyeballs": "2.4.3", "opentelemetry-instrumentation": + "0.48b0", "loguru": "0.7.3", "docling-parse": "3.4.0", "langchain-text-splitters": + "0.3.6", "watchfiles": "0.24.0", "bcrypt": "4.2.0", "sniffio": "1.3.1", "nodeenv": + "1.9.1", "docling-ibm-models": "3.4.0", "jsonpickle": "3.3.0", "safetensors": + "0.5.2", "google-cloud-storage": "2.19.0", "jsonschema-specifications": "2024.10.1", + "mdurl": "0.1.2", "fastavro": "1.10.0", "cfgv": "3.4.0", "python-dateutil": + "2.9.0.post0", "mpmath": "1.3.0", "json_repair": "0.30.0", "build": "1.2.2.post1", + "types-requests": "2.32.0.20241016", "pytz": "2024.2", "huggingface-hub": "0.26.1", + "yarl": "1.18.3", "jsonref": "1.1.0", "rsa": "4.9", "wcwidth": "0.2.13", "google-cloud-aiplatform": + "1.81.0", "torch": "2.6.0", "langchain-cohere": "0.3.5", "langchain-experimental": + "0.3.4", "scipy": "1.15.2", "json5": "0.10.0", "opentelemetry-sdk": "1.27.0", + "opentelemetry-util-http": "0.48b0", "tzdata": "2025.1", "babel": "2.16.0", + "langchain-core": "0.3.36", "virtualenv": "20.27.0", "importlib_metadata": "8.4.0", + "easyocr": "1.7.2", "pydantic_core": "2.27.2", "cohere": "5.13.12", "prompt_toolkit": + "3.0.48", "pycparser": "2.22", "proto-plus": "1.26.0", "pydantic": "2.10.4", + "pluggy": "1.5.0", "torchvision": "0.21.0", "pypdf": "5.3.0", "py_rust_stemmers": + "0.1.3", "tiktoken": "0.7.0", "opentelemetry-instrumentation-fastapi": "0.48b0", + "agentops": "0.3.26", "setuptools": "75.2.0", "google-cloud-core": "2.4.1", + "imageio": "2.37.0", "pure_eval": "0.2.3", "pdfplumber": "0.11.4", "deprecation": + "2.1.0", "distro": "1.9.0", "fastembed": "0.5.1", "pillow": "10.4.0", "pydantic-settings": + "2.7.1", "requests-toolbelt": "1.0.0", "mem0ai": "0.1.52", "docker": "7.1.0", + "httptools": "0.6.4", "mkdocs-autorefs": "1.2.0", "httpx": "0.27.0", "typing_extensions": + "4.12.2", "jiter": "0.5.0", "PyYAML": "6.0.2", "matplotlib-inline": "0.1.7", + "weaviate-client": "3.26.7", "tokenizers": "0.20.1", "opentelemetry-exporter-otlp-proto-grpc": + "1.27.0", "rpds-py": "0.20.0", "monotonic": "1.6", "charset-normalizer": "3.4.0", + "backoff": "2.2.1", "pytube": "15.0.0", "Deprecated": "1.2.14", "regex": "2024.9.11", + "onnxruntime": "1.19.2", "hpack": "4.1.0", "tinycss2": "1.3.0", "instructor": + "1.6.3", "filetype": "1.2.0", "opentelemetry-instrumentation-asgi": "0.48b0", + "Authlib": "1.4.1", "google-cloud-bigquery": "3.29.0", "pyproject_hooks": "1.2.0", + "opentelemetry-api": "1.27.0", "pyclipper": "1.3.0.post6", "vcrpy": "5.1.0", + "pre_commit": "4.0.1", "uvloop": "0.21.0", "platformdirs": "4.3.6", "openai": + "1.61.0", "marshmallow": "3.26.1", "annotated-types": "0.7.0", "mkdocstrings": + "0.26.2", "opentelemetry-proto": "1.27.0", "anyio": "4.6.2.post1", "opentelemetry-semantic-conventions": + "0.48b0", "grpcio-health-checking": "1.67.0", "PyPika": "0.48.9", "gptcache": + "0.1.44", "pysbd": "0.3.4", "scikit-image": "0.25.2", "httpcore": "1.0.6", "Pygments": + "2.18.0", "XlsxWriter": "3.2.2", "hyperframe": "6.1.0", "langsmith": "0.1.147", + "requests-oauthlib": "2.0.0", "durationpy": "0.9", "validators": "0.34.0", "CairoSVG": + "2.7.1", "fastapi": "0.115.3", "jsonlines": "3.1.0", "tabulate": "0.9.0", "pyarrow": + "19.0.0", "python-bidi": "0.6.6", "dill": "0.3.9", "pytest-subprocess": "1.5.2", + "wrapt": "1.16.0", "mmh3": "4.1.0", "websocket-client": "1.8.0", "MarkupSafe": + "3.0.2"}}, "Project Working Directory": {"Project Working Directory": "/Users/lorenzejay/Documents/Uplift + Digital Solutions/clients/crewai-org/crewAI"}, "Virtual Environment": {"Virtual + Environment": "/Users/lorenzejay/Documents/Uplift Digital Solutions/clients/crewai-org/crewAI/.venv"}}, + "config": "", "jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZXNzaW9uX2lkIjoiNzM1MzRlNDgtZGQ1YS00ZWY0LWE3MDItZmJiYmE5ZDAwZjI3IiwiZXhwIjoxNzQwMjY2NDY0LjE3MDgwN30.gkiHROHd6xvHJ5IK83zGZQqIezGFCMsKbmGUer3QdrM", + "_lock": "", "_end_session_lock": "", "token_cost": "", "_session_url": "", + "event_counts": {"llms": 1, "tools": 0, "actions": 0, "errors": 0, "apis": 0}, + "is_running": false, "_tracer_provider": "", "_otel_tracer": "", "_otel_exporter": + ""}}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '11938' + Content-Type: + - application/json; charset=UTF-8 + Keep-Alive: + - timeout=10, max=1000 + User-Agent: + - python-requests/2.32.3 + X-Agentops-Api-Key: + - e6568f10-56cf-4e37-9415-86e979a7f309 + method: POST + uri: https://api.agentops.ai/v2/update_session + response: + body: + string: '{"session_url":"https://app.agentops.ai/drilldown?session_id=73534e48-dd5a-4ef4-a702-fbbba9d00f27","status":"success","token_cost":3.135e-05}' + headers: + Content-Length: + - '141' + Content-Type: + - application/json + Date: + - Fri, 21 Feb 2025 23:21:09 GMT + Server: + - railway-edge + X-Railway-Request-Id: + - IPxx0Dd2SjClZseCNNXQkQ_1861343781 + status: + code: 200 + message: OK version: 1 diff --git a/tests/utilities/cassettes/test_crew_emits_test_kickoff_type_event.yaml b/tests/utilities/cassettes/test_crew_emits_test_kickoff_type_event.yaml new file mode 100644 index 000000000..5905cf66c --- /dev/null +++ b/tests/utilities/cassettes/test_crew_emits_test_kickoff_type_event.yaml @@ -0,0 +1,236 @@ +interactions: +- request: + body: '{"messages": [{"role": "system", "content": "You are base_agent. You are + a helpful assistant that just says hi\nYour personal goal is: Just say hi\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: Just say hi\n\nThis is the expected criteria for + your final answer: hi\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: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '838' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B4VsaBZ4ec4b0ab4pkqWgyxTFVVfc\",\n \"object\": + \"chat.completion\",\n \"created\": 1740415556,\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: hi\",\n \"refusal\": null\n },\n \"logprobs\": null,\n + \ \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": + 161,\n \"completion_tokens\": 12,\n \"total_tokens\": 173,\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_7fcd609668\"\n}\n" + headers: + CF-RAY: + - 9170edc5da6f230e-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Mon, 24 Feb 2025 16:45:57 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=lvRw4Nyef7N35to64fj2_kHDfbZp0KSFbwgF5chYMRI-1740415557-1.0.1.1-o5BaN1FpBwv5Wq6zIlv0rCB28lk5hVI9wZQWU3pig1jgyAKDkYzTwZ0MlSR6v6TPIX9RfepjrO3.Gk3FEmcVRw; + path=/; expires=Mon, 24-Feb-25 17:15:57 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=ySaVoTQvAcQyH5QoJQJDj75e5j8HwGFPOlFMAWEvXJk-1740415557302-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '721' + 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: + - '149999808' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_fc3b3bcd4382cddaa3c04ce7003e4857 + http_version: HTTP/1.1 + status_code: 200 +- request: + body: '{"messages": [{"role": "system", "content": "You are Task Execution Evaluator. + Evaluator agent for crew evaluation with precise capabilities to evaluate the + performance of the agents in the crew based on the tasks they have performed\nYour + personal goal is: Your goal is to evaluate the performance of the agents in + the crew based on the tasks they have performed using score from 1 to 10 evaluating + on completion, quality, and overall performance.\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: + Based on the task description and the expected output, compare and evaluate + the performance of the agents in the crew based on the Task Output they have + performed using score from 1 to 10 evaluating on completion, quality, and overall + performance.task_description: Just say hi task_expected_output: hi agent: base_agent + agent_goal: Just say hi Task Output: hi\n\nThis is the expected criteria for + your final answer: Evaluation Score from 1 to 10 based on the performance of + the agents on the tasks\nyou MUST return the actual complete content as the + final answer, not a summary.\nEnsure your final answer contains only the content + in the following format: {\n \"quality\": float\n}\n\nEnsure the final output + does not include any code block markers like ```json or ```python.\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: + - '1765' + content-type: + - application/json + cookie: + - __cf_bm=lvRw4Nyef7N35to64fj2_kHDfbZp0KSFbwgF5chYMRI-1740415557-1.0.1.1-o5BaN1FpBwv5Wq6zIlv0rCB28lk5hVI9wZQWU3pig1jgyAKDkYzTwZ0MlSR6v6TPIX9RfepjrO3.Gk3FEmcVRw; + _cfuvid=ySaVoTQvAcQyH5QoJQJDj75e5j8HwGFPOlFMAWEvXJk-1740415557302-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.61.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.61.0 + x-stainless-raw-response: + - 'true' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.8 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + content: "{\n \"id\": \"chatcmpl-B4Vsbd9AsRaJ2exDtWnHAwC8rIjfi\",\n \"object\": + \"chat.completion\",\n \"created\": 1740415557,\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 \\\"quality\\\": 10 \\n} \",\n \"refusal\": null\n + \ },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n + \ ],\n \"usage\": {\n \"prompt_tokens\": 338,\n \"completion_tokens\": + 22,\n \"total_tokens\": 360,\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_7fcd609668\"\n}\n" + headers: + CF-RAY: + - 9170edd15bb5230e-SJC + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Mon, 24 Feb 2025 16:45:58 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - crewai-iuxna1 + openai-processing-ms: + - '860' + 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: + - '149999578' + x-ratelimit-reset-requests: + - 2ms + x-ratelimit-reset-tokens: + - 0s + x-request-id: + - req_fad452c2d10b5fc95809130912b08837 + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/utilities/test_events.py b/tests/utilities/test_events.py index aa65d82b2..49edc8666 100644 --- a/tests/utilities/test_events.py +++ b/tests/utilities/test_events.py @@ -1,5 +1,5 @@ from datetime import datetime -from unittest.mock import patch +from unittest.mock import Mock, patch import pytest from pydantic import Field @@ -11,7 +11,6 @@ from crewai.flow.flow import Flow, listen, start from crewai.llm import LLM from crewai.task import Task from crewai.tools.base_tool import BaseTool -from crewai.tools.tool_usage import ToolUsage from crewai.utilities.events.agent_events import ( AgentExecutionCompletedEvent, AgentExecutionErrorEvent, @@ -21,8 +20,11 @@ from crewai.utilities.events.crew_events import ( CrewKickoffCompletedEvent, CrewKickoffFailedEvent, CrewKickoffStartedEvent, + CrewTestCompletedEvent, + CrewTestStartedEvent, ) from crewai.utilities.events.crewai_event_bus import crewai_event_bus +from crewai.utilities.events.event_listener import EventListener from crewai.utilities.events.event_types import ToolUsageFinishedEvent from crewai.utilities.events.flow_events import ( FlowCreatedEvent, @@ -58,26 +60,35 @@ base_task = Task( expected_output="hi", agent=base_agent, ) +event_listener = EventListener() @pytest.mark.vcr(filter_headers=["authorization"]) def test_crew_emits_start_kickoff_event(): received_events = [] + mock_span = Mock() - with crewai_event_bus.scoped_handlers(): - - @crewai_event_bus.on(CrewKickoffStartedEvent) - def handle_crew_start(source, event): - received_events.append(event) - - crew = Crew(agents=[base_agent], tasks=[base_task], name="TestCrew") + @crewai_event_bus.on(CrewKickoffStartedEvent) + def handle_crew_start(source, event): + received_events.append(event) + crew = Crew(agents=[base_agent], tasks=[base_task], name="TestCrew") + with ( + patch.object( + event_listener._telemetry, "crew_execution_span", return_value=mock_span + ) as mock_crew_execution_span, + patch.object( + event_listener._telemetry, "end_crew", return_value=mock_span + ) as mock_crew_ended, + ): crew.kickoff() + mock_crew_execution_span.assert_called_once_with(crew, None) + mock_crew_ended.assert_called_once_with(crew, "hi") - assert len(received_events) == 1 - assert received_events[0].crew_name == "TestCrew" - assert isinstance(received_events[0].timestamp, datetime) - assert received_events[0].type == "crew_kickoff_started" + assert len(received_events) == 1 + assert received_events[0].crew_name == "TestCrew" + assert isinstance(received_events[0].timestamp, datetime) + assert received_events[0].type == "crew_kickoff_started" @pytest.mark.vcr(filter_headers=["authorization"]) @@ -98,6 +109,45 @@ def test_crew_emits_end_kickoff_event(): assert received_events[0].type == "crew_kickoff_completed" +@pytest.mark.vcr(filter_headers=["authorization"]) +def test_crew_emits_test_kickoff_type_event(): + received_events = [] + mock_span = Mock() + + @crewai_event_bus.on(CrewTestStartedEvent) + def handle_crew_end(source, event): + received_events.append(event) + + @crewai_event_bus.on(CrewTestCompletedEvent) + def handle_crew_test_end(source, event): + received_events.append(event) + + eval_llm = LLM(model="gpt-4o-mini") + with ( + patch.object( + event_listener._telemetry, "test_execution_span", return_value=mock_span + ) as mock_crew_execution_span, + ): + crew = Crew(agents=[base_agent], tasks=[base_task], name="TestCrew") + crew.test(n_iterations=1, eval_llm=eval_llm) + + # Verify the call was made with correct argument types and values + assert mock_crew_execution_span.call_count == 1 + args = mock_crew_execution_span.call_args[0] + assert isinstance(args[0], Crew) + assert args[1] == 1 + assert args[2] is None + assert args[3] == eval_llm + + assert len(received_events) == 2 + assert received_events[0].crew_name == "TestCrew" + assert isinstance(received_events[0].timestamp, datetime) + assert received_events[0].type == "crew_test_started" + assert received_events[1].crew_name == "TestCrew" + assert isinstance(received_events[1].timestamp, datetime) + assert received_events[1].type == "crew_test_completed" + + @pytest.mark.vcr(filter_headers=["authorization"]) def test_crew_emits_kickoff_failed_event(): received_events = [] @@ -148,9 +198,20 @@ def test_crew_emits_end_task_event(): def handle_task_end(source, event): received_events.append(event) + mock_span = Mock() crew = Crew(agents=[base_agent], tasks=[base_task], name="TestCrew") + with ( + patch.object( + event_listener._telemetry, "task_started", return_value=mock_span + ) as mock_task_started, + patch.object( + event_listener._telemetry, "task_ended", return_value=mock_span + ) as mock_task_ended, + ): + crew.kickoff() - crew.kickoff() + mock_task_started.assert_called_once_with(crew=crew, task=base_task) + mock_task_ended.assert_called_once_with(mock_span, base_task, crew) assert len(received_events) == 1 assert isinstance(received_events[0].timestamp, datetime) @@ -340,24 +401,29 @@ def test_tools_emits_error_events(): def test_flow_emits_start_event(): received_events = [] + mock_span = Mock() - with crewai_event_bus.scoped_handlers(): + @crewai_event_bus.on(FlowStartedEvent) + def handle_flow_start(source, event): + received_events.append(event) - @crewai_event_bus.on(FlowStartedEvent) - def handle_flow_start(source, event): - received_events.append(event) - - class TestFlow(Flow[dict]): - @start() - def begin(self): - return "started" + class TestFlow(Flow[dict]): + @start() + def begin(self): + return "started" + with ( + patch.object( + event_listener._telemetry, "flow_execution_span", return_value=mock_span + ) as mock_flow_execution_span, + ): flow = TestFlow() flow.kickoff() - assert len(received_events) == 1 - assert received_events[0].flow_name == "TestFlow" - assert received_events[0].type == "flow_started" + mock_flow_execution_span.assert_called_once_with("TestFlow", ["begin"]) + assert len(received_events) == 1 + assert received_events[0].flow_name == "TestFlow" + assert received_events[0].type == "flow_started" def test_flow_emits_finish_event(): @@ -461,6 +527,7 @@ def test_multiple_handlers_for_same_event(): def test_flow_emits_created_event(): received_events = [] + mock_span = Mock() @crewai_event_bus.on(FlowCreatedEvent) def handle_flow_created(source, event): @@ -471,8 +538,15 @@ def test_flow_emits_created_event(): def begin(self): return "started" - flow = TestFlow() - flow.kickoff() + with ( + patch.object( + event_listener._telemetry, "flow_creation_span", return_value=mock_span + ) as mock_flow_creation_span, + ): + flow = TestFlow() + flow.kickoff() + + mock_flow_creation_span.assert_called_once_with("TestFlow") assert len(received_events) == 1 assert received_events[0].flow_name == "TestFlow" From 5bae78639ecf582a5c9ca45f3804ad438c3fe8c1 Mon Sep 17 00:00:00 2001 From: "Brandon Hancock (bhancock_ai)" <109994880+bhancockio@users.noreply.github.com> Date: Mon, 24 Feb 2025 16:30:16 -0500 Subject: [PATCH 19/35] Revert "feat: add prompt observability code (#2027)" (#2211) * Revert "feat: add prompt observability code (#2027)" This reverts commit 90f1bee6025a2bfdc2f4d7ef5531805c727f090e. * Fix issues with flows post merge * Decoupling telemetry and ensure tests (#2212) * feat: Enhance event listener and telemetry tracking - Update event listener to improve telemetry span handling - Add execution_span field to Task for better tracing - Modify event handling in EventListener to use new span tracking - Remove debug print statements - Improve test coverage for crew and flow events - Update cassettes to reflect new event tracking behavior * Remove telemetry references from Crew class - Remove Telemetry import and initialization from Crew class - Delete _telemetry attribute from class configuration - Clean up unused telemetry-related code * test: Improve crew verbose output test with event log filtering - Filter out event listener logs in verbose output test - Ensure no output when verbose is set to False - Enhance test coverage for crew logging behavior * dropped comment * refactor: Improve telemetry span tracking in EventListener - Remove `execution_span` from Task class - Add `execution_spans` dictionary to EventListener to track spans - Update task event handlers to use new span tracking mechanism - Simplify span management across task lifecycle events * lint * Fix failing test --------- Co-authored-by: Lorenze Jay <63378463+lorenzejay@users.noreply.github.com> --- src/crewai/crew.py | 2 - src/crewai/flow/flow.py | 14 +- src/crewai/llm.py | 116 +--- src/crewai/tools/tool_usage.py | 20 +- src/crewai/traces/__init__.py | 0 src/crewai/traces/context.py | 39 -- src/crewai/traces/enums.py | 19 - src/crewai/traces/models.py | 89 --- src/crewai/traces/unified_trace_controller.py | 543 ------------------ src/crewai/utilities/protocols.py | 12 - tests/agent_test.py | 52 +- tests/traces/test_unified_trace_controller.py | 360 ------------ tests/utilities/test_events.py | 2 +- 13 files changed, 35 insertions(+), 1233 deletions(-) delete mode 100644 src/crewai/traces/__init__.py delete mode 100644 src/crewai/traces/context.py delete mode 100644 src/crewai/traces/enums.py delete mode 100644 src/crewai/traces/models.py delete mode 100644 src/crewai/traces/unified_trace_controller.py delete mode 100644 src/crewai/utilities/protocols.py delete mode 100644 tests/traces/test_unified_trace_controller.py diff --git a/src/crewai/crew.py b/src/crewai/crew.py index 92a8cbb4d..cf627700e 100644 --- a/src/crewai/crew.py +++ b/src/crewai/crew.py @@ -37,7 +37,6 @@ from crewai.tasks.conditional_task import ConditionalTask from crewai.tasks.task_output import TaskOutput from crewai.tools.agent_tools.agent_tools import AgentTools from crewai.tools.base_tool import Tool -from crewai.traces.unified_trace_controller import init_crew_main_trace from crewai.types.usage_metrics import UsageMetrics from crewai.utilities import I18N, FileHandler, Logger, RPMController from crewai.utilities.constants import TRAINING_DATA_FILE @@ -571,7 +570,6 @@ class Crew(BaseModel): CrewTrainingHandler(filename).clear() raise - @init_crew_main_trace def kickoff( self, inputs: Optional[Dict[str, Any]] = None, diff --git a/src/crewai/flow/flow.py b/src/crewai/flow/flow.py index 5f17c4b84..7a8b88ba0 100644 --- a/src/crewai/flow/flow.py +++ b/src/crewai/flow/flow.py @@ -22,10 +22,6 @@ from pydantic import BaseModel, Field, ValidationError from crewai.flow.flow_visualizer import plot_flow from crewai.flow.persistence.base import FlowPersistence from crewai.flow.utils import get_possible_return_constants -from crewai.traces.unified_trace_controller import ( - init_flow_main_trace, - trace_flow_step, -) from crewai.utilities.events.crewai_event_bus import crewai_event_bus from crewai.utilities.events.flow_events import ( FlowCreatedEvent, @@ -725,7 +721,6 @@ class Flow(Generic[T], metaclass=FlowMeta): return asyncio.run(run_flow()) - @init_flow_main_trace async def kickoff_async(self, inputs: Optional[Dict[str, Any]] = None) -> Any: """ Start the flow execution asynchronously. @@ -782,18 +777,17 @@ class Flow(Generic[T], metaclass=FlowMeta): f"Flow started with ID: {self.flow_id}", color="bold_magenta" ) - if not self._start_methods: - raise ValueError("No start method defined") + if inputs is not None and "id" not in inputs: + self._initialize_state(inputs) - # Execute all start methods concurrently. tasks = [ self._execute_start_method(start_method) for start_method in self._start_methods ] await asyncio.gather(*tasks) + final_output = self._method_outputs[-1] if self._method_outputs else None - # Emit FlowFinishedEvent after all processing is complete. crewai_event_bus.emit( self, FlowFinishedEvent( @@ -802,6 +796,7 @@ class Flow(Generic[T], metaclass=FlowMeta): result=final_output, ), ) + return final_output async def _execute_start_method(self, start_method_name: str) -> None: @@ -827,7 +822,6 @@ class Flow(Generic[T], metaclass=FlowMeta): ) await self._execute_listeners(start_method_name, result) - @trace_flow_step async def _execute_method( self, method_name: str, method: Callable, *args: Any, **kwargs: Any ) -> Any: diff --git a/src/crewai/llm.py b/src/crewai/llm.py index a0378cd2d..2eefa8934 100644 --- a/src/crewai/llm.py +++ b/src/crewai/llm.py @@ -1,4 +1,3 @@ -import inspect import json import logging import os @@ -6,17 +5,7 @@ import sys import threading import warnings from contextlib import contextmanager -from typing import ( - Any, - Dict, - List, - Literal, - Optional, - Tuple, - Type, - Union, - cast, -) +from typing import Any, Dict, List, Literal, Optional, Type, Union, cast from dotenv import load_dotenv from pydantic import BaseModel @@ -37,12 +26,10 @@ with warnings.catch_warnings(): from litellm.utils import get_supported_openai_params, supports_response_schema -from crewai.traces.unified_trace_controller import trace_llm_call from crewai.utilities.events import crewai_event_bus from crewai.utilities.exceptions.context_window_exceeding_exception import ( LLMContextLengthExceededException, ) -from crewai.utilities.protocols import AgentExecutorProtocol load_dotenv() @@ -186,7 +173,6 @@ class LLM: self.context_window_size = 0 self.reasoning_effort = reasoning_effort self.additional_params = kwargs - self._message_history: List[Dict[str, str]] = [] self.is_anthropic = self._is_anthropic_model(model) litellm.drop_params = True @@ -202,12 +188,6 @@ class LLM: self.set_callbacks(callbacks) self.set_env_callbacks() - @trace_llm_call - def _call_llm(self, params: Dict[str, Any]) -> Any: - with suppress_warnings(): - response = litellm.completion(**params) - return response - def _is_anthropic_model(self, model: str) -> bool: """Determine if the model is from Anthropic provider. @@ -326,7 +306,7 @@ class LLM: params = {k: v for k, v in params.items() if v is not None} # --- 2) Make the completion call - response = self._call_llm(params) + response = litellm.completion(**params) response_message = cast(Choices, cast(ModelResponse, response).choices)[ 0 ].message @@ -570,95 +550,3 @@ class LLM: litellm.success_callback = success_callbacks litellm.failure_callback = failure_callbacks - - def _get_execution_context(self) -> Tuple[Optional[Any], Optional[Any]]: - """Get the agent and task from the execution context. - - Returns: - tuple: (agent, task) from any AgentExecutor context, or (None, None) if not found - """ - frame = inspect.currentframe() - caller_frame = frame.f_back if frame else None - agent = None - task = None - - # Add a maximum depth to prevent infinite loops - max_depth = 100 # Reasonable limit for call stack depth - current_depth = 0 - - while caller_frame and current_depth < max_depth: - if "self" in caller_frame.f_locals: - caller_self = caller_frame.f_locals["self"] - if isinstance(caller_self, AgentExecutorProtocol): - agent = caller_self.agent - task = caller_self.task - break - caller_frame = caller_frame.f_back - current_depth += 1 - - return agent, task - - def _get_new_messages(self, messages: List[Dict[str, str]]) -> List[Dict[str, str]]: - """Get only the new messages that haven't been processed before.""" - if not hasattr(self, "_message_history"): - self._message_history = [] - - new_messages = [] - for message in messages: - message_key = (message["role"], message["content"]) - if message_key not in [ - (m["role"], m["content"]) for m in self._message_history - ]: - new_messages.append(message) - self._message_history.append(message) - return new_messages - - def _get_new_tool_results(self, agent) -> List[Dict]: - """Get only the new tool results that haven't been processed before.""" - if not agent or not agent.tools_results: - return [] - - if not hasattr(self, "_tool_results_history"): - self._tool_results_history: List[Dict] = [] - - new_tool_results = [] - - for result in agent.tools_results: - # Process tool arguments to extract actual values - processed_args = {} - if isinstance(result["tool_args"], dict): - for key, value in result["tool_args"].items(): - if isinstance(value, dict) and "type" in value: - # Skip metadata and just store the actual value - continue - processed_args[key] = value - - # Create a clean result with processed arguments - clean_result = { - "tool_name": result["tool_name"], - "tool_args": processed_args, - "result": result["result"], - "content": result.get("content", ""), - "start_time": result.get("start_time", ""), - } - - # Check if this exact tool execution exists in history - is_duplicate = False - for history_result in self._tool_results_history: - if ( - clean_result["tool_name"] == history_result["tool_name"] - and str(clean_result["tool_args"]) - == str(history_result["tool_args"]) - and str(clean_result["result"]) == str(history_result["result"]) - and clean_result["content"] == history_result.get("content", "") - and clean_result["start_time"] - == history_result.get("start_time", "") - ): - is_duplicate = True - break - - if not is_duplicate: - new_tool_results.append(clean_result) - self._tool_results_history.append(clean_result) - - return new_tool_results diff --git a/src/crewai/tools/tool_usage.py b/src/crewai/tools/tool_usage.py index 5c9333557..25e4b126a 100644 --- a/src/crewai/tools/tool_usage.py +++ b/src/crewai/tools/tool_usage.py @@ -2,7 +2,6 @@ import ast import datetime import json import time -from datetime import UTC from difflib import SequenceMatcher from json import JSONDecodeError from textwrap import dedent @@ -118,10 +117,7 @@ class ToolUsage: self._printer.print(content=f"\n\n{error}\n", color="red") return error - if ( - isinstance(tool, CrewStructuredTool) - and tool.name == self._i18n.tools("add_image")["name"] # type: ignore - ): + if isinstance(tool, CrewStructuredTool) and tool.name == self._i18n.tools("add_image")["name"]: # type: ignore try: result = self._use(tool_string=tool_string, tool=tool, calling=calling) return result @@ -158,7 +154,6 @@ class ToolUsage: self.task.increment_tools_errors() started_at = time.time() - started_at_trace = datetime.datetime.now(UTC) from_cache = False result = None # type: ignore # Incompatible types in assignment (expression has type "None", variable has type "str") @@ -186,9 +181,7 @@ class ToolUsage: if calling.arguments: try: - acceptable_args = tool.args_schema.model_json_schema()[ - "properties" - ].keys() # type: ignore + acceptable_args = tool.args_schema.model_json_schema()["properties"].keys() # type: ignore arguments = { k: v for k, v in calling.arguments.items() @@ -209,7 +202,7 @@ class ToolUsage: error=e, tool=tool.name, tool_inputs=tool.description ) error = ToolUsageErrorException( - f"\n{error_message}.\nMoving on then. {self._i18n.slice('format').format(tool_names=self.tools_names)}" + f'\n{error_message}.\nMoving on then. {self._i18n.slice("format").format(tool_names=self.tools_names)}' ).message self.task.increment_tools_errors() if self.agent.verbose: @@ -244,7 +237,6 @@ class ToolUsage: "result": result, "tool_name": tool.name, "tool_args": calling.arguments, - "start_time": started_at_trace, } self.on_tool_use_finished( @@ -388,7 +380,7 @@ class ToolUsage: raise else: return ToolUsageErrorException( - f"{self._i18n.errors('tool_arguments_error')}" + f'{self._i18n.errors("tool_arguments_error")}' ) if not isinstance(arguments, dict): @@ -396,7 +388,7 @@ class ToolUsage: raise else: return ToolUsageErrorException( - f"{self._i18n.errors('tool_arguments_error')}" + f'{self._i18n.errors("tool_arguments_error")}' ) return ToolCalling( @@ -424,7 +416,7 @@ class ToolUsage: if self.agent.verbose: self._printer.print(content=f"\n\n{e}\n", color="red") return ToolUsageErrorException( # type: ignore # Incompatible return value type (got "ToolUsageErrorException", expected "ToolCalling | InstructorToolCalling") - f"{self._i18n.errors('tool_usage_error').format(error=e)}\nMoving on then. {self._i18n.slice('format').format(tool_names=self.tools_names)}" + f'{self._i18n.errors("tool_usage_error").format(error=e)}\nMoving on then. {self._i18n.slice("format").format(tool_names=self.tools_names)}' ) return self._tool_calling(tool_string) diff --git a/src/crewai/traces/__init__.py b/src/crewai/traces/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/crewai/traces/context.py b/src/crewai/traces/context.py deleted file mode 100644 index dd1cf144e..000000000 --- a/src/crewai/traces/context.py +++ /dev/null @@ -1,39 +0,0 @@ -from contextlib import contextmanager -from contextvars import ContextVar -from typing import Generator - - -class TraceContext: - """Maintains the current trace context throughout the execution stack. - - This class provides a context manager for tracking trace execution across - async and sync code paths using ContextVars. - """ - - _context: ContextVar = ContextVar("trace_context", default=None) - - @classmethod - def get_current(cls): - """Get the current trace context. - - Returns: - Optional[UnifiedTraceController]: The current trace controller or None if not set. - """ - return cls._context.get() - - @classmethod - @contextmanager - def set_current(cls, trace): - """Set the current trace context within a context manager. - - Args: - trace: The trace controller to set as current. - - Yields: - UnifiedTraceController: The current trace controller. - """ - token = cls._context.set(trace) - try: - yield trace - finally: - cls._context.reset(token) diff --git a/src/crewai/traces/enums.py b/src/crewai/traces/enums.py deleted file mode 100644 index 392f46ea4..000000000 --- a/src/crewai/traces/enums.py +++ /dev/null @@ -1,19 +0,0 @@ -from enum import Enum - - -class TraceType(Enum): - LLM_CALL = "llm_call" - TOOL_CALL = "tool_call" - FLOW_STEP = "flow_step" - START_CALL = "start_call" - - -class RunType(Enum): - KICKOFF = "kickoff" - TRAIN = "train" - TEST = "test" - - -class CrewType(Enum): - CREW = "crew" - FLOW = "flow" diff --git a/src/crewai/traces/models.py b/src/crewai/traces/models.py deleted file mode 100644 index 254da957e..000000000 --- a/src/crewai/traces/models.py +++ /dev/null @@ -1,89 +0,0 @@ -from datetime import datetime -from typing import Any, Dict, List, Optional - -from pydantic import BaseModel, Field - - -class ToolCall(BaseModel): - """Model representing a tool call during execution""" - - name: str - arguments: Dict[str, Any] - output: str - start_time: datetime - end_time: Optional[datetime] = None - latency_ms: Optional[int] = None - error: Optional[str] = None - - -class LLMRequest(BaseModel): - """Model representing the LLM request details""" - - model: str - messages: List[Dict[str, str]] - temperature: Optional[float] = None - max_tokens: Optional[int] = None - stop_sequences: Optional[List[str]] = None - additional_params: Dict[str, Any] = Field(default_factory=dict) - - -class LLMResponse(BaseModel): - """Model representing the LLM response details""" - - content: str - finish_reason: Optional[str] = None - - -class FlowStepIO(BaseModel): - """Model representing flow step input/output details""" - - function_name: str - inputs: Dict[str, Any] = Field(default_factory=dict) - outputs: Any - metadata: Dict[str, Any] = Field(default_factory=dict) - - -class CrewTrace(BaseModel): - """Model for tracking detailed information about LLM interactions and Flow steps""" - - deployment_instance_id: Optional[str] = Field( - description="ID of the deployment instance" - ) - trace_id: str = Field(description="Unique identifier for this trace") - run_id: str = Field(description="Identifier for the execution run") - agent_role: Optional[str] = Field(description="Role of the agent") - task_id: Optional[str] = Field(description="ID of the current task being executed") - task_name: Optional[str] = Field(description="Name of the current task") - task_description: Optional[str] = Field( - description="Description of the current task" - ) - trace_type: str = Field(description="Type of the trace") - crew_type: str = Field(description="Type of the crew") - run_type: str = Field(description="Type of the run") - - # Timing information - start_time: Optional[datetime] = None - end_time: Optional[datetime] = None - latency_ms: Optional[int] = None - - # Request/Response for LLM calls - request: Optional[LLMRequest] = None - response: Optional[LLMResponse] = None - - # Input/Output for Flow steps - flow_step: Optional[FlowStepIO] = None - - # Tool usage - tool_calls: List[ToolCall] = Field(default_factory=list) - - # Metrics - tokens_used: Optional[int] = None - prompt_tokens: Optional[int] = None - completion_tokens: Optional[int] = None - cost: Optional[float] = None - - # Additional metadata - status: str = "running" # running, completed, error - error: Optional[str] = None - metadata: Dict[str, Any] = Field(default_factory=dict) - tags: List[str] = Field(default_factory=list) diff --git a/src/crewai/traces/unified_trace_controller.py b/src/crewai/traces/unified_trace_controller.py deleted file mode 100644 index 986a0a174..000000000 --- a/src/crewai/traces/unified_trace_controller.py +++ /dev/null @@ -1,543 +0,0 @@ -import inspect -import os -from datetime import UTC, datetime -from functools import wraps -from typing import Any, Awaitable, Callable, Dict, List, Optional -from uuid import uuid4 - -from crewai.traces.context import TraceContext -from crewai.traces.enums import CrewType, RunType, TraceType -from crewai.traces.models import ( - CrewTrace, - FlowStepIO, - LLMRequest, - LLMResponse, - ToolCall, -) - - -class UnifiedTraceController: - """Controls and manages trace execution and recording. - - This class handles the lifecycle of traces including creation, execution tracking, - and recording of results for various types of operations (LLM calls, tool calls, flow steps). - """ - - _task_traces: Dict[str, List["UnifiedTraceController"]] = {} - - def __init__( - self, - trace_type: TraceType, - run_type: RunType, - crew_type: CrewType, - run_id: str, - deployment_instance_id: str = os.environ.get( - "CREWAI_DEPLOYMENT_INSTANCE_ID", "" - ), - parent_trace_id: Optional[str] = None, - agent_role: Optional[str] = "unknown", - task_name: Optional[str] = None, - task_description: Optional[str] = None, - task_id: Optional[str] = None, - flow_step: Dict[str, Any] = {}, - tool_calls: List[ToolCall] = [], - **context: Any, - ) -> None: - """Initialize a new trace controller. - - Args: - trace_type: Type of trace being recorded. - run_type: Type of run being executed. - crew_type: Type of crew executing the trace. - run_id: Unique identifier for the run. - deployment_instance_id: Optional deployment instance identifier. - parent_trace_id: Optional parent trace identifier for nested traces. - agent_role: Role of the agent executing the trace. - task_name: Optional name of the task being executed. - task_description: Optional description of the task. - task_id: Optional unique identifier for the task. - flow_step: Optional flow step information. - tool_calls: Optional list of tool calls made during execution. - **context: Additional context parameters. - """ - self.trace_id = str(uuid4()) - self.run_id = run_id - self.parent_trace_id = parent_trace_id - self.trace_type = trace_type - self.run_type = run_type - self.crew_type = crew_type - self.context = context - self.agent_role = agent_role - self.task_name = task_name - self.task_description = task_description - self.task_id = task_id - self.deployment_instance_id = deployment_instance_id - self.children: List[Dict[str, Any]] = [] - self.start_time: Optional[datetime] = None - self.end_time: Optional[datetime] = None - self.error: Optional[str] = None - self.tool_calls = tool_calls - self.flow_step = flow_step - self.status: str = "running" - - # Add trace to task's trace collection if task_id is present - if task_id: - self._add_to_task_traces() - - def _add_to_task_traces(self) -> None: - """Add this trace to the task's trace collection.""" - if not hasattr(UnifiedTraceController, "_task_traces"): - UnifiedTraceController._task_traces = {} - - if self.task_id is None: - return - - if self.task_id not in UnifiedTraceController._task_traces: - UnifiedTraceController._task_traces[self.task_id] = [] - - UnifiedTraceController._task_traces[self.task_id].append(self) - - @classmethod - def get_task_traces(cls, task_id: str) -> List["UnifiedTraceController"]: - """Get all traces for a specific task. - - Args: - task_id: The ID of the task to get traces for - - Returns: - List of traces associated with the task - """ - return cls._task_traces.get(task_id, []) - - @classmethod - def clear_task_traces(cls, task_id: str) -> None: - """Clear traces for a specific task. - - Args: - task_id: The ID of the task to clear traces for - """ - if hasattr(cls, "_task_traces") and task_id in cls._task_traces: - del cls._task_traces[task_id] - - def _get_current_trace(self) -> "UnifiedTraceController": - return TraceContext.get_current() - - def start_trace(self) -> "UnifiedTraceController": - """Start the trace execution. - - Returns: - UnifiedTraceController: Self for method chaining. - """ - self.start_time = datetime.now(UTC) - return self - - def end_trace(self, result: Any = None, error: Optional[str] = None) -> None: - """End the trace execution and record results. - - Args: - result: Optional result from the trace execution. - error: Optional error message if the trace failed. - """ - self.end_time = datetime.now(UTC) - self.status = "error" if error else "completed" - self.error = error - self._record_trace(result) - - def add_child_trace(self, child_trace: Dict[str, Any]) -> None: - """Add a child trace to this trace's execution history. - - Args: - child_trace: The child trace information to add. - """ - self.children.append(child_trace) - - def to_crew_trace(self) -> CrewTrace: - """Convert to CrewTrace format for storage. - - Returns: - CrewTrace: The trace data in CrewTrace format. - """ - latency_ms = None - - if self.tool_calls and hasattr(self.tool_calls[0], "start_time"): - self.start_time = self.tool_calls[0].start_time - - if self.start_time and self.end_time: - latency_ms = int((self.end_time - self.start_time).total_seconds() * 1000) - - request = None - response = None - flow_step_obj = None - - if self.trace_type in [TraceType.LLM_CALL, TraceType.TOOL_CALL]: - request = LLMRequest( - model=self.context.get("model", "unknown"), - messages=self.context.get("messages", []), - temperature=self.context.get("temperature"), - max_tokens=self.context.get("max_tokens"), - stop_sequences=self.context.get("stop_sequences"), - ) - if "response" in self.context: - response = LLMResponse( - content=self.context["response"].get("content", ""), - finish_reason=self.context["response"].get("finish_reason"), - ) - - elif self.trace_type == TraceType.FLOW_STEP: - flow_step_obj = FlowStepIO( - function_name=self.flow_step.get("function_name", "unknown"), - inputs=self.flow_step.get("inputs", {}), - outputs={"result": self.context.get("response")}, - metadata=self.flow_step.get("metadata", {}), - ) - - return CrewTrace( - deployment_instance_id=self.deployment_instance_id, - trace_id=self.trace_id, - task_id=self.task_id, - run_id=self.run_id, - agent_role=self.agent_role, - task_name=self.task_name, - task_description=self.task_description, - trace_type=self.trace_type.value, - crew_type=self.crew_type.value, - run_type=self.run_type.value, - start_time=self.start_time, - end_time=self.end_time, - latency_ms=latency_ms, - request=request, - response=response, - flow_step=flow_step_obj, - tool_calls=self.tool_calls, - tokens_used=self.context.get("tokens_used"), - prompt_tokens=self.context.get("prompt_tokens"), - completion_tokens=self.context.get("completion_tokens"), - status=self.status, - error=self.error, - ) - - def _record_trace(self, result: Any = None) -> None: - """Record the trace. - - This method is called when a trace is completed. It ensures the trace - is properly recorded and associated with its task if applicable. - - Args: - result: Optional result to include in the trace - """ - if result: - self.context["response"] = result - - # Add to task traces if this trace belongs to a task - if self.task_id: - self._add_to_task_traces() - - -def should_trace() -> bool: - """Check if tracing is enabled via environment variable.""" - return os.getenv("CREWAI_ENABLE_TRACING", "false").lower() == "true" - - -# Crew main trace -def init_crew_main_trace(func: Callable[..., Any]) -> Callable[..., Any]: - """Decorator to initialize and track the main crew execution trace. - - This decorator sets up the trace context for the main crew execution, - handling both synchronous and asynchronous crew operations. - - Args: - func: The crew function to be traced. - - Returns: - Wrapped function that creates and manages the main crew trace context. - """ - - @wraps(func) - def wrapper(self: Any, *args: Any, **kwargs: Any) -> Any: - if not should_trace(): - return func(self, *args, **kwargs) - - trace = build_crew_main_trace(self) - with TraceContext.set_current(trace): - try: - return func(self, *args, **kwargs) - except Exception as e: - trace.end_trace(error=str(e)) - raise - - return wrapper - - -def build_crew_main_trace(self: Any) -> "UnifiedTraceController": - """Build the main trace controller for a crew execution. - - This function creates a trace controller configured for the main crew execution, - handling different run types (kickoff, test, train) and maintaining context. - - Args: - self: The crew instance. - - Returns: - UnifiedTraceController: The configured trace controller for the crew. - """ - run_type = RunType.KICKOFF - if hasattr(self, "_test") and self._test: - run_type = RunType.TEST - elif hasattr(self, "_train") and self._train: - run_type = RunType.TRAIN - - current_trace = TraceContext.get_current() - - trace = UnifiedTraceController( - trace_type=TraceType.LLM_CALL, - run_type=run_type, - crew_type=current_trace.crew_type if current_trace else CrewType.CREW, - run_id=current_trace.run_id if current_trace else str(self.id), - parent_trace_id=current_trace.trace_id if current_trace else None, - ) - return trace - - -# Flow main trace -def init_flow_main_trace( - func: Callable[..., Awaitable[Any]], -) -> Callable[..., Awaitable[Any]]: - """Decorator to initialize and track the main flow execution trace. - - Args: - func: The async flow function to be traced. - - Returns: - Wrapped async function that creates and manages the main flow trace context. - """ - - @wraps(func) - async def wrapper(self: Any, *args: Any, **kwargs: Any) -> Any: - if not should_trace(): - return await func(self, *args, **kwargs) - - trace = build_flow_main_trace(self, *args, **kwargs) - with TraceContext.set_current(trace): - try: - return await func(self, *args, **kwargs) - except Exception: - raise - - return wrapper - - -def build_flow_main_trace( - self: Any, *args: Any, **kwargs: Any -) -> "UnifiedTraceController": - """Build the main trace controller for a flow execution. - - Args: - self: The flow instance. - *args: Variable positional arguments. - **kwargs: Variable keyword arguments. - - Returns: - UnifiedTraceController: The configured trace controller for the flow. - """ - current_trace = TraceContext.get_current() - trace = UnifiedTraceController( - trace_type=TraceType.FLOW_STEP, - run_id=current_trace.run_id if current_trace else str(self.flow_id), - parent_trace_id=current_trace.trace_id if current_trace else None, - crew_type=CrewType.FLOW, - run_type=RunType.KICKOFF, - context={ - "crew_name": self.__class__.__name__, - "inputs": kwargs.get("inputs", {}), - "agents": [], - "tasks": [], - }, - ) - return trace - - -# Flow step trace -def trace_flow_step( - func: Callable[..., Awaitable[Any]], -) -> Callable[..., Awaitable[Any]]: - """Decorator to trace individual flow step executions. - - Args: - func: The async flow step function to be traced. - - Returns: - Wrapped async function that creates and manages the flow step trace context. - """ - - @wraps(func) - async def wrapper( - self: Any, - method_name: str, - method: Callable[..., Any], - *args: Any, - **kwargs: Any, - ) -> Any: - if not should_trace(): - return await func(self, method_name, method, *args, **kwargs) - - trace = build_flow_step_trace(self, method_name, method, *args, **kwargs) - with TraceContext.set_current(trace): - trace.start_trace() - try: - result = await func(self, method_name, method, *args, **kwargs) - trace.end_trace(result=result) - return result - except Exception as e: - trace.end_trace(error=str(e)) - raise - - return wrapper - - -def build_flow_step_trace( - self: Any, method_name: str, method: Callable[..., Any], *args: Any, **kwargs: Any -) -> "UnifiedTraceController": - """Build a trace controller for an individual flow step. - - Args: - self: The flow instance. - method_name: Name of the method being executed. - method: The actual method being executed. - *args: Variable positional arguments. - **kwargs: Variable keyword arguments. - - Returns: - UnifiedTraceController: The configured trace controller for the flow step. - """ - current_trace = TraceContext.get_current() - - # Get method signature - sig = inspect.signature(method) - params = list(sig.parameters.values()) - - # Create inputs dictionary mapping parameter names to values - method_params = [p for p in params if p.name != "self"] - inputs: Dict[str, Any] = {} - - # Map positional args to their parameter names - for i, param in enumerate(method_params): - if i < len(args): - inputs[param.name] = args[i] - - # Add keyword arguments - inputs.update(kwargs) - - trace = UnifiedTraceController( - trace_type=TraceType.FLOW_STEP, - run_type=current_trace.run_type if current_trace else RunType.KICKOFF, - crew_type=current_trace.crew_type if current_trace else CrewType.FLOW, - run_id=current_trace.run_id if current_trace else str(self.flow_id), - parent_trace_id=current_trace.trace_id if current_trace else None, - flow_step={ - "function_name": method_name, - "inputs": inputs, - "metadata": { - "crew_name": self.__class__.__name__, - }, - }, - ) - return trace - - -# LLM trace -def trace_llm_call(func: Callable[..., Any]) -> Callable[..., Any]: - """Decorator to trace LLM calls. - - Args: - func: The function to trace. - - Returns: - Wrapped function that creates and manages the LLM call trace context. - """ - - @wraps(func) - def wrapper(self: Any, *args: Any, **kwargs: Any) -> Any: - if not should_trace(): - return func(self, *args, **kwargs) - - trace = build_llm_trace(self, *args, **kwargs) - with TraceContext.set_current(trace): - trace.start_trace() - try: - response = func(self, *args, **kwargs) - # Extract relevant data from response - trace_response = { - "content": response["choices"][0]["message"]["content"], - "finish_reason": response["choices"][0].get("finish_reason"), - } - - # Add usage metrics to context - if "usage" in response: - trace.context["tokens_used"] = response["usage"].get( - "total_tokens", 0 - ) - trace.context["prompt_tokens"] = response["usage"].get( - "prompt_tokens", 0 - ) - trace.context["completion_tokens"] = response["usage"].get( - "completion_tokens", 0 - ) - - trace.end_trace(trace_response) - return response - except Exception as e: - trace.end_trace(error=str(e)) - raise - - return wrapper - - -def build_llm_trace( - self: Any, params: Dict[str, Any], *args: Any, **kwargs: Any -) -> Any: - """Build a trace controller for an LLM call. - - Args: - self: The LLM instance. - params: The parameters for the LLM call. - *args: Variable positional arguments. - **kwargs: Variable keyword arguments. - - Returns: - UnifiedTraceController: The configured trace controller for the LLM call. - """ - current_trace = TraceContext.get_current() - agent, task = self._get_execution_context() - - # Get new messages and tool results - new_messages = self._get_new_messages(params.get("messages", [])) - new_tool_results = self._get_new_tool_results(agent) - - # Create trace context - trace = UnifiedTraceController( - trace_type=TraceType.TOOL_CALL if new_tool_results else TraceType.LLM_CALL, - crew_type=current_trace.crew_type if current_trace else CrewType.CREW, - run_type=current_trace.run_type if current_trace else RunType.KICKOFF, - run_id=current_trace.run_id if current_trace else str(uuid4()), - parent_trace_id=current_trace.trace_id if current_trace else None, - agent_role=agent.role if agent else "unknown", - task_id=str(task.id) if task else None, - task_name=task.name if task else None, - task_description=task.description if task else None, - model=self.model, - messages=new_messages, - temperature=self.temperature, - max_tokens=self.max_tokens, - stop_sequences=self.stop, - tool_calls=[ - ToolCall( - name=result["tool_name"], - arguments=result["tool_args"], - output=str(result["result"]), - start_time=result.get("start_time", ""), - end_time=datetime.now(UTC), - ) - for result in new_tool_results - ], - ) - return trace diff --git a/src/crewai/utilities/protocols.py b/src/crewai/utilities/protocols.py deleted file mode 100644 index 83ebf58e9..000000000 --- a/src/crewai/utilities/protocols.py +++ /dev/null @@ -1,12 +0,0 @@ -from typing import Any, Protocol, runtime_checkable - - -@runtime_checkable -class AgentExecutorProtocol(Protocol): - """Protocol defining the expected interface for an agent executor.""" - - @property - def agent(self) -> Any: ... - - @property - def task(self) -> Any: ... diff --git a/tests/agent_test.py b/tests/agent_test.py index 1d07da23e..5e1083c4b 100644 --- a/tests/agent_test.py +++ b/tests/agent_test.py @@ -915,8 +915,6 @@ def test_tool_result_as_answer_is_the_final_answer_for_the_agent(): @pytest.mark.vcr(filter_headers=["authorization"]) def test_tool_usage_information_is_appended_to_agent(): - from datetime import UTC, datetime - from crewai.tools import BaseTool class MyCustomTool(BaseTool): @@ -926,36 +924,30 @@ def test_tool_usage_information_is_appended_to_agent(): def _run(self) -> str: return "Howdy!" - fixed_datetime = datetime(2025, 2, 10, 12, 0, 0, tzinfo=UTC) - with patch("datetime.datetime") as mock_datetime: - mock_datetime.now.return_value = fixed_datetime - mock_datetime.side_effect = lambda *args, **kw: datetime(*args, **kw) + agent1 = Agent( + role="Friendly Neighbor", + goal="Make everyone feel welcome", + backstory="You are the friendly neighbor", + tools=[MyCustomTool(result_as_answer=True)], + ) - agent1 = Agent( - role="Friendly Neighbor", - goal="Make everyone feel welcome", - backstory="You are the friendly neighbor", - tools=[MyCustomTool(result_as_answer=True)], - ) + greeting = Task( + description="Say an appropriate greeting.", + expected_output="The greeting.", + agent=agent1, + ) + tasks = [greeting] + crew = Crew(agents=[agent1], tasks=tasks) - greeting = Task( - description="Say an appropriate greeting.", - expected_output="The greeting.", - agent=agent1, - ) - tasks = [greeting] - crew = Crew(agents=[agent1], tasks=tasks) - - crew.kickoff() - assert agent1.tools_results == [ - { - "result": "Howdy!", - "tool_name": "Decide Greetings", - "tool_args": {}, - "result_as_answer": True, - "start_time": fixed_datetime, - } - ] + crew.kickoff() + assert agent1.tools_results == [ + { + "result": "Howdy!", + "tool_name": "Decide Greetings", + "tool_args": {}, + "result_as_answer": True, + } + ] def test_agent_definition_based_on_dict(): diff --git a/tests/traces/test_unified_trace_controller.py b/tests/traces/test_unified_trace_controller.py deleted file mode 100644 index b14fb5d2d..000000000 --- a/tests/traces/test_unified_trace_controller.py +++ /dev/null @@ -1,360 +0,0 @@ -import os -from datetime import UTC, datetime -from unittest.mock import MagicMock, patch -from uuid import UUID - -import pytest - -from crewai.traces.context import TraceContext -from crewai.traces.enums import CrewType, RunType, TraceType -from crewai.traces.models import ( - CrewTrace, - FlowStepIO, - LLMRequest, - LLMResponse, -) -from crewai.traces.unified_trace_controller import ( - UnifiedTraceController, - init_crew_main_trace, - init_flow_main_trace, - should_trace, - trace_flow_step, - trace_llm_call, -) - - -class TestUnifiedTraceController: - @pytest.fixture - def basic_trace_controller(self): - return UnifiedTraceController( - trace_type=TraceType.LLM_CALL, - run_type=RunType.KICKOFF, - crew_type=CrewType.CREW, - run_id="test-run-id", - agent_role="test-agent", - task_name="test-task", - task_description="test description", - task_id="test-task-id", - ) - - def test_initialization(self, basic_trace_controller): - """Test basic initialization of UnifiedTraceController""" - assert basic_trace_controller.trace_type == TraceType.LLM_CALL - assert basic_trace_controller.run_type == RunType.KICKOFF - assert basic_trace_controller.crew_type == CrewType.CREW - assert basic_trace_controller.run_id == "test-run-id" - assert basic_trace_controller.agent_role == "test-agent" - assert basic_trace_controller.task_name == "test-task" - assert basic_trace_controller.task_description == "test description" - assert basic_trace_controller.task_id == "test-task-id" - assert basic_trace_controller.status == "running" - assert isinstance(UUID(basic_trace_controller.trace_id), UUID) - - def test_start_trace(self, basic_trace_controller): - """Test starting a trace""" - result = basic_trace_controller.start_trace() - assert result == basic_trace_controller - assert basic_trace_controller.start_time is not None - assert isinstance(basic_trace_controller.start_time, datetime) - - def test_end_trace_success(self, basic_trace_controller): - """Test ending a trace successfully""" - basic_trace_controller.start_trace() - basic_trace_controller.end_trace(result={"test": "result"}) - - assert basic_trace_controller.end_time is not None - assert basic_trace_controller.status == "completed" - assert basic_trace_controller.error is None - assert basic_trace_controller.context.get("response") == {"test": "result"} - - def test_end_trace_with_error(self, basic_trace_controller): - """Test ending a trace with an error""" - basic_trace_controller.start_trace() - basic_trace_controller.end_trace(error="Test error occurred") - - assert basic_trace_controller.end_time is not None - assert basic_trace_controller.status == "error" - assert basic_trace_controller.error == "Test error occurred" - - def test_add_child_trace(self, basic_trace_controller): - """Test adding a child trace""" - child_trace = {"id": "child-1", "type": "test"} - basic_trace_controller.add_child_trace(child_trace) - assert len(basic_trace_controller.children) == 1 - assert basic_trace_controller.children[0] == child_trace - - def test_to_crew_trace_llm_call(self): - """Test converting to CrewTrace for LLM call""" - test_messages = [{"role": "user", "content": "test"}] - test_response = { - "content": "test response", - "finish_reason": "stop", - } - - controller = UnifiedTraceController( - trace_type=TraceType.LLM_CALL, - run_type=RunType.KICKOFF, - crew_type=CrewType.CREW, - run_id="test-run-id", - context={ - "messages": test_messages, - "temperature": 0.7, - "max_tokens": 100, - }, - ) - - # Set model and messages in the context - controller.context["model"] = "gpt-4" - controller.context["messages"] = test_messages - - controller.start_trace() - controller.end_trace(result=test_response) - - crew_trace = controller.to_crew_trace() - assert isinstance(crew_trace, CrewTrace) - assert isinstance(crew_trace.request, LLMRequest) - assert isinstance(crew_trace.response, LLMResponse) - assert crew_trace.request.model == "gpt-4" - assert crew_trace.request.messages == test_messages - assert crew_trace.response.content == test_response["content"] - assert crew_trace.response.finish_reason == test_response["finish_reason"] - - def test_to_crew_trace_flow_step(self): - """Test converting to CrewTrace for flow step""" - flow_step_data = { - "function_name": "test_function", - "inputs": {"param1": "value1"}, - "metadata": {"meta": "data"}, - } - - controller = UnifiedTraceController( - trace_type=TraceType.FLOW_STEP, - run_type=RunType.KICKOFF, - crew_type=CrewType.FLOW, - run_id="test-run-id", - flow_step=flow_step_data, - ) - - controller.start_trace() - controller.end_trace(result="test result") - - crew_trace = controller.to_crew_trace() - assert isinstance(crew_trace, CrewTrace) - assert isinstance(crew_trace.flow_step, FlowStepIO) - assert crew_trace.flow_step.function_name == "test_function" - assert crew_trace.flow_step.inputs == {"param1": "value1"} - assert crew_trace.flow_step.outputs == {"result": "test result"} - - def test_should_trace(self): - """Test should_trace function""" - with patch.dict(os.environ, {"CREWAI_ENABLE_TRACING": "true"}): - assert should_trace() is True - - with patch.dict(os.environ, {"CREWAI_ENABLE_TRACING": "false"}): - assert should_trace() is False - - with patch.dict(os.environ, clear=True): - assert should_trace() is False - - @pytest.mark.asyncio - async def test_trace_flow_step_decorator(self): - """Test trace_flow_step decorator""" - - class TestFlow: - flow_id = "test-flow-id" - - @trace_flow_step - async def test_method(self, method_name, method, *args, **kwargs): - return "test result" - - with patch.dict(os.environ, {"CREWAI_ENABLE_TRACING": "true"}): - flow = TestFlow() - result = await flow.test_method("test_method", lambda x: x, arg1="value1") - assert result == "test result" - - def test_trace_llm_call_decorator(self): - """Test trace_llm_call decorator""" - - class TestLLM: - model = "gpt-4" - temperature = 0.7 - max_tokens = 100 - stop = None - - def _get_execution_context(self): - return MagicMock(), MagicMock() - - def _get_new_messages(self, messages): - return messages - - def _get_new_tool_results(self, agent): - return [] - - @trace_llm_call - def test_method(self, params): - return { - "choices": [ - { - "message": {"content": "test response"}, - "finish_reason": "stop", - } - ], - "usage": { - "total_tokens": 50, - "prompt_tokens": 20, - "completion_tokens": 30, - }, - } - - with patch.dict(os.environ, {"CREWAI_ENABLE_TRACING": "true"}): - llm = TestLLM() - result = llm.test_method({"messages": []}) - assert result["choices"][0]["message"]["content"] == "test response" - - def test_init_crew_main_trace_kickoff(self): - """Test init_crew_main_trace in kickoff mode""" - trace_context = None - - class TestCrew: - id = "test-crew-id" - _test = False - _train = False - - @init_crew_main_trace - def test_method(self): - nonlocal trace_context - trace_context = TraceContext.get_current() - return "test result" - - with patch.dict(os.environ, {"CREWAI_ENABLE_TRACING": "true"}): - crew = TestCrew() - result = test_method(crew) - assert result == "test result" - assert trace_context is not None - assert trace_context.trace_type == TraceType.LLM_CALL - assert trace_context.run_type == RunType.KICKOFF - assert trace_context.crew_type == CrewType.CREW - assert trace_context.run_id == str(crew.id) - - def test_init_crew_main_trace_test_mode(self): - """Test init_crew_main_trace in test mode""" - trace_context = None - - class TestCrew: - id = "test-crew-id" - _test = True - _train = False - - @init_crew_main_trace - def test_method(self): - nonlocal trace_context - trace_context = TraceContext.get_current() - return "test result" - - with patch.dict(os.environ, {"CREWAI_ENABLE_TRACING": "true"}): - crew = TestCrew() - result = test_method(crew) - assert result == "test result" - assert trace_context is not None - assert trace_context.run_type == RunType.TEST - - def test_init_crew_main_trace_train_mode(self): - """Test init_crew_main_trace in train mode""" - trace_context = None - - class TestCrew: - id = "test-crew-id" - _test = False - _train = True - - @init_crew_main_trace - def test_method(self): - nonlocal trace_context - trace_context = TraceContext.get_current() - return "test result" - - with patch.dict(os.environ, {"CREWAI_ENABLE_TRACING": "true"}): - crew = TestCrew() - result = test_method(crew) - assert result == "test result" - assert trace_context is not None - assert trace_context.run_type == RunType.TRAIN - - @pytest.mark.asyncio - async def test_init_flow_main_trace(self): - """Test init_flow_main_trace decorator""" - trace_context = None - test_inputs = {"test": "input"} - - class TestFlow: - flow_id = "test-flow-id" - - @init_flow_main_trace - async def test_method(self, **kwargs): - nonlocal trace_context - trace_context = TraceContext.get_current() - # Verify the context is set during execution - assert trace_context.context["context"]["inputs"] == test_inputs - return "test result" - - with patch.dict(os.environ, {"CREWAI_ENABLE_TRACING": "true"}): - flow = TestFlow() - result = await flow.test_method(inputs=test_inputs) - assert result == "test result" - assert trace_context is not None - assert trace_context.trace_type == TraceType.FLOW_STEP - assert trace_context.crew_type == CrewType.FLOW - assert trace_context.run_type == RunType.KICKOFF - assert trace_context.run_id == str(flow.flow_id) - assert trace_context.context["context"]["inputs"] == test_inputs - - def test_trace_context_management(self): - """Test TraceContext management""" - trace1 = UnifiedTraceController( - trace_type=TraceType.LLM_CALL, - run_type=RunType.KICKOFF, - crew_type=CrewType.CREW, - run_id="test-run-1", - ) - - trace2 = UnifiedTraceController( - trace_type=TraceType.FLOW_STEP, - run_type=RunType.TEST, - crew_type=CrewType.FLOW, - run_id="test-run-2", - ) - - # Test that context is initially empty - assert TraceContext.get_current() is None - - # Test setting and getting context - with TraceContext.set_current(trace1): - assert TraceContext.get_current() == trace1 - - # Test nested context - with TraceContext.set_current(trace2): - assert TraceContext.get_current() == trace2 - - # Test context restoration after nested block - assert TraceContext.get_current() == trace1 - - # Test context cleanup after with block - assert TraceContext.get_current() is None - - def test_trace_context_error_handling(self): - """Test TraceContext error handling""" - trace = UnifiedTraceController( - trace_type=TraceType.LLM_CALL, - run_type=RunType.KICKOFF, - crew_type=CrewType.CREW, - run_id="test-run", - ) - - # Test that context is properly cleaned up even if an error occurs - try: - with TraceContext.set_current(trace): - raise ValueError("Test error") - except ValueError: - pass - - assert TraceContext.get_current() is None diff --git a/tests/utilities/test_events.py b/tests/utilities/test_events.py index 49edc8666..f46b635d3 100644 --- a/tests/utilities/test_events.py +++ b/tests/utilities/test_events.py @@ -606,7 +606,7 @@ def test_llm_emits_call_failed_event(): received_events.append(event) error_message = "Simulated LLM call failure" - with patch.object(LLM, "_call_llm", side_effect=Exception(error_message)): + with patch("crewai.llm.litellm.completion", side_effect=Exception(error_message)): llm = LLM(model="gpt-4o-mini") with pytest.raises(Exception) as exc_info: llm.call("Hello, how are you?") From 123f302744845bf5847c69575e455dd7258cdb74 Mon Sep 17 00:00:00 2001 From: nikolaidk <59203257+nikolaidk@users.noreply.github.com> Date: Tue, 25 Feb 2025 18:12:27 +0100 Subject: [PATCH 20/35] Update kickoff-async.mdx (#2138) Missing mandatory field expected_output on task in example Co-authored-by: Brandon Hancock (bhancock_ai) <109994880+bhancockio@users.noreply.github.com> --- docs/how-to/kickoff-async.mdx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/how-to/kickoff-async.mdx b/docs/how-to/kickoff-async.mdx index 099c7ebc6..81300b19b 100644 --- a/docs/how-to/kickoff-async.mdx +++ b/docs/how-to/kickoff-async.mdx @@ -54,7 +54,8 @@ coding_agent = Agent( # Create a task that requires code execution data_analysis_task = Task( description="Analyze the given dataset and calculate the average age of participants. Ages: {ages}", - agent=coding_agent + agent=coding_agent, + expected_output="The average age of the participants." ) # Create a crew and add the task @@ -116,4 +117,4 @@ async def async_multiple_crews(): # Run the async function asyncio.run(async_multiple_crews()) -``` \ No newline at end of file +``` From 3d4a1e4b182174265c3580f951a169cef1e21d5f Mon Sep 17 00:00:00 2001 From: Victor Degliame <1413803+RealVidy@users.noreply.github.com> Date: Tue, 25 Feb 2025 18:16:04 +0100 Subject: [PATCH 21/35] fix: typo in 'delegate_work' and 'ask_question' promps (#2144) Co-authored-by: Brandon Hancock (bhancock_ai) <109994880+bhancockio@users.noreply.github.com> --- src/crewai/translations/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/crewai/translations/en.json b/src/crewai/translations/en.json index 4c28fc5d5..8a9dc6800 100644 --- a/src/crewai/translations/en.json +++ b/src/crewai/translations/en.json @@ -39,8 +39,8 @@ "validation_error": "### Previous attempt failed validation: {guardrail_result_error}\n\n\n### Previous result:\n{task_output}\n\n\nTry again, making sure to address the validation error." }, "tools": { - "delegate_work": "Delegate a specific task to one of the following coworkers: {coworkers}\nThe input to this tool should be the coworker, the task you want them to do, and ALL necessary context to execute the task, they know nothing about the task, so share absolute everything you know, don't reference things but instead explain them.", - "ask_question": "Ask a specific question to one of the following coworkers: {coworkers}\nThe input to this tool should be the coworker, the question you have for them, and ALL necessary context to ask the question properly, they know nothing about the question, so share absolute everything you know, don't reference things but instead explain them.", + "delegate_work": "Delegate a specific task to one of the following coworkers: {coworkers}\nThe input to this tool should be the coworker, the task you want them to do, and ALL necessary context to execute the task, they know nothing about the task, so share absolutely everything you know, don't reference things but instead explain them.", + "ask_question": "Ask a specific question to one of the following coworkers: {coworkers}\nThe input to this tool should be the coworker, the question you have for them, and ALL necessary context to ask the question properly, they know nothing about the question, so share absolutely everything you know, don't reference things but instead explain them.", "add_image": { "name": "Add image to content", "description": "See image to understand its content, you can optionally ask a question about the image", From ac9f8b9d5a0d54a39cbd65e42a2a7fc39d522981 Mon Sep 17 00:00:00 2001 From: Vidit Ostwal <110953813+Vidit-Ostwal@users.noreply.github.com> Date: Tue, 25 Feb 2025 22:59:33 +0530 Subject: [PATCH 22/35] Fixed the issue 2123 around memory command with CLI (#2155) * Fixed the issue 2123 around memory command with CLI * Fixed typo, added the recommendations * Fixed Typo * Fixed lint issue * Fixed the print statement to include path as well --------- Co-authored-by: Brandon Hancock (bhancock_ai) <109994880+bhancockio@users.noreply.github.com> --- docs/concepts/memory.mdx | 40 +++++++++++++++++++++++++++++++++++++++- src/crewai/cli/utils.py | 14 ++++++++------ 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/docs/concepts/memory.mdx b/docs/concepts/memory.mdx index ae65db290..298e8814c 100644 --- a/docs/concepts/memory.mdx +++ b/docs/concepts/memory.mdx @@ -506,7 +506,7 @@ my_crew = Crew( ) ``` -### Resetting Memory +### Resetting Memory via cli ```shell crewai reset-memories [OPTIONS] @@ -520,8 +520,46 @@ crewai reset-memories [OPTIONS] | `-s`, `--short` | Reset SHORT TERM memory. | Flag (boolean) | False | | `-e`, `--entities` | Reset ENTITIES memory. | Flag (boolean) | False | | `-k`, `--kickoff-outputs` | Reset LATEST KICKOFF TASK OUTPUTS. | Flag (boolean) | False | +| `-kn`, `--knowledge` | Reset KNOWLEDEGE storage | Flag (boolean) | False | | `-a`, `--all` | Reset ALL memories. | Flag (boolean) | False | +Note: To use the cli command you need to have your crew in a file called crew.py in the same directory. + + + + +### Resetting Memory via crew object + +```python + +my_crew = Crew( + agents=[...], + tasks=[...], + process=Process.sequential, + memory=True, + verbose=True, + embedder={ + "provider": "custom", + "config": { + "embedder": CustomEmbedder() + } + } +) + +my_crew.reset_memories(command_type = 'all') # Resets all the memory +``` + +#### Resetting Memory Options + +| Command Type | Description | +| :----------------- | :------------------------------- | +| `long` | Reset LONG TERM memory. | +| `short` | Reset SHORT TERM memory. | +| `entities` | Reset ENTITIES memory. | +| `kickoff_outputs` | Reset LATEST KICKOFF TASK OUTPUTS. | +| `knowledge` | Reset KNOWLEDGE memory. | +| `all` | Reset ALL memories. | + ## Benefits of Using CrewAI's Memory System diff --git a/src/crewai/cli/utils.py b/src/crewai/cli/utils.py index 60eb2488a..8912036db 100644 --- a/src/crewai/cli/utils.py +++ b/src/crewai/cli/utils.py @@ -257,11 +257,11 @@ def get_crew(crew_path: str = "crew.py", require: bool = False) -> Crew | None: import os for root, _, files in os.walk("."): - if "crew.py" in files: - crew_path = os.path.join(root, "crew.py") + if crew_path in files: + crew_os_path = os.path.join(root, crew_path) try: spec = importlib.util.spec_from_file_location( - "crew_module", crew_path + "crew_module", crew_os_path ) if not spec or not spec.loader: continue @@ -273,9 +273,11 @@ def get_crew(crew_path: str = "crew.py", require: bool = False) -> Crew | None: for attr_name in dir(module): attr = getattr(module, attr_name) try: - if callable(attr) and hasattr(attr, "crew"): - crew_instance = attr().crew() - return crew_instance + if isinstance(attr, Crew) and hasattr(attr, "kickoff"): + print( + f"Found valid crew object in attribute '{attr_name}' at {crew_os_path}." + ) + return attr except Exception as e: print(f"Error processing attribute {attr_name}: {e}") From 9cc759ba32725efec08f19531a548de03141d554 Mon Sep 17 00:00:00 2001 From: Shivtej Narake <75938432+failedanswer@users.noreply.github.com> Date: Wed, 26 Feb 2025 01:49:36 +0530 Subject: [PATCH 23/35] [MINOR]support `ChatOllama` from `langchain_ollama` (#2158) Co-authored-by: Brandon Hancock (bhancock_ai) <109994880+bhancockio@users.noreply.github.com> --- src/crewai/utilities/llm_utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/crewai/utilities/llm_utils.py b/src/crewai/utilities/llm_utils.py index c774a71fb..4d34d789c 100644 --- a/src/crewai/utilities/llm_utils.py +++ b/src/crewai/utilities/llm_utils.py @@ -44,6 +44,7 @@ def create_llm( # Extract attributes with explicit types model = ( getattr(llm_value, "model_name", None) + or getattr(llm_value, "model", None) or getattr(llm_value, "deployment_name", None) or str(llm_value) ) From b4e2db03069fcedbf80eb2130aa91d0cb68b3a43 Mon Sep 17 00:00:00 2001 From: "Brandon Hancock (bhancock_ai)" <109994880+bhancockio@users.noreply.github.com> Date: Tue, 25 Feb 2025 15:29:21 -0500 Subject: [PATCH 24/35] incorporating fix from @misrasaurabh1 with additional type fix (#2213) Co-authored-by: Lorenze Jay <63378463+lorenzejay@users.noreply.github.com> --- src/crewai/flow/utils.py | 92 +++++++++++++++++++++++----------------- 1 file changed, 53 insertions(+), 39 deletions(-) diff --git a/src/crewai/flow/utils.py b/src/crewai/flow/utils.py index c0686222f..81f3c1041 100644 --- a/src/crewai/flow/utils.py +++ b/src/crewai/flow/utils.py @@ -16,7 +16,8 @@ Example import ast import inspect import textwrap -from typing import Any, Dict, List, Optional, Set, Union +from collections import defaultdict, deque +from typing import Any, Deque, Dict, List, Optional, Set, Union def get_possible_return_constants(function: Any) -> Optional[List[str]]: @@ -118,7 +119,7 @@ def calculate_node_levels(flow: Any) -> Dict[str, int]: - Processes router paths separately """ levels: Dict[str, int] = {} - queue: List[str] = [] + queue: Deque[str] = deque() visited: Set[str] = set() pending_and_listeners: Dict[str, Set[str]] = {} @@ -128,28 +129,35 @@ def calculate_node_levels(flow: Any) -> Dict[str, int]: levels[method_name] = 0 queue.append(method_name) + # Precompute listener dependencies + or_listeners = defaultdict(list) + and_listeners = defaultdict(set) + for listener_name, (condition_type, trigger_methods) in flow._listeners.items(): + if condition_type == "OR": + for method in trigger_methods: + or_listeners[method].append(listener_name) + elif condition_type == "AND": + and_listeners[listener_name] = set(trigger_methods) + # Breadth-first traversal to assign levels while queue: - current = queue.pop(0) + current = queue.popleft() current_level = levels[current] visited.add(current) - for listener_name, (condition_type, trigger_methods) in flow._listeners.items(): - if condition_type == "OR": - if current in trigger_methods: - if ( - listener_name not in levels - or levels[listener_name] > current_level + 1 - ): - levels[listener_name] = current_level + 1 - if listener_name not in visited: - queue.append(listener_name) - elif condition_type == "AND": + for listener_name in or_listeners[current]: + if listener_name not in levels or levels[listener_name] > current_level + 1: + levels[listener_name] = current_level + 1 + if listener_name not in visited: + queue.append(listener_name) + + for listener_name, required_methods in and_listeners.items(): + if current in required_methods: if listener_name not in pending_and_listeners: pending_and_listeners[listener_name] = set() - if current in trigger_methods: - pending_and_listeners[listener_name].add(current) - if set(trigger_methods) == pending_and_listeners[listener_name]: + pending_and_listeners[listener_name].add(current) + + if required_methods == pending_and_listeners[listener_name]: if ( listener_name not in levels or levels[listener_name] > current_level + 1 @@ -159,22 +167,7 @@ def calculate_node_levels(flow: Any) -> Dict[str, int]: queue.append(listener_name) # Handle router connections - if current in flow._routers: - router_method_name = current - paths = flow._router_paths.get(router_method_name, []) - for path in paths: - for listener_name, ( - condition_type, - trigger_methods, - ) in flow._listeners.items(): - if path in trigger_methods: - if ( - listener_name not in levels - or levels[listener_name] > current_level + 1 - ): - levels[listener_name] = current_level + 1 - if listener_name not in visited: - queue.append(listener_name) + process_router_paths(flow, current, current_level, levels, queue) return levels @@ -227,10 +220,7 @@ def build_ancestor_dict(flow: Any) -> Dict[str, Set[str]]: def dfs_ancestors( - node: str, - ancestors: Dict[str, Set[str]], - visited: Set[str], - flow: Any + node: str, ancestors: Dict[str, Set[str]], visited: Set[str], flow: Any ) -> None: """ Perform depth-first search to build ancestor relationships. @@ -274,7 +264,9 @@ def dfs_ancestors( dfs_ancestors(listener_name, ancestors, visited, flow) -def is_ancestor(node: str, ancestor_candidate: str, ancestors: Dict[str, Set[str]]) -> bool: +def is_ancestor( + node: str, ancestor_candidate: str, ancestors: Dict[str, Set[str]] +) -> bool: """ Check if one node is an ancestor of another. @@ -339,7 +331,9 @@ def build_parent_children_dict(flow: Any) -> Dict[str, List[str]]: return parent_children -def get_child_index(parent: str, child: str, parent_children: Dict[str, List[str]]) -> int: +def get_child_index( + parent: str, child: str, parent_children: Dict[str, List[str]] +) -> int: """ Get the index of a child node in its parent's sorted children list. @@ -360,3 +354,23 @@ def get_child_index(parent: str, child: str, parent_children: Dict[str, List[str children = parent_children.get(parent, []) children.sort() return children.index(child) + + +def process_router_paths(flow, current, current_level, levels, queue): + """ + Handle the router connections for the current node. + """ + if current in flow._routers: + paths = flow._router_paths.get(current, []) + for path in paths: + for listener_name, ( + condition_type, + trigger_methods, + ) in flow._listeners.items(): + if path in trigger_methods: + if ( + listener_name not in levels + or levels[listener_name] > current_level + 1 + ): + levels[listener_name] = current_level + 1 + queue.append(listener_name) From e3c5c174eeabd637637687b3b9dbb57605ff2d09 Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Tue, 25 Feb 2025 15:32:14 -0500 Subject: [PATCH 25/35] feat: add context window size for o3-mini model (#2192) * feat: add context window size for o3-mini model Fixes #2191 Co-Authored-By: Joe Moura * feat: add context window validation and tests - Add validation for context window size bounds (1024-2097152) - Add test for context window validation - Fix test import error Co-Authored-By: Joe Moura * style: fix import sorting in llm_test.py Co-Authored-By: Joe Moura --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Joe Moura Co-authored-by: Brandon Hancock (bhancock_ai) <109994880+bhancockio@users.noreply.github.com> --- src/crewai/llm.py | 14 ++++++++++++++ tests/llm_test.py | 19 ++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/crewai/llm.py b/src/crewai/llm.py index 2eefa8934..0c8a46214 100644 --- a/src/crewai/llm.py +++ b/src/crewai/llm.py @@ -64,6 +64,7 @@ LLM_CONTEXT_WINDOW_SIZES = { "gpt-4-turbo": 128000, "o1-preview": 128000, "o1-mini": 128000, + "o3-mini": 200000, # Based on official o3-mini specifications # gemini "gemini-2.0-flash": 1048576, "gemini-1.5-pro": 2097152, @@ -485,10 +486,23 @@ class LLM: """ Returns the context window size, using 75% of the maximum to avoid cutting off messages mid-thread. + + Raises: + ValueError: If a model's context window size is outside valid bounds (1024-2097152) """ if self.context_window_size != 0: return self.context_window_size + MIN_CONTEXT = 1024 + MAX_CONTEXT = 2097152 # Current max from gemini-1.5-pro + + # Validate all context window sizes + for key, value in LLM_CONTEXT_WINDOW_SIZES.items(): + if value < MIN_CONTEXT or value > MAX_CONTEXT: + raise ValueError( + f"Context window for {key} must be between {MIN_CONTEXT} and {MAX_CONTEXT}" + ) + self.context_window_size = int( DEFAULT_CONTEXT_WINDOW_SIZE * CONTEXT_WINDOW_USAGE_RATIO ) diff --git a/tests/llm_test.py b/tests/llm_test.py index 00bb69aa5..61aa1aced 100644 --- a/tests/llm_test.py +++ b/tests/llm_test.py @@ -6,7 +6,7 @@ import pytest from pydantic import BaseModel from crewai.agents.agent_builder.utilities.base_token_process import TokenProcess -from crewai.llm import LLM +from crewai.llm import CONTEXT_WINDOW_USAGE_RATIO, LLM from crewai.utilities.events import crewai_event_bus from crewai.utilities.events.tool_usage_events import ToolExecutionErrorEvent from crewai.utilities.token_counter_callback import TokenCalcHandler @@ -285,6 +285,23 @@ def test_o3_mini_reasoning_effort_medium(): assert isinstance(result, str) assert "Paris" in result +def test_context_window_validation(): + """Test that context window validation works correctly.""" + # Test valid window size + llm = LLM(model="o3-mini") + assert llm.get_context_window_size() == int(200000 * CONTEXT_WINDOW_USAGE_RATIO) + + # Test invalid window size + with pytest.raises(ValueError) as excinfo: + with patch.dict( + "crewai.llm.LLM_CONTEXT_WINDOW_SIZES", + {"test-model": 500}, # Below minimum + clear=True, + ): + llm = LLM(model="test-model") + llm.get_context_window_size() + assert "must be between 1024 and 2097152" in str(excinfo.value) + @pytest.mark.vcr(filter_headers=["authorization"]) @pytest.fixture From 34d299345677c7ce26b1368f240c559596526fa7 Mon Sep 17 00:00:00 2001 From: Fernando Galves <157684778+cardofe@users.noreply.github.com> Date: Tue, 25 Feb 2025 21:39:23 +0100 Subject: [PATCH 26/35] Update the constants.py file adding the list of foundation models available in Amazon Bedrock (#2170) * Update constants.py This PR updates the list of foundation models available in Amazon Bedrock to reflect the latest offerings. * Update constants.py with inference profiles Add the cross-region inference profiles to increase throughput and improve resiliency by routing your requests across multiple AWS Regions during peak utilization bursts. * Update constants.py Fix the model order --------- Co-authored-by: Brandon Hancock (bhancock_ai) <109994880+bhancockio@users.noreply.github.com> --- src/crewai/cli/constants.py | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/src/crewai/cli/constants.py b/src/crewai/cli/constants.py index b97b4f208..fec0b6384 100644 --- a/src/crewai/cli/constants.py +++ b/src/crewai/cli/constants.py @@ -216,10 +216,43 @@ MODELS = { "watsonx/ibm/granite-3-8b-instruct", ], "bedrock": [ + "bedrock/us.amazon.nova-pro-v1:0", + "bedrock/us.amazon.nova-micro-v1:0", + "bedrock/us.amazon.nova-lite-v1:0", + "bedrock/us.anthropic.claude-3-5-sonnet-20240620-v1:0", + "bedrock/us.anthropic.claude-3-5-haiku-20241022-v1:0", + "bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0", + "bedrock/us.anthropic.claude-3-7-sonnet-20250219-v1:0", + "bedrock/us.anthropic.claude-3-sonnet-20240229-v1:0", + "bedrock/us.anthropic.claude-3-opus-20240229-v1:0", + "bedrock/us.anthropic.claude-3-haiku-20240307-v1:0", + "bedrock/us.meta.llama3-2-11b-instruct-v1:0", + "bedrock/us.meta.llama3-2-3b-instruct-v1:0", + "bedrock/us.meta.llama3-2-90b-instruct-v1:0", + "bedrock/us.meta.llama3-2-1b-instruct-v1:0", + "bedrock/us.meta.llama3-1-8b-instruct-v1:0", + "bedrock/us.meta.llama3-1-70b-instruct-v1:0", + "bedrock/us.meta.llama3-3-70b-instruct-v1:0", + "bedrock/us.meta.llama3-1-405b-instruct-v1:0", + "bedrock/eu.anthropic.claude-3-5-sonnet-20240620-v1:0", + "bedrock/eu.anthropic.claude-3-sonnet-20240229-v1:0", + "bedrock/eu.anthropic.claude-3-haiku-20240307-v1:0", + "bedrock/eu.meta.llama3-2-3b-instruct-v1:0", + "bedrock/eu.meta.llama3-2-1b-instruct-v1:0", + "bedrock/apac.anthropic.claude-3-5-sonnet-20240620-v1:0", + "bedrock/apac.anthropic.claude-3-5-sonnet-20241022-v2:0", + "bedrock/apac.anthropic.claude-3-sonnet-20240229-v1:0", + "bedrock/apac.anthropic.claude-3-haiku-20240307-v1:0", + "bedrock/amazon.nova-pro-v1:0", + "bedrock/amazon.nova-micro-v1:0", + "bedrock/amazon.nova-lite-v1:0", "bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + "bedrock/anthropic.claude-3-5-haiku-20241022-v1:0", + "bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0", + "bedrock/anthropic.claude-3-7-sonnet-20250219-v1:0", "bedrock/anthropic.claude-3-sonnet-20240229-v1:0", - "bedrock/anthropic.claude-3-haiku-20240307-v1:0", "bedrock/anthropic.claude-3-opus-20240229-v1:0", + "bedrock/anthropic.claude-3-haiku-20240307-v1:0", "bedrock/anthropic.claude-v2:1", "bedrock/anthropic.claude-v2", "bedrock/anthropic.claude-instant-v1", @@ -234,8 +267,6 @@ MODELS = { "bedrock/ai21.j2-mid-v1", "bedrock/ai21.j2-ultra-v1", "bedrock/ai21.jamba-instruct-v1:0", - "bedrock/meta.llama2-13b-chat-v1", - "bedrock/meta.llama2-70b-chat-v1", "bedrock/mistral.mistral-7b-instruct-v0:2", "bedrock/mistral.mixtral-8x7b-instruct-v0:1", ], From 1e8ee247ca9ace781047e396afac3466cc6ad49d Mon Sep 17 00:00:00 2001 From: Lorenze Jay <63378463+lorenzejay@users.noreply.github.com> Date: Wed, 26 Feb 2025 09:10:43 -0800 Subject: [PATCH 27/35] feat: Enhance agent knowledge setup with optional crew embedder (#2232) - Modify `Agent` class to add `set_knowledge` method - Allow setting embedder from crew-level configuration - Remove `_set_knowledge` method from initialization - Update `Crew` class to set agent knowledge during agent setup - Add default implementation in `BaseAgent` for compatibility --- src/crewai/agent.py | 6 ++++-- src/crewai/agents/agent_builder/base_agent.py | 3 +++ src/crewai/crew.py | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/crewai/agent.py b/src/crewai/agent.py index f07408133..cfebc18e5 100644 --- a/src/crewai/agent.py +++ b/src/crewai/agent.py @@ -114,7 +114,6 @@ class Agent(BaseAgent): @model_validator(mode="after") def post_init_setup(self): - self._set_knowledge() self.agent_ops_agent_name = self.role self.llm = create_llm(self.llm) @@ -134,8 +133,11 @@ class Agent(BaseAgent): self.cache_handler = CacheHandler() self.set_cache_handler(self.cache_handler) - def _set_knowledge(self): + def set_knowledge(self, crew_embedder: Optional[Dict[str, Any]] = None): try: + if self.embedder is None and crew_embedder: + self.embedder = crew_embedder + if self.knowledge_sources: full_pattern = re.compile(r"[^a-zA-Z0-9\-_\r\n]|(\.\.)") knowledge_agent_name = f"{re.sub(full_pattern, '_', self.role)}" diff --git a/src/crewai/agents/agent_builder/base_agent.py b/src/crewai/agents/agent_builder/base_agent.py index 64110c2ae..f39fafb99 100644 --- a/src/crewai/agents/agent_builder/base_agent.py +++ b/src/crewai/agents/agent_builder/base_agent.py @@ -351,3 +351,6 @@ class BaseAgent(ABC, BaseModel): if not self._rpm_controller: self._rpm_controller = rpm_controller self.create_agent_executor() + + def set_knowledge(self, crew_embedder: Optional[Dict[str, Any]] = None): + pass diff --git a/src/crewai/crew.py b/src/crewai/crew.py index cf627700e..9cecfed3a 100644 --- a/src/crewai/crew.py +++ b/src/crewai/crew.py @@ -600,6 +600,7 @@ class Crew(BaseModel): agent.i18n = i18n # type: ignore[attr-defined] # Argument 1 to "_interpolate_inputs" of "Crew" has incompatible type "dict[str, Any] | None"; expected "dict[str, Any]" agent.crew = self # type: ignore[attr-defined] + agent.set_knowledge(crew_embedder=self.embedder) # TODO: Create an AgentFunctionCalling protocol for future refactoring if not agent.function_calling_llm: # type: ignore # "BaseAgent" has no attribute "function_calling_llm" agent.function_calling_llm = self.function_calling_llm # type: ignore # "BaseAgent" has no attribute "function_calling_llm" From 8fedbe49cb6d7b06ade3fa9cd0e00a076b3c4bcb Mon Sep 17 00:00:00 2001 From: "Brandon Hancock (bhancock_ai)" <109994880+bhancockio@users.noreply.github.com> Date: Wed, 26 Feb 2025 13:24:31 -0500 Subject: [PATCH 28/35] Add support for python 3.10 (#2230) --- src/crewai/flow/persistence/sqlite.py | 39 +++++++++++++++++---------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/src/crewai/flow/persistence/sqlite.py b/src/crewai/flow/persistence/sqlite.py index 7a6f134fa..21e906afd 100644 --- a/src/crewai/flow/persistence/sqlite.py +++ b/src/crewai/flow/persistence/sqlite.py @@ -4,7 +4,7 @@ SQLite-based implementation of flow state persistence. import json import sqlite3 -from datetime import datetime +from datetime import datetime, timezone from pathlib import Path from typing import Any, Dict, Optional, Union @@ -34,6 +34,7 @@ class SQLiteFlowPersistence(FlowPersistence): ValueError: If db_path is invalid """ from crewai.utilities.paths import db_storage_path + # Get path from argument or default location path = db_path or str(Path(db_storage_path()) / "flow_states.db") @@ -46,7 +47,8 @@ class SQLiteFlowPersistence(FlowPersistence): def init_db(self) -> None: """Create the necessary tables if they don't exist.""" with sqlite3.connect(self.db_path) as conn: - conn.execute(""" + conn.execute( + """ CREATE TABLE IF NOT EXISTS flow_states ( id INTEGER PRIMARY KEY AUTOINCREMENT, flow_uuid TEXT NOT NULL, @@ -54,12 +56,15 @@ class SQLiteFlowPersistence(FlowPersistence): timestamp DATETIME NOT NULL, state_json TEXT NOT NULL ) - """) + """ + ) # Add index for faster UUID lookups - conn.execute(""" + conn.execute( + """ CREATE INDEX IF NOT EXISTS idx_flow_states_uuid ON flow_states(flow_uuid) - """) + """ + ) def save_state( self, @@ -85,19 +90,22 @@ class SQLiteFlowPersistence(FlowPersistence): ) with sqlite3.connect(self.db_path) as conn: - conn.execute(""" + conn.execute( + """ INSERT INTO flow_states ( flow_uuid, method_name, timestamp, state_json ) VALUES (?, ?, ?, ?) - """, ( - flow_uuid, - method_name, - datetime.utcnow().isoformat(), - json.dumps(state_dict), - )) + """, + ( + flow_uuid, + method_name, + datetime.now(timezone.utc).isoformat(), + json.dumps(state_dict), + ), + ) def load_state(self, flow_uuid: str) -> Optional[Dict[str, Any]]: """Load the most recent state for a given flow UUID. @@ -109,13 +117,16 @@ class SQLiteFlowPersistence(FlowPersistence): The most recent state as a dictionary, or None if no state exists """ with sqlite3.connect(self.db_path) as conn: - cursor = conn.execute(""" + cursor = conn.execute( + """ SELECT state_json FROM flow_states WHERE flow_uuid = ? ORDER BY id DESC LIMIT 1 - """, (flow_uuid,)) + """, + (flow_uuid,), + ) row = cursor.fetchone() if row: From fbf87327841dd7b92bb04a23fd1575881a3ad3fa Mon Sep 17 00:00:00 2001 From: "Brandon Hancock (bhancock_ai)" <109994880+bhancockio@users.noreply.github.com> Date: Wed, 26 Feb 2025 13:27:41 -0500 Subject: [PATCH 29/35] Fix type issue (#2224) Co-authored-by: Lorenze Jay <63378463+lorenzejay@users.noreply.github.com> --- src/crewai/utilities/token_counter_callback.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/crewai/utilities/token_counter_callback.py b/src/crewai/utilities/token_counter_callback.py index e612fcae4..7037ad5c4 100644 --- a/src/crewai/utilities/token_counter_callback.py +++ b/src/crewai/utilities/token_counter_callback.py @@ -30,8 +30,14 @@ class TokenCalcHandler(CustomLogger): if hasattr(usage, "prompt_tokens"): self.token_cost_process.sum_prompt_tokens(usage.prompt_tokens) if hasattr(usage, "completion_tokens"): - self.token_cost_process.sum_completion_tokens(usage.completion_tokens) - if hasattr(usage, "prompt_tokens_details") and usage.prompt_tokens_details: + self.token_cost_process.sum_completion_tokens( + usage.completion_tokens + ) + if ( + hasattr(usage, "prompt_tokens_details") + and usage.prompt_tokens_details + and usage.prompt_tokens_details.cached_tokens + ): self.token_cost_process.sum_cached_prompt_tokens( usage.prompt_tokens_details.cached_tokens ) From b58253caccf0f2ca07cb75e30321147b42d67be7 Mon Sep 17 00:00:00 2001 From: "Brandon Hancock (bhancock_ai)" <109994880+bhancockio@users.noreply.github.com> Date: Wed, 26 Feb 2025 13:42:17 -0500 Subject: [PATCH 30/35] Support multiple router calls and address issue #2175 (#2231) Co-authored-by: Lorenze Jay <63378463+lorenzejay@users.noreply.github.com> --- src/crewai/flow/flow.py | 42 ++++++++++------- tests/flow_test.py | 101 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+), 16 deletions(-) diff --git a/src/crewai/flow/flow.py b/src/crewai/flow/flow.py index 7a8b88ba0..3b6e81293 100644 --- a/src/crewai/flow/flow.py +++ b/src/crewai/flow/flow.py @@ -894,35 +894,45 @@ class Flow(Generic[T], metaclass=FlowMeta): Notes ----- - Routers are executed sequentially to maintain flow control - - Each router's result becomes the new trigger_method + - Each router's result becomes a new trigger_method - Normal listeners are executed in parallel for efficiency - Listeners can receive the trigger method's result as a parameter """ # First, handle routers repeatedly until no router triggers anymore + router_results = [] + current_trigger = trigger_method + while True: routers_triggered = self._find_triggered_methods( - trigger_method, router_only=True + current_trigger, router_only=True ) if not routers_triggered: break + for router_name in routers_triggered: await self._execute_single_listener(router_name, result) # After executing router, the router's result is the path - # The last router executed sets the trigger_method - # The router result is the last element in self._method_outputs - trigger_method = self._method_outputs[-1] + router_result = self._method_outputs[-1] + if router_result: # Only add non-None results + router_results.append(router_result) + current_trigger = ( + router_result # Update for next iteration of router chain + ) - # Now that no more routers are triggered by current trigger_method, - # execute normal listeners - listeners_triggered = self._find_triggered_methods( - trigger_method, router_only=False - ) - if listeners_triggered: - tasks = [ - self._execute_single_listener(listener_name, result) - for listener_name in listeners_triggered - ] - await asyncio.gather(*tasks) + # Now execute normal listeners for all router results and the original trigger + all_triggers = [trigger_method] + router_results + + for current_trigger in all_triggers: + if current_trigger: # Skip None results + listeners_triggered = self._find_triggered_methods( + current_trigger, router_only=False + ) + if listeners_triggered: + tasks = [ + self._execute_single_listener(listener_name, result) + for listener_name in listeners_triggered + ] + await asyncio.gather(*tasks) def _find_triggered_methods( self, trigger_method: str, router_only: bool diff --git a/tests/flow_test.py b/tests/flow_test.py index b2edcfa5a..c2640fffb 100644 --- a/tests/flow_test.py +++ b/tests/flow_test.py @@ -654,3 +654,104 @@ def test_flow_plotting(): assert isinstance(received_events[0], FlowPlotEvent) assert received_events[0].flow_name == "StatelessFlow" assert isinstance(received_events[0].timestamp, datetime) + + +def test_multiple_routers_from_same_trigger(): + """Test that multiple routers triggered by the same method all activate their listeners.""" + execution_order = [] + + class MultiRouterFlow(Flow): + def __init__(self): + super().__init__() + # Set diagnosed conditions to trigger all routers + self.state["diagnosed_conditions"] = "DHA" # Contains D, H, and A + + @start() + def scan_medical(self): + execution_order.append("scan_medical") + return "scan_complete" + + @router(scan_medical) + def diagnose_conditions(self): + execution_order.append("diagnose_conditions") + return "diagnosis_complete" + + @router(diagnose_conditions) + def diabetes_router(self): + execution_order.append("diabetes_router") + if "D" in self.state["diagnosed_conditions"]: + return "diabetes" + return None + + @listen("diabetes") + def diabetes_analysis(self): + execution_order.append("diabetes_analysis") + return "diabetes_analysis_complete" + + @router(diagnose_conditions) + def hypertension_router(self): + execution_order.append("hypertension_router") + if "H" in self.state["diagnosed_conditions"]: + return "hypertension" + return None + + @listen("hypertension") + def hypertension_analysis(self): + execution_order.append("hypertension_analysis") + return "hypertension_analysis_complete" + + @router(diagnose_conditions) + def anemia_router(self): + execution_order.append("anemia_router") + if "A" in self.state["diagnosed_conditions"]: + return "anemia" + return None + + @listen("anemia") + def anemia_analysis(self): + execution_order.append("anemia_analysis") + return "anemia_analysis_complete" + + flow = MultiRouterFlow() + flow.kickoff() + + # Verify all methods were called + assert "scan_medical" in execution_order + assert "diagnose_conditions" in execution_order + + # Verify all routers were called + assert "diabetes_router" in execution_order + assert "hypertension_router" in execution_order + assert "anemia_router" in execution_order + + # Verify all listeners were called - this is the key test for the fix + assert "diabetes_analysis" in execution_order + assert "hypertension_analysis" in execution_order + assert "anemia_analysis" in execution_order + + # Verify execution order constraints + assert execution_order.index("diagnose_conditions") > execution_order.index( + "scan_medical" + ) + + # All routers should execute after diagnose_conditions + assert execution_order.index("diabetes_router") > execution_order.index( + "diagnose_conditions" + ) + assert execution_order.index("hypertension_router") > execution_order.index( + "diagnose_conditions" + ) + assert execution_order.index("anemia_router") > execution_order.index( + "diagnose_conditions" + ) + + # All analyses should execute after their respective routers + assert execution_order.index("diabetes_analysis") > execution_order.index( + "diabetes_router" + ) + assert execution_order.index("hypertension_analysis") > execution_order.index( + "hypertension_router" + ) + assert execution_order.index("anemia_analysis") > execution_order.index( + "anemia_router" + ) From b9b625a70d20ee477f88c08ec28b9d60fd592776 Mon Sep 17 00:00:00 2001 From: "Brandon Hancock (bhancock_ai)" <109994880+bhancockio@users.noreply.github.com> Date: Wed, 26 Feb 2025 14:51:46 -0500 Subject: [PATCH 31/35] Improve extract thought (#2223) Co-authored-by: Lorenze Jay <63378463+lorenzejay@users.noreply.github.com> --- src/crewai/agents/parser.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/crewai/agents/parser.py b/src/crewai/agents/parser.py index 71444a20a..1bda4df5c 100644 --- a/src/crewai/agents/parser.py +++ b/src/crewai/agents/parser.py @@ -124,14 +124,15 @@ class CrewAgentParser: ) def _extract_thought(self, text: str) -> str: - regex = r"(.*?)(?:\n\nAction|\n\nFinal Answer)" - thought_match = re.search(regex, text, re.DOTALL) - if thought_match: - thought = thought_match.group(1).strip() - # Remove any triple backticks from the thought string - thought = thought.replace("```", "").strip() - return thought - return "" + thought_index = text.find("\n\nAction") + if thought_index == -1: + thought_index = text.find("\n\nFinal Answer") + if thought_index == -1: + return "" + thought = text[:thought_index].strip() + # Remove any triple backticks from the thought string + thought = thought.replace("```", "").strip() + return thought def _clean_action(self, text: str) -> str: """Clean action string by removing non-essential formatting characters.""" From 66c66e3d84fbd319f1d1a3a3bb3963e3aa95159a Mon Sep 17 00:00:00 2001 From: "Brandon Hancock (bhancock_ai)" <109994880+bhancockio@users.noreply.github.com> Date: Wed, 26 Feb 2025 15:21:36 -0500 Subject: [PATCH 32/35] Update docs (#2226) --- docs/concepts/cli.mdx | 9 ++-- docs/concepts/flows.mdx | 35 ++++++++++++- src/crewai/cli/cli.py | 1 - src/crewai/cli/run_crew.py | 68 +++++++++++++++++++++---- src/crewai/cli/templates/flow/README.md | 4 +- 5 files changed, 98 insertions(+), 19 deletions(-) diff --git a/docs/concepts/cli.mdx b/docs/concepts/cli.mdx index 4c9f617ba..ecdcd0836 100644 --- a/docs/concepts/cli.mdx +++ b/docs/concepts/cli.mdx @@ -136,17 +136,21 @@ crewai test -n 5 -m gpt-3.5-turbo ### 8. Run -Run the crew. +Run the crew or flow. ```shell Terminal crewai run ``` + + +Starting from version 0.103.0, the `crewai run` command can be used to run both standard crews and flows. For flows, it automatically detects the type from pyproject.toml and runs the appropriate command. This is now the recommended way to run both crews and flows. + + Make sure to run these commands from the directory where your CrewAI project is set up. Some commands may require additional configuration or setup within your project structure. - ### 9. Chat Starting in version `0.98.0`, when you run the `crewai chat` command, you start an interactive session with your crew. The AI assistant will guide you by asking for necessary inputs to execute the crew. Once all inputs are provided, the crew will execute its tasks. @@ -175,7 +179,6 @@ def crew(self) -> Crew: ``` - ### 10. API Keys When running ```crewai create crew``` command, the CLI will first show you the top 5 most common LLM providers and ask you to select one. diff --git a/docs/concepts/flows.mdx b/docs/concepts/flows.mdx index c22a619fe..8ab99ec01 100644 --- a/docs/concepts/flows.mdx +++ b/docs/concepts/flows.mdx @@ -150,12 +150,12 @@ final_output = flow.kickoff() print("---- Final Output ----") print(final_output) -```` +``` ```text Output ---- Final Output ---- Second method received: Output from first_method -```` +``` @@ -738,3 +738,34 @@ Also, check out our YouTube video on how to use flows in CrewAI below! referrerpolicy="strict-origin-when-cross-origin" allowfullscreen > + +## Running Flows + +There are two ways to run a flow: + +### Using the Flow API + +You can run a flow programmatically by creating an instance of your flow class and calling the `kickoff()` method: + +```python +flow = ExampleFlow() +result = flow.kickoff() +``` + +### Using the CLI + +Starting from version 0.103.0, you can run flows using the `crewai run` command: + +```shell +crewai run +``` + +This command automatically detects if your project is a flow (based on the `type = "flow"` setting in your pyproject.toml) and runs it accordingly. This is the recommended way to run flows from the command line. + +For backward compatibility, you can also use: + +```shell +crewai flow kickoff +``` + +However, the `crewai run` command is now the preferred method as it works for both crews and flows. diff --git a/src/crewai/cli/cli.py b/src/crewai/cli/cli.py index 761cc52ad..b2d59adbe 100644 --- a/src/crewai/cli/cli.py +++ b/src/crewai/cli/cli.py @@ -203,7 +203,6 @@ def install(context): @crewai.command() def run(): """Run the Crew.""" - click.echo("Running the Crew") run_crew() diff --git a/src/crewai/cli/run_crew.py b/src/crewai/cli/run_crew.py index 95b560109..62241a4b5 100644 --- a/src/crewai/cli/run_crew.py +++ b/src/crewai/cli/run_crew.py @@ -1,4 +1,6 @@ import subprocess +from enum import Enum +from typing import List, Optional import click from packaging import version @@ -7,16 +9,24 @@ from crewai.cli.utils import read_toml from crewai.cli.version import get_crewai_version +class CrewType(Enum): + STANDARD = "standard" + FLOW = "flow" + + def run_crew() -> None: """ - Run the crew by running a command in the UV environment. + Run the crew or flow by running a command in the UV environment. + + Starting from version 0.103.0, this command can be used to run both + standard crews and flows. For flows, it detects the type from pyproject.toml + and automatically runs the appropriate command. """ - command = ["uv", "run", "run_crew"] crewai_version = get_crewai_version() min_required_version = "0.71.0" - pyproject_data = read_toml() + # Check for legacy poetry configuration if pyproject_data.get("tool", {}).get("poetry") and ( version.parse(crewai_version) < version.parse(min_required_version) ): @@ -26,18 +36,54 @@ def run_crew() -> None: fg="red", ) + # Determine crew type + is_flow = pyproject_data.get("tool", {}).get("crewai", {}).get("type") == "flow" + crew_type = CrewType.FLOW if is_flow else CrewType.STANDARD + + # Display appropriate message + click.echo(f"Running the {'Flow' if is_flow else 'Crew'}") + + # Execute the appropriate command + execute_command(crew_type) + + +def execute_command(crew_type: CrewType) -> None: + """ + Execute the appropriate command based on crew type. + + Args: + crew_type: The type of crew to run + """ + command = ["uv", "run", "kickoff" if crew_type == CrewType.FLOW else "run_crew"] + try: subprocess.run(command, capture_output=False, text=True, check=True) except subprocess.CalledProcessError as e: - click.echo(f"An error occurred while running the crew: {e}", err=True) - click.echo(e.output, err=True, nl=True) - - if pyproject_data.get("tool", {}).get("poetry"): - click.secho( - "It's possible that you are using an old version of crewAI that uses poetry, please run `crewai update` to update your pyproject.toml to use uv.", - fg="yellow", - ) + handle_error(e, crew_type) except Exception as e: click.echo(f"An unexpected error occurred: {e}", err=True) + + +def handle_error(error: subprocess.CalledProcessError, crew_type: CrewType) -> None: + """ + Handle subprocess errors with appropriate messaging. + + Args: + error: The subprocess error that occurred + crew_type: The type of crew that was being run + """ + entity_type = "flow" if crew_type == CrewType.FLOW else "crew" + click.echo(f"An error occurred while running the {entity_type}: {error}", err=True) + + if error.output: + click.echo(error.output, err=True, nl=True) + + pyproject_data = read_toml() + if pyproject_data.get("tool", {}).get("poetry"): + click.secho( + "It's possible that you are using an old version of crewAI that uses poetry, " + "please run `crewai update` to update your pyproject.toml to use uv.", + fg="yellow", + ) diff --git a/src/crewai/cli/templates/flow/README.md b/src/crewai/cli/templates/flow/README.md index b6ce2da71..140834e62 100644 --- a/src/crewai/cli/templates/flow/README.md +++ b/src/crewai/cli/templates/flow/README.md @@ -30,13 +30,13 @@ crewai install ## Running the Project -To kickstart your crew of AI agents and begin task execution, run this from the root folder of your project: +To kickstart your flow and begin execution, run this from the root folder of your project: ```bash crewai run ``` -This command initializes the {{name}} Crew, assembling the agents and assigning them tasks as defined in your configuration. +This command initializes the {{name}} Flow as defined in your configuration. This example, unmodified, will run the create a `report.md` file with the output of a research on LLMs in the root folder. From ed0490112bf1f7b7504aacc015c27a7694ebf4d2 Mon Sep 17 00:00:00 2001 From: "Brandon Hancock (bhancock_ai)" <109994880+bhancockio@users.noreply.github.com> Date: Thu, 27 Feb 2025 13:32:16 -0500 Subject: [PATCH 33/35] explain how to use event listener (#2245) --- docs/concepts/event-listner.mdx | 349 ++++++++++++++++++++++++++++++++ 1 file changed, 349 insertions(+) create mode 100644 docs/concepts/event-listner.mdx diff --git a/docs/concepts/event-listner.mdx b/docs/concepts/event-listner.mdx new file mode 100644 index 000000000..7fdeec485 --- /dev/null +++ b/docs/concepts/event-listner.mdx @@ -0,0 +1,349 @@ +--- +title: 'Event Listeners' +description: 'Tap into CrewAI events to build custom integrations and monitoring' +--- + +# Event Listeners + +CrewAI provides a powerful event system that allows you to listen for and react to various events that occur during the execution of your Crew. This feature enables you to build custom integrations, monitoring solutions, logging systems, or any other functionality that needs to be triggered based on CrewAI's internal events. + +## How It Works + +CrewAI uses an event bus architecture to emit events throughout the execution lifecycle. The event system is built on the following components: + +1. **CrewAIEventsBus**: A singleton event bus that manages event registration and emission +2. **CrewEvent**: Base class for all events in the system +3. **BaseEventListener**: Abstract base class for creating custom event listeners + +When specific actions occur in CrewAI (like a Crew starting execution, an Agent completing a task, or a tool being used), the system emits corresponding events. You can register handlers for these events to execute custom code when they occur. + +## Creating a Custom Event Listener + +To create a custom event listener, you need to: + +1. Create a class that inherits from `BaseEventListener` +2. Implement the `setup_listeners` method +3. Register handlers for the events you're interested in +4. Create an instance of your listener in the appropriate file + +Here's a simple example of a custom event listener class: + +```python +from crewai.utilities.events import ( + CrewKickoffStartedEvent, + CrewKickoffCompletedEvent, + AgentExecutionCompletedEvent, +) +from crewai.utilities.events.base_event_listener import BaseEventListener + +class MyCustomListener(BaseEventListener): + def __init__(self): + super().__init__() + + def setup_listeners(self, crewai_event_bus): + @crewai_event_bus.on(CrewKickoffStartedEvent) + def on_crew_started(source, event): + print(f"Crew '{event.crew_name}' has started execution!") + + @crewai_event_bus.on(CrewKickoffCompletedEvent) + def on_crew_completed(source, event): + print(f"Crew '{event.crew_name}' has completed execution!") + print(f"Output: {event.output}") + + @crewai_event_bus.on(AgentExecutionCompletedEvent) + def on_agent_execution_completed(source, event): + print(f"Agent '{event.agent.role}' completed task") + print(f"Output: {event.output}") +``` + +## Properly Registering Your Listener + +Simply defining your listener class isn't enough. You need to create an instance of it and ensure it's imported in your application. This ensures that: + +1. The event handlers are registered with the event bus +2. The listener instance remains in memory (not garbage collected) +3. The listener is active when events are emitted + +### Option 1: Import and Instantiate in Your Crew or Flow Implementation + +The most important thing is to create an instance of your listener in the file where your Crew or Flow is defined and executed: + +#### For Crew-based Applications + +Create and import your listener at the top of your Crew implementation file: + +```python +# In your crew.py file +from crewai import Agent, Crew, Task +from my_listeners import MyCustomListener + +# Create an instance of your listener +my_listener = MyCustomListener() + +class MyCustomCrew: + # Your crew implementation... + + def crew(self): + return Crew( + agents=[...], + tasks=[...], + # ... + ) +``` + +#### For Flow-based Applications + +Create and import your listener at the top of your Flow implementation file: + +```python +# In your main.py or flow.py file +from crewai.flow import Flow, listen, start +from my_listeners import MyCustomListener + +# Create an instance of your listener +my_listener = MyCustomListener() + +class MyCustomFlow(Flow): + # Your flow implementation... + + @start() + def first_step(self): + # ... +``` + +This ensures that your listener is loaded and active when your Crew or Flow is executed. + +### Option 2: Create a Package for Your Listeners + +For a more structured approach, especially if you have multiple listeners: + +1. Create a package for your listeners: + +``` +my_project/ + ├── listeners/ + │ ├── __init__.py + │ ├── my_custom_listener.py + │ └── another_listener.py +``` + +2. In `my_custom_listener.py`, define your listener class and create an instance: + +```python +# my_custom_listener.py +from crewai.utilities.events.base_event_listener import BaseEventListener +# ... import events ... + +class MyCustomListener(BaseEventListener): + # ... implementation ... + +# Create an instance of your listener +my_custom_listener = MyCustomListener() +``` + +3. In `__init__.py`, import the listener instances to ensure they're loaded: + +```python +# __init__.py +from .my_custom_listener import my_custom_listener +from .another_listener import another_listener + +# Optionally export them if you need to access them elsewhere +__all__ = ['my_custom_listener', 'another_listener'] +``` + +4. Import your listeners package in your Crew or Flow file: + +```python +# In your crew.py or flow.py file +import my_project.listeners # This loads all your listeners + +class MyCustomCrew: + # Your crew implementation... +``` + +This is exactly how CrewAI's built-in `agentops_listener` is registered. In the CrewAI codebase, you'll find: + +```python +# src/crewai/utilities/events/third_party/__init__.py +from .agentops_listener import agentops_listener +``` + +This ensures the `agentops_listener` is loaded when the `crewai.utilities.events` package is imported. + +## Available Event Types + +CrewAI provides a wide range of events that you can listen for: + +### Crew Events + +- **CrewKickoffStartedEvent**: Emitted when a Crew starts execution +- **CrewKickoffCompletedEvent**: Emitted when a Crew completes execution +- **CrewKickoffFailedEvent**: Emitted when a Crew fails to complete execution +- **CrewTestStartedEvent**: Emitted when a Crew starts testing +- **CrewTestCompletedEvent**: Emitted when a Crew completes testing +- **CrewTestFailedEvent**: Emitted when a Crew fails to complete testing +- **CrewTrainStartedEvent**: Emitted when a Crew starts training +- **CrewTrainCompletedEvent**: Emitted when a Crew completes training +- **CrewTrainFailedEvent**: Emitted when a Crew fails to complete training + +### Agent Events + +- **AgentExecutionStartedEvent**: Emitted when an Agent starts executing a task +- **AgentExecutionCompletedEvent**: Emitted when an Agent completes executing a task +- **AgentExecutionErrorEvent**: Emitted when an Agent encounters an error during execution + +### Task Events + +- **TaskStartedEvent**: Emitted when a Task starts execution +- **TaskCompletedEvent**: Emitted when a Task completes execution +- **TaskFailedEvent**: Emitted when a Task fails to complete execution +- **TaskEvaluationEvent**: Emitted when a Task is evaluated + +### Tool Usage Events + +- **ToolUsageStartedEvent**: Emitted when a tool execution is started +- **ToolUsageFinishedEvent**: Emitted when a tool execution is completed +- **ToolUsageErrorEvent**: Emitted when a tool execution encounters an error +- **ToolValidateInputErrorEvent**: Emitted when a tool input validation encounters an error +- **ToolExecutionErrorEvent**: Emitted when a tool execution encounters an error +- **ToolSelectionErrorEvent**: Emitted when there's an error selecting a tool + +### Flow Events + +- **FlowCreatedEvent**: Emitted when a Flow is created +- **FlowStartedEvent**: Emitted when a Flow starts execution +- **FlowFinishedEvent**: Emitted when a Flow completes execution +- **FlowPlotEvent**: Emitted when a Flow is plotted +- **MethodExecutionStartedEvent**: Emitted when a Flow method starts execution +- **MethodExecutionFinishedEvent**: Emitted when a Flow method completes execution +- **MethodExecutionFailedEvent**: Emitted when a Flow method fails to complete execution + +### LLM Events + +- **LLMCallStartedEvent**: Emitted when an LLM call starts +- **LLMCallCompletedEvent**: Emitted when an LLM call completes +- **LLMCallFailedEvent**: Emitted when an LLM call fails + +## Event Handler Structure + +Each event handler receives two parameters: + +1. **source**: The object that emitted the event +2. **event**: The event instance, containing event-specific data + +The structure of the event object depends on the event type, but all events inherit from `CrewEvent` and include: + +- **timestamp**: The time when the event was emitted +- **type**: A string identifier for the event type + +Additional fields vary by event type. For example, `CrewKickoffCompletedEvent` includes `crew_name` and `output` fields. + +## Real-World Example: Integration with AgentOps + +CrewAI includes an example of a third-party integration with [AgentOps](https://github.com/AgentOps-AI/agentops), a monitoring and observability platform for AI agents. Here's how it's implemented: + +```python +from typing import Optional + +from crewai.utilities.events import ( + CrewKickoffCompletedEvent, + ToolUsageErrorEvent, + ToolUsageStartedEvent, +) +from crewai.utilities.events.base_event_listener import BaseEventListener +from crewai.utilities.events.crew_events import CrewKickoffStartedEvent +from crewai.utilities.events.task_events import TaskEvaluationEvent + +try: + import agentops + AGENTOPS_INSTALLED = True +except ImportError: + AGENTOPS_INSTALLED = False + +class AgentOpsListener(BaseEventListener): + tool_event: Optional["agentops.ToolEvent"] = None + session: Optional["agentops.Session"] = None + + def __init__(self): + super().__init__() + + def setup_listeners(self, crewai_event_bus): + if not AGENTOPS_INSTALLED: + return + + @crewai_event_bus.on(CrewKickoffStartedEvent) + def on_crew_kickoff_started(source, event: CrewKickoffStartedEvent): + self.session = agentops.init() + for agent in source.agents: + if self.session: + self.session.create_agent( + name=agent.role, + agent_id=str(agent.id), + ) + + @crewai_event_bus.on(CrewKickoffCompletedEvent) + def on_crew_kickoff_completed(source, event: CrewKickoffCompletedEvent): + if self.session: + self.session.end_session( + end_state="Success", + end_state_reason="Finished Execution", + ) + + @crewai_event_bus.on(ToolUsageStartedEvent) + def on_tool_usage_started(source, event: ToolUsageStartedEvent): + self.tool_event = agentops.ToolEvent(name=event.tool_name) + if self.session: + self.session.record(self.tool_event) + + @crewai_event_bus.on(ToolUsageErrorEvent) + def on_tool_usage_error(source, event: ToolUsageErrorEvent): + agentops.ErrorEvent(exception=event.error, trigger_event=self.tool_event) +``` + +This listener initializes an AgentOps session when a Crew starts, registers agents with AgentOps, tracks tool usage, and ends the session when the Crew completes. + +The AgentOps listener is registered in CrewAI's event system through the import in `src/crewai/utilities/events/third_party/__init__.py`: + +```python +from .agentops_listener import agentops_listener +``` + +This ensures the `agentops_listener` is loaded when the `crewai.utilities.events` package is imported. + +## Advanced Usage: Scoped Handlers + +For temporary event handling (useful for testing or specific operations), you can use the `scoped_handlers` context manager: + +```python +from crewai.utilities.events import crewai_event_bus, CrewKickoffStartedEvent + +with crewai_event_bus.scoped_handlers(): + @crewai_event_bus.on(CrewKickoffStartedEvent) + def temp_handler(source, event): + print("This handler only exists within this context") + + # Do something that emits events + +# Outside the context, the temporary handler is removed +``` + +## Use Cases + +Event listeners can be used for a variety of purposes: + +1. **Logging and Monitoring**: Track the execution of your Crew and log important events +2. **Analytics**: Collect data about your Crew's performance and behavior +3. **Debugging**: Set up temporary listeners to debug specific issues +4. **Integration**: Connect CrewAI with external systems like monitoring platforms, databases, or notification services +5. **Custom Behavior**: Trigger custom actions based on specific events + +## Best Practices + +1. **Keep Handlers Light**: Event handlers should be lightweight and avoid blocking operations +2. **Error Handling**: Include proper error handling in your event handlers to prevent exceptions from affecting the main execution +3. **Cleanup**: If your listener allocates resources, ensure they're properly cleaned up +4. **Selective Listening**: Only listen for events you actually need to handle +5. **Testing**: Test your event listeners in isolation to ensure they behave as expected + +By leveraging CrewAI's event system, you can extend its functionality and integrate it seamlessly with your existing infrastructure. From 7afc531fbb4960b60433628f586f9dd514f42720 Mon Sep 17 00:00:00 2001 From: "Brandon Hancock (bhancock_ai)" <109994880+bhancockio@users.noreply.github.com> Date: Thu, 27 Feb 2025 13:38:21 -0500 Subject: [PATCH 34/35] Improve hierarchical docs (#2244) --- docs/how-to/hierarchical-process.mdx | 52 +++++++++++++++++----------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/docs/how-to/hierarchical-process.mdx b/docs/how-to/hierarchical-process.mdx index 95efa7c3f..3a5115059 100644 --- a/docs/how-to/hierarchical-process.mdx +++ b/docs/how-to/hierarchical-process.mdx @@ -48,7 +48,6 @@ Define a crew with a designated manager and establish a clear chain of command. ```python Code -from langchain_openai import ChatOpenAI from crewai import Crew, Process, Agent # Agents are defined with attributes for backstory, cache, and verbose mode @@ -56,38 +55,51 @@ researcher = Agent( role='Researcher', goal='Conduct in-depth analysis', backstory='Experienced data analyst with a knack for uncovering hidden trends.', - cache=True, - verbose=False, - # tools=[] # This can be optionally specified; defaults to an empty list - use_system_prompt=True, # Enable or disable system prompts for this agent - max_rpm=30, # Limit on the number of requests per minute - max_iter=5 # Maximum number of iterations for a final answer ) writer = Agent( role='Writer', goal='Create engaging content', backstory='Creative writer passionate about storytelling in technical domains.', - cache=True, - verbose=False, - # tools=[] # Optionally specify tools; defaults to an empty list - use_system_prompt=True, # Enable or disable system prompts for this agent - max_rpm=30, # Limit on the number of requests per minute - max_iter=5 # Maximum number of iterations for a final answer ) # Establishing the crew with a hierarchical process and additional configurations project_crew = Crew( tasks=[...], # Tasks to be delegated and executed under the manager's supervision agents=[researcher, writer], - manager_llm=ChatOpenAI(temperature=0, model="gpt-4"), # Mandatory if manager_agent is not set - process=Process.hierarchical, # Specifies the hierarchical management approach - respect_context_window=True, # Enable respect of the context window for tasks - memory=True, # Enable memory usage for enhanced task execution - manager_agent=None, # Optional: explicitly set a specific agent as manager instead of the manager_llm - planning=True, # Enable planning feature for pre-execution strategy + manager_llm="gpt-4o", # Specify which LLM the manager should use + process=Process.hierarchical, + planning=True, ) ``` +### Using a Custom Manager Agent + +Alternatively, you can create a custom manager agent with specific attributes tailored to your project's management needs. This gives you more control over the manager's behavior and capabilities. + +```python +# Define a custom manager agent +manager = Agent( + role="Project Manager", + goal="Efficiently manage the crew and ensure high-quality task completion", + backstory="You're an experienced project manager, skilled in overseeing complex projects and guiding teams to success.", + allow_delegation=True, +) + +# Use the custom manager in your crew +project_crew = Crew( + tasks=[...], + agents=[researcher, writer], + manager_agent=manager, # Use your custom manager agent + process=Process.hierarchical, + planning=True, +) +``` + + + For more details on creating and customizing a manager agent, check out the [Custom Manager Agent documentation](https://docs.crewai.com/how-to/custom-manager-agent#custom-manager-agent). + + + ### Workflow in Action 1. **Task Assignment**: The manager assigns tasks strategically, considering each agent's capabilities and available tools. @@ -97,4 +109,4 @@ project_crew = Crew( ## Conclusion Adopting the hierarchical process in CrewAI, with the correct configurations and understanding of the system's capabilities, facilitates an organized and efficient approach to project management. -Utilize the advanced features and customizations to tailor the workflow to your specific needs, ensuring optimal task execution and project success. \ No newline at end of file +Utilize the advanced features and customizations to tailor the workflow to your specific needs, ensuring optimal task execution and project success. From 86825e176900cbc68e00060adc525f0b8d5920e5 Mon Sep 17 00:00:00 2001 From: Tony Kipkemboi Date: Thu, 27 Feb 2025 13:54:44 -0500 Subject: [PATCH 35/35] docs: add Qdrant vector search tool documentation (#2184) Co-authored-by: Lorenze Jay <63378463+lorenzejay@users.noreply.github.com> Co-authored-by: Brandon Hancock (bhancock_ai) <109994880+bhancockio@users.noreply.github.com> --- docs/mint.json | 1 + docs/tools/qdrantvectorsearchtool.mdx | 271 ++++++++++++++++++++++++++ 2 files changed, 272 insertions(+) create mode 100644 docs/tools/qdrantvectorsearchtool.mdx diff --git a/docs/mint.json b/docs/mint.json index fb0dcfdf5..9b49648aa 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -139,6 +139,7 @@ "tools/nl2sqltool", "tools/pdfsearchtool", "tools/pgsearchtool", + "tools/qdrantvectorsearchtool", "tools/scrapewebsitetool", "tools/seleniumscrapingtool", "tools/spidertool", diff --git a/docs/tools/qdrantvectorsearchtool.mdx b/docs/tools/qdrantvectorsearchtool.mdx new file mode 100644 index 000000000..da3dcb1a2 --- /dev/null +++ b/docs/tools/qdrantvectorsearchtool.mdx @@ -0,0 +1,271 @@ +--- +title: 'Qdrant Vector Search Tool' +description: 'Semantic search capabilities for CrewAI agents using Qdrant vector database' +icon: magnifying-glass-plus +--- + +# `QdrantVectorSearchTool` + +The Qdrant Vector Search Tool enables semantic search capabilities in your CrewAI agents by leveraging [Qdrant](https://qdrant.tech/), a vector similarity search engine. This tool allows your agents to search through documents stored in a Qdrant collection using semantic similarity. + +## Installation + +Install the required packages: + +```bash +uv pip install 'crewai[tools] qdrant-client' +``` + +## Basic Usage + +Here's a minimal example of how to use the tool: + +```python +from crewai import Agent +from crewai_tools import QdrantVectorSearchTool + +# Initialize the tool +qdrant_tool = QdrantVectorSearchTool( + qdrant_url="your_qdrant_url", + qdrant_api_key="your_qdrant_api_key", + collection_name="your_collection" +) + +# Create an agent that uses the tool +agent = Agent( + role="Research Assistant", + goal="Find relevant information in documents", + tools=[qdrant_tool] +) + +# The tool will automatically use OpenAI embeddings +# and return the 3 most relevant results with scores > 0.35 +``` + +## Complete Working Example + +Here's a complete example showing how to: +1. Extract text from a PDF +2. Generate embeddings using OpenAI +3. Store in Qdrant +4. Create a CrewAI agentic RAG workflow for semantic search + +```python +import os +import uuid +import pdfplumber +from openai import OpenAI +from dotenv import load_dotenv +from crewai import Agent, Task, Crew, Process, LLM +from crewai_tools import QdrantVectorSearchTool +from qdrant_client import QdrantClient +from qdrant_client.models import PointStruct, Distance, VectorParams + +# Load environment variables +load_dotenv() + +# Initialize OpenAI client +client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) + +# Extract text from PDF +def extract_text_from_pdf(pdf_path): + text = [] + with pdfplumber.open(pdf_path) as pdf: + for page in pdf.pages: + page_text = page.extract_text() + if page_text: + text.append(page_text.strip()) + return text + +# Generate OpenAI embeddings +def get_openai_embedding(text): + response = client.embeddings.create( + input=text, + model="text-embedding-3-small" + ) + return response.data[0].embedding + +# Store text and embeddings in Qdrant +def load_pdf_to_qdrant(pdf_path, qdrant, collection_name): + # Extract text from PDF + text_chunks = extract_text_from_pdf(pdf_path) + + # Create Qdrant collection + if qdrant.collection_exists(collection_name): + qdrant.delete_collection(collection_name) + qdrant.create_collection( + collection_name=collection_name, + vectors_config=VectorParams(size=1536, distance=Distance.COSINE) + ) + + # Store embeddings + points = [] + for chunk in text_chunks: + embedding = get_openai_embedding(chunk) + points.append(PointStruct( + id=str(uuid.uuid4()), + vector=embedding, + payload={"text": chunk} + )) + qdrant.upsert(collection_name=collection_name, points=points) + +# Initialize Qdrant client and load data +qdrant = QdrantClient( + url=os.getenv("QDRANT_URL"), + api_key=os.getenv("QDRANT_API_KEY") +) +collection_name = "example_collection" +pdf_path = "path/to/your/document.pdf" +load_pdf_to_qdrant(pdf_path, qdrant, collection_name) + +# Initialize Qdrant search tool +qdrant_tool = QdrantVectorSearchTool( + qdrant_url=os.getenv("QDRANT_URL"), + qdrant_api_key=os.getenv("QDRANT_API_KEY"), + collection_name=collection_name, + limit=3, + score_threshold=0.35 +) + +# Create CrewAI agents +search_agent = Agent( + role="Senior Semantic Search Agent", + goal="Find and analyze documents based on semantic search", + backstory="""You are an expert research assistant who can find relevant + information using semantic search in a Qdrant database.""", + tools=[qdrant_tool], + verbose=True +) + +answer_agent = Agent( + role="Senior Answer Assistant", + goal="Generate answers to questions based on the context provided", + backstory="""You are an expert answer assistant who can generate + answers to questions based on the context provided.""", + tools=[qdrant_tool], + verbose=True +) + +# Define tasks +search_task = Task( + description="""Search for relevant documents about the {query}. + Your final answer should include: + - The relevant information found + - The similarity scores of the results + - The metadata of the relevant documents""", + agent=search_agent +) + +answer_task = Task( + description="""Given the context and metadata of relevant documents, + generate a final answer based on the context.""", + agent=answer_agent +) + +# Run CrewAI workflow +crew = Crew( + agents=[search_agent, answer_agent], + tasks=[search_task, answer_task], + process=Process.sequential, + verbose=True +) + +result = crew.kickoff( + inputs={"query": "What is the role of X in the document?"} +) +print(result) +``` + +## Tool Parameters + +### Required Parameters +- `qdrant_url` (str): The URL of your Qdrant server +- `qdrant_api_key` (str): API key for authentication with Qdrant +- `collection_name` (str): Name of the Qdrant collection to search + +### Optional Parameters +- `limit` (int): Maximum number of results to return (default: 3) +- `score_threshold` (float): Minimum similarity score threshold (default: 0.35) +- `custom_embedding_fn` (Callable[[str], list[float]]): Custom function for text vectorization + +## Search Parameters + +The tool accepts these parameters in its schema: +- `query` (str): The search query to find similar documents +- `filter_by` (str, optional): Metadata field to filter on +- `filter_value` (str, optional): Value to filter by + +## Return Format + +The tool returns results in JSON format: + +```json +[ + { + "metadata": { + // Any metadata stored with the document + }, + "context": "The actual text content of the document", + "distance": 0.95 // Similarity score + } +] +``` + +## Default Embedding + +By default, the tool uses OpenAI's `text-embedding-3-small` model for vectorization. This requires: +- OpenAI API key set in environment: `OPENAI_API_KEY` + +## Custom Embeddings + +Instead of using the default embedding model, you might want to use your own embedding function in cases where you: + +1. Want to use a different embedding model (e.g., Cohere, HuggingFace, Ollama models) +2. Need to reduce costs by using open-source embedding models +3. Have specific requirements for vector dimensions or embedding quality +4. Want to use domain-specific embeddings (e.g., for medical or legal text) + +Here's an example using a HuggingFace model: + +```python +from transformers import AutoTokenizer, AutoModel +import torch + +# Load model and tokenizer +tokenizer = AutoTokenizer.from_pretrained('sentence-transformers/all-MiniLM-L6-v2') +model = AutoModel.from_pretrained('sentence-transformers/all-MiniLM-L6-v2') + +def custom_embeddings(text: str) -> list[float]: + # Tokenize and get model outputs + inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True) + outputs = model(**inputs) + + # Use mean pooling to get text embedding + embeddings = outputs.last_hidden_state.mean(dim=1) + + # Convert to list of floats and return + return embeddings[0].tolist() + +# Use custom embeddings with the tool +tool = QdrantVectorSearchTool( + qdrant_url="your_url", + qdrant_api_key="your_key", + collection_name="your_collection", + custom_embedding_fn=custom_embeddings # Pass your custom function +) +``` + +## Error Handling + +The tool handles these specific errors: +- Raises ImportError if `qdrant-client` is not installed (with option to auto-install) +- Raises ValueError if `QDRANT_URL` is not set +- Prompts to install `qdrant-client` if missing using `uv add qdrant-client` + +## Environment Variables + +Required environment variables: +```bash +export QDRANT_URL="your_qdrant_url" # If not provided in constructor +export QDRANT_API_KEY="your_api_key" # If not provided in constructor +export OPENAI_API_KEY="your_openai_key" # If using default embeddings \ No newline at end of file