From f6248ab7744a0711e6a61e62dc35fb4bd3e5a3e7 Mon Sep 17 00:00:00 2001 From: Windpicker-owo <3431391539@qq.com> Date: Tue, 7 Oct 2025 15:10:41 +0800 Subject: [PATCH] =?UTF-8?q?feat(mood):=20=E9=9B=86=E6=88=90=E6=83=85?= =?UTF-8?q?=E7=BB=AA=E7=B3=BB=E7=BB=9F=E5=88=B0=E6=B6=88=E6=81=AF=E5=A4=84?= =?UTF-8?q?=E7=90=86=E6=B5=81=E7=A8=8B=E5=B9=B6=E6=94=B9=E8=BF=9B=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在消息处理完成后自动触发情绪状态更新,增强了聊天体验的动态性。 同时改进了情绪系统的异步初始化过程,增加了错误处理和日志记录, 确保系统在各种异常情况下都能稳定运行。 --- src/chat/message_receive/bot.py | 15 ++++++++++ src/mood/mood_manager.py | 50 +++++++++++++++++++++++++-------- 2 files changed, 54 insertions(+), 11 deletions(-) diff --git a/src/chat/message_receive/bot.py b/src/chat/message_receive/bot.py index c1ca149b3..318c503c4 100644 --- a/src/chat/message_receive/bot.py +++ b/src/chat/message_receive/bot.py @@ -578,6 +578,21 @@ class ChatBot: logger.error(f"存储消息到数据库失败: {e}") traceback.print_exc() + # 情绪系统更新 - 在消息存储后触发情绪更新 + try: + if global_config.mood.enable_mood: + # 获取兴趣度用于情绪更新 + interest_rate = getattr(message, "interest_value", 0.0) + logger.debug(f"开始更新情绪状态,兴趣度: {interest_rate:.2f}") + + # 获取当前聊天的情绪对象并更新情绪状态 + chat_mood = mood_manager.get_mood_by_chat_id(message.chat_stream.stream_id) + await chat_mood.update_mood_by_message(message, interest_rate) + logger.debug("情绪状态更新完成") + except Exception as e: + logger.error(f"更新情绪状态失败: {e}") + traceback.print_exc() + if template_group_name: async with global_prompt_manager.async_message_scope(template_group_name): await preprocess() diff --git a/src/mood/mood_manager.py b/src/mood/mood_manager.py index 370a65d41..ecb0cf441 100644 --- a/src/mood/mood_manager.py +++ b/src/mood/mood_manager.py @@ -58,24 +58,50 @@ class ChatMood: async def _initialize(self): """异步初始化方法""" if not self._initialized: - from src.chat.message_receive.chat_stream import get_chat_manager + try: + from src.chat.message_receive.chat_stream import get_chat_manager - chat_manager = get_chat_manager() - self.chat_stream = await chat_manager.get_stream(self.chat_id) + chat_manager = get_chat_manager() + self.chat_stream = await chat_manager.get_stream(self.chat_id) - if not self.chat_stream: - raise ValueError(f"Chat stream for chat_id {self.chat_id} not found") + if not self.chat_stream: + # 如果找不到聊天流,使用基础日志前缀但不抛出异常 + self.log_prefix = f"[{self.chat_id}]" + logger.warning(f"Chat stream for chat_id {self.chat_id} not found during mood initialization") + else: + self.log_prefix = f"[{self.chat_stream.group_info.group_name if self.chat_stream.group_info else self.chat_stream.user_info.user_nickname}]" - self.log_prefix = f"[{self.chat_stream.group_info.group_name if self.chat_stream.group_info else self.chat_stream.user_info.user_nickname}]" - self._initialized = True + # 初始化回归计数 + if not hasattr(self, 'regression_count'): + self.regression_count = 0 - self.regression_count: int = 0 + # 初始化情绪模型 + if not hasattr(self, 'mood_model'): + self.mood_model = LLMRequest(model_set=model_config.model_task_config.emotion, request_type="mood") - self.mood_model = LLMRequest(model_set=model_config.model_task_config.emotion, request_type="mood") + # 初始化最后变化时间 + if not hasattr(self, 'last_change_time'): + self.last_change_time = 0 - self.last_change_time: float = 0 + self._initialized = True + logger.debug(f"{self.log_prefix} 情绪系统初始化完成") + + except Exception as e: + logger.error(f"情绪系统初始化失败: {e}") + # 设置基础初始化状态,避免重复尝试 + self.log_prefix = f"[{self.chat_id}]" + self._initialized = True + if not hasattr(self, 'regression_count'): + self.regression_count = 0 + if not hasattr(self, 'mood_model'): + self.mood_model = LLMRequest(model_set=model_config.model_task_config.emotion, request_type="mood") + if not hasattr(self, 'last_change_time'): + self.last_change_time = 0 async def update_mood_by_message(self, message: MessageRecv | DatabaseMessages, interested_rate: float): + # 确保异步初始化已完成 + await self._initialize() + # 如果当前聊天处于失眠状态,则锁定情绪,不允许更新 if self.chat_id in mood_manager.insomnia_chats: logger.debug(f"{self.log_prefix} 处于失眠状态,情绪已锁定,跳过更新。") @@ -89,7 +115,8 @@ class ChatMood: else: # DatabaseMessages message_time = message.time - during_last_time = message_time - self.last_change_time + # 防止负时间差 + during_last_time = max(0, message_time - self.last_change_time) base_probability = 0.05 time_multiplier = 4 * (1 - math.exp(-0.01 * during_last_time)) @@ -107,6 +134,7 @@ class ChatMood: ) if random.random() > update_probability: + logger.debug(f"{self.log_prefix} 情绪更新概率未达到阈值,跳过更新。概率: {update_probability:.3f}") return logger.debug(