From a1fc99c66fc62fcea98cdbef2e23ddbc7a7465b5 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 2 Oct 2025 02:57:54 -0500 Subject: [PATCH] refac/fix: system prompt duplication --- backend/open_webui/utils/middleware.py | 2 +- backend/open_webui/utils/misc.py | 8 ++++++++ backend/open_webui/utils/payload.py | 19 +++++++++++++++---- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 377ba54dc3..1ae340ae7b 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -1004,7 +1004,7 @@ async def process_chat_payload(request, form_data, user, metadata, model): if system_message: try: form_data = apply_system_prompt_to_body( - system_message.get("content"), form_data, metadata, user + system_message.get("content"), form_data, metadata, user, replace=True ) except: pass diff --git a/backend/open_webui/utils/misc.py b/backend/open_webui/utils/misc.py index 81a4142ea0..8977cf17d4 100644 --- a/backend/open_webui/utils/misc.py +++ b/backend/open_webui/utils/misc.py @@ -136,6 +136,14 @@ def update_message_content(message: dict, content: str, append: bool = True) -> return message +def replace_system_message_content(content: str, messages: list[dict]) -> dict: + for message in messages: + if message["role"] == "system": + message["content"] = content + break + return messages + + def add_or_update_system_message( content: str, messages: list[dict], append: bool = False ): diff --git a/backend/open_webui/utils/payload.py b/backend/open_webui/utils/payload.py index 8cb36b3759..4a431dcab3 100644 --- a/backend/open_webui/utils/payload.py +++ b/backend/open_webui/utils/payload.py @@ -2,6 +2,7 @@ from open_webui.utils.task import prompt_template, prompt_variables_template from open_webui.utils.misc import ( deep_update, add_or_update_system_message, + replace_system_message_content, ) from typing import Callable, Optional @@ -10,7 +11,11 @@ import json # inplace function: form_data is modified def apply_system_prompt_to_body( - system: Optional[str], form_data: dict, metadata: Optional[dict] = None, user=None + system: Optional[str], + form_data: dict, + metadata: Optional[dict] = None, + user=None, + replace: bool = False, ) -> dict: if not system: return form_data @@ -24,9 +29,15 @@ def apply_system_prompt_to_body( # Legacy (API Usage) system = prompt_template(system, user) - form_data["messages"] = add_or_update_system_message( - system, form_data.get("messages", []) - ) + if replace: + form_data["messages"] = replace_system_message_content( + system, form_data.get("messages", []) + ) + else: + form_data["messages"] = add_or_update_system_message( + system, form_data.get("messages", []) + ) + return form_data