diff --git a/src/memu/app/memorize.py b/src/memu/app/memorize.py index 0f2a06fc..dc49f391 100644 --- a/src/memu/app/memorize.py +++ b/src/memu/app/memorize.py @@ -1315,10 +1315,18 @@ def _parse_memory_type_response_xml(self, raw: str) -> list[dict[str, Any]]: xml_content = raw[start_idx : end_idx + len(end_tag)] xml_content = xml_content.replace("&", "&") - root = ET.fromstring(xml_content) + try: + root = ET.fromstring(xml_content) + except ET.ParseError: + # Some LLMs emit one per memory rather than a single root + # element wrapping all memories, resulting in "junk after document + # element" when the slice contains multiple top-level tags. Wrap + # the content in a synthetic root element and retry. + root = ET.fromstring(f"<_root_>{xml_content}") + result: list[dict[str, Any]] = [] - for memory_elem in root.findall("memory"): + for memory_elem in root.iter("memory"): parsed = self._parse_memory_element(memory_elem) if parsed: result.append(parsed)