From a560f789e4b99bf2505bfb154e3c40899e4114c6 Mon Sep 17 00:00:00 2001 From: ferret99gt Date: Wed, 19 Feb 2025 08:31:57 -0500 Subject: [PATCH 1/7] Remove mapping of presence_penalty to new_topix_penalty 1) Ollama natively supports presence_penalty. 2) new_topic_penalty is not a valid option in Ollama. (See https://github.com/ollama/ollama/blob/main/docs/api.md#request-8) 3) Presence_penalty was added to Open Webui in PR #10016 and is not merged to main yet at this time. --- backend/open_webui/utils/payload.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/backend/open_webui/utils/payload.py b/backend/open_webui/utils/payload.py index 5eb040434..633f77ff2 100644 --- a/backend/open_webui/utils/payload.py +++ b/backend/open_webui/utils/payload.py @@ -194,10 +194,6 @@ def convert_payload_openai_to_ollama(openai_payload: dict) -> dict: if "frequency_penalty" in openai_payload: ollama_options["repeat_penalty"] = openai_payload["frequency_penalty"] - if "presence_penalty" in openai_payload and "penalty" not in ollama_options: - # We are assuming presence penalty uses a similar concept in Ollama, which needs custom handling if exists. - ollama_options["new_topic_penalty"] = openai_payload["presence_penalty"] - # Add options to payload if any have been set if ollama_options: ollama_payload["options"] = ollama_options From e6919c324234c60d6841b66935df9637ee94ed75 Mon Sep 17 00:00:00 2001 From: ferret99gt Date: Wed, 19 Feb 2025 08:33:29 -0500 Subject: [PATCH 2/7] Remove mapping of frequency_penalty to repeat_penalty 1) Ollama natively supports frequency_penalty. 2) repeat_penaltywas added to Open Webui in PR #10016 and is not merged to main yet at this time. Once both changes go live, Ollama users can freely choose between frequency/presence penalty, or repeat penalty, as they choose. --- backend/open_webui/utils/payload.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/backend/open_webui/utils/payload.py b/backend/open_webui/utils/payload.py index 633f77ff2..1d5b55dfc 100644 --- a/backend/open_webui/utils/payload.py +++ b/backend/open_webui/utils/payload.py @@ -190,10 +190,6 @@ def convert_payload_openai_to_ollama(openai_payload: dict) -> dict: elif "max_tokens" in openai_payload: ollama_options["num_predict"] = openai_payload["max_tokens"] - # Handle frequency / presence_penalty, which needs renaming and checking - if "frequency_penalty" in openai_payload: - ollama_options["repeat_penalty"] = openai_payload["frequency_penalty"] - # Add options to payload if any have been set if ollama_options: ollama_payload["options"] = ollama_options From aea8977d050edd77842f61b3cf7ad0b1f699f3d7 Mon Sep 17 00:00:00 2001 From: ferret99gt Date: Wed, 19 Feb 2025 08:39:33 -0500 Subject: [PATCH 3/7] Remove mapping of max_completion_tokens 1) max_completion_tokens is being looked for in openai_payload, but would be located in openai_payload['options'], so is never found. (This applies to the prior two commits as well). 2) max_completion_tokens is not sent from the frontend, only max_tokens. It does not appear in AdvancedParams.svelte. 2b) Openai.py does use max_completion_tokens, but for o1,o3 models and converts it from max_tokens. --- backend/open_webui/utils/payload.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/backend/open_webui/utils/payload.py b/backend/open_webui/utils/payload.py index 1d5b55dfc..5dc0c4b52 100644 --- a/backend/open_webui/utils/payload.py +++ b/backend/open_webui/utils/payload.py @@ -185,9 +185,7 @@ def convert_payload_openai_to_ollama(openai_payload: dict) -> dict: ollama_options[param] = openai_payload[param] # Mapping OpenAI's `max_tokens` -> Ollama's `num_predict` - if "max_completion_tokens" in openai_payload: - ollama_options["num_predict"] = openai_payload["max_completion_tokens"] - elif "max_tokens" in openai_payload: + if "max_tokens" in openai_payload: ollama_options["num_predict"] = openai_payload["max_tokens"] # Add options to payload if any have been set From adde37394b2788fb1f33a2b6f8efc674a6938ed0 Mon Sep 17 00:00:00 2001 From: ferret99gt Date: Wed, 19 Feb 2025 08:44:59 -0500 Subject: [PATCH 4/7] Remove parameters that map directly, as they are part of options 1) This may be legacy code? 2) All three of these parameters, temperature, top_p and seed, are found in openai_payload["options"], not openai_payload. They do not need remapped any longer. --- backend/open_webui/utils/payload.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/backend/open_webui/utils/payload.py b/backend/open_webui/utils/payload.py index 5dc0c4b52..4e15e7025 100644 --- a/backend/open_webui/utils/payload.py +++ b/backend/open_webui/utils/payload.py @@ -179,11 +179,6 @@ def convert_payload_openai_to_ollama(openai_payload: dict) -> dict: ollama_payload["options"] = openai_payload["options"] ollama_options = openai_payload["options"] - # Handle parameters which map directly - for param in ["temperature", "top_p", "seed"]: - if param in openai_payload: - ollama_options[param] = openai_payload[param] - # Mapping OpenAI's `max_tokens` -> Ollama's `num_predict` if "max_tokens" in openai_payload: ollama_options["num_predict"] = openai_payload["max_tokens"] From fea169a9c00d1a72e7e124bd55ba9063df415777 Mon Sep 17 00:00:00 2001 From: ferret99gt Date: Wed, 19 Feb 2025 08:52:34 -0500 Subject: [PATCH 5/7] Core fix for num_predict not working. 1) max_tokens was being looked for in openai_payload, but is present in openai_payload['options'], so is never found. 2) After copying the value for max_tokens to num_predict, delete max_tokens from the dictionary. This is to prevent Ollama throwing a warning about invalid option (max_tokens) --- backend/open_webui/utils/payload.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/backend/open_webui/utils/payload.py b/backend/open_webui/utils/payload.py index 4e15e7025..8d0a27f2b 100644 --- a/backend/open_webui/utils/payload.py +++ b/backend/open_webui/utils/payload.py @@ -178,10 +178,11 @@ def convert_payload_openai_to_ollama(openai_payload: dict) -> dict: if openai_payload.get("options"): ollama_payload["options"] = openai_payload["options"] ollama_options = openai_payload["options"] - - # Mapping OpenAI's `max_tokens` -> Ollama's `num_predict` - if "max_tokens" in openai_payload: - ollama_options["num_predict"] = openai_payload["max_tokens"] + + # Re-Mapping OpenAI's `max_tokens` -> Ollama's `num_predict` + if "max_tokens" in ollama_options: + ollama_options["num_predict"] = ollama_options["max_tokens"] + del ollama_options["max_tokens"] # To prevent Ollama warning of invalid option provided # Add options to payload if any have been set if ollama_options: From 57b01cf8fbbdd4a86f62ea909ca3cfe74f9c3714 Mon Sep 17 00:00:00 2001 From: ferret99gt Date: Wed, 19 Feb 2025 08:55:11 -0500 Subject: [PATCH 6/7] Fix for system prompt setting 1) Ollama supports sending the system prompt as a parameter, not as an option. (See https://github.com/ollama/ollama/blob/main/docs/api.md#request-8) However, it is in the options dictionary and needs moved to the payload dictionary. 2) After moving the system parameter from ollama_options to ollama_payload, delete it from ollama_options. This is to prevent Ollama throwing a warning about invalid options. --- backend/open_webui/utils/payload.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/utils/payload.py b/backend/open_webui/utils/payload.py index 8d0a27f2b..e1f62a93b 100644 --- a/backend/open_webui/utils/payload.py +++ b/backend/open_webui/utils/payload.py @@ -182,7 +182,12 @@ def convert_payload_openai_to_ollama(openai_payload: dict) -> dict: # Re-Mapping OpenAI's `max_tokens` -> Ollama's `num_predict` if "max_tokens" in ollama_options: ollama_options["num_predict"] = ollama_options["max_tokens"] - del ollama_options["max_tokens"] # To prevent Ollama warning of invalid option provided + del ollama_options["max_tokens"] # To prevent Ollama warning of invalid option provided + + # Ollama lacks a "system" prompt option. It has to be provided as a direct parameter, so we copy it down. + if "system" in ollama_options: + ollama_payload["system"] = ollama_options["system"] + del ollama_options["system"] # To prevent Ollama warning of invalid option provided # Add options to payload if any have been set if ollama_options: From 8125b0499b1d7c4b1860674320ceb91dcdfba744 Mon Sep 17 00:00:00 2001 From: ferret99gt Date: Wed, 19 Feb 2025 08:57:05 -0500 Subject: [PATCH 7/7] Remove empty ollama_options 1) The empty dictionary from line 176 is never used. 2) Lines 193-194 are not necessary as they were already done at line 177 --- backend/open_webui/utils/payload.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/backend/open_webui/utils/payload.py b/backend/open_webui/utils/payload.py index e1f62a93b..2554db30b 100644 --- a/backend/open_webui/utils/payload.py +++ b/backend/open_webui/utils/payload.py @@ -173,8 +173,6 @@ def convert_payload_openai_to_ollama(openai_payload: dict) -> dict: ollama_payload["format"] = openai_payload["format"] # If there are advanced parameters in the payload, format them in Ollama's options field - ollama_options = {} - if openai_payload.get("options"): ollama_payload["options"] = openai_payload["options"] ollama_options = openai_payload["options"] @@ -189,10 +187,6 @@ def convert_payload_openai_to_ollama(openai_payload: dict) -> dict: ollama_payload["system"] = ollama_options["system"] del ollama_options["system"] # To prevent Ollama warning of invalid option provided - # Add options to payload if any have been set - if ollama_options: - ollama_payload["options"] = ollama_options - if "metadata" in openai_payload: ollama_payload["metadata"] = openai_payload["metadata"]