🤖 自动格式化代码 [skip ci]

This commit is contained in:
github-actions[bot]
2025-07-08 18:10:43 +00:00
parent bb906d59b2
commit 9eeff628b8
8 changed files with 50 additions and 64 deletions

4
bot.py
View File

@@ -16,8 +16,6 @@ from pathlib import Path
from rich.traceback import install from rich.traceback import install
# maim_message imports for console input # 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 from src.common.logger import initialize_logging, get_logger, shutdown_logging
@@ -236,7 +234,6 @@ def raw_main():
return MainSystem() return MainSystem()
if __name__ == "__main__": if __name__ == "__main__":
exit_code = 0 # 用于记录程序最终的退出状态 exit_code = 0 # 用于记录程序最终的退出状态
try: try:
@@ -265,7 +262,6 @@ if __name__ == "__main__":
logger.error(f"优雅关闭时发生错误: {ge}") logger.error(f"优雅关闭时发生错误: {ge}")
# 新增:检测外部请求关闭 # 新增:检测外部请求关闭
except Exception as e: except Exception as e:
logger.error(f"主程序发生异常: {str(e)} {str(traceback.format_exc())}") logger.error(f"主程序发生异常: {str(e)} {str(traceback.format_exc())}")
exit_code = 1 # 标记发生错误 exit_code = 1 # 标记发生错误

View File

@@ -1,4 +1,3 @@
from src.mood.mood_manager import mood_manager
import enum import enum

View File

@@ -115,10 +115,10 @@ class HeartFCMessageReceiver:
# 6. 兴趣度计算与更新 # 6. 兴趣度计算与更新
interested_rate, is_mentioned = await _calculate_interest(message) interested_rate, is_mentioned = await _calculate_interest(message)
subheartflow.add_message_to_normal_chat_cache(message, interested_rate, is_mentioned) subheartflow.add_message_to_normal_chat_cache(message, interested_rate, is_mentioned)
chat_mood = mood_manager.get_mood_by_chat_id(subheartflow.chat_id) chat_mood = mood_manager.get_mood_by_chat_id(subheartflow.chat_id)
asyncio.create_task(chat_mood.update_mood_by_message(message, interested_rate)) asyncio.create_task(chat_mood.update_mood_by_message(message, interested_rate))
with open("interested_rates.txt", "a", encoding="utf-8") as f: with open("interested_rates.txt", "a", encoding="utf-8") as f:
f.write(f"{interested_rate}\n") f.write(f"{interested_rate}\n")

View File

@@ -503,7 +503,7 @@ class DefaultReplyer:
is_group_chat = bool(chat_stream.group_info) is_group_chat = bool(chat_stream.group_info)
reply_to = reply_data.get("reply_to", "none") reply_to = reply_data.get("reply_to", "none")
extra_info_block = reply_data.get("extra_info", "") or reply_data.get("extra_info_block", "") 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) chat_mood = mood_manager.get_mood_by_chat_id(chat_id)
mood_prompt = chat_mood.mood_state mood_prompt = chat_mood.mood_state

View File

@@ -8,6 +8,7 @@ import numpy as np
from maim_message import UserInfo from maim_message import UserInfo
from src.common.logger import get_logger from src.common.logger import get_logger
# from src.mood.mood_manager import mood_manager # from src.mood.mood_manager import mood_manager
from ..message_receive.message import MessageRecv from ..message_receive.message import MessageRecv
from src.llm_models.utils_model import LLMRequest from src.llm_models.utils_model import LLMRequest

View File

@@ -631,10 +631,10 @@ class ModelConfig(ConfigBase):
replyer_2: dict[str, Any] = field(default_factory=lambda: {}) replyer_2: dict[str, Any] = field(default_factory=lambda: {})
"""normal_chat次要回复模型配置""" """normal_chat次要回复模型配置"""
memory: dict[str, Any] = field(default_factory=lambda: {}) memory: dict[str, Any] = field(default_factory=lambda: {})
"""记忆模型配置""" """记忆模型配置"""
emotion: 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: {}) embedding: dict[str, Any] = field(default_factory=lambda: {})
"""嵌入模型配置""" """嵌入模型配置"""

View File

