From 85320f6d5054859cee1b14743952fadfbb994381 Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Thu, 25 Sep 2025 18:23:10 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E7=A7=BB=E9=99=A4mood=EF=BC=8C?= =?UTF-8?q?=E4=BD=86=E6=98=AF=E5=8A=A0=E5=85=A5mood=5Fapi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../heart_flow/heartflow_message_processor.py | 4 -- src/mood/mood_manager.py | 70 +++++++++++++++++++ src/plugin_system/apis/__init__.py | 2 + src/plugin_system/apis/mood_api.py | 16 +++++ template/bot_config_template.toml | 2 +- 5 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 src/plugin_system/apis/mood_api.py diff --git a/src/chat/heart_flow/heartflow_message_processor.py b/src/chat/heart_flow/heartflow_message_processor.py index b39704ba..cf1ac40c 100644 --- a/src/chat/heart_flow/heartflow_message_processor.py +++ b/src/chat/heart_flow/heartflow_message_processor.py @@ -77,10 +77,6 @@ class HeartFCMessageReceiver: heartflow_chat: HeartFChatting = await heartflow.get_or_create_heartflow_chat(chat.stream_id) # type: ignore - if global_config.mood.enable_mood: - chat_mood = mood_manager.get_mood_by_chat_id(heartflow_chat.stream_id) - asyncio.create_task(chat_mood.update_mood_by_message(message)) - # 3. 日志记录 mes_name = chat.group_info.group_name if chat.group_info else "私聊" diff --git a/src/mood/mood_manager.py b/src/mood/mood_manager.py index be193e07..d0832d18 100644 --- a/src/mood/mood_manager.py +++ b/src/mood/mood_manager.py @@ -33,6 +33,21 @@ def init_prompt(): Prompt( """ {chat_talking_prompt} +以上是群里正在进行的聊天记录 + +{identity_block} +你先前的情绪状态是:{mood_state} +你的情绪特点是:{emotion_style} + +现在,请你根据先前的情绪状态和现在的聊天内容,总结推断你现在的情绪状态 +请只输出新的情绪状态,不要输出其他内容: +""", + "get_mood_prompt", + ) + + Prompt( + """ +{chat_talking_prompt} 以上是群里最近的聊天记录 {identity_block} @@ -139,6 +154,61 @@ class ChatMood: self.mood_state = response self.last_change_time = message_time + + async def get_mood(self) -> str: + self.regression_count = 0 + + current_time = time.time() + + logger.info(f"{self.log_prefix} 获取情绪状态") + 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=current_time, + limit=int(global_config.chat.max_context_size / 3), + limit_mode="last", + ) + + chat_talking_prompt = build_readable_messages( + message_list_before_now, + replace_bot_name=True, + 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 = "" + + identity_block = f"你的名字是{bot_name}{bot_nickname}" + + prompt = await global_prompt_manager.format_prompt( + "get_mood_prompt", + chat_talking_prompt=chat_talking_prompt, + identity_block=identity_block, + mood_state=self.mood_state, + emotion_style=global_config.personality.emotion_style, + ) + + response, (reasoning_content, _, _) = await self.mood_model.generate_response_async( + prompt=prompt, temperature=0.7 + ) + if global_config.debug.show_prompt: + logger.info(f"{self.log_prefix} prompt: {prompt}") + logger.info(f"{self.log_prefix} response: {response}") + logger.info(f"{self.log_prefix} reasoning_content: {reasoning_content}") + + logger.info(f"{self.log_prefix} 情绪状态更新为: {response}") + + self.mood_state = response + + self.last_change_time = current_time + + return response async def regress_mood(self): message_time = time.time() diff --git a/src/plugin_system/apis/__init__.py b/src/plugin_system/apis/__init__.py index 036c077e..5df61ef8 100644 --- a/src/plugin_system/apis/__init__.py +++ b/src/plugin_system/apis/__init__.py @@ -19,6 +19,7 @@ from src.plugin_system.apis import ( send_api, tool_api, frequency_api, + mood_api, ) from .logging_api import get_logger from .plugin_register_api import register_plugin @@ -40,4 +41,5 @@ __all__ = [ "register_plugin", "tool_api", "frequency_api", + "mood_api", ] diff --git a/src/plugin_system/apis/mood_api.py b/src/plugin_system/apis/mood_api.py new file mode 100644 index 00000000..10094021 --- /dev/null +++ b/src/plugin_system/apis/mood_api.py @@ -0,0 +1,16 @@ +import asyncio +import traceback +import time +from typing import Optional, Union, Dict, List, TYPE_CHECKING, Tuple + +from src.chat.message_receive import message +from src.common.logger import get_logger +from src.mood.mood_manager import mood_manager + +logger = get_logger("mood_api") + + +async def get_mood_by_chat_id(chat_id: str) -> Optional[float]: + chat_mood = mood_manager.get_mood_by_chat_id(chat_id) + mood = asyncio.create_task(chat_mood.get_mood()) + return mood \ No newline at end of file diff --git a/template/bot_config_template.toml b/template/bot_config_template.toml index f692491f..4ac36f15 100644 --- a/template/bot_config_template.toml +++ b/template/bot_config_template.toml @@ -86,7 +86,7 @@ enable_mood = true # 是否启用情绪系统 mood_update_threshold = 1 # 情绪更新阈值,越高,更新越慢 [emoji] -emoji_chance = 0.6 # 麦麦激活表情包动作的概率 +emoji_chance = 0.4 # 麦麦激活表情包动作的概率 max_reg_num = 100 # 表情包最大注册数量 do_replace = true # 开启则在达到最大数量时删除(替换)表情包,关闭则达到最大数量时不会继续收集表情包 check_interval = 10 # 检查表情包(注册,破损,删除)的时间间隔(分钟)