import pytest from smolagents.tools import Tool, tool @pytest.fixture def test_tool(): class TestTool(Tool): name = "test_tool" description = "A test tool" inputs = {"input": {"type": "string", "description": "Input value"}} output_type = "string" def forward(self, input): if input == "error": raise ValueError("Tool execution error") return f"Processed: {input}" return TestTool() @pytest.fixture def example_tool(): @tool def valid_tool_function(input: str) -> str: """A valid tool function. Args: input (str): Input string. """ return input.upper() return valid_tool_function @pytest.fixture def boolean_default_tool_class(): class BooleanDefaultTool(Tool): name = "boolean_default_tool" description = "A tool with a boolean default parameter" inputs = { "text": {"type": "string", "description": "Input text"}, "flag": {"type": "boolean", "description": "Boolean flag with default value", "nullable": True}, } output_type = "string" def forward(self, text: str, flag: bool = False) -> str: return f"Text: {text}, Flag: {flag}" return BooleanDefaultTool() @pytest.fixture def boolean_default_tool_function(): @tool def boolean_default_tool(text: str, flag: bool = False) -> str: """ A tool with a boolean default parameter. Args: text: Input text flag: Boolean flag with default value """ return f"Text: {text}, Flag: {flag}" return boolean_default_tool @pytest.fixture def optional_input_tool_class(): class OptionalInputTool(Tool): name = "optional_input_tool" description = "A tool with an optional input parameter" inputs = { "required_text": {"type": "string", "description": "Required input text"}, "optional_text": {"type": "string", "description": "Optional input text", "nullable": True}, } output_type = "string" def forward(self, required_text: str, optional_text: str | None = None) -> str: if optional_text: return f"{required_text} + {optional_text}" return required_text return OptionalInputTool() @pytest.fixture def optional_input_tool_function(): @tool def optional_input_tool(required_text: str, optional_text: str | None = None) -> str: """ A tool with an optional input parameter. Args: required_text: Required input text optional_text: Optional input text """ if optional_text: return f"{required_text} + {optional_text}" return required_text return optional_input_tool