From 0908fb50a013da0af670801cab3248d269d3d69b Mon Sep 17 00:00:00 2001 From: Windpicker-owo <3431391539@qq.com> Date: Wed, 26 Nov 2025 21:16:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/copilot-instructions.md | 2 +- bot.py | 2 +- docs/memory_graph/design_outline.md | 2 +- docs/unified_scheduler_guide.md | 2 +- scripts/deduplicate_memories.py | 4 +- scripts/generate_missing_embeddings.py | 4 +- scripts/lpmm_learning_tool.py | 2 +- scripts/rebuild_metadata_index.py | 2 +- src/api/memory_visualizer_router.py | 2 +- src/chat/emoji_system/emoji_manager.py | 4 +- src/chat/energy_system/energy_manager.py | 9 +- src/chat/express/expression_learner.py | 6 +- src/chat/express/expressor_model/model.py | 6 +- src/chat/express/expressor_model/tokenizer.py | 2 +- src/chat/express/style_learner.py | 16 +-- .../interest_system/bot_interest_manager.py | 31 ++--- src/chat/interest_system/interest_manager.py | 6 +- .../message_manager/distribution_manager.py | 6 +- .../message_manager/global_notice_manager.py | 2 +- src/chat/message_receive/chat_stream.py | 14 +- src/chat/message_receive/storage.py | 4 +- .../message_receive/uni_message_sender.py | 2 +- src/chat/replyer/default_generator.py | 6 +- src/chat/security/manager.py | 2 +- src/chat/utils/attention_optimizer.py | 2 +- src/chat/utils/prompt_component_manager.py | 6 +- src/chat/utils/utils.py | 2 +- src/chat/utils/utils_image.py | 10 +- src/common/core_sink_manager.py | 2 +- .../data_models/message_manager_data_model.py | 18 +-- src/common/database/api/specialized.py | 6 +- src/common/database/compatibility/adapter.py | 4 +- src/common/database/core/engine.py | 2 +- src/common/database/core/migration.py | 4 +- .../database/optimization/batch_scheduler.py | 14 +- .../database/optimization/cache_manager.py | 6 +- src/common/database/optimization/preloader.py | 2 +- src/llm_models/utils_model.py | 8 +- src/main.py | 12 +- src/manager/async_task_manager.py | 4 +- src/memory_graph/core/builder.py | 4 +- src/memory_graph/core/extractor.py | 4 +- src/memory_graph/core/node_merger.py | 6 +- src/memory_graph/long_term_manager.py | 30 ++--- src/memory_graph/manager.py | 55 +++----- src/memory_graph/manager_singleton.py | 13 +- src/memory_graph/perceptual_manager.py | 63 ++++----- .../plugin_tools/memory_plugin_tools.py | 6 +- src/memory_graph/short_term_manager.py | 44 +++--- src/memory_graph/storage/graph_store.py | 20 +-- src/memory_graph/storage/persistence.py | 48 +++---- src/memory_graph/storage/vector_store.py | 29 ++-- src/memory_graph/tools/memory_tools.py | 127 +++++++----------- src/memory_graph/unified_manager.py | 46 +++---- src/memory_graph/utils/embeddings.py | 4 +- src/memory_graph/utils/path_expansion.py | 24 ++-- src/person_info/person_info.py | 4 +- src/person_info/relationship_fetcher.py | 2 +- src/plugin_system/apis/generator_api.py | 2 +- src/plugin_system/apis/permission_api.py | 1 - src/plugin_system/apis/send_api.py | 11 +- src/plugin_system/apis/storage_api.py | 6 +- src/plugin_system/apis/unified_scheduler.py | 39 +++--- src/plugin_system/base/base_action.py | 2 +- src/plugin_system/base/base_adapter.py | 4 +- src/plugin_system/base/plugin_base.py | 10 +- src/plugin_system/base/plus_command.py | 4 +- src/plugin_system/core/adapter_manager.py | 36 ++++- src/plugin_system/core/component_registry.py | 2 +- src/plugin_system/core/event_manager.py | 2 +- src/plugin_system/core/permission_manager.py | 6 +- src/plugin_system/core/plugin_manager.py | 8 +- .../core/affinity_interest_calculator.py | 2 +- .../proactive/proactive_thinking_event.py | 4 +- .../proactive/proactive_thinking_executor.py | 8 +- .../proactive/proactive_thinking_scheduler.py | 8 +- .../tools/chat_stream_impression_tool.py | 4 +- .../tools/user_profile_tool.py | 4 +- .../built_in/anti_injection_plugin/checker.py | 2 +- src/plugins/built_in/core_actions/emoji.py | 2 +- .../actions/read_feed_action.py | 2 +- .../actions/send_feed_action.py | 2 +- .../commands/send_feed_command.py | 2 +- .../services/qzone_service.py | 28 ++-- .../services/reply_tracker_service.py | 4 +- src/plugins/built_in/napcat_adapter/plugin.py | 2 +- .../src/handlers/to_core/message_handler.py | 28 ++-- .../handlers/to_core/meta_event_handler.py | 2 +- .../src/handlers/to_core/notice_handler.py | 2 +- .../src/handlers/to_napcat/send_handler.py | 21 ++- .../napcat_adapter/src/handlers/utils.py | 2 +- .../built_in/social_toolkit_plugin/plugin.py | 8 +- .../tts_voice_plugin/actions/tts_action.py | 4 +- .../tts_voice_plugin/commands/tts_command.py | 2 +- .../built_in/tts_voice_plugin/plugin.py | 2 +- .../tts_voice_plugin/services/tts_service.py | 8 +- .../web_search_tool/engines/metaso_engine.py | 4 +- .../built_in/web_search_tool/plugin.py | 2 +- .../web_search_tool/tools/url_parser.py | 4 +- .../web_search_tool/tools/web_search.py | 2 +- 100 files changed, 493 insertions(+), 574 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index b31e37f10..819189b09 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -137,7 +137,7 @@ from src.common.logger import get_logger logger = get_logger("module_name") logger.info("信息") -logger.error("错误", exc_info=True) # 包含堆栈跟踪 +logger.error("错误") ``` **日志级别**: 通过 `bot_config.toml` 的 `[logging]` 配置 diff --git a/bot.py b/bot.py index f58697bec..9dc5e509b 100644 --- a/bot.py +++ b/bot.py @@ -249,7 +249,7 @@ class ShutdownManager: return success except Exception as e: - logger.error(f"麦麦关闭失败: {e}", exc_info=True) + logger.error(f"麦麦关闭失败: {e}") return False diff --git a/docs/memory_graph/design_outline.md b/docs/memory_graph/design_outline.md index a526fc134..2ddbec195 100644 --- a/docs/memory_graph/design_outline.md +++ b/docs/memory_graph/design_outline.md @@ -1422,7 +1422,7 @@ class MemoryConsolidationScheduler: await asyncio.sleep(self.interval.total_seconds()) except Exception as e: - logger.error(f"记忆整理任务失败: {e}", exc_info=True) + logger.error(f"记忆整理任务失败: {e}") # 失败后等待10分钟再重试 await asyncio.sleep(600) diff --git a/docs/unified_scheduler_guide.md b/docs/unified_scheduler_guide.md index c26f04dd5..fc5340152 100644 --- a/docs/unified_scheduler_guide.md +++ b/docs/unified_scheduler_guide.md @@ -368,7 +368,7 @@ class MyPlugin(PluginBase): # 任务逻辑 pass except Exception as e: - self.logger.error(f"任务执行失败: {e}", exc_info=True) + self.logger.error(f"任务执行失败: {e}") ``` 5. **性能考虑**: diff --git a/scripts/deduplicate_memories.py b/scripts/deduplicate_memories.py index 5eb1f1aa1..e44970d12 100644 --- a/scripts/deduplicate_memories.py +++ b/scripts/deduplicate_memories.py @@ -235,7 +235,7 @@ class MemoryDeduplicator: return True except Exception as e: - logger.error(f" ❌ 删除失败: {e}", exc_info=True) + logger.error(f" ❌ 删除失败: {e}") self.stats["errors"] += 1 return False @@ -389,7 +389,7 @@ async def main(): except KeyboardInterrupt: print("\n\n⚠️ 用户中断操作") except Exception as e: - logger.error(f"执行失败: {e}", exc_info=True) + logger.error(f"执行失败: {e}") print(f"\n❌ 执行失败: {e}") return 1 finally: diff --git a/scripts/generate_missing_embeddings.py b/scripts/generate_missing_embeddings.py index afa3f59a6..ba50861dc 100644 --- a/scripts/generate_missing_embeddings.py +++ b/scripts/generate_missing_embeddings.py @@ -183,7 +183,7 @@ async def generate_missing_embeddings( except Exception as e: failed_count += len(batch) - logger.error(f"批次 {batch_num} 处理失败", exc_info=True) + logger.error(f"批次 {batch_num} 处理失败") print(f" ❌ 批次处理失败: {e}") # 显示进度 @@ -197,7 +197,7 @@ async def generate_missing_embeddings( await manager.persistence.save_graph_store(manager.graph_store) print("✅ 图数据已保存\n") except Exception as e: - logger.error("保存图数据失败", exc_info=True) + logger.error("保存图数据失败") print(f"❌ 保存失败: {e}\n") # 5. 验证结果 diff --git a/scripts/lpmm_learning_tool.py b/scripts/lpmm_learning_tool.py index 8b5d6f3df..df9325616 100644 --- a/scripts/lpmm_learning_tool.py +++ b/scripts/lpmm_learning_tool.py @@ -424,7 +424,7 @@ def rebuild_faiss_only(): embed_manager.save_to_file() logger.info("✅ FAISS 索引重建完成!") except Exception as e: - logger.error(f"重建 FAISS 索引时发生错误: {e}", exc_info=True) + logger.error(f"重建 FAISS 索引时发生错误: {e}") def main(): diff --git a/scripts/rebuild_metadata_index.py b/scripts/rebuild_metadata_index.py index b4d786019..5e2c6c87e 100644 --- a/scripts/rebuild_metadata_index.py +++ b/scripts/rebuild_metadata_index.py @@ -132,7 +132,7 @@ async def rebuild_metadata_index(): print("\n✅ 元数据索引重建完成!") except Exception as e: - logger.error(f"重建索引失败: {e}", exc_info=True) + logger.error(f"重建索引失败: {e}") print(f"❌ 重建索引失败: {e}") diff --git a/src/api/memory_visualizer_router.py b/src/api/memory_visualizer_router.py index dd8f3aa07..9a74d9596 100644 --- a/src/api/memory_visualizer_router.py +++ b/src/api/memory_visualizer_router.py @@ -495,7 +495,7 @@ async def list_files_api(): ) except Exception as e: # 增加日志记录 - # logger.error(f"列出数据文件失败: {e}", exc_info=True) + # logger.error(f"列出数据文件失败: {e}") return JSONResponse(content={"success": False, "error": str(e)}, status_code=500) diff --git a/src/chat/emoji_system/emoji_manager.py b/src/chat/emoji_system/emoji_manager.py index 17448316a..d17e6d643 100644 --- a/src/chat/emoji_system/emoji_manager.py +++ b/src/chat/emoji_system/emoji_manager.py @@ -1039,9 +1039,9 @@ class EmojiManager: break logger.warning("[VLM分析] VLM返回的JSON数据不完整或格式错误,准备重试。") except (json.JSONDecodeError, AttributeError) as e: - logger.error(f"VLM JSON解析失败 (第 {i+1}/3 次): {e}", exc_info=True) + logger.error(f"VLM JSON解析失败 (第 {i+1}/3 次): {e}") except Exception as e: - logger.error(f"VLM调用失败 (第 {i+1}/3 次): {e}", exc_info=True) + logger.error(f"VLM调用失败 (第 {i+1}/3 次): {e}") description, emotions, refined_description = "", [], "" # Reset for retry if i < 2: diff --git a/src/chat/energy_system/energy_manager.py b/src/chat/energy_system/energy_manager.py index f5ee7ca88..21e7f6e31 100644 --- a/src/chat/energy_system/energy_manager.py +++ b/src/chat/energy_system/energy_manager.py @@ -274,7 +274,7 @@ class EnergyManager: self.thresholds["reply"] = max(self.thresholds["reply"], self.thresholds["non_reply"] + 0.1) self.stats["last_threshold_update"] = time.time() - logger.info(f"加载AFC阈值: {self.thresholds}") + except Exception as e: logger.warning(f"加载AFC阈值失败,使用默认值: {e}") @@ -468,23 +468,22 @@ class EnergyManager: self.thresholds["reply"] = max(self.thresholds["reply"], self.thresholds["non_reply"] + 0.1) self.stats["last_threshold_update"] = time.time() - logger.info(f"更新AFC阈值: {self.thresholds}") def add_calculator(self, calculator: EnergyCalculator) -> None: """添加计算器""" self.calculators.append(calculator) - logger.info(f"添加能量计算器: {calculator.__class__.__name__}") + logger.debug(f"添加能量计算器: {calculator.__class__.__name__}") def remove_calculator(self, calculator: EnergyCalculator) -> None: """移除计算器""" if calculator in self.calculators: self.calculators.remove(calculator) - logger.info(f"移除能量计算器: {calculator.__class__.__name__}") + logger.debug(f"移除能量计算器: {calculator.__class__.__name__}") def clear_cache(self) -> None: """清空缓存""" self.energy_cache.clear() - logger.info("清空能量缓存") + logger.debug("清空能量缓存") def get_cache_hit_rate(self) -> float: """获取缓存命中率""" diff --git a/src/chat/express/expression_learner.py b/src/chat/express/expression_learner.py index e2d7dfc99..b0da82652 100644 --- a/src/chat/express/expression_learner.py +++ b/src/chat/express/expression_learner.py @@ -542,7 +542,7 @@ class ExpressionLearner: # 获取 StyleLearner 实例 learner = style_learner_manager.get_learner(chat_id) - logger.info(f"开始训练 StyleLearner: chat_id={chat_id}, 样本数={len(expr_list)}") + logger.debug(f"开始训练 StyleLearner: chat_id={chat_id}, 样本数={len(expr_list)}") # 为每个学习到的表达方式训练模型 # 使用 situation 作为输入,style 作为目标 @@ -566,12 +566,12 @@ class ExpressionLearner: # 保存模型 if learner.save(style_learner_manager.model_save_path): - logger.info(f"StyleLearner 模型保存成功: {chat_id}") + logger.debug(f"StyleLearner 模型保存成功: {chat_id}") else: logger.error(f"StyleLearner 模型保存失败: {chat_id}") except Exception as e: - logger.error(f"训练 StyleLearner 失败: {e}", exc_info=True) + logger.error(f"训练 StyleLearner 失败: {e}") return learnt_expressions return None diff --git a/src/chat/express/expressor_model/model.py b/src/chat/express/expressor_model/model.py index f4b5af163..770b02895 100644 --- a/src/chat/express/expressor_model/model.py +++ b/src/chat/express/expressor_model/model.py @@ -38,7 +38,7 @@ class ExpressorModel: self._candidates: dict[str, str] = {} # cid -> text (style) self._situations: dict[str, str] = {} # cid -> situation (不参与计算) - logger.info( + logger.debug( f"ExpressorModel初始化完成 (alpha={alpha}, beta={beta}, gamma={gamma}, vocab_size={vocab_size}, use_jieba={use_jieba})" ) @@ -199,8 +199,6 @@ class ExpressorModel: with open(path, "wb") as f: pickle.dump(data, f) - logger.info(f"模型已保存到 {path}") - def load(self, path: str): """ 从文件加载模型 @@ -230,7 +228,7 @@ class ExpressorModel: for cid, tc in data["nb_token_counts"].items(): self.nb.token_counts[cid] = defaultdict(float, tc) - logger.info(f"模型已从 {path} 加载") + logger.debug(f"模型已从 {path} 加载") def get_stats(self) -> dict: """获取模型统计信息""" diff --git a/src/chat/express/expressor_model/tokenizer.py b/src/chat/express/expressor_model/tokenizer.py index 9db8925a6..886d68e69 100644 --- a/src/chat/express/expressor_model/tokenizer.py +++ b/src/chat/express/expressor_model/tokenizer.py @@ -24,7 +24,7 @@ class Tokenizer: import rjieba # noqa: F401 # rjieba 会自动初始化,无需手动调用 - logger.info("RJieba分词器初始化成功") + logger.debug("RJieba分词器初始化成功") except ImportError: logger.warning("RJieba未安装,将使用字符级分词") self.use_jieba = False diff --git a/src/chat/express/style_learner.py b/src/chat/express/style_learner.py index b7436265c..1b9975bdb 100644 --- a/src/chat/express/style_learner.py +++ b/src/chat/express/style_learner.py @@ -51,8 +51,6 @@ class StyleLearner: "last_update": time.time(), } - logger.info(f"StyleLearner初始化成功: chat_id={chat_id}") - def add_style(self, style: str, situation: str | None = None) -> bool: """ 动态添加一个新的风格 @@ -178,7 +176,7 @@ class StyleLearner: logger.debug(f"被删除的风格样例(前5): {deleted_styles[:5]}") except Exception as e: - logger.error(f"清理风格失败: {e}", exc_info=True) + logger.error(f"清理风格失败: {e}") def learn_mapping(self, up_content: str, style: str) -> bool: """ @@ -271,7 +269,7 @@ class StyleLearner: return best_style, style_scores except Exception as e: - logger.error(f"预测style失败: {e}", exc_info=True) + logger.error(f"预测style失败: {e}") return None, {} def get_style_info(self, style: str) -> tuple[str | None, str | None]: @@ -373,7 +371,6 @@ class StyleLearner: with open(meta_path, "wb") as f: pickle.dump(meta_data, f) - logger.info(f"StyleLearner保存成功: {save_dir}") return True except Exception as e: @@ -421,7 +418,6 @@ class StyleLearner: if "style_last_used" not in self.learning_stats: self.learning_stats["style_last_used"] = {} - logger.info(f"StyleLearner加载成功: {save_dir}") return True except Exception as e: @@ -454,7 +450,7 @@ class StyleLearnerManager: # 确保保存目录存在 os.makedirs(model_save_path, exist_ok=True) - logger.info(f"StyleLearnerManager初始化成功, 模型保存路径: {model_save_path}") + logger.debug(f"StyleLearnerManager初始化成功, 模型保存路径: {model_save_path}") def get_learner(self, chat_id: str, model_config: dict | None = None) -> StyleLearner: """ @@ -520,7 +516,7 @@ class StyleLearnerManager: if not learner.save(self.model_save_path): success = False - logger.info(f"保存所有StyleLearner {'成功' if success else '部分失败'}") + logger.debug(f"保存所有StyleLearner {'成功' if success else '部分失败'}") return success def cleanup_all_old_styles(self, ratio: float | None = None) -> dict[str, int]: @@ -540,7 +536,7 @@ class StyleLearnerManager: cleanup_results[chat_id] = cleaned total_cleaned = sum(cleanup_results.values()) - logger.info(f"清理所有StyleLearner完成: 总共清理了 {total_cleaned} 个风格") + logger.debug(f"清理所有StyleLearner完成: 总共清理了 {total_cleaned} 个风格") return cleanup_results def apply_decay_all(self, factor: float | None = None): @@ -553,7 +549,7 @@ class StyleLearnerManager: for learner in self.learners.values(): learner.apply_decay(factor) - logger.info("对所有StyleLearner应用知识衰减") + logger.debug("对所有StyleLearner应用知识衰减") def get_all_stats(self) -> dict[str, dict]: """ diff --git a/src/chat/interest_system/bot_interest_manager.py b/src/chat/interest_system/bot_interest_manager.py index e817426c1..7c689cffa 100644 --- a/src/chat/interest_system/bot_interest_manager.py +++ b/src/chat/interest_system/bot_interest_manager.py @@ -44,7 +44,7 @@ class BotInterestManager: async def initialize(self, personality_description: str, personality_id: str = "default"): """初始化兴趣标签系统""" try: - logger.info("机器人兴趣系统开始初始化...") + logger.debug("机器人兴趣系统开始初始化...") # 初始化embedding模型 await self._initialize_embedding_model() @@ -61,8 +61,8 @@ class BotInterestManager: # 检查是否成功获取兴趣标签 if self.current_interests and len(self.current_interests.get_active_tags()) > 0: active_tags_count = len(self.current_interests.get_active_tags()) - logger.info("机器人兴趣系统初始化完成!") - logger.info(f"当前已激活 {active_tags_count} 个兴趣标签, Embedding缓存 {len(self.embedding_cache)} 个") + logger.debug("机器人兴趣系统初始化完成!") + logger.debug(f"当前已激活 {active_tags_count} 个兴趣标签, Embedding缓存 {len(self.embedding_cache)} 个") else: raise RuntimeError("未能成功加载或生成兴趣标签") @@ -83,10 +83,8 @@ class BotInterestManager: self.embedding_config = model_config.model_task_config.embedding - if self.embedding_dimension: - logger.info(f"📐 配置的embedding维度: {self.embedding_dimension}") - else: - logger.info("📐 未在配置中检测到embedding维度,将根据首次返回的向量自动识别") + if not self.embedding_dimension: + logger.debug("未在配置中检测到embedding维度,将根据首次返回的向量自动识别") # 创建LLMRequest实例用于embedding self.embedding_request = LLMRequest(model_set=self.embedding_config, request_type="interest_embedding") @@ -107,7 +105,7 @@ class BotInterestManager: await self._generate_embeddings_for_tags(loaded_interests) else: # 生成新的兴趣标签 - logger.info("数据库中未找到兴趣标签,开始生成...") + logger.debug("数据库中未找到兴趣标签,开始生成...") generated_interests = await self._generate_interests_from_personality( personality_description, personality_id ) @@ -115,15 +113,15 @@ class BotInterestManager: if generated_interests: self.current_interests = generated_interests active_count = len(generated_interests.get_active_tags()) - logger.info(f"成功生成 {active_count} 个新兴趣标签。") + logger.debug(f"成功生成 {active_count} 个新兴趣标签。") tags_info = [ f" - '{tag.tag_name}' (权重: {tag.weight:.2f})" for tag in generated_interests.get_active_tags() ] tags_str = "\n".join(tags_info) - logger.info(f"当前兴趣标签:\n{tags_str}") + logger.debug(f"当前兴趣标签:\n{tags_str}") # 保存到数据库 - logger.info("正在保存至数据库...") + logger.debug("正在保存至数据库...") await self._save_interests_to_database(generated_interests) else: raise RuntimeError("❌ 兴趣标签生成失败") @@ -133,8 +131,7 @@ class BotInterestManager: ) -> BotPersonalityInterests | None: """根据人设生成兴趣标签""" try: - logger.info("🎨 开始根据人设生成兴趣标签...") - logger.info(f"📝 人设长度: {len(personality_description)} 字符") + logger.debug("开始根据人设生成兴趣标签...") # 检查embedding客户端是否可用 if not hasattr(self, "embedding_request"): @@ -211,7 +208,7 @@ class BotInterestManager: # 解析生成的兴趣标签 interests_list = interests_data.get("interests", []) - logger.info(f"📋 解析到 {len(interests_list)} 个兴趣标签") + logger.debug(f"📋 解析到 {len(interests_list)} 个兴趣标签") for i, tag_data in enumerate(interests_list): tag_name = tag_data.get("name", f"标签_{i}") @@ -234,10 +231,10 @@ class BotInterestManager: bot_interests.interest_tags.append(tag) # 为所有标签生成embedding - logger.info("🧠 开始为兴趣标签生成embedding向量...") + logger.debug("开始为兴趣标签生成embedding向量...") await self._generate_embeddings_for_tags(bot_interests) - logger.info("✅ 兴趣标签生成完成") + logger.debug("兴趣标签生成完成") return bot_interests except Exception as e: @@ -248,7 +245,7 @@ class BotInterestManager: async def _call_llm_for_interest_generation(self, prompt: str) -> str | None: """调用LLM生成兴趣标签""" try: - logger.info("🔧 配置LLM客户端...") + logger.debug("配置LLM客户端...") # 使用llm_api来处理请求 from src.config.config import model_config diff --git a/src/chat/interest_system/interest_manager.py b/src/chat/interest_system/interest_manager.py index af01d1fb5..fee57e8d7 100644 --- a/src/chat/interest_system/interest_manager.py +++ b/src/chat/interest_system/interest_manager.py @@ -89,7 +89,7 @@ class InterestManager: return False except Exception as e: - logger.error(f"注册兴趣值计算组件失败: {e}", exc_info=True) + logger.error(f"注册兴趣值计算组件失败: {e}") return False async def calculate_interest(self, message: "DatabaseMessages", timeout: float = 2.0) -> InterestCalculationResult: @@ -159,7 +159,7 @@ class InterestManager: except Exception as e: self._failed_calculations += 1 - logger.error(f"兴趣值计算异常: {e}", exc_info=True) + logger.error(f"兴趣值计算异常: {e}") return InterestCalculationResult( success=False, message_id=getattr(message, "message_id", ""), @@ -185,7 +185,7 @@ class InterestManager: # 任务被取消,退出循环 break except Exception as e: - logger.error(f"计算工作线程异常: {e}", exc_info=True) + logger.error(f"计算工作线程异常: {e}") def get_current_calculator(self) -> BaseInterestCalculator | None: """获取当前活跃的兴趣值计算组件""" diff --git a/src/chat/message_manager/distribution_manager.py b/src/chat/message_manager/distribution_manager.py index 784521b9d..674f0ac00 100644 --- a/src/chat/message_manager/distribution_manager.py +++ b/src/chat/message_manager/distribution_manager.py @@ -277,7 +277,7 @@ class StreamLoopManager: logger.info(f"🛑 [流工作器] stream={stream_id[:8]}, 任务ID={task_id}, 被取消") break except Exception as e: - logger.error(f"❌ [流工作器] stream={stream_id[:8]}, 任务ID={task_id}, 出错: {e}", exc_info=True) + logger.error(f"❌ [流工作器] stream={stream_id[:8]}, 任务ID={task_id}, 出错: {e}") self.stats["total_failures"] += 1 await asyncio.sleep(5.0) # 错误时等待5秒再重试 @@ -398,7 +398,7 @@ class StreamLoopManager: chatter_task.cancel() raise except Exception as e: - logger.error(f"流处理异常: {stream_id} - {e}", exc_info=True) + logger.error(f"流处理异常: {stream_id} - {e}") return False finally: # 清除 Chatter 处理标志 @@ -699,7 +699,7 @@ class StreamLoopManager: logger.warning(f"创建强制分发流循环失败: {stream_id}") except Exception as e: - logger.error(f"强制分发流处理失败 {stream_id}: {e}", exc_info=True) + logger.error(f"强制分发流处理失败 {stream_id}: {e}") # 全局流循环管理器实例 diff --git a/src/chat/message_manager/global_notice_manager.py b/src/chat/message_manager/global_notice_manager.py index db8a5aa2b..4215cb939 100644 --- a/src/chat/message_manager/global_notice_manager.py +++ b/src/chat/message_manager/global_notice_manager.py @@ -228,7 +228,7 @@ class GlobalNoticeManager: return result except Exception as e: - logger.error(f"获取notice文本失败: {e}", exc_info=True) + logger.error(f"获取notice文本失败: {e}") return "" def clear_notices(self, stream_id: str | None = None, notice_type: str | None = None) -> int: diff --git a/src/chat/message_receive/chat_stream.py b/src/chat/message_receive/chat_stream.py index afe58c683..f403b5c97 100644 --- a/src/chat/message_receive/chat_stream.py +++ b/src/chat/message_receive/chat_stream.py @@ -198,7 +198,7 @@ class ChatStream: raise RuntimeError("没有可用的兴趣值计算组件") except Exception as e: - logger.error(f"计算消息兴趣值失败: {e}", exc_info=True) + logger.error(f"计算消息兴趣值失败: {e}") # 异常情况下使用默认值 if hasattr(db_message, "interest_value"): db_message.interest_value = 0.3 @@ -259,7 +259,7 @@ class ChatStream: return energy except Exception as e: - logger.error(f"获取focus_energy失败: {e}", exc_info=True) + logger.error(f"获取focus_energy失败: {e}") # 返回缓存的值或默认值 if hasattr(self, "_focus_energy"): return self._focus_energy @@ -325,7 +325,7 @@ class ChatManager: """异步初始化""" try: await self.load_all_streams() - logger.info(f"聊天管理器已启动,已加载 {len(self.streams)} 个聊天流") + logger.debug(f"聊天管理器已启动,已加载 {len(self.streams)} 个聊天流") except Exception as e: logger.error(f"聊天管理器启动失败: {e!s}") @@ -335,7 +335,7 @@ class ChatManager: await asyncio.sleep(300) # 每5分钟保存一次 try: await self._save_all_streams() - logger.info("聊天流自动保存完成") + logger.debug("聊天流自动保存完成") except Exception as e: logger.error(f"聊天流自动保存失败: {e!s}") @@ -461,7 +461,7 @@ class ChatManager: group_info=group_info, ) except Exception as e: - logger.error(f"获取或创建聊天流失败: {e}", exc_info=True) + logger.error(f"获取或创建聊天流失败: {e}") raise e if stream_id in self.last_messages and isinstance(self.last_messages[stream_id], DatabaseMessages): @@ -645,7 +645,7 @@ class ChatManager: async def load_all_streams(self): """从数据库加载所有聊天流""" - logger.info("正在从数据库加载所有聊天流") + logger.debug("正在从数据库加载所有聊天流") async def _db_load_all_streams_async(): loaded_streams_data = [] @@ -703,7 +703,7 @@ class ChatManager: # await stream.set_context(self.last_messages[stream.stream_id]) except Exception as e: - logger.error(f"从数据库加载所有聊天流失败 (SQLAlchemy): {e}", exc_info=True) + logger.error(f"从数据库加载所有聊天流失败 (SQLAlchemy): {e}") chat_manager = None diff --git a/src/chat/message_receive/storage.py b/src/chat/message_receive/storage.py index 2e23c04a8..1f8b8766e 100644 --- a/src/chat/message_receive/storage.py +++ b/src/chat/message_receive/storage.py @@ -130,7 +130,7 @@ class MessageStorageBatcher: ) except Exception as e: - logger.error(f"批量存储消息失败: {e}", exc_info=True) + logger.error(f"批量存储消息失败: {e}") async def _prepare_message_dict(self, message, chat_stream): """准备消息字典数据(用于批量INSERT) @@ -534,7 +534,7 @@ class MessageStorage: else: logger.warning(f"无法为描述 '{description[:20]}...' 找到对应的picid,将保留原始标记") except Exception as e: - logger.error(f"替换图片描述时查询数据库失败: {e}", exc_info=True) + logger.error(f"替换图片描述时查询数据库失败: {e}") new_text.append(replacement) last_end = match.end() diff --git a/src/chat/message_receive/uni_message_sender.py b/src/chat/message_receive/uni_message_sender.py index dd2123015..a149f02ba 100644 --- a/src/chat/message_receive/uni_message_sender.py +++ b/src/chat/message_receive/uni_message_sender.py @@ -58,7 +58,7 @@ async def send_envelope( message=db_message or envelope, ) except Exception as event_error: - logger.error(f"触发 AFTER_SEND 事件时出错: {event_error}", exc_info=True) + logger.error(f"触发 AFTER_SEND 事件时出错: {event_error}") return True diff --git a/src/chat/replyer/default_generator.py b/src/chat/replyer/default_generator.py index 219f79410..01189fda6 100644 --- a/src/chat/replyer/default_generator.py +++ b/src/chat/replyer/default_generator.py @@ -636,7 +636,7 @@ class DefaultReplyer: return "" except Exception as e: - logger.error(f"[三层记忆] 检索失败: {e}", exc_info=True) + logger.error(f"[三层记忆] 检索失败: {e}") return "" def _build_memory_query_text( @@ -819,7 +819,7 @@ class DefaultReplyer: pass except Exception as e: - logger.error(f"关键词检测与反应时发生异常: {e!s}", exc_info=True) + logger.error(f"关键词检测与反应时发生异常: {e!s}") return reaction_prompt @@ -868,7 +868,7 @@ class DefaultReplyer: return "" except Exception as e: - logger.error(f"构建notice块失败,chat_id={chat_id}: {e}", exc_info=True) + logger.error(f"构建notice块失败,chat_id={chat_id}: {e}") return "" async def _time_and_run_task(self, coroutine, name: str) -> tuple[str, Any, float]: diff --git a/src/chat/security/manager.py b/src/chat/security/manager.py index e160e8a74..a8c3a5716 100644 --- a/src/chat/security/manager.py +++ b/src/chat/security/manager.py @@ -119,7 +119,7 @@ class SecurityManager: return await self._check_sequential(message, context, start_time) except Exception as e: - logger.error(f"安全检测失败: {e}", exc_info=True) + logger.error(f"安全检测失败: {e}") return SecurityCheckResult( is_safe=True, # 异常情况下默认允许通过,避免阻断正常消息 level=SecurityLevel.SAFE, diff --git a/src/chat/utils/attention_optimizer.py b/src/chat/utils/attention_optimizer.py index 8ab669228..b3b32360a 100644 --- a/src/chat/utils/attention_optimizer.py +++ b/src/chat/utils/attention_optimizer.py @@ -75,5 +75,5 @@ class BlockShuffler: return prompt_template, shuffled_context except Exception as e: - logger.error(f"Block重排失败: {e}", exc_info=True) + logger.error(f"Block重排失败: {e}") return prompt_template, context_data diff --git a/src/chat/utils/prompt_component_manager.py b/src/chat/utils/prompt_component_manager.py index 0a0fec1e5..d06e8a285 100644 --- a/src/chat/utils/prompt_component_manager.py +++ b/src/chat/utils/prompt_component_manager.py @@ -99,7 +99,7 @@ class PromptComponentManager: result = await instance.execute() return str(result) if result is not None else "" except Exception as e: - logger.error(f"执行静态规则提供者 '{cls.prompt_name}' 时出错: {e}", exc_info=True) + logger.error(f"执行静态规则提供者 '{cls.prompt_name}' 时出错: {e}") return "" # 出错时返回空字符串,避免影响主流程 return content_provider @@ -313,7 +313,7 @@ class PromptComponentManager: try: content = await provider(params, target_prompt_name) except Exception as e: - logger.error(f"执行规则 '{rule}' (来源: {source}) 的内容提供者时失败: {e}", exc_info=True) + logger.error(f"执行规则 '{rule}' (来源: {source}) 的内容提供者时失败: {e}") continue try: @@ -336,7 +336,7 @@ class PromptComponentManager: except re.error as e: logger.error(f"应用规则时发生正则错误: {e} (pattern: '{rule.target_content}')") except Exception as e: - logger.error(f"应用注入规则 '{rule}' (来源: {source}) 失败: {e}", exc_info=True) + logger.error(f"应用注入规则 '{rule}' (来源: {source}) 失败: {e}") # 4. 占位符恢复 final_template = modified_template diff --git a/src/chat/utils/utils.py b/src/chat/utils/utils.py index 4c37690c8..450fff21c 100644 --- a/src/chat/utils/utils.py +++ b/src/chat/utils/utils.py @@ -839,7 +839,7 @@ async def get_chat_type_and_target_info(chat_id: str) -> tuple[bool, dict | None else: logger.warning(f"无法获取 chat_stream for {chat_id} in utils") except Exception as e: - logger.error(f"获取聊天类型和目标信息时出错 for {chat_id}: {e}", exc_info=True) + logger.error(f"获取聊天类型和目标信息时出错 for {chat_id}: {e}") # Keep defaults on error return is_group_chat, chat_target_info diff --git a/src/chat/utils/utils_image.py b/src/chat/utils/utils_image.py index 1e06e4828..8e649f197 100644 --- a/src/chat/utils/utils_image.py +++ b/src/chat/utils/utils_image.py @@ -214,7 +214,7 @@ class ImageManager: return f"[表情包:{refined_part}]" except Exception as e: - logger.error(f"获取表情包描述失败: {e!s}", exc_info=True) + logger.error(f"获取表情包描述失败: {e!s}") return "[表情包(处理失败)]" async def get_image_description(self, image_base64: str) -> str: @@ -257,7 +257,7 @@ class ImageManager: if description and description.strip(): break # 成功获取描述则跳出循环 except Exception as e: - logger.error(f"VLM调用失败 (第 {i+1}/3 次): {e}", exc_info=True) + logger.error(f"VLM调用失败 (第 {i+1}/3 次): {e}") if i < 2: # 如果不是最后一次,则等待1秒 logger.warning("识图失败,将在1秒后重试...") @@ -286,7 +286,7 @@ class ImageManager: return f"[图片:{description}]" except Exception as e: - logger.error(f"获取图片描述时发生严重错误: {e!s}", exc_info=True) + logger.error(f"获取图片描述时发生严重错误: {e!s}") return "[图片(处理失败)]" @staticmethod @@ -388,7 +388,7 @@ class ImageManager: logger.error("GIF转换失败: 内存不足,可能是GIF太大或帧数太多") return None # 内存不够啦 except Exception as e: - logger.error(f"GIF转换失败: {e!s}", exc_info=True) # 记录详细错误信息 + logger.error(f"GIF转换失败: {e!s}") # 记录详细错误信息 return None # 其他错误也返回None async def process_image(self, image_base64: str) -> tuple[str, str]: @@ -459,7 +459,7 @@ class ImageManager: return image_id, description except Exception as e: - logger.error(f"处理图片时发生严重错误: {e!s}", exc_info=True) + logger.error(f"处理图片时发生严重错误: {e!s}") return "", "[图片(处理失败)]" diff --git a/src/common/core_sink_manager.py b/src/common/core_sink_manager.py index 3b04265ca..68ea7d1a6 100644 --- a/src/common/core_sink_manager.py +++ b/src/common/core_sink_manager.py @@ -291,7 +291,7 @@ class CoreSinkManager: # 使用 MessageRuntime 处理消息 await self._runtime.handle_message(envelope) except Exception as e: - logger.error(f"MessageRuntime 处理消息时出错: {e}", exc_info=True) + logger.error(f"MessageRuntime 处理消息时出错: {e}") # 全局单例 diff --git a/src/common/data_models/message_manager_data_model.py b/src/common/data_models/message_manager_data_model.py index 55a133580..a3f348898 100644 --- a/src/common/data_models/message_manager_data_model.py +++ b/src/common/data_models/message_manager_data_model.py @@ -164,11 +164,11 @@ class StreamContext(BaseDataModel): await unified_manager.add_message(message_dict) logger.debug(f"��Ϣ�����ӵ��������ϵͳ: {message.message_id}") except Exception as e: - logger.error(f"������Ϣ���������ϵͳʧ��: {e}", exc_info=True) + logger.error(f"������Ϣ���������ϵͳʧ��: {e}") return True except Exception as e: - logger.error(f"������Ϣ������������ʧ�� {self.stream_id}: {e}", exc_info=True) + logger.error(f"������Ϣ������������ʧ�� {self.stream_id}: {e}") return False async def update_message(self, message_id: str, updates: dict[str, Any]) -> bool: @@ -197,7 +197,7 @@ class StreamContext(BaseDataModel): logger.debug(f"���µ�����������Ϣ: {self.stream_id}/{message_id}") return True except Exception as e: - logger.error(f"���µ�����������Ϣʧ�� {self.stream_id}/{message_id}: {e}", exc_info=True) + logger.error(f"���µ�����������Ϣʧ�� {self.stream_id}/{message_id}: {e}") return False def add_action_to_message(self, message_id: str, action: str): @@ -277,7 +277,7 @@ class StreamContext(BaseDataModel): self._update_access_stats() return messages except Exception as e: - logger.error(f"获取上下文消息失败 {self.stream_id}: {e}", exc_info=True) + logger.error(f"获取上下文消息失败 {self.stream_id}: {e}") return [] def mark_messages_as_read(self, message_ids: list[str]) -> bool: @@ -292,7 +292,7 @@ class StreamContext(BaseDataModel): logger.warning(f"标记消息已读失败 {message_id}: {e}") return marked_count > 0 except Exception as e: - logger.error(f"批量标记消息已读失败 {self.stream_id}: {e}", exc_info=True) + logger.error(f"批量标记消息已读失败 {self.stream_id}: {e}") return False def calculate_interruption_probability(self, max_limit: int, min_probability: float = 0.1, probability_factor: float | None = None) -> float: @@ -349,7 +349,7 @@ class StreamContext(BaseDataModel): logger.debug(f"清空上下文成功: {self.stream_id}") return True except Exception as e: - logger.error(f"清空上下文失败 {self.stream_id}: {e}", exc_info=True) + logger.error(f"清空上下文失败 {self.stream_id}: {e}") return False def get_statistics(self) -> dict[str, Any]: @@ -378,7 +378,7 @@ class StreamContext(BaseDataModel): stats["cache_stats"] = self.get_cache_stats() return stats except Exception as e: - logger.error(f"获取上下文统计失败 {self.stream_id}: {e}", exc_info=True) + logger.error(f"获取上下文统计失败 {self.stream_id}: {e}") return {} def validate_integrity(self) -> bool: @@ -547,7 +547,7 @@ class StreamContext(BaseDataModel): logger.debug(f"无历史消息需要加载: {self.stream_id}") except Exception as e: - logger.error(f"从数据库加载历史消息失败: {self.stream_id}, {e}", exc_info=True) + logger.error(f"从数据库加载历史消息失败: {self.stream_id}, {e}") self._history_initialized = False def _detect_chat_type(self, message: "DatabaseMessages"): @@ -588,7 +588,7 @@ class StreamContext(BaseDataModel): return 0.5 except Exception as e: - logger.error(f"计算消息兴趣时出现异常: {e}", exc_info=True) + logger.error(f"计算消息兴趣时出现异常: {e}") if hasattr(message, "interest_calculated"): message.interest_calculated = False return 0.5 diff --git a/src/common/database/api/specialized.py b/src/common/database/api/specialized.py index 657ed0316..f9ddc274e 100644 --- a/src/common/database/api/specialized.py +++ b/src/common/database/api/specialized.py @@ -104,7 +104,7 @@ async def store_action_info( return None except Exception as e: - logger.error(f"存储动作信息时发生错误: {e}", exc_info=True) + logger.error(f"存储动作信息时发生错误: {e}") return None @@ -246,7 +246,7 @@ async def update_person_affinity( return True except Exception as e: - logger.error(f"更新好感度失败: {e}", exc_info=True) + logger.error(f"更新好感度失败: {e}") return False @@ -480,5 +480,5 @@ async def update_relationship_affinity( return True except Exception as e: - logger.error(f"更新关系好感度失败: {e}", exc_info=True) + logger.error(f"更新关系好感度失败: {e}") return False diff --git a/src/common/database/compatibility/adapter.py b/src/common/database/compatibility/adapter.py index c102704d0..a19eddfea 100644 --- a/src/common/database/compatibility/adapter.py +++ b/src/common/database/compatibility/adapter.py @@ -272,7 +272,7 @@ async def db_query( return {"count": count} except Exception as e: - logger.error(f"数据库操作失败: {e}", exc_info=True) + logger.error(f"数据库操作失败: {e}") return None if single_result or query_type != "get" else [] @@ -308,7 +308,7 @@ async def db_save( return _model_to_dict(instance) except Exception as e: - logger.error(f"保存数据库记录出错: {e}", exc_info=True) + logger.error(f"保存数据库记录出错: {e}") return None diff --git a/src/common/database/core/engine.py b/src/common/database/core/engine.py index 2087ae49b..131587b2b 100644 --- a/src/common/database/core/engine.py +++ b/src/common/database/core/engine.py @@ -130,7 +130,7 @@ async def get_engine() -> AsyncEngine: return _engine except Exception as e: - logger.error(f"❌ 数据库引擎初始化失败: {e}", exc_info=True) + logger.error(f"❌ 数据库引擎初始化失败: {e}") raise DatabaseInitializationError(f"引擎初始化失败: {e}") from e diff --git a/src/common/database/core/migration.py b/src/common/database/core/migration.py index 587823318..35d25e05e 100644 --- a/src/common/database/core/migration.py +++ b/src/common/database/core/migration.py @@ -69,7 +69,7 @@ async def check_and_migrate_database(existing_engine=None): # 提交表创建事务 await connection.commit() except Exception as e: - logger.error(f"创建表时失败: {e}", exc_info=True) + logger.error(f"创建表时失败: {e}") await connection.rollback() # 2. 然后处理现有表的列和索引的添加 @@ -182,7 +182,7 @@ async def check_and_migrate_database(existing_engine=None): logger.debug(f"表 '{table_name}' 的索引一致。") except Exception as e: - logger.error(f"在处理表 '{table_name}' 时发生意外错误: {e}", exc_info=True) + logger.error(f"在处理表 '{table_name}' 时发生意外错误: {e}") await connection.rollback() continue diff --git a/src/common/database/optimization/batch_scheduler.py b/src/common/database/optimization/batch_scheduler.py index 8f523f2b4..08c272172 100644 --- a/src/common/database/optimization/batch_scheduler.py +++ b/src/common/database/optimization/batch_scheduler.py @@ -218,7 +218,7 @@ class AdaptiveBatchScheduler: except asyncio.CancelledError: break except Exception as e: - logger.error(f"调度器循环异常: {e}", exc_info=True) + logger.error(f"调度器循环异常: {e}") async def _flush_all_queues(self) -> None: """刷新所有队列""" @@ -292,7 +292,7 @@ class AdaptiveBatchScheduler: ) except Exception as e: - logger.error(f"批量操作执行失败: {e}", exc_info=True) + logger.error(f"批量操作执行失败: {e}") self.stats.error_count += 1 # 设置所有future的异常 @@ -320,7 +320,7 @@ class AdaptiveBatchScheduler: raise ValueError(f"未知操作类型: {op_type}") except Exception as e: - logger.error(f"执行{op_type}操作组失败: {e}", exc_info=True) + logger.error(f"执行{op_type}操作组失败: {e}") for op in operations: if op.future and not op.future.done(): op.future.set_exception(e) @@ -362,7 +362,7 @@ class AdaptiveBatchScheduler: logger.warning(f"回调执行失败: {e}") except Exception as e: - logger.error(f"查询失败: {e}", exc_info=True) + logger.error(f"查询失败: {e}") if op.future and not op.future.done(): op.future.set_exception(e) @@ -395,7 +395,7 @@ class AdaptiveBatchScheduler: logger.warning(f"回调执行失败: {e}") except Exception as e: - logger.error(f"批量插入失败: {e}", exc_info=True) + logger.error(f"批量插入失败: {e}") await session.rollback() for op in operations: if op.future and not op.future.done(): @@ -439,7 +439,7 @@ class AdaptiveBatchScheduler: logger.warning(f"回调执行失败: {e}") except Exception as e: - logger.error(f"批量更新失败: {e}", exc_info=True) + logger.error(f"批量更新失败: {e}") await session.rollback() # 所有操作都失败 for op in operations: @@ -481,7 +481,7 @@ class AdaptiveBatchScheduler: logger.warning(f"回调执行失败: {e}") except Exception as e: - logger.error(f"批量删除失败: {e}", exc_info=True) + logger.error(f"批量删除失败: {e}") await session.rollback() # 所有操作都失败 for op in operations: diff --git a/src/common/database/optimization/cache_manager.py b/src/common/database/optimization/cache_manager.py index b7f62a631..700502c47 100644 --- a/src/common/database/optimization/cache_manager.py +++ b/src/common/database/optimization/cache_manager.py @@ -598,7 +598,7 @@ class MultiLevelCache: except asyncio.TimeoutError: logger.warning("内存限制检查超时,跳过本次检查") except Exception as e: - logger.error(f"内存限制检查失败: {e}", exc_info=True) + logger.error(f"内存限制检查失败: {e}") async def start_cleanup_task(self, interval: float = 60) -> None: """启动定期清理任务 @@ -641,7 +641,7 @@ class MultiLevelCache: except asyncio.CancelledError: break except Exception as e: - logger.error(f"清理任务异常: {e}", exc_info=True) + logger.error(f"清理任务异常: {e}") self._cleanup_task = asyncio.create_task(cleanup_loop()) logger.info(f"缓存清理任务已启动,间隔{interval}秒") @@ -706,7 +706,7 @@ class MultiLevelCache: logger.debug(f"缓存清理任务 {'L1' if i == 0 else 'L2'} 完成") except Exception as e: - logger.error(f"清理过期条目失败: {e}", exc_info=True) + logger.error(f"清理过期条目失败: {e}") async def _clean_cache_layer_expired(self, cache_layer, current_time: float, layer_name: str) -> int: """清理单个缓存层的过期条目(避免锁嵌套)""" diff --git a/src/common/database/optimization/preloader.py b/src/common/database/optimization/preloader.py index 8335f5d0b..3f3598977 100644 --- a/src/common/database/optimization/preloader.py +++ b/src/common/database/optimization/preloader.py @@ -219,7 +219,7 @@ class DataPreloader: logger.debug(f"发现关联数据: {related_key}") except Exception as e: - logger.error(f"预加载数据失败 {key}: {e}", exc_info=True) + logger.error(f"预加载数据失败 {key}: {e}") async def start_preload_batch( self, diff --git a/src/llm_models/utils_model.py b/src/llm_models/utils_model.py index 2bb1a3c37..ef80c988a 100644 --- a/src/llm_models/utils_model.py +++ b/src/llm_models/utils_model.py @@ -351,7 +351,7 @@ class _PromptProcessor: return perturbed_text except Exception as e: - logger.error(f"提示词扰动处理失败: {e}", exc_info=True) + logger.error(f"提示词扰动处理失败: {e}") return prompt_text # 发生异常时返回原始文本,保证流程不中断 @staticmethod @@ -377,7 +377,7 @@ class _PromptProcessor: result = result.replace(original, replacement, 1) return result except Exception as e: - logger.error(f"语义变体替换失败: {e}", exc_info=True) + logger.error(f"语义变体替换失败: {e}") return text @staticmethod @@ -434,7 +434,7 @@ class _PromptProcessor: return result except Exception as e: - logger.error(f"空白字符噪声注入失败: {e}", exc_info=True) + logger.error(f"空白字符噪声注入失败: {e}") return text @staticmethod @@ -477,7 +477,7 @@ class _PromptProcessor: return "".join(result) except Exception as e: - logger.error(f"随机噪音注入失败: {e}", exc_info=True) + logger.error(f"随机噪音注入失败: {e}") return text @staticmethod diff --git a/src/main.py b/src/main.py index 6dbbc4ae1..2d7d8c82a 100644 --- a/src/main.py +++ b/src/main.py @@ -118,7 +118,7 @@ class MainSystem: async def _initialize_interest_calculator(self) -> None: """初始化兴趣值计算组件 - 通过插件系统自动发现和加载""" try: - logger.info("开始自动发现兴趣值计算组件...") + logger.debug("开始自动发现兴趣值计算组件...") # 使用组件注册表自动发现兴趣计算器组件 interest_calculators = {} @@ -127,7 +127,7 @@ class MainSystem: from src.plugin_system.base.component_types import ComponentType interest_calculators = get_components_info_by_type(ComponentType.INTEREST_CALCULATOR) - logger.info(f"通过组件注册表发现 {len(interest_calculators)} 个兴趣计算器组件") + logger.debug(f"通过组件注册表发现 {len(interest_calculators)} 个兴趣计算器组件") except Exception as e: logger.error(f"从组件注册表获取兴趣计算器失败: {e}") @@ -187,7 +187,7 @@ class MainSystem: logger.error(f"兴趣计算器 {calc_name} 注册失败") except Exception as e: - logger.error(f"处理兴趣计算器 {calc_name} 时出错: {e}", exc_info=True) + logger.error(f"处理兴趣计算器 {calc_name} 时出错: {e}") if registered_calculators: logger.info(f"成功注册了 {len(registered_calculators)} 个兴趣计算器") @@ -197,7 +197,7 @@ class MainSystem: logger.error("未能成功注册任何兴趣计算器") except Exception as e: - logger.error(f"初始化兴趣度计算器失败: {e}", exc_info=True) + logger.error(f"初始化兴趣度计算器失败: {e}") async def _async_cleanup(self) -> None: """异步清理资源""" @@ -490,7 +490,7 @@ MoFox_Bot(第三方修改版) else: logger.debug("三层记忆系统未启用(配置中禁用)") except Exception as e: - logger.error(f"三层记忆系统初始化失败: {e}", exc_info=True) + logger.error(f"三层记忆系统初始化失败: {e}") # 初始化消息兴趣值计算组件 await self._initialize_interest_calculator() @@ -561,7 +561,7 @@ MoFox_Bot(第三方修改版) await adapter_manager.start_all_adapters() logger.info("所有适配器已启动") except Exception as e: - logger.error(f"启动适配器失败: {e}", exc_info=True) + logger.error(f"启动适配器失败: {e}") async def _init_planning_components(self) -> None: """初始化计划相关组件""" diff --git a/src/manager/async_task_manager.py b/src/manager/async_task_manager.py index 157849381..e62d25fdc 100644 --- a/src/manager/async_task_manager.py +++ b/src/manager/async_task_manager.py @@ -77,7 +77,7 @@ class AsyncTaskManager: except asyncio.CancelledError: logger.debug(f"任务 '{task.get_name()}' 被取消") except Exception as e: - logger.error(f"任务 '{task.get_name()}' 执行时发生异常: {e}", exc_info=True) + logger.error(f"任务 '{task.get_name()}' 执行时发生异常: {e}") async def add_task(self, task: AsyncTask, call_back: Callable[[asyncio.Task], None] | None = None): """ @@ -152,7 +152,7 @@ class AsyncTaskManager: except asyncio.CancelledError: logger.info(f"任务 '{task_name}' 已取消") except Exception as e: - logger.error(f"任务 '{task_name}' 执行时发生异常: {e}", exc_info=True) + logger.error(f"任务 '{task_name}' 执行时发生异常: {e}") # 清空任务列表 self.tasks.clear() diff --git a/src/memory_graph/core/builder.py b/src/memory_graph/core/builder.py index 4846d7892..cbe7927b0 100644 --- a/src/memory_graph/core/builder.py +++ b/src/memory_graph/core/builder.py @@ -159,7 +159,7 @@ class MemoryBuilder: return memory except Exception as e: - logger.error(f"记忆构建失败: {e}", exc_info=True) + logger.error(f"记忆构建失败: {e}") raise RuntimeError(f"记忆构建失败: {e}") async def _create_or_reuse_node( @@ -551,7 +551,7 @@ class MemoryBuilder: return edge except Exception as e: - logger.error(f"记忆关联失败: {e}", exc_info=True) + logger.error(f"记忆关联失败: {e}") raise RuntimeError(f"记忆关联失败: {e}") def _find_topic_node(self, memory: Memory) -> MemoryNode | None: diff --git a/src/memory_graph/core/extractor.py b/src/memory_graph/core/extractor.py index 988feae92..67f7a8fe0 100644 --- a/src/memory_graph/core/extractor.py +++ b/src/memory_graph/core/extractor.py @@ -83,7 +83,7 @@ class MemoryExtractor: return extracted except Exception as e: - logger.error(f"记忆提取失败: {e}", exc_info=True) + logger.error(f"记忆提取失败: {e}") raise ValueError(f"记忆提取失败: {e}") def _validate_required_params(self, params: dict[str, Any]) -> None: @@ -260,7 +260,7 @@ class MemoryExtractor: return extracted except Exception as e: - logger.error(f"关联参数提取失败: {e}", exc_info=True) + logger.error(f"关联参数提取失败: {e}") raise ValueError(f"关联参数提取失败: {e}") def validate_relation_type(self, relation_type: str) -> str: diff --git a/src/memory_graph/core/node_merger.py b/src/memory_graph/core/node_merger.py index 74a2674ff..4560378d2 100644 --- a/src/memory_graph/core/node_merger.py +++ b/src/memory_graph/core/node_merger.py @@ -96,7 +96,7 @@ class NodeMerger: return similar_nodes except Exception as e: - logger.error(f"查找相似节点失败: {e}", exc_info=True) + logger.error(f"查找相似节点失败: {e}") return [] async def should_merge( @@ -244,7 +244,7 @@ class NodeMerger: return True except Exception as e: - logger.error(f"节点合并失败: {e}", exc_info=True) + logger.error(f"节点合并失败: {e}") return False def _update_memory_references(self, old_node_id: str, new_node_id: str) -> None: @@ -325,7 +325,7 @@ class NodeMerger: progress_callback(i + 1, stats["total"], stats) except Exception as e: - logger.error(f"处理节点 {node.id} 时失败: {e}", exc_info=True) + logger.error(f"处理节点 {node.id} 时失败: {e}") stats["skipped"] += 1 logger.info( diff --git a/src/memory_graph/long_term_manager.py b/src/memory_graph/long_term_manager.py index 245fdbe2d..3c567d0c1 100644 --- a/src/memory_graph/long_term_manager.py +++ b/src/memory_graph/long_term_manager.py @@ -71,17 +71,17 @@ class LongTermMemoryManager: return try: - logger.info("开始初始化长期记忆管理器...") + logger.debug("开始初始化长期记忆管理器...") # 确保底层 MemoryManager 已初始化 if not self.memory_manager._initialized: await self.memory_manager.initialize() self._initialized = True - logger.info("✅ 长期记忆管理器初始化完成") + logger.debug("长期记忆管理器初始化完成") except Exception as e: - logger.error(f"长期记忆管理器初始化失败: {e}", exc_info=True) + logger.error(f"长期记忆管理器初始化失败: {e}") raise async def transfer_from_short_term( @@ -107,7 +107,7 @@ class LongTermMemoryManager: await self.initialize() try: - logger.info(f"开始转移 {len(short_term_memories)} 条短期记忆到长期记忆...") + logger.debug(f"开始转移 {len(short_term_memories)} 条短期记忆到长期记忆...") result = { "processed_count": 0, @@ -143,11 +143,11 @@ class LongTermMemoryManager: # 让出控制权 await asyncio.sleep(0.01) - logger.info(f"✅ 短期记忆转移完成: {result}") + logger.debug(f"短期记忆转移完成: {result}") return result except Exception as e: - logger.error(f"转移短期记忆失败: {e}", exc_info=True) + logger.error(f"转移短期记忆失败: {e}") return {"error": str(e), "processed_count": 0} async def _process_batch(self, batch: list[ShortTermMemory]) -> dict[str, Any]: @@ -196,7 +196,7 @@ class LongTermMemoryManager: result["failed_count"] += 1 except Exception as e: - logger.error(f"处理短期记忆 {stm.id} 失败: {e}", exc_info=True) + logger.error(f"处理短期记忆 {stm.id} 失败: {e}") result["failed_count"] += 1 return result @@ -272,7 +272,7 @@ class LongTermMemoryManager: return expanded_memories except Exception as e: - logger.error(f"检索相似长期记忆失败: {e}", exc_info=True) + logger.error(f"检索相似长期记忆失败: {e}") return [] async def _decide_graph_operations( @@ -310,11 +310,11 @@ class LongTermMemoryManager: # 解析图操作指令 operations = self._parse_graph_operations(response) - logger.info(f"LLM 生成 {len(operations)} 个图操作指令") + logger.debug(f"LLM 生成 {len(operations)} 个图操作指令") return operations except Exception as e: - logger.error(f"LLM 决策图操作失败: {e}", exc_info=True) + logger.error(f"LLM 决策图操作失败: {e}") # 默认创建新记忆 return [ GraphOperation( @@ -553,13 +553,13 @@ class LongTermMemoryManager: logger.warning(f"未实现的操作类型: {op.operation_type}") except Exception as e: - logger.error(f"执行图操作失败: {op}, 错误: {e}", exc_info=True) + logger.error(f"执行图操作失败: {op}, 错误: {e}") - logger.info(f"执行了 {success_count}/{len(operations)} 个图操作") + logger.debug(f"执行了 {success_count}/{len(operations)} 个图操作") return success_count > 0 except Exception as e: - logger.error(f"执行图操作失败: {e}", exc_info=True) + logger.error(f"执行图操作失败: {e}") return False @staticmethod @@ -984,7 +984,7 @@ class LongTermMemoryManager: return {"decayed_count": decayed_count, "total_memories": len(all_memories)} except Exception as e: - logger.error(f"应用长期记忆衰减失败: {e}", exc_info=True) + logger.error(f"应用长期记忆衰减失败: {e}") return {"error": str(e), "decayed_count": 0} def get_statistics(self) -> dict[str, Any]: @@ -1012,7 +1012,7 @@ class LongTermMemoryManager: logger.info("✅ 长期记忆管理器已关闭") except Exception as e: - logger.error(f"关闭长期记忆管理器失败: {e}", exc_info=True) + logger.error(f"关闭长期记忆管理器失败: {e}") # 全局单例 diff --git a/src/memory_graph/manager.py b/src/memory_graph/manager.py index 9cf68e7f0..03b73d006 100644 --- a/src/memory_graph/manager.py +++ b/src/memory_graph/manager.py @@ -95,7 +95,7 @@ class MemoryManager: return try: - logger.info("开始初始化记忆管理器...") + logger.debug("开始初始化记忆管理器...") # 1. 初始化存储层 self.data_dir.mkdir(parents=True, exist_ok=True) @@ -153,21 +153,6 @@ class MemoryManager: search_min_importance = getattr(self.config, "search_min_importance", 0.3) search_similarity_threshold = getattr(self.config, "search_similarity_threshold", 0.5) - logger.info( - f"📊 配置检查: expand_depth={expand_depth}, " - f"expand_semantic_threshold={expand_semantic_threshold}, " - f"search_top_k={search_top_k}" - ) - logger.info( - f"📊 权重配置: vector={search_vector_weight}, " - f"importance={search_importance_weight}, " - f"recency={search_recency_weight}" - ) - logger.info( - f"📊 阈值过滤: min_importance={search_min_importance}, " - f"similarity_threshold={search_similarity_threshold}" - ) - self.tools = MemoryTools( vector_store=self.vector_store, graph_store=self.graph_store, @@ -190,7 +175,7 @@ class MemoryManager: self._start_maintenance_task() except Exception as e: - logger.error(f"记忆管理器初始化失败: {e}", exc_info=True) + logger.error(f"记忆管理器初始化失败: {e}") raise async def shutdown(self) -> None: @@ -226,7 +211,7 @@ class MemoryManager: logger.info("✅ 记忆管理器已关闭") except Exception as e: - logger.error(f"关闭记忆管理器失败: {e}", exc_info=True) + logger.error(f"关闭记忆管理器失败: {e}") # ==================== 记忆 CRUD 操作 ==================== @@ -279,7 +264,7 @@ class MemoryManager: return None except Exception as e: - logger.error(f"创建记忆时发生异常: {e}", exc_info=True) + logger.error(f"创建记忆时发生异常: {e}") return None async def get_memory(self, memory_id: str) -> Memory | None: @@ -336,7 +321,7 @@ class MemoryManager: return True except Exception as e: - logger.error(f"更新记忆失败: {e}", exc_info=True) + logger.error(f"更新记忆失败: {e}") return False async def delete_memory(self, memory_id: str) -> bool: @@ -376,7 +361,7 @@ class MemoryManager: return True except Exception as e: - logger.error(f"删除记忆失败: {e}", exc_info=True) + logger.error(f"删除记忆失败: {e}") return False # ==================== 记忆检索操作 ==================== @@ -487,7 +472,7 @@ class MemoryManager: return filtered_memories[:top_k] except Exception as e: - logger.error(f"搜索记忆失败: {e}", exc_info=True) + logger.error(f"搜索记忆失败: {e}") return [] async def link_memories( @@ -531,7 +516,7 @@ class MemoryManager: return False except Exception as e: - logger.error(f"关联记忆失败: {e}", exc_info=True) + logger.error(f"关联记忆失败: {e}") return False # ==================== 记忆生命周期管理 ==================== @@ -608,7 +593,7 @@ class MemoryManager: return True except Exception as e: - logger.error(f"激活记忆失败: {e}", exc_info=True) + logger.error(f"激活记忆失败: {e}") return False async def _auto_activate_searched_memories(self, memories: list[Memory]) -> None: @@ -938,7 +923,7 @@ class MemoryManager: return False except Exception as e: - logger.error(f"遗忘记忆失败: {e}", exc_info=True) + logger.error(f"遗忘记忆失败: {e}") return False async def auto_forget_memories(self, threshold: float = 0.1) -> int: @@ -1037,7 +1022,7 @@ class MemoryManager: return forgotten_count except Exception as e: - logger.error(f"自动遗忘失败: {e}", exc_info=True) + logger.error(f"自动遗忘失败: {e}") return 0 async def _cleanup_orphan_nodes_and_edges(self) -> tuple[int, int]: @@ -1098,7 +1083,7 @@ class MemoryManager: return orphan_nodes_count, orphan_edges_count except Exception as e: - logger.error(f"清理孤立节点和边失败: {e}", exc_info=True) + logger.error(f"清理孤立节点和边失败: {e}") return 0, 0 # ==================== 统计与维护 ==================== @@ -1185,7 +1170,7 @@ class MemoryManager: return result except Exception as e: - logger.error(f"记忆整理失败: {e}", exc_info=True) + logger.error(f"记忆整理失败: {e}") return {"error": str(e), "forgotten_count": 0} async def _consolidate_memories_background( @@ -1322,7 +1307,7 @@ class MemoryManager: return result except Exception as e: - logger.error(f"❌ 维护失败: {e}", exc_info=True) + logger.error(f"❌ 维护失败: {e}") return {"error": str(e), "total_time": 0} async def _lightweight_auto_link_memories( # 已废弃 @@ -1394,7 +1379,7 @@ class MemoryManager: ) except Exception as e: - logger.error(f"启动维护后台任务失败: {e}", exc_info=True) + logger.error(f"启动维护后台任务失败: {e}") async def _stop_maintenance_task(self) -> None: """ @@ -1416,7 +1401,7 @@ class MemoryManager: self._maintenance_task = None except Exception as e: - logger.error(f"停止维护后台任务失败: {e}", exc_info=True) + logger.error(f"停止维护后台任务失败: {e}") async def _maintenance_loop(self) -> None: """ @@ -1447,7 +1432,7 @@ class MemoryManager: try: await self.maintenance() except Exception as e: - logger.error(f"维护任务执行失败: {e}", exc_info=True) + logger.error(f"维护任务执行失败: {e}") # 后续执行使用相同间隔 initial_delay = self._maintenance_interval_hours * 3600 @@ -1456,7 +1441,7 @@ class MemoryManager: logger.debug("维护循环被取消") break except Exception as e: - logger.error(f"维护循环发生异常: {e}", exc_info=True) + logger.error(f"维护循环发生异常: {e}") # 异常后等待较短时间再重试 try: await asyncio.sleep(300) # 5分钟后重试 @@ -1466,7 +1451,7 @@ class MemoryManager: except asyncio.CancelledError: logger.debug("维护循环完全退出") except Exception as e: - logger.error(f"维护循环意外结束: {e}", exc_info=True) + logger.error(f"维护循环意外结束: {e}") finally: self._maintenance_running = False logger.debug("维护循环已清理完毕") @@ -1493,5 +1478,5 @@ class MemoryManager: await self.persistence.save_graph_store(self.graph_store) logger.debug(f"异步保存图数据成功: {operation_name}") except Exception as e: - logger.error(f"异步保存图数据失败 ({operation_name}): {e}", exc_info=True) + logger.error(f"异步保存图数据失败 ({operation_name}): {e}") # 可以考虑添加重试机制或者通知机制 diff --git a/src/memory_graph/manager_singleton.py b/src/memory_graph/manager_singleton.py index 818537079..9ddc609ac 100644 --- a/src/memory_graph/manager_singleton.py +++ b/src/memory_graph/manager_singleton.py @@ -62,8 +62,6 @@ async def initialize_memory_manager( if isinstance(data_dir, str): data_dir = Path(data_dir) - logger.info(f"正在初始化全局 MemoryManager (data_dir={data_dir})...") - _memory_manager = MemoryManager(data_dir=data_dir) await _memory_manager.initialize() @@ -73,7 +71,7 @@ async def initialize_memory_manager( return _memory_manager except Exception as e: - logger.error(f"初始化 MemoryManager 失败: {e}", exc_info=True) + logger.error(f"初始化 MemoryManager 失败: {e}") _initialized = False _memory_manager = None raise @@ -99,11 +97,10 @@ async def shutdown_memory_manager(): if _memory_manager: try: - logger.info("正在关闭全局 MemoryManager...") await _memory_manager.shutdown() logger.info("✅ 全局 MemoryManager 已关闭") except Exception as e: - logger.error(f"关闭 MemoryManager 时出错: {e}", exc_info=True) + logger.error(f"关闭 MemoryManager 时出错: {e}") finally: _memory_manager = None _initialized = False @@ -175,12 +172,10 @@ async def initialize_unified_memory_manager(): # 初始化 await _unified_memory_manager.initialize() - - logger.info("✅ 统一记忆管理器单例已初始化") return _unified_memory_manager except Exception as e: - logger.error(f"初始化统一记忆管理器失败: {e}", exc_info=True) + logger.error(f"初始化统一记忆管理器失败: {e}") raise @@ -210,5 +205,5 @@ async def shutdown_unified_memory_manager() -> None: logger.info("✅ 统一记忆管理器已关闭") except Exception as e: - logger.error(f"关闭统一记忆管理器失败: {e}", exc_info=True) + logger.error(f"关闭统一记忆管理器失败: {e}") diff --git a/src/memory_graph/perceptual_manager.py b/src/memory_graph/perceptual_manager.py index b4861b3d8..84980f8d6 100644 --- a/src/memory_graph/perceptual_manager.py +++ b/src/memory_graph/perceptual_manager.py @@ -80,11 +80,6 @@ class PerceptualMemoryManager: self._initialized = False self._save_lock = asyncio.Lock() - logger.info( - f"感知记忆管理器已创建 (max_blocks={max_blocks}, " - f"block_size={block_size}, activation_threshold={activation_threshold})" - ) - @property def memory(self) -> PerceptualMemory: """获取感知记忆对象(保证非 None)""" @@ -99,7 +94,7 @@ class PerceptualMemoryManager: return try: - logger.info("开始初始化感知记忆管理器...") + logger.debug("开始初始化感知记忆管理器...") # 初始化嵌入生成器 self.embedding_generator = EmbeddingGenerator() @@ -109,7 +104,7 @@ class PerceptualMemoryManager: # 如果没有加载到数据,创建新的 if not self.perceptual_memory: - logger.info("未找到现有数据,创建新的感知记忆堆") + logger.debug("未找到现有数据,创建新的感知记忆堆") self.perceptual_memory = PerceptualMemory( max_blocks=self.max_blocks, block_size=self.block_size, @@ -119,12 +114,12 @@ class PerceptualMemoryManager: self._initialized = True logger.info( - f"✅ 感知记忆管理器初始化完成 " + f"感知记忆管理器初始化完成 " f"(已加载 {len(self.perceptual_memory.blocks)} 个记忆块)" ) except Exception as e: - logger.error(f"感知记忆管理器初始化失败: {e}", exc_info=True) + logger.error(f"感知记忆管理器初始化失败: {e}") raise async def add_message(self, message: dict[str, Any]) -> MemoryBlock | None: @@ -179,7 +174,7 @@ class PerceptualMemoryManager: return None except Exception as e: - logger.error(f"添加消息失败: {e}", exc_info=True) + logger.error(f"添加消息失败: {e}") return None async def _create_memory_block(self, stream_id: str) -> MemoryBlock | None: @@ -234,9 +229,9 @@ class PerceptualMemoryManager: if len(self.perceptual_memory.blocks) > self.max_blocks: removed_blocks = self.perceptual_memory.blocks[self.max_blocks :] self.perceptual_memory.blocks = self.perceptual_memory.blocks[: self.max_blocks] - logger.info(f"记忆堆已满,移除 {len(removed_blocks)} 个旧块") + logger.debug(f"记忆堆已满,移除 {len(removed_blocks)} 个旧块") - logger.info( + logger.debug( f"✅ 创建新记忆块: {block.id} (stream={stream_id[:8]}, " f"堆大小={len(self.perceptual_memory.blocks)}/{self.max_blocks})" ) @@ -247,7 +242,7 @@ class PerceptualMemoryManager: return block except Exception as e: - logger.error(f"创建记忆块失败: {e}", exc_info=True) + logger.error(f"创建记忆块失败: {e}") return None def _normalize_message_timestamp(self, message: dict[str, Any]) -> float: @@ -375,7 +370,7 @@ class PerceptualMemoryManager: return embedding except Exception as e: - logger.error(f"生成向量失败: {e}", exc_info=True) + logger.error(f"生成向量失败: {e}") return None async def _generate_embeddings_batch(self, texts: list[str]) -> list[np.ndarray | None]: @@ -397,7 +392,7 @@ class PerceptualMemoryManager: return embeddings except Exception as e: - logger.error(f"批量生成向量失败: {e}", exc_info=True) + logger.error(f"批量生成向量失败: {e}") return [None] * len(texts) async def recall_blocks( @@ -464,8 +459,8 @@ class PerceptualMemoryManager: # 检查是否达到激活阈值 if block.recall_count >= self.activation_threshold: - logger.info( - f"🔥 记忆块 {block.id} 被激活!" + logger.debug( + f"记忆块 {block.id} 被激活 " f"(召回次数={block.recall_count}, 阈值={self.activation_threshold})" ) @@ -480,15 +475,11 @@ class PerceptualMemoryManager: ] if activated_blocks: - logger.info( - f"检测到 {len(activated_blocks)} 个记忆块达到激活阈值 " - f"(recall_count >= {self.activation_threshold}),需要转移到短期记忆" - ) # 设置标记供 unified_manager 处理 for block in activated_blocks: block.metadata["needs_transfer"] = True - logger.info( + logger.debug( f"召回 {len(recalled_blocks)} 个记忆块 " f"(top_k={top_k}, threshold={similarity_threshold:.2f})" ) @@ -499,7 +490,7 @@ class PerceptualMemoryManager: return recalled_blocks except Exception as e: - logger.error(f"召回记忆块失败: {e}", exc_info=True) + logger.error(f"召回记忆块失败: {e}") return [] async def _promote_blocks(self, blocks_to_promote: list[MemoryBlock]) -> None: @@ -526,7 +517,7 @@ class PerceptualMemoryManager: logger.debug(f"提升 {len(blocks_to_promote)} 个块到堆顶") except Exception as e: - logger.error(f"提升块失败: {e}", exc_info=True) + logger.error(f"提升块失败: {e}") def get_activated_blocks(self) -> list[MemoryBlock]: """ @@ -569,8 +560,6 @@ class PerceptualMemoryManager: for j, b in enumerate(self.perceptual_memory.blocks): b.position_in_stack = j - logger.info(f"移除记忆块: {block_id}") - # 异步保存 asyncio.create_task(self._save_to_disk()) @@ -580,7 +569,7 @@ class PerceptualMemoryManager: return False except Exception as e: - logger.error(f"移除记忆块失败: {e}", exc_info=True) + logger.error(f"移除记忆块失败: {e}") return False def get_statistics(self) -> dict[str, Any]: @@ -628,7 +617,7 @@ class PerceptualMemoryManager: logger.debug(f"感知记忆已保存到 {save_path}") except Exception as e: - logger.error(f"保存感知记忆失败: {e}", exc_info=True) + logger.error(f"保存感知记忆失败: {e}") async def _load_from_disk(self) -> None: """从磁盘加载感知记忆""" @@ -638,7 +627,7 @@ class PerceptualMemoryManager: load_path = self.data_dir / "perceptual_memory.json" if not load_path.exists(): - logger.info("未找到感知记忆数据文件") + logger.debug("未找到感知记忆数据文件") return data = orjson.loads(load_path.read_bytes()) @@ -647,18 +636,14 @@ class PerceptualMemoryManager: # 重新加载向量数据 await self._reload_embeddings() - logger.info(f"感知记忆已从 {load_path} 加载") - except Exception as e: - logger.error(f"加载感知记忆失败: {e}", exc_info=True) + logger.error(f"加载感知记忆失败: {e}") async def _reload_embeddings(self) -> None: """重新生成记忆块的向量""" if not self.perceptual_memory: return - logger.info("重新生成记忆块向量...") - blocks_to_process = [] texts_to_process = [] @@ -668,10 +653,9 @@ class PerceptualMemoryManager: texts_to_process.append(block.combined_text) if not blocks_to_process: - logger.info("没有需要重新生成向量的块") return - logger.info(f"开始批量生成 {len(blocks_to_process)} 个块的向量...") + logger.debug(f"开始批量生成 {len(blocks_to_process)} 个块的向量...") embeddings = await self._generate_embeddings_batch(texts_to_process) @@ -681,7 +665,7 @@ class PerceptualMemoryManager: block.embedding = embedding success_count += 1 - logger.info(f"✅ 向量重新生成完成(成功: {success_count}/{len(blocks_to_process)})") + logger.debug(f"向量重新生成完成(成功: {success_count}/{len(blocks_to_process)})") async def shutdown(self) -> None: """关闭管理器""" @@ -689,16 +673,15 @@ class PerceptualMemoryManager: return try: - logger.info("正在关闭感知记忆管理器...") + logger.debug("正在关闭感知记忆管理器...") # 最后一次保存 await self._save_to_disk() self._initialized = False - logger.info("✅ 感知记忆管理器已关闭") except Exception as e: - logger.error(f"关闭感知记忆管理器失败: {e}", exc_info=True) + logger.error(f"关闭感知记忆管理器失败: {e}") # 全局单例 diff --git a/src/memory_graph/plugin_tools/memory_plugin_tools.py b/src/memory_graph/plugin_tools/memory_plugin_tools.py index 0f44ede61..995009ffe 100644 --- a/src/memory_graph/plugin_tools/memory_plugin_tools.py +++ b/src/memory_graph/plugin_tools/memory_plugin_tools.py @@ -130,7 +130,7 @@ class _DeprecatedCreateMemoryTool(BaseTool): } except Exception as e: - logger.error(f"[CreateMemoryTool] 执行失败: {e}", exc_info=True) + logger.error(f"[CreateMemoryTool] 执行失败: {e}") return { "name": self.name, "content": f"创建记忆时出错: {e!s}" @@ -190,7 +190,7 @@ class _DeprecatedLinkMemoriesTool(BaseTool): } except Exception as e: - logger.error(f"[LinkMemoriesTool] 执行失败: {e}", exc_info=True) + logger.error(f"[LinkMemoriesTool] 执行失败: {e}") return { "name": self.name, "content": f"关联记忆时出错: {e!s}" @@ -260,7 +260,7 @@ class _DeprecatedSearchMemoriesTool(BaseTool): } except Exception as e: - logger.error(f"[SearchMemoriesTool] 执行失败: {e}", exc_info=True) + logger.error(f"[SearchMemoriesTool] 执行失败: {e}") return { "name": self.name, "content": f"搜索记忆时出错: {e!s}" diff --git a/src/memory_graph/short_term_manager.py b/src/memory_graph/short_term_manager.py index 979529c4a..38a4d3d79 100644 --- a/src/memory_graph/short_term_manager.py +++ b/src/memory_graph/short_term_manager.py @@ -81,7 +81,7 @@ class ShortTermMemoryManager: return try: - logger.info("开始初始化短期记忆管理器...") + logger.debug("开始初始化短期记忆管理器...") # 初始化嵌入生成器 self.embedding_generator = EmbeddingGenerator() @@ -90,10 +90,10 @@ class ShortTermMemoryManager: await self._load_from_disk() self._initialized = True - logger.info(f"✅ 短期记忆管理器初始化完成 (已加载 {len(self.memories)} 条记忆)") + logger.debug(f"短期记忆管理器初始化完成 (已加载 {len(self.memories)} 条记忆)") except Exception as e: - logger.error(f"短期记忆管理器初始化失败: {e}", exc_info=True) + logger.error(f"短期记忆管理器初始化失败: {e}") raise async def add_from_block(self, block: MemoryBlock) -> ShortTermMemory | None: @@ -116,7 +116,7 @@ class ShortTermMemoryManager: await self.initialize() try: - logger.info(f"开始处理记忆块: {block.id}") + logger.debug(f"开始处理记忆块: {block.id}") # 步骤1: 使用 LLM 提取结构化记忆 extracted_memory = await self._extract_structured_memory(block) @@ -126,7 +126,7 @@ class ShortTermMemoryManager: # 步骤2: 决策如何处理新记忆 decision = await self._decide_memory_operation(extracted_memory) - logger.info(f"LLM 决策: {decision}") + logger.debug(f"LLM 决策: {decision}") # 步骤3: 执行决策 result_memory = await self._execute_decision(extracted_memory, decision) @@ -145,7 +145,7 @@ class ShortTermMemoryManager: return result_memory except Exception as e: - logger.error(f"添加短期记忆失败: {e}", exc_info=True) + logger.error(f"添加短期记忆失败: {e}") return None async def _extract_structured_memory(self, block: MemoryBlock) -> ShortTermMemory | None: @@ -232,11 +232,11 @@ class ShortTermMemoryManager: attributes=data.get("attributes", {}), ) - logger.info(f"✅ 提取结构化记忆: {memory.content[:50]}...") + logger.debug(f"提取结构化记忆: {memory.content[:50]}...") return memory except Exception as e: - logger.error(f"提取结构化记忆失败: {e}", exc_info=True) + logger.error(f"提取结构化记忆失败: {e}") return None async def _decide_memory_operation(self, new_memory: ShortTermMemory) -> ShortTermDecision: @@ -337,11 +337,11 @@ class ShortTermMemoryManager: updated_importance=data.get("updated_importance"), ) - logger.info(f"LLM 决策完成: {decision}") + logger.debug(f"LLM 决策完成: {decision}") return decision except Exception as e: - logger.error(f"LLM 决策失败: {e}", exc_info=True) + logger.error(f"LLM 决策失败: {e}") # 默认创建新记忆 return ShortTermDecision( operation=ShortTermOperation.CREATE_NEW, @@ -366,7 +366,7 @@ class ShortTermMemoryManager: if decision.operation == ShortTermOperation.CREATE_NEW: # 创建新记忆 self.memories.append(new_memory) - logger.info(f"✅ 创建新短期记忆: {new_memory.id}") + logger.debug(f"创建新短期记忆: {new_memory.id}") return new_memory elif decision.operation == ShortTermOperation.MERGE: @@ -389,7 +389,7 @@ class ShortTermMemoryManager: target.embedding = await self._generate_embedding(target.content) target.update_access() - logger.info(f"✅ 合并记忆到: {target.id}") + logger.debug(f"合并记忆到: {target.id}") return target elif decision.operation == ShortTermOperation.UPDATE: @@ -412,7 +412,7 @@ class ShortTermMemoryManager: target.source_block_ids.extend(new_memory.source_block_ids) target.update_access() - logger.info(f"✅ 更新记忆: {target.id}") + logger.debug(f"更新记忆: {target.id}") return target elif decision.operation == ShortTermOperation.DISCARD: @@ -432,7 +432,7 @@ class ShortTermMemoryManager: return new_memory except Exception as e: - logger.error(f"执行决策失败: {e}", exc_info=True) + logger.error(f"执行决策失败: {e}") return None async def _find_similar_memories( @@ -466,7 +466,7 @@ class ShortTermMemoryManager: return scored[:top_k] except Exception as e: - logger.error(f"查找相似记忆失败: {e}", exc_info=True) + logger.error(f"查找相似记忆失败: {e}") return [] def _find_memory_by_id(self, memory_id: str | None) -> ShortTermMemory | None: @@ -491,7 +491,7 @@ class ShortTermMemoryManager: return embedding except Exception as e: - logger.error(f"生成向量失败: {e}", exc_info=True) + logger.error(f"生成向量失败: {e}") return None async def _generate_embeddings_batch(self, texts: list[str]) -> list[np.ndarray | None]: @@ -513,7 +513,7 @@ class ShortTermMemoryManager: return embeddings except Exception as e: - logger.error(f"批量生成向量失败: {e}", exc_info=True) + logger.error(f"批量生成向量失败: {e}") return [None] * len(texts) def _parse_json_response(self, response: str) -> dict[str, Any] | None: @@ -583,7 +583,7 @@ class ShortTermMemoryManager: return results except Exception as e: - logger.error(f"检索短期记忆失败: {e}", exc_info=True) + logger.error(f"检索短期记忆失败: {e}") return [] def get_memories_for_transfer(self) -> list[ShortTermMemory]: @@ -643,7 +643,7 @@ class ShortTermMemoryManager: asyncio.create_task(self._save_to_disk()) except Exception as e: - logger.error(f"清除已转移记忆失败: {e}", exc_info=True) + logger.error(f"清除已转移记忆失败: {e}") def get_statistics(self) -> dict[str, Any]: """获取短期记忆层统计信息""" @@ -680,7 +680,7 @@ class ShortTermMemoryManager: logger.debug(f"短期记忆已保存到 {save_path}") except Exception as e: - logger.error(f"保存短期记忆失败: {e}", exc_info=True) + logger.error(f"保存短期记忆失败: {e}") async def _load_from_disk(self) -> None: """从磁盘加载短期记忆""" @@ -702,7 +702,7 @@ class ShortTermMemoryManager: logger.info(f"短期记忆已从 {load_path} 加载 ({len(self.memories)} 条)") except Exception as e: - logger.error(f"加载短期记忆失败: {e}", exc_info=True) + logger.error(f"加载短期记忆失败: {e}") async def _reload_embeddings(self) -> None: """重新生成记忆的向量""" @@ -747,7 +747,7 @@ class ShortTermMemoryManager: logger.info("✅ 短期记忆管理器已关闭") except Exception as e: - logger.error(f"关闭短期记忆管理器失败: {e}", exc_info=True) + logger.error(f"关闭短期记忆管理器失败: {e}") # 全局单例 diff --git a/src/memory_graph/storage/graph_store.py b/src/memory_graph/storage/graph_store.py index 2314ac529..bfc6ff306 100644 --- a/src/memory_graph/storage/graph_store.py +++ b/src/memory_graph/storage/graph_store.py @@ -127,7 +127,7 @@ class GraphStore: logger.debug(f"添加记忆到图: {memory}") except Exception as e: - logger.error(f"添加记忆失败: {e}", exc_info=True) + logger.error(f"添加记忆失败: {e}") raise def add_node( @@ -208,7 +208,7 @@ class GraphStore: return True except Exception as e: - logger.error(f"添加节点失败: {e}", exc_info=True) + logger.error(f"添加节点失败: {e}") return False def update_node( @@ -257,7 +257,7 @@ class GraphStore: return True except Exception as e: - logger.error(f"更新节点失败: {e}", exc_info=True) + logger.error(f"更新节点失败: {e}") return False def add_edge( @@ -341,7 +341,7 @@ class GraphStore: return edge_id except Exception as e: - logger.error(f"添加边失败: {e}", exc_info=True) + logger.error(f"添加边失败: {e}") return None def update_edge( @@ -405,7 +405,7 @@ class GraphStore: return True except Exception as e: - logger.error(f"更新边失败: {e}", exc_info=True) + logger.error(f"更新边失败: {e}") return False def remove_edge(self, edge_id: str) -> bool: @@ -455,7 +455,7 @@ class GraphStore: return True except Exception as e: - logger.error(f"删除边失败: {e}", exc_info=True) + logger.error(f"删除边失败: {e}") return False def merge_memories(self, target_memory_id: str, source_memory_ids: list[str]) -> bool: @@ -511,7 +511,7 @@ class GraphStore: return True except Exception as e: - logger.error(f"合并记忆失败: {e}", exc_info=True) + logger.error(f"合并记忆失败: {e}") return False def get_memory_by_id(self, memory_id: str) -> Memory | None: @@ -697,7 +697,7 @@ class GraphStore: except nx.NetworkXNoPath: return None except Exception as e: - logger.error(f"查找路径失败: {e}", exc_info=True) + logger.error(f"查找路径失败: {e}") return None def bfs_expand( @@ -787,7 +787,7 @@ class GraphStore: logger.info(f"节点合并: {source_id} → {target_id}") except Exception as e: - logger.error(f"合并节点失败: {e}", exc_info=True) + logger.error(f"合并节点失败: {e}") raise def get_node_degree(self, node_id: str) -> tuple[int, int]: @@ -985,7 +985,7 @@ class GraphStore: return True except Exception as e: - logger.error(f"删除记忆失败 {memory_id}: {e}", exc_info=True) + logger.error(f"删除记忆失败 {memory_id}: {e}") return False def clear(self) -> None: diff --git a/src/memory_graph/storage/persistence.py b/src/memory_graph/storage/persistence.py index 1d351de30..dd6069c67 100644 --- a/src/memory_graph/storage/persistence.py +++ b/src/memory_graph/storage/persistence.py @@ -170,8 +170,6 @@ class PersistenceManager: self._running = False self._file_lock = asyncio.Lock() # 文件操作锁 - logger.info(f"初始化持久化管理器: data_dir={data_dir}") - async def save_graph_store(self, graph_store: GraphStore) -> None: """ 保存图存储到文件 @@ -211,7 +209,7 @@ class PersistenceManager: logger.debug(f"图数据已保存: {self.graph_file}, 大小: {len(json_data) / 1024:.2f} KB") except Exception as e: - logger.error(f"保存图数据失败: {e}", exc_info=True) + logger.error(f"保存图数据失败: {e}") raise async def load_graph_store(self) -> GraphStore | None: @@ -222,7 +220,7 @@ class PersistenceManager: GraphStore 对象,如果文件不存在则返回 None """ if not self.graph_file.exists(): - logger.info("图数据文件不存在,返回空图") + logger.debug("图数据文件不存在,返回空图") return None # 使用全局文件锁防止多个系统同时读写同一文件 @@ -249,18 +247,14 @@ class PersistenceManager: logger.error("无法读取图数据文件") return await self._load_from_backup() - # 检查版本(未来可能需要数据迁移) - version = data.get("metadata", {}).get("version", "unknown") - logger.info(f"加载图数据: version={version}") - # 恢复图存储 graph_store = GraphStore.from_dict(data) - logger.info(f"图数据加载完成: {graph_store.get_statistics()}") + logger.debug(f"图数据加载完成: {graph_store.get_statistics()}") return graph_store except Exception as e: - logger.error(f"加载图数据失败: {e}", exc_info=True) + logger.error(f"加载图数据失败: {e}") # 尝试加载备份 return await self._load_from_backup() @@ -291,10 +285,8 @@ class PersistenceManager: # 使用安全的原子写入 await safe_atomic_write(temp_file, self.staged_file) - logger.info(f"临时记忆已保存: {len(staged_memories)} 条") - except Exception as e: - logger.error(f"保存临时记忆失败: {e}", exc_info=True) + logger.error(f"保存临时记忆失败: {e}") raise async def load_staged_memories(self) -> list[StagedMemory]: @@ -305,7 +297,7 @@ class PersistenceManager: 临时记忆列表 """ if not self.staged_file.exists(): - logger.info("临时记忆文件不存在,返回空列表") + logger.debug("临时记忆文件不存在,返回空列表") return [] async with self._file_lock: # 使用文件锁防止并发访问 @@ -330,12 +322,10 @@ class PersistenceManager: return [] staged_memories = [StagedMemory.from_dict(sm) for sm in data.get("staged_memories", [])] - - logger.info(f"临时记忆加载完成: {len(staged_memories)} 条") return staged_memories except Exception as e: - logger.error(f"加载临时记忆失败: {e}", exc_info=True) + logger.error(f"加载临时记忆失败: {e}") return [] async def create_backup(self) -> Path | None: @@ -359,13 +349,13 @@ class PersistenceManager: # 清理旧备份(只保留最近10个) await self._cleanup_old_backups(keep=10) - logger.info(f"备份创建成功: {backup_file}") + logger.debug(f"备份创建成功: {backup_file}") return backup_file return None except Exception as e: - logger.error(f"创建备份失败: {e}", exc_info=True) + logger.error(f"创建备份失败: {e}") return None async def _load_from_backup(self) -> GraphStore | None: @@ -401,12 +391,12 @@ class PersistenceManager: return None graph_store = GraphStore.from_dict(data) - logger.info(f"从备份恢复成功: {graph_store.get_statistics()}") + logger.debug(f"从备份恢复成功: {graph_store.get_statistics()}") return graph_store except Exception as e: - logger.error(f"从备份恢复失败: {e}", exc_info=True) + logger.error(f"从备份恢复失败: {e}") return None async def _cleanup_old_backups(self, keep: int = 10) -> None: @@ -446,7 +436,7 @@ class PersistenceManager: self._running = True async def auto_save_loop(): - logger.info(f"自动保存任务已启动,间隔: {self.auto_save_interval}秒") + logger.debug(f"自动保存任务已启动,间隔: {self.auto_save_interval}秒") while self._running: try: @@ -470,9 +460,7 @@ class PersistenceManager: await self.create_backup() except Exception as e: - logger.error(f"自动保存失败: {e}", exc_info=True) - - logger.info("自动保存任务已停止") + logger.error(f"自动保存失败: {e}") self._auto_save_task = asyncio.create_task(auto_save_loop()) @@ -481,7 +469,7 @@ class PersistenceManager: self._running = False if self._auto_save_task: self._auto_save_task.cancel() - logger.info("自动保存任务已取消") + logger.debug("自动保存任务已取消") async def export_to_json(self, output_file: Path, graph_store: GraphStore) -> None: """ @@ -505,10 +493,8 @@ class PersistenceManager: json_str = json.dumps(data, ensure_ascii=False, indent=2) await f.write(json_str) - logger.info(f"图数据已导出: {output_file}") - except Exception as e: - logger.error(f"导出图数据失败: {e}", exc_info=True) + logger.error(f"导出图数据失败: {e}") raise async def import_from_json(self, input_file: Path) -> GraphStore | None: @@ -527,12 +513,10 @@ class PersistenceManager: data = json.loads(content) graph_store = GraphStore.from_dict(data) - logger.info(f"图数据已导入: {graph_store.get_statistics()}") - return graph_store except Exception as e: - logger.error(f"导入图数据失败: {e}", exc_info=True) + logger.error(f"导入图数据失败: {e}") raise def get_data_size(self) -> dict[str, int]: diff --git a/src/memory_graph/storage/vector_store.py b/src/memory_graph/storage/vector_store.py index 07506c570..e61153119 100644 --- a/src/memory_graph/storage/vector_store.py +++ b/src/memory_graph/storage/vector_store.py @@ -47,8 +47,6 @@ class VectorStore: self.collection = None self.embedding_function = embedding_function - logger.info(f"初始化向量存储: collection={collection_name}, dir={self.data_dir}") - async def initialize(self) -> None: """异步初始化 ChromaDB""" try: @@ -70,10 +68,10 @@ class VectorStore: metadata={"description": "Memory graph node embeddings"}, ) - logger.info(f"ChromaDB 初始化完成,集合包含 {self.collection.count()} 个节点") + logger.debug(f"ChromaDB 初始化完成,集合包含 {self.collection.count()} 个节点") except Exception as e: - logger.error(f"初始化 ChromaDB 失败: {e}", exc_info=True) + logger.error(f"初始化 ChromaDB 失败: {e}") raise async def add_node(self, node: MemoryNode) -> None: @@ -118,7 +116,7 @@ class VectorStore: logger.debug(f"添加节点到向量存储: {node}") except Exception as e: - logger.error(f"添加节点失败: {e}", exc_info=True) + logger.error(f"添加节点失败: {e}") raise async def add_nodes_batch(self, nodes: list[MemoryNode]) -> None: @@ -164,10 +162,8 @@ class VectorStore: documents=[n.content for n in valid_nodes], ) - logger.info(f"批量添加 {len(valid_nodes)} 个节点到向量存储") - except Exception as e: - logger.error(f"批量添加节点失败: {e}", exc_info=True) + logger.error(f"批量添加节点失败: {e}") raise async def search_similar_nodes( @@ -237,7 +233,7 @@ class VectorStore: return similar_nodes except Exception as e: - logger.error(f"相似节点搜索失败: {e}", exc_info=True) + logger.error(f"相似节点搜索失败: {e}") raise async def search_with_multiple_queries( @@ -344,15 +340,10 @@ class VectorStore: fused_results.sort(key=lambda x: x[1], reverse=True) final_results = fused_results[:limit] - logger.info( - f"多查询融合搜索完成: {len(query_embeddings)} 个查询, " - f"融合后 {len(fused_results)} 个结果, 返回 {len(final_results)} 个" - ) - return final_results except Exception as e: - logger.error(f"多查询融合搜索失败: {e}", exc_info=True) + logger.error(f"多查询融合搜索失败: {e}") raise async def get_node_by_id(self, node_id: str) -> dict[str, Any] | None: @@ -387,7 +378,7 @@ class VectorStore: return None except Exception as e: - logger.error(f"获取节点失败: {e}", exc_info=True) + logger.error(f"获取节点失败: {e}") return None async def delete_node(self, node_id: str) -> None: @@ -405,7 +396,7 @@ class VectorStore: logger.debug(f"删除节点: {node_id}") except Exception as e: - logger.error(f"删除节点失败: {e}", exc_info=True) + logger.error(f"删除节点失败: {e}") raise async def update_node_embedding(self, node_id: str, embedding: np.ndarray) -> None: @@ -424,7 +415,7 @@ class VectorStore: logger.debug(f"更新节点 embedding: {node_id}") except Exception as e: - logger.error(f"更新节点 embedding 失败: {e}", exc_info=True) + logger.error(f"更新节点 embedding 失败: {e}") raise def get_total_count(self) -> int: @@ -448,5 +439,5 @@ class VectorStore: logger.warning(f"向量存储已清空: {self.collection_name}") except Exception as e: - logger.error(f"清空向量存储失败: {e}", exc_info=True) + logger.error(f"清空向量存储失败: {e}") raise diff --git a/src/memory_graph/tools/memory_tools.py b/src/memory_graph/tools/memory_tools.py index 69fc6f450..46de157bb 100644 --- a/src/memory_graph/tools/memory_tools.py +++ b/src/memory_graph/tools/memory_tools.py @@ -5,6 +5,7 @@ LLM 工具接口:定义记忆系统的工具 schema 和执行逻辑 from __future__ import annotations import asyncio +import logging from typing import Any from src.common.logger import get_logger @@ -82,13 +83,7 @@ class MemoryTools: self.search_min_importance = search_min_importance self.search_similarity_threshold = search_similarity_threshold - logger.info( - f"MemoryTools 初始化: max_expand_depth={max_expand_depth}, " - f"expand_semantic_threshold={expand_semantic_threshold}, " - f"search_top_k={search_top_k}, " - f"权重配置: vector={search_vector_weight}, importance={search_importance_weight}, recency={search_recency_weight}, " - f"阈值过滤: min_importance={search_min_importance}, similarity_threshold={search_similarity_threshold}" - ) + logger.debug(f"MemoryTools 初始化完成") # 初始化组件 self.extractor = MemoryExtractor() @@ -362,7 +357,7 @@ class MemoryTools: 执行结果 """ try: - logger.info(f"创建记忆: {params.get('subject')} - {params.get('topic')}") + logger.debug(f"创建记忆: {params.get('subject')} - {params.get('topic')}") # 0. 确保初始化 await self._ensure_initialized() @@ -379,7 +374,7 @@ class MemoryTools: # 4. 异步保存到磁盘(不阻塞当前操作) asyncio.create_task(self._async_save_graph_store()) - logger.info(f"记忆创建成功: {memory.id}") + logger.debug(f"记忆创建成功: {memory.id}") return { "success": True, @@ -390,7 +385,7 @@ class MemoryTools: } except Exception as e: - logger.error(f"记忆创建失败: {e}", exc_info=True) + logger.error(f"记忆创建失败: {e}") return { "success": False, "error": str(e), @@ -408,7 +403,7 @@ class MemoryTools: 执行结果 """ try: - logger.info( + logger.debug( f"关联记忆: {params.get('source_memory_description')} -> " f"{params.get('target_memory_description')}" ) @@ -459,7 +454,7 @@ class MemoryTools: # 5. 异步保存(不阻塞当前操作) asyncio.create_task(self._async_save_graph_store()) - logger.info(f"记忆关联成功: {source_memory.id} -> {target_memory.id}") + logger.debug(f"记忆关联成功: {source_memory.id} -> {target_memory.id}") return { "success": True, @@ -470,7 +465,7 @@ class MemoryTools: } except Exception as e: - logger.error(f"记忆关联失败: {e}", exc_info=True) + logger.error(f"记忆关联失败: {e}") return { "success": False, "error": str(e), @@ -506,10 +501,7 @@ class MemoryTools: prefer_node_types = params.get("prefer_node_types", []) # 🆕 优先节点类型 context = params.get("context", None) - logger.info( - f"搜索记忆: {query} (top_k={top_k}, expand_depth={expand_depth}, " - f"multi_query={use_multi_query}, prefer_types={prefer_node_types})" - ) + logger.info(f"搜索记忆: {query} (返回{top_k}条)") # 0. 确保初始化 await self._ensure_initialized() @@ -527,7 +519,7 @@ class MemoryTools: # 合并用户指定的偏好类型和LLM识别的偏好类型 all_prefer_types = list(set(prefer_node_types + llm_prefer_types)) if all_prefer_types: - logger.info(f"最终偏好节点类型: {all_prefer_types} (用户指定: {prefer_node_types}, LLM识别: {llm_prefer_types})") + logger.debug(f"最终偏好节点类型: {all_prefer_types} (用户指定: {prefer_node_types}, LLM识别: {llm_prefer_types})") # 更新prefer_node_types用于后续评分 prefer_node_types = all_prefer_types @@ -552,19 +544,20 @@ class MemoryTools: if mem_id not in memory_scores or similarity > memory_scores[mem_id]: memory_scores[mem_id] = similarity - # 🔥 详细日志:检查初始召回情况 - logger.info( - f"初始向量搜索: 返回{len(similar_nodes)}个节点 → " - f"提取{len(initial_memory_ids)}条记忆" - ) + # 检查初始召回情况 + if logger.isEnabledFor(logging.DEBUG): + logger.debug( + f"初始向量搜索: 返回{len(similar_nodes)}个节点 → " + f"提取{len(initial_memory_ids)}条记忆" + ) if len(initial_memory_ids) == 0: logger.warning( "⚠️ 向量搜索未找到任何记忆!" "可能原因:1) 嵌入模型理解问题 2) 记忆节点未建立索引 3) 查询表达与存储内容差异过大" ) # 输出相似节点的详细信息用于调试 - if similar_nodes: - logger.debug(f"向量搜索返回的节点元数据样例: {similar_nodes[0][2] if len(similar_nodes) > 0 else 'None'}") + if logger.isEnabledFor(logging.DEBUG) and similar_nodes: + logger.debug(f"向量搜索返回的节点元数据样例: {similar_nodes[0][2]}") elif len(initial_memory_ids) < 3: logger.warning(f"⚠️ 初始召回记忆数量较少({len(initial_memory_ids)}条),可能影响结果质量") @@ -584,8 +577,9 @@ class MemoryTools: if query_embedding is not None: if use_path_expansion: - # 🆕 使用路径评分扩展算法 - logger.info(f"🔬 使用路径评分扩展算法: 初始{len(similar_nodes)}个节点, 深度={expand_depth}") + # 使用路径评分扩展算法 + if logger.isEnabledFor(logging.DEBUG): + logger.debug(f"使用路径评分扩展算法: 初始{len(similar_nodes)}个节点, 深度={expand_depth}") # 延迟初始化路径扩展器 if self.path_expander is None: @@ -618,7 +612,7 @@ class MemoryTools: # 路径扩展返回的是 [(Memory, final_score, paths), ...] # 我们需要直接返回这些记忆,跳过后续的传统评分 - logger.info(f"✅ 路径扩展返回 {len(path_results)} 条记忆") + logger.debug(f"✅ 路径扩展返回 {len(path_results)} 条记忆") # 直接构建返回结果 path_memories = [] @@ -635,7 +629,7 @@ class MemoryTools: } }) - logger.info(f"🎯 路径扩展最终返回: {len(path_memories)} 条记忆") + logger.debug(f"路径扩展最终返回: {len(path_memories)} 条记忆") return { "success": True, @@ -645,7 +639,7 @@ class MemoryTools: } except Exception as e: - logger.error(f"路径扩展失败: {e}", exc_info=True) + logger.error(f"路径扩展失败: {e}") # 路径扩展失败,不再回退到旧的图扩展算法 # 4. 合并初始记忆和扩展记忆 @@ -668,16 +662,10 @@ class MemoryTools: reverse=True ) # 🔥 不再提前截断,让所有候选参与详细评分 - # 🔍 统计初始记忆的相似度分布(用于诊断) - if memory_scores: + # 统计初始记忆的相似度分布(用于诊断) + if logger.isEnabledFor(logging.DEBUG) and memory_scores: similarities = list(memory_scores.values()) - logger.info( - f"📊 向量相似度分布: 最高={max(similarities):.3f}, " - f"最低={min(similarities):.3f}, " - f"平均={sum(similarities)/len(similarities):.3f}, " - f">0.3: {len([s for s in similarities if s > 0.3])}/{len(similarities)}, " - f">0.2: {len([s for s in similarities if s > 0.2])}/{len(similarities)}" - ) + logger.debug(f"向量相似度分布: 最高={max(similarities):.3f}, 最低={min(similarities):.3f}, 平均={sum(similarities)/len(similarities):.3f}") # 5. 获取完整记忆并进行最终排序(优化后的动态权重系统) memories_with_scores = [] @@ -787,28 +775,24 @@ class MemoryTools: # if not is_initial_memory and some_score < threshold: # continue - # 记录通过过滤的记忆(用于调试) - if is_initial_memory: - logger.debug( - f"✅ 保留 {memory.id[:8]} [初始]: 相似度={true_similarity:.3f}, " - f"重要性={memory.importance:.2f}, 综合分数={final_score:.4f}" - ) - else: - logger.debug( - f"✅ 保留 {memory.id[:8]} [扩展]: 重要性={memory.importance:.2f}, " - f"综合分数={final_score:.4f}" - ) + # 记录通过过滤的记忆(仅保留关键信息用于调试) + if logger.isEnabledFor(logging.DEBUG): + if is_initial_memory: + logger.debug(f"保留记忆 {memory.id[:8]} [初始]: 相似度={true_similarity:.3f}, 综合分数={final_score:.4f}") + else: + logger.debug(f"保留记忆 {memory.id[:8]} [扩展]: 综合分数={final_score:.4f}") # 🆕 节点类型加权:对REFERENCE/ATTRIBUTE节点额外加分(促进事实性信息召回) if "REFERENCE" in node_types_count or "ATTRIBUTE" in node_types_count: final_score *= 1.1 # 10% 加成 - # 🆕 用户指定的优先节点类型额外加权 + # 用户指定的优先节点类型额外加权 if prefer_node_types: for prefer_type in prefer_node_types: if prefer_type in node_types_count: final_score *= 1.15 # 15% 额外加成 - logger.debug(f"记忆 {memory.id[:8]} 包含优先节点类型 {prefer_type},加权后分数: {final_score:.4f}") + if logger.isEnabledFor(logging.DEBUG): + logger.debug(f"记忆 {memory.id[:8]} 包含优先节点类型 {prefer_type},加权后分数: {final_score:.4f}") break memories_with_scores.append((memory, final_score, dominant_node_type)) @@ -834,13 +818,7 @@ class MemoryTools: } results.append(result) - logger.info( - f"搜索完成: 初始{len(initial_memory_ids)}个 → " - f"扩展{len(expanded_memory_scores)}个 → " - f"候选{total_candidates}个 → " - f"过滤{filtered_count}个 (重要性过滤) → " - f"最终返回{len(results)}条记忆" - ) + logger.info(f"搜索完成: 初始{len(initial_memory_ids)}个 → 最终返回{len(results)}条记忆") # 如果过滤率过高,发出警告 if total_candidates > 0: @@ -863,7 +841,7 @@ class MemoryTools: } except Exception as e: - logger.error(f"记忆搜索失败: {e}", exc_info=True) + logger.error(f"记忆搜索失败: {e}") return { "success": False, "error": str(e), @@ -1087,10 +1065,8 @@ class MemoryTools: prefer_node_types = [t for t in prefer_node_types if t in valid_types] if result_queries: - logger.info( - f"生成查询: {[q for q, _ in result_queries]} " - f"(偏好类型: {prefer_node_types if prefer_node_types else '无'})" - ) + if logger.isEnabledFor(logging.DEBUG): + logger.debug(f"生成{len(result_queries)}个查询,偏好类型: {prefer_node_types if prefer_node_types else '无'}") return result_queries, prefer_node_types except Exception as e: @@ -1129,9 +1105,8 @@ class MemoryTools: min_similarity=0.0, # 不在这里过滤,交给后续评分 ) - logger.debug(f"单查询向量搜索: 查询='{query}', 返回节点数={len(similar_nodes)}") - if similar_nodes: - logger.debug(f"Top 3相似度: {[f'{sim:.3f}' for _, sim, _ in similar_nodes[:3]]}") + if logger.isEnabledFor(logging.DEBUG): + logger.debug(f"单查询搜索: 返回{len(similar_nodes)}个节点") return similar_nodes @@ -1160,7 +1135,8 @@ class MemoryTools: # 1. 使用小模型生成多个查询 + 节点类型识别 multi_queries, prefer_node_types = await self._generate_multi_queries_simple(query, context) - logger.debug(f"生成 {len(multi_queries)} 个查询: {multi_queries}, 偏好类型: {prefer_node_types}") + if logger.isEnabledFor(logging.DEBUG): + logger.debug(f"多查询搜索: 生成{len(multi_queries)}个查询,偏好类型: {prefer_node_types}") # 2. 生成所有查询的嵌入 if not self.builder.embedding_generator: @@ -1193,14 +1169,13 @@ class MemoryTools: fusion_strategy="weighted_max", ) - logger.info(f"多查询检索完成: {len(similar_nodes)} 个节点 (偏好类型: {prefer_node_types})") - if similar_nodes: - logger.debug(f"Top 5融合相似度: {[f'{sim:.3f}' for _, sim, _ in similar_nodes[:5]]}") + if logger.isEnabledFor(logging.DEBUG): + logger.debug(f"多查询检索完成: {len(similar_nodes)}个节点,偏好类型: {prefer_node_types}") return similar_nodes, prefer_node_types except Exception as e: - logger.warning(f"多查询搜索失败,回退到单查询模式: {e}", exc_info=True) + logger.warning(f"多查询搜索失败,回退到单查询模式: {e}") single_results = await self._single_query_search(query, top_k) return single_results, [] @@ -1234,7 +1209,8 @@ class MemoryTools: # 如果嵌入生成失败,无法进行语义搜索 if query_embedding is None: - logger.debug("嵌入生成失败,跳过描述搜索") + if logger.isEnabledFor(logging.DEBUG): + logger.debug("嵌入生成失败,跳过描述搜索") return None # 搜索相似节点 @@ -1311,6 +1287,7 @@ class MemoryTools: return await self.persistence_manager.save_graph_store(self.graph_store) - logger.debug("异步保存图数据成功") + if logger.isEnabledFor(logging.DEBUG): + logger.debug("异步保存图数据成功") except Exception as e: - logger.error(f"异步保存图数据失败: {e}", exc_info=True) + logger.error(f"异步保存图数据失败: {e}") diff --git a/src/memory_graph/unified_manager.py b/src/memory_graph/unified_manager.py index 7f033d682..1b4a7dbd5 100644 --- a/src/memory_graph/unified_manager.py +++ b/src/memory_graph/unified_manager.py @@ -122,7 +122,7 @@ class UnifiedMemoryManager: return try: - logger.info("开始初始化统一记忆管理器...") + logger.debug("开始初始化统一记忆管理器...") # 初始化底层 MemoryManager(长期记忆) if self.memory_manager is None: @@ -132,7 +132,7 @@ class UnifiedMemoryManager: self.memory_manager = MemoryManager(data_dir=self.data_dir) await self.memory_manager.initialize() else: - logger.info("使用外部提供的 MemoryManager") + logger.debug("使用外部提供的 MemoryManager") # 确保外部 MemoryManager 已初始化 if not getattr(self.memory_manager, "_initialized", False): await self.memory_manager.initialize() @@ -165,7 +165,7 @@ class UnifiedMemoryManager: self._start_auto_transfer_task() except Exception as e: - logger.error(f"统一记忆管理器初始化失败: {e}", exc_info=True) + logger.error(f"统一记忆管理器初始化失败: {e}") raise async def add_message(self, message: dict[str, Any]) -> MemoryBlock | None: @@ -244,7 +244,7 @@ class UnifiedMemoryManager: ] if blocks_to_transfer: - logger.info( + logger.debug( f"检测到 {len(blocks_to_transfer)} 个感知记忆需要转移,已交由后台后处理任务执行" ) for block in blocks_to_transfer: @@ -254,11 +254,6 @@ class UnifiedMemoryManager: result["perceptual_blocks"] = perceptual_blocks result["short_term_memories"] = short_term_memories - logger.info( - f"初步检索: 感知记忆 {len(perceptual_blocks)} 块, " - f"短期记忆 {len(short_term_memories)} 条" - ) - # 步骤2: 裁判模型评估 if use_judge: judge_decision = await self._judge_retrieval_sufficiency( @@ -291,7 +286,7 @@ class UnifiedMemoryManager: return result except Exception as e: - logger.error(f"智能检索失败: {e}", exc_info=True) + logger.error(f"智能检索失败: {e}") return { "perceptual_blocks": [], "short_term_memories": [], @@ -396,11 +391,10 @@ class UnifiedMemoryManager: missing_aspects=data.get("missing_aspects", []), ) - logger.info(f"裁判决策: {decision}") return decision except Exception as e: - logger.error(f"裁判模型评估失败: {e}", exc_info=True) + logger.error(f"裁判模型评估失败: {e}") # 默认判定为不充足,需要检索长期记忆 return JudgeDecision( is_sufficient=False, @@ -428,7 +422,7 @@ class UnifiedMemoryManager: except asyncio.CancelledError: logger.info(f"{task_name} 后台任务已取消") except Exception as exc: - logger.error(f"{task_name} 后台任务失败: {exc}", exc_info=True) + logger.error(f"{task_name} 后台任务失败: {exc}") task.add_done_callback(_callback) @@ -460,7 +454,7 @@ class UnifiedMemoryManager: async def _transfer_blocks_to_short_term(self, blocks: list[MemoryBlock]) -> None: """实际转换逻辑在后台执行""" - logger.info(f"正在后台处理 {len(blocks)} 个感知记忆块") + logger.debug(f"正在后台处理 {len(blocks)} 个感知记忆块") for block in blocks: try: stm = await self.short_term_manager.add_from_block(block) @@ -469,9 +463,9 @@ class UnifiedMemoryManager: await self.perceptual_manager.remove_block(block.id) self._trigger_transfer_wakeup() - logger.info(f"✓ 记忆块 {block.id} 已被转移到短期记忆 {stm.id}") + logger.debug(f"✓ 记忆块 {block.id} 已被转移到短期记忆 {stm.id}") except Exception as exc: - logger.error(f"后台转移失败,记忆块 {block.id}: {exc}", exc_info=True) + logger.error(f"后台转移失败,记忆块 {block.id}: {exc}") def _build_manual_multi_queries(self, queries: list[str]) -> list[dict[str, float]]: """去重裁判查询并附加权重以进行多查询搜索""" @@ -522,9 +516,6 @@ class UnifiedMemoryManager: unique_memories = self._deduplicate_memories(memories) query_count = len(manual_queries) if manual_queries else 1 - logger.info( - f"Long-term retrieval done: {len(unique_memories)} hits (queries fused={query_count})" - ) return unique_memories def _deduplicate_memories(self, memories: list[Any]) -> list[Any]: @@ -556,7 +547,7 @@ class UnifiedMemoryManager: self._transfer_wakeup_event.clear() self._auto_transfer_task = asyncio.create_task(self._auto_transfer_loop()) - logger.info("自动转移任务已启动") + logger.debug("自动转移任务已启动") async def _auto_transfer_loop(self) -> None: """自动转移循环(批量缓存模式)""" @@ -594,7 +585,7 @@ class UnifiedMemoryManager: added += 1 if added: - logger.info( + logger.debug( f"自动转移缓存: 新增{added}条, 当前缓存{len(transfer_cache)}/{cache_size_threshold}" ) @@ -610,7 +601,7 @@ class UnifiedMemoryManager: ) if should_transfer and transfer_cache: - logger.info( + logger.debug( f"准备批量转移: {len(transfer_cache)}条短期记忆到长期记忆 (占用率 {occupancy_ratio:.0%})" ) @@ -629,13 +620,13 @@ class UnifiedMemoryManager: cached_ids.difference_update(transferred_ids) last_transfer_time = time.monotonic() - logger.info(f"✅ 批量转移完成: {result}") + logger.debug(f"✅ 批量转移完成: {result}") except asyncio.CancelledError: - logger.info("自动转移循环被取消") + logger.debug("自动转移循环被取消") break except Exception as e: - logger.error(f"自动转移循环异常: {e}", exc_info=True) + logger.error(f"自动转移循环异常: {e}") async def manual_transfer(self) -> dict[str, Any]: """ @@ -651,7 +642,6 @@ class UnifiedMemoryManager: memories_to_transfer = self.short_term_manager.get_memories_for_transfer() if not memories_to_transfer: - logger.info("没有需要转移的短期记忆") return {"message": "没有需要转移的记忆", "transferred_count": 0} # 执行转移 @@ -667,7 +657,7 @@ class UnifiedMemoryManager: return result except Exception as e: - logger.error(f"手动转移失败: {e}", exc_info=True) + logger.error(f"手动转移失败: {e}") return {"error": str(e), "transferred_count": 0} def get_statistics(self) -> dict[str, Any]: @@ -719,4 +709,4 @@ class UnifiedMemoryManager: logger.info("✅ 统一记忆管理器已关闭") except Exception as e: - logger.error(f"关闭统一记忆管理器失败: {e}", exc_info=True) + logger.error(f"关闭统一记忆管理器失败: {e}") diff --git a/src/memory_graph/utils/embeddings.py b/src/memory_graph/utils/embeddings.py index 5f7836914..58752a25d 100644 --- a/src/memory_graph/utils/embeddings.py +++ b/src/memory_graph/utils/embeddings.py @@ -101,7 +101,7 @@ class EmbeddingGenerator: return None except Exception as e: - logger.error(f"❌ 嵌入生成异常: {e}", exc_info=True) + logger.error(f"❌ 嵌入生成异常: {e}") return None async def _generate_with_api(self, text: str) -> np.ndarray | None: @@ -171,7 +171,7 @@ class EmbeddingGenerator: return results except Exception as e: - logger.error(f"批量生成嵌入失败: {e}", exc_info=True) + logger.error(f"批量生成嵌入失败: {e}") return [None for _ in texts] async def _generate_batch_with_api(self, texts: list[str]) -> list[np.ndarray | None] | None: diff --git a/src/memory_graph/utils/path_expansion.py b/src/memory_graph/utils/path_expansion.py index d6b05b862..8f34bfae8 100644 --- a/src/memory_graph/utils/path_expansion.py +++ b/src/memory_graph/utils/path_expansion.py @@ -126,7 +126,7 @@ class PathScoreExpansion: self._neighbor_cache: dict[str, list[Any]] = {} self._node_score_cache: dict[str, float] = {} - logger.info( + logger.debug( f"PathScoreExpansion 初始化: max_hops={self.config.max_hops}, " f"damping={self.config.damping_factor}, " f"merge_strategy={self.config.path_merge_strategy}" @@ -164,7 +164,7 @@ class PathScoreExpansion: # 保存偏好类型 self.prefer_node_types = prefer_node_types or [] if self.prefer_node_types: - logger.info(f"🎯 偏好节点类型: {self.prefer_node_types}") + logger.debug(f"偏好节点类型: {self.prefer_node_types}") # 1. 初始化路径 active_paths = [] @@ -175,7 +175,7 @@ class PathScoreExpansion: active_paths.append(path) best_score_to_node[node_id] = score - logger.info(f"🚀 路径扩展开始: {len(active_paths)} 条初始路径") + logger.debug(f"路径扩展开始: {len(active_paths)} 条初始路径") # 2. 多跳扩展 hop_stats = [] # 每跳统计信息 @@ -284,8 +284,8 @@ class PathScoreExpansion: if self.config.enable_early_stop and prev_path_count > 0: growth_rate = (len(active_paths) - prev_path_count) / prev_path_count if growth_rate < self.config.early_stop_growth_threshold: - logger.info( - f"⏸️ 早停触发: 路径增长率 {growth_rate:.2%} < {self.config.early_stop_growth_threshold:.0%}, " + logger.debug( + f"早停触发: 路径增长率 {growth_rate:.2%} < {self.config.early_stop_growth_threshold:.0%}, " f"在第 {hop+1}/{self.config.max_hops} 跳停止" ) hop_time = time.time() - hop_start @@ -325,16 +325,16 @@ class PathScoreExpansion: # 早停:如果没有新路径 if not active_paths: - logger.info(f"⏹️ 提前停止:第 {hop+1} 跳无新路径") + logger.debug(f"提前停止:第 {hop+1} 跳无新路径") break # 3. 提取叶子路径(最小子路径) leaf_paths = self._extract_leaf_paths(active_paths) - logger.info(f"📊 提取 {len(leaf_paths)} 条叶子路径") + logger.debug(f"提取 {len(leaf_paths)} 条叶子路径") # 4. 路径到记忆的映射 memory_paths = await self._map_paths_to_memories(leaf_paths) - logger.info(f"🔗 映射到 {len(memory_paths)} 条候选记忆") + logger.debug(f"映射到 {len(memory_paths)} 条候选记忆") # 🚀 4.5. 粗排过滤:在详细评分前过滤掉低质量记忆 if len(memory_paths) > self.config.max_candidate_memories: @@ -357,8 +357,8 @@ class PathScoreExpansion: if mem_id in retained_mem_ids } - logger.info( - f"⚡ 粗排过滤: {len(memory_scores_rough)} → {len(memory_paths)} 条候选记忆" + logger.debug( + f"粗排过滤: {len(memory_scores_rough)} → {len(memory_paths)} 条候选记忆" ) # 5. 最终评分 @@ -369,8 +369,8 @@ class PathScoreExpansion: result = scored_memories[:top_k] elapsed = time.time() - start_time - logger.info( - f"✅ 路径扩展完成: {len(initial_nodes)} 个初始节点 → " + logger.debug( + f"路径扩展完成: {len(initial_nodes)} 个初始节点 → " f"{len(result)} 条记忆 (耗时 {elapsed:.3f}s)" ) diff --git a/src/person_info/person_info.py b/src/person_info/person_info.py index 6165d1a2a..a42ec04f7 100644 --- a/src/person_info/person_info.py +++ b/src/person_info/person_info.py @@ -674,14 +674,14 @@ class PersonInfoManager: continue except Exception as e_query: logger.error( - f"数据库查询失败 (specific_value_list for {f_name}): {e_query!s}", exc_info=True + f"数据库查询失败 (specific_value_list for {f_name}): {e_query!s}" ) return found_results try: return await _db_get_specific_async(field_name) except Exception as e: - logger.error(f"执行 get_specific_value_list 时出错: {e!s}", exc_info=True) + logger.error(f"执行 get_specific_value_list 时出错: {e!s}") return {} async def get_or_create_person( diff --git a/src/person_info/relationship_fetcher.py b/src/person_info/relationship_fetcher.py index d1f3a5c21..db1722310 100644 --- a/src/person_info/relationship_fetcher.py +++ b/src/person_info/relationship_fetcher.py @@ -233,7 +233,7 @@ class RelationshipFetcher: relation_parts.append(f"你们的关系程度:{score_desc}({rel_data['relationship_score']:.2f})") except Exception as e: - logger.error(f"查询UserRelationships表失败: {e}", exc_info=True) + logger.error(f"查询UserRelationships表失败: {e}") # 构建最终的关系信息字符串 if relation_parts: diff --git a/src/plugin_system/apis/generator_api.py b/src/plugin_system/apis/generator_api.py index 8f6185972..8b1a764a5 100644 --- a/src/plugin_system/apis/generator_api.py +++ b/src/plugin_system/apis/generator_api.py @@ -67,7 +67,7 @@ async def get_replyer( request_type=request_type, ) except Exception as e: - logger.error(f"[GeneratorAPI] 获取回复器时发生意外错误: {e}", exc_info=True) + logger.error(f"[GeneratorAPI] 获取回复器时发生意外错误: {e}") traceback.print_exc() return None diff --git a/src/plugin_system/apis/permission_api.py b/src/plugin_system/apis/permission_api.py index ff482deab..37394267c 100644 --- a/src/plugin_system/apis/permission_api.py +++ b/src/plugin_system/apis/permission_api.py @@ -63,7 +63,6 @@ class PermissionAPI: def set_permission_manager(self, manager: IPermissionManager): self._permission_manager = manager - logger.info("权限管理器已设置") def _ensure_manager(self): if self._permission_manager is None: diff --git a/src/plugin_system/apis/send_api.py b/src/plugin_system/apis/send_api.py index 8b2412a17..17d77d09d 100644 --- a/src/plugin_system/apis/send_api.py +++ b/src/plugin_system/apis/send_api.py @@ -310,6 +310,15 @@ async def _send_to_target( timestamp=current_time, ) + # Use readable display text so binary/base64 payloads are not stored directly + display_message_for_db = display_message or "" + if not display_message_for_db: + if message_type in {"emoji", "image", "voice", "video", "file"}: + # Leave empty to keep processed_plain_text (e.g., generated descriptions) instead of raw payloads + display_message_for_db = "" + elif isinstance(content, str): + display_message_for_db = content + sent_msg = await heart_fc_sender.send_message( envelope, chat_stream=target_stream, @@ -317,7 +326,7 @@ async def _send_to_target( storage_message=storage_message, show_log=show_log, thinking_start_time=current_time, - display_message=display_message or (content if isinstance(content, str) else ""), + display_message=display_message_for_db, ) if sent_msg: diff --git a/src/plugin_system/apis/storage_api.py b/src/plugin_system/apis/storage_api.py index 04174052e..86147145e 100644 --- a/src/plugin_system/apis/storage_api.py +++ b/src/plugin_system/apis/storage_api.py @@ -92,7 +92,7 @@ class PluginStorage: os.makedirs(directory) logger.info(f"目录 '{directory}' 创建成功。") except Exception as e: - logger.error(f"创建存储目录时发生错误: {e}", exc_info=True) + logger.error(f"创建存储目录时发生错误: {e}") raise def _load_data(self) -> None: @@ -130,7 +130,7 @@ class PluginStorage: self._dirty = False # 保存后重置标志 logger.debug(f"插件 '{self.name}' 的数据已成功保存到磁盘。") except Exception as e: - logger.error(f"向 '{self.file_path}' 保存数据时发生错误: {e}", exc_info=True) + logger.error(f"向 '{self.file_path}' 保存数据时发生错误: {e}") raise def get(self, key: str, default: Any | None = None) -> Any: @@ -203,5 +203,5 @@ def get_local_storage(name: str) -> "PluginStorage": storage_instance = PluginStorageManager.get_storage(name) return storage_instance except Exception as e: - logger.critical(f"为插件 '{name}' 提供本地存储实例时发生严重错误: {e}", exc_info=True) + logger.critical(f"为插件 '{name}' 提供本地存储实例时发生严重错误: {e}") raise diff --git a/src/plugin_system/apis/unified_scheduler.py b/src/plugin_system/apis/unified_scheduler.py index c0af4db16..1ad5ef084 100644 --- a/src/plugin_system/apis/unified_scheduler.py +++ b/src/plugin_system/apis/unified_scheduler.py @@ -365,7 +365,6 @@ class UnifiedScheduler: logger.warning("调度器已在运行中") return - logger.info("正在启动统一调度器...") self._running = True self._stopping = False self._start_time = datetime.now() @@ -384,14 +383,14 @@ class UnifiedScheduler: except ImportError: logger.warning("无法导入 event_manager,事件触发功能将不可用") - logger.info("统一调度器已启动") + logger.debug("统一调度器已启动") async def stop(self) -> None: """停止调度器(优雅关闭)""" if not self._running: return - logger.info("正在停止统一调度器...") + logger.debug("正在停止统一调度器...") self._stopping = True self._running = False @@ -486,7 +485,7 @@ class UnifiedScheduler: logger.debug("调度器主循环被取消") break except Exception as e: - logger.error(f"调度器主循环发生错误: {e}", exc_info=True) + logger.error(f"调度器主循环发生错误: {e}") async def _deadlock_check_loop(self) -> None: """死锁检测循环""" @@ -504,7 +503,7 @@ class UnifiedScheduler: logger.debug("死锁检测循环被取消") break except Exception as e: - logger.error(f"死锁检测循环发生错误: {e}", exc_info=True) + logger.error(f"死锁检测循环发生错误: {e}") # 继续运行,不因单次错误停止 async def _cleanup_loop(self) -> None: @@ -522,7 +521,7 @@ class UnifiedScheduler: logger.debug("清理循环被取消") break except Exception as e: - logger.error(f"清理循环发生错误: {e}", exc_info=True) + logger.error(f"清理循环发生错误: {e}") # ==================== 任务触发逻辑 ==================== @@ -541,7 +540,7 @@ class UnifiedScheduler: if should_trigger: tasks_to_trigger.append(task) except Exception as e: - logger.error(f"检查任务 {task.task_name} 触发条件时出错: {e}", exc_info=True) + logger.error(f"检查任务 {task.task_name} 触发条件时出错: {e}") # 第二阶段:并发触发所有任务 if tasks_to_trigger: @@ -604,7 +603,7 @@ class UnifiedScheduler: result = condition_func() return bool(result) except Exception as e: - logger.error(f"执行任务 {task.task_name} 的自定义条件函数时出错: {e}", exc_info=True) + logger.error(f"执行任务 {task.task_name} 的自定义条件函数时出错: {e}") return False async def _trigger_tasks_concurrently(self, tasks: list[ScheduleTask]) -> None: @@ -659,7 +658,7 @@ class UnifiedScheduler: except Exception as e: # 任务执行失败 - logger.error(f"任务 {task.task_name} 执行失败: {e}", exc_info=True) + logger.error(f"任务 {task.task_name} 执行失败: {e}") task.finish_execution(success=False, error=e) self._total_failures += 1 @@ -695,7 +694,7 @@ class UnifiedScheduler: ) return result except Exception as e: - logger.error(f"执行任务 {task.task_name} 的回调函数时出错: {e}", exc_info=True) + logger.error(f"执行任务 {task.task_name} 的回调函数时出错: {e}") raise def _acquire_semaphore(self): @@ -803,7 +802,7 @@ class UnifiedScheduler: raise except Exception as e: - logger.error(f"事件任务 {task.task_name} 执行失败: {e}", exc_info=True) + logger.error(f"事件任务 {task.task_name} 执行失败: {e}") task.finish_execution(success=False, error=e) self._total_failures += 1 @@ -823,7 +822,7 @@ class UnifiedScheduler: except RecursionError: logger.error("死锁检测发生递归错误,跳过本轮检测") except Exception as e: - logger.error(f"死锁检测处理失败: {e}", exc_info=True) + logger.error(f"死锁检测处理失败: {e}") async def _check_and_handle_deadlocks(self) -> None: """检查并处理死锁任务""" @@ -847,7 +846,7 @@ class UnifiedScheduler: try: await self._cancel_task(task, reason="deadlock detected") except Exception as e: - logger.error(f"取消任务 {task_name} 时出错: {e}", exc_info=True) + logger.error(f"取消任务 {task_name} 时出错: {e}") # 强制清理 task._asyncio_task = None task.status = TaskStatus.CANCELLED @@ -884,7 +883,7 @@ class UnifiedScheduler: break except Exception as e: - logger.error(f"取消任务 {task.task_name} 时发生异常: {e}", exc_info=True) + logger.error(f"取消任务 {task.task_name} 时发生异常: {e}") return False # 第三阶段:强制清理 @@ -1095,7 +1094,7 @@ class UnifiedScheduler: await exec_task return task.status == TaskStatus.COMPLETED except Exception as e: - logger.error(f"强制触发任务 {task.task_name} 失败: {e}", exc_info=True) + logger.error(f"强制触发任务 {task.task_name} 失败: {e}") return False async def pause_schedule(self, schedule_id: str) -> bool: @@ -1293,19 +1292,13 @@ async def initialize_scheduler(): 这个函数应该在 bot 启动时调用 """ try: - logger.info("正在启动统一调度器...") await unified_scheduler.start() logger.info("统一调度器启动成功") - # 获取初始统计信息 - stats = unified_scheduler.get_statistics() - logger.info(f"调度器状态: {stats}") - except Exception as e: - logger.error(f"启动统一调度器失败: {e}", exc_info=True) + logger.error(f"启动统一调度器失败: {e}") raise - async def shutdown_scheduler(): """关闭调度器 @@ -1329,4 +1322,4 @@ async def shutdown_scheduler(): logger.info("统一调度器已关闭") except Exception as e: - logger.error(f"关闭统一调度器失败: {e}", exc_info=True) + logger.error(f"关闭统一调度器失败: {e}") diff --git a/src/plugin_system/base/base_action.py b/src/plugin_system/base/base_action.py index 821954b57..bd325fb49 100644 --- a/src/plugin_system/base/base_action.py +++ b/src/plugin_system/base/base_action.py @@ -513,7 +513,7 @@ class BaseAction(ABC): return result except Exception as e: - logger.error(f"{log_prefix} 调用时发生错误: {e}", exc_info=True) + logger.error(f"{log_prefix} 调用时发生错误: {e}") return False, f"调用Action '{action_name}' 时发生错误: {e}" @classmethod diff --git a/src/plugin_system/base/base_adapter.py b/src/plugin_system/base/base_adapter.py index ac38d250f..ddfdd393a 100644 --- a/src/plugin_system/base/base_adapter.py +++ b/src/plugin_system/base/base_adapter.py @@ -179,7 +179,7 @@ class BaseAdapter(MoFoxAdapterBase, ABC): except asyncio.CancelledError: break except Exception as e: - logger.error(f"适配器 {self.adapter_name} 健康检查异常: {e}", exc_info=True) + logger.error(f"适配器 {self.adapter_name} 健康检查异常: {e}") async def health_check(self) -> bool: """ @@ -204,7 +204,7 @@ class BaseAdapter(MoFoxAdapterBase, ABC): await asyncio.sleep(2) # 等待一段时间再重连 await self.start() except Exception as e: - logger.error(f"适配器 {self.adapter_name} 重连失败: {e}", exc_info=True) + logger.error(f"适配器 {self.adapter_name} 重连失败: {e}") def get_subprocess_entry_path(self) -> Optional[Path]: """ diff --git a/src/plugin_system/base/plugin_base.py b/src/plugin_system/base/plugin_base.py index 844fd4804..4883c24af 100644 --- a/src/plugin_system/base/plugin_base.py +++ b/src/plugin_system/base/plugin_base.py @@ -141,7 +141,7 @@ class PluginBase(ABC): f.write(toml_str) logger.info(f"{self.log_prefix} 已生成默认配置文件: {config_file_path}") except OSError as e: - logger.error(f"{self.log_prefix} 保存默认配置文件失败: {e}", exc_info=True) + logger.error(f"{self.log_prefix} 保存默认配置文件失败: {e}") def _backup_config_file(self, config_file_path: str) -> str: """备份配置文件到指定的 backup 子目录""" @@ -158,7 +158,7 @@ class PluginBase(ABC): logger.info(f"{self.log_prefix} 配置文件已备份到: {backup_path}") return str(backup_path) except Exception as e: - logger.error(f"{self.log_prefix} 备份配置文件失败: {e}", exc_info=True) + logger.error(f"{self.log_prefix} 备份配置文件失败: {e}") return "" def _synchronize_config( @@ -285,7 +285,7 @@ class PluginBase(ABC): f.write(toml_str) logger.info(f"{self.log_prefix} 配置文件已保存: {config_file_path}") except OSError as e: - logger.error(f"{self.log_prefix} 保存配置文件失败: {e}", exc_info=True) + logger.error(f"{self.log_prefix} 保存配置文件失败: {e}") def _load_plugin_config(self): # sourcery skip: extract-method """ @@ -314,7 +314,7 @@ class PluginBase(ABC): shutil.move(plugin_config_path, user_config_path) logger.info(f"{self.log_prefix} 已将配置文件从 {plugin_config_path} 迁移到 {user_config_path}") except OSError as e: - logger.error(f"{self.log_prefix} 迁移配置文件失败: {e}", exc_info=True) + logger.error(f"{self.log_prefix} 迁移配置文件失败: {e}") # 如果用户配置文件仍然不存在,生成默认的 if not os.path.exists(user_config_path): @@ -333,7 +333,7 @@ class PluginBase(ABC): with open(user_config_path, encoding="utf-8") as f: user_config: dict[str, Any] = toml.load(f) or {} except Exception as e: - logger.error(f"{self.log_prefix} 加载用户配置文件 {user_config_path} 失败: {e}", exc_info=True) + logger.error(f"{self.log_prefix} 加载用户配置文件 {user_config_path} 失败: {e}") self.config = self._generate_config_from_schema() # 加载失败时使用默认 schema return diff --git a/src/plugin_system/base/plus_command.py b/src/plugin_system/base/plus_command.py index 7b43c6f79..dc39bbee8 100644 --- a/src/plugin_system/base/plus_command.py +++ b/src/plugin_system/base/plus_command.py @@ -384,7 +384,7 @@ def create_plus_command_adapter(plus_command_class): try: return await self.plus_command.execute(command_args) except Exception as e: - logger.error(f"执行命令时出错: {e}", exc_info=True) + logger.error(f"执行命令时出错: {e}") return False, f"命令执行出错: {e!s}", self.intercept_message return AdapterClass @@ -443,7 +443,7 @@ def create_legacy_command_adapter(legacy_command_class): # 旧的execute不接收args参数 return await self.legacy_command.execute() except Exception as e: - logger.error(f"执行旧版命令 '{self.command_name}' 时出错: {e}", exc_info=True) + logger.error(f"执行旧版命令 '{self.command_name}' 时出错: {e}") return False, f"命令执行出错: {e!s}", self.intercept_message return LegacyAdapter diff --git a/src/plugin_system/core/adapter_manager.py b/src/plugin_system/core/adapter_manager.py index ffb1359b4..44a2a1d65 100644 --- a/src/plugin_system/core/adapter_manager.py +++ b/src/plugin_system/core/adapter_manager.py @@ -28,8 +28,32 @@ logger = get_logger("adapter_manager") def _load_class(module_name: str, class_name: str): + """ + 从模块加载类。 + + 有时插件加载器会将适配器类注册到包名下(例如 ``src.plugins.built_in.napcat_adapter``), + 而实际的类定义在 ``plugin.py`` 中。当子进程仅导入包时,该属性缺失会引发 AttributeError。 + 该辅助函数现在回退到 ``.plugin`` 以支持这种布局。 + """ module = importlib.import_module(module_name) - return getattr(module, class_name) + if hasattr(module, class_name): + return getattr(module, class_name) + + # Fallback for packages that keep implementations in plugin.py + try: + plugin_module = importlib.import_module(f"{module_name}.plugin") + if hasattr(plugin_module, class_name): + return getattr(plugin_module, class_name) + except ModuleNotFoundError: + pass + except Exception: + logger.error( + f"Failed to load class {class_name} from fallback module {module_name}.plugin", + exc_info=True, + ) + + # If we reach here, the class is truly missing + raise AttributeError(f"module '{module_name}' has no attribute '{class_name}'") def _adapter_process_entry( @@ -127,7 +151,7 @@ class AdapterProcess: return True except Exception as e: - logger.error(f"启动适配器子进程 {self.adapter_name} 失败: {e}", exc_info=True) + logger.error(f"启动适配器子进程 {self.adapter_name} 失败: {e}") return False async def stop(self) -> None: @@ -154,7 +178,7 @@ class AdapterProcess: self.process.join() except Exception as e: - logger.error(f"停止适配器子进程 {self.adapter_name} 时发生错误: {e}", exc_info=True) + logger.error(f"停止适配器子进程 {self.adapter_name} 时发生错误: {e}") finally: self.process = None self._incoming_queue = None @@ -258,7 +282,7 @@ class AdapterManager: return True except Exception as e: - logger.error(f"启动适配器 {adapter_name} 失败: {e}", exc_info=True) + logger.error(f"启动适配器 {adapter_name} 失败: {e}") return False async def stop_adapter(self, adapter_name: str) -> None: @@ -280,7 +304,7 @@ class AdapterManager: await adapter.stop() logger.info(f"适配器 {adapter_name} 已从主进程中停止") except Exception as e: - logger.error(f"停止适配器 {adapter_name} 时出错: {e}", exc_info=True) + logger.error(f"停止适配器 {adapter_name} 时出错: {e}") async def start_all_adapters(self) -> None: """启动所有已注册的适配器""" @@ -358,4 +382,4 @@ def get_adapter_manager() -> AdapterManager: return _adapter_manager -__all__ = ["AdapterManager", "AdapterProcess", "get_adapter_manager"] \ No newline at end of file +__all__ = ["AdapterManager", "AdapterProcess", "get_adapter_manager"] diff --git a/src/plugin_system/core/component_registry.py b/src/plugin_system/core/component_registry.py index 9fc78caf0..357b843ed 100644 --- a/src/plugin_system/core/component_registry.py +++ b/src/plugin_system/core/component_registry.py @@ -428,7 +428,7 @@ class ComponentRegistry: return True except Exception as e: - logger.error(f"注册路由组件 '{router_info.name}' 时出错: {e}", exc_info=True) + logger.error(f"注册路由组件 '{router_info.name}' 时出错: {e}") return False def _register_adapter_component(self, adapter_info: AdapterInfo, adapter_class: type[BaseAdapter]) -> bool: diff --git a/src/plugin_system/core/event_manager.py b/src/plugin_system/core/event_manager.py index cdb3fdb19..fdd937035 100644 --- a/src/plugin_system/core/event_manager.py +++ b/src/plugin_system/core/event_manager.py @@ -342,7 +342,7 @@ class EventManager: # 使用 create_task 异步执行,避免死锁 asyncio.create_task(self._scheduler_callback(event_name, params)) except Exception as e: - logger.error(f"调用 scheduler 回调时出错: {e}", exc_info=True) + logger.error(f"调用 scheduler 回调时出错: {e}") timeout = handler_timeout if handler_timeout is not None else self._default_handler_timeout concurrency = max_concurrency if max_concurrency is not None else self._default_handler_concurrency diff --git a/src/plugin_system/core/permission_manager.py b/src/plugin_system/core/permission_manager.py index 6ef070237..e18093804 100644 --- a/src/plugin_system/core/permission_manager.py +++ b/src/plugin_system/core/permission_manager.py @@ -30,11 +30,11 @@ class PermissionManager(IPermissionManager): """异步初始化数据库连接""" self.engine = await get_engine() self.SessionLocal = async_sessionmaker(bind=self.engine) - logger.info("权限管理器初始化完成") + logger.debug("权限管理器初始化完成") def _load_master_users(self): """从配置文件加载Master用户列表""" - logger.info("开始从配置文件加载Master用户...") + logger.debug("开始从配置文件加载Master用户...") try: master_users_config = global_config.permission.master_users if not isinstance(master_users_config, list): @@ -61,7 +61,7 @@ class PermissionManager(IPermissionManager): logger.info(f"成功加载 {len(self._master_users)} 个Master用户") except Exception as e: - logger.error(f"加载Master用户配置时发生严重错误: {e}", exc_info=True) + logger.error(f"加载Master用户配置时发生严重错误: {e}") self._master_users = set() def reload_master_users(self): diff --git a/src/plugin_system/core/plugin_manager.py b/src/plugin_system/core/plugin_manager.py index 49f864b45..f2dc12d63 100644 --- a/src/plugin_system/core/plugin_manager.py +++ b/src/plugin_system/core/plugin_manager.py @@ -179,7 +179,7 @@ class PluginManager: error_msg = f"未知错误: {e!s}" self.failed_plugins[plugin_name] = error_msg logger.error(f"❌ 插件加载失败: {plugin_name} - {error_msg}") - logger.debug("详细错误信息: ", exc_info=True) + logger.debug("详细错误信息: ") return False, 1 async def _register_adapter_components(self, plugin_name: str, plugin_instance: PluginBase) -> None: @@ -238,7 +238,7 @@ class PluginManager: ) except Exception as e: - logger.error(f"处理插件 '{plugin_name}' 的适配器组件时出错: {e}", exc_info=True) + logger.error(f"处理插件 '{plugin_name}' 的适配器组件时出错: {e}") async def remove_registered_plugin(self, plugin_name: str) -> bool: """ @@ -682,7 +682,7 @@ class PluginManager: asyncio.run(component_registry.unregister_plugin(plugin_name)) except Exception as e: # 捕获并记录卸载阶段协程调用错误 logger.debug( - f"卸载插件时调用 component_registry.unregister_plugin 失败: {e}", exc_info=True + f"卸载插件时调用 component_registry.unregister_plugin 失败: {e}" ) # 从已加载插件中移除 @@ -700,7 +700,7 @@ class PluginManager: return True except Exception as e: - logger.error(f"❌ 插件卸载失败: {plugin_name} - {e!s}", exc_info=True) + logger.error(f"❌ 插件卸载失败: {plugin_name} - {e!s}") return False diff --git a/src/plugins/built_in/affinity_flow_chatter/core/affinity_interest_calculator.py b/src/plugins/built_in/affinity_flow_chatter/core/affinity_interest_calculator.py index 66ba4cee5..612654a0e 100644 --- a/src/plugins/built_in/affinity_flow_chatter/core/affinity_interest_calculator.py +++ b/src/plugins/built_in/affinity_flow_chatter/core/affinity_interest_calculator.py @@ -175,7 +175,7 @@ class AffinityInterestCalculator(BaseInterestCalculator): ) except Exception as e: - logger.error(f"Affinity兴趣值计算失败: {e}", exc_info=True) + logger.error(f"Affinity兴趣值计算失败: {e}") return InterestCalculationResult( success=False, message_id=getattr(message, "message_id", ""), interest_value=0.0, error_message=str(e) ) diff --git a/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_event.py b/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_event.py index 0d3f39aa8..2f8b4154f 100644 --- a/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_event.py +++ b/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_event.py @@ -92,7 +92,7 @@ class ProactiveThinkingReplyHandler(BaseEventHandler): logger.warning(f"❌ 重置聊天流 {stream_id} 主动思考任务失败") except Exception as e: - logger.error(f"❌ 处理reply事件时出错: {e}", exc_info=True) + logger.error(f"❌ 处理reply事件时出错: {e}") # 总是继续处理其他handler return HandlerResult(success=True, continue_process=True, message=None) @@ -165,7 +165,7 @@ class ProactiveThinkingMessageHandler(BaseEventHandler): logger.info(f"为新聊天流 {stream_id} 创建了主动思考任务") except Exception as e: - logger.error(f"处理消息事件时出错: {e}", exc_info=True) + logger.error(f"处理消息事件时出错: {e}") # 总是继续处理其他handler return HandlerResult(success=True, continue_process=True, message=None) diff --git a/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_executor.py b/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_executor.py index 14a52473a..25214cefb 100644 --- a/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_executor.py +++ b/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_executor.py @@ -255,7 +255,7 @@ class ProactiveThinkingPlanner: return context except Exception as e: - logger.error(f"搜集上下文信息失败: {e}", exc_info=True) + logger.error(f"搜集上下文信息失败: {e}") return None @cached(ttl=300, key_prefix="stream_impression") # 缓存5分钟 @@ -352,7 +352,7 @@ class ProactiveThinkingPlanner: return decision except Exception as e: - logger.error(f"决策过程失败: {e}", exc_info=True) + logger.error(f"决策过程失败: {e}") return None async def generate_reply( @@ -424,7 +424,7 @@ class ProactiveThinkingPlanner: return filtered_response except Exception as e: - logger.error(f"生成回复失败: {e}", exc_info=True) + logger.error(f"生成回复失败: {e}") return None async def _get_expression_habits(self, stream_id: str, chat_history: str) -> str: @@ -707,4 +707,4 @@ async def execute_proactive_thinking(stream_id: str): logger.info(f"[主动思考] 聊天流 {stream_id} 的主动思考执行完成") except Exception as e: - logger.error(f"[主动思考] 执行主动思考失败: {e}", exc_info=True) + logger.error(f"[主动思考] 执行主动思考失败: {e}") diff --git a/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_scheduler.py b/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_scheduler.py index 61c0e4146..b8f11ec9f 100644 --- a/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_scheduler.py +++ b/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_scheduler.py @@ -216,7 +216,7 @@ class ProactiveThinkingScheduler: return 0.5 except Exception as e: - logger.error(f"[调度器] ❌ 获取聊天流 {stream_id} 的 focus_energy 失败: {e}", exc_info=True) + logger.error(f"[调度器] ❌ 获取聊天流 {stream_id} 的 focus_energy 失败: {e}") return 0.5 async def schedule_proactive_thinking(self, stream_id: str) -> bool: @@ -280,7 +280,7 @@ class ProactiveThinkingScheduler: return True except Exception as e: - logger.error(f"❌ 创建主动思考任务失败 {stream_id}: {e}", exc_info=True) + logger.error(f"❌ 创建主动思考任务失败 {stream_id}: {e}") return False async def pause_proactive_thinking(self, stream_id: str, reason: str = "抛出话题") -> bool: @@ -340,7 +340,7 @@ class ProactiveThinkingScheduler: return success except Exception as e: - logger.error(f"❌ 恢复主动思考失败 {stream_id}: {e}", exc_info=True) + logger.error(f"❌ 恢复主动思考失败 {stream_id}: {e}") return False async def cancel_proactive_thinking(self, stream_id: str) -> bool: @@ -366,7 +366,7 @@ class ProactiveThinkingScheduler: return success except Exception as e: - logger.error(f"❌ 取消主动思考失败 {stream_id}: {e}", exc_info=True) + logger.error(f"❌ 取消主动思考失败 {stream_id}: {e}") return False async def is_paused(self, stream_id: str) -> bool: diff --git a/src/plugins/built_in/affinity_flow_chatter/tools/chat_stream_impression_tool.py b/src/plugins/built_in/affinity_flow_chatter/tools/chat_stream_impression_tool.py index e9357670c..936f160b8 100644 --- a/src/plugins/built_in/affinity_flow_chatter/tools/chat_stream_impression_tool.py +++ b/src/plugins/built_in/affinity_flow_chatter/tools/chat_stream_impression_tool.py @@ -131,7 +131,7 @@ class ChatStreamImpressionTool(BaseTool): return {"type": "chat_stream_impression_update", "id": stream_id, "content": result_text} except Exception as e: - logger.error(f"聊天流印象更新失败: {e}", exc_info=True) + logger.error(f"聊天流印象更新失败: {e}") return { "type": "error", "id": function_args.get("stream_id", "unknown"), @@ -222,7 +222,7 @@ class ChatStreamImpressionTool(BaseTool): raise ValueError(error_msg) except Exception as e: - logger.error(f"更新聊天流印象到数据库失败: {e}", exc_info=True) + logger.error(f"更新聊天流印象到数据库失败: {e}") raise diff --git a/src/plugins/built_in/affinity_flow_chatter/tools/user_profile_tool.py b/src/plugins/built_in/affinity_flow_chatter/tools/user_profile_tool.py index e980ff2fc..a2a0607d8 100644 --- a/src/plugins/built_in/affinity_flow_chatter/tools/user_profile_tool.py +++ b/src/plugins/built_in/affinity_flow_chatter/tools/user_profile_tool.py @@ -109,7 +109,7 @@ class UserProfileTool(BaseTool): } except Exception as e: - logger.error(f"用户画像更新失败: {e}", exc_info=True) + logger.error(f"用户画像更新失败: {e}") return { "type": "error", "id": function_args.get("target_user_id", "unknown"), @@ -199,7 +199,7 @@ class UserProfileTool(BaseTool): logger.info(f"用户画像已更新到数据库: {user_id}") except Exception as e: - logger.error(f"更新用户画像到数据库失败: {e}", exc_info=True) + logger.error(f"更新用户画像到数据库失败: {e}") raise diff --git a/src/plugins/built_in/anti_injection_plugin/checker.py b/src/plugins/built_in/anti_injection_plugin/checker.py index 68c1284e6..b7d363108 100644 --- a/src/plugins/built_in/anti_injection_plugin/checker.py +++ b/src/plugins/built_in/anti_injection_plugin/checker.py @@ -256,7 +256,7 @@ class AntiInjectionChecker(SecurityChecker): reason="LLM API不可用", ) except Exception as e: - logger.error(f"LLM检测失败: {e}", exc_info=True) + logger.error(f"LLM检测失败: {e}") return SecurityCheckResult( is_safe=True, level=SecurityLevel.SAFE, diff --git a/src/plugins/built_in/core_actions/emoji.py b/src/plugins/built_in/core_actions/emoji.py index 42343d11e..e3bbb79bf 100644 --- a/src/plugins/built_in/core_actions/emoji.py +++ b/src/plugins/built_in/core_actions/emoji.py @@ -328,5 +328,5 @@ class EmojiAction(BaseAction): return True, f"发送表情包: {emoji_description}" except Exception as e: - logger.error(f"{self.log_prefix} 表情动作执行失败: {e}", exc_info=True) + logger.error(f"{self.log_prefix} 表情动作执行失败: {e}") return False, f"表情发送失败: {e!s}" diff --git a/src/plugins/built_in/maizone_refactored/actions/read_feed_action.py b/src/plugins/built_in/maizone_refactored/actions/read_feed_action.py index ee0dd1fb6..f020e630b 100644 --- a/src/plugins/built_in/maizone_refactored/actions/read_feed_action.py +++ b/src/plugins/built_in/maizone_refactored/actions/read_feed_action.py @@ -78,6 +78,6 @@ class ReadFeedAction(BaseAction): return False, error_message except Exception as e: - logger.error(f"执行阅读说说动作时发生未知异常: {e}", exc_info=True) + logger.error(f"执行阅读说说动作时发生未知异常: {e}") await self.send_text("糟糕,在看说说的过程中网络好像出问题了...") return False, "动作执行异常" diff --git a/src/plugins/built_in/maizone_refactored/actions/send_feed_action.py b/src/plugins/built_in/maizone_refactored/actions/send_feed_action.py index d1dd41d90..71fe001e7 100644 --- a/src/plugins/built_in/maizone_refactored/actions/send_feed_action.py +++ b/src/plugins/built_in/maizone_refactored/actions/send_feed_action.py @@ -82,6 +82,6 @@ class SendFeedAction(BaseAction): return False, result.get("message", "未知错误") except Exception as e: - logger.error(f"执行发送说说动作时发生未知异常: {e}", exc_info=True) + logger.error(f"执行发送说说动作时发生未知异常: {e}") await self.send_text("糟糕,发送的时候网络好像波动了一下...") return False, "动作执行异常" diff --git a/src/plugins/built_in/maizone_refactored/commands/send_feed_command.py b/src/plugins/built_in/maizone_refactored/commands/send_feed_command.py index 20818f145..f5760f407 100644 --- a/src/plugins/built_in/maizone_refactored/commands/send_feed_command.py +++ b/src/plugins/built_in/maizone_refactored/commands/send_feed_command.py @@ -59,6 +59,6 @@ class SendFeedCommand(PlusCommand): return False, result.get("message", "未知错误"), True except Exception as e: - logger.error(f"执行发送说说命令时发生未知异常: {e},它的类型是:{type(e)}", exc_info=True) + logger.error(f"执行发送说说命令时发生未知异常: {e},它的类型是:{type(e)}") await self.send_text("呜... 发送过程中好像出了点问题。") return False, "命令执行异常", True diff --git a/src/plugins/built_in/maizone_refactored/services/qzone_service.py b/src/plugins/built_in/maizone_refactored/services/qzone_service.py index 5e2d8411a..a46a61937 100644 --- a/src/plugins/built_in/maizone_refactored/services/qzone_service.py +++ b/src/plugins/built_in/maizone_refactored/services/qzone_service.py @@ -86,7 +86,7 @@ class QZoneService: return {"success": True, "message": story} return {"success": False, "message": "发布说说至QQ空间失败"} except Exception as e: - logger.error(f"发布说说时发生异常: {e}", exc_info=True) + logger.error(f"发布说说时发生异常: {e}") return {"success": False, "message": f"发布说说异常: {e}"} async def send_feed_from_activity(self, activity: str) -> dict[str, Any]: @@ -112,7 +112,7 @@ class QZoneService: return {"success": True, "message": story} return {"success": False, "message": "发布说说至QQ空间失败"} except Exception as e: - logger.error(f"根据活动发布说说时发生异常: {e}", exc_info=True) + logger.error(f"根据活动发布说说时发生异常: {e}") return {"success": False, "message": f"发布说说异常: {e}"} async def read_and_process_feeds(self, target_name: str, stream_id: str | None) -> dict[str, Any]: @@ -213,7 +213,7 @@ class QZoneService: return {"success": False, "message": error_msg} except Exception as e: # 其他未知异常 - logger.error(f"读取和处理说说时发生异常: {e}", exc_info=True) + logger.error(f"读取和处理说说时发生异常: {e}") return {"success": False, "message": f"处理说说时出现异常: {e}"} return {"success": False, "message": "读取和处理说说时发生未知错误,循环意外结束。"} @@ -241,7 +241,7 @@ class QZoneService: await self._reply_to_own_feed_comments(feed, api_client) await asyncio.sleep(random.uniform(3, 5)) except Exception as e: - logger.error(f"处理自己说说评论时发生异常: {e}", exc_info=True) + logger.error(f"处理自己说说评论时发生异常: {e}") # --- 第二步: 处理好友的动态 --- friend_feeds = await api_client["monitor_list_feeds"](20) @@ -297,7 +297,7 @@ class QZoneService: except Exception as e: # 其他未知异常 - logger.error(f"监控好友动态时发生异常: {e}", exc_info=True) + logger.error(f"监控好友动态时发生异常: {e}") return # --- Internal Helper Methods --- @@ -363,7 +363,7 @@ class QZoneService: else: logger.warning(f"生成回复内容失败,跳过回复'{nickname}'的评论") except Exception as e: - logger.error(f"回复'{nickname}'的评论时发生异常: {e}", exc_info=True) + logger.error(f"回复'{nickname}'的评论时发生异常: {e}") finally: # 无论成功与否,都解除锁定 logger.debug(f"解锁评论: {comment_key}") @@ -430,7 +430,7 @@ class QZoneService: else: logger.error(f"评论'{target_name}'的说说失败") except Exception as e: - logger.error(f"评论'{target_name}'的说说时发生异常: {e}", exc_info=True) + logger.error(f"评论'{target_name}'的说说时发生异常: {e}") finally: logger.debug(f"解锁说说: {comment_key}") if comment_key in self.processing_comments: @@ -710,7 +710,7 @@ class QZoneService: return bool(tid), tid except Exception as e: - logger.error(f"发布说说异常: {e}", exc_info=True) + logger.error(f"发布说说异常: {e}") return False, "" def _image_to_base64(image_bytes: bytes) -> str: @@ -830,7 +830,7 @@ class QZoneService: return None except Exception as e: - logger.error(f"上传图片 {index + 1} 异常: {e}", exc_info=True) + logger.error(f"上传图片 {index + 1} 异常: {e}") return None async def _list_feeds(t_qq: str, num: int) -> list[dict]: @@ -952,7 +952,7 @@ class QZoneService: raise except Exception as e: # 其他异常(如网络错误、JSON解析错误等),记录后返回空列表 - logger.error(f"获取说说列表失败: {e}", exc_info=True) + logger.error(f"获取说说列表失败: {e}") return [] async def _comment(t_qq: str, feed_id: str, text: str) -> bool: @@ -986,7 +986,7 @@ class QZoneService: logger.warning(f"评论API响应无法解析为JSON,假定成功: {response_text[:200]}") return True except Exception as e: - logger.error(f"评论说说异常: {e}", exc_info=True) + logger.error(f"评论说说异常: {e}") return False async def _like(t_qq: str, feed_id: str) -> bool: @@ -1022,7 +1022,7 @@ class QZoneService: logger.warning(f"点赞API响应无法解析为JSON,假定成功: {response_text[:200]}") return True except Exception as e: - logger.error(f"点赞说说异常: {e}", exc_info=True) + logger.error(f"点赞说说异常: {e}") return False async def _reply(fid, host_qq, target_name, content, comment_tid): @@ -1067,7 +1067,7 @@ class QZoneService: logger.warning(f"回复API响应无法解析为JSON,假定成功: {response_text[:200]}") return True except Exception as e: - logger.error(f"回复评论异常: {e}", exc_info=True) + logger.error(f"回复评论异常: {e}") return False async def _monitor_list_feeds(num: int) -> list[dict]: @@ -1232,7 +1232,7 @@ class QZoneService: if "错误码: -3000" in str(e): logger.warning("监控任务遇到Cookie失效错误,重新抛出异常以触发上层重试") raise # 重新抛出异常,让上层处理 - logger.error(f"监控好友动态失败: {e}", exc_info=True) + logger.error(f"监控好友动态失败: {e}") return [] logger.info("[DEBUG] API客户端构造完成,返回包含6个方法的字典") diff --git a/src/plugins/built_in/maizone_refactored/services/reply_tracker_service.py b/src/plugins/built_in/maizone_refactored/services/reply_tracker_service.py index 30984cd3e..f3432a6d9 100644 --- a/src/plugins/built_in/maizone_refactored/services/reply_tracker_service.py +++ b/src/plugins/built_in/maizone_refactored/services/reply_tracker_service.py @@ -116,7 +116,7 @@ class ReplyTrackerService: except Exception as e: # 捕获迁移过程中可能出现的任何异常 - logger.error(f"迁移旧数据文件时发生错误: {e}", exc_info=True) + logger.error(f"迁移旧数据文件时发生错误: {e}") def _validate_data(self, data: Any) -> bool: """ @@ -175,7 +175,7 @@ class ReplyTrackerService: self.storage.set("data", self.replied_comments) logger.debug("回复记录已暂存,将由存储API在后台保存") except Exception as e: - logger.error(f"持久化回复记录失败: {e}", exc_info=True) + logger.error(f"持久化回复记录失败: {e}") def _cleanup_old_records(self): """ diff --git a/src/plugins/built_in/napcat_adapter/plugin.py b/src/plugins/built_in/napcat_adapter/plugin.py index 930482282..b1737f650 100644 --- a/src/plugins/built_in/napcat_adapter/plugin.py +++ b/src/plugins/built_in/napcat_adapter/plugin.py @@ -41,7 +41,7 @@ class NapcatAdapter(BaseAdapter): adapter_description = "基于 MoFox-Bus 的 Napcat/OneBot 11 适配器" platform = "qq" - run_in_subprocess = False + run_in_subprocess = True def __init__(self, core_sink: CoreSink, plugin: Optional[BasePlugin] = None, **kwargs): """初始化 Napcat 适配器""" diff --git a/src/plugins/built_in/napcat_adapter/src/handlers/to_core/message_handler.py b/src/plugins/built_in/napcat_adapter/src/handlers/to_core/message_handler.py index acc1b5577..f3cd281d4 100644 --- a/src/plugins/built_in/napcat_adapter/src/handlers/to_core/message_handler.py +++ b/src/plugins/built_in/napcat_adapter/src/handlers/to_core/message_handler.py @@ -25,7 +25,7 @@ from ..utils import * if TYPE_CHECKING: from ....plugin import NapcatAdapter -logger = get_logger("napcat_adapter.message_handler") +logger = get_logger("napcat_adapter") class MessageHandler: @@ -234,27 +234,29 @@ class MessageHandler: return {"type": "text", "data": "[无法获取被引用的消息]"} # 递归处理被引用的消息 - reply_segments = [] + reply_segments: List[SegPayload] = [] for reply_seg in message_detail.get("message", []): if isinstance(reply_seg, dict): reply_result = await self.handle_single_segment(reply_seg, raw_message, in_reply=True) if reply_result: reply_segments.append(reply_result) - if not reply_segments: - reply_text = "[无法获取被引用的消息]" - else: - # 简化处理,只取第一个segment的data - reply_text = reply_segments[0].get("data", "") if reply_segments else "" - sender_info = message_detail.get("sender", {}) - sender_nickname = sender_info.get("nickname", "未知用户") + sender_nickname = sender_info.get("nickname") or "未知用户" sender_id = sender_info.get("user_id") - if sender_id: - return {"type": "text", "data": f"[回复<{sender_nickname}({sender_id})>:{reply_text}],说:"} - else: - return {"type": "text", "data": f"[回复<{sender_nickname}>:{reply_text}],说:"} + prefix_text = f"[回复<{sender_nickname}({sender_id})>:" if sender_id else f"[回复<{sender_nickname}>:" + suffix_text = "],说:" + + # 将被引用的消息段落转换为可读的文本占位,避免嵌套的 base64 污染 + brief_segments = [ + {"type": seg.get("type", "text"), "data": seg.get("data", "")} for seg in reply_segments + ] or [{"type": "text", "data": "[无法获取被引用的消息]"}] + + return { + "type": "seglist", + "data": [{"type": "text", "data": prefix_text}, *brief_segments, {"type": "text", "data": suffix_text}], + } async def _handle_record_message(self, segment: dict) -> SegPayload | None: """处理语音消息""" diff --git a/src/plugins/built_in/napcat_adapter/src/handlers/to_core/meta_event_handler.py b/src/plugins/built_in/napcat_adapter/src/handlers/to_core/meta_event_handler.py index a595a03d2..49976a164 100644 --- a/src/plugins/built_in/napcat_adapter/src/handlers/to_core/meta_event_handler.py +++ b/src/plugins/built_in/napcat_adapter/src/handlers/to_core/meta_event_handler.py @@ -12,7 +12,7 @@ from ...event_models import MetaEventType if TYPE_CHECKING: from ....plugin import NapcatAdapter -logger = get_logger("napcat_adapter.meta_event_handler") +logger = get_logger("napcat_adapter") class MetaEventHandler: diff --git a/src/plugins/built_in/napcat_adapter/src/handlers/to_core/notice_handler.py b/src/plugins/built_in/napcat_adapter/src/handlers/to_core/notice_handler.py index d9244fc0a..39bc30015 100644 --- a/src/plugins/built_in/napcat_adapter/src/handlers/to_core/notice_handler.py +++ b/src/plugins/built_in/napcat_adapter/src/handlers/to_core/notice_handler.py @@ -9,7 +9,7 @@ from src.common.logger import get_logger if TYPE_CHECKING: from ...plugin import NapcatAdapter -logger = get_logger("napcat_adapter.notice_handler") +logger = get_logger("napcat_adapter") class NoticeHandler: diff --git a/src/plugins/built_in/napcat_adapter/src/handlers/to_napcat/send_handler.py b/src/plugins/built_in/napcat_adapter/src/handlers/to_napcat/send_handler.py index 0790f49b4..b832d3ae3 100644 --- a/src/plugins/built_in/napcat_adapter/src/handlers/to_napcat/send_handler.py +++ b/src/plugins/built_in/napcat_adapter/src/handlers/to_napcat/send_handler.py @@ -13,7 +13,7 @@ from src.plugin_system.apis import config_api from ...event_models import CommandType from ..utils import convert_image_to_gif, get_image_format -logger = get_logger("napcat_adapter.send_handler") +logger = get_logger("napcat_adapter") if TYPE_CHECKING: from ....plugin import NapcatAdapter @@ -59,7 +59,6 @@ class SendHandler: logger.info("收到adapter_response消息,此消息应该由Bot端处理,跳过") return None - logger.info("处理普通消息") return await self.send_normal_message(envelope) async def send_normal_message(self, envelope: MessageEnvelope) -> None: @@ -104,7 +103,6 @@ class SendHandler: else: logger.error("无法识别的消息类型") return - logger.info("尝试发送到napcat") logger.debug( f"准备发送到napcat的消息体: action='{action}', {id_name}='{target_id}', message='{processed_message}'" ) @@ -124,7 +122,7 @@ class SendHandler: """ 处理命令类 """ - logger.info("处理命令中") + logger.debug("处理命令中") message_info: Dict[str, Any] = envelope.get("message_info", {}) group_info: Optional[Dict[str, Any]] = message_info.get("group_info") segment: SegPayload = envelope.get("message_segment", {}) # type: ignore[assignment] @@ -164,9 +162,9 @@ class SendHandler: logger.error("命令或参数缺失") return None - logger.info(f"准备向 Napcat 发送命令: command='{command}', args_dict='{args_dict}'") + logger.debug(f"准备向 Napcat 发送命令: command='{command}', args_dict='{args_dict}'") response = await self.send_message_to_napcat(command, args_dict) - logger.info(f"收到 Napcat 的命令响应: {response}") + logger.debug(f"收到 Napcat 的命令响应: {response}") if response.get("status") == "ok": logger.info(f"命令 {command_name} 执行成功") @@ -191,7 +189,7 @@ class SendHandler: logger.error("适配器命令缺少action参数") return - logger.info(f"执行适配器命令: {action}") + logger.debug(f"执行适配器命令: {action}") if action == "get_cookies": response = await self.send_message_to_napcat(action, params, timeout=40.0) @@ -241,7 +239,6 @@ class SendHandler: target_id = str(target_id) if target_id == "notice": return payload - logger.info(target_id if isinstance(target_id, str) else "") new_payload = self.build_payload(payload, await self.handle_reply_message(target_id, user_info), True) elif seg_type == "text": text = seg.get("data") @@ -324,22 +321,22 @@ class SendHandler: if not replied_user_id: logger.warning(f"无法获取消息 {message_id} 的发送者信息,跳过 @") - logger.info(f"最终返回的回复段: {reply_seg}") + logger.debug(f"最终返回的回复段: {reply_seg}") return reply_seg if random.random() < config_api.get_plugin_config(self.plugin_config, "features.reply_at_rate", 0.5): at_seg = {"type": "at", "data": {"qq": str(replied_user_id)}} text_seg = {"type": "text", "data": {"text": " "}} result_seg = [reply_seg, at_seg, text_seg] - logger.info(f"最终返回的回复段: {result_seg}") + logger.debug(f"最终返回的回复段: {result_seg}") return result_seg except Exception as e: logger.error(f"处理引用回复并尝试@时出错: {e}") - logger.info(f"最终返回的回复段: {reply_seg}") + logger.debug(f"最终返回的回复段: {reply_seg}") return reply_seg - logger.info(f"最终返回的回复段: {reply_seg}") + logger.debug(f"最终返回的回复段: {reply_seg}") return reply_seg def handle_text_message(self, message: str) -> dict: diff --git a/src/plugins/built_in/napcat_adapter/src/handlers/utils.py b/src/plugins/built_in/napcat_adapter/src/handlers/utils.py index c9b79dbe8..6891f8414 100644 --- a/src/plugins/built_in/napcat_adapter/src/handlers/utils.py +++ b/src/plugins/built_in/napcat_adapter/src/handlers/utils.py @@ -90,7 +90,7 @@ async def _set_cached(section: str, key: str, data: Any) -> None: try: _save_cache_to_disk_locked() except Exception: - logger.debug("Write napcat cache failed", exc_info=True) + logger.debug("Write napcat cache failed") def _get_adapter(adapter: "NapcatAdapter | None" = None) -> "NapcatAdapter": diff --git a/src/plugins/built_in/social_toolkit_plugin/plugin.py b/src/plugins/built_in/social_toolkit_plugin/plugin.py index 69ee3d5c7..2433eeb2b 100644 --- a/src/plugins/built_in/social_toolkit_plugin/plugin.py +++ b/src/plugins/built_in/social_toolkit_plugin/plugin.py @@ -103,7 +103,7 @@ class ReminderTask(AsyncTask): logger.info(f"提醒任务 {self.task_name} 成功完成。") except Exception as e: - logger.error(f"执行提醒任务 {self.task_name} 时出错: {e}", exc_info=True) + logger.error(f"执行提醒任务 {self.task_name} 时出错: {e}") # =============================== Actions =============================== @@ -347,7 +347,7 @@ class SetEmojiLikeAction(BaseAction): return False, "设置表情回应失败" except Exception as e: - logger.error(f"设置表情回应时发生异常: {e}", exc_info=True) + logger.error(f"设置表情回应时发生异常: {e}") await self.store_action_info(action_prompt_display=f"贴表情失败: {e}", action_done=False) return False, f"设置表情回应失败: {e}" @@ -438,7 +438,7 @@ class RemindAction(BaseAction): target_time = parse_datetime(converted_time_str, fuzzy=False) except Exception as e: - logger.error(f"[ReminderPlugin] 无法解析或转换时间字符串 '{remind_time_str}': {e}", exc_info=True) + logger.error(f"[ReminderPlugin] 无法解析或转换时间字符串 '{remind_time_str}': {e}") await self.send_text(f"抱歉,我无法理解您说的时间 '{remind_time_str}',提醒设置失败。") return False, f"无法解析时间 '{remind_time_str}'" @@ -541,7 +541,7 @@ class RemindAction(BaseAction): return True, "提醒设置成功" except Exception as e: - logger.error(f"[ReminderPlugin] 创建提醒任务时出错: {e}", exc_info=True) + logger.error(f"[ReminderPlugin] 创建提醒任务时出错: {e}") await self.send_text("抱歉,设置提醒时发生了一点内部错误。") return False, "设置提醒时发生内部错误" diff --git a/src/plugins/built_in/tts_voice_plugin/actions/tts_action.py b/src/plugins/built_in/tts_voice_plugin/actions/tts_action.py index 014827ebf..409b72767 100644 --- a/src/plugins/built_in/tts_voice_plugin/actions/tts_action.py +++ b/src/plugins/built_in/tts_voice_plugin/actions/tts_action.py @@ -47,7 +47,7 @@ def _get_available_styles() -> list[str]: return style_names if style_names else ["default"] except Exception as e: - logger.error(f"动态加载TTS风格列表时出错: {e}", exc_info=True) + logger.error(f"动态加载TTS风格列表时出错: {e}") return ["default"] # 出现任何错误都回退 @@ -196,7 +196,7 @@ class TTSVoiceAction(BaseAction): return False, "语音合成失败" except Exception as e: - logger.error(f"{self.log_prefix} 语音合成过程中发生未知错误: {e!s}", exc_info=True) + logger.error(f"{self.log_prefix} 语音合成过程中发生未知错误: {e!s}") await self.store_action_info( action_prompt_display=f"语音合成失败: {e!s}", action_done=False diff --git a/src/plugins/built_in/tts_voice_plugin/commands/tts_command.py b/src/plugins/built_in/tts_voice_plugin/commands/tts_command.py index 3eadea879..6b9cceeb2 100644 --- a/src/plugins/built_in/tts_voice_plugin/commands/tts_command.py +++ b/src/plugins/built_in/tts_voice_plugin/commands/tts_command.py @@ -71,6 +71,6 @@ class TTSVoiceCommand(PlusCommand): return False, "语音合成失败", True except Exception as e: - logger.error(f"执行 /tts 命令时出错: {e}", exc_info=True) + logger.error(f"执行 /tts 命令时出错: {e}") await self.send_text("❌ 语音合成时发生了意想不到的错误,请查看日志。") return False, "命令执行异常", True diff --git a/src/plugins/built_in/tts_voice_plugin/plugin.py b/src/plugins/built_in/tts_voice_plugin/plugin.py index baebfbad8..583d1f64e 100644 --- a/src/plugins/built_in/tts_voice_plugin/plugin.py +++ b/src/plugins/built_in/tts_voice_plugin/plugin.py @@ -82,7 +82,7 @@ class TTSVoicePlugin(BasePlugin): return value if value is not None else default except Exception as e: - logger.error(f"Failed to manually load '{key}' from config: {e}", exc_info=True) + logger.error(f"Failed to manually load '{key}' from config: {e}") return default return self.get_config(key, default) diff --git a/src/plugins/built_in/tts_voice_plugin/services/tts_service.py b/src/plugins/built_in/tts_voice_plugin/services/tts_service.py index 2b3ee99b8..eed12d8dd 100644 --- a/src/plugins/built_in/tts_voice_plugin/services/tts_service.py +++ b/src/plugins/built_in/tts_voice_plugin/services/tts_service.py @@ -41,7 +41,7 @@ class TTSService: else: logger.warning("TTS风格配置为空,请检查配置文件") except Exception as e: - logger.error(f"TTS服务配置加载失败: {e}", exc_info=True) + logger.error(f"TTS服务配置加载失败: {e}") def _load_tts_styles(self) -> dict[str, dict[str, Any]]: """加载 TTS 风格配置""" @@ -176,7 +176,7 @@ class TTSService: else: logger.info(f"成功切换 {weight_type} 模型为: {weights_path}") except Exception as e: - logger.error(f"请求切换 {weight_type} 模型时发生网络异常: {e}", exc_info=True) + logger.error(f"请求切换 {weight_type} 模型时发生网络异常: {e}") await switch_model_weights(kwargs.get("gpt_weights"), "gpt") await switch_model_weights(kwargs.get("sovits_weights"), "sovits") @@ -218,7 +218,7 @@ class TTSService: logger.error("TTS服务请求超时") return None except Exception as e: - logger.error(f"TTS API调用异常: {e}", exc_info=True) + logger.error(f"TTS API调用异常: {e}") return None async def _apply_spatial_audio_effect(self, audio_data: bytes) -> bytes | None: @@ -278,7 +278,7 @@ class TTSService: return processed_audio_data except Exception as e: - logger.error(f"应用空间效果时出错: {e}", exc_info=True) + logger.error(f"应用空间效果时出错: {e}") return audio_data # 如果出错,返回原始音频 async def generate_voice(self, text: str, style_hint: str = "default", language_hint: str | None = None) -> str | None: diff --git a/src/plugins/built_in/web_search_tool/engines/metaso_engine.py b/src/plugins/built_in/web_search_tool/engines/metaso_engine.py index 354182577..677f49e70 100644 --- a/src/plugins/built_in/web_search_tool/engines/metaso_engine.py +++ b/src/plugins/built_in/web_search_tool/engines/metaso_engine.py @@ -68,7 +68,7 @@ class MetasoClient: logger.error(f"HTTP error occurred while searching with Metaso Chat: {e.response.text}") return [] except Exception as e: - logger.error(f"An error occurred while searching with Metaso Chat: {e}", exc_info=True) + logger.error(f"An error occurred while searching with Metaso Chat: {e}") return [] @@ -103,5 +103,5 @@ class MetasoSearchEngine(BaseSearchEngine): return await metaso_client.search(query) except Exception as e: - logger.error(f"Metaso search failed: {e}", exc_info=True) + logger.error(f"Metaso search failed: {e}") return [] diff --git a/src/plugins/built_in/web_search_tool/plugin.py b/src/plugins/built_in/web_search_tool/plugin.py index cc050b91b..d29164524 100644 --- a/src/plugins/built_in/web_search_tool/plugin.py +++ b/src/plugins/built_in/web_search_tool/plugin.py @@ -76,7 +76,7 @@ class WEBSEARCHPLUGIN(BasePlugin): logger.info(f"❌ 不可用搜索引擎: {', '.join(unavailable_engines)}") except Exception as e: - logger.error(f"❌ 搜索引擎初始化失败: {e}", exc_info=True) + logger.error(f"❌ 搜索引擎初始化失败: {e}") config_file_name: str = "config.toml" # 配置文件名 # 配置节描述 diff --git a/src/plugins/built_in/web_search_tool/tools/url_parser.py b/src/plugins/built_in/web_search_tool/tools/url_parser.py index c7fd2d260..572b54fe5 100644 --- a/src/plugins/built_in/web_search_tool/tools/url_parser.py +++ b/src/plugins/built_in/web_search_tool/tools/url_parser.py @@ -126,7 +126,7 @@ class URLParserTool(BaseTool): logger.warning(f"本地解析URL '{url}' 失败 (HTTP {e.response.status_code})") return {"error": f"请求失败,状态码: {e.response.status_code}"} except Exception as e: - logger.error(f"本地解析或总结URL '{url}' 时发生未知异常: {e}", exc_info=True) + logger.error(f"本地解析或总结URL '{url}' 时发生未知异常: {e}") return {"error": f"发生未知错误: {e!s}"} async def execute(self, function_args: dict[str, Any]) -> dict[str, Any]: @@ -183,7 +183,7 @@ class URLParserTool(BaseTool): func = functools.partial(exa_client.get_contents, urls, **exa_params) contents_response = await loop.run_in_executor(None, func) except Exception as e: - logger.error(f"执行 Exa URL解析时发生严重异常: {e}", exc_info=True) + logger.error(f"执行 Exa URL解析时发生严重异常: {e}") contents_response = None # 确保异常后为None # 步骤 2: 处理Exa的响应 diff --git a/src/plugins/built_in/web_search_tool/tools/web_search.py b/src/plugins/built_in/web_search_tool/tools/web_search.py index a0b174167..82ce0325a 100644 --- a/src/plugins/built_in/web_search_tool/tools/web_search.py +++ b/src/plugins/built_in/web_search_tool/tools/web_search.py @@ -143,7 +143,7 @@ class WebSurfingTool(BaseTool): } except Exception as e: - logger.error(f"执行并行网络搜索时发生异常: {e}", exc_info=True) + logger.error(f"执行并行网络搜索时发生异常: {e}") return {"error": f"执行网络搜索时发生严重错误: {e!s}"} async def _execute_fallback_search(