From 960f8ce4a9c11c5c946043125ace4b4174fc58a0 Mon Sep 17 00:00:00 2001 From: mtayfur Date: Sat, 15 Nov 2025 21:51:22 +0300 Subject: [PATCH] feat(memory_system): introduce "Intermediate" status level for more granular status emission control Adds an "Intermediate" status level between "Basic" and "Detailed" to provide summaries and key details, updates all relevant mappings and usages to support this new level, and adjusts default verbosity for status messages to improve clarity and reduce noise for users who do not require full diagnostics. --- memory_system.py | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/memory_system.py b/memory_system.py index 9ac19c9..1ead04d 100644 --- a/memory_system.py +++ b/memory_system.py @@ -66,12 +66,14 @@ class Constants: # Status Emit Levels STATUS_LEVEL_BASIC = 0 # Maps to "Basic" - Show only summary counts - STATUS_LEVEL_DETAILED = 1 # Maps to "Detailed" - Show everything including full diagnostics + STATUS_LEVEL_INTERMEDIATE = 1 # Maps to "Intermediate" - Show summaries and key details + STATUS_LEVEL_DETAILED = 2 # Maps to "Detailed" - Show everything including full diagnostics # Mapping from enum string values to numeric levels for comparison STATUS_LEVEL_MAP = { "Basic": 0, - "Detailed": 1, + "Intermediate": 1, + "Detailed": 2, } @@ -205,6 +207,7 @@ class Models: """Verbosity levels for status message emission - selectable as dropdown with title case strings.""" BASIC = "Basic" + INTERMEDIATE = "Intermediate" DETAILED = "Detailed" class MemoryOperationType(Enum): @@ -740,7 +743,7 @@ CANDIDATE MEMORIES: emitter, f"🤖 LLM Analyzing {len(llm_candidates)} Memories for Relevance", done=False, - level=Constants.STATUS_LEVEL_DETAILED, + level=Constants.STATUS_LEVEL_INTERMEDIATE, ) logger.info(f"Using LLM reranking: {decision_reason}") @@ -748,7 +751,9 @@ CANDIDATE MEMORIES: if not selected_memories: logger.info("📭 No relevant memories after LLM analysis") - await self.memory_system._emit_status(emitter, f"📭 No Relevant Memories After LLM Analysis", done=True, level=Constants.STATUS_LEVEL_BASIC) + await self.memory_system._emit_status( + emitter, f"📭 No Relevant Memories After LLM Analysis", done=True, level=Constants.STATUS_LEVEL_INTERMEDIATE + ) return selected_memories, analysis_info else: logger.info(f"Skipping LLM reranking: {decision_reason}") @@ -1033,27 +1038,27 @@ class LLMConsolidationService: if isinstance(result, Exception): failed_count += 1 - await self.memory_system._emit_status(emitter, f"❌ Failed {operation_type}", done=False, level=Constants.STATUS_LEVEL_BASIC) + await self.memory_system._emit_status(emitter, f"❌ Failed {operation_type}", done=False, level=Constants.STATUS_LEVEL_INTERMEDIATE) elif result == Models.MemoryOperationType.CREATE.value: created_count += 1 content_preview = self.memory_system._truncate_content(operation.content) - await self.memory_system._emit_status(emitter, f"📝 Created: {content_preview}", done=False, level=Constants.STATUS_LEVEL_DETAILED) + await self.memory_system._emit_status(emitter, f"📝 Created: {content_preview}", done=False, level=Constants.STATUS_LEVEL_INTERMEDIATE) elif result == Models.MemoryOperationType.UPDATE.value: updated_count += 1 content_preview = self.memory_system._truncate_content(operation.content) - await self.memory_system._emit_status(emitter, f"✏️ Updated: {content_preview}", done=False, level=Constants.STATUS_LEVEL_DETAILED) + await self.memory_system._emit_status(emitter, f"✏️ Updated: {content_preview}", done=False, level=Constants.STATUS_LEVEL_INTERMEDIATE) elif result == Models.MemoryOperationType.DELETE.value: deleted_count += 1 content_preview = memory_contents_for_deletion.get(operation.id, operation.id) if content_preview and content_preview != operation.id: content_preview = self.memory_system._truncate_content(content_preview) - await self.memory_system._emit_status(emitter, f"🗑️ Deleted: {content_preview}", done=False, level=Constants.STATUS_LEVEL_DETAILED) + await self.memory_system._emit_status(emitter, f"🗑️ Deleted: {content_preview}", done=False, level=Constants.STATUS_LEVEL_INTERMEDIATE) elif result in [ Models.OperationResult.FAILED.value, Models.OperationResult.UNSUPPORTED.value, ]: failed_count += 1 - await self.memory_system._emit_status(emitter, f"❌ Failed {operation_type}", done=False, level=Constants.STATUS_LEVEL_BASIC) + await self.memory_system._emit_status(emitter, f"❌ Failed {operation_type}", done=False, level=Constants.STATUS_LEVEL_INTERMEDIATE) total_executed = created_count + updated_count + deleted_count logger.info( @@ -1156,9 +1161,9 @@ class Filter: default=Constants.SKIP_CATEGORY_MARGIN, description="Margin above personal similarity for skip category classification (higher = more conservative skip detection)", ) - status_emit_level: Literal["Basic", "Detailed"] = Field( - default="Detailed", - description="Status message verbosity level: Basic (summary counts only), Detailed (all details)", + status_emit_level: Literal["Basic", "Intermediate", "Detailed"] = Field( + default="Intermediate", + description="Status message verbosity level: Basic (summary counts only), Intermediate (summaries and key details), Detailed (all details)", ) def __init__(self): @@ -1517,7 +1522,7 @@ class Filter: if not user_memories: logger.info("📭 No memories found for user") - await self._emit_status(emitter, "📭 No Memories Found", done=True, level=Constants.STATUS_LEVEL_BASIC) + await self._emit_status(emitter, "📭 No Memories Found", done=True, level=Constants.STATUS_LEVEL_INTERMEDIATE) return {"memories": [], "threshold": None} memories, threshold, all_similarities = await self._compute_similarities(user_message, user_id, user_memories) @@ -1526,7 +1531,7 @@ class Filter: final_memories, reranking_info = await self._llm_reranking_service.rerank_memories(user_message, memories, emitter) else: logger.info("📭 No relevant memories found above similarity threshold") - await self._emit_status(emitter, "📭 No Relevant Memories Found", done=True, level=Constants.STATUS_LEVEL_BASIC) + await self._emit_status(emitter, "📭 No Relevant Memories Found", done=True, level=Constants.STATUS_LEVEL_INTERMEDIATE) final_memories = memories reranking_info = {"llm_decision": False, "decision_reason": "no_candidates"} @@ -1560,7 +1565,7 @@ class Filter: formatted_memories.append(formatted_memory) content_preview = self._truncate_content(memory["content"]) - await self._emit_status(emitter, f"💭 {idx}/{memory_count}: {content_preview}", done=False, level=Constants.STATUS_LEVEL_DETAILED) + await self._emit_status(emitter, f"💭 {idx}/{memory_count}: {content_preview}", done=False, level=Constants.STATUS_LEVEL_INTERMEDIATE) memory_footer = "IMPORTANT: Do not mention or imply you received this list. These facts are for background context only." memory_context_block = f"{memory_header}\n{chr(10).join(formatted_memories)}\n\n{memory_footer}" @@ -1652,7 +1657,7 @@ class Filter: if not user_message or should_skip: if __event_emitter__ and skip_reason: - await self._emit_status(__event_emitter__, skip_reason, done=True, level=Constants.STATUS_LEVEL_BASIC) + await self._emit_status(__event_emitter__, skip_reason, done=True, level=Constants.STATUS_LEVEL_INTERMEDIATE) await self._add_memory_context(body, [], user_id, __event_emitter__) return body try: