Просмотр исходного кода

refac/fix: open webui params handling

Timothy Jaeryang Baek 8 месяцев назад
Родитель
Сommit
d43bbcae28

+ 7 - 2
backend/open_webui/functions.py

@@ -253,8 +253,13 @@ async def generate_function_chat_completion(
             form_data["model"] = model_info.base_model_id
 
         params = model_info.params.model_dump()
-        form_data = apply_model_params_to_body_openai(params, form_data)
-        form_data = apply_model_system_prompt_to_body(params, form_data, metadata, user)
+
+        if params:
+            system = params.pop("system", None)
+            form_data = apply_model_params_to_body_openai(params, form_data)
+            form_data = apply_model_system_prompt_to_body(
+                system, form_data, metadata, user
+            )
 
     pipe_id = get_pipe_id(form_data)
     function_module = get_function_module_by_id(request, pipe_id)

+ 6 - 2
backend/open_webui/routers/ollama.py

@@ -1289,7 +1289,9 @@ async def generate_chat_completion(
             payload["options"] = apply_model_params_to_body_ollama(
                 params, payload["options"]
             )
-            payload = apply_model_system_prompt_to_body(params, payload, metadata, user)
+            payload = apply_model_system_prompt_to_body(
+                params.get("system"), payload, metadata, user
+            )
 
         # Check if user has access to the model
         if not bypass_filter and user.role == "user":
@@ -1471,8 +1473,10 @@ async def generate_openai_chat_completion(
         params = model_info.params.model_dump()
 
         if params:
+            system = params.pop("system", None)
+
             payload = apply_model_params_to_body_openai(params, payload)
-            payload = apply_model_system_prompt_to_body(params, payload, metadata, user)
+            payload = apply_model_system_prompt_to_body(system, payload, metadata, user)
 
         # Check if user has access to the model
         if user.role == "user":

+ 6 - 2
backend/open_webui/routers/openai.py

@@ -715,8 +715,12 @@ async def generate_chat_completion(
             model_id = model_info.base_model_id
 
         params = model_info.params.model_dump()
-        payload = apply_model_params_to_body_openai(params, payload)
-        payload = apply_model_system_prompt_to_body(params, payload, metadata, user)
+
+        if params:
+            system = params.pop("system", None)
+
+            payload = apply_model_params_to_body_openai(params, payload)
+            payload = apply_model_system_prompt_to_body(system, payload, metadata, user)
 
         # Check if user has access to the model
         if not bypass_filter and user.role == "user":

+ 10 - 0
backend/open_webui/utils/middleware.py

@@ -660,6 +660,16 @@ def apply_params_to_form_data(form_data, model):
     params = form_data.pop("params", {})
     custom_params = params.pop("custom_params", {})
 
+    open_webui_params = {
+        "stream_response": bool,
+        "function_calling": str,
+        "system": str,
+    }
+
+    for key in list(params.keys()):
+        if key in open_webui_params:
+            del params[key]
+
     if custom_params:
         # If custom_params are provided, merge them into params
         params = deep_update(params, custom_params)

+ 28 - 2
backend/open_webui/utils/payload.py

@@ -10,9 +10,8 @@ import json
 
 # inplace function: form_data is modified
 def apply_model_system_prompt_to_body(
-    params: dict, form_data: dict, metadata: Optional[dict] = None, user=None
+    system: Optional[str], form_data: dict, metadata: Optional[dict] = None, user=None
 ) -> dict:
-    system = params.get("system", None)
     if not system:
         return form_data
 
@@ -58,8 +57,33 @@ def apply_model_params_to_body(
     return form_data
 
 
+def remove_open_webui_params(params: dict) -> dict:
+    """
+    Removes OpenWebUI specific parameters from the provided dictionary.
+
+    Args:
+        params (dict): The dictionary containing parameters.
+
+    Returns:
+        dict: The modified dictionary with OpenWebUI parameters removed.
+    """
+    open_webui_params = {
+        "stream_response": bool,
+        "function_calling": str,
+        "system": str,
+    }
+
+    for key in list(params.keys()):
+        if key in open_webui_params:
+            del params[key]
+
+    return params
+
+
 # inplace function: form_data is modified
 def apply_model_params_to_body_openai(params: dict, form_data: dict) -> dict:
+    params = remove_open_webui_params(params)
+
     custom_params = params.pop("custom_params", {})
     if custom_params:
         # If there are custom parameters, we need to apply them first
@@ -82,6 +106,8 @@ def apply_model_params_to_body_openai(params: dict, form_data: dict) -> dict:
 
 
 def apply_model_params_to_body_ollama(params: dict, form_data: dict) -> dict:
+    params = remove_open_webui_params(params)
+
     custom_params = params.pop("custom_params", {})
     if custom_params:
         # If there are custom parameters, we need to apply them first