From 583f5a66d2ba3def4e47374654abbd22d051ef2a Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sat, 26 Sep 2026 05:18:43 +0200 Subject: [PATCH] fix: max_tokens sent through the API is ignored for Ollama models (#31437) When an API request to an Ollama model set max_tokens, Open WebUI passed it on in a place Ollama does not read, so Ollama ignored it and replies ran to full length. The limit now reaches Ollama as its own output length setting, so replies stop at the requested length. It also wins over a max_tokens value saved in the model's advanced parameters, as the API docs describe. Chats in the web UI were not affected, since their limit already reached Ollama correctly. Fixes #31432 --- 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 7ee2f9d3b3..94a9bc4769 100644 --- a/backend/open_webui/utils/payload.py +++ b/backend/open_webui/utils/payload.py @@ -379,10 +379,6 @@ def convert_payload_openai_to_ollama(openai_payload: dict) -> dict: if 'tools' in openai_payload: ollama_payload['tools'] = openai_payload['tools'] - if 'max_tokens' in openai_payload: - ollama_payload['num_predict'] = openai_payload['max_tokens'] - del openai_payload['max_tokens'] - # If there are advanced parameters in the payload, format them in Ollama's options field if openai_payload.get('options'): # Copied before key deletions below so the caller's options stay intact @@ -430,6 +426,11 @@ def convert_payload_openai_to_ollama(openai_payload: dict) -> dict: ollama_options['stop'] = openai_payload.get('stop') ollama_payload['options'] = ollama_options + if 'max_tokens' in openai_payload: + ollama_options = ollama_payload.get('options', {}) + ollama_options['num_predict'] = openai_payload['max_tokens'] + ollama_payload['options'] = ollama_options + if 'metadata' in openai_payload: ollama_payload['metadata'] = openai_payload['metadata']