From f1f1d1d40d8b30ee8395abfeb51d0454e5b5763f Mon Sep 17 00:00:00 2001 From: jiawei Date: Tue, 15 Jul 2025 15:58:55 +0800 Subject: [PATCH] Fix the input tools format and history tool_calls in OpenAI API (#6556) --- .../srt/entrypoints/openai/serving_chat.py | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/python/sglang/srt/entrypoints/openai/serving_chat.py b/python/sglang/srt/entrypoints/openai/serving_chat.py index d7c6b9f89..e69587432 100644 --- a/python/sglang/srt/entrypoints/openai/serving_chat.py +++ b/python/sglang/srt/entrypoints/openai/serving_chat.py @@ -113,12 +113,12 @@ class OpenAIServingChat(OpenAIServingBase): request.skip_special_tokens = False if not isinstance(request.tool_choice, str): tools = [ - item.function.model_dump() + item.model_dump() for item in request.tools if item.function.name == request.tool_choice.function.name ] else: - tools = [item.function.model_dump() for item in request.tools] + tools = [item.model_dump() for item in request.tools] tool_call_parser = self.tokenizer_manager.server_args.tool_call_parser parser = FunctionCallParser(request.tools, tool_call_parser) @@ -164,6 +164,25 @@ class OpenAIServingChat(OpenAIServingBase): audio_data, modalities, ) + + if "tool_calls" in processed_msg and isinstance( + processed_msg.get("tool_calls"), list + ): + for call in processed_msg["tool_calls"]: + try: + if "arguments" in call["function"] and isinstance( + call["function"]["arguments"], str + ): + call["function"]["arguments"] = json.loads( + call["function"]["arguments"] + ) + except json.JSONDecodeError as e: + # Log a warning or error if JSON parsing fails for arguments + logger.warning( + f"Failed to parse tool call arguments as JSON: {e}" + ) + # Decide whether to continue or raise the exception based on desired behavior + continue # Or raise e if strict parsing is required openai_compatible_messages.append(processed_msg) # Handle assistant prefix for continue_final_message