refactor(chat): 重构消息兴趣度计算与动作记录机制

重构聊天系统以使用集中式消息管理API,移除ChatMessageContext类,将兴趣度计算和动作记录功能整合到StreamContext中。

主要变更:
- 移除ChatMessageContext类,使用StreamContext统一管理消息上下文
- 在DatabaseMessages模型中添加interest_degree、actions、should_reply字段
- 实现消息管理器API用于更新消息信息和刷新focus_energy
- 重构ChatStream的focus_energy计算逻辑,基于StreamContext历史消息
- 在动作管理器中添加动作记录功能,确保动作执行后更新消息状态

BREAKING CHANGE: ChatMessageContext类已被移除,相关功能需使用StreamContext API替代
This commit is contained in:
Windpicker-owo
2025-09-26 13:56:43 +08:00
parent bcea1a93c1
commit bbbf543078
7 changed files with 364 additions and 181 deletions

View File

@@ -95,6 +95,10 @@ class DatabaseMessages(BaseDataModel):
chat_info_platform: str = "",
chat_info_create_time: float = 0.0,
chat_info_last_active_time: float = 0.0,
# 新增字段
interest_degree: float = 0.0,
actions: Optional[list] = None,
should_reply: bool = False,
**kwargs: Any,
):
self.message_id = message_id
@@ -103,6 +107,11 @@ class DatabaseMessages(BaseDataModel):
self.reply_to = reply_to
self.interest_value = interest_value
# 新增字段
self.interest_degree = interest_degree
self.actions = actions
self.should_reply = should_reply
self.key_words = key_words
self.key_words_lite = key_words_lite
self.is_mentioned = is_mentioned
@@ -191,6 +200,10 @@ class DatabaseMessages(BaseDataModel):
"is_notify": self.is_notify,
"selected_expressions": self.selected_expressions,
"is_read": self.is_read,
# 新增字段
"interest_degree": self.interest_degree,
"actions": self.actions,
"should_reply": self.should_reply,
"user_id": self.user_info.user_id,
"user_nickname": self.user_info.user_nickname,
"user_cardname": self.user_info.user_cardname,
@@ -208,6 +221,60 @@ class DatabaseMessages(BaseDataModel):
"chat_info_user_cardname": self.chat_info.user_info.user_cardname,
}
def update_message_info(self, interest_degree: float = None, actions: list = None, should_reply: bool = None):
"""
更新消息信息
Args:
interest_degree: 兴趣度值
actions: 执行的动作列表
should_reply: 是否应该回复
"""
if interest_degree is not None:
self.interest_degree = interest_degree
if actions is not None:
self.actions = actions
if should_reply is not None:
self.should_reply = should_reply
def add_action(self, action: str):
"""
添加执行的动作到消息中
Args:
action: 要添加的动作名称
"""
if self.actions is None:
self.actions = []
if action not in self.actions: # 避免重复添加
self.actions.append(action)
def get_actions(self) -> list:
"""
获取执行的动作列表
Returns:
动作列表,如果没有动作则返回空列表
"""
return self.actions or []
def get_message_summary(self) -> Dict[str, Any]:
"""
获取消息摘要信息
Returns:
包含关键字段的消息摘要
"""
return {
"message_id": self.message_id,
"time": self.time,
"interest_degree": self.interest_degree,
"actions": self.actions,
"should_reply": self.should_reply,
"user_nickname": self.user_info.user_nickname,
"display_message": self.display_message,
}
@dataclass(init=False)
class DatabaseActionRecords(BaseDataModel):

View File

@@ -47,6 +47,11 @@ class StreamContext(BaseDataModel):
next_check_time: float = field(default_factory=time.time) # 下次检查时间
distribution_interval: float = 5.0 # 当前分发周期(秒)
# 新增字段以替代ChatMessageContext功能
current_message: Optional["DatabaseMessages"] = None
priority_mode: Optional[str] = None
priority_info: Optional[dict] = None
def add_message(self, message: "DatabaseMessages"):
"""添加消息到上下文"""
message.is_read = False
@@ -55,6 +60,48 @@ class StreamContext(BaseDataModel):
# 自动检测和更新chat type
self._detect_chat_type(message)
def update_message_info(self, message_id: str, interest_degree: float = None, actions: list = None, should_reply: bool = None):
"""
更新消息信息
Args:
message_id: 消息ID
interest_degree: 兴趣度值
actions: 执行的动作列表
should_reply: 是否应该回复
"""
# 在未读消息中查找并更新
for message in self.unread_messages:
if message.message_id == message_id:
message.update_message_info(interest_degree, actions, should_reply)
break
# 在历史消息中查找并更新
for message in self.history_messages:
if message.message_id == message_id:
message.update_message_info(interest_degree, actions, should_reply)
break
def add_action_to_message(self, message_id: str, action: str):
"""
向指定消息添加执行的动作
Args:
message_id: 消息ID
action: 要添加的动作名称
"""
# 在未读消息中查找并更新
for message in self.unread_messages:
if message.message_id == message_id:
message.add_action(action)
break
# 在历史消息中查找并更新
for message in self.history_messages:
if message.message_id == message_id:
message.add_action(action)
break
def _detect_chat_type(self, message: "DatabaseMessages"):
"""根据消息内容自动检测聊天类型"""
# 只有在第一次添加消息时才检测聊天类型,避免后续消息改变类型
@@ -150,6 +197,61 @@ class StreamContext(BaseDataModel):
"""获取当前的afc阈值调整量"""
return self.afc_threshold_adjustment
def set_current_message(self, message: "DatabaseMessages"):
"""设置当前消息"""
self.current_message = message
def get_template_name(self) -> Optional[str]:
"""获取模板名称"""
if self.current_message and hasattr(self.current_message, 'additional_config') and self.current_message.additional_config:
try:
import json
config = json.loads(self.current_message.additional_config)
if config.get('template_info') and not config.get('template_default', True):
return config.get('template_name')
except (json.JSONDecodeError, AttributeError):
pass
return None
def get_last_message(self) -> Optional["DatabaseMessages"]:
"""获取最后一条消息"""
if self.current_message:
return self.current_message
if self.unread_messages:
return self.unread_messages[-1]
if self.history_messages:
return self.history_messages[-1]
return None
def check_types(self, types: list) -> bool:
"""检查消息类型"""
if not self.current_message:
return False
# 检查消息是否支持指定的类型
# 这里简化处理,实际应该根据消息的格式信息检查
if hasattr(self.current_message, 'additional_config') and self.current_message.additional_config:
try:
import json
config = json.loads(self.current_message.additional_config)
if 'format_info' in config and 'accept_format' in config['format_info']:
accept_format = config['format_info']['accept_format']
for t in types:
if t not in accept_format:
return False
return True
except (json.JSONDecodeError, AttributeError):
pass
return False
def get_priority_mode(self) -> Optional[str]:
"""获取优先级模式"""
return self.priority_mode
def get_priority_info(self) -> Optional[dict]:
"""获取优先级信息"""
return self.priority_info
@dataclass
class MessageManagerStats(BaseDataModel):