feat(mood): 集成情绪系统到消息处理流程并改进初始化逻辑
在消息处理完成后自动触发情绪状态更新,增强了聊天体验的动态性。 同时改进了情绪系统的异步初始化过程,增加了错误处理和日志记录, 确保系统在各种异常情况下都能稳定运行。
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user