重构database_data_model.py

没用力测试,炸了叫lui修
This commit is contained in:
LuiKlee
2025-10-08 18:39:43 +08:00
committed by GitHub
parent d0d1a35fd4
commit b3ae8e4f1a

View File

@@ -7,140 +7,125 @@ from . import BaseDataModel
@dataclass
class DatabaseUserInfo(BaseDataModel):
platform: str = field(default_factory=str)
user_id: str = field(default_factory=str)
user_nickname: str = field(default_factory=str)
user_cardname: str | None = None
# def __post_init__(self):
# assert isinstance(self.platform, str), "platform must be a string"
# assert isinstance(self.user_id, str), "user_id must be a string"
# assert isinstance(self.user_nickname, str), "user_nickname must be a string"
# assert isinstance(self.user_cardname, str) or self.user_cardname is None, (
# "user_cardname must be a string or None"
# )
"""
用户信息数据模型,用于存储用户的基本信息。
该类通过 dataclass 实现,继承自 BaseDataModel。
"""
platform: str = field(default_factory=str) # 用户所属平台如微信、QQ 等)
user_id: str = field(default_factory=str) # 用户唯一标识 ID
user_nickname: str = field(default_factory=str) # 用户昵称
user_cardname: str | None = None # 用户备注名或群名片,可为空
@dataclass
class DatabaseGroupInfo(BaseDataModel):
group_id: str = field(default_factory=str)
group_name: str = field(default_factory=str)
group_platform: str | None = None
# def __post_init__(self):
# assert isinstance(self.group_id, str), "group_id must be a string"
# assert isinstance(self.group_name, str), "group_name must be a string"
# assert isinstance(self.group_platform, str) or self.group_platform is None, (
# "group_platform must be a string or None"
# )
"""
群组信息数据模型,用于存储群组的基本信息。
"""
group_id: str = field(default_factory=str) # 群组唯一标识 ID
group_name: str = field(default_factory=str) # 群组名称
group_platform: str | None = None # 群组所在平台,可为空
@dataclass
class DatabaseChatInfo(BaseDataModel):
stream_id: str = field(default_factory=str)
platform: str = field(default_factory=str)
create_time: float = field(default_factory=float)
last_active_time: float = field(default_factory=float)
user_info: DatabaseUserInfo = field(default_factory=DatabaseUserInfo)
group_info: DatabaseGroupInfo | None = None
# def __post_init__(self):
# assert isinstance(self.stream_id, str), "stream_id must be a string"
# assert isinstance(self.platform, str), "platform must be a string"
# assert isinstance(self.create_time, float), "create_time must be a float"
# assert isinstance(self.last_active_time, float), "last_active_time must be a float"
# assert isinstance(self.user_info, DatabaseUserInfo), "user_info must be a DatabaseUserInfo instance"
# assert isinstance(self.group_info, DatabaseGroupInfo) or self.group_info is None, (
# "group_info must be a DatabaseGroupInfo instance or None"
# )
"""
聊天会话信息数据模型,用于描述一个聊天对话的上下文信息。
包括会话 ID、平台、创建时间、最后活跃时间以及关联的用户和群组信息。
"""
stream_id: str = field(default_factory=str) # 会话流 ID唯一标识一个聊天对话
platform: str = field(default_factory=str) # 所属平台如微信、QQ 等)
create_time: float = field(default_factory=float) # 会话创建时间戳
last_active_time: float = field(default_factory=float) # 最后一次活跃时间戳
user_info: DatabaseUserInfo = field(default_factory=DatabaseUserInfo) # 关联的用户信息
group_info: DatabaseGroupInfo | None = None # 关联的群组信息,可为空(私聊场景)
@dataclass(init=False)
class DatabaseMessages(BaseDataModel):
"""
消息数据模型,用于存储每一条消息的完整信息,包括内容、元数据、用户、聊天上下文等。
使用 init=False 实现自定义初始化逻辑,通过 __init__ 手动设置字段。
"""
def __init__(
self,
message_id: str = "",
time: float = 0.0,
chat_id: str = "",
reply_to: str | None = None,
interest_value: float | None = None,
key_words: str | None = None,
key_words_lite: str | None = None,
is_mentioned: bool | None = None,
is_at: bool | None = None,
reply_probability_boost: float | None = None,
processed_plain_text: str | None = None,
display_message: str | None = None,
priority_mode: str | None = None,
priority_info: str | None = None,
additional_config: str | None = None,
is_emoji: bool = False,
is_picid: bool = False,
is_command: bool = False,
is_notify: bool = False,
selected_expressions: str | None = None,
is_read: bool = False,
user_id: str = "",
user_nickname: str = "",
user_cardname: str | None = None,
user_platform: str = "",
chat_info_group_id: str | None = None,
chat_info_group_name: str | None = None,
chat_info_group_platform: str | None = None,
chat_info_user_id: str = "",
chat_info_user_nickname: str = "",
chat_info_user_cardname: str | None = None,
chat_info_user_platform: str = "",
chat_info_stream_id: str = "",
chat_info_platform: str = "",
chat_info_create_time: float = 0.0,
chat_info_last_active_time: float = 0.0,
# 新增字段
actions: list | None = None,
should_reply: bool = False,
should_act: bool = False,
**kwargs: Any,
message_id: str = "", # 消息唯一 ID
time: float = 0.0, # 消息时间戳
chat_id: str = "", # 所属聊天会话 ID
reply_to: str | None = None, # 回复的目标消息 ID可为空
interest_value: float | None = None, # 消息兴趣度评分,用于优先级判断
key_words: str | None = None, # 消息关键词,用于内容分析
key_words_lite: str | None = None, # 精简关键词,可能用于快速匹配
is_mentioned: bool | None = None, # 是否被提及(@
is_at: bool | None = None, # 是否直接 @ 机器人
reply_probability_boost: float | None = None, # 回复概率增强值,影响是否回复
processed_plain_text: str | None = None, # 处理后的纯文本内容
display_message: str | None = None, # 显示消息内容(可能包含格式)
priority_mode: str | None = None, # 优先级模式
priority_info: str | None = None, # 优先级附加信息
additional_config: str | None = None, # 额外配置字符串
is_emoji: bool = False, # 是否为表情消息
is_picid: bool = False, # 是否为图片消息(包含图片 ID
is_command: bool = False, # 是否为命令消息(如 /help
is_notify: bool = False, # 是否为通知消息(如系统通知)
selected_expressions: str | None = None, # 选择的表情或响应模板
is_read: bool = False, # 是否已读
user_id: str = "", # 用户 ID
user_nickname: str = "", # 用户昵称
user_cardname: str | None = None, # 用户备注名或群名片
user_platform: str = "", # 用户所属平台
chat_info_group_id: str | None = None, # 所属群组 ID聊天上下文信息
chat_info_group_name: str | None = None, # 所属群组名称
chat_info_group_platform: str | None = None, # 所属群组平台
chat_info_user_id: str = "", # 聊天上下文中的用户 ID
chat_info_user_nickname: str = "", # 聊天上下文中的用户昵称
chat_info_user_cardname: str | None = None, # 聊天上下文中的用户备注名
chat_info_user_platform: str = "", # 聊天上下文中的用户平台
chat_info_stream_id: str = "", # 聊天上下文的会话流 ID
chat_info_platform: str = "", # 聊天上下文平台
chat_info_create_time: float = 0.0, # 聊天上下文创建时间
chat_info_last_active_time: float = 0.0, # 聊天上下文最后活跃时间
actions: list | None = None, # 与消息相关的动作列表(如回复、转发等)
should_reply: bool = False, # 是否应该自动回复
should_act: bool = False, # 是否应该执行动作(如发送消息)
**kwargs: Any, # 允许传入任意额外字段
):
# 初始化基础字段
self.message_id = message_id
self.time = time
self.chat_id = chat_id
self.reply_to = reply_to
self.interest_value = interest_value
# 新增字段
self.actions = actions
self.should_reply = should_reply
self.should_act = should_act
self.key_words = key_words
self.key_words_lite = key_words_lite
self.is_mentioned = is_mentioned
self.is_at = is_at
self.reply_probability_boost = reply_probability_boost
self.processed_plain_text = processed_plain_text
self.display_message = display_message
self.priority_mode = priority_mode
self.priority_info = priority_info
self.additional_config = additional_config
self.is_emoji = is_emoji
self.is_picid = is_picid
self.is_command = is_command
self.is_notify = is_notify
self.selected_expressions = selected_expressions
self.is_read = is_read
self.actions = actions
self.should_reply = should_reply
self.should_act = should_act
self.group_info: DatabaseGroupInfo | None = None
# 构建用户信息对象
self.user_info = DatabaseUserInfo(
user_id=user_id,
user_nickname=user_nickname,
user_cardname=user_cardname,
platform=user_platform,
)
# 构建群组信息对象(仅当群组信息完整时)
self.group_info = None
if chat_info_group_id and chat_info_group_name:
self.group_info = DatabaseGroupInfo(
group_id=chat_info_group_id,
@@ -148,6 +133,7 @@ class DatabaseMessages(BaseDataModel):
group_platform=chat_info_group_platform,
)
# 构建聊天信息对象
self.chat_info = DatabaseChatInfo(
stream_id=chat_info_stream_id,
platform=chat_info_platform,
@@ -162,21 +148,17 @@ class DatabaseMessages(BaseDataModel):
group_info=self.group_info,
)
# 处理额外传入的字段kwargs
if kwargs:
for key, value in kwargs.items():
setattr(self, key, value)
# def __post_init__(self):
# assert isinstance(self.message_id, str), "message_id must be a string"
# assert isinstance(self.time, float), "time must be a float"
# assert isinstance(self.chat_id, str), "chat_id must be a string"
# assert isinstance(self.reply_to, str) or self.reply_to is None, "reply_to must be a string or None"
# assert isinstance(self.interest_value, float) or self.interest_value is None, (
# "interest_value must be a float or None"
# )
def flatten(self) -> dict[str, Any]:
"""
将消息数据模型转换为字典格式,便于存储或传输
将消息对象转换为字典格式,便于序列化存储或传输
Returns:
包含所有字段的字典,其中嵌套对象(如 user_info、group_info已展开为扁平结构。
"""
return {
"message_id": self.message_id,
@@ -200,7 +182,6 @@ class DatabaseMessages(BaseDataModel):
"is_notify": self.is_notify,
"selected_expressions": self.selected_expressions,
"is_read": self.is_read,
# 新增字段
"actions": self.actions,
"should_reply": self.should_reply,
"user_id": self.user_info.user_id,
@@ -214,22 +195,22 @@ class DatabaseMessages(BaseDataModel):
"chat_info_platform": self.chat_info.platform,
"chat_info_create_time": self.chat_info.create_time,
"chat_info_last_active_time": self.chat_info.last_active_time,
"chat_info_user_platform": self.chat_info.user_info.platform,
"chat_info_user_id": self.chat_info.user_info.user_id,
"chat_info_user_nickname": self.chat_info.user_info.user_nickname,
"chat_info_user_cardname": self.chat_info.user_info.user_cardname,
"chat_info_user_platform": self.chat_info.user_info.platform,
}
def update_message_info(
self, interest_value: float | None = None, actions: list | None = None, should_reply: bool | None = None
):
"""
更新消息信息
更新消息的关键信息字段,支持部分更新。
Args:
interest_value: 兴趣度值
actions: 执行的动作列表
should_reply: 是否应该回复
interest_value: 兴趣度值,用于影响消息优先级
actions: 执行的动作列表,替换原有列表
should_reply: 是否应该回复的标志
"""
if interest_value is not None:
self.interest_value = interest_value
@@ -240,10 +221,10 @@ class DatabaseMessages(BaseDataModel):
def add_action(self, action: str):
"""
添加执行的动作到消息中
向消息的动作列表中添加一个动作。
Args:
action: 要添加的动作名称
action: 要添加的动作名称(字符串)
"""
if self.actions is None:
self.actions = []
@@ -252,19 +233,19 @@ class DatabaseMessages(BaseDataModel):
def get_actions(self) -> list:
"""
获取执行的动作列表
获取消息的动作列表
Returns:
动作列表,如果没有动作则返回空列表
动作列表,如果没有动作则返回空列表
"""
return self.actions or []
def get_message_summary(self) -> dict[str, Any]:
"""
获取消息摘要信息
获取消息的关键摘要信息,用于日志、通知或前端展示。
Returns:
包含关键字段的消息摘要
包含消息 ID、时间、兴趣度、动作、回复状态、用户昵称和显示内容的摘要字典。
"""
return {
"message_id": self.message_id,
@@ -279,22 +260,27 @@ class DatabaseMessages(BaseDataModel):
@dataclass(init=False)
class DatabaseActionRecords(BaseDataModel):
"""
动作记录数据模型,用于记录系统执行的某个操作或动作的详细信息。
用于审计、日志或调试。
"""
def __init__(
self,
action_id: str,
time: float,
action_name: str,
action_data: str,
action_done: bool,
action_build_into_prompt: bool,
action_prompt_display: str,
chat_id: str,
chat_info_stream_id: str,
chat_info_platform: str,
action_id: str, # 动作唯一 ID
time: float, # 动作执行时间戳
action_name: str, # 动作名称(如 send_message、reply_with_image
action_data: str, # 动作的参数数据,以 JSON 字符串形式存储
action_done: bool, # 动作是否成功完成
action_build_into_prompt: bool, # 是否将动作结果用于构建 prompt
action_prompt_display: str, # 动作在 prompt 中的显示文本
chat_id: str, # 所属聊天 ID
chat_info_stream_id: str, # 所属聊天流 ID
chat_info_platform: str, # 所属平台
):
self.action_id = action_id
self.time = time
self.action_name = action_name
# 解析传入的 action_data 字符串为 Python 对象
if isinstance(action_data, str):
self.action_data = json.loads(action_data)
else: