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}")
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()

View File

@@ -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(