feat;新的情绪系统

This commit is contained in:
SengokuCola
2025-07-09 02:09:32 +08:00
parent 50f0ddf2ce
commit 7ef5c9a46d
6 changed files with 171 additions and 1 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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: {})
"""视觉语言模型配置"""

View File

@@ -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()

View File

@@ -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))

View File

@@ -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"