From 243ed75b82208914cc561eccf1f03353d3f59642 Mon Sep 17 00:00:00 2001 From: Rafaa Date: Fri, 3 Jul 2026 17:55:06 -0700 Subject: [PATCH 1/2] fix: raise ToolUsageError instead of bare raise on non-dict arguments --- lib/crewai/src/crewai/tools/tool_usage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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( From 271e545bc09aa84ea54ef18f191b010deb748e41 Mon Sep 17 00:00:00 2001 From: Rafaa Date: Fri, 3 Jul 2026 17:55:06 -0700 Subject: [PATCH 2/2] test: cover non-dict arguments path in _original_tool_calling --- lib/crewai/tests/tools/test_tool_usage.py | 33 ++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/crewai/tests/tools/test_tool_usage.py b/lib/crewai/tests/tools/test_tool_usage.py index 9d61c93a9b..75bd54414e 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 @@ -346,6 +346,37 @@ def test_validate_tool_input_with_special_characters(): assert arguments == expected_arguments +def test_original_tool_calling_non_dict_arguments_raises_tool_usage_error(): + """Regression test for #6430. + + The non-dict arguments branch in `_original_tool_calling` used a bare + `raise` with no active exception, so hitting it with `raise_error=True` + crashed with `RuntimeError: No active exception to re-raise` instead of + raising a meaningful `ToolUsageError`. + """ + tool = RandomNumberTool() + tool_usage = ToolUsage( + tools_handler=MagicMock(), + tools=[tool], + task=MagicMock(), + function_calling_llm=MagicMock(), + agent=MagicMock(), + action=MagicMock(), + ) + + with ( + patch.object( + tool_usage, "_validate_tool_input", return_value=["not", "a", "dict"] + ), + patch.object(tool_usage, "_select_tool", return_value=tool), + ): + with pytest.raises(ToolUsageError): + tool_usage._original_tool_calling("", raise_error=True) + + result = tool_usage._original_tool_calling("") + assert isinstance(result, ToolUsageError) + + def test_validate_tool_input_none_input(): tool_usage = ToolUsage( tools_handler=MagicMock(),