From 7bdd13df59d7060723c3d5c43e50f459259d6da2 Mon Sep 17 00:00:00 2001 From: initiallyqq <3022803092@qq.om> Date: Sun, 5 Jul 2026 00:36:38 +0800 Subject: [PATCH 1/2] fix-tool-usage-bare-raise --- lib/crewai/src/crewai/tools/tool_usage.py | 2 +- lib/crewai/tests/tools/test_tool_usage.py | 36 ++++++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/lib/crewai/src/crewai/tools/tool_usage.py b/lib/crewai/src/crewai/tools/tool_usage.py index e92ba03eed..c523b2bb43 100644 --- a/lib/crewai/src/crewai/tools/tool_usage.py +++ b/lib/crewai/src/crewai/tools/tool_usage.py @@ -850,7 +850,7 @@ def _original_tool_calling( if not isinstance(arguments, dict): if raise_error: - raise + raise ToolUsageError(f"{I18N_DEFAULT.errors('tool_arguments_error')}") return ToolUsageError(f"{I18N_DEFAULT.errors('tool_arguments_error')}") return ToolCalling( diff --git a/lib/crewai/tests/tools/test_tool_usage.py b/lib/crewai/tests/tools/test_tool_usage.py index 9d61c93a9b..de4fd311de 100644 --- a/lib/crewai/tests/tools/test_tool_usage.py +++ b/lib/crewai/tests/tools/test_tool_usage.py @@ -25,7 +25,7 @@ ) from crewai.tools import BaseTool from crewai.tools.tool_calling import ToolCalling -from crewai.tools.tool_usage import ToolUsage +from crewai.tools.tool_usage import ToolUsage, ToolUsageError from crewai.utilities.tool_utils import execute_tool_and_check_finality from pydantic import BaseModel, Field import pytest @@ -467,6 +467,40 @@ def test_validate_tool_input_invalid_input(): assert arguments == {} +def test_original_tool_calling_raises_tool_usage_error_for_non_dict_arguments(): + class TestTool(BaseTool): + name: str = "Test Tool" + description: str = "A test tool" + + def _run(self, input: dict) -> str: + return "test result" + + action = MagicMock() + action.tool = "test_tool" + action.tool_input = '["not", "a", "dict"]' + + tool_usage = ToolUsage( + tools_handler=MagicMock(), + tools=[TestTool()], + task=MagicMock(), + function_calling_llm=None, + agent=MagicMock(), + action=action, + ) + + with ( + patch.object( + tool_usage, + "_validate_tool_input", + return_value=["not", "a", "dict"], + ), + pytest.raises(ToolUsageError) as exc_info, + ): + tool_usage._original_tool_calling(action.tool_input, raise_error=True) + + assert "Action Input is not a valid key, value dictionary" in str(exc_info.value) + + def test_validate_tool_input_complex_structure(): tool_usage = ToolUsage( tools_handler=MagicMock(), From c048958f75b2a061d77ee3fc4f02e1485685ea47 Mon Sep 17 00:00:00 2001 From: initiallyqq <3022803092@qq.om> Date: Sun, 5 Jul 2026 23:09:09 +0800 Subject: [PATCH 2/2] refactor: reuse tool arguments error --- lib/crewai/src/crewai/tools/tool_usage.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/crewai/src/crewai/tools/tool_usage.py b/lib/crewai/src/crewai/tools/tool_usage.py index c523b2bb43..b5a475cd01 100644 --- a/lib/crewai/src/crewai/tools/tool_usage.py +++ b/lib/crewai/src/crewai/tools/tool_usage.py @@ -840,18 +840,21 @@ def _original_tool_calling( ) -> ToolCalling | InstructorToolCalling | ToolUsageError: tool_name = self.action.tool tool = self._select_tool(tool_name) + tool_arguments_error = ToolUsageError( + f"{I18N_DEFAULT.errors('tool_arguments_error')}" + ) try: arguments = self._validate_tool_input(self.action.tool_input) except Exception: if raise_error: raise - return ToolUsageError(f"{I18N_DEFAULT.errors('tool_arguments_error')}") + return tool_arguments_error if not isinstance(arguments, dict): if raise_error: - raise ToolUsageError(f"{I18N_DEFAULT.errors('tool_arguments_error')}") - return ToolUsageError(f"{I18N_DEFAULT.errors('tool_arguments_error')}") + raise tool_arguments_error + return tool_arguments_error return ToolCalling( tool_name=sanitize_tool_name(tool.name),