From e2d09ac36174de48a7d85bafc8d3291c9ffe44cd Mon Sep 17 00:00:00 2001 From: Tim Baek Date: Mon, 9 Feb 2026 09:06:48 +0400 Subject: [PATCH] refac --- backend/open_webui/routers/openai.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/backend/open_webui/routers/openai.py b/backend/open_webui/routers/openai.py index a4dce3fe0c..5cb0deb697 100644 --- a/backend/open_webui/routers/openai.py +++ b/backend/open_webui/routers/openai.py @@ -858,6 +858,33 @@ def convert_to_responses_payload(payload: dict) -> dict: if "max_tokens" in responses_payload: responses_payload["max_output_tokens"] = responses_payload.pop("max_tokens") + # Remove Chat Completions-only parameters not supported by the Responses API + for unsupported_key in ("stream_options", "logit_bias", "frequency_penalty", "presence_penalty", "stop"): + responses_payload.pop(unsupported_key, None) + + # Convert Chat Completions tools format to Responses API format + # Chat Completions: {"type": "function", "function": {"name": ..., "description": ..., "parameters": ...}} + # Responses API: {"type": "function", "name": ..., "description": ..., "parameters": ...} + if "tools" in responses_payload and isinstance(responses_payload["tools"], list): + converted_tools = [] + for tool in responses_payload["tools"]: + if isinstance(tool, dict) and "function" in tool: + func = tool["function"] + converted_tool = {"type": tool.get("type", "function")} + if isinstance(func, dict): + converted_tool["name"] = func.get("name", "") + if "description" in func: + converted_tool["description"] = func["description"] + if "parameters" in func: + converted_tool["parameters"] = func["parameters"] + if "strict" in func: + converted_tool["strict"] = func["strict"] + converted_tools.append(converted_tool) + else: + # Already in correct format or unknown format, pass through + converted_tools.append(tool) + responses_payload["tools"] = converted_tools + return responses_payload