diff --git a/backend/open_webui/utils/chat.py b/backend/open_webui/utils/chat.py index 5d5f6f60c4..c97985dde4 100644 --- a/backend/open_webui/utils/chat.py +++ b/backend/open_webui/utils/chat.py @@ -33,7 +33,7 @@ from open_webui.utils.filter import ( ) from open_webui.utils.json_codec import JSONCodec from open_webui.utils.models import check_model_access, get_all_models -from open_webui.utils.payload import convert_payload_openai_to_ollama +from open_webui.utils.payload import apply_system_prompt_to_body, convert_payload_openai_to_ollama from open_webui.utils.response import ( convert_response_ollama_to_openai, convert_streaming_response_ollama_to_openai, @@ -281,6 +281,14 @@ async def generate_chat_completion( # Below does not require bypass_filter because this is the only route the uses this function and it is already bypassing the filter return await generate_function_chat_completion(request, form_data, user=user, models=models) if model.get('owned_by') == 'ollama': + # Apply before Ollama conversion so tool follow-ups keep the model system prompt + if not bypass_system_prompt: + model_info = await Models.get_model_by_id(form_data['model']) + if model_info: + system = model_info.params.model_dump().get('system') + form_data = await apply_system_prompt_to_body(system, form_data, metadata, user) + request.state.bypass_system_prompt = True + # Using /ollama/api/chat endpoint form_data = convert_payload_openai_to_ollama(form_data) response = await generate_ollama_chat_completion(