diff --git a/bot.py b/bot.py index f19afbfd3..1a5e6694b 100644 --- a/bot.py +++ b/bot.py @@ -16,8 +16,6 @@ from pathlib import Path from rich.traceback import install # maim_message imports for console input -from maim_message import Seg, UserInfo, BaseMessageInfo, MessageBase -from src.chat.message_receive.bot import chat_bot # 最早期初始化日志系统,确保所有后续模块都使用正确的日志格式 from src.common.logger import initialize_logging, get_logger, shutdown_logging @@ -236,7 +234,6 @@ def raw_main(): return MainSystem() - if __name__ == "__main__": exit_code = 0 # 用于记录程序最终的退出状态 try: @@ -265,7 +262,6 @@ if __name__ == "__main__": logger.error(f"优雅关闭时发生错误: {ge}") # 新增:检测外部请求关闭 - except Exception as e: logger.error(f"主程序发生异常: {str(e)} {str(traceback.format_exc())}") exit_code = 1 # 标记发生错误 diff --git a/src/chat/heart_flow/chat_state_info.py b/src/chat/heart_flow/chat_state_info.py index 5abc76dbe..33936186b 100644 --- a/src/chat/heart_flow/chat_state_info.py +++ b/src/chat/heart_flow/chat_state_info.py @@ -1,4 +1,3 @@ -from src.mood.mood_manager import mood_manager import enum diff --git a/src/chat/heart_flow/heartflow_message_processor.py b/src/chat/heart_flow/heartflow_message_processor.py index 67f8c076d..6ad7027ba 100644 --- a/src/chat/heart_flow/heartflow_message_processor.py +++ b/src/chat/heart_flow/heartflow_message_processor.py @@ -115,10 +115,10 @@ class HeartFCMessageReceiver: # 6. 兴趣度计算与更新 interested_rate, is_mentioned = await _calculate_interest(message) subheartflow.add_message_to_normal_chat_cache(message, interested_rate, is_mentioned) - + chat_mood = mood_manager.get_mood_by_chat_id(subheartflow.chat_id) asyncio.create_task(chat_mood.update_mood_by_message(message, interested_rate)) - + with open("interested_rates.txt", "a", encoding="utf-8") as f: f.write(f"{interested_rate}\n") diff --git a/src/chat/replyer/default_generator.py b/src/chat/replyer/default_generator.py index 1e17c3cb7..846112305 100644 --- a/src/chat/replyer/default_generator.py +++ b/src/chat/replyer/default_generator.py @@ -503,7 +503,7 @@ class DefaultReplyer: is_group_chat = bool(chat_stream.group_info) reply_to = reply_data.get("reply_to", "none") extra_info_block = reply_data.get("extra_info", "") or reply_data.get("extra_info_block", "") - + chat_mood = mood_manager.get_mood_by_chat_id(chat_id) mood_prompt = chat_mood.mood_state diff --git a/src/chat/utils/utils.py b/src/chat/utils/utils.py index 144af9c65..f3226b2e1 100644 --- a/src/chat/utils/utils.py +++ b/src/chat/utils/utils.py @@ -8,6 +8,7 @@ import numpy as np from maim_message import UserInfo from src.common.logger import get_logger + # from src.mood.mood_manager import mood_manager from ..message_receive.message import MessageRecv from src.llm_models.utils_model import LLMRequest diff --git a/src/config/official_configs.py b/src/config/official_configs.py index 440a91268..7e2efbeba 100644 --- a/src/config/official_configs.py +++ b/src/config/official_configs.py @@ -631,10 +631,10 @@ class ModelConfig(ConfigBase): replyer_2: dict[str, Any] = field(default_factory=lambda: {}) """normal_chat次要回复模型配置""" - + memory: dict[str, Any] = field(default_factory=lambda: {}) """记忆模型配置""" - + emotion: dict[str, Any] = field(default_factory=lambda: {}) """情绪模型配置""" @@ -648,4 +648,4 @@ class ModelConfig(ConfigBase): """规划模型配置""" embedding: dict[str, Any] = field(default_factory=lambda: {}) - """嵌入模型配置""" \ No newline at end of file + """嵌入模型配置""" diff --git a/src/mais4u/mais4u_chat/s4u_stream_generator.py b/src/mais4u/mais4u_chat/s4u_stream_generator.py index 0f3ef1944..06d38a9e1 100644 --- a/src/mais4u/mais4u_chat/s4u_stream_generator.py +++ b/src/mais4u/mais4u_chat/s4u_stream_generator.py @@ -35,7 +35,6 @@ class S4UStreamGenerator: raise ValueError("`replyer_1` 在配置文件中缺少 `model_name` 字段") self.replyer_1_config = replyer_1_config - self.current_model_name = "unknown model" self.partial_response = "" diff --git a/src/mood/mood_manager.py b/src/mood/mood_manager.py index b64e7d94e..dee8d7cc6 100644 --- a/src/mood/mood_manager.py +++ b/src/mood/mood_manager.py @@ -1,7 +1,6 @@ import math import random import time -import asyncio from src.chat.message_receive.message import MessageRecv from src.llm_models.utils_model import LLMRequest @@ -10,8 +9,10 @@ from src.chat.utils.chat_message_builder import build_readable_messages, get_raw from src.config.config import global_config from src.chat.utils.prompt_builder import Prompt, global_prompt_manager from src.manager.async_task_manager import AsyncTask, async_task_manager + logger = get_logger("mood") + def init_prompt(): Prompt( """ @@ -40,26 +41,27 @@ def init_prompt(): "regress_mood_prompt", ) + class ChatMood: - def __init__(self,chat_id:str): - self.chat_id:str = chat_id - self.mood_state:str = "感觉很平静" - - self.regression_count:int = 0 - + def __init__(self, chat_id: str): + self.chat_id: str = chat_id + self.mood_state: str = "感觉很平静" + + self.regression_count: int = 0 + self.mood_model = LLMRequest( model=global_config.model.emotion, temperature=0.7, request_type="mood", ) - + self.last_change_time = 0 - - async def update_mood_by_message(self,message:MessageRecv,interested_rate:float): + + async def update_mood_by_message(self, message: MessageRecv, interested_rate: float): self.regression_count = 0 - + during_last_time = message.message_info.time - self.last_change_time - + base_probability = 0.05 time_multiplier = 4 * (1 - math.exp(-0.01 * during_last_time)) @@ -67,15 +69,15 @@ class ChatMood: interest_multiplier = 0 else: interest_multiplier = 3 * math.pow(interested_rate, 0.25) - - logger.info(f"base_probability: {base_probability}, time_multiplier: {time_multiplier}, interest_multiplier: {interest_multiplier}") + + logger.info( + f"base_probability: {base_probability}, time_multiplier: {time_multiplier}, interest_multiplier: {interest_multiplier}" + ) update_probability = min(1.0, base_probability * time_multiplier * interest_multiplier) if random.random() > update_probability: return - - - + message_time = message.message_info.time message_list_before_now = get_raw_msg_by_timestamp_with_chat_inclusive( chat_id=self.chat_id, @@ -93,8 +95,7 @@ class ChatMood: truncate=True, show_actions=True, ) - - + bot_name = global_config.bot.nickname if global_config.bot.alias_names: bot_nickname = f",也有人叫你{','.join(global_config.bot.alias_names)}" @@ -103,27 +104,24 @@ class ChatMood: prompt_personality = global_config.personality.personality_core indentify_block = f"你的名字是{bot_name}{bot_nickname},你{prompt_personality}:" - + prompt = await global_prompt_manager.format_prompt( "change_mood_prompt", chat_talking_prompt=chat_talking_prompt, indentify_block=indentify_block, mood_state=self.mood_state, ) - + logger.info(f"prompt: {prompt}") response, (reasoning_content, model_name) = await self.mood_model.generate_response_async(prompt=prompt) logger.info(f"response: {response}") logger.info(f"reasoning_content: {reasoning_content}") - - + self.mood_state = response - - + self.last_change_time = message_time - + async def regress_mood(self): - message_time = time.time() message_list_before_now = get_raw_msg_by_timestamp_with_chat_inclusive( chat_id=self.chat_id, @@ -141,8 +139,7 @@ class ChatMood: truncate=True, show_actions=True, ) - - + bot_name = global_config.bot.nickname if global_config.bot.alias_names: bot_nickname = f",也有人叫你{','.join(global_config.bot.alias_names)}" @@ -151,27 +148,26 @@ class ChatMood: prompt_personality = global_config.personality.personality_core indentify_block = f"你的名字是{bot_name}{bot_nickname},你{prompt_personality}:" - + prompt = await global_prompt_manager.format_prompt( "regress_mood_prompt", chat_talking_prompt=chat_talking_prompt, indentify_block=indentify_block, mood_state=self.mood_state, ) - + logger.info(f"prompt: {prompt}") response, (reasoning_content, model_name) = await self.mood_model.generate_response_async(prompt=prompt) logger.info(f"response: {response}") logger.info(f"reasoning_content: {reasoning_content}") - - + self.mood_state = response - - + self.regression_count += 1 - + + class MoodRegressionTask(AsyncTask): - def __init__(self, mood_manager: 'MoodManager'): + def __init__(self, mood_manager: "MoodManager"): super().__init__(task_name="MoodRegressionTask", run_interval=30) self.mood_manager = mood_manager @@ -179,24 +175,20 @@ class MoodRegressionTask(AsyncTask): logger.debug("Running mood regression task...") now = time.time() for mood in self.mood_manager.mood_list: - if mood.last_change_time == 0: continue - - + if now - mood.last_change_time > 180: - if mood.regression_count >= 3: continue - - - logger.info(f"chat {mood.chat_id} 开始情绪回归, 这是第 {mood.regression_count+1} 次") + + logger.info(f"chat {mood.chat_id} 开始情绪回归, 这是第 {mood.regression_count + 1} 次") await mood.regress_mood() -class MoodManager: +class MoodManager: def __init__(self): - self.mood_list:list[ChatMood] = [] + self.mood_list: list[ChatMood] = [] """当前情绪状态""" self.task_started: bool = False @@ -204,23 +196,23 @@ class MoodManager: """启动情绪回归后台任务""" if self.task_started: return - + logger.info("启动情绪回归任务...") task = MoodRegressionTask(self) await async_task_manager.add_task(task) self.task_started = True logger.info("情绪回归任务已启动") - def get_mood_by_chat_id(self, chat_id:str) -> ChatMood: + def get_mood_by_chat_id(self, chat_id: str) -> ChatMood: for mood in self.mood_list: if mood.chat_id == chat_id: return mood - + new_mood = ChatMood(chat_id) self.mood_list.append(new_mood) return new_mood - - def reset_mood_by_chat_id(self, chat_id:str): + + def reset_mood_by_chat_id(self, chat_id: str): for mood in self.mood_list: if mood.chat_id == chat_id: mood.mood_state = "感觉很平静" @@ -228,7 +220,6 @@ class MoodManager: return self.mood_list.append(ChatMood(chat_id)) - init_prompt()