From 5cbf9f3f143ce0d00f94cd4e7de15fdbd259b74e Mon Sep 17 00:00:00 2001 From: "caozouying.czy" Date: Wed, 25 Feb 2026 12:05:16 +0800 Subject: [PATCH] update: resolve JSONDecodeError in task_memory_validation --- reme/workflow/procedural_memory/__init__.py | 2 +- .../summary/memory_addition.py | 12 ++++++++---- .../summary/memory_deduplication.py | 2 +- .../summary/memory_validation.py | 18 +++++++++++++++--- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/reme/workflow/procedural_memory/__init__.py b/reme/workflow/procedural_memory/__init__.py index 5f901ce0..23832f5c 100644 --- a/reme/workflow/procedural_memory/__init__.py +++ b/reme/workflow/procedural_memory/__init__.py @@ -42,4 +42,4 @@ __all__ = [ for name in __all__: tool_class = globals()[name] - R.op.register()(tool_class) + R.ops.register()(tool_class) diff --git a/reme/workflow/procedural_memory/summary/memory_addition.py b/reme/workflow/procedural_memory/summary/memory_addition.py index 17ece4f1..4d62cb92 100644 --- a/reme/workflow/procedural_memory/summary/memory_addition.py +++ b/reme/workflow/procedural_memory/summary/memory_addition.py @@ -19,11 +19,15 @@ class MemoryAddition(BaseOp): """Execute the memory insertion operation. Inserts new or updated memories into the vector store: - 1. Reads memory_list from response.metadata - 2. Converts MemoryNode objects to VectorNode objects - 3. Inserts them into the vector store + 1. Reads memory_list from context (can be dicts or MemoryNode) + 2. Converts raw items to MemoryNode objects + 3. Converts MemoryNode objects to VectorNode objects + 4. Inserts them into the vector store """ - insert_memory_list: List[MemoryNode] = self.context.memory_list + raw_memory_list = self.context.memory_list + insert_memory_list: List[MemoryNode] = [ + MemoryNode(**x) if isinstance(x, dict) else x for x in raw_memory_list + ] if insert_memory_list: insert_nodes: List[VectorNode] = [x.to_vector_node() for x in insert_memory_list] await self.vector_store.insert(nodes=insert_nodes) diff --git a/reme/workflow/procedural_memory/summary/memory_deduplication.py b/reme/workflow/procedural_memory/summary/memory_deduplication.py index 14bfb5b1..700c00b7 100644 --- a/reme/workflow/procedural_memory/summary/memory_deduplication.py +++ b/reme/workflow/procedural_memory/summary/memory_deduplication.py @@ -56,7 +56,7 @@ class MemoryDeduplication(BaseOp): for task_memory in task_memories: # Generate embedding for current task memory - current_embedding = self._get_task_memory_embedding(task_memory) + current_embedding = await self._get_task_memory_embedding(task_memory) if current_embedding is None: logger.warning(f"Failed to generate embedding for task memory: {str(task_memory.when_to_use)[:50]}...") diff --git a/reme/workflow/procedural_memory/summary/memory_validation.py b/reme/workflow/procedural_memory/summary/memory_validation.py index 07def492..d331a6b1 100644 --- a/reme/workflow/procedural_memory/summary/memory_validation.py +++ b/reme/workflow/procedural_memory/summary/memory_validation.py @@ -81,10 +81,22 @@ class MemoryValidation(BaseOp): json_pattern = r"```json\s*([\s\S]*?)\s*```" json_blocks = re.findall(json_pattern, response_content) + parsed: Dict[str, Any] = {} if json_blocks: - parsed = json.loads(json_blocks[0]) - else: - parsed = {} + raw_json = json_blocks[0] + try: + parsed = json.loads(raw_json) + except json.JSONDecodeError as json_err: + logger.warning( + f"JSONDecodeError in task_memory_validation, fallback to regex parse: {json_err}" + ) + is_valid_match = re.search(r'"is_valid"\s*:\s*(true|false)', raw_json, re.IGNORECASE) + score_match = re.search(r'"score"\s*:\s*([0-9]+(?:\.[0-9]+)?)', raw_json) + + if is_valid_match: + parsed["is_valid"] = is_valid_match.group(1).lower() == "true" + if score_match: + parsed["score"] = float(score_match.group(1)) is_valid = parsed.get("is_valid", True) score = parsed.get("score", 0.5)