diff --git a/changelogs/changelog.md b/changelogs/changelog.md index f31a46239..4d9760629 100644 --- a/changelogs/changelog.md +++ b/changelogs/changelog.md @@ -2,8 +2,18 @@ ## [0.8.2] - 2025-7-5 +功能更新: + +- 新的情绪系统,麦麦现在拥有持续的情绪 +- + 优化和修复: +- +- 优化no_reply逻辑 +- 优化Log显示 +- 优化关系配置 +- 简化配置文件 - 修复在auto模式下,私聊会转为normal的bug - 修复一般过滤次序问题 - 优化normal_chat代码,采用和focus一致的关系构建 @@ -13,6 +23,7 @@ - 合并action激活器 - emoji统一可选随机激活或llm激活 - 移除observation和processor,简化focus的代码逻辑 +- 修复图片与文字混合兴趣值为0的情况 ## [0.8.1] - 2025-7-5 diff --git a/interested_rates.txt b/interested_rates.txt index 1dd65f819..61a726d58 100644 --- a/interested_rates.txt +++ b/interested_rates.txt @@ -44,3 +44,45 @@ 0.03203964454588806 6.089034714923968 0.027344556981661584 +6.0950644780757655 +1.0360527971483526 +0.02126634371149695 +6.100437294458919 +6.181947292804878 +6.108429840061738 +6.107935292179331 +6.099721599895046 +6.091382258706081 +6.747791924069589 +0.016360696384577725 +0.016360696384577725 +0.016360696384577725 +0.014013152602464482 +0.019318251776732617 +6.093511295222046 +0.019318251776732617 +0.019318251776732617 +0.019318251776732617 +6.093511295222046 +0.019318251776732617 +7.515984058229312 +1.6068256002855255 +6.093940362250887 +1.6170212888969302 +6.179882232137178 +6.179882232137178 +6.087979117713658 +6.089034714923968 +1.200467605219352 +6.0899272096484225 +6.091382258706081 +6.087979117713658 +6.089034714923968 +6.091382258706081 +6.087979117713658 +6.087979117713658 +1.7348177649966143 +6.093940362250887 +8.65717782684436 +8.65717782684436 +0.020373848987042205 diff --git a/src/config/official_configs.py b/src/config/official_configs.py index 6cac62903..440a91268 100644 --- a/src/config/official_configs.py +++ b/src/config/official_configs.py @@ -634,6 +634,9 @@ class ModelConfig(ConfigBase): memory: dict[str, Any] = field(default_factory=lambda: {}) """记忆模型配置""" + + emotion: dict[str, Any] = field(default_factory=lambda: {}) + """情绪模型配置""" vlm: dict[str, Any] = field(default_factory=lambda: {}) """视觉语言模型配置""" diff --git a/src/main.py b/src/main.py index 733c706f9..64129814e 100644 --- a/src/main.py +++ b/src/main.py @@ -16,6 +16,7 @@ from src.chat.message_receive.bot import chat_bot from src.common.logger import get_logger from src.individuality.individuality import get_individuality, Individuality from src.common.server import get_global_server, Server +from src.mood.mood_manager import mood_manager from rich.traceback import install # from src.api.main import start_api_server @@ -99,6 +100,10 @@ class MainSystem: logger.info("willing管理器初始化成功") + # 启动情绪管理器 + await mood_manager.start() + logger.info("情绪管理器初始化成功") + # 初始化聊天管理器 await get_chat_manager()._initialize() diff --git a/src/mood/mood_manager.py b/src/mood/mood_manager.py index bdb867b09..b64e7d94e 100644 --- a/src/mood/mood_manager.py +++ b/src/mood/mood_manager.py @@ -1,5 +1,7 @@ import math import random +import time +import asyncio from src.chat.message_receive.message import MessageRecv from src.llm_models.utils_model import LLMRequest @@ -7,6 +9,7 @@ from ..common.logger import get_logger from src.chat.utils.chat_message_builder import build_readable_messages, get_raw_msg_by_timestamp_with_chat_inclusive 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(): @@ -23,15 +26,29 @@ def init_prompt(): """, "change_mood_prompt", ) + Prompt( + """ +{chat_talking_prompt} +以上是群里最近的聊天记录 + +{indentify_block} +你之前的情绪状态是:{mood_state} + +距离你上次关注群里消息已经过去了一段时间,你冷静了下来,请你输出一句话描述你现在的情绪状态 +请只输出情绪状态,不要输出其他内容: +""", + "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 self.mood_model = LLMRequest( - model=global_config.model.utils, + model=global_config.model.emotion, temperature=0.7, request_type="mood", ) @@ -39,6 +56,7 @@ class ChatMood: self.last_change_time = 0 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 @@ -104,13 +122,95 @@ class ChatMood: 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, + timestamp_start=self.last_change_time, + timestamp_end=message_time, + limit=15, + limit_mode="last", + ) + chat_talking_prompt = build_readable_messages( + message_list_before_now, + replace_bot_name=True, + merge_messages=False, + timestamp_mode="normal_no_YMD", + read_mark=0.0, + 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)}" + else: + bot_nickname = "" + + 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'): + super().__init__(task_name="MoodRegressionTask", run_interval=30) + self.mood_manager = mood_manager + + async def run(self): + 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} 次") + await mood.regress_mood() + class MoodManager: def __init__(self): self.mood_list:list[ChatMood] = [] """当前情绪状态""" + self.task_started: bool = False + + async def start(self): + """启动情绪回归后台任务""" + 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: for mood in self.mood_list: if mood.chat_id == chat_id: @@ -124,6 +224,7 @@ class MoodManager: for mood in self.mood_list: if mood.chat_id == chat_id: mood.mood_state = "感觉很平静" + mood.regression_count = 0 return self.mood_list.append(ChatMood(chat_id)) diff --git a/template/bot_config_template.toml b/template/bot_config_template.toml index 49e0674ef..d4c158f65 100644 --- a/template/bot_config_template.toml +++ b/template/bot_config_template.toml @@ -282,6 +282,14 @@ pri_in = 2 pri_out = 8 temp = 0.3 +[model.emotion] #负责麦麦的情绪变化 +name = "Pro/deepseek-ai/DeepSeek-V3" +provider = "SILICONFLOW" +pri_in = 2 +pri_out = 8 +temp = 0.3 + + [model.memory] # 记忆模型 name = "Qwen/Qwen3-30B-A3B" provider = "SILICONFLOW"