diff --git a/plugins/memory_graph_plugin/__init__.py b/plugins/memory_graph_plugin/__init__.py deleted file mode 100644 index 11dd3e92d..000000000 --- a/plugins/memory_graph_plugin/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -""" -记忆系统插件 - -集成记忆管理功能到 Bot 系统中 -""" - -from src.plugin_system.base.plugin_metadata import PluginMetadata - -__plugin_meta__ = PluginMetadata( - name="记忆图系统 (Memory Graph)", - description="基于图的记忆管理系统,支持记忆创建、关联和检索", - usage="LLM 可以通过工具调用创建和管理记忆,系统自动在回复时检索相关记忆", - version="0.1.0", - author="MoFox-Studio", - license="GPL-v3.0", - repository_url="https://github.com/MoFox-Studio", - keywords=["记忆", "知识图谱", "RAG", "长期记忆"], - categories=["AI", "Knowledge Management"], - extra={"is_built_in": False, "plugin_type": "memory"}, -) diff --git a/plugins/memory_graph_plugin/plugin.py b/plugins/memory_graph_plugin/plugin.py deleted file mode 100644 index eb20c1b78..000000000 --- a/plugins/memory_graph_plugin/plugin.py +++ /dev/null @@ -1,85 +0,0 @@ -""" -记忆系统插件主类 -""" - -from typing import ClassVar - -from src.common.logger import get_logger -from src.plugin_system import BasePlugin, register_plugin - -logger = get_logger("memory_graph_plugin") - -# 用于存储后台任务引用 -_background_tasks = set() - - -@register_plugin -class MemoryGraphPlugin(BasePlugin): - """记忆图系统插件""" - - plugin_name = "memory_graph_plugin" - enable_plugin = True - dependencies: ClassVar = [] - python_dependencies: ClassVar = [] - config_file_name = "config.toml" - config_schema: ClassVar = {} - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - logger.info(f"{self.log_prefix} 插件已加载") - - def get_plugin_components(self): - """返回插件组件列表""" - from src.memory_graph.plugin_tools.memory_plugin_tools import ( - CreateMemoryTool, - LinkMemoriesTool, - SearchMemoriesTool, - ) - - components = [] - - # 添加工具组件 - for tool_class in [CreateMemoryTool, LinkMemoriesTool, SearchMemoriesTool]: - tool_info = tool_class.get_tool_info() - components.append((tool_info, tool_class)) - - return components - - async def on_plugin_loaded(self): - """插件加载后的回调""" - try: - from src.memory_graph.manager_singleton import initialize_memory_manager - - logger.info(f"{self.log_prefix} 正在初始化记忆系统...") - await initialize_memory_manager() - logger.info(f"{self.log_prefix} ✅ 记忆系统初始化成功") - - except Exception as e: - logger.error(f"{self.log_prefix} 初始化记忆系统失败: {e}", exc_info=True) - raise - - def on_unload(self): - """插件卸载时的回调""" - try: - import asyncio - - from src.memory_graph.manager_singleton import shutdown_memory_manager - - logger.info(f"{self.log_prefix} 正在关闭记忆系统...") - - # 在事件循环中运行异步关闭 - loop = asyncio.get_event_loop() - if loop.is_running(): - # 如果循环正在运行,创建任务 - task = asyncio.create_task(shutdown_memory_manager()) - # 存储引用以防止任务被垃圾回收 - _background_tasks.add(task) - task.add_done_callback(_background_tasks.discard) - else: - # 如果循环未运行,直接运行 - loop.run_until_complete(shutdown_memory_manager()) - - logger.info(f"{self.log_prefix} ✅ 记忆系统已关闭") - - except Exception as e: - logger.error(f"{self.log_prefix} 关闭记忆系统时出错: {e}", exc_info=True) diff --git a/src/memory_graph/long_term_manager.py b/src/memory_graph/long_term_manager.py index 2fbf2b69e..6335d35ee 100644 --- a/src/memory_graph/long_term_manager.py +++ b/src/memory_graph/long_term_manager.py @@ -821,6 +821,14 @@ class LongTermMemoryManager: if not source_id or not target_id: logger.warning(f"创建边失败: 缺少节点ID ({source_id} -> {target_id})") return + + # 检查节点是否存在 + if not self.memory_manager.graph_store or not self.memory_manager.graph_store.graph.has_node(source_id): + logger.warning(f"创建边失败: 源节点不存在 ({source_id})") + return + if not self.memory_manager.graph_store or not self.memory_manager.graph_store.graph.has_node(target_id): + logger.warning(f"创建边失败: 目标节点不存在 ({target_id})") + return edge_id = self.memory_manager.graph_store.add_edge( source_id=source_id, diff --git a/src/memory_graph/manager_singleton.py b/src/memory_graph/manager_singleton.py index f07804e65..818537079 100644 --- a/src/memory_graph/manager_singleton.py +++ b/src/memory_graph/manager_singleton.py @@ -148,8 +148,13 @@ async def initialize_unified_memory_manager(): config = global_config.memory # 创建管理器实例 + # 注意:我们将 data_dir 指向 three_tier 子目录,以隔离感知/短期记忆数据 + # 同时传入全局 _memory_manager 以共享长期记忆图存储 + base_data_dir = Path(getattr(config, "data_dir", "data/memory_graph")) + _unified_memory_manager = UnifiedMemoryManager( - data_dir=Path(getattr(config, "data_dir", "data/memory_graph")), + data_dir=base_data_dir, + memory_manager=_memory_manager, # 感知记忆配置 perceptual_max_blocks=getattr(config, "perceptual_max_blocks", 50), perceptual_block_size=getattr(config, "perceptual_block_size", 5), diff --git a/src/memory_graph/perceptual_manager.py b/src/memory_graph/perceptual_manager.py index e914a2be2..e69e69afa 100644 --- a/src/memory_graph/perceptual_manager.py +++ b/src/memory_graph/perceptual_manager.py @@ -52,7 +52,7 @@ class PerceptualMemoryManager: recall_top_k: 召回时返回的最大块数 recall_similarity_threshold: 召回的相似度阈值 """ - self.data_dir = data_dir or Path("data/memory_graph/three_tier") + self.data_dir = data_dir or Path("data/memory_graph") self.data_dir.mkdir(parents=True, exist_ok=True) # 配置参数 diff --git a/src/memory_graph/short_term_manager.py b/src/memory_graph/short_term_manager.py index 8ed6f19e6..dbe666e27 100644 --- a/src/memory_graph/short_term_manager.py +++ b/src/memory_graph/short_term_manager.py @@ -53,7 +53,7 @@ class ShortTermMemoryManager: transfer_importance_threshold: 转移到长期记忆的重要性阈值 llm_temperature: LLM 决策的温度参数 """ - self.data_dir = data_dir or Path("data/memory_graph/three_tier") + self.data_dir = data_dir or Path("data/memory_graph") self.data_dir.mkdir(parents=True, exist_ok=True) # 配置参数 diff --git a/src/memory_graph/unified_manager.py b/src/memory_graph/unified_manager.py index d358dd475..9661fe614 100644 --- a/src/memory_graph/unified_manager.py +++ b/src/memory_graph/unified_manager.py @@ -35,6 +35,7 @@ class UnifiedMemoryManager: def __init__( self, data_dir: Path | None = None, + memory_manager: MemoryManager | None = None, # 感知记忆配置 perceptual_max_blocks: int = 50, perceptual_block_size: int = 5, @@ -70,7 +71,7 @@ class UnifiedMemoryManager: long_term_auto_transfer_interval: 自动转移间隔(秒) judge_confidence_threshold: 裁判模型的置信度阈值 """ - self.data_dir = data_dir or Path("data/memory_graph/three_tier") + self.data_dir = data_dir or Path("data/memory_graph") self.data_dir.mkdir(parents=True, exist_ok=True) # 配置参数 @@ -82,7 +83,7 @@ class UnifiedMemoryManager: self.long_term_manager: LongTermMemoryManager # 底层 MemoryManager(长期记忆) - self.memory_manager: MemoryManager + self.memory_manager: MemoryManager = memory_manager # 配置参数存储(用于初始化) self._config = { @@ -124,8 +125,17 @@ class UnifiedMemoryManager: logger.info("开始初始化统一记忆管理器...") # 初始化底层 MemoryManager(长期记忆) - self.memory_manager = MemoryManager(data_dir=self.data_dir.parent) - await self.memory_manager.initialize() + if self.memory_manager is None: + # 如果未提供外部 MemoryManager,则创建一个新的 + # 假设 data_dir 是 three_tier 子目录,则 MemoryManager 使用父目录 + # 如果 data_dir 是根目录,则 MemoryManager 使用该目录 + self.memory_manager = MemoryManager(data_dir=self.data_dir) + await self.memory_manager.initialize() + else: + logger.info("使用外部提供的 MemoryManager") + # 确保外部 MemoryManager 已初始化 + if not getattr(self.memory_manager, "_initialized", False): + await self.memory_manager.initialize() # 初始化感知记忆层 self.perceptual_manager = PerceptualMemoryManager(