From 8f68b255101fb29b36b5da65feb72f96ec8d5fa2 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 10 Jun 2025 12:48:34 +0400 Subject: [PATCH] enh/refac: ollama advanced params --- backend/open_webui/routers/ollama.py | 2 +- backend/open_webui/utils/middleware.py | 7 +- backend/open_webui/utils/payload.py | 66 ++++++--- src/lib/components/chat/Chat.svelte | 3 - .../Settings/Advanced/AdvancedParams.svelte | 114 ++++++++++++++++ .../components/chat/Settings/General.svelte | 127 +----------------- 6 files changed, 165 insertions(+), 154 deletions(-) diff --git a/backend/open_webui/routers/ollama.py b/backend/open_webui/routers/ollama.py index 95f48fb1c..ba5397ade 100644 --- a/backend/open_webui/routers/ollama.py +++ b/backend/open_webui/routers/ollama.py @@ -1323,7 +1323,7 @@ async def generate_chat_completion( prefix_id = api_config.get("prefix_id", None) if prefix_id: payload["model"] = payload["model"].replace(f"{prefix_id}.", "") - # payload["keep_alive"] = -1 # keep alive forever + return await send_post_request( url=f"{url}/api/chat", payload=json.dumps(payload), diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 77124eabc..52061f5b9 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -698,13 +698,8 @@ def apply_params_to_form_data(form_data, model): params = deep_update(params, custom_params) if model.get("ollama"): + # Ollama specific parameters form_data["options"] = params - - if "format" in params: - form_data["format"] = params["format"] - - if "keep_alive" in params: - form_data["keep_alive"] = params["keep_alive"] else: if isinstance(params, dict): for key, value in params.items(): diff --git a/backend/open_webui/utils/payload.py b/backend/open_webui/utils/payload.py index 8bf705ecf..a31b1a551 100644 --- a/backend/open_webui/utils/payload.py +++ b/backend/open_webui/utils/payload.py @@ -175,14 +175,26 @@ def apply_model_params_to_body_ollama(params: dict, form_data: dict) -> dict: "num_thread": int, } - # Extract keep_alive from options if it exists - if "options" in form_data and "keep_alive" in form_data["options"]: - form_data["keep_alive"] = form_data["options"]["keep_alive"] - del form_data["options"]["keep_alive"] + def parse_json(value: str) -> dict: + """ + Parses a JSON string into a dictionary, handling potential JSONDecodeError. + """ + try: + return json.loads(value) + except Exception as e: + return value - if "options" in form_data and "format" in form_data["options"]: - form_data["format"] = form_data["options"]["format"] - del form_data["options"]["format"] + ollama_root_params = { + "format": lambda x: parse_json(x), + "keep_alive": lambda x: parse_json(x), + "think": bool, + } + + for key, value in ollama_root_params.items(): + if (param := params.get(key, None)) is not None: + # Copy the parameter to new name then delete it, to prevent Ollama warning of invalid option provided + form_data[key] = value(param) + del params[key] return apply_model_params_to_body(params, form_data, mappings) @@ -279,36 +291,46 @@ def convert_payload_openai_to_ollama(openai_payload: dict) -> dict: openai_payload.get("messages") ) ollama_payload["stream"] = openai_payload.get("stream", False) - if "tools" in openai_payload: ollama_payload["tools"] = openai_payload["tools"] - if "format" in openai_payload: - ollama_payload["format"] = openai_payload["format"] - # If there are advanced parameters in the payload, format them in Ollama's options field if openai_payload.get("options"): ollama_payload["options"] = openai_payload["options"] ollama_options = openai_payload["options"] + def parse_json(value: str) -> dict: + """ + Parses a JSON string into a dictionary, handling potential JSONDecodeError. + """ + try: + return json.loads(value) + except Exception as e: + return value + + ollama_root_params = { + "format": lambda x: parse_json(x), + "keep_alive": lambda x: parse_json(x), + "think": bool, + } + + # Ollama's options field can contain parameters that should be at the root level. + for key, value in ollama_root_params.items(): + if (param := ollama_options.get(key, None)) is not None: + # Copy the parameter to new name then delete it, to prevent Ollama warning of invalid option provided + ollama_payload[key] = value(param) + del ollama_options[key] + # 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"] # Ollama lacks a "system" prompt option. It has to be provided as a direct parameter, so we copy it down. + # Comment: Not sure why this is needed, but we'll keep it for compatibility. if "system" in ollama_options: ollama_payload["system"] = ollama_options["system"] - del ollama_options[ - "system" - ] # To prevent Ollama warning of invalid option provided - - # Extract keep_alive from options if it exists - if "keep_alive" in ollama_options: - ollama_payload["keep_alive"] = ollama_options["keep_alive"] - del ollama_options["keep_alive"] + del ollama_options["system"] # If there is the "stop" parameter in the openai_payload, remap it to the ollama_payload.options if "stop" in openai_payload: diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 6011ba0b7..89fa81462 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -1642,9 +1642,6 @@ params: { ...$settings?.params, ...params, - - format: $settings.requestFormat ?? undefined, - keep_alive: $settings.keepAlive ?? undefined, stop: (params?.stop ?? $settings?.params?.stop ?? undefined) ? (params?.stop.split(',').map((token) => token.trim()) ?? $settings.params.stop).map( diff --git a/src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte b/src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte index 30ae4fbd7..cdcb51738 100644 --- a/src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte +++ b/src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte @@ -1,5 +1,6 @@