feat;新的情绪系统
This commit is contained in:
@@ -2,8 +2,18 @@
|
|||||||
|
|
||||||
## [0.8.2] - 2025-7-5
|
## [0.8.2] - 2025-7-5
|
||||||
|
|
||||||
|
功能更新:
|
||||||
|
|
||||||
|
- 新的情绪系统,麦麦现在拥有持续的情绪
|
||||||
|
-
|
||||||
|
|
||||||
优化和修复:
|
优化和修复:
|
||||||
|
|
||||||
|
-
|
||||||
|
- 优化no_reply逻辑
|
||||||
|
- 优化Log显示
|
||||||
|
- 优化关系配置
|
||||||
|
- 简化配置文件
|
||||||
- 修复在auto模式下,私聊会转为normal的bug
|
- 修复在auto模式下,私聊会转为normal的bug
|
||||||
- 修复一般过滤次序问题
|
- 修复一般过滤次序问题
|
||||||
- 优化normal_chat代码,采用和focus一致的关系构建
|
- 优化normal_chat代码,采用和focus一致的关系构建
|
||||||
@@ -13,6 +23,7 @@
|
|||||||
- 合并action激活器
|
- 合并action激活器
|
||||||
- emoji统一可选随机激活或llm激活
|
- emoji统一可选随机激活或llm激活
|
||||||
- 移除observation和processor,简化focus的代码逻辑
|
- 移除observation和processor,简化focus的代码逻辑
|
||||||
|
- 修复图片与文字混合兴趣值为0的情况
|
||||||
|
|
||||||
## [0.8.1] - 2025-7-5
|
## [0.8.1] - 2025-7-5
|
||||||
|
|
||||||
|
|||||||
@@ -44,3 +44,45 @@
|
|||||||
0.03203964454588806
|
0.03203964454588806
|
||||||
6.089034714923968
|
6.089034714923968
|
||||||
0.027344556981661584
|
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
|
||||||
|
|||||||
@@ -635,6 +635,9 @@ class ModelConfig(ConfigBase):
|
|||||||
memory: dict[str, Any] = field(default_factory=lambda: {})
|
memory: dict[str, Any] = field(default_factory=lambda: {})
|
||||||
"""记忆模型配置"""
|
"""记忆模型配置"""
|
||||||
|
|
||||||
|
emotion: dict[str, Any] = field(default_factory=lambda: {})
|
||||||
|
"""情绪模型配置"""
|
||||||
|
|
||||||
vlm: dict[str, Any] = field(default_factory=lambda: {})
|
vlm: dict[str, Any] = field(default_factory=lambda: {})
|
||||||
"""视觉语言模型配置"""
|
"""视觉语言模型配置"""
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ from src.chat.message_receive.bot import chat_bot
|
|||||||
from src.common.logger import get_logger
|
from src.common.logger import get_logger
|
||||||
from src.individuality.individuality import get_individuality, Individuality
|
from src.individuality.individuality import get_individuality, Individuality
|
||||||
from src.common.server import get_global_server, Server
|
from src.common.server import get_global_server, Server
|
||||||
|
from src.mood.mood_manager import mood_manager
|
||||||
from rich.traceback import install
|
from rich.traceback import install
|
||||||
# from src.api.main import start_api_server
|
# from src.api.main import start_api_server
|
||||||
|
|
||||||
@@ -99,6 +100,10 @@ class MainSystem:
|
|||||||
|
|
||||||
logger.info("willing管理器初始化成功")
|
logger.info("willing管理器初始化成功")
|
||||||
|
|
||||||
|
# 启动情绪管理器
|
||||||
|
await mood_manager.start()
|
||||||
|
logger.info("情绪管理器初始化成功")
|
||||||
|
|
||||||
# 初始化聊天管理器
|
# 初始化聊天管理器
|
||||||
|
|
||||||
await get_chat_manager()._initialize()
|
await get_chat_manager()._initialize()
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import math
|
import math
|
||||||
import random
|
import random
|
||||||
|
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
|
||||||
@@ -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.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.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
|
||||||
logger = get_logger("mood")
|
logger = get_logger("mood")
|
||||||
|
|
||||||
def init_prompt():
|
def init_prompt():
|
||||||
@@ -23,15 +26,29 @@ def init_prompt():
|
|||||||
""",
|
""",
|
||||||
"change_mood_prompt",
|
"change_mood_prompt",
|
||||||
)
|
)
|
||||||
|
Prompt(
|
||||||
|
"""
|
||||||
|
{chat_talking_prompt}
|
||||||
|
以上是群里最近的聊天记录
|
||||||
|
|
||||||
|
{indentify_block}
|
||||||
|
你之前的情绪状态是:{mood_state}
|
||||||
|
|
||||||
|
距离你上次关注群里消息已经过去了一段时间,你冷静了下来,请你输出一句话描述你现在的情绪状态
|
||||||
|
请只输出情绪状态,不要输出其他内容:
|
||||||
|
""",
|
||||||
|
"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.mood_model = LLMRequest(
|
self.mood_model = LLMRequest(
|
||||||
model=global_config.model.utils,
|
model=global_config.model.emotion,
|
||||||
temperature=0.7,
|
temperature=0.7,
|
||||||
request_type="mood",
|
request_type="mood",
|
||||||
)
|
)
|
||||||
@@ -39,6 +56,7 @@ class ChatMood:
|
|||||||
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
|
||||||
|
|
||||||
during_last_time = message.message_info.time - self.last_change_time
|
during_last_time = message.message_info.time - self.last_change_time
|
||||||
|
|
||||||
@@ -104,12 +122,94 @@ class ChatMood:
|
|||||||
|
|
||||||
self.last_change_time = message_time
|
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:
|
class MoodManager:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.mood_list:list[ChatMood] = []
|
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:
|
def get_mood_by_chat_id(self, chat_id:str) -> ChatMood:
|
||||||
for mood in self.mood_list:
|
for mood in self.mood_list:
|
||||||
@@ -124,6 +224,7 @@ class MoodManager:
|
|||||||
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 = "感觉很平静"
|
||||||
|
mood.regression_count = 0
|
||||||
return
|
return
|
||||||
self.mood_list.append(ChatMood(chat_id))
|
self.mood_list.append(ChatMood(chat_id))
|
||||||
|
|
||||||
|
|||||||
@@ -282,6 +282,14 @@ pri_in = 2
|
|||||||
pri_out = 8
|
pri_out = 8
|
||||||
temp = 0.3
|
temp = 0.3
|
||||||
|
|
||||||
|
[model.emotion] #负责麦麦的情绪变化
|
||||||
|
name = "Pro/deepseek-ai/DeepSeek-V3"
|
||||||
|
provider = "SILICONFLOW"
|
||||||
|
pri_in = 2
|
||||||
|
pri_out = 8
|
||||||
|
temp = 0.3
|
||||||
|
|
||||||
|
|
||||||
[model.memory] # 记忆模型
|
[model.memory] # 记忆模型
|
||||||
name = "Qwen/Qwen3-30B-A3B"
|
name = "Qwen/Qwen3-30B-A3B"
|
||||||
provider = "SILICONFLOW"
|
provider = "SILICONFLOW"
|
||||||
|
|||||||
Reference in New Issue
Block a user