From a1033e4bfee1cf61b9ef1daab0d4855d544bdc3b Mon Sep 17 00:00:00 2001 From: Lorenze Jay <63378463+lorenzejay@users.noreply.github.com> Date: Wed, 27 May 2026 13:20:53 -0700 Subject: [PATCH] Fix structured output leaks in tool-calling loops (#5897) * Fix structured output leaks in tool-calling loops * addressing comments * drop scripts * Update Gemini agent tests to include structured output with thoughts and bump model version to 2.5-flash * merge * Update Anthropic test cases to use new model and tool structure - Changed the model from "claude-3-5-haiku-20241022" to "claude-sonnet-4-6" in the test setup. - Updated the request and response formats in the YAML test cassette to reflect the new tool structure and improved content formatting. - Adjusted the expected response body to match the new output format from the assistant, including changes in tool usage and response details. - Increased rate limit values in the response headers for better testing scenarios. * adjusted bedrock cassettes * adjusting cassettes for bedrock * fix test * Update VCR configuration to use 'host' instead of 'bedrock_host' for request matching --- conftest.py | 37 +- lib/crewai/src/crewai/agent/core.py | 41 +- .../src/crewai/agents/crew_agent_executor.py | 20 +- .../src/crewai/experimental/agent_executor.py | 8 +- lib/crewai/src/crewai/lite_agent.py | 46 +- .../tests/agents/test_agent_executor.py | 47 ++ .../tests/agents/test_native_tool_calling.py | 6 +- ...thropic.claude-3-haiku-20240307-v1-0].yaml | 58 --- ...drock-us.anthropic.claude-sonnet-4-6].yaml | 51 +++ ...thropic.claude-3-haiku-20240307-v1-0].yaml | 57 --- ...drock-us.anthropic.claude-sonnet-4-6].yaml | 53 +++ ...drock_agent_kickoff_with_tools_mocked.yaml | 428 +----------------- ...ative_tool_calling_test_agent_kickoff.yaml | 103 ++++- ...arallel_native_tool_calling_test_crew.yaml | 177 +++----- ...ultimodalIntegration.test_analyze_pdf.yaml | 51 +-- ...imodalIntegration.test_describe_image.yaml | 57 +-- ..._kickoff_structured_output_with_tools.yaml | 275 ++++++++++- ..._kickoff_structured_output_with_tools.yaml | 115 +++-- ...ckoff_structured_output_without_tools.yaml | 34 +- .../test_bedrock_async_basic_call.yaml | 12 +- .../test_bedrock_async_conversation.yaml | 12 +- .../test_bedrock_async_multiple_calls.yaml | 22 +- .../test_bedrock_async_with_max_tokens.yaml | 12 +- .../test_bedrock_async_with_parameters.yaml | 18 +- ...est_bedrock_async_with_system_message.yaml | 12 +- .../test_bedrock_async_with_temperature.yaml | 10 +- ..._kickoff_structured_output_with_tools.yaml | 190 +++++--- ...ini_crew_structured_output_with_tools.yaml | 143 +++--- .../tests/llms/anthropic/test_anthropic.py | 2 +- lib/crewai/tests/llms/bedrock/test_bedrock.py | 4 +- .../tests/llms/bedrock/test_bedrock_async.py | 15 +- lib/crewai/tests/llms/google/test_google.py | 2 +- .../tests/llms/test_multimodal_integration.py | 4 +- lib/crewai/tests/test_crew_multimodal.py | 2 +- 34 files changed, 1071 insertions(+), 1053 deletions(-) delete mode 100644 lib/crewai/tests/cassettes/TestCrewMultimodalBedrock.test_image_file[bedrock-anthropic.claude-3-haiku-20240307-v1-0].yaml create mode 100644 lib/crewai/tests/cassettes/TestCrewMultimodalBedrock.test_image_file[bedrock-us.anthropic.claude-sonnet-4-6].yaml delete mode 100644 lib/crewai/tests/cassettes/TestCrewMultimodalBedrock.test_pdf_file[bedrock-anthropic.claude-3-haiku-20240307-v1-0].yaml create mode 100644 lib/crewai/tests/cassettes/TestCrewMultimodalBedrock.test_pdf_file[bedrock-us.anthropic.claude-sonnet-4-6].yaml diff --git a/conftest.py b/conftest.py index dca182746..a025050be 100644 --- a/conftest.py +++ b/conftest.py @@ -5,6 +5,7 @@ from collections.abc import Generator import gzip import os from pathlib import Path +import re import tempfile from typing import Any @@ -20,8 +21,25 @@ except ModuleNotFoundError: env_test_path = Path(__file__).parent / ".env.test" -load_dotenv(env_test_path, override=True) -load_dotenv(override=True) + +load_dotenv(env_test_path, override=False) +load_dotenv(override=False) + +BEDROCK_HOST_PLACEHOLDER = "bedrock-runtime.vcr.amazonaws.com" +_BEDROCK_HOST_RE = re.compile(r"^bedrock-runtime\.[a-z0-9-]+\.amazonaws\.com$") + + +def _normalize_bedrock_host(host: str) -> str: + if _BEDROCK_HOST_RE.match(host): + return BEDROCK_HOST_PLACEHOLDER + return host + + +def bedrock_host_matcher(r1: Request, r2: Request) -> bool: # type: ignore[no-any-unimported] + """Match Bedrock requests across AWS regions (CI uses us-east-1, local may use us-west-2).""" + return _normalize_bedrock_host(r1.host or "") == _normalize_bedrock_host( + r2.host or "" + ) def _patched_make_vcr_request(httpx_request: Any, **kwargs: Any) -> Any: @@ -188,6 +206,7 @@ HEADERS_TO_FILTER = { "anthropic-ratelimit-tokens-remaining": "ANTHROPIC-RATELIMIT-TOKENS-REMAINING-XXX", "anthropic-ratelimit-tokens-reset": "ANTHROPIC-RATELIMIT-TOKENS-RESET-XXX", "x-amz-date": "X-AMZ-DATE-XXX", + "x-amz-security-token": "X-AMZ-SECURITY-TOKEN-XXX", "amz-sdk-invocation-id": "AMZ-SDK-INVOCATION-ID-XXX", "accept-encoding": "ACCEPT-ENCODING-XXX", "x-amzn-requestid": "X-AMZN-REQUESTID-XXX", @@ -212,6 +231,10 @@ def _filter_request_headers(request: Request) -> Request: # type: ignore[no-any placeholder_host = "fake-azure-endpoint.openai.azure.com" request.uri = request.uri.replace(original_host, placeholder_host) + # Normalize Bedrock regional endpoints so cassettes work in any AWS region. + if request.host and _BEDROCK_HOST_RE.match(request.host): + request.uri = request.uri.replace(request.host, BEDROCK_HOST_PLACEHOLDER) + return request @@ -229,6 +252,11 @@ def _filter_response_headers(response: dict[str, Any]) -> dict[str, Any] | None: if body == "" or body == b"" or content_length == ["0"]: return None + status_code = response.get("status", {}).get("code") + if isinstance(status_code, int) and status_code >= 400: + # Avoid persisting auth/model errors when re-recording without valid AWS creds. + return None + for encoding_header in ["Content-Encoding", "content-encoding"]: if encoding_header in headers: encoding = headers.pop(encoding_header) @@ -279,6 +307,11 @@ def vcr_cassette_dir(request: Any) -> str: return str(cassette_dir) +def pytest_recording_configure(vcr: Any, config: Any) -> None: + """Register custom VCR matchers for each test cassette session.""" + vcr.register_matcher("bedrock_host", bedrock_host_matcher) + + @pytest.fixture(scope="module") def vcr_config(vcr_cassette_dir: str) -> dict[str, Any]: """Configure VCR with organized cassette storage.""" diff --git a/lib/crewai/src/crewai/agent/core.py b/lib/crewai/src/crewai/agent/core.py index a0eae49fd..0295a2a6c 100644 --- a/lib/crewai/src/crewai/agent/core.py +++ b/lib/crewai/src/crewai/agent/core.py @@ -28,6 +28,7 @@ from pydantic import ( ConfigDict, Field, PrivateAttr, + ValidationError, model_validator, ) from pydantic.functional_serializers import PlainSerializer @@ -1710,24 +1711,32 @@ class Agent(BaseAgent): elif response_format: raw_output = str(output) if not isinstance(output, str) else output try: - model_schema = generate_model_description(response_format) - schema = json.dumps(model_schema, indent=2) - instructions = I18N_DEFAULT.slice("formatted_task_instructions").format( - output_format=schema - ) + formatted_result = response_format.model_validate_json(raw_output) + except ValidationError: + # Direct JSON validation failed; fall back to converter-based parsing below. + formatted_result = None - converter = Converter( - llm=cast(BaseLLM, self.llm), - text=raw_output, - model=response_format, - instructions=instructions, - ) + if formatted_result is None: + try: + model_schema = generate_model_description(response_format) + schema = json.dumps(model_schema, indent=2) + instructions = I18N_DEFAULT.slice( + "formatted_task_instructions" + ).format(output_format=schema) - conversion_result = converter.to_pydantic() - if isinstance(conversion_result, BaseModel): - formatted_result = conversion_result - except ConverterError: - pass + converter = Converter( + llm=cast(BaseLLM, self.llm), + text=raw_output, + model=response_format, + instructions=instructions, + ) + + conversion_result = converter.to_pydantic() + if isinstance(conversion_result, BaseModel): + formatted_result = conversion_result + except ConverterError: + # Conversion failure is non-fatal; raw output is preserved below. + pass else: raw_output = str(output) if not isinstance(output, str) else output diff --git a/lib/crewai/src/crewai/agents/crew_agent_executor.py b/lib/crewai/src/crewai/agents/crew_agent_executor.py index 2e4258bea..f985da83c 100644 --- a/lib/crewai/src/crewai/agents/crew_agent_executor.py +++ b/lib/crewai/src/crewai/agents/crew_agent_executor.py @@ -350,6 +350,10 @@ class CrewAgentExecutor(BaseAgentExecutor): enforce_rpm_limit(self.request_within_rpm_limit) + effective_response_model = ( + None if self.original_tools else self.response_model + ) + answer = get_llm_response( llm=cast("BaseLLM", self.llm), messages=self.messages, @@ -357,11 +361,11 @@ class CrewAgentExecutor(BaseAgentExecutor): printer=PRINTER, from_task=self.task, from_agent=self.agent, - response_model=self.response_model, + response_model=effective_response_model, executor_context=self, verbose=self.agent.verbose, ) - if self.response_model is not None: + if effective_response_model is not None: try: if isinstance(answer, BaseModel): output_json = answer.model_dump_json() @@ -502,7 +506,7 @@ class CrewAgentExecutor(BaseAgentExecutor): available_functions=None, from_task=self.task, from_agent=self.agent, - response_model=self.response_model, + response_model=None, executor_context=self, verbose=self.agent.verbose, ) @@ -1159,6 +1163,10 @@ class CrewAgentExecutor(BaseAgentExecutor): enforce_rpm_limit(self.request_within_rpm_limit) + effective_response_model = ( + None if self.original_tools else self.response_model + ) + answer = await aget_llm_response( llm=cast("BaseLLM", self.llm), messages=self.messages, @@ -1166,12 +1174,12 @@ class CrewAgentExecutor(BaseAgentExecutor): printer=PRINTER, from_task=self.task, from_agent=self.agent, - response_model=self.response_model, + response_model=effective_response_model, executor_context=self, verbose=self.agent.verbose, ) - if self.response_model is not None: + if effective_response_model is not None: try: if isinstance(answer, BaseModel): output_json = answer.model_dump_json() @@ -1311,7 +1319,7 @@ class CrewAgentExecutor(BaseAgentExecutor): available_functions=None, from_task=self.task, from_agent=self.agent, - response_model=self.response_model, + response_model=None, executor_context=self, verbose=self.agent.verbose, ) diff --git a/lib/crewai/src/crewai/experimental/agent_executor.py b/lib/crewai/src/crewai/experimental/agent_executor.py index 188a8bedb..81b431a24 100644 --- a/lib/crewai/src/crewai/experimental/agent_executor.py +++ b/lib/crewai/src/crewai/experimental/agent_executor.py @@ -1273,6 +1273,10 @@ class AgentExecutor(Flow[AgentExecutorState], BaseAgentExecutor): try: enforce_rpm_limit(self.request_within_rpm_limit) + effective_response_model = ( + None if self.original_tools else self.response_model + ) + answer = get_llm_response( llm=self.llm, messages=list(self.state.messages), @@ -1280,7 +1284,7 @@ class AgentExecutor(Flow[AgentExecutorState], BaseAgentExecutor): printer=PRINTER, from_task=self.task, from_agent=self.agent, - response_model=self.response_model, + response_model=effective_response_model, executor_context=self, verbose=self.agent.verbose, ) @@ -1368,7 +1372,7 @@ class AgentExecutor(Flow[AgentExecutorState], BaseAgentExecutor): available_functions=None, from_task=self.task, from_agent=self.agent, - response_model=self.response_model, + response_model=None, executor_context=self, verbose=self.agent.verbose, ) diff --git a/lib/crewai/src/crewai/lite_agent.py b/lib/crewai/src/crewai/lite_agent.py index 462bb0d0c..e2986a0da 100644 --- a/lib/crewai/src/crewai/lite_agent.py +++ b/lib/crewai/src/crewai/lite_agent.py @@ -23,6 +23,7 @@ from pydantic import ( BaseModel, Field, PrivateAttr, + ValidationError, field_serializer, field_validator, model_validator, @@ -639,29 +640,38 @@ class LiteAgent(FlowTrackable, BaseModel): formatted_result = agent_finish.output elif active_response_format: try: - model_schema = generate_model_description(active_response_format) - schema = json.dumps(model_schema, indent=2) - instructions = I18N_DEFAULT.slice("formatted_task_instructions").format( - output_format=schema + formatted_result = active_response_format.model_validate_json( + str(agent_finish.output) ) + except ValidationError: + # Direct JSON validation failed; fall back to converter-based parsing below. + formatted_result = None - converter = Converter( - llm=self.llm, - text=agent_finish.output, - model=active_response_format, - instructions=instructions, - ) + if formatted_result is None: + try: + model_schema = generate_model_description(active_response_format) + schema = json.dumps(model_schema, indent=2) + instructions = I18N_DEFAULT.slice( + "formatted_task_instructions" + ).format(output_format=schema) - result = converter.to_pydantic() - if isinstance(result, BaseModel): - formatted_result = result - except ConverterError as e: - if self.verbose: - PRINTER.print( - content=f"Failed to parse output into response format after retries: {e.message}", - color="yellow", + converter = Converter( + llm=self.llm, + text=agent_finish.output, + model=active_response_format, + instructions=instructions, ) + result = converter.to_pydantic() + if isinstance(result, BaseModel): + formatted_result = result + except ConverterError as e: + if self.verbose: + PRINTER.print( + content=f"Failed to parse output into response format after retries: {e.message}", + color="yellow", + ) + if isinstance(self.llm, BaseLLM): usage_metrics = self.llm.get_token_usage_summary() else: diff --git a/lib/crewai/tests/agents/test_agent_executor.py b/lib/crewai/tests/agents/test_agent_executor.py index ad386e8b4..c7f2d0107 100644 --- a/lib/crewai/tests/agents/test_agent_executor.py +++ b/lib/crewai/tests/agents/test_agent_executor.py @@ -12,6 +12,7 @@ from typing import Any from unittest.mock import AsyncMock, Mock, patch import pytest +from pydantic import BaseModel from crewai.agents.tools_handler import ToolsHandler as _ToolsHandler from crewai.agents.step_executor import StepExecutor @@ -108,6 +109,9 @@ class TestAgentExecutorState: class TestAgentExecutor: """Test AgentExecutor class.""" + class StructuredResult(BaseModel): + value: str + @pytest.fixture def mock_dependencies(self): """Create mock dependencies for executor.""" @@ -215,6 +219,49 @@ class TestAgentExecutor: assert result == "check_iteration" + def test_call_llm_and_parse_does_not_pass_response_model_with_tools( + self, mock_dependencies + ): + """Structured output should not be requested during ReAct tool loops.""" + executor = _build_executor( + **mock_dependencies, + original_tools=[Mock()], + response_model=self.StructuredResult, + callbacks=[], + ) + executor.state.messages = [{"role": "user", "content": "Use a tool"}] + + with patch( + "crewai.experimental.agent_executor.get_llm_response", + return_value="Thought: done\nFinal Answer: complete", + ) as get_llm_response_mock: + result = executor.call_llm_and_parse() + + assert result == "parsed" + assert get_llm_response_mock.call_args.kwargs["response_model"] is None + + def test_call_llm_native_tools_does_not_pass_response_model_with_tools( + self, mock_dependencies + ): + """Structured output should not be requested during native tool calls.""" + executor = _build_executor( + **mock_dependencies, + original_tools=[Mock()], + response_model=self.StructuredResult, + callbacks=[], + ) + executor._openai_tools = [{"type": "function", "function": {"name": "lookup"}}] + executor.state.messages = [{"role": "user", "content": "Use a tool"}] + + with patch( + "crewai.experimental.agent_executor.get_llm_response", + return_value="complete", + ) as get_llm_response_mock: + result = executor.call_llm_native_tools() + + assert result == "native_finished" + assert get_llm_response_mock.call_args.kwargs["response_model"] is None + def test_finalize_success(self, mock_dependencies): """Test finalize with valid AgentFinish.""" with patch.object(AgentExecutor, "_show_logs") as mock_show_logs: diff --git a/lib/crewai/tests/agents/test_native_tool_calling.py b/lib/crewai/tests/agents/test_native_tool_calling.py index 9af7861de..e3094db01 100644 --- a/lib/crewai/tests/agents/test_native_tool_calling.py +++ b/lib/crewai/tests/agents/test_native_tool_calling.py @@ -824,7 +824,7 @@ class TestBedrockNativeToolCalling: self, calculator_tool: CalculatorTool ) -> None: """Test Bedrock agent kickoff with mocked LLM call.""" - llm = LLM(model="bedrock/anthropic.claude-3-haiku-20240307-v1:0") + llm = LLM(model="bedrock/us.anthropic.claude-sonnet-4-6") agent = Agent( role="Math Assistant", @@ -858,7 +858,7 @@ class TestBedrockNativeToolCalling: goal="Use both tools exactly as instructed", backstory="You follow tool instructions precisely.", tools=parallel_tools, - llm=LLM(model="bedrock/anthropic.claude-3-haiku-20240307-v1:0"), + llm=LLM(model="bedrock/us.anthropic.claude-sonnet-4-6"), verbose=False, max_iter=3, ) @@ -881,7 +881,7 @@ class TestBedrockNativeToolCalling: goal="Use both tools exactly as instructed", backstory="You follow tool instructions precisely.", tools=parallel_tools, - llm=LLM(model="bedrock/anthropic.claude-3-haiku-20240307-v1:0"), + llm=LLM(model="bedrock/us.anthropic.claude-sonnet-4-6"), verbose=False, max_iter=3, ) diff --git a/lib/crewai/tests/cassettes/TestCrewMultimodalBedrock.test_image_file[bedrock-anthropic.claude-3-haiku-20240307-v1-0].yaml b/lib/crewai/tests/cassettes/TestCrewMultimodalBedrock.test_image_file[bedrock-anthropic.claude-3-haiku-20240307-v1-0].yaml deleted file mode 100644 index 58d02f8b3..000000000 --- a/lib/crewai/tests/cassettes/TestCrewMultimodalBedrock.test_image_file[bedrock-anthropic.claude-3-haiku-20240307-v1-0].yaml +++ /dev/null @@ -1,58 +0,0 @@ -interactions: -- request: - body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Describe - the file(s) you see. Be brief, one sentence max.\n\nInput files (content already - loaded in conversation):\n - \"chart\" (revenue_chart.png)\n\nThis is the expected - criteria for your final answer: A brief description of the file.\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:"}, {"image": {"format": "png", "source": - {"bytes": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABr0klEQVR4nO3dd3RU5fr+//ek90CAJJTQpXelKQoIBBBBFKUEFBDxiAl6QBDxKPWoKIpSYv0qqIcAUkVEMCpVAYEQuvQqJNQ0QpJJZv/+8Md8jISezGRmrtdaWYtd5tn3nckkF/uZvcdkGIaBiIiIiLgMN3sXICIiIiK2pQAoIiIi4mIUAEVERERcjAKgiIiIiItRABQRERFxMQqAIiIiIi5GAVBERETExSgAioiIiLgYBUARERERF6MAKCIiIuJiFABFREREXIwCoIiIiIiLUQAUERERcTEKgCIiIiIuRgFQRERExMUoAIqIiIi4GAVAERERERejACgiIiLiYhQARURERFyMAqCIiIiIi1EAFBEREXExCoAiIiIiLkYBUERERMTFKACKiIiIuBgFQBEREREXowAoIiIi4mIUAEVERERcjAKgiIiIiItRABQRERFxMQqAIiIiIi5GAVBERETExSgAioiIiLgYBUARERERF6MAKCIiIuJiFABFRFzEgAEDqFy5sr3LEJFiQAFQxEnNmjULk8lk/fLw8KB8+fIMGDCAP//8097lFXvLli2jU6dOlCpVCh8fH2rUqMGIESM4f/68vUvL5+/P8fW+Vq9ebe9SRaQY8bB3ASJStCZMmECVKlXIyspi48aNzJo1i/Xr17Nr1y58fHzsXV6xNGLECN577z0aNmzIqFGjCAkJISEhgRkzZjB37lx+/vlnatasae8yAfj666/zLX/11VfEx8dftb527dp89tlnWCwWW5YnIsWUyTAMw95FiEjhmzVrFgMHDmTz5s3cc8891vWvvPIKb7/9NvPmzaNnz552rLB4mjNnDlFRUfTq1YvZs2fj7u5u3fb777/Ttm1bqlWrRkJCAh4etvs/9KVLl/D397/hfjExMcTGxqJf7SJyPZoCFnEx999/PwCHDh3Kt/6PP/7g8ccfJyQkBB8fH+655x6WLl1q3b5lyxZMJhNffvnlVWOuXLkSk8nEsmXLrOv+/PNPnn76acLCwvD29qZu3bp88cUX+R63evVqTCYT33zzDW+88QYVKlTAx8eHdu3acfDgwXz7Vq5cmQEDBlx17DZt2tCmTZt867Kzsxk7dizVq1fH29ubiIgIXn75ZbKzs2/4/Rk/fjwlS5bk008/zRf+AJo1a8aoUaPYuXMnCxYsAP4KXAEBAWRmZl41Vp8+fQgPDycvL8+67ocffuD+++/H39+fwMBAunTpwu7du/M9bsCAAQQEBHDo0CEeeughAgMD6du37w1rv5F/vgfw6NGjmEwm3n33XWJjY6latSp+fn5ERkZy4sQJDMNg4sSJVKhQAV9fXx555BEuXLhw1bg305OIFC8KgCIu5ujRowCULFnSum737t20aNGCvXv38sorr/Dee+/h7+9P9+7dWbx4MQD33HMPVatW5ZtvvrlqzHnz5lGyZEk6duwIQHJyMi1atOCnn34iJiaGqVOnUr16dQYNGsQHH3xw1eMnTZrE4sWLGTFiBKNHj2bjxo23HXgsFgvdunXj3XffpWvXrkyfPp3u3bvz/vvv06tXr+s+9sCBA+zbt49HHnmEoKCgAvd56qmnAKxht1evXly6dInvv/8+336ZmZl89913PP7449Yg+fXXX9OlSxcCAgJ4++23ef3119mzZw+tWrWyPi9X5Obm0rFjR0JDQ3n33Xfp0aPH7Xw7bsrs2bP58MMPGTp0KC+99BJr1qyhZ8+evPbaa6xYsYJRo0bx7LPP8t133zFixIh8j72VnkSkGDFExCnNnDnTAIyffvrJOHv2rHHixAljwYIFRpkyZQxvb2/jxIkT1n3btWtn1K9f38jKyrKus1gsxr333mvcdddd1nWjR482PD09jQsXLljXZWdnGyVKlDCefvpp67pBgwYZZcuWNc6dO5evpt69exvBwcFGZmamYRiGsWrVKgMwateubWRnZ1v3mzp1qgEYO3futK6rVKmS0b9//6v6bN26tdG6dWvr8tdff224ubkZ69aty7ffxx9/bADGr7/+es3v2ZIlSwzAeP/996+5j2EYRlBQkNGkSRPDMP76PpUvX97o0aNHvn2++eYbAzDWrl1rGIZhpKenGyVKlDAGDx6cb7+kpCQjODg43/r+/fsbgPHKK69ct46CREdHG9f61d6/f3+jUqVK1uUjR44YgFGmTBkjJSXFun706NEGYDRs2NAwm83W9X369DG8vLysPye30pOIFC86Ayji5Nq3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zt6j+pM7oYtARERERFyMzgCKiIiIuBgFQBEREREXowAoIiIi4mIUAEVERERcjALgHXjrrbdo2rQpgYGBhIaG0r17d/bt25dvn6ysLKKjoylVqhQBAQH06NGD5ORk6/bt27fTp08fIiIi8PX1pXbt2kydOvWqY61evZomTZrg7e1N9erVmTVr1g3r27FjB/fffz8+Pj5ERETwzjvvOFWPR48exWQyXfW1cePGYtff6dOniYqKokaNGri5ufHvf//7puo7fvw4Xbp0wc/Pj9DQUEaOHElubu5N9+cIPRb0HM6dO7fY9bdo0SI6dOhAmTJlCAoKomXLlqxcufKG9d3p67A491cYr0Fb9rh+/Xruu+8+SpUqha+vL7Vq1eL999+/YX2O8hzeTn+O9Hv073799Vc8PDxo1KjRDesrjL+FTsmQ29axY0dj5syZxq5du4zExETjoYceMipWrGhkZGRY93nuueeMiIgI4+effza2bNlitGjRwrj33nut2z///HPjhRdeMFavXm0cOnTI+Prrrw1fX19j+vTp1n0OHz5s+Pn5GcOHDzf27NljTJ8+3XB3dzdWrFhxzdpSU1ONsLAwo2/fvsauXbuMOXPmGL6+vsYnn3ziND0eOXLEAIyffvrJOH36tPUrJyen2PV35MgR44UXXjC+/PJLo1GjRsaLL754w9pyc3ONevXqGe3btze2bdtmLF++3ChdurQxevTom+6vuPdoGIYBGDNnzsz3HF6+fLnY9ffiiy8ab7/9tvH7778b+/fvN0aPHm14enoaCQkJ16ytMF6Hxbm/wngN2rLHhIQEIy4uzti1a5dx5MgR4+uvvzb8/Pyu+3w40nN4O/050u/RKy5evGhUrVrViIyMNBo2bHjd2grrb6EzUgAsRGfOnDEAY82aNYZhGEZKSorh6elpzJ8/37rP3r17DcDYsGHDNcd5/vnnjbZt21qXX375ZaNu3br59unVq5fRsWPHa47x4YcfGiVLljSys7Ot60aNGmXUrFnzlvv6u+LU45VfXNu2bbvNbq5WVP39XevWrW8qHC1fvtxwc3MzkpKSrOs++ugjIygoKN/zequKU4+G8VcAXLx48U3XfyO26O+KOnXqGOPHj7/m9qJ4HRan/oriNWgYtu3x0UcfNfr163fN7Y7+HN6oP0f8PdqrVy/jtddeM8aOHXvDAFhUfwudgaaA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l19+menTp1OhQoVCPabZbC7U8URECpsCoIg4vYiICKZOncqIESM4cuQIhmEwaNAgIiMjady4MZ07dyYgIICwsDCefPJJzp07Z33sihUraNWqFSVKlKBUqVI8/PDDHDp0yLr96NGjmEwm5s2bR+vWrfHx8WH27Nn2aFNE5Kbps4BFxGV0796d1NRUHnvsMSZOnMju3bupW7cuzzzzDE899RSXL19m1KhR5Obm8ssvvwCwcOFCTCYTDRo0ICMjgzFjxnD06FESExNxc3Pj6NGjVKlShcqVK/Pee+/RuHFjfHx8KFu2rJ27FRG5NgVAEXEZZ86coW7duly4cIGFCxeya9cu1q1bx8qVK637nDx5koiICPbt20eNGjWuGuPcuXOUKVOGnTt3Uq9ePWsA/OCDD3jxxRdt2Y6IyG3TFLCIuIzQ0FD+9a9/Ubt2bbp378727dtZtWoVAQEB1q9atWoBWKd5Dxw4QJ8+fahatSpBQUFUrlwZgOPHj+cb+5577rFpLyIid8LD3gWIiNiSh4cHHh5//erLyMiga9euvP3221ftd2UKt2vXrlSqVInPPvuMcuXKYbFYqFevHjk5Ofn29/f3L/riRUQKiQKgiLisJk2asHDhQipXrmwNhX93/vx59u3bx2effcb9998PwPr1621dpohIodMUsIi4rOjoaC5cuECfPn3YvHkzhw4dYuXKlQwcOJC8vDxKlixJqVKl+PTTTzl48CC//PILw4cPt3fZIiJ3TAFQRFxWuXLl+PXXX8nLyyMyMpL69evz73//mxIlSuDm5oabmxtz585l69at1KtXj2HDhjF58mR7ly0icsd0FbCIiIiIi9EZQBEREREXowAoIiIi4mIUAEVERERcjAKgiIiIiItRABQRERFxMQqAIiIiIi5GAVBERETExSgAioiIiLgYBUARERERF6MAKCIiIuJiFABFREREXIwCoIiIiIiL+f8Aotl7LKm7ZkIAAAAASUVORK5CYII="}}}]}], - "inferenceConfig": {"stopSequences": ["\nObservation:"]}, "system": [{"text": - "You are File Analyst. Expert at analyzing various file types.\nYour personal - goal is: Analyze and describe files accurately\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!"}]}' - headers: - Content-Length: - - '38092' - Content-Type: - - !!binary | - YXBwbGljYXRpb24vanNvbg== - User-Agent: - - X-USER-AGENT-XXX - amz-sdk-invocation-id: - - AMZ-SDK-INVOCATION-ID-XXX - amz-sdk-request: - - !!binary | - YXR0ZW1wdD0x - authorization: - - AUTHORIZATION-XXX - x-amz-date: - - X-AMZ-DATE-XXX - method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse - response: - body: - string: '{"metrics":{"latencyMs":2024},"output":{"message":{"content":[{"text":"Thought: - I now can give a great answer\n\nFinal Answer: The file \"revenue_chart.png\" - is a line graph that shows the revenue over time. The y-axis represents the - revenue in dollars, and the x-axis represents the years from 2020.0 to 2024.0. - The graph depicts a steady increase in revenue over the 5-year period."}],"role":"assistant"}},"stopReason":"end_turn","usage":{"inputTokens":629,"outputTokens":85,"serverToolUsage":{},"totalTokens":714}}' - headers: - Connection: - - keep-alive - Content-Length: - - '517' - Content-Type: - - application/json - Date: - - Fri, 23 Jan 2026 19:15:36 GMT - x-amzn-RequestId: - - X-AMZN-REQUESTID-XXX - status: - code: 200 - message: OK -version: 1 diff --git a/lib/crewai/tests/cassettes/TestCrewMultimodalBedrock.test_image_file[bedrock-us.anthropic.claude-sonnet-4-6].yaml b/lib/crewai/tests/cassettes/TestCrewMultimodalBedrock.test_image_file[bedrock-us.anthropic.claude-sonnet-4-6].yaml new file mode 100644 index 000000000..de82ec114 --- /dev/null +++ b/lib/crewai/tests/cassettes/TestCrewMultimodalBedrock.test_image_file[bedrock-us.anthropic.claude-sonnet-4-6].yaml @@ -0,0 +1,51 @@ +interactions: +- request: + body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Describe + the file(s) you see. Be brief, one sentence max.\n\nInput files (content already + loaded in conversation):\n - \"chart\" (revenue_chart.png)\n\nThis is the expected + criteria for your final answer: A brief description of the file.\nyou MUST return + the actual complete content as the final answer, not a summary.\n\nProvide your + complete response:"}]}], "inferenceConfig": {"stopSequences": ["\nObservation:"]}, + "system": [{"text": "You are File Analyst. Expert at analyzing various file + types.\nYour personal goal is: Analyze and describe files accurately"}]}' + headers: + Content-Length: + - '636' + Content-Type: + - !!binary | + YXBwbGljYXRpb24vanNvbg== + User-Agent: + - X-USER-AGENT-XXX + amz-sdk-invocation-id: + - AMZ-SDK-INVOCATION-ID-XXX + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + authorization: + - AUTHORIZATION-XXX + x-amz-date: + - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX + method: POST + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse + response: + body: + string: '{"metrics":{"latencyMs":1812},"output":{"message":{"content":[{"text":"A + bar chart displaying revenue data over time, showing financial performance + metrics across different periods."}],"role":"assistant"}},"stopReason":"end_turn","usage":{"cacheReadInputTokenCount":0,"cacheReadInputTokens":0,"cacheWriteInputTokenCount":0,"cacheWriteInputTokens":0,"inputTokens":121,"outputTokens":20,"serverToolUsage":{},"totalTokens":141}}' + headers: + Connection: + - keep-alive + Content-Length: + - '425' + Content-Type: + - application/json + Date: + - Tue, 26 May 2026 17:06:21 GMT + x-amzn-RequestId: + - X-AMZN-REQUESTID-XXX + status: + code: 200 + message: OK +version: 1 diff --git a/lib/crewai/tests/cassettes/TestCrewMultimodalBedrock.test_pdf_file[bedrock-anthropic.claude-3-haiku-20240307-v1-0].yaml b/lib/crewai/tests/cassettes/TestCrewMultimodalBedrock.test_pdf_file[bedrock-anthropic.claude-3-haiku-20240307-v1-0].yaml deleted file mode 100644 index 9181c4dab..000000000 --- a/lib/crewai/tests/cassettes/TestCrewMultimodalBedrock.test_pdf_file[bedrock-anthropic.claude-3-haiku-20240307-v1-0].yaml +++ /dev/null @@ -1,57 +0,0 @@ -interactions: -- request: - body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Describe - the file(s) you see. Be brief, one sentence max.\n\nInput files (content already - loaded in conversation):\n - \"document\" (document)\n\nThis is the expected - criteria for your final answer: A brief description of the file.\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:"}, {"document": {"name": "document", "format": - "pdf", "source": {"bytes": "JVBERi0xLjQKMSAwIG9iaiA8PCAvVHlwZSAvQ2F0YWxvZyAvUGFnZXMgMiAwIFIgPj4gZW5kb2JqCjIgMCBvYmogPDwgL1R5cGUgL1BhZ2VzIC9LaWRzIFszIDAgUl0gL0NvdW50IDEgPj4gZW5kb2JqCjMgMCBvYmogPDwgL1R5cGUgL1BhZ2UgL1BhcmVudCAyIDAgUiAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXSA+PiBlbmRvYmoKeHJlZgowIDQKMDAwMDAwMDAwMCA2NTUzNSBmCjAwMDAwMDAwMDkgMDAwMDAgbgowMDAwMDAwMDU4IDAwMDAwIG4KMDAwMDAwMDExNSAwMDAwMCBuCnRyYWlsZXIgPDwgL1NpemUgNCAvUm9vdCAxIDAgUiA+PgpzdGFydHhyZWYKMTk2CiUlRU9GCg=="}}}]}], - "inferenceConfig": {"stopSequences": ["\nObservation:"]}, "system": [{"text": - "You are File Analyst. Expert at analyzing various file types.\nYour personal - goal is: Analyze and describe files accurately\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!"}]}' - headers: - Content-Length: - - '1545' - Content-Type: - - !!binary | - YXBwbGljYXRpb24vanNvbg== - User-Agent: - - X-USER-AGENT-XXX - amz-sdk-invocation-id: - - AMZ-SDK-INVOCATION-ID-XXX - amz-sdk-request: - - !!binary | - YXR0ZW1wdD0x - authorization: - - AUTHORIZATION-XXX - x-amz-date: - - X-AMZ-DATE-XXX - method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse - response: - body: - string: '{"metrics":{"latencyMs":958},"output":{"message":{"content":[{"text":"Thought: - I have reviewed the provided documents and can now give a complete answer.\n\nFinal - Answer: The file \"document.pdf\" is an empty document with no text or content - visible."}],"role":"assistant"}},"stopReason":"end_turn","usage":{"inputTokens":245,"outputTokens":42,"serverToolUsage":{},"totalTokens":287}}' - headers: - Connection: - - keep-alive - Content-Length: - - '384' - Content-Type: - - application/json - Date: - - Fri, 23 Jan 2026 19:16:37 GMT - x-amzn-RequestId: - - X-AMZN-REQUESTID-XXX - status: - code: 200 - message: OK -version: 1 diff --git a/lib/crewai/tests/cassettes/TestCrewMultimodalBedrock.test_pdf_file[bedrock-us.anthropic.claude-sonnet-4-6].yaml b/lib/crewai/tests/cassettes/TestCrewMultimodalBedrock.test_pdf_file[bedrock-us.anthropic.claude-sonnet-4-6].yaml new file mode 100644 index 000000000..e1515ca5e --- /dev/null +++ b/lib/crewai/tests/cassettes/TestCrewMultimodalBedrock.test_pdf_file[bedrock-us.anthropic.claude-sonnet-4-6].yaml @@ -0,0 +1,53 @@ +interactions: +- request: + body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Describe + the file(s) you see. Be brief, one sentence max.\n\nInput files (content already + loaded in conversation):\n - \"document\" (agents.pdf)\n\nThis is the expected + criteria for your final answer: A brief description of the file.\nyou MUST return + the actual complete content as the final answer, not a summary.\n\nProvide your + complete response:"}]}], "inferenceConfig": {"stopSequences": ["\nObservation:"]}, + "system": [{"text": "You are File Analyst. Expert at analyzing various file + types.\nYour personal goal is: Analyze and describe files accurately"}]}' + headers: + Content-Length: + - '632' + Content-Type: + - !!binary | + YXBwbGljYXRpb24vanNvbg== + User-Agent: + - X-USER-AGENT-XXX + amz-sdk-invocation-id: + - AMZ-SDK-INVOCATION-ID-XXX + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + authorization: + - AUTHORIZATION-XXX + x-amz-date: + - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX + method: POST + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse + response: + body: + string: '{"metrics":{"latencyMs":2844},"output":{"message":{"content":[{"text":"The + file \"agents.pdf\" is an academic/technical document discussing AI agents, + their architectures, components (such as memory, planning, and tool use), + and how large language models (LLMs) can be used to power autonomous agent + systems."}],"role":"assistant"}},"stopReason":"end_turn","usage":{"cacheReadInputTokenCount":0,"cacheReadInputTokens":0,"cacheWriteInputTokenCount":0,"cacheWriteInputTokens":0,"inputTokens":119,"outputTokens":55,"serverToolUsage":{},"totalTokens":174}}' + headers: + Connection: + - keep-alive + Content-Length: + - '552' + Content-Type: + - application/json + Date: + - Tue, 26 May 2026 17:06:24 GMT + x-amzn-RequestId: + - X-AMZN-REQUESTID-XXX + status: + code: 200 + message: OK +version: 1 diff --git a/lib/crewai/tests/cassettes/agents/TestBedrockNativeToolCalling.test_bedrock_agent_kickoff_with_tools_mocked.yaml b/lib/crewai/tests/cassettes/agents/TestBedrockNativeToolCalling.test_bedrock_agent_kickoff_with_tools_mocked.yaml index 1e7565eb1..44f8c7835 100644 --- a/lib/crewai/tests/cassettes/agents/TestBedrockNativeToolCalling.test_bedrock_agent_kickoff_with_tools_mocked.yaml +++ b/lib/crewai/tests/cassettes/agents/TestBedrockNativeToolCalling.test_bedrock_agent_kickoff_with_tools_mocked.yaml @@ -2,134 +2,17 @@ interactions: - request: body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Calculate 15 * 8\n\nThis is the expected criteria for your final answer: Result\nyou MUST - return the actual complete content as the final answer, not a summary.\n\nThis - is VERY important to you, your job depends on it!"}]}], "inferenceConfig": {"stopSequences": - ["\nObservation:"]}, "system": [{"text": "You are Math Assistant. You calculate.\nYour - personal goal is: Calculate math"}], "toolConfig": {"tools": [{"toolSpec": {"name": - "calculator", "description": "Perform mathematical calculations. Use this for - any math operations.", "inputSchema": {"json": {"properties": {"expression": - {"description": "Mathematical expression to evaluate", "title": "Expression", - "type": "string"}}, "required": ["expression"], "type": "object"}}}}]}}' - headers: - Content-Length: - - '806' - Content-Type: - - !!binary | - YXBwbGljYXRpb24vanNvbg== - User-Agent: - - X-USER-AGENT-XXX - amz-sdk-invocation-id: - - AMZ-SDK-INVOCATION-ID-XXX - amz-sdk-request: - - !!binary | - YXR0ZW1wdD0x - authorization: - - AUTHORIZATION-XXX - x-amz-date: - - X-AMZ-DATE-XXX - method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse - response: - body: - string: '{"metrics":{"latencyMs":1540},"output":{"message":{"content":[{"text":"Here - is the calculation for 15 * 8:"},{"toolUse":{"input":{"expression":"15 * 8"},"name":"calculator","toolUseId":"tooluse_1OIARGnOTjiITDKGd_FgMA"}}],"role":"assistant"}},"stopReason":"tool_use","usage":{"inputTokens":417,"outputTokens":68,"serverToolUsage":{},"totalTokens":485}}' - headers: - Connection: - - keep-alive - Content-Length: - - '351' - Content-Type: - - application/json - Date: - - Thu, 22 Jan 2026 21:27:56 GMT - x-amzn-RequestId: - - X-AMZN-REQUESTID-XXX - status: - code: 200 - message: OK -- request: - body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Calculate - 15 * 8\n\nThis is the expected criteria for your final answer: Result\nyou MUST - return the actual complete content as the final answer, not a summary.\n\nThis - is VERY important to you, your job depends on it!"}]}, {"role": "assistant", - "content": [{"toolUse": {"toolUseId": "tooluse_1OIARGnOTjiITDKGd_FgMA", "name": - "calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": - "tooluse_1OIARGnOTjiITDKGd_FgMA", "content": [{"text": "Error executing tool: - CalculatorTool._run() missing 1 required positional argument: ''expression''"}]}}]}, - {"role": "user", "content": [{"text": "Analyze the tool result. If requirements - are met, provide the Final Answer. Otherwise, call the next tool. Deliver only - the answer without meta-commentary."}]}], "inferenceConfig": {"stopSequences": - ["\nObservation:"]}, "system": [{"text": "You are Math Assistant. You calculate.\nYour - personal goal is: Calculate math"}], "toolConfig": {"tools": [{"toolSpec": {"name": - "calculator", "description": "Perform mathematical calculations. Use this for - any math operations.", "inputSchema": {"json": {"properties": {"expression": - {"description": "Mathematical expression to evaluate", "title": "Expression", - "type": "string"}}, "required": ["expression"], "type": "object"}}}}]}}' - headers: - Content-Length: - - '1358' - Content-Type: - - !!binary | - YXBwbGljYXRpb24vanNvbg== - User-Agent: - - X-USER-AGENT-XXX - amz-sdk-invocation-id: - - AMZ-SDK-INVOCATION-ID-XXX - amz-sdk-request: - - !!binary | - YXR0ZW1wdD0x - authorization: - - AUTHORIZATION-XXX - x-amz-date: - - X-AMZ-DATE-XXX - method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse - response: - body: - string: '{"metrics":{"latencyMs":1071},"output":{"message":{"content":[{"toolUse":{"input":{"expression":"15 - * 8"},"name":"calculator","toolUseId":"tooluse_vjcn57LeQpS-pePkTvny8w"}}],"role":"assistant"}},"stopReason":"tool_use","usage":{"inputTokens":527,"outputTokens":55,"serverToolUsage":{},"totalTokens":582}}' - headers: - Connection: - - keep-alive - Content-Length: - - '304' - Content-Type: - - application/json - Date: - - Thu, 22 Jan 2026 21:27:57 GMT - x-amzn-RequestId: - - X-AMZN-REQUESTID-XXX - status: - code: 200 - message: OK -- request: - body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Calculate - 15 * 8\n\nThis is the expected criteria for your final answer: Result\nyou MUST - return the actual complete content as the final answer, not a summary.\n\nThis - is VERY important to you, your job depends on it!"}]}, {"role": "assistant", - "content": [{"toolUse": {"toolUseId": "tooluse_1OIARGnOTjiITDKGd_FgMA", "name": - "calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": - "tooluse_1OIARGnOTjiITDKGd_FgMA", "content": [{"text": "Error executing tool: - CalculatorTool._run() missing 1 required positional argument: ''expression''"}]}}]}, - {"role": "user", "content": [{"text": "Analyze the tool result. If requirements - are met, provide the Final Answer. Otherwise, call the next tool. Deliver only - the answer without meta-commentary."}]}, {"role": "assistant", "content": [{"toolUse": - {"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w", "name": "calculator", "input": - {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w", - "content": [{"text": "Error executing tool: CalculatorTool._run() missing 1 - required positional argument: ''expression''"}]}}]}, {"role": "user", "content": - [{"text": "Analyze the tool result. If requirements are met, provide the Final - Answer. Otherwise, call the next tool. Deliver only the answer without meta-commentary."}]}], + return the actual complete content as the final answer, not a summary."}]}], "inferenceConfig": {"stopSequences": ["\nObservation:"]}, "system": [{"text": "You are Math Assistant. You calculate.\nYour personal goal is: Calculate math"}], "toolConfig": {"tools": [{"toolSpec": {"name": "calculator", "description": "Perform mathematical calculations. Use this for any math operations.", "inputSchema": {"json": {"properties": {"expression": {"description": "Mathematical expression to evaluate", "title": "Expression", "type": "string"}}, "required": ["expression"], - "type": "object"}}}}]}}' + "type": "object", "additionalProperties": false}}}}]}}' headers: Content-Length: - - '1910' + - '779' Content-Type: - !!binary | YXBwbGljYXRpb24vanNvbg== @@ -144,21 +27,23 @@ interactions: - AUTHORIZATION-XXX x-amz-date: - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse response: body: - string: '{"metrics":{"latencyMs":927},"output":{"message":{"content":[{"toolUse":{"input":{"expression":"15 - * 8"},"name":"calculator","toolUseId":"tooluse__4aP-hcTR4Ozp5gTlESXbg"}}],"role":"assistant"}},"stopReason":"tool_use","usage":{"inputTokens":637,"outputTokens":57,"serverToolUsage":{},"totalTokens":694}}' + string: '{"metrics":{"latencyMs":1957},"output":{"message":{"content":[{"text":"I''ll + calculate 15 * 8 right away!"},{"toolUse":{"input":{"expression":"15 * 8"},"name":"calculator","toolUseId":"tooluse_XaQHWn1gW8bA6RHCR5fue8","type":"tool_use"}}],"role":"assistant"}},"stopReason":"tool_use","usage":{"cacheReadInputTokenCount":0,"cacheReadInputTokens":0,"cacheWriteInputTokenCount":0,"cacheWriteInputTokens":0,"inputTokens":642,"outputTokens":69,"serverToolUsage":{},"totalTokens":711}}' headers: Connection: - keep-alive Content-Length: - - '303' + - '477' Content-Type: - application/json Date: - - Thu, 22 Jan 2026 21:27:58 GMT + - Tue, 26 May 2026 17:05:59 GMT x-amzn-RequestId: - X-AMZN-REQUESTID-XXX status: @@ -167,112 +52,21 @@ interactions: - request: body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Calculate 15 * 8\n\nThis is the expected criteria for your final answer: Result\nyou MUST - return the actual complete content as the final answer, not a summary.\n\nThis - is VERY important to you, your job depends on it!"}]}, {"role": "assistant", - "content": [{"toolUse": {"toolUseId": "tooluse_1OIARGnOTjiITDKGd_FgMA", "name": - "calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": - "tooluse_1OIARGnOTjiITDKGd_FgMA", "content": [{"text": "Error executing tool: - CalculatorTool._run() missing 1 required positional argument: ''expression''"}]}}]}, - {"role": "user", "content": [{"text": "Analyze the tool result. If requirements - are met, provide the Final Answer. Otherwise, call the next tool. Deliver only - the answer without meta-commentary."}]}, {"role": "assistant", "content": [{"toolUse": - {"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w", "name": "calculator", "input": - {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w", - "content": [{"text": "Error executing tool: CalculatorTool._run() missing 1 - required positional argument: ''expression''"}]}}]}, {"role": "user", "content": - [{"text": "Analyze the tool result. If requirements are met, provide the Final - Answer. Otherwise, call the next tool. Deliver only the answer without meta-commentary."}]}, - {"role": "assistant", "content": [{"toolUse": {"toolUseId": "tooluse__4aP-hcTR4Ozp5gTlESXbg", - "name": "calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": - {"toolUseId": "tooluse__4aP-hcTR4Ozp5gTlESXbg", "content": [{"text": "Error - executing tool: CalculatorTool._run() missing 1 required positional argument: - ''expression''"}]}}]}, {"role": "user", "content": [{"text": "Analyze the tool - result. If requirements are met, provide the Final Answer. Otherwise, call the - next tool. Deliver only the answer without meta-commentary."}]}], "inferenceConfig": - {"stopSequences": ["\nObservation:"]}, "system": [{"text": "You are Math Assistant. - You calculate.\nYour personal goal is: Calculate math"}], "toolConfig": {"tools": - [{"toolSpec": {"name": "calculator", "description": "Perform mathematical calculations. - Use this for any math operations.", "inputSchema": {"json": {"properties": {"expression": - {"description": "Mathematical expression to evaluate", "title": "Expression", - "type": "string"}}, "required": ["expression"], "type": "object"}}}}]}}' - headers: - Content-Length: - - '2462' - Content-Type: - - !!binary | - YXBwbGljYXRpb24vanNvbg== - User-Agent: - - X-USER-AGENT-XXX - amz-sdk-invocation-id: - - AMZ-SDK-INVOCATION-ID-XXX - amz-sdk-request: - - !!binary | - YXR0ZW1wdD0x - authorization: - - AUTHORIZATION-XXX - x-amz-date: - - X-AMZ-DATE-XXX - method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse - response: - body: - string: '{"metrics":{"latencyMs":1226},"output":{"message":{"content":[{"toolUse":{"input":{"expression":"15 - * 8"},"name":"calculator","toolUseId":"tooluse_fEJhgDNjSUic0g97dN8Xww"}}],"role":"assistant"}},"stopReason":"tool_use","usage":{"inputTokens":747,"outputTokens":55,"serverToolUsage":{},"totalTokens":802}}' - headers: - Connection: - - keep-alive - Content-Length: - - '304' - Content-Type: - - application/json - Date: - - Thu, 22 Jan 2026 21:28:00 GMT - x-amzn-RequestId: - - X-AMZN-REQUESTID-XXX - status: - code: 200 - message: OK -- request: - body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Calculate - 15 * 8\n\nThis is the expected criteria for your final answer: Result\nyou MUST - return the actual complete content as the final answer, not a summary.\n\nThis - is VERY important to you, your job depends on it!"}]}, {"role": "assistant", - "content": [{"toolUse": {"toolUseId": "tooluse_1OIARGnOTjiITDKGd_FgMA", "name": - "calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": - "tooluse_1OIARGnOTjiITDKGd_FgMA", "content": [{"text": "Error executing tool: - CalculatorTool._run() missing 1 required positional argument: ''expression''"}]}}]}, - {"role": "user", "content": [{"text": "Analyze the tool result. If requirements - are met, provide the Final Answer. Otherwise, call the next tool. Deliver only - the answer without meta-commentary."}]}, {"role": "assistant", "content": [{"toolUse": - {"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w", "name": "calculator", "input": - {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w", - "content": [{"text": "Error executing tool: CalculatorTool._run() missing 1 - required positional argument: ''expression''"}]}}]}, {"role": "user", "content": - [{"text": "Analyze the tool result. If requirements are met, provide the Final - Answer. Otherwise, call the next tool. Deliver only the answer without meta-commentary."}]}, - {"role": "assistant", "content": [{"toolUse": {"toolUseId": "tooluse__4aP-hcTR4Ozp5gTlESXbg", - "name": "calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": - {"toolUseId": "tooluse__4aP-hcTR4Ozp5gTlESXbg", "content": [{"text": "Error - executing tool: CalculatorTool._run() missing 1 required positional argument: - ''expression''"}]}}]}, {"role": "user", "content": [{"text": "Analyze the tool - result. If requirements are met, provide the Final Answer. Otherwise, call the - next tool. Deliver only the answer without meta-commentary."}]}, {"role": "assistant", - "content": [{"toolUse": {"toolUseId": "tooluse_fEJhgDNjSUic0g97dN8Xww", "name": - "calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": - "tooluse_fEJhgDNjSUic0g97dN8Xww", "content": [{"text": "Error executing tool: - CalculatorTool._run() missing 1 required positional argument: ''expression''"}]}}]}, - {"role": "user", "content": [{"text": "Analyze the tool result. If requirements - are met, provide the Final Answer. Otherwise, call the next tool. Deliver only - the answer without meta-commentary."}]}], "inferenceConfig": {"stopSequences": + return the actual complete content as the final answer, not a summary."}]}, + {"role": "assistant", "content": [{"toolUse": {"toolUseId": "tooluse_XaQHWn1gW8bA6RHCR5fue8", + "name": "calculator", "input": {"expression": "15 * 8"}}}]}, {"role": "user", + "content": [{"toolResult": {"toolUseId": "tooluse_XaQHWn1gW8bA6RHCR5fue8", "content": + [{"text": "The result of 15 * 8 is 120"}]}}]}], "inferenceConfig": {"stopSequences": ["\nObservation:"]}, "system": [{"text": "You are Math Assistant. You calculate.\nYour personal goal is: Calculate math"}], "toolConfig": {"tools": [{"toolSpec": {"name": "calculator", "description": "Perform mathematical calculations. Use this for any math operations.", "inputSchema": {"json": {"properties": {"expression": {"description": "Mathematical expression to evaluate", "title": "Expression", - "type": "string"}}, "required": ["expression"], "type": "object"}}}}]}}' + "type": "string"}}, "required": ["expression"], "type": "object", "additionalProperties": + false}}}}]}}' headers: Content-Length: - - '3014' + - '1084' Content-Type: - !!binary | YXBwbGljYXRpb24vanNvbg== @@ -287,196 +81,22 @@ interactions: - AUTHORIZATION-XXX x-amz-date: - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse response: body: - string: '{"metrics":{"latencyMs":947},"output":{"message":{"content":[{"toolUse":{"input":{"expression":"15 - * 8"},"name":"calculator","toolUseId":"tooluse_F5QIGY91SBOeM4VcFRB73A"}}],"role":"assistant"}},"stopReason":"tool_use","usage":{"inputTokens":857,"outputTokens":55,"serverToolUsage":{},"totalTokens":912}}' + string: '{"metrics":{"latencyMs":1689},"output":{"message":{"content":[{"text":"120"}],"role":"assistant"}},"stopReason":"end_turn","usage":{"cacheReadInputTokenCount":0,"cacheReadInputTokens":0,"cacheWriteInputTokenCount":0,"cacheWriteInputTokens":0,"inputTokens":723,"outputTokens":4,"serverToolUsage":{},"totalTokens":727}}' headers: Connection: - keep-alive Content-Length: - - '303' + - '317' Content-Type: - application/json Date: - - Thu, 22 Jan 2026 21:28:01 GMT - x-amzn-RequestId: - - X-AMZN-REQUESTID-XXX - status: - code: 200 - message: OK -- request: - body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Calculate - 15 * 8\n\nThis is the expected criteria for your final answer: Result\nyou MUST - return the actual complete content as the final answer, not a summary.\n\nThis - is VERY important to you, your job depends on it!"}]}, {"role": "assistant", - "content": [{"toolUse": {"toolUseId": "tooluse_1OIARGnOTjiITDKGd_FgMA", "name": - "calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": - "tooluse_1OIARGnOTjiITDKGd_FgMA", "content": [{"text": "Error executing tool: - CalculatorTool._run() missing 1 required positional argument: ''expression''"}]}}]}, - {"role": "user", "content": [{"text": "Analyze the tool result. If requirements - are met, provide the Final Answer. Otherwise, call the next tool. Deliver only - the answer without meta-commentary."}]}, {"role": "assistant", "content": [{"toolUse": - {"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w", "name": "calculator", "input": - {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w", - "content": [{"text": "Error executing tool: CalculatorTool._run() missing 1 - required positional argument: ''expression''"}]}}]}, {"role": "user", "content": - [{"text": "Analyze the tool result. If requirements are met, provide the Final - Answer. Otherwise, call the next tool. Deliver only the answer without meta-commentary."}]}, - {"role": "assistant", "content": [{"toolUse": {"toolUseId": "tooluse__4aP-hcTR4Ozp5gTlESXbg", - "name": "calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": - {"toolUseId": "tooluse__4aP-hcTR4Ozp5gTlESXbg", "content": [{"text": "Error - executing tool: CalculatorTool._run() missing 1 required positional argument: - ''expression''"}]}}]}, {"role": "user", "content": [{"text": "Analyze the tool - result. If requirements are met, provide the Final Answer. Otherwise, call the - next tool. Deliver only the answer without meta-commentary."}]}, {"role": "assistant", - "content": [{"toolUse": {"toolUseId": "tooluse_fEJhgDNjSUic0g97dN8Xww", "name": - "calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": - "tooluse_fEJhgDNjSUic0g97dN8Xww", "content": [{"text": "Error executing tool: - CalculatorTool._run() missing 1 required positional argument: ''expression''"}]}}]}, - {"role": "user", "content": [{"text": "Analyze the tool result. If requirements - are met, provide the Final Answer. Otherwise, call the next tool. Deliver only - the answer without meta-commentary."}]}, {"role": "assistant", "content": [{"toolUse": - {"toolUseId": "tooluse_F5QIGY91SBOeM4VcFRB73A", "name": "calculator", "input": - {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": "tooluse_F5QIGY91SBOeM4VcFRB73A", - "content": [{"text": "Error executing tool: CalculatorTool._run() missing 1 - required positional argument: ''expression''"}]}}]}, {"role": "user", "content": - [{"text": "Analyze the tool result. If requirements are met, provide the Final - Answer. Otherwise, call the next tool. Deliver only the answer without meta-commentary."}]}, - {"role": "assistant", "content": [{"text": "Now 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."}]}], "inferenceConfig": - {"stopSequences": ["\nObservation:"]}, "system": [{"text": "You are Math Assistant. - You calculate.\nYour personal goal is: Calculate math"}], "toolConfig": {"tools": - [{"toolSpec": {"name": "calculator", "description": "Tool: calculator", "inputSchema": - {"json": {"type": "object", "properties": {}}}}}]}}' - headers: - Content-Length: - - '3599' - Content-Type: - - !!binary | - YXBwbGljYXRpb24vanNvbg== - User-Agent: - - X-USER-AGENT-XXX - amz-sdk-invocation-id: - - AMZ-SDK-INVOCATION-ID-XXX - amz-sdk-request: - - !!binary | - YXR0ZW1wdD0x - authorization: - - AUTHORIZATION-XXX - x-amz-date: - - X-AMZ-DATE-XXX - method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse - response: - body: - string: '{"message":"The model returned the following errors: Your API request - included an `assistant` message in the final position, which would pre-fill - the `assistant` response. When using tools, pre-filling the `assistant` response - is not supported."}' - headers: - Connection: - - keep-alive - Content-Length: - - '246' - Content-Type: - - application/json - Date: - - Thu, 22 Jan 2026 21:28:02 GMT - x-amzn-ErrorType: - - ValidationException:http://internal.amazon.com/coral/com.amazon.bedrock/ - x-amzn-RequestId: - - X-AMZN-REQUESTID-XXX - status: - code: 400 - message: Bad Request -- request: - body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Calculate - 15 * 8\n\nThis is the expected criteria for your final answer: Result\nyou MUST - return the actual complete content as the final answer, not a summary.\n\nThis - is VERY important to you, your job depends on it!"}]}, {"role": "assistant", - "content": [{"toolUse": {"toolUseId": "tooluse_1OIARGnOTjiITDKGd_FgMA", "name": - "calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": - "tooluse_1OIARGnOTjiITDKGd_FgMA", "content": [{"text": "Error executing tool: - CalculatorTool._run() missing 1 required positional argument: ''expression''"}]}}]}, - {"role": "user", "content": [{"text": "Analyze the tool result. If requirements - are met, provide the Final Answer. Otherwise, call the next tool. Deliver only - the answer without meta-commentary."}]}, {"role": "assistant", "content": [{"toolUse": - {"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w", "name": "calculator", "input": - {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w", - "content": [{"text": "Error executing tool: CalculatorTool._run() missing 1 - required positional argument: ''expression''"}]}}]}, {"role": "user", "content": - [{"text": "Analyze the tool result. If requirements are met, provide the Final - Answer. Otherwise, call the next tool. Deliver only the answer without meta-commentary."}]}, - {"role": "assistant", "content": [{"toolUse": {"toolUseId": "tooluse__4aP-hcTR4Ozp5gTlESXbg", - "name": "calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": - {"toolUseId": "tooluse__4aP-hcTR4Ozp5gTlESXbg", "content": [{"text": "Error - executing tool: CalculatorTool._run() missing 1 required positional argument: - ''expression''"}]}}]}, {"role": "user", "content": [{"text": "Analyze the tool - result. If requirements are met, provide the Final Answer. Otherwise, call the - next tool. Deliver only the answer without meta-commentary."}]}, {"role": "assistant", - "content": [{"toolUse": {"toolUseId": "tooluse_fEJhgDNjSUic0g97dN8Xww", "name": - "calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": - "tooluse_fEJhgDNjSUic0g97dN8Xww", "content": [{"text": "Error executing tool: - CalculatorTool._run() missing 1 required positional argument: ''expression''"}]}}]}, - {"role": "user", "content": [{"text": "Analyze the tool result. If requirements - are met, provide the Final Answer. Otherwise, call the next tool. Deliver only - the answer without meta-commentary."}]}, {"role": "assistant", "content": [{"toolUse": - {"toolUseId": "tooluse_F5QIGY91SBOeM4VcFRB73A", "name": "calculator", "input": - {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": "tooluse_F5QIGY91SBOeM4VcFRB73A", - "content": [{"text": "Error executing tool: CalculatorTool._run() missing 1 - required positional argument: ''expression''"}]}}]}, {"role": "user", "content": - [{"text": "Analyze the tool result. If requirements are met, provide the Final - Answer. Otherwise, call the next tool. Deliver only the answer without meta-commentary."}]}, - {"role": "assistant", "content": [{"text": "Now 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."}]}, {"role": "user", - "content": [{"text": "\nCurrent Task: Calculate 15 * 8\n\nThis is the expected - criteria for your final answer: Result\nyou MUST return the actual complete - content as the final answer, not a summary.\n\nThis is VERY important to you, - your job depends on it!"}]}, {"role": "assistant", "content": [{"text": "Now - 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."}]}], "inferenceConfig": {"stopSequences": ["\nObservation:"]}, - "system": [{"text": "You are Math Assistant. You calculate.\nYour personal goal - is: Calculate math\n\nYou are Math Assistant. You calculate.\nYour personal - goal is: Calculate math"}], "toolConfig": {"tools": [{"toolSpec": {"name": "calculator", - "description": "Tool: calculator", "inputSchema": {"json": {"type": "object", - "properties": {}}}}}]}}' - headers: - Content-Length: - - '4181' - Content-Type: - - !!binary | - YXBwbGljYXRpb24vanNvbg== - User-Agent: - - X-USER-AGENT-XXX - amz-sdk-invocation-id: - - AMZ-SDK-INVOCATION-ID-XXX - amz-sdk-request: - - !!binary | - YXR0ZW1wdD0x - authorization: - - AUTHORIZATION-XXX - x-amz-date: - - X-AMZ-DATE-XXX - method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse - response: - body: - string: '{"metrics":{"latencyMs":715},"output":{"message":{"content":[{"text":"\n\n120"}],"role":"assistant"}},"stopReason":"end_turn","usage":{"inputTokens":1082,"outputTokens":5,"serverToolUsage":{},"totalTokens":1087}}' - headers: - Connection: - - keep-alive - Content-Length: - - '212' - Content-Type: - - application/json - Date: - - Thu, 22 Jan 2026 21:28:03 GMT + - Tue, 26 May 2026 17:06:01 GMT x-amzn-RequestId: - X-AMZN-REQUESTID-XXX status: diff --git a/lib/crewai/tests/cassettes/agents/TestBedrockNativeToolCalling.test_bedrock_parallel_native_tool_calling_test_agent_kickoff.yaml b/lib/crewai/tests/cassettes/agents/TestBedrockNativeToolCalling.test_bedrock_parallel_native_tool_calling_test_agent_kickoff.yaml index 6ffc10e62..7d3f0cd7c 100644 --- a/lib/crewai/tests/cassettes/agents/TestBedrockNativeToolCalling.test_bedrock_parallel_native_tool_calling_test_agent_kickoff.yaml +++ b/lib/crewai/tests/cassettes/agents/TestBedrockNativeToolCalling.test_bedrock_parallel_native_tool_calling_test_agent_kickoff.yaml @@ -39,25 +39,112 @@ interactions: - AUTHORIZATION-XXX x-amz-date: - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse response: body: - string: '{"message":"The security token included in the request is invalid."}' + string: '{"metrics":{"latencyMs":2714},"output":{"message":{"content":[{"text":"I''ll + execute all 3 parallel searches simultaneously right now!"},{"toolUse":{"input":{"query":"latest + OpenAI model release notes"},"name":"parallel_local_search_one","toolUseId":"tooluse_kooGjILXmVRg8edl3YuEf4","type":"tool_use"}},{"toolUse":{"input":{"query":"latest + Anthropic model release notes"},"name":"parallel_local_search_two","toolUseId":"tooluse_qa71o2cLA65qg5TyweI63c","type":"tool_use"}},{"toolUse":{"input":{"query":"latest + Gemini model release notes"},"name":"parallel_local_search_three","toolUseId":"tooluse_gPf5hAC0sogbIJEjDBTIvO","type":"tool_use"}}],"role":"assistant"}},"stopReason":"tool_use","usage":{"cacheReadInputTokenCount":0,"cacheReadInputTokens":0,"cacheWriteInputTokenCount":0,"cacheWriteInputTokens":0,"inputTokens":914,"outputTokens":169,"serverToolUsage":{},"totalTokens":1083}}' headers: Connection: - keep-alive Content-Length: - - '68' + - '882' Content-Type: - application/json Date: - - Thu, 19 Feb 2026 00:00:08 GMT - x-amzn-ErrorType: - - UnrecognizedClientException:http://internal.amazon.com/coral/com.amazon.coral.service/ + - Tue, 26 May 2026 17:06:04 GMT x-amzn-RequestId: - X-AMZN-REQUESTID-XXX status: - code: 403 - message: Forbidden + code: 200 + message: OK +- request: + body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: This + is a tool-calling compliance test. In your next assistant turn, emit exactly + 3 tool calls in the same response (parallel tool calls), in this order: 1) parallel_local_search_one(query=''latest + OpenAI model release notes''), 2) parallel_local_search_two(query=''latest Anthropic + model release notes''), 3) parallel_local_search_three(query=''latest Gemini + model release notes''). Do not call any other tools and do not answer before + those 3 tool calls are emitted. After the tool results return, provide a one + paragraph summary."}]}, {"role": "assistant", "content": [{"toolUse": {"toolUseId": + "tooluse_kooGjILXmVRg8edl3YuEf4", "name": "parallel_local_search_one", "input": + {"query": "latest OpenAI model release notes"}}}, {"toolUse": {"toolUseId": + "tooluse_qa71o2cLA65qg5TyweI63c", "name": "parallel_local_search_two", "input": + {"query": "latest Anthropic model release notes"}}}, {"toolUse": {"toolUseId": + "tooluse_gPf5hAC0sogbIJEjDBTIvO", "name": "parallel_local_search_three", "input": + {"query": "latest Gemini model release notes"}}}]}, {"role": "user", "content": + [{"toolResult": {"toolUseId": "tooluse_kooGjILXmVRg8edl3YuEf4", "content": [{"text": + "[one] latest OpenAI model release notes"}]}}, {"toolResult": {"toolUseId": + "tooluse_qa71o2cLA65qg5TyweI63c", "content": [{"text": "[two] latest Anthropic + model release notes"}]}}, {"toolResult": {"toolUseId": "tooluse_gPf5hAC0sogbIJEjDBTIvO", + "content": [{"text": "[three] latest Gemini model release notes"}]}}]}], "inferenceConfig": + {"stopSequences": ["\nObservation:"]}, "system": [{"text": "You are Parallel + Tool Agent. You follow tool instructions precisely.\nYour personal goal is: + Use both tools exactly as instructed"}], "toolConfig": {"tools": [{"toolSpec": + {"name": "parallel_local_search_one", "description": "Local search tool #1 for + concurrency testing.", "inputSchema": {"json": {"properties": {"query": {"description": + "Search query", "title": "Query", "type": "string"}}, "required": ["query"], + "type": "object", "additionalProperties": false}}}}, {"toolSpec": {"name": "parallel_local_search_two", + "description": "Local search tool #2 for concurrency testing.", "inputSchema": + {"json": {"properties": {"query": {"description": "Search query", "title": "Query", + "type": "string"}}, "required": ["query"], "type": "object", "additionalProperties": + false}}}}, {"toolSpec": {"name": "parallel_local_search_three", "description": + "Local search tool #3 for concurrency testing.", "inputSchema": {"json": {"properties": + {"query": {"description": "Search query", "title": "Query", "type": "string"}}, + "required": ["query"], "type": "object", "additionalProperties": false}}}}]}}' + headers: + Content-Length: + - '2711' + Content-Type: + - !!binary | + YXBwbGljYXRpb24vanNvbg== + User-Agent: + - X-USER-AGENT-XXX + amz-sdk-invocation-id: + - AMZ-SDK-INVOCATION-ID-XXX + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + authorization: + - AUTHORIZATION-XXX + x-amz-date: + - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX + method: POST + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse + response: + body: + string: "{\"metrics\":{\"latencyMs\":5051},\"output\":{\"message\":{\"content\":[{\"text\":\"The + three parallel searches were executed simultaneously across all tools, querying + the latest release notes for OpenAI, Anthropic, and Gemini models respectively. + The search results returned placeholder outputs from each tool (indicating + a test environment), confirming that all three tools \u2014 **parallel_local_search_one**, + **parallel_local_search_two**, and **parallel_local_search_three** \u2014 + fired concurrently and responded successfully in the correct order. In a live + environment, these results would contain detailed release notes for the latest + models from each AI provider, such as OpenAI's GPT series updates, Anthropic's + Claude model iterations, and Google's Gemini model announcements, allowing + for a comprehensive side-by-side comparison of the most recent advancements + across the three leading AI platforms.\"}],\"role\":\"assistant\"}},\"stopReason\":\"end_turn\",\"usage\":{\"cacheReadInputTokenCount\":0,\"cacheReadInputTokens\":0,\"cacheWriteInputTokenCount\":0,\"cacheWriteInputTokens\":0,\"inputTokens\":1197,\"outputTokens\":173,\"serverToolUsage\":{},\"totalTokens\":1370}}" + headers: + Connection: + - keep-alive + Content-Length: + - '1141' + Content-Type: + - application/json + Date: + - Tue, 26 May 2026 17:06:10 GMT + x-amzn-RequestId: + - X-AMZN-REQUESTID-XXX + status: + code: 200 + message: OK version: 1 diff --git a/lib/crewai/tests/cassettes/agents/TestBedrockNativeToolCalling.test_bedrock_parallel_native_tool_calling_test_crew.yaml b/lib/crewai/tests/cassettes/agents/TestBedrockNativeToolCalling.test_bedrock_parallel_native_tool_calling_test_crew.yaml index 00ee01d24..0c19740ab 100644 --- a/lib/crewai/tests/cassettes/agents/TestBedrockNativeToolCalling.test_bedrock_parallel_native_tool_calling_test_crew.yaml +++ b/lib/crewai/tests/cassettes/agents/TestBedrockNativeToolCalling.test_bedrock_parallel_native_tool_calling_test_crew.yaml @@ -41,27 +41,31 @@ interactions: - AUTHORIZATION-XXX x-amz-date: - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse response: body: - string: '{"message":"The security token included in the request is invalid."}' + string: '{"metrics":{"latencyMs":2911},"output":{"message":{"content":[{"text":"I''ll + execute all 3 parallel searches simultaneously right away!"},{"toolUse":{"input":{"query":"latest + OpenAI model release notes"},"name":"parallel_local_search_one","toolUseId":"tooluse_hd4QaBJIe0j2FasplcWi78","type":"tool_use"}},{"toolUse":{"input":{"query":"latest + Anthropic model release notes"},"name":"parallel_local_search_two","toolUseId":"tooluse_yB6xS6E1bsIOpv8rWcnpiR","type":"tool_use"}},{"toolUse":{"input":{"query":"latest + Gemini model release notes"},"name":"parallel_local_search_three","toolUseId":"tooluse_cjCrMYQMmA8diLWBnKJ86o","type":"tool_use"}}],"role":"assistant"}},"stopReason":"tool_use","usage":{"cacheReadInputTokenCount":0,"cacheReadInputTokens":0,"cacheWriteInputTokenCount":0,"cacheWriteInputTokens":0,"inputTokens":951,"outputTokens":169,"serverToolUsage":{},"totalTokens":1120}}' headers: Connection: - keep-alive Content-Length: - - '68' + - '883' Content-Type: - application/json Date: - - Thu, 19 Feb 2026 00:00:07 GMT - x-amzn-ErrorType: - - UnrecognizedClientException:http://internal.amazon.com/coral/com.amazon.coral.service/ + - Tue, 26 May 2026 17:06:14 GMT x-amzn-RequestId: - X-AMZN-REQUESTID-XXX status: - code: 403 - message: Forbidden + code: 200 + message: OK - request: body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: This is a tool-calling compliance test. In your next assistant turn, emit exactly @@ -72,122 +76,35 @@ interactions: those 3 tool calls are emitted. After the tool results return, provide a one paragraph summary.\n\nThis is the expected criteria for your final answer: A one sentence summary of both tool outputs\nyou MUST return the actual complete - content as the final answer, not a summary."}]}, {"role": "user", "content": - [{"text": "\nCurrent Task: This is a tool-calling compliance test. In your next - assistant turn, emit exactly 3 tool calls in the same response (parallel tool - calls), in this order: 1) parallel_local_search_one(query=''latest OpenAI model - release notes''), 2) parallel_local_search_two(query=''latest Anthropic model - release notes''), 3) parallel_local_search_three(query=''latest Gemini model - release notes''). Do not call any other tools and do not answer before those - 3 tool calls are emitted. After the tool results return, provide a one paragraph - summary.\n\nThis is the expected criteria for your final answer: A one sentence - summary of both tool outputs\nyou MUST return the actual complete content as - the final answer, not a summary."}]}], "inferenceConfig": {"stopSequences": - ["\nObservation:"]}, "system": [{"text": "You are Parallel Tool Agent. You follow - tool instructions precisely.\nYour personal goal is: Use both tools exactly - as instructed\n\nYou are Parallel Tool Agent. You follow tool instructions precisely.\nYour - personal goal is: Use both tools exactly as instructed"}], "toolConfig": {"tools": - [{"toolSpec": {"name": "parallel_local_search_one", "description": "Local search - tool #1 for concurrency testing.", "inputSchema": {"json": {"properties": {"query": - {"description": "Search query", "title": "Query", "type": "string"}}, "required": - ["query"], "type": "object", "additionalProperties": false}}}}, {"toolSpec": - {"name": "parallel_local_search_two", "description": "Local search tool #2 for + content as the final answer, not a summary."}]}, {"role": "assistant", "content": + [{"toolUse": {"toolUseId": "tooluse_hd4QaBJIe0j2FasplcWi78", "name": "parallel_local_search_one", + "input": {"query": "latest OpenAI model release notes"}}}, {"toolUse": {"toolUseId": + "tooluse_yB6xS6E1bsIOpv8rWcnpiR", "name": "parallel_local_search_two", "input": + {"query": "latest Anthropic model release notes"}}}, {"toolUse": {"toolUseId": + "tooluse_cjCrMYQMmA8diLWBnKJ86o", "name": "parallel_local_search_three", "input": + {"query": "latest Gemini model release notes"}}}]}, {"role": "user", "content": + [{"toolResult": {"toolUseId": "tooluse_hd4QaBJIe0j2FasplcWi78", "content": [{"text": + "[one] latest OpenAI model release notes"}]}}, {"toolResult": {"toolUseId": + "tooluse_yB6xS6E1bsIOpv8rWcnpiR", "content": [{"text": "[two] latest Anthropic + model release notes"}]}}, {"toolResult": {"toolUseId": "tooluse_cjCrMYQMmA8diLWBnKJ86o", + "content": [{"text": "[three] latest Gemini model release notes"}]}}]}], "inferenceConfig": + {"stopSequences": ["\nObservation:"]}, "system": [{"text": "You are Parallel + Tool Agent. You follow tool instructions precisely.\nYour personal goal is: + Use both tools exactly as instructed"}], "toolConfig": {"tools": [{"toolSpec": + {"name": "parallel_local_search_one", "description": "Local search tool #1 for concurrency testing.", "inputSchema": {"json": {"properties": {"query": {"description": "Search query", "title": "Query", "type": "string"}}, "required": ["query"], - "type": "object", "additionalProperties": false}}}}, {"toolSpec": {"name": "parallel_local_search_three", - "description": "Local search tool #3 for concurrency testing.", "inputSchema": + "type": "object", "additionalProperties": false}}}}, {"toolSpec": {"name": "parallel_local_search_two", + "description": "Local search tool #2 for concurrency testing.", "inputSchema": {"json": {"properties": {"query": {"description": "Search query", "title": "Query", "type": "string"}}, "required": ["query"], "type": "object", "additionalProperties": - false}}}}]}}' - headers: - Content-Length: - - '2855' - Content-Type: - - !!binary | - YXBwbGljYXRpb24vanNvbg== - User-Agent: - - X-USER-AGENT-XXX - amz-sdk-invocation-id: - - AMZ-SDK-INVOCATION-ID-XXX - amz-sdk-request: - - !!binary | - YXR0ZW1wdD0x - authorization: - - AUTHORIZATION-XXX - x-amz-date: - - X-AMZ-DATE-XXX - method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse - response: - body: - string: '{"message":"The security token included in the request is invalid."}' - headers: - Connection: - - keep-alive - Content-Length: - - '68' - Content-Type: - - application/json - Date: - - Thu, 19 Feb 2026 00:00:07 GMT - x-amzn-ErrorType: - - UnrecognizedClientException:http://internal.amazon.com/coral/com.amazon.coral.service/ - x-amzn-RequestId: - - X-AMZN-REQUESTID-XXX - status: - code: 403 - message: Forbidden -- request: - body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: This - is a tool-calling compliance test. In your next assistant turn, emit exactly - 3 tool calls in the same response (parallel tool calls), in this order: 1) parallel_local_search_one(query=''latest - OpenAI model release notes''), 2) parallel_local_search_two(query=''latest Anthropic - model release notes''), 3) parallel_local_search_three(query=''latest Gemini - model release notes''). Do not call any other tools and do not answer before - those 3 tool calls are emitted. After the tool results return, provide a one - paragraph summary.\n\nThis is the expected criteria for your final answer: A - one sentence summary of both tool outputs\nyou MUST return the actual complete - content as the final answer, not a summary."}]}, {"role": "user", "content": - [{"text": "\nCurrent Task: This is a tool-calling compliance test. In your next - assistant turn, emit exactly 3 tool calls in the same response (parallel tool - calls), in this order: 1) parallel_local_search_one(query=''latest OpenAI model - release notes''), 2) parallel_local_search_two(query=''latest Anthropic model - release notes''), 3) parallel_local_search_three(query=''latest Gemini model - release notes''). Do not call any other tools and do not answer before those - 3 tool calls are emitted. After the tool results return, provide a one paragraph - summary.\n\nThis is the expected criteria for your final answer: A one sentence - summary of both tool outputs\nyou MUST return the actual complete content as - the final answer, not a summary."}]}, {"role": "user", "content": [{"text": - "\nCurrent Task: This is a tool-calling compliance test. In your next assistant - turn, emit exactly 3 tool calls in the same response (parallel tool calls), - in this order: 1) parallel_local_search_one(query=''latest OpenAI model release - notes''), 2) parallel_local_search_two(query=''latest Anthropic model release - notes''), 3) parallel_local_search_three(query=''latest Gemini model release - notes''). Do not call any other tools and do not answer before those 3 tool - calls are emitted. After the tool results return, provide a one paragraph summary.\n\nThis - is the expected criteria for your final answer: A one sentence summary of both - tool outputs\nyou MUST return the actual complete content as the final answer, - not a summary."}]}], "inferenceConfig": {"stopSequences": ["\nObservation:"]}, - "system": [{"text": "You are Parallel Tool Agent. You follow tool instructions - precisely.\nYour personal goal is: Use both tools exactly as instructed\n\nYou - are Parallel Tool Agent. You follow tool instructions precisely.\nYour personal - goal is: Use both tools exactly as instructed\n\nYou are Parallel Tool Agent. - You follow tool instructions precisely.\nYour personal goal is: Use both tools - exactly as instructed"}], "toolConfig": {"tools": [{"toolSpec": {"name": "parallel_local_search_one", - "description": "Local search tool #1 for concurrency testing.", "inputSchema": - {"json": {"properties": {"query": {"description": "Search query", "title": "Query", - "type": "string"}}, "required": ["query"], "type": "object", "additionalProperties": - false}}}}, {"toolSpec": {"name": "parallel_local_search_two", "description": - "Local search tool #2 for concurrency testing.", "inputSchema": {"json": {"properties": + false}}}}, {"toolSpec": {"name": "parallel_local_search_three", "description": + "Local search tool #3 for concurrency testing.", "inputSchema": {"json": {"properties": {"query": {"description": "Search query", "title": "Query", "type": "string"}}, - "required": ["query"], "type": "object", "additionalProperties": false}}}}, - {"toolSpec": {"name": "parallel_local_search_three", "description": "Local search - tool #3 for concurrency testing.", "inputSchema": {"json": {"properties": {"query": - {"description": "Search query", "title": "Query", "type": "string"}}, "required": - ["query"], "type": "object", "additionalProperties": false}}}}]}}' + "required": ["query"], "type": "object", "additionalProperties": false}}}}]}}' headers: Content-Length: - - '3756' + - '2892' Content-Type: - !!binary | YXBwbGljYXRpb24vanNvbg== @@ -202,25 +119,35 @@ interactions: - AUTHORIZATION-XXX x-amz-date: - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse response: body: - string: '{"message":"The security token included in the request is invalid."}' + string: "{\"metrics\":{\"latencyMs\":4350},\"output\":{\"message\":{\"content\":[{\"text\":\"Here + is the complete content returned by all three tools:\\n\\n- **Tool 1 (parallel_local_search_one):** + `[one] latest OpenAI model release notes`\\n- **Tool 2 (parallel_local_search_two):** + `[two] latest Anthropic model release notes`\\n- **Tool 3 (parallel_local_search_three):** + `[three] latest Gemini model release notes`\\n\\nThe three parallel searches + returned placeholder results confirming the queries were received: the first + tool acknowledged a search for the latest OpenAI model release notes, the + second for the latest Anthropic model release notes, and the third for the + latest Gemini model release notes \u2014 indicating the local search tools + processed all three concurrent requests successfully but did not return detailed + release note content beyond the query echo.\"}],\"role\":\"assistant\"}},\"stopReason\":\"end_turn\",\"usage\":{\"cacheReadInputTokenCount\":0,\"cacheReadInputTokens\":0,\"cacheWriteInputTokenCount\":0,\"cacheWriteInputTokens\":0,\"inputTokens\":1234,\"outputTokens\":181,\"serverToolUsage\":{},\"totalTokens\":1415}}" headers: Connection: - keep-alive Content-Length: - - '68' + - '1093' Content-Type: - application/json Date: - - Thu, 19 Feb 2026 00:00:07 GMT - x-amzn-ErrorType: - - UnrecognizedClientException:http://internal.amazon.com/coral/com.amazon.coral.service/ + - Tue, 26 May 2026 17:06:19 GMT x-amzn-RequestId: - X-AMZN-REQUESTID-XXX status: - code: 403 - message: Forbidden + code: 200 + message: OK version: 1 diff --git a/lib/crewai/tests/cassettes/llms/TestBedrockMultimodalIntegration.test_analyze_pdf.yaml b/lib/crewai/tests/cassettes/llms/TestBedrockMultimodalIntegration.test_analyze_pdf.yaml index f47086040..c6634a115 100644 --- a/lib/crewai/tests/cassettes/llms/TestBedrockMultimodalIntegration.test_analyze_pdf.yaml +++ b/lib/crewai/tests/cassettes/llms/TestBedrockMultimodalIntegration.test_analyze_pdf.yaml @@ -21,61 +21,22 @@ interactions: - AUTHORIZATION-XXX x-amz-date: - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX method: POST - uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse + uri: https://bedrock-runtime.vcr.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse response: body: - string: '{"metrics":{"latencyMs":867},"output":{"message":{"content":[{"text":"PDF"}],"role":"assistant"}},"stopReason":"end_turn","usage":{"inputTokens":57,"outputTokens":4,"serverToolUsage":{},"totalTokens":61}}' + string: '{"metrics":{"latencyMs":2732},"output":{"message":{"content":[{"text":"Blank"}],"role":"assistant"}},"stopReason":"end_turn","usage":{"cacheReadInputTokenCount":0,"cacheReadInputTokens":0,"cacheWriteInputTokenCount":0,"cacheWriteInputTokens":0,"inputTokens":1606,"outputTokens":5,"serverToolUsage":{},"totalTokens":1611}}' headers: Connection: - keep-alive Content-Length: - - '204' + - '321' Content-Type: - application/json Date: - - Fri, 23 Jan 2026 03:26:35 GMT - x-amzn-RequestId: - - X-AMZN-REQUESTID-XXX - status: - code: 200 - message: OK -- request: - body: '{"messages": [{"role": "user", "content": [{"text": "What type of document - is this? Answer in one word."}, {"document": {"name": "document", "format": - "pdf", "source": {"bytes": "JVBERi0xLjQKMSAwIG9iaiA8PCAvVHlwZSAvQ2F0YWxvZyAvUGFnZXMgMiAwIFIgPj4gZW5kb2JqCjIgMCBvYmogPDwgL1R5cGUgL1BhZ2VzIC9LaWRzIFszIDAgUl0gL0NvdW50IDEgPj4gZW5kb2JqCjMgMCBvYmogPDwgL1R5cGUgL1BhZ2UgL1BhcmVudCAyIDAgUiAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXSA+PiBlbmRvYmoKeHJlZgowIDQKMDAwMDAwMDAwMCA2NTUzNSBmCjAwMDAwMDAwMDkgMDAwMDAgbgowMDAwMDAwMDU4IDAwMDAwIG4KMDAwMDAwMDExNSAwMDAwMCBuCnRyYWlsZXIgPDwgL1NpemUgNCAvUm9vdCAxIDAgUiA+PgpzdGFydHhyZWYKMTk2CiUlRU9GCg=="}}}]}], - "inferenceConfig": {}}' - headers: - Content-Length: - - '646' - Content-Type: - - !!binary | - YXBwbGljYXRpb24vanNvbg== - User-Agent: - - X-USER-AGENT-XXX - amz-sdk-invocation-id: - - AMZ-SDK-INVOCATION-ID-XXX - amz-sdk-request: - - !!binary | - YXR0ZW1wdD0x - authorization: - - AUTHORIZATION-XXX - x-amz-date: - - X-AMZ-DATE-XXX - method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse - response: - body: - string: '{"metrics":{"latencyMs":291},"output":{"message":{"content":[{"text":"Incomplete"}],"role":"assistant"}},"stopReason":"end_turn","usage":{"inputTokens":57,"outputTokens":5,"serverToolUsage":{},"totalTokens":62}}' - headers: - Connection: - - keep-alive - Content-Length: - - '211' - Content-Type: - - application/json - Date: - - Fri, 23 Jan 2026 06:02:32 GMT + - Tue, 26 May 2026 17:34:51 GMT x-amzn-RequestId: - X-AMZN-REQUESTID-XXX status: diff --git a/lib/crewai/tests/cassettes/llms/TestBedrockMultimodalIntegration.test_describe_image.yaml b/lib/crewai/tests/cassettes/llms/TestBedrockMultimodalIntegration.test_describe_image.yaml index d13deeb77..494a347bf 100644 --- a/lib/crewai/tests/cassettes/llms/TestBedrockMultimodalIntegration.test_describe_image.yaml +++ b/lib/crewai/tests/cassettes/llms/TestBedrockMultimodalIntegration.test_describe_image.yaml @@ -21,65 +21,24 @@ interactions: - AUTHORIZATION-XXX x-amz-date: - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX method: POST - uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse response: body: - string: '{"metrics":{"latencyMs":950},"output":{"message":{"content":[{"text":"The - image shows a linear graph depicting the revenue over time, with the revenue - increasing steadily from 2020.0 to 2024.0."}],"role":"assistant"}},"stopReason":"end_turn","usage":{"inputTokens":435,"outputTokens":35,"serverToolUsage":{},"totalTokens":470}}' + string: '{"metrics":{"latencyMs":2753},"output":{"message":{"content":[{"text":"A + line chart showing steady linear revenue growth from $100M in 2020 to $300M + in 2024."}],"role":"assistant"}},"stopReason":"end_turn","usage":{"cacheReadInputTokenCount":0,"cacheReadInputTokens":0,"cacheWriteInputTokenCount":0,"cacheWriteInputTokens":0,"inputTokens":435,"outputTokens":29,"serverToolUsage":{},"totalTokens":464}}' headers: Connection: - keep-alive Content-Length: - - '327' + - '401' Content-Type: - application/json Date: - - Fri, 23 Jan 2026 03:26:33 GMT - x-amzn-RequestId: - - X-AMZN-REQUESTID-XXX - status: - code: 200 - message: OK -- request: - body: '{"messages": [{"role": "user", "content": [{"text": "Describe this image - in one sentence. Be brief."}, {"image": {"format": "png", "source": {"bytes": - "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABr0klEQVR4nO3dd3RU5fr+//ek90CAJJTQpXelKQoIBBBBFKUEFBDxiAl6QBDxKPWoKIpSYv0qqIcAUkVEMCpVAYEQuvQqJNQ0QpJJZv/+8Md8jISezGRmrtdaWYtd5tn3nckkF/uZvcdkGIaBiIiIiLgMN3sXICIiIiK2pQAoIiIi4mIUAEVERERcjAKgiIiIiItRABQRERFxMQqAIiIiIi5GAVBERETExSgAioiIiLgYBUARERERF6MAKCIiIuJiFABFREREXIwCoIiIiIiLUQAUERERcTEKgCIiIiIuRgFQRERExMUoAIqIiIi4GAVAERERERejACgiIiLiYhQARURERFyMAqCIiIiIi1EAFBEREXExCoAiIiIiLkYBUERERMTFKACKiIiIuBgFQBEREREXowAoIiIi4mIUAEVERERcjAKgiIiIiItRABQRERFxMQqAIiIiIi5GAVBERETExSgAioiIiLgYBUARERERF6MAKCIiIuJiFABFRFzEgAEDqFy5sr3LEJFiQAFQxEnNmjULk8lk/fLw8KB8+fIMGDCAP//8097lFXvLli2jU6dOlCpVCh8fH2rUqMGIESM4f/68vUvL5+/P8fW+Vq9ebe9SRaQY8bB3ASJStCZMmECVKlXIyspi48aNzJo1i/Xr17Nr1y58fHzsXV6xNGLECN577z0aNmzIqFGjCAkJISEhgRkzZjB37lx+/vlnatasae8yAfj666/zLX/11VfEx8dftb527dp89tlnWCwWW5YnIsWUyTAMw95FiEjhmzVrFgMHDmTz5s3cc8891vWvvPIKb7/9NvPmzaNnz552rLB4mjNnDlFRUfTq1YvZs2fj7u5u3fb777/Ttm1bqlWrRkJCAh4etvs/9KVLl/D397/hfjExMcTGxqJf7SJyPZoCFnEx999/PwCHDh3Kt/6PP/7g8ccfJyQkBB8fH+655x6WLl1q3b5lyxZMJhNffvnlVWOuXLkSk8nEsmXLrOv+/PNPnn76acLCwvD29qZu3bp88cUX+R63evVqTCYT33zzDW+88QYVKlTAx8eHdu3acfDgwXz7Vq5cmQEDBlx17DZt2tCmTZt867Kzsxk7dizVq1fH29ubiIgIXn75ZbKzs2/4/Rk/fjwlS5bk008/zRf+AJo1a8aoUaPYuXMnCxYsAP4KXAEBAWRmZl41Vp8+fQgPDycvL8+67ocffuD+++/H39+fwMBAunTpwu7du/M9bsCAAQQEBHDo0CEeeughAgMD6du37w1rv5F/vgfw6NGjmEwm3n33XWJjY6latSp+fn5ERkZy4sQJDMNg4sSJVKhQAV9fXx555BEuXLhw1bg305OIFC8KgCIu5ujRowCULFnSum737t20aNGCvXv38sorr/Dee+/h7+9P9+7dWbx4MQD33HMPVatW5ZtvvrlqzHnz5lGyZEk6duwIQHJyMi1atOCnn34iJiaGqVOnUr16dQYNGsQHH3xw1eMnTZrE4sWLGTFiBKNHj2bjxo23HXgsFgvdunXj3XffpWvXrkyfPp3u3bvz/vvv06tXr+s+9sCBA+zbt49HHnmEoKCgAvd56qmnAKxht1evXly6dInvv/8+336ZmZl89913PP7449Yg+fXXX9OlSxcCAgJ4++23ef3119mzZw+tWrWyPi9X5Obm0rFjR0JDQ3n33Xfp0aPH7Xw7bsrs2bP58MMPGTp0KC+99BJr1qyhZ8+evPbaa6xYsYJRo0bx7LPP8t133zFixIh8j72VnkSkGDFExCnNnDnTAIyffvrJOHv2rHHixAljwYIFRpkyZQxvb2/jxIkT1n3btWtn1K9f38jKyrKus1gsxr333mvcdddd1nWjR482PD09jQsXLljXZWdnGyVKlDCefvpp67pBgwYZZcuWNc6dO5evpt69exvBwcFGZmamYRiGsWrVKgMwateubWRnZ1v3mzp1qgEYO3futK6rVKmS0b9//6v6bN26tdG6dWvr8tdff224ubkZ69aty7ffxx9/bADGr7/+es3v2ZIlSwzAeP/996+5j2EYRlBQkNGkSRPDMP76PpUvX97o0aNHvn2++eYbAzDWrl1rGIZhpKenGyVKlDAGDx6cb7+kpCQjODg43/r+/fsbgPHKK69ct46CREdHG9f61d6/f3+jUqVK1uUjR44YgFGmTBkjJSXFun706NEGYDRs2NAwm83W9X369DG8vLysPye30pOIFC86Ayji5Nq3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zt6j+pM7oYtARERERFyMzgCKiIiIuBgFQBEREREXowAoIiIi4mIUAEVERERcjALgHXjrrbdo2rQpgYGBhIaG0r17d/bt25dvn6ysLKKjoylVqhQBAQH06NGD5ORk6/bt27fTp08fIiIi8PX1pXbt2kydOvWqY61evZomTZrg7e1N9erVmTVr1g3r27FjB/fffz8+Pj5ERETwzjvvOFWPR48exWQyXfW1cePGYtff6dOniYqKokaNGri5ufHvf//7puo7fvw4Xbp0wc/Pj9DQUEaOHElubu5N9+cIPRb0HM6dO7fY9bdo0SI6dOhAmTJlCAoKomXLlqxcufKG9d3p67A491cYr0Fb9rh+/Xruu+8+SpUqha+vL7Vq1eL999+/YX2O8hzeTn+O9Hv073799Vc8PDxo1KjRDesrjL+FTsmQ29axY0dj5syZxq5du4zExETjoYceMipWrGhkZGRY93nuueeMiIgI4+effza2bNlitGjRwrj33nut2z///HPjhRdeMFavXm0cOnTI+Prrrw1fX19j+vTp1n0OHz5s+Pn5GcOHDzf27NljTJ8+3XB3dzdWrFhxzdpSU1ONsLAwo2/fvsauXbuMOXPmGL6+vsYnn3ziND0eOXLEAIyffvrJOH36tPUrJyen2PV35MgR44UXXjC+/PJLo1GjRsaLL754w9pyc3ONevXqGe3btze2bdtmLF++3ChdurQxevTom+6vuPdoGIYBGDNnzsz3HF6+fLnY9ffiiy8ab7/9tvH7778b+/fvN0aPHm14enoaCQkJ16ytMF6Hxbm/wngN2rLHhIQEIy4uzti1a5dx5MgR4+uvvzb8/Pyu+3w40nN4O/050u/RKy5evGhUrVrViIyMNBo2bHjd2grrb6EzUgAsRGfOnDEAY82aNYZhGEZKSorh6elpzJ8/37rP3r17DcDYsGHDNcd5/vnnjbZt21qXX375ZaNu3br59unVq5fRsWPHa47x4YcfGiVLljSys7Ot60aNGmXUrFnzlvv6u+LU45VfXNu2bbvNbq5WVP39XevWrW8qHC1fvtxwc3MzkpKSrOs++ugjIygoKN/zequKU4+G8VcAXLx48U3XfyO26O+KOnXqGOPHj7/m9qJ4HRan/oriNWgYtu3x0UcfNfr163fN7Y7+HN6oP0f8PdqrVy/jtddeM8aOHXvDAFhUfwudgaaA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l19+menTp1OhQoVCPabZbC7U8URECpsCoIg4vYiICKZOncqIESM4cuQIhmEwaNAgIiMjady4MZ07dyYgIICwsDCefPJJzp07Z33sihUraNWqFSVKlKBUqVI8/PDDHDp0yLr96NGjmEwm5s2bR+vWrfHx8WH27Nn2aFNE5Kbps4BFxGV0796d1NRUHnvsMSZOnMju3bupW7cuzzzzDE899RSXL19m1KhR5Obm8ssvvwCwcOFCTCYTDRo0ICMjgzFjxnD06FESExNxc3Pj6NGjVKlShcqVK/Pee+/RuHFjfHx8KFu2rJ27FRG5NgVAEXEZZ86coW7duly4cIGFCxeya9cu1q1bx8qVK637nDx5koiICPbt20eNGjWuGuPcuXOUKVOGnTt3Uq9ePWsA/OCDD3jxxRdt2Y6IyG3TFLCIuIzQ0FD+9a9/Ubt2bbp378727dtZtWoVAQEB1q9atWoBWKd5Dxw4QJ8+fahatSpBQUFUrlwZgOPHj+cb+5577rFpLyIid8LD3gWIiNiSh4cHHh5//erLyMiga9euvP3221ftd2UKt2vXrlSqVInPPvuMcuXKYbFYqFevHjk5Ofn29/f3L/riRUQKiQKgiLisJk2asHDhQipXrmwNhX93/vx59u3bx2effcb9998PwPr1621dpohIodMUsIi4rOjoaC5cuECfPn3YvHkzhw4dYuXKlQwcOJC8vDxKlixJqVKl+PTTTzl48CC//PILw4cPt3fZIiJ3TAFQRFxWuXLl+PXXX8nLyyMyMpL69evz73//mxIlSuDm5oabmxtz585l69at1KtXj2HDhjF58mR7ly0icsd0FbCIiIiIi9EZQBEREREXowAoIiIi4mIUAEVERERcjAKgiIiIiItRABQRERFxMQqAIiIiIi5GAVBERETExSgAioiIiLgYBUARERERF6MAKCIiIuJiFABFREREXIwCoIiIiIiL+f8Aotl7LKm7ZkIAAAAASUVORK5CYII="}}}]}], - "inferenceConfig": {}}' - headers: - Content-Length: - - '37183' - Content-Type: - - !!binary | - YXBwbGljYXRpb24vanNvbg== - User-Agent: - - X-USER-AGENT-XXX - amz-sdk-invocation-id: - - AMZ-SDK-INVOCATION-ID-XXX - amz-sdk-request: - - !!binary | - YXR0ZW1wdD0x - authorization: - - AUTHORIZATION-XXX - x-amz-date: - - X-AMZ-DATE-XXX - method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse - response: - body: - string: '{"metrics":{"latencyMs":857},"output":{"message":{"content":[{"text":"This - image shows a linear increase in revenue over time, as depicted in the graph - titled \"Revenue Over Time\"."}],"role":"assistant"}},"stopReason":"end_turn","usage":{"inputTokens":435,"outputTokens":25,"serverToolUsage":{},"totalTokens":460}}' - headers: - Connection: - - keep-alive - Content-Length: - - '315' - Content-Type: - - application/json - Date: - - Fri, 23 Jan 2026 06:02:33 GMT + - Tue, 26 May 2026 17:06:33 GMT x-amzn-RequestId: - X-AMZN-REQUESTID-XXX status: diff --git a/lib/crewai/tests/cassettes/llms/anthropic/test_anthropic_agent_kickoff_structured_output_with_tools.yaml b/lib/crewai/tests/cassettes/llms/anthropic/test_anthropic_agent_kickoff_structured_output_with_tools.yaml index 9eec54f1a..9b717aedf 100644 --- a/lib/crewai/tests/cassettes/llms/anthropic/test_anthropic_agent_kickoff_structured_output_with_tools.yaml +++ b/lib/crewai/tests/cassettes/llms/anthropic/test_anthropic_agent_kickoff_structured_output_with_tools.yaml @@ -1,14 +1,10 @@ interactions: - request: - body: '{"max_tokens":4096,"messages":[{"role":"user","content":"\nCurrent Task: - Calculate 15 + 27 using your add_numbers tool. Report the result."}],"model":"claude-3-5-haiku-20241022","stop_sequences":["\nObservation:"],"stream":false,"system":"You + body: '{"max_tokens":4096,"messages":[{"role":"user","content":[{"type":"text","text":"\nCurrent + Task: Calculate 15 + 27 using your add_numbers tool. Report the result.","cache_control":{"type":"ephemeral"}}]}],"model":"claude-sonnet-4-6","stop_sequences":["\nObservation:"],"stream":false,"system":[{"type":"text","text":"You are Calculator. You are a calculator assistant that uses tools to compute results.\nYour - personal goal is: Perform calculations using available tools","tool_choice":{"type":"tool","name":"structured_output"},"tools":[{"name":"structured_output","description":"Output - the structured response","input_schema":{"type":"object","description":"Structured - output for calculation results.","title":"CalculationResult","properties":{"operation":{"type":"string","description":"The - mathematical operation performed","title":"Operation"},"result":{"type":"integer","description":"The - result of the calculation","title":"Result"},"explanation":{"type":"string","description":"Brief - explanation of the calculation","title":"Explanation"}},"additionalProperties":false,"required":["operation","result","explanation"]}}]}' + personal goal is: Perform calculations using available tools","cache_control":{"type":"ephemeral"}}],"tools":[{"name":"add_numbers","description":"Add + two numbers together and return the sum.","input_schema":{"properties":{"a":{"type":"integer"},"b":{"type":"integer"}},"required":["a","b"],"type":"object","additionalProperties":false},"strict":true}]}' headers: User-Agent: - X-USER-AGENT-XXX @@ -21,7 +17,7 @@ interactions: connection: - keep-alive content-length: - - '1050' + - '762' content-type: - application/json host: @@ -50,8 +46,8 @@ interactions: uri: https://api.anthropic.com/v1/messages response: body: - string: '{"model":"claude-3-5-haiku-20241022","id":"msg_01MsoNSVoPuoMYGCcJLvfXS6","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01TtAsqddWjE7C4GYmCKavdg","name":"structured_output","input":{"operation":"Addition","result":42,"explanation":"Added - 15 and 27 together"}}],"stop_reason":"tool_use","stop_sequence":null,"usage":{"input_tokens":573,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":75,"service_tier":"standard","inference_geo":"not_available"}}' + string: '{"model":"claude-sonnet-4-6","id":"msg_01Hi6qhbcDQJas5A7kqA7Xif","type":"message","role":"assistant","content":[{"type":"text","text":"I''ll + calculate 15 + 27 right away using the `add_numbers` tool!"},{"type":"tool_use","id":"toolu_0111pu1MrxY8aTqNzYSWAgQF","name":"add_numbers","input":{"a":15,"b":27},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":633,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":92,"service_tier":"standard","inference_geo":"global"}}' headers: CF-RAY: - CF-RAY-XXX @@ -62,7 +58,7 @@ interactions: Content-Type: - application/json Date: - - Thu, 12 Feb 2026 22:11:20 GMT + - Tue, 26 May 2026 16:27:07 GMT Server: - cloudflare Transfer-Encoding: @@ -84,11 +80,123 @@ interactions: anthropic-ratelimit-output-tokens-reset: - ANTHROPIC-RATELIMIT-OUTPUT-TOKENS-RESET-XXX anthropic-ratelimit-requests-limit: - - '4000' + - '20000' anthropic-ratelimit-requests-remaining: - - '3999' + - '19999' anthropic-ratelimit-requests-reset: - - '2026-02-12T22:11:18Z' + - '2026-05-26T16:26:47Z' + anthropic-ratelimit-tokens-limit: + - ANTHROPIC-RATELIMIT-TOKENS-LIMIT-XXX + anthropic-ratelimit-tokens-remaining: + - ANTHROPIC-RATELIMIT-TOKENS-REMAINING-XXX + anthropic-ratelimit-tokens-reset: + - ANTHROPIC-RATELIMIT-TOKENS-RESET-XXX + cf-cache-status: + - DYNAMIC + request-id: + - REQUEST-ID-XXX + set-cookie: + - SET-COOKIE-XXX + strict-transport-security: + - STS-XXX + traceresponse: + - 00-0c532faf4d60e2359554c05e42d6c2b0-8ed2bd3616e95a40-01 + vary: + - Accept-Encoding + x-envoy-upstream-service-time: + - '19361' + status: + code: 200 + message: OK +- request: + body: '{"max_tokens":4096,"messages":[{"role":"user","content":[{"type":"text","text":"\nCurrent + Task: Calculate 15 + 27 using your add_numbers tool. Report the result.","cache_control":{"type":"ephemeral"}}]},{"role":"assistant","content":[{"type":"tool_use","id":"toolu_0111pu1MrxY8aTqNzYSWAgQF","name":"add_numbers","input":{"a":15,"b":27}}]},{"role":"user","content":[{"type":"tool_result","tool_use_id":"toolu_0111pu1MrxY8aTqNzYSWAgQF","content":"42"}]}],"model":"claude-sonnet-4-6","stop_sequences":["\nObservation:"],"stream":false,"system":[{"type":"text","text":"You + are Calculator. You are a calculator assistant that uses tools to compute results.\nYour + personal goal is: Perform calculations using available tools","cache_control":{"type":"ephemeral"}}],"tools":[{"name":"add_numbers","description":"Add + two numbers together and return the sum.","input_schema":{"properties":{"a":{"type":"integer"},"b":{"type":"integer"}},"required":["a","b"],"type":"object","additionalProperties":false},"strict":true}]}' + headers: + User-Agent: + - X-USER-AGENT-XXX + accept: + - application/json + accept-encoding: + - ACCEPT-ENCODING-XXX + anthropic-version: + - '2023-06-01' + connection: + - keep-alive + content-length: + - '1011' + content-type: + - application/json + cookie: + - COOKIE-XXX + host: + - api.anthropic.com + x-api-key: + - X-API-KEY-XXX + x-stainless-arch: + - X-STAINLESS-ARCH-XXX + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - X-STAINLESS-OS-XXX + x-stainless-package-version: + - 0.73.0 + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.13.3 + x-stainless-timeout: + - NOT_GIVEN + method: POST + uri: https://api.anthropic.com/v1/messages + response: + body: + string: "{\"model\":\"claude-sonnet-4-6\",\"id\":\"msg_01Eqs4XnbiSubo442YWNnn7G\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"text\",\"text\":\"The + result of **15 + 27 = 42**! \U0001F9EE\\n\\nUsing the `add_numbers` tool, + I calculated that adding 15 and 27 together gives you a sum of **42**.\"}],\"stop_reason\":\"end_turn\",\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":717,\"cache_creation_input_tokens\":0,\"cache_read_input_tokens\":0,\"cache_creation\":{\"ephemeral_5m_input_tokens\":0,\"ephemeral_1h_input_tokens\":0},\"output_tokens\":52,\"service_tier\":\"standard\",\"inference_geo\":\"global\"}}" + headers: + CF-RAY: + - CF-RAY-XXX + Connection: + - keep-alive + Content-Security-Policy: + - CSP-FILTERED + Content-Type: + - application/json + Date: + - Tue, 26 May 2026 16:27:09 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Robots-Tag: + - none + anthropic-organization-id: + - ANTHROPIC-ORGANIZATION-ID-XXX + anthropic-ratelimit-input-tokens-limit: + - ANTHROPIC-RATELIMIT-INPUT-TOKENS-LIMIT-XXX + anthropic-ratelimit-input-tokens-remaining: + - ANTHROPIC-RATELIMIT-INPUT-TOKENS-REMAINING-XXX + anthropic-ratelimit-input-tokens-reset: + - ANTHROPIC-RATELIMIT-INPUT-TOKENS-RESET-XXX + anthropic-ratelimit-output-tokens-limit: + - ANTHROPIC-RATELIMIT-OUTPUT-TOKENS-LIMIT-XXX + anthropic-ratelimit-output-tokens-remaining: + - ANTHROPIC-RATELIMIT-OUTPUT-TOKENS-REMAINING-XXX + anthropic-ratelimit-output-tokens-reset: + - ANTHROPIC-RATELIMIT-OUTPUT-TOKENS-RESET-XXX + anthropic-ratelimit-requests-limit: + - '20000' + anthropic-ratelimit-requests-remaining: + - '19999' + anthropic-ratelimit-requests-reset: + - '2026-05-26T16:27:07Z' anthropic-ratelimit-tokens-limit: - ANTHROPIC-RATELIMIT-TOKENS-LIMIT-XXX anthropic-ratelimit-tokens-remaining: @@ -101,8 +209,143 @@ interactions: - REQUEST-ID-XXX strict-transport-security: - STS-XXX + traceresponse: + - 00-92d206559118bcf8b9b39b7ecd0c6e0e-68dd5efb3bbaff0e-01 + vary: + - Accept-Encoding x-envoy-upstream-service-time: - - '1234' + - '2021' + status: + code: 200 + message: OK +- request: + body: "{\"max_tokens\":4096,\"messages\":[{\"role\":\"user\",\"content\":\"The + result of **15 + 27 = 42**! \U0001F9EE\\n\\nUsing the `add_numbers` tool, I + calculated that adding 15 and 27 together gives you a sum of **42**.\"}],\"model\":\"claude-sonnet-4-6\",\"stream\":false,\"system\":\"Format + your final answer according to the following OpenAPI schema: {\\n \\\"type\\\": + \\\"json_schema\\\",\\n \\\"json_schema\\\": {\\n \\\"name\\\": \\\"CalculationResult\\\",\\n + \ \\\"strict\\\": true,\\n \\\"schema\\\": {\\n \\\"description\\\": + \\\"Structured output for calculation results.\\\",\\n \\\"properties\\\": + {\\n \\\"operation\\\": {\\n \\\"description\\\": \\\"The mathematical + operation performed\\\",\\n \\\"title\\\": \\\"Operation\\\",\\n \\\"type\\\": + \\\"string\\\"\\n },\\n \\\"result\\\": {\\n \\\"description\\\": + \\\"The result of the calculation\\\",\\n \\\"title\\\": \\\"Result\\\",\\n + \ \\\"type\\\": \\\"integer\\\"\\n },\\n \\\"explanation\\\": + {\\n \\\"description\\\": \\\"Brief explanation of the calculation\\\",\\n + \ \\\"title\\\": \\\"Explanation\\\",\\n \\\"type\\\": \\\"string\\\"\\n + \ }\\n },\\n \\\"required\\\": [\\n \\\"operation\\\",\\n + \ \\\"result\\\",\\n \\\"explanation\\\"\\n ],\\n \\\"title\\\": + \\\"CalculationResult\\\",\\n \\\"type\\\": \\\"object\\\",\\n \\\"additionalProperties\\\": + false\\n }\\n }\\n}\\n\\nIMPORTANT: Preserve the original content exactly + as-is. Do NOT rewrite, paraphrase, or modify the meaning of the content. Only + structure it to match the schema format.\\n\\nDo not include the OpenAPI schema + in the final output. Ensure the final output does not include any code block + markers like ```json or ```python.\",\"tool_choice\":{\"type\":\"tool\",\"name\":\"structured_output\"},\"tools\":[{\"name\":\"structured_output\",\"description\":\"Output + the structured response\",\"input_schema\":{\"type\":\"object\",\"description\":\"Structured + output for calculation results.\",\"title\":\"CalculationResult\",\"properties\":{\"operation\":{\"type\":\"string\",\"description\":\"The + mathematical operation performed\",\"title\":\"Operation\"},\"result\":{\"type\":\"integer\",\"description\":\"The + result of the calculation\",\"title\":\"Result\"},\"explanation\":{\"type\":\"string\",\"description\":\"Brief + explanation of the calculation\",\"title\":\"Explanation\"}},\"additionalProperties\":false,\"required\":[\"operation\",\"result\",\"explanation\"]}}]}" + headers: + User-Agent: + - X-USER-AGENT-XXX + accept: + - application/json + accept-encoding: + - ACCEPT-ENCODING-XXX + anthropic-version: + - '2023-06-01' + connection: + - keep-alive + content-length: + - '2289' + content-type: + - application/json + cookie: + - COOKIE-XXX + host: + - api.anthropic.com + x-api-key: + - X-API-KEY-XXX + x-stainless-arch: + - X-STAINLESS-ARCH-XXX + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - X-STAINLESS-OS-XXX + x-stainless-package-version: + - 0.73.0 + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.13.3 + x-stainless-timeout: + - NOT_GIVEN + method: POST + uri: https://api.anthropic.com/v1/messages + response: + body: + string: '{"model":"claude-sonnet-4-6","id":"msg_012b6HHB7T6qZuKcXB5jkhpx","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01UX2REqVJnQ3qNjHzVV1oNp","name":"structured_output","input":{"operation":"add_numbers","result":42,"explanation":"Adding + 15 and 27 together gives you a sum of 42."},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":1123,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":84,"service_tier":"standard","inference_geo":"global"}}' + headers: + CF-RAY: + - CF-RAY-XXX + Connection: + - keep-alive + Content-Security-Policy: + - CSP-FILTERED + Content-Type: + - application/json + Date: + - Tue, 26 May 2026 16:27:11 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Robots-Tag: + - none + anthropic-organization-id: + - ANTHROPIC-ORGANIZATION-ID-XXX + anthropic-ratelimit-input-tokens-limit: + - ANTHROPIC-RATELIMIT-INPUT-TOKENS-LIMIT-XXX + anthropic-ratelimit-input-tokens-remaining: + - ANTHROPIC-RATELIMIT-INPUT-TOKENS-REMAINING-XXX + anthropic-ratelimit-input-tokens-reset: + - ANTHROPIC-RATELIMIT-INPUT-TOKENS-RESET-XXX + anthropic-ratelimit-output-tokens-limit: + - ANTHROPIC-RATELIMIT-OUTPUT-TOKENS-LIMIT-XXX + anthropic-ratelimit-output-tokens-remaining: + - ANTHROPIC-RATELIMIT-OUTPUT-TOKENS-REMAINING-XXX + anthropic-ratelimit-output-tokens-reset: + - ANTHROPIC-RATELIMIT-OUTPUT-TOKENS-RESET-XXX + anthropic-ratelimit-requests-limit: + - '20000' + anthropic-ratelimit-requests-remaining: + - '19999' + anthropic-ratelimit-requests-reset: + - '2026-05-26T16:27:09Z' + anthropic-ratelimit-tokens-limit: + - ANTHROPIC-RATELIMIT-TOKENS-LIMIT-XXX + anthropic-ratelimit-tokens-remaining: + - ANTHROPIC-RATELIMIT-TOKENS-REMAINING-XXX + anthropic-ratelimit-tokens-reset: + - ANTHROPIC-RATELIMIT-TOKENS-RESET-XXX + cf-cache-status: + - DYNAMIC + request-id: + - REQUEST-ID-XXX + strict-transport-security: + - STS-XXX + traceresponse: + - 00-c97065bea414b95b086529ea43832d89-d5c4bad6e383ad9f-01 + vary: + - Accept-Encoding + x-envoy-upstream-service-time: + - '2133' status: code: 200 message: OK diff --git a/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_agent_kickoff_structured_output_with_tools.yaml b/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_agent_kickoff_structured_output_with_tools.yaml index 5441844c9..fe6cd97be 100644 --- a/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_agent_kickoff_structured_output_with_tools.yaml +++ b/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_agent_kickoff_structured_output_with_tools.yaml @@ -8,20 +8,10 @@ interactions: [{"toolSpec": {"name": "add_numbers", "description": "Add two numbers together and return the sum.", "inputSchema": {"json": {"properties": {"a": {"title": "A", "type": "integer"}, "b": {"title": "B", "type": "integer"}}, "required": - ["a", "b"], "type": "object", "additionalProperties": false}}}}, {"toolSpec": - {"name": "structured_output", "description": "Use this tool to provide your - final structured response. Call this tool when you have gathered all necessary - information and are ready to provide the final answer in the required format.", - "inputSchema": {"json": {"description": "Structured output for calculation results.", - "properties": {"operation": {"description": "The mathematical operation performed", - "title": "Operation", "type": "string"}, "result": {"description": "The result - of the calculation", "title": "Result", "type": "integer"}, "explanation": {"description": - "Brief explanation of the calculation", "title": "Explanation", "type": "string"}}, - "required": ["operation", "result", "explanation"], "title": "CalculationResult", - "type": "object", "additionalProperties": false}}}}]}}' + ["a", "b"], "type": "object", "additionalProperties": false}}}}]}}' headers: Content-Length: - - '1509' + - '702' Content-Type: - !!binary | YXBwbGljYXRpb24vanNvbg== @@ -36,21 +26,23 @@ interactions: - AUTHORIZATION-XXX x-amz-date: - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-sonnet-20240229-v1%3A0/converse + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse response: body: - string: '{"metrics":{"latencyMs":1968},"output":{"message":{"content":[{"text":"Okay, - let''s calculate 15 + 27 using the add_numbers tool:"},{"toolUse":{"input":{"a":15,"b":27},"name":"add_numbers","toolUseId":"tooluse_pSseOamVELzpL3kQG5VukN"}}],"role":"assistant"}},"stopReason":"tool_use","usage":{"inputTokens":488,"outputTokens":91,"serverToolUsage":{},"totalTokens":579}}' + string: '{"metrics":{"latencyMs":2257},"output":{"message":{"content":[{"text":"I''ll + calculate 15 + 27 right away using the `add_numbers` tool!"},{"toolUse":{"input":{"a":15,"b":27},"name":"add_numbers","toolUseId":"tooluse_CVmuFOrTItCY07vxuA84mU","type":"tool_use"}}],"role":"assistant"}},"stopReason":"tool_use","usage":{"cacheReadInputTokenCount":0,"cacheReadInputTokens":0,"cacheWriteInputTokenCount":0,"cacheWriteInputTokens":0,"inputTokens":645,"outputTokens":92,"serverToolUsage":{},"totalTokens":737}}' headers: Connection: - keep-alive Content-Length: - - '366' + - '500' Content-Type: - application/json Date: - - Thu, 12 Feb 2026 22:01:04 GMT + - Tue, 26 May 2026 17:04:49 GMT x-amzn-RequestId: - X-AMZN-REQUESTID-XXX status: @@ -59,29 +51,19 @@ interactions: - request: body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Calculate 15 + 27 using your add_numbers tool. Report the result."}]}, {"role": "assistant", - "content": [{"toolUse": {"toolUseId": "tooluse_pSseOamVELzpL3kQG5VukN", "name": + "content": [{"toolUse": {"toolUseId": "tooluse_CVmuFOrTItCY07vxuA84mU", "name": "add_numbers", "input": {"a": 15, "b": 27}}}]}, {"role": "user", "content": - [{"toolResult": {"toolUseId": "tooluse_pSseOamVELzpL3kQG5VukN", "content": [{"text": + [{"toolResult": {"toolUseId": "tooluse_CVmuFOrTItCY07vxuA84mU", "content": [{"text": "42"}]}}]}], "inferenceConfig": {"stopSequences": ["\nObservation:"]}, "system": [{"text": "You are Calculator. You are a calculator assistant that uses tools to compute results.\nYour personal goal is: Perform calculations using available tools"}], "toolConfig": {"tools": [{"toolSpec": {"name": "add_numbers", "description": "Add two numbers together and return the sum.", "inputSchema": {"json": {"properties": {"a": {"title": "A", "type": "integer"}, "b": {"title": "B", "type": "integer"}}, - "required": ["a", "b"], "type": "object", "additionalProperties": false}}}}, - {"toolSpec": {"name": "structured_output", "description": "Use this tool to - provide your final structured response. Call this tool when you have gathered - all necessary information and are ready to provide the final answer in the required - format.", "inputSchema": {"json": {"description": "Structured output for calculation - results.", "properties": {"operation": {"description": "The mathematical operation - performed", "title": "Operation", "type": "string"}, "result": {"description": - "The result of the calculation", "title": "Result", "type": "integer"}, "explanation": - {"description": "Brief explanation of the calculation", "title": "Explanation", - "type": "string"}}, "required": ["operation", "result", "explanation"], "title": - "CalculationResult", "type": "object", "additionalProperties": false}}}}]}}' + "required": ["a", "b"], "type": "object", "additionalProperties": false}}}}]}}' headers: Content-Length: - - '1784' + - '977' Content-Type: - !!binary | YXBwbGljYXRpb24vanNvbg== @@ -96,41 +78,49 @@ interactions: - AUTHORIZATION-XXX x-amz-date: - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-sonnet-20240229-v1%3A0/converse + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse response: body: - string: '{"metrics":{"latencyMs":7598},"output":{"message":{"content":[{"toolUse":{"input":{"operation":"Addition","result":42,"explanation":"I - added 15 and 27 using the add_numbers tool."},"name":"structured_output","toolUseId":"tooluse_RT8uSPaM37Q8CVuo3rJLtI"}}],"role":"assistant"}},"stopReason":"tool_use","usage":{"inputTokens":571,"outputTokens":102,"serverToolUsage":{},"totalTokens":673}}' + string: "{\"metrics\":{\"latencyMs\":2393},\"output\":{\"message\":{\"content\":[{\"text\":\"The + result of **15 + 27 = 42**! \U0001F9EE\\n\\nUsing the `add_numbers` tool, + I computed the sum of 15 and 27, and the result is **42**.\"}],\"role\":\"assistant\"}},\"stopReason\":\"end_turn\",\"usage\":{\"cacheReadInputTokenCount\":0,\"cacheReadInputTokens\":0,\"cacheWriteInputTokenCount\":0,\"cacheWriteInputTokens\":0,\"inputTokens\":729,\"outputTokens\":51,\"serverToolUsage\":{},\"totalTokens\":780}}" headers: Connection: - keep-alive Content-Length: - - '387' + - '443' Content-Type: - application/json Date: - - Thu, 12 Feb 2026 22:01:12 GMT + - Tue, 26 May 2026 17:04:51 GMT x-amzn-RequestId: - X-AMZN-REQUESTID-XXX status: code: 200 message: OK - request: - body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Calculate - 15 + 27 using your add_numbers tool. Report the result."}]}, {"role": "assistant", - "content": [{"toolUse": {"toolUseId": "tooluse_pSseOamVELzpL3kQG5VukN", "name": - "add_numbers", "input": {"a": 15, "b": 27}}}]}, {"role": "user", "content": - [{"toolResult": {"toolUseId": "tooluse_pSseOamVELzpL3kQG5VukN", "content": [{"text": - "42"}]}}]}, {"role": "assistant", "content": [{"text": "{\"operation\":\"Addition\",\"result\":42,\"explanation\":\"I - added 15 and 27 using the add_numbers tool.\"}"}]}], "inferenceConfig": {"stopSequences": - ["\nObservation:"]}, "system": [{"text": "You are Calculator. You are a calculator - assistant that uses tools to compute results.\nYour personal goal is: Perform - calculations using available tools"}], "toolConfig": {"tools": [{"toolSpec": - {"name": "add_numbers", "description": "Add two numbers together and return - the sum.", "inputSchema": {"json": {"properties": {"a": {"title": "A", "type": - "integer"}, "b": {"title": "B", "type": "integer"}}, "required": ["a", "b"], - "type": "object", "additionalProperties": false}}}}, {"toolSpec": {"name": "structured_output", + body: '{"messages": [{"role": "user", "content": [{"text": "The result of **15 + + 27 = 42**! \ud83e\uddee\n\nUsing the `add_numbers` tool, I computed the sum + of 15 and 27, and the result is **42**."}]}], "inferenceConfig": {}, "system": + [{"text": "Format your final answer according to the following OpenAPI schema: + {\n \"type\": \"json_schema\",\n \"json_schema\": {\n \"name\": \"CalculationResult\",\n \"strict\": + true,\n \"schema\": {\n \"description\": \"Structured output for calculation + results.\",\n \"properties\": {\n \"operation\": {\n \"description\": + \"The mathematical operation performed\",\n \"title\": \"Operation\",\n \"type\": + \"string\"\n },\n \"result\": {\n \"description\": \"The + result of the calculation\",\n \"title\": \"Result\",\n \"type\": + \"integer\"\n },\n \"explanation\": {\n \"description\": + \"Brief explanation of the calculation\",\n \"title\": \"Explanation\",\n \"type\": + \"string\"\n }\n },\n \"required\": [\n \"operation\",\n \"result\",\n \"explanation\"\n ],\n \"title\": + \"CalculationResult\",\n \"type\": \"object\",\n \"additionalProperties\": + false\n }\n }\n}\n\nIMPORTANT: Preserve the original content exactly as-is. + Do NOT rewrite, paraphrase, or modify the meaning of the content. Only structure + it to match the schema format.\n\nDo not include the OpenAPI schema in the final + output. Ensure the final output does not include any code block markers like + ```json or ```python."}], "toolConfig": {"tools": [{"toolSpec": {"name": "structured_output", "description": "Use this tool to provide your final structured response. Call this tool when you have gathered all necessary information and are ready to provide the final answer in the required format.", "inputSchema": {"json": {"description": @@ -140,10 +130,10 @@ interactions: "type": "integer"}, "explanation": {"description": "Brief explanation of the calculation", "title": "Explanation", "type": "string"}}, "required": ["operation", "result", "explanation"], "title": "CalculationResult", "type": "object", "additionalProperties": - false}}}}]}}' + false}}}}], "toolChoice": {"tool": {"name": "structured_output"}}}}' headers: Content-Length: - - '1942' + - '2510' Content-Type: - !!binary | YXBwbGljYXRpb24vanNvbg== @@ -158,28 +148,27 @@ interactions: - AUTHORIZATION-XXX x-amz-date: - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-sonnet-20240229-v1%3A0/converse + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse response: body: - string: '{"message":"The model returned the following errors: Your API request - included an `assistant` message in the final position, which would pre-fill - the `assistant` response. When using tools, pre-filling the `assistant` response - is not supported."}' + string: "{\"metrics\":{\"latencyMs\":2107},\"output\":{\"message\":{\"content\":[{\"toolUse\":{\"input\":{\"operation\":\"add_numbers\",\"result\":42,\"explanation\":\"The + result of **15 + 27 = 42**! \U0001F9EE\\n\\nUsing the `add_numbers` tool, + I computed the sum of 15 and 27, and the result is **42**.\"},\"name\":\"structured_output\",\"toolUseId\":\"tooluse_5OzuYfgauW1f24uhsvXWDo\",\"type\":\"tool_use\"}}],\"role\":\"assistant\"}},\"stopReason\":\"tool_use\",\"usage\":{\"cacheReadInputTokenCount\":0,\"cacheReadInputTokens\":0,\"cacheWriteInputTokenCount\":0,\"cacheWriteInputTokens\":0,\"inputTokens\":1150,\"outputTokens\":116,\"serverToolUsage\":{},\"totalTokens\":1266}}" headers: Connection: - keep-alive Content-Length: - - '246' + - '603' Content-Type: - application/json Date: - - Thu, 12 Feb 2026 22:01:12 GMT - x-amzn-ErrorType: - - ValidationException:http://internal.amazon.com/coral/com.amazon.bedrock/ + - Tue, 26 May 2026 17:04:54 GMT x-amzn-RequestId: - X-AMZN-REQUESTID-XXX status: - code: 400 - message: Bad Request + code: 200 + message: OK version: 1 diff --git a/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_agent_kickoff_structured_output_without_tools.yaml b/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_agent_kickoff_structured_output_without_tools.yaml index 649dd7f81..ed6cde368 100644 --- a/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_agent_kickoff_structured_output_without_tools.yaml +++ b/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_agent_kickoff_structured_output_without_tools.yaml @@ -33,29 +33,37 @@ interactions: - AUTHORIZATION-XXX x-amz-date: - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-sonnet-20240229-v1%3A0/converse + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse response: body: - string: '{"metrics":{"latencyMs":3496},"output":{"message":{"content":[{"toolUse":{"input":{"topic":"Benefits - of remote work","key_points":"- Increased flexibility and work-life balance\n- - Reduced commute time and costs\n- Access to a wider talent pool for companies\n- - Increased productivity for some employees\n- Environmental benefits from reduced - commuting","summary":"Remote work offers several benefits including improved - work-life balance, cost and time savings from eliminating commutes, access - to a broader talent pool for employers, productivity gains, and environmental - advantages from reduced transportation. However, it also presents challenges - like social isolation, blurred work-life boundaries, and potential distractions - at home that need to be managed effectively."},"name":"structured_output","toolUseId":"tooluse_Jfg8pUBaRxWkKwR_rp5mCw"}}],"role":"assistant"}},"stopReason":"tool_use","usage":{"inputTokens":512,"outputTokens":187,"serverToolUsage":{},"totalTokens":699}}' + string: "{\"metrics\":{\"latencyMs\":6183},\"output\":{\"message\":{\"content\":[{\"toolUse\":{\"input\":{\"topic\":\"Benefits + of Remote Work\",\"key_points\":[\"Improved Work-Life Balance: Employees gain + flexibility to manage personal and professional responsibilities, reducing + stress and burnout.\",\"Increased Productivity: Fewer office distractions + and elimination of commutes allow workers to focus more effectively on tasks.\",\"Cost + Savings: Both employers (reduced office overhead) and employees (lower commuting + and wardrobe costs) benefit financially.\",\"Access to Global Talent: Companies + can hire the best candidates regardless of geographic location, expanding + the talent pool.\",\"Environmental Impact: Reduced commuting leads to lower + carbon emissions and a smaller environmental footprint.\",\"Employee Retention + & Satisfaction: Greater autonomy and flexibility contribute to higher job + satisfaction and lower turnover rates.\"],\"summary\":\"Remote work offers + a compelling mix of personal, financial, and organizational advantages. It + empowers employees with flexibility and autonomy while enabling businesses + to cut costs, access wider talent pools, and boost overall productivity \u2014 + making it a mutually beneficial arrangement in the modern workforce.\"},\"name\":\"structured_output\",\"toolUseId\":\"tooluse_miAVY9Wyw0HMShZbgbyTwX\",\"type\":\"tool_use\"}}],\"role\":\"assistant\"}},\"stopReason\":\"tool_use\",\"usage\":{\"cacheReadInputTokenCount\":0,\"cacheReadInputTokens\":0,\"cacheWriteInputTokenCount\":0,\"cacheWriteInputTokens\":0,\"inputTokens\":851,\"outputTokens\":268,\"serverToolUsage\":{},\"totalTokens\":1119}}" headers: Connection: - keep-alive Content-Length: - - '982' + - '1568' Content-Type: - application/json Date: - - Fri, 30 Jan 2026 01:04:10 GMT + - Tue, 26 May 2026 17:05:01 GMT x-amzn-RequestId: - X-AMZN-REQUESTID-XXX status: diff --git a/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_basic_call.yaml b/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_basic_call.yaml index 549b74782..04560c01c 100644 --- a/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_basic_call.yaml +++ b/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_basic_call.yaml @@ -19,21 +19,23 @@ interactions: - AUTHORIZATION-XXX x-amz-date: - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/us.anthropic.claude-3-5-sonnet-20241022-v2%3A0/converse + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse response: body: - string: '{"metrics":{"latencyMs":776},"output":{"message":{"content":[{"text":"Hello! - How are you today?"}],"role":"assistant"}},"stopReason":"end_turn","usage":{"inputTokens":9,"outputTokens":10,"serverToolUsage":{},"totalTokens":19}}' + string: "{\"metrics\":{\"latencyMs\":2397},\"output\":{\"message\":{\"content\":[{\"text\":\"Hello! + \U0001F44B How are you doing? Is there something I can help you with today?\"}],\"role\":\"assistant\"}},\"stopReason\":\"end_turn\",\"usage\":{\"cacheReadInputTokenCount\":0,\"cacheReadInputTokens\":0,\"cacheWriteInputTokenCount\":0,\"cacheWriteInputTokens\":0,\"inputTokens\":9,\"outputTokens\":24,\"serverToolUsage\":{},\"totalTokens\":33}}" headers: Connection: - keep-alive Content-Length: - - '226' + - '388' Content-Type: - application/json Date: - - Mon, 01 Dec 2025 08:50:59 GMT + - Tue, 26 May 2026 17:05:24 GMT x-amzn-RequestId: - X-AMZN-REQUESTID-XXX status: diff --git a/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_conversation.yaml b/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_conversation.yaml index 3154a2be6..8e39ef151 100644 --- a/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_conversation.yaml +++ b/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_conversation.yaml @@ -21,21 +21,23 @@ interactions: - AUTHORIZATION-XXX x-amz-date: - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/us.anthropic.claude-3-5-sonnet-20241022-v2%3A0/converse + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse response: body: - string: '{"metrics":{"latencyMs":622},"output":{"message":{"content":[{"text":"Your - name is Alice."}],"role":"assistant"}},"stopReason":"end_turn","usage":{"cacheReadInputTokenCount":0,"cacheReadInputTokens":0,"cacheWriteInputTokenCount":0,"cacheWriteInputTokens":0,"inputTokens":31,"outputTokens":8,"serverToolUsage":{},"totalTokens":39}}' + string: '{"metrics":{"latencyMs":1900},"output":{"message":{"content":[{"text":"Your + name is Alice! You told me that at the start of our conversation."}],"role":"assistant"}},"stopReason":"end_turn","usage":{"cacheReadInputTokenCount":0,"cacheReadInputTokens":0,"cacheWriteInputTokenCount":0,"cacheWriteInputTokens":0,"inputTokens":31,"outputTokens":19,"serverToolUsage":{},"totalTokens":50}}' headers: Connection: - keep-alive Content-Length: - - '330' + - '383' Content-Type: - application/json Date: - - Mon, 01 Dec 2025 08:51:04 GMT + - Tue, 26 May 2026 17:05:10 GMT x-amzn-RequestId: - X-AMZN-REQUESTID-XXX status: diff --git a/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_multiple_calls.yaml b/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_multiple_calls.yaml index e40ae4395..8b2ea324a 100644 --- a/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_multiple_calls.yaml +++ b/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_multiple_calls.yaml @@ -19,20 +19,23 @@ interactions: - AUTHORIZATION-XXX x-amz-date: - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/us.anthropic.claude-3-5-sonnet-20241022-v2%3A0/converse + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse response: body: - string: '{"metrics":{"latencyMs":583},"output":{"message":{"content":[{"text":"1+1=2"}],"role":"assistant"}},"stopReason":"end_turn","usage":{"inputTokens":14,"outputTokens":9,"serverToolUsage":{},"totalTokens":23}}' + string: '{"metrics":{"latencyMs":2148},"output":{"message":{"content":[{"text":"1 + + 1 = **2**"}],"role":"assistant"}},"stopReason":"end_turn","usage":{"cacheReadInputTokenCount":0,"cacheReadInputTokens":0,"cacheWriteInputTokenCount":0,"cacheWriteInputTokens":0,"inputTokens":14,"outputTokens":14,"serverToolUsage":{},"totalTokens":28}}' headers: Connection: - keep-alive Content-Length: - - '206' + - '326' Content-Type: - application/json Date: - - Mon, 01 Dec 2025 08:51:00 GMT + - Tue, 26 May 2026 17:05:12 GMT x-amzn-RequestId: - X-AMZN-REQUESTID-XXX status: @@ -58,20 +61,23 @@ interactions: - AUTHORIZATION-XXX x-amz-date: - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/us.anthropic.claude-3-5-sonnet-20241022-v2%3A0/converse + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse response: body: - string: '{"metrics":{"latencyMs":869},"output":{"message":{"content":[{"text":"2+2=4"}],"role":"assistant"}},"stopReason":"end_turn","usage":{"inputTokens":14,"outputTokens":9,"serverToolUsage":{},"totalTokens":23}}' + string: '{"metrics":{"latencyMs":1443},"output":{"message":{"content":[{"text":"2 + + 2 = **4**"}],"role":"assistant"}},"stopReason":"end_turn","usage":{"cacheReadInputTokenCount":0,"cacheReadInputTokens":0,"cacheWriteInputTokenCount":0,"cacheWriteInputTokens":0,"inputTokens":14,"outputTokens":14,"serverToolUsage":{},"totalTokens":28}}' headers: Connection: - keep-alive Content-Length: - - '206' + - '326' Content-Type: - application/json Date: - - Mon, 01 Dec 2025 08:51:01 GMT + - Tue, 26 May 2026 17:05:14 GMT x-amzn-RequestId: - X-AMZN-REQUESTID-XXX status: diff --git a/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_with_max_tokens.yaml b/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_with_max_tokens.yaml index 38b1be1c1..3b70e3189 100644 --- a/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_with_max_tokens.yaml +++ b/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_with_max_tokens.yaml @@ -19,21 +19,23 @@ interactions: - AUTHORIZATION-XXX x-amz-date: - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/us.anthropic.claude-3-5-sonnet-20241022-v2%3A0/converse + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse response: body: - string: '{"metrics":{"latencyMs":966},"output":{"message":{"content":[{"text":"Here''s - a long story about a dragon:"}],"role":"assistant"}},"stopReason":"max_tokens","usage":{"inputTokens":16,"outputTokens":10,"serverToolUsage":{},"totalTokens":26}}' + string: '{"metrics":{"latencyMs":1421},"output":{"message":{"content":[{"text":"# + The Last Ember of Varathorn"}],"role":"assistant"}},"stopReason":"max_tokens","usage":{"cacheReadInputTokenCount":0,"cacheReadInputTokens":0,"cacheWriteInputTokenCount":0,"cacheWriteInputTokens":0,"inputTokens":16,"outputTokens":10,"serverToolUsage":{},"totalTokens":26}}' headers: Connection: - keep-alive Content-Length: - - '239' + - '344' Content-Type: - application/json Date: - - Mon, 01 Dec 2025 08:50:58 GMT + - Tue, 26 May 2026 17:05:16 GMT x-amzn-RequestId: - X-AMZN-REQUESTID-XXX status: diff --git a/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_with_parameters.yaml b/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_with_parameters.yaml index 9b7a6c89f..a1cf8f1e6 100644 --- a/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_with_parameters.yaml +++ b/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_with_parameters.yaml @@ -1,10 +1,10 @@ interactions: - request: body: '{"messages": [{"role": "user", "content": [{"text": "Tell me a short fact"}]}], - "inferenceConfig": {"maxTokens": 100, "temperature": 0.7, "topP": 0.9}}' + "inferenceConfig": {"maxTokens": 100, "temperature": 0.7}}' headers: Content-Length: - - '151' + - '138' Content-Type: - application/json User-Agent: @@ -19,22 +19,24 @@ interactions: - AUTHORIZATION-XXX x-amz-date: - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/us.anthropic.claude-3-5-sonnet-20241022-v2%3A0/converse + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse response: body: - string: '{"metrics":{"latencyMs":1360},"output":{"message":{"content":[{"text":"Here''s - a short fact: Honeybees can recognize human faces by learning and remembering - facial features, similar to how we do."}],"role":"assistant"}},"stopReason":"end_turn","usage":{"cacheReadInputTokenCount":0,"cacheReadInputTokens":0,"cacheWriteInputTokenCount":0,"cacheWriteInputTokens":0,"inputTokens":12,"outputTokens":31,"serverToolUsage":{},"totalTokens":43}}' + string: "{\"metrics\":{\"latencyMs\":2721},\"output\":{\"message\":{\"content\":[{\"text\":\"Here's + a short fact:\\n\\n**Honey never spoils.** Archaeologists have found 3,000-year-old + honey in Egyptian tombs that was still perfectly edible. \U0001F36F\"}],\"role\":\"assistant\"}},\"stopReason\":\"end_turn\",\"usage\":{\"cacheReadInputTokenCount\":0,\"cacheReadInputTokens\":0,\"cacheWriteInputTokenCount\":0,\"cacheWriteInputTokens\":0,\"inputTokens\":12,\"outputTokens\":47,\"serverToolUsage\":{},\"totalTokens\":59}}" headers: Connection: - keep-alive Content-Length: - - '436' + - '463' Content-Type: - application/json Date: - - Mon, 01 Dec 2025 08:50:57 GMT + - Tue, 26 May 2026 17:06:27 GMT x-amzn-RequestId: - X-AMZN-REQUESTID-XXX status: diff --git a/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_with_system_message.yaml b/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_with_system_message.yaml index ff0518fb5..a5971a69f 100644 --- a/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_with_system_message.yaml +++ b/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_with_system_message.yaml @@ -19,21 +19,23 @@ interactions: - AUTHORIZATION-XXX x-amz-date: - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/us.anthropic.claude-3-5-sonnet-20241022-v2%3A0/converse + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse response: body: - string: '{"metrics":{"latencyMs":677},"output":{"message":{"content":[{"text":"2 - + 2 = 4"}],"role":"assistant"}},"stopReason":"end_turn","usage":{"inputTokens":20,"outputTokens":13,"serverToolUsage":{},"totalTokens":33}}' + string: '{"metrics":{"latencyMs":2975},"output":{"message":{"content":[{"text":"2 + + 2 = **4**"}],"role":"assistant"}},"stopReason":"end_turn","usage":{"cacheReadInputTokenCount":0,"cacheReadInputTokens":0,"cacheWriteInputTokenCount":0,"cacheWriteInputTokens":0,"inputTokens":21,"outputTokens":14,"serverToolUsage":{},"totalTokens":35}}' headers: Connection: - keep-alive Content-Length: - - '211' + - '326' Content-Type: - application/json Date: - - Mon, 01 Dec 2025 08:51:03 GMT + - Tue, 26 May 2026 17:05:21 GMT x-amzn-RequestId: - X-AMZN-REQUESTID-XXX status: diff --git a/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_with_temperature.yaml b/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_with_temperature.yaml index 8308d4394..c7134aba0 100644 --- a/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_with_temperature.yaml +++ b/lib/crewai/tests/cassettes/llms/bedrock/test_bedrock_async_with_temperature.yaml @@ -19,20 +19,22 @@ interactions: - AUTHORIZATION-XXX x-amz-date: - X-AMZ-DATE-XXX + x-amz-security-token: + - X-AMZ-SECURITY-TOKEN-XXX method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/us.anthropic.claude-3-5-sonnet-20241022-v2%3A0/converse + uri: https://bedrock-runtime.us-west-2.amazonaws.com/model/us.anthropic.claude-sonnet-4-6/converse response: body: - string: '{"metrics":{"latencyMs":654},"output":{"message":{"content":[{"text":"test"}],"role":"assistant"}},"stopReason":"end_turn","usage":{"inputTokens":15,"outputTokens":4,"serverToolUsage":{},"totalTokens":19}}' + string: '{"metrics":{"latencyMs":1720},"output":{"message":{"content":[{"text":"test"}],"role":"assistant"}},"stopReason":"end_turn","usage":{"cacheReadInputTokenCount":0,"cacheReadInputTokens":0,"cacheWriteInputTokenCount":0,"cacheWriteInputTokens":0,"inputTokens":15,"outputTokens":4,"serverToolUsage":{},"totalTokens":19}}' headers: Connection: - keep-alive Content-Length: - - '205' + - '316' Content-Type: - application/json Date: - - Mon, 01 Dec 2025 08:51:02 GMT + - Tue, 26 May 2026 17:05:18 GMT x-amzn-RequestId: - X-AMZN-REQUESTID-XXX status: diff --git a/lib/crewai/tests/cassettes/llms/google/test_gemini_agent_kickoff_structured_output_with_tools.yaml b/lib/crewai/tests/cassettes/llms/google/test_gemini_agent_kickoff_structured_output_with_tools.yaml index d6ea6e60b..f5981c1ee 100644 --- a/lib/crewai/tests/cassettes/llms/google/test_gemini_agent_kickoff_structured_output_with_tools.yaml +++ b/lib/crewai/tests/cassettes/llms/google/test_gemini_agent_kickoff_structured_output_with_tools.yaml @@ -8,18 +8,8 @@ interactions: [{"description": "Add two numbers together and return the sum.", "name": "add_numbers", "parameters_json_schema": {"properties": {"a": {"title": "A", "type": "integer"}, "b": {"title": "B", "type": "integer"}}, "required": ["a", "b"], "type": "object", - "additionalProperties": false}}, {"description": "Use this tool to provide your - final structured response. Call this tool when you have gathered all necessary - information and are ready to provide the final answer in the required format.", - "name": "structured_output", "parameters_json_schema": {"description": "Structured - output for calculation results.", "properties": {"operation": {"description": - "The mathematical operation performed", "title": "Operation", "type": "string"}, - "result": {"description": "The result of the calculation", "title": "Result", - "type": "integer"}, "explanation": {"description": "Brief explanation of the - calculation", "title": "Explanation", "type": "string"}}, "required": ["operation", - "result", "explanation"], "title": "CalculationResult", "type": "object", "additionalProperties": - false, "propertyOrdering": ["operation", "result", "explanation"]}}]}], "generationConfig": - {"stopSequences": ["\nObservation:"]}}' + "additionalProperties": false}}]}], "generationConfig": {"stopSequences": ["\nObservation:"], + "thinkingConfig": {"include_thoughts": true}}}' headers: User-Agent: - X-USER-AGENT-XXX @@ -30,13 +20,13 @@ interactions: connection: - keep-alive content-length: - - '1592' + - '784' content-type: - application/json host: - generativelanguage.googleapis.com x-goog-api-client: - - google-genai-sdk/1.49.0 gl-python/3.13.3 + - google-genai-sdk/1.65.0 gl-python/3.13.3 x-goog-api-key: - X-GOOG-API-KEY-XXX method: POST @@ -44,27 +34,36 @@ interactions: response: body: string: "{\n \"candidates\": [\n {\n \"content\": {\n \"parts\": - [\n {\n \"functionCall\": {\n \"name\": \"add_numbers\",\n - \ \"args\": {\n \"a\": 15,\n \"b\": - 27\n }\n },\n \"thoughtSignature\": \"CqMFAb4+9vtoEAola3khZd5LD4cccGlQsdVI9cPJGQBURT0qF5Xqp8o1L7oGN4s5trQpk7NPhKe1CYDMXDJueC7zM/zGlcy2daSJAeuTd9pxAbtndEXCGjM/9Nt8QRpvaDV3Ff2bkKSn/JCOJdzsN5m6G5C6BMRGVt8bZyRHelwu7tjCNYiMEvFqVoQIWN6d+CWKkHnbSwOlSUTDXJEcWvUwP82Ou7s68l2k7XNbDWCY5Tt8LUdPgeqjfH15JoEgZUbPxbVKA0ykRln1svfpvQ4Vm3Hn7PL3voWZWGzP5uLnH6JF2M8H6TokSDYZETvlDo5bK1Cx9IzrdUgHkku6gNbct/e53CPEUgqSKbY1VhsLAXAHieT4PKqeMQ4B+7gyCLXHeL6TOGjqSVGBBOQLtF9yCbKbkXa5pPu3+DnPhoOeH7jEPb+bqIWv6rxERErbKhu0IlP+UNBRAAj+wXNDZxQvLnlrlXrLtWllO9wFshr1DzgDgNZSRsPQeVQq2L0bL+KRobCXAfjMpH/8bhxdTI3sgsCtU3+dKwV5Z8Fg6e5oRyBAss8AE2CmYtdnYpt+iss9IT8NlSpI2DcdmVErEFNsebVcSwnr+9YXoESh4O1i8er9lX59hKTBdYXdP2GJ63cq9cSOalzx/doKxA2FzP3QhdV+H11LiUQzsQCXHqv0D+D290z1QoPhpsHEd7b/1EoW7D/2rub4acV8tpUcG2oe/Mj1kzYQoiEwZkgM56JoUs++5+5tWBMW68e4y1AmkyhDTCDkiNIa4noE6AOdNsLjL/+EHvcNFRmayFXXiUShIcMT0WQ9xNriWQP/dbhd6F5K7BKSajdB1391OYeHVmSEzzXYxjnUWXd+jqORQcsiPNIVRQkZI7ZGl6+4exmZsfrKzbFy\"\n + [\n {\n \"text\": \"Okay, here's my thought process on + tackling this simple addition problem:\\n\\n**Calculating 15 + 27**\\n\\nRight, + so I need to calculate 15 plus 27. It's a straightforward arithmetic operation, + and I know I have a dedicated tool for that \u2013 the `add_numbers` function. + No need to reinvent the wheel, I should use the appropriate tool in my toolbox.\\n\\nTo + use the tool effectively, I need to provide the correct inputs. In this case, + I'll set `a` equal to 15, and `b` equal to 27. That should be a piece of cake + for the function. Now I just need to call it!\\n\",\n \"thought\": + true\n },\n {\n \"functionCall\": {\n \"name\": + \"add_numbers\",\n \"args\": {\n \"a\": 15,\n + \ \"b\": 27\n }\n },\n \"thoughtSignature\": + \"CqwBAQw51sfkbjIDS7wS47oc/Bej+AYsUu5Cs+BC2Ae5NMasRmWa/u5Ct426qkpkIpgzGSNjwwfitf1gK93Abse9EGj5m1swXmPU2XSkqhMYMEXZGH1mW2U2XH8zaXHRIAx2aI0O8VbJ3sL8h1lJgbVCkvLa2RyWwY6E8FRPhQOHtrOQEQtfAUtHdJz928j6UEgS818X/7hEwuWsQhIho0frtziX30UlI7yXOeBBWw==\"\n \ }\n ],\n \"role\": \"model\"\n },\n \"finishReason\": \"STOP\",\n \"index\": 0,\n \"finishMessage\": \"Model generated function call(s).\"\n }\n ],\n \"usageMetadata\": {\n \"promptTokenCount\": - 202,\n \"candidatesTokenCount\": 22,\n \"totalTokenCount\": 403,\n \"promptTokensDetails\": - [\n {\n \"modality\": \"TEXT\",\n \"tokenCount\": 202\n - \ }\n ],\n \"thoughtsTokenCount\": 179\n },\n \"modelVersion\": - \"gemini-2.5-flash\",\n \"responseId\": \"AlCOadrrK7aVjMcPksrU-A0\"\n}\n" + 104,\n \"candidatesTokenCount\": 22,\n \"totalTokenCount\": 173,\n \"promptTokensDetails\": + [\n {\n \"modality\": \"TEXT\",\n \"tokenCount\": 104\n + \ }\n ],\n \"thoughtsTokenCount\": 47,\n \"serviceTier\": \"standard\"\n + \ },\n \"modelVersion\": \"gemini-2.5-flash\",\n \"responseId\": \"MpgPapmwO_vN-sAPvrWJmA0\"\n}\n" headers: Alt-Svc: - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 Content-Type: - application/json; charset=UTF-8 Date: - - Thu, 12 Feb 2026 22:11:14 GMT + - Thu, 21 May 2026 23:41:40 GMT Server: - scaffolding on HTTPServer2 Server-Timing: - - gfet4t7; dur=1417 + - gfet4t7; dur=1920 Transfer-Encoding: - chunked Vary: @@ -75,6 +74,8 @@ interactions: - X-CONTENT-TYPE-XXX X-Frame-Options: - X-FRAME-OPTIONS-XXX + X-Gemini-Service-Tier: + - standard X-XSS-Protection: - '0' status: @@ -83,7 +84,7 @@ interactions: - request: body: '{"contents": [{"parts": [{"text": "\nCurrent Task: Calculate 15 + 27 using your add_numbers tool. Report the result."}], "role": "user"}, {"parts": [{"functionCall": - {"args": {"a": 15, "b": 27}, "name": "add_numbers"}, "thoughtSignature": "CqMFAb4-9vtoEAola3khZd5LD4cccGlQsdVI9cPJGQBURT0qF5Xqp8o1L7oGN4s5trQpk7NPhKe1CYDMXDJueC7zM_zGlcy2daSJAeuTd9pxAbtndEXCGjM_9Nt8QRpvaDV3Ff2bkKSn_JCOJdzsN5m6G5C6BMRGVt8bZyRHelwu7tjCNYiMEvFqVoQIWN6d-CWKkHnbSwOlSUTDXJEcWvUwP82Ou7s68l2k7XNbDWCY5Tt8LUdPgeqjfH15JoEgZUbPxbVKA0ykRln1svfpvQ4Vm3Hn7PL3voWZWGzP5uLnH6JF2M8H6TokSDYZETvlDo5bK1Cx9IzrdUgHkku6gNbct_e53CPEUgqSKbY1VhsLAXAHieT4PKqeMQ4B-7gyCLXHeL6TOGjqSVGBBOQLtF9yCbKbkXa5pPu3-DnPhoOeH7jEPb-bqIWv6rxERErbKhu0IlP-UNBRAAj-wXNDZxQvLnlrlXrLtWllO9wFshr1DzgDgNZSRsPQeVQq2L0bL-KRobCXAfjMpH_8bhxdTI3sgsCtU3-dKwV5Z8Fg6e5oRyBAss8AE2CmYtdnYpt-iss9IT8NlSpI2DcdmVErEFNsebVcSwnr-9YXoESh4O1i8er9lX59hKTBdYXdP2GJ63cq9cSOalzx_doKxA2FzP3QhdV-H11LiUQzsQCXHqv0D-D290z1QoPhpsHEd7b_1EoW7D_2rub4acV8tpUcG2oe_Mj1kzYQoiEwZkgM56JoUs--5-5tWBMW68e4y1AmkyhDTCDkiNIa4noE6AOdNsLjL_-EHvcNFRmayFXXiUShIcMT0WQ9xNriWQP_dbhd6F5K7BKSajdB1391OYeHVmSEzzXYxjnUWXd-jqORQcsiPNIVRQkZI7ZGl6-4exmZsfrKzbFy"}], + {"args": {"a": 15, "b": 27}, "name": "add_numbers"}, "thoughtSignature": "CqwBAQw51sfkbjIDS7wS47oc_Bej-AYsUu5Cs-BC2Ae5NMasRmWa_u5Ct426qkpkIpgzGSNjwwfitf1gK93Abse9EGj5m1swXmPU2XSkqhMYMEXZGH1mW2U2XH8zaXHRIAx2aI0O8VbJ3sL8h1lJgbVCkvLa2RyWwY6E8FRPhQOHtrOQEQtfAUtHdJz928j6UEgS818X_7hEwuWsQhIho0frtziX30UlI7yXOeBBWw=="}], "role": "model"}, {"parts": [{"functionResponse": {"name": "add_numbers", "response": {"result": 42}}}], "role": "user"}], "systemInstruction": {"parts": [{"text": "You are Calculator. You are a calculator assistant that uses tools to compute @@ -92,18 +93,8 @@ interactions: numbers together and return the sum.", "name": "add_numbers", "parameters_json_schema": {"properties": {"a": {"title": "A", "type": "integer"}, "b": {"title": "B", "type": "integer"}}, "required": ["a", "b"], "type": "object", "additionalProperties": - false}}, {"description": "Use this tool to provide your final structured response. - Call this tool when you have gathered all necessary information and are ready - to provide the final answer in the required format.", "name": "structured_output", - "parameters_json_schema": {"description": "Structured output for calculation - results.", "properties": {"operation": {"description": "The mathematical operation - performed", "title": "Operation", "type": "string"}, "result": {"description": - "The result of the calculation", "title": "Result", "type": "integer"}, "explanation": - {"description": "Brief explanation of the calculation", "title": "Explanation", - "type": "string"}}, "required": ["operation", "result", "explanation"], "title": - "CalculationResult", "type": "object", "additionalProperties": false, "propertyOrdering": - ["operation", "result", "explanation"]}}]}], "generationConfig": {"stopSequences": - ["\nObservation:"]}}' + false}}]}], "generationConfig": {"stopSequences": ["\nObservation:"], "thinkingConfig": + {"include_thoughts": true}}}' headers: User-Agent: - X-USER-AGENT-XXX @@ -114,13 +105,13 @@ interactions: connection: - keep-alive content-length: - - '2725' + - '1249' content-type: - application/json host: - generativelanguage.googleapis.com x-goog-api-client: - - google-genai-sdk/1.49.0 gl-python/3.13.3 + - google-genai-sdk/1.65.0 gl-python/3.13.3 x-goog-api-key: - X-GOOG-API-KEY-XXX method: POST @@ -128,28 +119,24 @@ interactions: response: body: string: "{\n \"candidates\": [\n {\n \"content\": {\n \"parts\": - [\n {\n \"functionCall\": {\n \"name\": \"structured_output\",\n - \ \"args\": {\n \"result\": 42,\n \"explanation\": - \"The sum of 15 and 27 is 42.\",\n \"operation\": \"Addition\"\n - \ }\n },\n \"thoughtSignature\": \"CtYCAb4+9vsKJoVFV1W8ORKk+Likt7GS9CuzuE53V9sbS2gFuiEjJ7ghBqWDG2UrgyRYFjPl6EalXUBnEbEq9rZNYGY27VpcweI1tv6p+477bgz1pmZnL0nfAcrp4nuphL+Ij0nXZQoo5cF4Gk29RQSNy49VRn3eP9eUW0hG7EpkPmfJiUSSDuaQENHN1UBBnFS9QUC+Fw+unnQ10B57fauyiXWNrBUkE2PYqgj5vELa5lVMtk5beh4ydWNnZ04t8gvQniCJ38EWWQr8VAXrSqE156oCBMwkFaFM7huPWHZk53n/HAG/VsQgPayf045STWKWjBzp6uTiwH9pYtoI1LBah3uxVbJRKOzH7HI4U0cHsffQqIIUn8cW4SP1UK/nvAivU1l0p6Bot8KIVJ5vqoF+o2oDmTuZv0HkDo5+UvXRqfsO5AylpUdM+JMGaXVAA7oZNqVPQybw\"\n - \ }\n ],\n \"role\": \"model\"\n },\n \"finishReason\": - \"STOP\",\n \"index\": 0,\n \"finishMessage\": \"Model generated - function call(s).\"\n }\n ],\n \"usageMetadata\": {\n \"promptTokenCount\": - 240,\n \"candidatesTokenCount\": 39,\n \"totalTokenCount\": 357,\n \"promptTokensDetails\": - [\n {\n \"modality\": \"TEXT\",\n \"tokenCount\": 240\n - \ }\n ],\n \"thoughtsTokenCount\": 78\n },\n \"modelVersion\": - \"gemini-2.5-flash\",\n \"responseId\": \"A1COaaWbKvKGjMcPsN-EkAs\"\n}\n" + [\n {\n \"text\": \"The sum of 15 and 27 is 42.\"\n }\n + \ ],\n \"role\": \"model\"\n },\n \"finishReason\": + \"STOP\",\n \"index\": 0\n }\n ],\n \"usageMetadata\": {\n \"promptTokenCount\": + 142,\n \"candidatesTokenCount\": 15,\n \"totalTokenCount\": 157,\n \"promptTokensDetails\": + [\n {\n \"modality\": \"TEXT\",\n \"tokenCount\": 142\n + \ }\n ],\n \"serviceTier\": \"standard\"\n },\n \"modelVersion\": + \"gemini-2.5-flash\",\n \"responseId\": \"NZgPasTKBf3F-sAP4Lu48Ak\"\n}\n" headers: Alt-Svc: - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 Content-Type: - application/json; charset=UTF-8 Date: - - Thu, 12 Feb 2026 22:11:15 GMT + - Thu, 21 May 2026 23:41:41 GMT Server: - scaffolding on HTTPServer2 Server-Timing: - - gfet4t7; dur=906 + - gfet4t7; dur=750 Transfer-Encoding: - chunked Vary: @@ -160,6 +147,107 @@ interactions: - X-CONTENT-TYPE-XXX X-Frame-Options: - X-FRAME-OPTIONS-XXX + X-Gemini-Service-Tier: + - standard + X-XSS-Protection: + - '0' + status: + code: 200 + message: OK +- request: + body: '{"contents": [{"parts": [{"text": "The sum of 15 and 27 is 42."}], "role": + "user"}], "systemInstruction": {"parts": [{"text": "Format your final answer + according to the following OpenAPI schema: {\n \"type\": \"json_schema\",\n \"json_schema\": + {\n \"name\": \"CalculationResult\",\n \"strict\": true,\n \"schema\": + {\n \"description\": \"Structured output for calculation results.\",\n \"properties\": + {\n \"operation\": {\n \"description\": \"The mathematical operation + performed\",\n \"title\": \"Operation\",\n \"type\": \"string\"\n },\n \"result\": + {\n \"description\": \"The result of the calculation\",\n \"title\": + \"Result\",\n \"type\": \"integer\"\n },\n \"explanation\": + {\n \"description\": \"Brief explanation of the calculation\",\n \"title\": + \"Explanation\",\n \"type\": \"string\"\n }\n },\n \"required\": + [\n \"operation\",\n \"result\",\n \"explanation\"\n ],\n \"title\": + \"CalculationResult\",\n \"type\": \"object\",\n \"additionalProperties\": + false\n }\n }\n}\n\nIMPORTANT: Preserve the original content exactly as-is. + Do NOT rewrite, paraphrase, or modify the meaning of the content. Only structure + it to match the schema format.\n\nDo not include the OpenAPI schema in the final + output. Ensure the final output does not include any code block markers like + ```json or ```python."}], "role": "user"}, "generationConfig": {"responseMimeType": + "application/json", "responseJsonSchema": {"description": "Structured output + for calculation results.", "properties": {"operation": {"description": "The + mathematical operation performed", "title": "Operation", "type": "string"}, + "result": {"description": "The result of the calculation", "title": "Result", + "type": "integer"}, "explanation": {"description": "Brief explanation of the + calculation", "title": "Explanation", "type": "string"}}, "required": ["operation", + "result", "explanation"], "title": "CalculationResult", "type": "object", "additionalProperties": + false, "propertyOrdering": ["operation", "result", "explanation"]}, "thinkingConfig": + {"include_thoughts": true}}}' + headers: + User-Agent: + - X-USER-AGENT-XXX + accept: + - '*/*' + accept-encoding: + - ACCEPT-ENCODING-XXX + connection: + - keep-alive + content-length: + - '2247' + content-type: + - application/json + host: + - generativelanguage.googleapis.com + x-goog-api-client: + - google-genai-sdk/1.65.0 gl-python/3.13.3 + x-goog-api-key: + - X-GOOG-API-KEY-XXX + method: POST + uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent + response: + body: + string: "{\n \"candidates\": [\n {\n \"content\": {\n \"parts\": + [\n {\n \"text\": \"**Analyzing the User's Statement**\\n\\nOkay, + so the user has given me the statement: \\\"The sum of 15 and 27 is 42.\\\" + My task is to break this down into a structured JSON object according to the + `CalculationResult` schema I'm working with. This is straightforward; let's + extract the key pieces:\\n\\nFirst, the **operation**: The word \\\"sum\\\" + is a clear indicator that we're dealing with addition. No ambiguity there.\\n\\nNext, + the **result**: The statement explicitly tells us that the result \\\"is 42\\\". + That's a direct, easily extracted value.\\n\\nFinally, the **explanation**: + I can use the entire original statement, \\\"The sum of 15 and 27 is 42.\\\", + as the explanation. It's concise and perfectly encapsulates the context of + the calculation.\\n\",\n \"thought\": true\n },\n {\n + \ \"text\": \"{\\\"operation\\\":\\\"addition\\\",\\\"result\\\":42,\\\"explanation\\\":\\\"The + sum of 15 and 27 is 42.\\\"}\"\n }\n ],\n \"role\": + \"model\"\n },\n \"finishReason\": \"STOP\",\n \"index\": 0\n + \ }\n ],\n \"usageMetadata\": {\n \"promptTokenCount\": 321,\n \"candidatesTokenCount\": + 28,\n \"totalTokenCount\": 480,\n \"promptTokensDetails\": [\n {\n + \ \"modality\": \"TEXT\",\n \"tokenCount\": 321\n }\n ],\n + \ \"thoughtsTokenCount\": 131,\n \"serviceTier\": \"standard\"\n },\n + \ \"modelVersion\": \"gemini-2.5-flash\",\n \"responseId\": \"NZgPasDuKf2VjMcPwc6D4Ak\"\n}\n" + headers: + Alt-Svc: + - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + Content-Type: + - application/json; charset=UTF-8 + Date: + - Thu, 21 May 2026 23:41:44 GMT + Server: + - scaffolding on HTTPServer2 + Server-Timing: + - gfet4t7; dur=2425 + Transfer-Encoding: + - chunked + Vary: + - Origin + - X-Origin + - Referer + X-Content-Type-Options: + - X-CONTENT-TYPE-XXX + X-Frame-Options: + - X-FRAME-OPTIONS-XXX + X-Gemini-Service-Tier: + - standard X-XSS-Protection: - '0' status: diff --git a/lib/crewai/tests/cassettes/llms/google/test_gemini_crew_structured_output_with_tools.yaml b/lib/crewai/tests/cassettes/llms/google/test_gemini_crew_structured_output_with_tools.yaml index 78f9bbe4e..f484adbe6 100644 --- a/lib/crewai/tests/cassettes/llms/google/test_gemini_crew_structured_output_with_tools.yaml +++ b/lib/crewai/tests/cassettes/llms/google/test_gemini_crew_structured_output_with_tools.yaml @@ -23,17 +23,8 @@ interactions: numbers together and return the sum.", "name": "add_numbers", "parameters_json_schema": {"properties": {"a": {"title": "A", "type": "integer"}, "b": {"title": "B", "type": "integer"}}, "required": ["a", "b"], "type": "object", "additionalProperties": - false}}, {"description": "Use this tool to provide your final structured response. - Call this tool when you have gathered all necessary information and are ready - to provide the final answer in the required format.", "name": "structured_output", - "parameters_json_schema": {"properties": {"operation": {"description": "The - mathematical operation performed", "title": "Operation", "type": "string"}, - "result": {"description": "The result of the calculation", "title": "Result", - "type": "integer"}, "explanation": {"description": "Brief explanation of the - calculation", "title": "Explanation", "type": "string"}}, "required": ["operation", - "result", "explanation"], "title": "CalculationResult", "type": "object", "additionalProperties": - false, "propertyOrdering": ["operation", "result", "explanation"]}}]}], "generationConfig": - {"stopSequences": ["\nObservation:"]}}' + false}}]}], "generationConfig": {"stopSequences": ["\nObservation:"], "thinkingConfig": + {"include_thoughts": true}}}' headers: User-Agent: - X-USER-AGENT-XXX @@ -44,41 +35,67 @@ interactions: connection: - keep-alive content-length: - - '2763' + - '2016' content-type: - application/json host: - generativelanguage.googleapis.com x-goog-api-client: - - google-genai-sdk/1.49.0 gl-python/3.13.12 + - google-genai-sdk/1.65.0 gl-python/3.13.3 x-goog-api-key: - X-GOOG-API-KEY-XXX method: POST - uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-001:generateContent + uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent response: body: string: "{\n \"candidates\": [\n {\n \"content\": {\n \"parts\": - [\n {\n \"functionCall\": {\n \"name\": \"add_numbers\",\n + [\n {\n \"text\": \"**My Calculation Process**\\n\\nAlright, + the user wants me to compute 15 + 27. Simple enough. I have a tool specifically + designed for this: `add_numbers(a: int, b: int)`. This is ideal; I'll utilize + that.\\n\\nSo, first step: I need to call the `add_numbers` tool. The inputs + are straightforward: `a` should be 15 and `b` should be 27. I'll execute that + call immediately.\\n\\nOnce I have the result \u2013 the sum \u2013 in hand, + I need to format the output. The user is specific about the structure; it + needs to be a JSON object conforming to that OpenAPI schema. Specifically, + the JSON should include: an \\\"operation\\\" field set to \\\"Addition\\\", + a \\\"result\\\" field populated with the calculated sum, and an \\\"explanation\\\" + field giving some context, which should be \\\"Added 15 and 27 together.\\\"\\n\\nTherefore, + my workflow is: call the tool with the provided numbers, get the sum, and + then construct the final JSON object in the required format.\\n\",\n \"thought\": + true\n },\n {\n \"text\": \"**My Reasoning for + Calculating 15 + 27**\\n\\nOkay, the user wants me to compute 15 plus 27. + No problem; that's straightforward. I've got a dedicated `add_numbers` tool + for this, which is exactly the right approach. Let's see...I need to call + that tool, providing `a=15` and `b=27` as input parameters. Once I receive + the sum, I can move on to formatting the result.\\n\\nNow, the important part: + the output needs to be a JSON object, specifically structured as dictated + by the OpenAPI schema. I need to make sure I include the \\\"operation\\\", + \\\"result\\\", and \\\"explanation\\\" fields. \\\"operation\\\" will be + \\\"Addition\\\", the \\\"result\\\" will naturally be the sum I get from + the tool, and the \\\"explanation\\\" will simply be \\\"Added 15 and 27 together.\\\" + That should cover everything, and the user should get a perfectly formatted + response.\\n\",\n \"thought\": true\n },\n {\n + \ \"functionCall\": {\n \"name\": \"add_numbers\",\n \ \"args\": {\n \"a\": 15,\n \"b\": - 27\n }\n }\n }\n ],\n \"role\": - \"model\"\n },\n \"finishReason\": \"STOP\",\n \"avgLogprobs\": - 4.3579145442760951e-06\n }\n ],\n \"usageMetadata\": {\n \"promptTokenCount\": - 377,\n \"candidatesTokenCount\": 7,\n \"totalTokenCount\": 384,\n \"promptTokensDetails\": - [\n {\n \"modality\": \"TEXT\",\n \"tokenCount\": 377\n - \ }\n ],\n \"candidatesTokensDetails\": [\n {\n \"modality\": - \"TEXT\",\n \"tokenCount\": 7\n }\n ]\n },\n \"modelVersion\": - \"gemini-2.0-flash-001\",\n \"responseId\": \"vVefaYDSOouXjMcPicLCsQY\"\n}\n" + 27\n }\n },\n \"thoughtSignature\": \"CtkGAQw51sf8m1RivBZ7Zp+ZkaqxDdZzSlzepmvlCKak9gl6edIuej/pHxR5dg3qZf89XmHvQ6HigZyzqHcYbSvcRHVGbpNkTr62FC0g10oK5ZEp/r1otLIcgXoVgyFGguJPe/NsfWSX3Uc7ZaYgV0Q2MHBsjUmEHicPH0Pj4Xmbe2I1pK/9DPrzSQqZW3duhLBlBIF9RwZUiltPH6mK+k71l8bN/ebsbbZM18FMXf0wg/7lf3OjvY2wdLDNUD/F2M7T8yfi7NelPWorjIuTGOVWlVRsdGW0QEzuVoyYY7OfbBJC+XsmTumYt+vqgIR3jcQZlA5/3yJdj3e/3mrNmzGt+8VvkjUnu3pz0IUkq2SoTG0+6Y/ajsUI0YA/BFiAXHjrRhH1Nx3ihGWT7E7VzpU/E1ZPFMJIOPLRSpRv8G6ITnjZGthozTZtKLgoHCF7kx4Ni8eVdOh2Us6kY7tYpVabM1dmw0gextEEt+fBMoI+qZGkXdL1YW6SEtQBHh3BGKX8khcrqNvqPZDFzSG0iieMJq7abbEYAIc8zRkeGlWEdX6ES6e+njnFN7JX0Nc32GzOjmpgx9gRhYe+wKonqBQ9RwLLNK+lFuflLTrU3D8jMiPCJyvoRsjdjEc+2JtHXo14ibOVXvZ6oYCHsTEB7f+90/qzcrITESyDBD/rmiT/SqgitBa44MZE9CZ9Ml+BW0xd9FfCy4oLy8w4vszVFDw9Eotr4pEzdCeDeWjMn35taJnWf6jUeF0z/0iyHjbi7XRubJXxI2YuKQ+HRCKX1RFaJWLhmxO4JNBDBqfYZqsO/FefqxjWi2pRzE8U/Upp8Tv/hy1FoN9Abs8W6lPoqgOyEiOcpVkM+u0CgUbf87I1X2EiPpuJF4D9dHlEJqumiPqIGazSLnrjW1qqbM5UpQQuPoTC7q+G092CEnNJBIwrufddZPDfD9rqINpmMa+7OswldKViVaCWR3VsgrSXJj7lVRntCyE2atWxTvtQVnR/JLDdyc98CAUChtAPnC4K/K3OVI4jffQQsHmfeOnTyg0n2VnZ6Yhgo0lMdE4IfMrNOWOuNvHodeHisD2yXjvTCgScO8B3s+EJTvenHMert3nRgjNRmFZ0cRNSjbTeG0UlB9s7Uy0uyrn5ODkKIgEMOdbH9yJU53jInG9boFeMXb1qif47Pc72taZkl6ZaMK4=\"\n + \ }\n ],\n \"role\": \"model\"\n },\n \"finishReason\": + \"STOP\",\n \"index\": 0,\n \"finishMessage\": \"Model generated + function call(s).\"\n }\n ],\n \"usageMetadata\": {\n \"promptTokenCount\": + 383,\n \"candidatesTokenCount\": 22,\n \"totalTokenCount\": 658,\n \"promptTokensDetails\": + [\n {\n \"modality\": \"TEXT\",\n \"tokenCount\": 383\n + \ }\n ],\n \"thoughtsTokenCount\": 253,\n \"serviceTier\": \"standard\"\n + \ },\n \"modelVersion\": \"gemini-2.5-flash\",\n \"responseId\": \"qagPas37Ba2R-8YPzYzI8AY\"\n}\n" headers: Alt-Svc: - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 Content-Type: - application/json; charset=UTF-8 Date: - - Wed, 25 Feb 2026 20:12:46 GMT + - Fri, 22 May 2026 00:51:56 GMT Server: - scaffolding on HTTPServer2 Server-Timing: - - gfet4t7; dur=718 + - gfet4t7; dur=3892 Transfer-Encoding: - chunked Vary: @@ -89,6 +106,8 @@ interactions: - X-CONTENT-TYPE-XXX X-Frame-Options: - X-FRAME-OPTIONS-XXX + X-Gemini-Service-Tier: + - standard X-XSS-Protection: - '0' status: @@ -112,27 +131,17 @@ interactions: the schema format.\n\nDo not include the OpenAPI schema in the final output. Ensure the final output does not include any code block markers like ```json or ```python."}], "role": "user"}, {"parts": [{"functionCall": {"args": {"a": - 15, "b": 27}, "name": "add_numbers"}}], "role": "model"}, {"parts": [{"functionResponse": - {"name": "add_numbers", "response": {"result": 42}}}], "role": "user"}, {"parts": - [{"text": "Analyze the tool result. If requirements are met, provide the Final - Answer. Otherwise, call the next tool. Deliver only the answer without meta-commentary."}], - "role": "user"}], "systemInstruction": {"parts": [{"text": "You are Calculator. - You are a calculator assistant that uses tools to compute results.\nYour personal - goal is: Perform calculations using available tools"}], "role": "user"}, "tools": - [{"functionDeclarations": [{"description": "Add two numbers together and return - the sum.", "name": "add_numbers", "parameters_json_schema": {"properties": {"a": - {"title": "A", "type": "integer"}, "b": {"title": "B", "type": "integer"}}, - "required": ["a", "b"], "type": "object", "additionalProperties": false}}, {"description": - "Use this tool to provide your final structured response. Call this tool when - you have gathered all necessary information and are ready to provide the final - answer in the required format.", "name": "structured_output", "parameters_json_schema": - {"properties": {"operation": {"description": "The mathematical operation performed", - "title": "Operation", "type": "string"}, "result": {"description": "The result - of the calculation", "title": "Result", "type": "integer"}, "explanation": {"description": - "Brief explanation of the calculation", "title": "Explanation", "type": "string"}}, - "required": ["operation", "result", "explanation"], "title": "CalculationResult", - "type": "object", "additionalProperties": false, "propertyOrdering": ["operation", - "result", "explanation"]}}]}], "generationConfig": {"stopSequences": ["\nObservation:"]}}' + 15, "b": 27}, "name": "add_numbers"}, "thoughtSignature": "CtkGAQw51sf8m1RivBZ7Zp-ZkaqxDdZzSlzepmvlCKak9gl6edIuej_pHxR5dg3qZf89XmHvQ6HigZyzqHcYbSvcRHVGbpNkTr62FC0g10oK5ZEp_r1otLIcgXoVgyFGguJPe_NsfWSX3Uc7ZaYgV0Q2MHBsjUmEHicPH0Pj4Xmbe2I1pK_9DPrzSQqZW3duhLBlBIF9RwZUiltPH6mK-k71l8bN_ebsbbZM18FMXf0wg_7lf3OjvY2wdLDNUD_F2M7T8yfi7NelPWorjIuTGOVWlVRsdGW0QEzuVoyYY7OfbBJC-XsmTumYt-vqgIR3jcQZlA5_3yJdj3e_3mrNmzGt-8VvkjUnu3pz0IUkq2SoTG0-6Y_ajsUI0YA_BFiAXHjrRhH1Nx3ihGWT7E7VzpU_E1ZPFMJIOPLRSpRv8G6ITnjZGthozTZtKLgoHCF7kx4Ni8eVdOh2Us6kY7tYpVabM1dmw0gextEEt-fBMoI-qZGkXdL1YW6SEtQBHh3BGKX8khcrqNvqPZDFzSG0iieMJq7abbEYAIc8zRkeGlWEdX6ES6e-njnFN7JX0Nc32GzOjmpgx9gRhYe-wKonqBQ9RwLLNK-lFuflLTrU3D8jMiPCJyvoRsjdjEc-2JtHXo14ibOVXvZ6oYCHsTEB7f-90_qzcrITESyDBD_rmiT_SqgitBa44MZE9CZ9Ml-BW0xd9FfCy4oLy8w4vszVFDw9Eotr4pEzdCeDeWjMn35taJnWf6jUeF0z_0iyHjbi7XRubJXxI2YuKQ-HRCKX1RFaJWLhmxO4JNBDBqfYZqsO_FefqxjWi2pRzE8U_Upp8Tv_hy1FoN9Abs8W6lPoqgOyEiOcpVkM-u0CgUbf87I1X2EiPpuJF4D9dHlEJqumiPqIGazSLnrjW1qqbM5UpQQuPoTC7q-G092CEnNJBIwrufddZPDfD9rqINpmMa-7OswldKViVaCWR3VsgrSXJj7lVRntCyE2atWxTvtQVnR_JLDdyc98CAUChtAPnC4K_K3OVI4jffQQsHmfeOnTyg0n2VnZ6Yhgo0lMdE4IfMrNOWOuNvHodeHisD2yXjvTCgScO8B3s-EJTvenHMert3nRgjNRmFZ0cRNSjbTeG0UlB9s7Uy0uyrn5ODkKIgEMOdbH9yJU53jInG9boFeMXb1qif47Pc72taZkl6ZaMK4="}], + "role": "model"}, {"parts": [{"functionResponse": {"name": "add_numbers", "response": + {"result": 42}}}], "role": "user"}], "systemInstruction": {"parts": [{"text": + "You are Calculator. You are a calculator assistant that uses tools to compute + results.\nYour personal goal is: Perform calculations using available tools"}], + "role": "user"}, "tools": [{"functionDeclarations": [{"description": "Add two + numbers together and return the sum.", "name": "add_numbers", "parameters_json_schema": + {"properties": {"a": {"title": "A", "type": "integer"}, "b": {"title": "B", + "type": "integer"}}, "required": ["a", "b"], "type": "object", "additionalProperties": + false}}]}], "generationConfig": {"stopSequences": ["\nObservation:"], "thinkingConfig": + {"include_thoughts": true}}}' headers: User-Agent: - X-USER-AGENT-XXX @@ -143,42 +152,50 @@ interactions: connection: - keep-alive content-length: - - '3166' + - '3441' content-type: - application/json host: - generativelanguage.googleapis.com x-goog-api-client: - - google-genai-sdk/1.49.0 gl-python/3.13.12 + - google-genai-sdk/1.65.0 gl-python/3.13.3 x-goog-api-key: - X-GOOG-API-KEY-XXX method: POST - uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-001:generateContent + uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent response: body: string: "{\n \"candidates\": [\n {\n \"content\": {\n \"parts\": - [\n {\n \"functionCall\": {\n \"name\": \"structured_output\",\n - \ \"args\": {\n \"result\": 42,\n \"explanation\": - \"15 + 27 = 42\",\n \"operation\": \"addition\"\n }\n - \ }\n }\n ],\n \"role\": \"model\"\n },\n - \ \"finishReason\": \"STOP\",\n \"avgLogprobs\": -0.07498827245500353\n - \ }\n ],\n \"usageMetadata\": {\n \"promptTokenCount\": 421,\n \"candidatesTokenCount\": - 18,\n \"totalTokenCount\": 439,\n \"promptTokensDetails\": [\n {\n - \ \"modality\": \"TEXT\",\n \"tokenCount\": 421\n }\n ],\n - \ \"candidatesTokensDetails\": [\n {\n \"modality\": \"TEXT\",\n - \ \"tokenCount\": 18\n }\n ]\n },\n \"modelVersion\": \"gemini-2.0-flash-001\",\n - \ \"responseId\": \"vlefac7bJb6TjMcPzYWh0Ag\"\n}\n" + [\n {\n \"text\": \"**My Calculation and OpenAPI Formatting**\\n\\nOkay, + so I've just crunched the numbers, 15 plus 27, and the answer, as expected, + is 42. Now comes the formatting, the part I truly appreciate. It's time to + translate this into the precise structure that the OpenAPI schema dictates.\\n\\nLet's + see\u2026 I need to populate three key fields: `operation`, `result`, and + `explanation`. This is straightforward. For `operation`, I'll enter \\\"Addition,\\\" + because, well, that's what I did! For `result`, the answer I painstakingly + produced, 42. And for `explanation`, a concise note, \\\"Added 15 and 27 together.\\\" + Perfect. That should do the trick. Now I can move on to the next task.\\n\",\n + \ \"thought\": true\n },\n {\n \"text\": + \"{\\n \\\"operation\\\": \\\"Addition\\\",\\n \\\"result\\\": 42,\\n \\\"explanation\\\": + \\\"Added 15 and 27 together.\\\"\\n}\",\n \"thoughtSignature\": + \"CrcDAQw51sd+vh7cJvN7WGZKQIJGL6Xtr/+CNnL2r9YWGHv5EBrOm/Qdzr4eK0eyrJhuJGBZg5V5XakEuLMULUvth7stE+FTz16F5Vzx2yKMuM5Ictv/DlI7s4Z5WFaI5HJVJTojOhW9K/1TM8y48+eStJre8Qyz3tOvFg1DPEau6JCk+1uoRil2RoZHxFQpd0LaDhl4sKZkRr1e5c2gtfZiK3NHR3ipbRejIOGjDQah4+q4D6ASTiHZxHCBIjAP4HH8DF40oylF6mQR1WHWezKzvkZ0sz3ydPGExM5+lFOE8z1NUpqH2kJ3PfzdrbX2VccIT+5pWz9NsIW8N1JYbPvb7xKENh7mTI+tmCtuAiO9DTwWUf450OHNWdrHQPxn3MMT10+4RMzKBeDAjEFVZ6M68CyUDTJ0uDtqJZ6SXs3ZdmmLGQY1lAk29r0eklaMJLk226uMUKCXlHKwyDbJVH3+SwGkgU+Am81AiekV5ZWQjfe3gUN8ojOLSNvpAfaf/K8ZvR4uGCEMs2pJ2sqI6sCIE9w9+u2biTattqWtcO+wmPXZ/CwU/ASXHlBqt55cvB2XyFTXO7kQGw==\"\n + \ }\n ],\n \"role\": \"model\"\n },\n \"finishReason\": + \"STOP\",\n \"index\": 0\n }\n ],\n \"usageMetadata\": {\n \"promptTokenCount\": + 421,\n \"candidatesTokenCount\": 36,\n \"totalTokenCount\": 560,\n \"promptTokensDetails\": + [\n {\n \"modality\": \"TEXT\",\n \"tokenCount\": 421\n + \ }\n ],\n \"thoughtsTokenCount\": 103,\n \"serviceTier\": \"standard\"\n + \ },\n \"modelVersion\": \"gemini-2.5-flash\",\n \"responseId\": \"ragPaseeA6nT_uMP653cmAc\"\n}\n" headers: Alt-Svc: - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 Content-Type: - application/json; charset=UTF-8 Date: - - Wed, 25 Feb 2026 20:12:47 GMT + - Fri, 22 May 2026 00:51:59 GMT Server: - scaffolding on HTTPServer2 Server-Timing: - - gfet4t7; dur=774 + - gfet4t7; dur=2377 Transfer-Encoding: - chunked Vary: @@ -189,6 +206,8 @@ interactions: - X-CONTENT-TYPE-XXX X-Frame-Options: - X-FRAME-OPTIONS-XXX + X-Gemini-Service-Tier: + - standard X-XSS-Protection: - '0' status: diff --git a/lib/crewai/tests/llms/anthropic/test_anthropic.py b/lib/crewai/tests/llms/anthropic/test_anthropic.py index 1a14eddf5..1269b5bd3 100644 --- a/lib/crewai/tests/llms/anthropic/test_anthropic.py +++ b/lib/crewai/tests/llms/anthropic/test_anthropic.py @@ -923,7 +923,7 @@ def test_anthropic_agent_kickoff_structured_output_with_tools(): role="Calculator", goal="Perform calculations using available tools", backstory="You are a calculator assistant that uses tools to compute results.", - llm=LLM(model="anthropic/claude-3-5-haiku-20241022"), + llm=LLM(model="anthropic/claude-sonnet-4-6"), tools=[add_numbers], verbose=True, ) diff --git a/lib/crewai/tests/llms/bedrock/test_bedrock.py b/lib/crewai/tests/llms/bedrock/test_bedrock.py index a7770fe71..d7421e852 100644 --- a/lib/crewai/tests/llms/bedrock/test_bedrock.py +++ b/lib/crewai/tests/llms/bedrock/test_bedrock.py @@ -844,7 +844,7 @@ def test_bedrock_agent_kickoff_structured_output_without_tools(): role="Analyst", goal="Provide structured analysis on topics", backstory="You are an expert analyst who provides clear, structured insights.", - llm=LLM(model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0"), + llm=LLM(model="bedrock/us.anthropic.claude-sonnet-4-6"), tools=[], verbose=True, ) @@ -886,7 +886,7 @@ def test_bedrock_agent_kickoff_structured_output_with_tools(): role="Calculator", goal="Perform calculations using available tools", backstory="You are a calculator assistant that uses tools to compute results.", - llm=LLM(model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0"), + llm=LLM(model="bedrock/us.anthropic.claude-sonnet-4-6"), tools=[add_numbers], verbose=True, ) diff --git a/lib/crewai/tests/llms/bedrock/test_bedrock_async.py b/lib/crewai/tests/llms/bedrock/test_bedrock_async.py index 0bf3558b1..1097e2816 100644 --- a/lib/crewai/tests/llms/bedrock/test_bedrock_async.py +++ b/lib/crewai/tests/llms/bedrock/test_bedrock_async.py @@ -17,7 +17,7 @@ SKIP_REASON = "VCR does not support aiobotocore async HTTP client" @pytest.mark.skip(reason=SKIP_REASON) async def test_bedrock_async_basic_call(): """Test basic async call with Bedrock.""" - llm = LLM(model="bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0") + llm = LLM(model="bedrock/us.anthropic.claude-sonnet-4-6") result = await llm.acall("Say hello") @@ -31,7 +31,7 @@ async def test_bedrock_async_basic_call(): @pytest.mark.skip(reason=SKIP_REASON) async def test_bedrock_async_with_temperature(): """Test async call with temperature parameter.""" - llm = LLM(model="bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0", temperature=0.1) + llm = LLM(model="bedrock/us.anthropic.claude-sonnet-4-6", temperature=0.1) result = await llm.acall("Say the word 'test' once") @@ -44,7 +44,7 @@ async def test_bedrock_async_with_temperature(): @pytest.mark.skip(reason=SKIP_REASON) async def test_bedrock_async_with_max_tokens(): """Test async call with max_tokens parameter.""" - llm = LLM(model="bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0", max_tokens=10) + llm = LLM(model="bedrock/us.anthropic.claude-sonnet-4-6", max_tokens=10) result = await llm.acall("Write a very long story about a dragon.") @@ -58,7 +58,7 @@ async def test_bedrock_async_with_max_tokens(): @pytest.mark.skip(reason=SKIP_REASON) async def test_bedrock_async_with_system_message(): """Test async call with system message.""" - llm = LLM(model="bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0") + llm = LLM(model="bedrock/us.anthropic.claude-sonnet-4-6") messages = [ {"role": "system", "content": "You are a helpful assistant."}, @@ -76,7 +76,7 @@ async def test_bedrock_async_with_system_message(): @pytest.mark.skip(reason=SKIP_REASON) async def test_bedrock_async_conversation(): """Test async call with conversation history.""" - llm = LLM(model="bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0") + llm = LLM(model="bedrock/us.anthropic.claude-sonnet-4-6") messages = [ {"role": "user", "content": "My name is Alice."}, @@ -95,7 +95,7 @@ async def test_bedrock_async_conversation(): @pytest.mark.skip(reason=SKIP_REASON) async def test_bedrock_async_multiple_calls(): """Test making multiple async calls in sequence.""" - llm = LLM(model="bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0") + llm = LLM(model="bedrock/us.anthropic.claude-sonnet-4-6") result1 = await llm.acall("What is 1+1?") result2 = await llm.acall("What is 2+2?") @@ -112,10 +112,9 @@ async def test_bedrock_async_multiple_calls(): async def test_bedrock_async_with_parameters(): """Test async call with multiple parameters.""" llm = LLM( - model="bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0", + model="bedrock/us.anthropic.claude-sonnet-4-6", temperature=0.7, max_tokens=100, - top_p=0.9 ) result = await llm.acall("Tell me a short fact") diff --git a/lib/crewai/tests/llms/google/test_google.py b/lib/crewai/tests/llms/google/test_google.py index 0634b835f..3bcdb0951 100644 --- a/lib/crewai/tests/llms/google/test_google.py +++ b/lib/crewai/tests/llms/google/test_google.py @@ -969,7 +969,7 @@ def test_gemini_crew_structured_output_with_tools(): role="Calculator", goal="Perform calculations using available tools", backstory="You are a calculator assistant that uses tools to compute results.", - llm=LLM(model="google/gemini-2.0-flash-001"), + llm=LLM(model="google/gemini-2.5-flash"), tools=[add_numbers], ) diff --git a/lib/crewai/tests/llms/test_multimodal_integration.py b/lib/crewai/tests/llms/test_multimodal_integration.py index e08b78e38..9957be8c1 100644 --- a/lib/crewai/tests/llms/test_multimodal_integration.py +++ b/lib/crewai/tests/llms/test_multimodal_integration.py @@ -290,7 +290,7 @@ class TestBedrockMultimodalIntegration: @pytest.mark.vcr() def test_describe_image(self, test_image_bytes: bytes) -> None: """Test Bedrock Claude can describe an image.""" - llm = LLM(model="bedrock/anthropic.claude-3-haiku-20240307-v1:0") + llm = LLM(model="bedrock/us.anthropic.claude-sonnet-4-6") files = {"image": ImageFile(source=test_image_bytes)} messages = _build_multimodal_message( @@ -308,7 +308,7 @@ class TestBedrockMultimodalIntegration: @pytest.mark.vcr() def test_analyze_pdf(self) -> None: """Test Bedrock Claude can analyze a PDF.""" - llm = LLM(model="bedrock/anthropic.claude-3-haiku-20240307-v1:0") + llm = LLM(model="bedrock/us.anthropic.claude-sonnet-4-6") files = {"document": PDFFile(source=MINIMAL_PDF)} messages = _build_multimodal_message( diff --git a/lib/crewai/tests/test_crew_multimodal.py b/lib/crewai/tests/test_crew_multimodal.py index d23a80a99..173599d5d 100644 --- a/lib/crewai/tests/test_crew_multimodal.py +++ b/lib/crewai/tests/test_crew_multimodal.py @@ -42,7 +42,7 @@ GEMINI_MODELS = [ ] BEDROCK_MODELS = [ - "bedrock/anthropic.claude-3-haiku-20240307-v1:0", + "bedrock/us.anthropic.claude-sonnet-4-6", ]