diff --git a/backend/open_webui/functions.py b/backend/open_webui/functions.py index 6d8203839..20fabb2dc 100644 --- a/backend/open_webui/functions.py +++ b/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) diff --git a/backend/open_webui/routers/ollama.py b/backend/open_webui/routers/ollama.py index 1410831d7..2dd566f2a 100644 --- a/backend/open_webui/routers/ollama.py +++ b/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": diff --git a/backend/open_webui/routers/openai.py b/backend/open_webui/routers/openai.py index 96c21f9c0..9c3c39367 100644 --- a/backend/open_webui/routers/openai.py +++ b/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": diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index d3ea27299..564d5666e 100644 --- a/backend/open_webui/utils/middleware.py +++ b/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) diff --git a/backend/open_webui/utils/payload.py b/backend/open_webui/utils/payload.py index bff819580..166b6b4a6 100644 --- a/backend/open_webui/utils/payload.py +++ b/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