@@ -35,7 +35,6 @@ class S4UStreamGenerator:
raise ValueError("`replyer_1` 在配置文件中缺少 `model_name` 字段") raise ValueError("`replyer_1` 在配置文件中缺少 `model_name` 字段")
self.replyer_1_config = replyer_1_config self.replyer_1_config = replyer_1_config
self.current_model_name = "unknown model" self.current_model_name = "unknown model"
self.partial_response = "" self.partial_response = ""

View File

@@ -1,7 +1,6 @@
import math import math
import random import random
import time import time
import asyncio
from src.chat.message_receive.message import MessageRecv from src.chat.message_receive.message import MessageRecv
from src.llm_models.utils_model import LLMRequest 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.config.config import global_config
from src.chat.utils.prompt_builder import Prompt, global_prompt_manager from src.chat.utils.prompt_builder import Prompt, global_prompt_manager
from src.manager.async_task_manager import AsyncTask, async_task_manager from src.manager.async_task_manager import AsyncTask, async_task_manager
logger = get_logger("mood") logger = get_logger("mood")
def init_prompt(): def init_prompt():
Prompt( Prompt(
""" """
@@ -40,26 +41,27 @@ def init_prompt():
"regress_mood_prompt", "regress_mood_prompt",
) )
class ChatMood: class ChatMood:
def __init__(self,chat_id:str): def __init__(self, chat_id: str):
self.chat_id:str = chat_id self.chat_id: str = chat_id
self.mood_state:str = "感觉很平静" self.mood_state: str = "感觉很平静"
self.regression_count:int = 0 self.regression_count: int = 0
self.mood_model = LLMRequest( self.mood_model = LLMRequest(
model=global_config.model.emotion, model=global_config.model.emotion,
temperature=0.7, temperature=0.7,
request_type="mood", request_type="mood",
) )
self.last_change_time = 0 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 self.regression_count = 0
during_last_time = message.message_info.time - self.last_change_time during_last_time = message.message_info.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))
@@ -67,15 +69,15 @@ class ChatMood:
interest_multiplier = 0 interest_multiplier = 0
else: else:
interest_multiplier = 3 * math.pow(interested_rate, 0.25) 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) update_probability = min(1.0, base_probability * time_multiplier * interest_multiplier)
if random.random() > update_probability: if random.random() > update_probability:
return return
message_time = message.message_info.time message_time = message.message_info.time
message_list_before_now = get_raw_msg_by_timestamp_with_chat_inclusive( message_list_before_now = get_raw_msg_by_timestamp_with_chat_inclusive(
chat_id=self.chat_id, chat_id=self.chat_id,
@@ -93,8 +95,7 @@ class ChatMood:
truncate=True, truncate=True,
show_actions=True, show_actions=True,
) )
bot_name = global_config.bot.nickname bot_name = global_config.bot.nickname
if global_config.bot.alias_names: if global_config.bot.alias_names:
bot_nickname = f",也有人叫你{','.join(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 prompt_personality = global_config.personality.personality_core
indentify_block = f"你的名字是{bot_name}{bot_nickname},你{prompt_personality}" indentify_block = f"你的名字是{bot_name}{bot_nickname},你{prompt_personality}"
prompt = await global_prompt_manager.format_prompt( prompt = await global_prompt_manager.format_prompt(
"change_mood_prompt", "change_mood_prompt",
chat_talking_prompt=chat_talking_prompt, chat_talking_prompt=chat_talking_prompt,
indentify_block=indentify_block, indentify_block=indentify_block,
mood_state=self.mood_state, mood_state=self.mood_state,
) )
logger.info(f"prompt: {prompt}") logger.info(f"prompt: {prompt}")
response, (reasoning_content, model_name) = await self.mood_model.generate_response_async(prompt=prompt) response, (reasoning_content, model_name) = await self.mood_model.generate_response_async(prompt=prompt)
logger.info(f"response: {response}") logger.info(f"response: {response}")
logger.info(f"reasoning_content: {reasoning_content}") logger.info(f"reasoning_content: {reasoning_content}")
self.mood_state = response self.mood_state = response
self.last_change_time = message_time self.last_change_time = message_time
async def regress_mood(self): async def regress_mood(self):
message_time = time.time() message_time = time.time()
message_list_before_now = get_raw_msg_by_timestamp_with_chat_inclusive( message_list_before_now = get_raw_msg_by_timestamp_with_chat_inclusive(
chat_id=self.chat_id, chat_id=self.chat_id,
@@ -141,8 +139,7 @@ class ChatMood:
truncate=True, truncate=True,
show_actions=True, show_actions=True,
) )
bot_name = global_config.bot.nickname bot_name = global_config.bot.nickname
if global_config.bot.alias_names: if global_config.bot.alias_names:
bot_nickname = f",也有人叫你{','.join(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 prompt_personality = global_config.personality.personality_core
indentify_block = f"你的名字是{bot_name}{bot_nickname},你{prompt_personality}" indentify_block = f"你的名字是{bot_name}{bot_nickname},你{prompt_personality}"
prompt = await global_prompt_manager.format_prompt( prompt = await global_prompt_manager.format_prompt(
"regress_mood_prompt", "regress_mood_prompt",
chat_talking_prompt=chat_talking_prompt, chat_talking_prompt=chat_talking_prompt,
indentify_block=indentify_block, indentify_block=indentify_block,
mood_state=self.mood_state, mood_state=self.mood_state,
) )
logger.info(f"prompt: {prompt}") logger.info(f"prompt: {prompt}")
response, (reasoning_content, model_name) = await self.mood_model.generate_response_async(prompt=prompt) response, (reasoning_content, model_name) = await self.mood_model.generate_response_async(prompt=prompt)
logger.info(f"response: {response}") logger.info(f"response: {response}")
logger.info(f"reasoning_content: {reasoning_content}") logger.info(f"reasoning_content: {reasoning_content}")
self.mood_state = response self.mood_state = response
self.regression_count += 1 self.regression_count += 1
class MoodRegressionTask(AsyncTask): class MoodRegressionTask(AsyncTask):
def __init__(self, mood_manager: 'MoodManager'): def __init__(self, mood_manager: "MoodManager"):
super().__init__(task_name="MoodRegressionTask", run_interval=30) super().__init__(task_name="MoodRegressionTask", run_interval=30)
self.mood_manager = mood_manager self.mood_manager = mood_manager
@@ -179,24 +175,20 @@ class MoodRegressionTask(AsyncTask):
logger.debug("Running mood regression task...") logger.debug("Running mood regression task...")
now = time.time() now = time.time()
for mood in self.mood_manager.mood_list: for mood in self.mood_manager.mood_list:
if mood.last_change_time == 0: if mood.last_change_time == 0:
continue continue
if now - mood.last_change_time > 180: if now - mood.last_change_time > 180:
if mood.regression_count >= 3: if mood.regression_count >= 3:
continue 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() await mood.regress_mood()
class MoodManager:
class MoodManager:
def __init__(self): def __init__(self):
self.mood_list:list[ChatMood] = [] self.mood_list: list[ChatMood] = []
"""当前情绪状态""" """当前情绪状态"""
self.task_started: bool = False self.task_started: bool = False
@@ -204,23 +196,23 @@ class MoodManager:
"""启动情绪回归后台任务""" """启动情绪回归后台任务"""
if self.task_started: if self.task_started:
return return
logger.info("启动情绪回归任务...") logger.info("启动情绪回归任务...")
task = MoodRegressionTask(self) task = MoodRegressionTask(self)
await async_task_manager.add_task(task) await async_task_manager.add_task(task)
self.task_started = True self.task_started = True
logger.info("情绪回归任务已启动") 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: for mood in self.mood_list:
if mood.chat_id == chat_id: if mood.chat_id == chat_id:
return mood return mood
new_mood = ChatMood(chat_id) new_mood = ChatMood(chat_id)
self.mood_list.append(new_mood) self.mood_list.append(new_mood)
return 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: for mood in self.mood_list:
if mood.chat_id == chat_id: if mood.chat_id == chat_id:
mood.mood_state = "感觉很平静" mood.mood_state = "感觉很平静"
@@ -228,7 +220,6 @@ class MoodManager:
return return
self.mood_list.append(ChatMood(chat_id)) self.mood_list.append(ChatMood(chat_id))
init_prompt() init_prompt()