Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/crewai/src/crewai/tools/tool_usage.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
33 changes: 32 additions & 1 deletion lib/crewai/tests/tools/test_tool_usage.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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(),
Expand Down