From 3affa9dcc309ed35ac63672bcc0bc5ba0753f106 Mon Sep 17 00:00:00 2001 From: Binyao Jiang Date: Mon, 25 Aug 2025 13:46:13 -0700 Subject: [PATCH] Fix GLM45 tool call multi-turn bug (#9500) --- .../srt/entrypoints/openai/serving_chat.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/python/sglang/srt/entrypoints/openai/serving_chat.py b/python/sglang/srt/entrypoints/openai/serving_chat.py index 6f5a17e4c..b58ba3a7c 100644 --- a/python/sglang/srt/entrypoints/openai/serving_chat.py +++ b/python/sglang/srt/entrypoints/openai/serving_chat.py @@ -207,6 +207,25 @@ class OpenAIServingChat(OpenAIServingBase): audio_data, modalities, ) + + # per the Transformers docs & maintainers, tool call arguments in + # assistant-role messages with tool_calls need to be dicts not JSON str - + # this is how tool-use chat templates will expect them moving forwards + # so, for messages that have tool_calls, parse the string (which we get + # from openAI format) to dict + if ( + processed_msg["role"] == "assistant" + and "tool_calls" in processed_msg + and isinstance(processed_msg["tool_calls"], list) + ): + for item in processed_msg["tool_calls"]: + if "arguments" in item["function"] and isinstance( + item["function"]["arguments"], str + ): + item["function"]["arguments"] = json.loads( + item["function"]["arguments"] + ) + openai_compatible_messages.append(processed_msg) # Handle assistant prefix for continue_final_message