From e148cfd16b181b5175f35c2ececfc20e1544fe5c Mon Sep 17 00:00:00 2001 From: Windpicker-owo <3431391539@qq.com> Date: Mon, 8 Dec 2025 17:30:11 +0800 Subject: [PATCH] =?UTF-8?q?feat(memory):=20=E4=BD=BF=E7=94=A8=E5=BC=82?= =?UTF-8?q?=E6=AD=A5=E5=88=9D=E5=A7=8B=E5=8C=96=E7=A1=AE=E4=BF=9D=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E8=AE=B0=E5=BF=86=E7=AE=A1=E7=90=86=E5=99=A8=E5=B7=B2?= =?UTF-8?q?=E5=87=86=E5=A4=87=E5=B0=B1=E7=BB=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/chat/replyer/default_generator.py | 8 ++++--- .../data_models/message_manager_data_model.py | 6 +++-- src/memory_graph/manager_singleton.py | 23 +++++++++++++++++++ .../kokoro_flow_chatter/context_builder.py | 8 ++++--- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/chat/replyer/default_generator.py b/src/chat/replyer/default_generator.py index ceef9e898..d7b22ecd3 100644 --- a/src/chat/replyer/default_generator.py +++ b/src/chat/replyer/default_generator.py @@ -598,12 +598,14 @@ class DefaultReplyer: return "" try: - from src.memory_graph.manager_singleton import get_unified_memory_manager + from src.memory_graph.manager_singleton import ( + ensure_unified_memory_manager_initialized, + ) from src.memory_graph.utils.three_tier_formatter import memory_formatter - unified_manager = get_unified_memory_manager() + unified_manager = await ensure_unified_memory_manager_initialized() if not unified_manager: - logger.debug("[三层记忆] 管理器未初始化") + logger.debug("[三层记忆] 管理器初始化失败或未启用") return "" # 目标查询改为使用最近多条消息的组合块 diff --git a/src/common/data_models/message_manager_data_model.py b/src/common/data_models/message_manager_data_model.py index eb39a69fd..cda757cf5 100644 --- a/src/common/data_models/message_manager_data_model.py +++ b/src/common/data_models/message_manager_data_model.py @@ -152,10 +152,12 @@ class StreamContext(BaseDataModel): logger.debug(f"消息直接添加到StreamContext未处理列表: stream={self.stream_id}") else: logger.debug(f"消息添加到StreamContext成功: {self.stream_id}") - # ͬ�����ݵ�ͳһ������� + # 同步消息到统一记忆管理器 try: if global_config.memory and global_config.memory.enable: - unified_manager: Any = _get_unified_memory_manager() + from src.memory_graph.manager_singleton import ensure_unified_memory_manager_initialized + + unified_manager: Any = await ensure_unified_memory_manager_initialized() if unified_manager: message_dict = { "message_id": str(message.message_id), diff --git a/src/memory_graph/manager_singleton.py b/src/memory_graph/manager_singleton.py index 98cbd9cd3..59edcb251 100644 --- a/src/memory_graph/manager_singleton.py +++ b/src/memory_graph/manager_singleton.py @@ -6,6 +6,7 @@ from __future__ import annotations +import asyncio from pathlib import Path from src.common.logger import get_logger @@ -19,6 +20,7 @@ _initialized: bool = False # 全局 UnifiedMemoryManager 实例(新的三层记忆系统) _unified_memory_manager = None +_unified_memory_init_lock: asyncio.Lock | None = None # ============================================================================ @@ -194,6 +196,27 @@ def get_unified_memory_manager(): return _unified_memory_manager +async def ensure_unified_memory_manager_initialized(): + """ + 确保统一记忆管理器已初始化。 + + 在首次访问时自动初始化,避免调用方重复判断。 + """ + global _unified_memory_init_lock, _unified_memory_manager + + if _unified_memory_manager is not None: + return _unified_memory_manager + + if _unified_memory_init_lock is None: + _unified_memory_init_lock = asyncio.Lock() + + async with _unified_memory_init_lock: + if _unified_memory_manager is not None: + return _unified_memory_manager + + return await initialize_unified_memory_manager() + + async def shutdown_unified_memory_manager() -> None: """关闭统一记忆管理器""" global _unified_memory_manager diff --git a/src/plugins/built_in/kokoro_flow_chatter/context_builder.py b/src/plugins/built_in/kokoro_flow_chatter/context_builder.py index 605d52cae..f5ca00163 100644 --- a/src/plugins/built_in/kokoro_flow_chatter/context_builder.py +++ b/src/plugins/built_in/kokoro_flow_chatter/context_builder.py @@ -219,12 +219,14 @@ class KFCContextBuilder: return "" try: - from src.memory_graph.manager_singleton import get_unified_memory_manager + from src.memory_graph.manager_singleton import ( + ensure_unified_memory_manager_initialized, + ) from src.memory_graph.utils.three_tier_formatter import memory_formatter - unified_manager = get_unified_memory_manager() + unified_manager = await ensure_unified_memory_manager_initialized() if not unified_manager: - logger.warning("[KFC记忆] 管理器未初始化,跳过记忆检索") + logger.warning("[KFC记忆] 管理器初始化失败或未启用,跳过记忆检索") return "" # 构建查询文本(使用最近多条消息的组合块)