From 2db342551a9a44fc521f15087356094087fb664a Mon Sep 17 00:00:00 2001 From: Bakadax Date: Wed, 7 May 2025 16:31:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=85=B3=E7=B3=BB=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/PFC/conversation.py | 47 +++++++++++------------------ src/plugins/PFC/observation_info.py | 14 ++------- src/plugins/PFC/pfc_emotion.py | 2 +- src/plugins/PFC/pfc_relationship.py | 2 +- src/plugins/PFC/reply_generator.py | 16 +++++----- src/plugins/PFC/waiter.py | 2 -- 6 files changed, 30 insertions(+), 53 deletions(-) diff --git a/src/plugins/PFC/conversation.py b/src/plugins/PFC/conversation.py index a8e8ab71..35da6e52 100644 --- a/src/plugins/PFC/conversation.py +++ b/src/plugins/PFC/conversation.py @@ -3,7 +3,6 @@ import asyncio import datetime import traceback import json # 确保导入 json 模块 -from .pfc_utils import get_items_from_json # 导入JSON解析工具 from typing import Dict, Any, Optional, Set, List from dateutil import tz @@ -11,19 +10,18 @@ from src.common.logger_manager import get_logger from src.plugins.utils.chat_message_builder import build_readable_messages, get_raw_msg_before_timestamp_with_chat from maim_message import UserInfo from src.plugins.chat.chat_stream import chat_manager, ChatStream -from ..chat.message import Message # 假设 Message 类在这里 -from ...config.config import global_config +from ..chat.message import Message +from src.config.config import global_config from ..person_info.person_info import person_info_manager from ..person_info.relationship_manager import relationship_manager -# 导入情绪 from ..moods.moods import MoodManager from .pfc_relationship import PfcRelationshipUpdater, PfcRepationshipTranslator -from .pfc_emotion import PfcEmotionUpdater # 新增 +from .pfc_emotion import PfcEmotionUpdater # 导入 PFC 内部组件和类型 -from .pfc_types import ConversationState # 导入更新后的 pfc_types -from .pfc import GoalAnalyzer # 假设 GoalAnalyzer 在 pfc.py +from .pfc_types import ConversationState +from .pfc import GoalAnalyzer from .chat_observer import ChatObserver from .message_sender import DirectMessageSender from .action_planner import ActionPlanner @@ -31,9 +29,9 @@ from .observation_info import ObservationInfo from .conversation_info import ConversationInfo from .reply_generator import ReplyGenerator from .idle_conversation_starter import IdleConversationStarter -from .pfc_KnowledgeFetcher import KnowledgeFetcher # 假设 KnowledgeFetcher 在这里 +from .pfc_KnowledgeFetcher import KnowledgeFetcher from .waiter import Waiter -from .reply_checker import ReplyChecker # 确保 ReplyChecker 被导入 +from .reply_checker import ReplyChecker # 导入富文本回溯,用于更好的错误展示 from rich.traceback import install @@ -43,19 +41,12 @@ install(extra_lines=3) # 获取当前模块的日志记录器 logger = get_logger("pfc_conversation") -try: - from ...config.config import global_config -except ImportError: - logger.error("无法在 conversation.py 中导入 global_config,时区可能不准确!") - global_config = None - TIME_ZONE = tz.tzlocal() # 使用本地时区作为后备 -else: - # 确保 global_config.TIME_ZONE 存在且有效,否则使用默认值 - configured_tz = getattr(global_config, 'TIME_ZONE', 'Asia/Shanghai') # 使用 getattr 安全访问 - TIME_ZONE = tz.gettz(configured_tz) - if TIME_ZONE is None: # 如果 gettz 返回 None,说明时区字符串无效 - logger.error(f"配置的时区 '{configured_tz}' 无效,将使用默认时区 'Asia/Shanghai'") - TIME_ZONE = tz.gettz('Asia/Shanghai') +# 确保 global_config.TIME_ZONE 存在且有效,否则使用默认值 +configured_tz = getattr(global_config, 'TIME_ZONE', 'Asia/Shanghai') # 使用 getattr 安全访问 +TIME_ZONE = tz.gettz(configured_tz) +if TIME_ZONE is None: # 如果 gettz 返回 None,说明时区字符串无效 + logger.error(f"配置的时区 '{configured_tz}' 无效,将使用默认时区 'Asia/Shanghai'") + TIME_ZONE = tz.gettz('Asia/Shanghai') class Conversation: """ @@ -139,7 +130,7 @@ class Conversation: private_name=self.private_name, bot_name=global_config.BOT_NICKNAME # 或者 self.name ) - logger.info(f"[私聊][{self.private_name}] PfcEmotionUpdater 初始化完成。") + logger.info(f"[私聊][{self.private_name}] PfcEmotion 初始化完成。") logger.debug(f"[私聊][{self.private_name}] 初始化 GoalAnalyzer...") self.goal_analyzer = GoalAnalyzer(self.stream_id, self.private_name) @@ -198,7 +189,7 @@ class Conversation: # 尝试从 observation_info 获取,这依赖于 _load_initial_history 的实现 private_user_id_str: Optional[str] = None private_platform_str: Optional[str] = None - private_nickname_str: Optional[str] = None + private_nickname_str = self.private_name if self.observation_info and self.observation_info.last_message_sender and self.observation_info.last_message_sender != self.bot_qq_str: # 如果历史记录最后一条不是机器人发的,那么发送者就是对方 @@ -209,14 +200,12 @@ class Conversation: if self.observation_info.sender_user_id and self.observation_info.sender_platform: private_user_id_str = self.observation_info.sender_user_id private_platform_str = self.observation_info.sender_platform - private_nickname_str = self.observation_info.sender_name logger.info(f"[私聊][{self.private_name}] 从 ObservationInfo 获取到私聊对象信息: ID={private_user_id_str}, Platform={private_platform_str}, Name={private_nickname_str}") if not private_user_id_str and self.chat_stream: # 如果 observation_info 中没有,尝试从 chat_stream (通常代表对方) if self.chat_stream.user_info and str(self.chat_stream.user_info.user_id) != self.bot_qq_str : # 确保不是机器人自己 private_user_id_str = str(self.chat_stream.user_info.user_id) private_platform_str = self.chat_stream.user_info.platform - private_nickname_str = self.chat_stream.user_info.user_nickname logger.info(f"[私聊][{self.private_name}] 从 ChatStream 获取到私聊对象信息: ID={private_user_id_str}, Platform={private_platform_str}, Name={private_nickname_str}") elif self.chat_stream.group_info is None and self.private_name: # 私聊场景,且 private_name 可能有用 # 这是一个备选方案,如果 private_name 直接是 user_id @@ -288,7 +277,7 @@ class Conversation: numeric_relationship_value = 0.0 # 2. 使用PFC内部翻译函数 - self.conversation_info.relationship_text = self.relationship_translator.translate_relationship_value_to_text(numeric_relationship_value) + self.conversation_info.relationship_text = await self.relationship_translator.translate_relationship_value_to_text(numeric_relationship_value) logger.info(f"[私聊][{self.private_name}] 初始化时加载关系文本: {self.conversation_info.relationship_text}") except Exception as e_init_rel: logger.error(f"[私聊][{self.private_name}] 初始化时加载关系文本出错: {e_init_rel}") @@ -573,7 +562,7 @@ class Conversation: logger.debug(f"[私聊][{self.private_name}] 获取到数值型关系值: {numeric_relationship_value}") # 2. 使用PFC内部的翻译函数将其转换为文本描述 - simplified_relationship_text = self.relationship_translator.translate_relationship_value_to_text(numeric_relationship_value) + simplified_relationship_text = await self.relationship_translator.translate_relationship_value_to_text(numeric_relationship_value) self.conversation_info.relationship_text = simplified_relationship_text logger.debug(f"[私聊][{self.private_name}] 更新后关系文本 (PFC内部翻译): {self.conversation_info.relationship_text}") @@ -605,7 +594,7 @@ class Conversation: numeric_relationship_value = float(numeric_relationship_value.to_decimal()) else: numeric_relationship_value = 0.0 - self.conversation_info.relationship_text = self.relationship_translator.translate_relationship_value_to_text(numeric_relationship_value) + self.conversation_info.relationship_text = await self.relationship_translator.translate_relationship_value_to_text(numeric_relationship_value) logger.debug(f"[私聊][{self.private_name}] (备用逻辑)更新后关系文本: {self.conversation_info.relationship_text}") except ValueError: diff --git a/src/plugins/PFC/observation_info.py b/src/plugins/PFC/observation_info.py index 3dbdea7a..4f5ea75f 100644 --- a/src/plugins/PFC/observation_info.py +++ b/src/plugins/PFC/observation_info.py @@ -1,4 +1,3 @@ -import datetime import time import traceback from dateutil import tz @@ -6,23 +5,14 @@ from typing import List, Optional, Dict, Any, Set from maim_message import UserInfo from src.common.logger import get_module_logger from src.plugins.utils.chat_message_builder import build_readable_messages - +from src.config.config import global_config # 确保导入路径正确 from .chat_observer import ChatObserver from .chat_states import NotificationHandler, NotificationType, Notification logger = get_module_logger("observation_info") -try: - from ...config.config import global_config -except ImportError: - # 如果路径不对,可能需要调整 '...' 的数量 - # 或者在后面实际使用 TIME_ZONE 的地方导入 - logger.warning("无法在 observation_info.py 中直接导入 global_config,时区将在使用时获取") - global_config = None # 设置为 None,后面检查 - TIME_ZONE = tz.tzlocal() # 备选:使用本地时区 -else: - TIME_ZONE = tz.gettz(global_config.TIME_ZONE if global_config else 'Asia/Shanghai') # 使用配置的时区,提供默认值 +TIME_ZONE = tz.gettz(global_config.TIME_ZONE if global_config else 'Asia/Shanghai') # 使用配置的时区,提供默认值 class ObservationInfoHandler(NotificationHandler): diff --git a/src/plugins/PFC/pfc_emotion.py b/src/plugins/PFC/pfc_emotion.py index 66a5972d..e8404e52 100644 --- a/src/plugins/PFC/pfc_emotion.py +++ b/src/plugins/PFC/pfc_emotion.py @@ -1,6 +1,6 @@ from typing import List, Dict, Any -from MaiMBot.src.plugins.PFC.chat_observer import ChatObserver +from src.plugins.PFC.chat_observer import ChatObserver from src.common.logger_manager import get_logger from src.plugins.models.utils_model import LLMRequest from src.plugins.moods.moods import MoodManager # MoodManager 本身是单例 diff --git a/src/plugins/PFC/pfc_relationship.py b/src/plugins/PFC/pfc_relationship.py index a0bdcd0b..9457a000 100644 --- a/src/plugins/PFC/pfc_relationship.py +++ b/src/plugins/PFC/pfc_relationship.py @@ -1,5 +1,5 @@ from typing import List, Dict, Any -from MaiMBot.src.plugins.PFC.chat_observer import ChatObserver +from src.plugins.PFC.chat_observer import ChatObserver from src.common.logger_manager import get_logger from src.plugins.models.utils_model import LLMRequest from src.plugins.person_info.person_info import person_info_manager diff --git a/src/plugins/PFC/reply_generator.py b/src/plugins/PFC/reply_generator.py index eb8c619c..fba8fbda 100644 --- a/src/plugins/PFC/reply_generator.py +++ b/src/plugins/PFC/reply_generator.py @@ -153,8 +153,8 @@ class ReplyGenerator: Returns: str: 生成的回复。 - 对于 'direct_reply' 和 'say_goodbye',返回纯文本回复。 - 对于 'send_new_message',返回包含决策和文本的JSON字符串。 + 对于 'direct_reply' 和 'say_goodbye',返回纯文本回复。 + 对于 'send_new_message',返回包含决策和文本的JSON字符串。 """ logger.debug( f"[私聊][{self.private_name}]开始生成回复 (动作类型: {action_type}):当前目标: {conversation_info.goal_list}" @@ -233,11 +233,11 @@ class ReplyGenerator: spam_warning_message = "" if action_type == "send_new_message": # 只在 send_new_message 时构建刷屏警告 if conversation_info.my_message_count > 5: - spam_warning_message = f"⚠️【警告】**你已连续发送{str(conversation_info.my_message_count)}条消息!请谨慎考虑是否继续发送!以免刷屏对造成对方困扰!**" + spam_warning_message = f"⚠️【警告】**你已连续发送{str(conversation_info.my_message_count)}条消息!请谨慎考虑是否继续发送!以免刷屏对造成对方困扰!**" elif conversation_info.my_message_count > 2: - spam_warning_message = f"💬【提示】**你已连续发送{str(conversation_info.my_message_count)}条消息。如果非必要,请避免连续发送,以免给对方造成困扰。**" + spam_warning_message = f"💬【提示】**你已连续发送{str(conversation_info.my_message_count)}条消息。如果非必要,请避免连续发送,以免给对方造成困扰。**" if spam_warning_message: - spam_warning_message = f"\n{spam_warning_message}\n" + spam_warning_message = f"\n{spam_warning_message}\n" # --- 选择 Prompt --- @@ -255,17 +255,17 @@ class ReplyGenerator: try: current_time_value = "获取时间失败" if observation_info and hasattr(observation_info, 'current_time_str') and observation_info.current_time_str: - current_time_value = observation_info.current_time_str + current_time_value = observation_info.current_time_str if action_type == "say_goodbye": - prompt = prompt_template.format( + prompt = prompt_template.format( persona_text=persona_text, chat_history_text=chat_history_text, current_time_str=current_time_value, sender_name=sender_name_str, relationship_text=relationship_text_str, current_emotion_text=current_emotion_text_str - ) + ) elif action_type == "send_new_message": # PROMPT_SEND_NEW_MESSAGE 增加了 spam_warning_info prompt = prompt_template.format( persona_text=persona_text, diff --git a/src/plugins/PFC/waiter.py b/src/plugins/PFC/waiter.py index 0f5881fc..9ffff524 100644 --- a/src/plugins/PFC/waiter.py +++ b/src/plugins/PFC/waiter.py @@ -1,8 +1,6 @@ from src.common.logger import get_module_logger from .chat_observer import ChatObserver from .conversation_info import ConversationInfo - -# from src.individuality.individuality import Individuality # 不再需要 from ...config.config import global_config import time import asyncio