From 9fdae38b6a5919d92bbcf213e57422e2fa563515 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Sun, 12 Oct 2025 14:10:27 +0800 Subject: [PATCH] =?UTF-8?q?refactor(replyer):=20=E8=BF=81=E7=A7=BB=20`repl?= =?UTF-8?q?y=5Fmessage`=20=E5=88=B0=20`DatabaseMessages`=20=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 `default_generator` 中使用的 `reply_message` 参数及其相关逻辑从旧的 SQLAlchemy `Messages` 模型迁移到新的 Pydantic `DatabaseMessages` 数据模型。 此更改统一了内部数据处理模型,提高了类型安全性和代码清晰度。同时,更新了所有对 `reply_message` 属性的访问方式,以适应新的嵌套数据结构(例如 `chat_info.platform` 和 `user_info.user_id`)。 --- src/chat/replyer/default_generator.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/chat/replyer/default_generator.py b/src/chat/replyer/default_generator.py index e2c78e962..5d0043daa 100644 --- a/src/chat/replyer/default_generator.py +++ b/src/chat/replyer/default_generator.py @@ -26,7 +26,7 @@ from src.chat.utils.memory_mappings import get_memory_type_chinese_label from src.chat.utils.prompt import Prompt, PromptParameters, global_prompt_manager from src.chat.utils.timer_calculator import Timer from src.chat.utils.utils import get_chat_type_and_target_info -from src.common.database.sqlalchemy_models import Messages +from src.common.data_models.database_data_model import DatabaseMessages from src.common.logger import get_logger from src.config.config import global_config, model_config from src.individuality.individuality import get_individuality @@ -256,7 +256,7 @@ class DefaultReplyer: enable_tool: bool = True, from_plugin: bool = True, stream_id: str | None = None, - reply_message: Messages | None = None, + reply_message: DatabaseMessages | None = None, ) -> tuple[bool, dict[str, Any] | None, str | None]: # sourcery skip: merge-nested-ifs """ @@ -1105,7 +1105,7 @@ class DefaultReplyer: extra_info: str = "", available_actions: dict[str, ActionInfo] | None = None, enable_tool: bool = True, - reply_message: Messages | None = None, + reply_message: DatabaseMessages | dict[str, Any] | None = None, ) -> str: """ 构建回复器上下文 @@ -1123,6 +1123,11 @@ class DefaultReplyer: """ if available_actions is None: available_actions = {} + + # 确保 reply_message 是 DatabaseMessages 对象 + if isinstance(reply_message, dict): + reply_message = DatabaseMessages(**reply_message) + chat_stream = self.chat_stream chat_id = chat_stream.stream_id person_info_manager = get_person_info_manager() @@ -1147,10 +1152,10 @@ class DefaultReplyer: if reply_message is None: logger.warning("reply_message 为 None,无法构建prompt") return "" - platform = reply_message.chat_info_platform + platform = reply_message.chat_info.platform person_id = person_info_manager.get_person_id( platform, # type: ignore - reply_message.user_id, # type: ignore + reply_message.user_info.user_id, # type: ignore ) person_name = await person_info_manager.get_value(person_id, "person_name") @@ -1159,15 +1164,15 @@ class DefaultReplyer: # 尝试从reply_message获取用户名 await person_info_manager.first_knowing_some_one( platform, # type: ignore - reply_message.user_id, # type: ignore - reply_message.user_nickname or "", - reply_message.user_cardname or "", + reply_message.user_info.user_id, # type: ignore + reply_message.user_info.user_nickname or "", + reply_message.user_info.user_cardname or "", ) # 检查是否是bot自己的名字,如果是则替换为"(你)" bot_user_id = str(global_config.bot.qq_account) current_user_id = await person_info_manager.get_value(person_id, "user_id") - current_platform = reply_message.chat_info_platform + current_platform = reply_message.chat_info.platform if current_user_id == bot_user_id and current_platform == global_config.bot.platform: sender = f"{person_name}(你)" @@ -1496,14 +1501,14 @@ class DefaultReplyer: raw_reply: str, reason: str, reply_to: str, - reply_message: Messages | None = None, + reply_message: DatabaseMessages | None = None, ) -> str: # sourcery skip: merge-else-if-into-elif, remove-redundant-if chat_stream = self.chat_stream chat_id = chat_stream.stream_id is_group_chat = bool(chat_stream.group_info) if reply_message: - sender = reply_message.user_nickname or reply_message.user_cardname + sender = reply_message.user_info.user_nickname or reply_message.user_info.user_cardname target = reply_message.processed_plain_text else: sender, target = self._parse_reply_target(reply_to)