# SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project import pytest from tests.tool_parsers.common_tests import ( ToolParserTestConfig, ToolParserTests, ) class TestGranite20bFcToolParser(ToolParserTests): @pytest.fixture def test_config(self) -> ToolParserTestConfig: return ToolParserTestConfig( parser_name="granite-20b-fc", # Test data no_tool_calls_output="This is a regular response without any tool calls.", single_tool_call_output=( ' {"name": "get_weather", ' '"arguments": {"city": "Tokyo"}}' ), parallel_tool_calls_output=( ' {"name": "get_weather", ' '"arguments": {"city": "Tokyo"}}\n' ' {"name": "get_time", ' '"arguments": {"timezone": "Asia/Tokyo"}}' ), various_data_types_output=""" { "name": "test_function", "arguments": { "string_field": "hello", "int_field": 42, "float_field": 3.14, "bool_field": true, "null_field": null, "array_field": ["a", "b", "c"], "object_field": {"nested": "value"}, "empty_array": [], "empty_object": {} } }""", empty_arguments_output=( ' {"name": "refresh", "arguments": {}}' ), surrounding_text_output="""Let me check the weather for you. {"name": "get_weather", "arguments": {"city": "Tokyo"}}""", escaped_strings_output=""" { "name": "test_function", "arguments": { "quoted": "He said \\"hello\\"", "path": "C:\\\\Users\\\\file.txt", "newline": "line1\\nline2", "unicode": "emoji: 🎉" } }""", malformed_input_outputs=[ ' {"name": "func", "arguments": {', ' [{"name": "func", "arguments": {}}]', '{"name": "func", "arguments": {}}', ' {"name": 123}', ], # Expected results single_tool_call_expected_name="get_weather", single_tool_call_expected_args={"city": "Tokyo"}, single_tool_call_expected_content=None, parallel_tool_calls_count=2, parallel_tool_calls_names=["get_weather", "get_time"], # xfail markers xfail_streaming={ "test_surrounding_text": ( "Granite 20B FC streaming requires at start" ), }, xfail_nonstreaming={}, )