From 206ec3531d20a2ff4aa043c6ef22d8b22b0877f6 Mon Sep 17 00:00:00 2001 From: anishamahuli Date: Thu, 5 Mar 2026 12:16:35 -0500 Subject: [PATCH] Wire normalize_facts into sync and async fact extraction paths After parsing LLM JSON response, normalize facts before passing them to the embedding model. Fixes 'list'/'dict' object has no attribute 'replace' when smaller LLMs return malformed fact objects. --- mem0/memory/main.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mem0/memory/main.py b/mem0/memory/main.py index 99bc0b1e5..9a6d57ea3 100644 --- a/mem0/memory/main.py +++ b/mem0/memory/main.py @@ -28,6 +28,7 @@ from mem0.memory.telemetry import capture_event from mem0.memory.utils import ( extract_json, get_fact_retrieval_messages, + normalize_facts, parse_messages, parse_vision_messages, process_telemetry_filters, @@ -37,8 +38,8 @@ from mem0.utils.factory import ( EmbedderFactory, GraphStoreFactory, LlmFactory, - VectorStoreFactory, RerankerFactory, + VectorStoreFactory, ) # Suppress SWIG deprecation warnings globally @@ -451,6 +452,7 @@ class Memory(MemoryBase): # Try extracting JSON from response using built-in function extracted_json = extract_json(response) new_retrieved_facts = json.loads(extracted_json)["facts"] + new_retrieved_facts = normalize_facts(new_retrieved_facts) except Exception as e: logger.error(f"Error in new_retrieved_facts: {e}") new_retrieved_facts = [] @@ -1477,6 +1479,7 @@ class AsyncMemory(MemoryBase): # Try extracting JSON from response using built-in function extracted_json = extract_json(response) new_retrieved_facts = json.loads(extracted_json)["facts"] + new_retrieved_facts = normalize_facts(new_retrieved_facts) except Exception as e: logger.error(f"Error in new_retrieved_facts: {e}") new_retrieved_facts = []