feat(mood): 集成情绪系统到消息处理流程并改进初始化逻辑

在消息处理完成后自动触发情绪状态更新,增强了聊天体验的动态性。
同时改进了情绪系统的异步初始化过程,增加了错误处理和日志记录,
确保系统在各种异常情况下都能稳定运行。
This commit is contained in:
Windpicker-owo
2025-10-07 15:10:41 +08:00
parent 1381e7f700
commit f6248ab774
2 changed files with 54 additions and 11 deletions

View File

@@ -578,6 +578,21 @@ class ChatBot:
logger.error(f"存储消息到数据库失败: {e}") logger.error(f"存储消息到数据库失败: {e}")
traceback.print_exc() 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: if template_group_name:
async with global_prompt_manager.async_message_scope(template_group_name): async with global_prompt_manager.async_message_scope(template_group_name):
await preprocess() await preprocess()

View File

@@ -58,24 +58,50 @@ class ChatMood:
async def _initialize(self): async def _initialize(self):
"""异步初始化方法""" """异步初始化方法"""
if not self._initialized: 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() chat_manager = get_chat_manager()
self.chat_stream = await chat_manager.get_stream(self.chat_id) self.chat_stream = await chat_manager.get_stream(self.chat_id)
if not self.chat_stream: if not self.chat_stream:
raise ValueError(f"Chat stream for chat_id {self.chat_id} not found") # 如果找不到聊天流,使用基础日志前缀但不抛出异常
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): 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: if self.chat_id in mood_manager.insomnia_chats:
logger.debug(f"{self.log_prefix} 处于失眠状态,情绪已锁定,跳过更新。") logger.debug(f"{self.log_prefix} 处于失眠状态,情绪已锁定,跳过更新。")
@@ -89,7 +115,8 @@ class ChatMood:
else: # DatabaseMessages else: # DatabaseMessages
message_time = message.time 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 base_probability = 0.05
time_multiplier = 4 * (1 - math.exp(-0.01 * during_last_time)) time_multiplier = 4 * (1 - math.exp(-0.01 * during_last_time))
@@ -107,6 +134,7 @@ class ChatMood:
) )
if random.random() > update_probability: if random.random() > update_probability:
logger.debug(f"{self.log_prefix} 情绪更新概率未达到阈值,跳过更新。概率: {update_probability:.3f}")
return return
logger.debug( logger.debug(