This commit is contained in:
Timothy Jaeryang Baek
2026-08-24 18:35:04 -04:00
parent b96d2b12da
commit 536b9edec0
2 changed files with 36 additions and 23 deletions
+25
View File
@@ -6,6 +6,7 @@ import logging
import re
import time
import uuid
from typing import Literal
# local imports
from open_webui.env import ENABLE_ADMIN_CHAT_ACCESS
@@ -1070,6 +1071,30 @@ class ChatTable:
return chat.chat.get('history', {}).get('messages', {}).get(message_id, {})
async def get_message_metadata_list(
self,
chat_id: str,
message_id: str,
metadata_key: Literal['files', 'sources', 'embeds'],
) -> list[dict]:
"""Read one list-valued message field without rebuilding the whole history."""
async with get_async_db_context() as db:
# Read the column directly; some stored rows cannot be validated as full ChatMessageModel objects.
result = await db.execute(
select(getattr(ChatMessage, metadata_key)).where(ChatMessage.id == f'{chat_id}-{message_id}')
)
metadata_row = result.first()
if metadata_row is not None:
return metadata_row[0] or []
chat = await self.get_chat_by_id(chat_id)
if chat is None:
return []
message = chat.chat.get('history', {}).get('messages', {}).get(message_id, {})
return message.get(metadata_key) or []
async def upsert_message_to_chat_by_id_and_message_id(
self, id: str, message_id: str, message: dict, *, touch: bool = True
) -> ChatModel | None: