From 964b75d4b7162104d178598de2b336188f8f8414 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Mon, 15 Jun 2026 22:57:21 +0200 Subject: [PATCH] Refactor chat memory logic to use sources_json for source validation and candidate loading --- backend/chat_memory.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/backend/chat_memory.py b/backend/chat_memory.py index e6f4ddf..e1f04c9 100644 --- a/backend/chat_memory.py +++ b/backend/chat_memory.py @@ -124,9 +124,9 @@ def _attachment_summary(raw_value: Any) -> str: return ", ".join(labels[:8]) -def _is_memory_only_response(row: models.ChatMessage) -> bool: +def _is_memory_only_source_value(raw_value: Any) -> bool: try: - sources = json.loads(getattr(row, "sources_json", None) or "[]") + sources = json.loads(raw_value or "[]") except Exception: return False if not isinstance(sources, list) or not sources: @@ -137,6 +137,10 @@ def _is_memory_only_response(row: models.ChatMessage) -> bool: return True +def _is_memory_only_response(row: models.ChatMessage) -> bool: + return _is_memory_only_source_value(getattr(row, "sources_json", None)) + + def _completed_turns(session: models.ChatSession, rows: Sequence[models.ChatMessage]) -> List[Dict[str, Any]]: turns: List[Dict[str, Any]] = [] pending_user: Optional[models.ChatMessage] = None @@ -499,7 +503,7 @@ def _load_live_candidates( SELECT s.session_id, s.name AS session_name, m.id AS message_row_id, m.message_id, m.role, m.content, - m.attachments_json, m.created_at + m.sources_json, m.attachments_json, m.created_at FROM chat_messages m JOIN chat_sessions s ON s.id = m.session_pk WHERE (:exclude_session_id IS NULL OR s.session_id != :exclude_session_id) @@ -523,6 +527,9 @@ def _load_live_candidates( continue if item.get("role") != "assistant" or session_id not in pending_by_session: continue + if _is_memory_only_source_value(item.get("sources_json")): + pending_by_session.pop(session_id, None) + continue user = pending_by_session.pop(session_id) user_content = _clean_content(user.get("content")) assistant_content = _clean_content(item.get("content"))