From 9c8e90eb2637a863ca14e47fd436b10ed7ba6536 Mon Sep 17 00:00:00 2001 From: Taneem Ibrahim Date: Tue, 25 Aug 2026 08:21:42 -0400 Subject: [PATCH] [Bugfix] Handle parenthesized Gemma4 tool calls (#53657) Signed-off-by: Taneem Ibrahim --- vllm/parser/gemma4.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/vllm/parser/gemma4.py b/vllm/parser/gemma4.py index 47a97cc490..b0e3e83115 100644 --- a/vllm/parser/gemma4.py +++ b/vllm/parser/gemma4.py @@ -285,7 +285,7 @@ def _parse_gemma4_array(arr_str: str, *, partial: bool = False) -> list: def _gemma4_arg_converter(raw_args: str, partial: bool) -> str: """Convert Gemma4 custom arg format to a JSON string.""" text = raw_args.strip() - if text.endswith("}"): + if text.endswith("}") or text.endswith(")") and text.count("(") < text.count(")"): text = text[:-1] parsed = _parse_gemma4_args(text, partial=partial) @@ -304,6 +304,7 @@ def gemma4_config() -> ParserEngineConfig: "TOOL_END": TOOL_CALL_END, "CALL_PREFIX": "call:", "OPEN_BRACE": "{", + "OPEN_PAREN": "(", }, token_id_terminals={ "THINK_START": CHANNEL_START, @@ -351,6 +352,14 @@ def gemma4_config() -> ParserEngineConfig: ParserState.TOOL_ARGS, (), ), + (ParserState.TOOL_NAME, "OPEN_PAREN"): Transition( + ParserState.TOOL_ARGS, + (), + ), + (ParserState.TOOL_NAME, "TOOL_END"): Transition( + ParserState.CONTENT, + (EventType.TOOL_CALL_END,), + ), (ParserState.TOOL_ARGS, "TOOL_END"): Transition( ParserState.CONTENT, (EventType.TOOL_CALL_END,),