From f1053d94c7ef7b8b78682dd73586b65a84d202a1 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 16 Feb 2026 14:08:35 -0600 Subject: [PATCH] refac --- backend/open_webui/utils/middleware.py | 27 +++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 7ab7537de..ec7af7733 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -1932,7 +1932,7 @@ def load_messages_from_db(chat_id: str, message_id: str) -> Optional[list[dict]] return None return [ - {k: v for k, v in msg.items() if k in ("role", "content", "output")} + {k: v for k, v in msg.items() if k in ("role", "content", "output", "files")} for msg in db_messages ] @@ -1982,6 +1982,31 @@ async def process_chat_payload(request, form_data, user, metadata, model): [system_message, *db_messages] if system_message else db_messages ) + # Inject image files into content as image_url parts (mirrors frontend logic) + for message in form_data["messages"]: + image_files = [ + f + for f in message.get("files", []) + if f.get("type") == "image" + or (f.get("content_type") or "").startswith("image/") + ] + if message.get("role") == "user" and image_files: + text_content = message.get("content", "") + if isinstance(text_content, str): + message["content"] = [ + {"type": "text", "text": text_content}, + *[ + { + "type": "image_url", + "image_url": {"url": f["url"]}, + } + for f in image_files + if f.get("url") + ], + ] + # Strip files field — it's been incorporated into content + message.pop("files", None) + # Process messages with OR-aligned output items for clean LLM messages form_data["messages"] = process_messages_with_output(form_data.get("messages", []))