增加计数

pull/937/head
Bakadax 2025-05-09 11:27:23 +08:00
parent 2bc9eece98
commit 299412f2a4
1 changed files with 27 additions and 32 deletions

View File

@ -6,7 +6,7 @@ from typing import Dict, Any, Optional
from src.common.logger_manager import get_logger from src.common.logger_manager import get_logger
from maim_message import UserInfo from maim_message import UserInfo
from src.plugins.chat.chat_stream import chat_manager, ChatStream from src.plugins.chat.chat_stream import chat_manager, ChatStream
from ..chat.message import Message # 假设 Message 类型被 _convert_to_message 使用 from ..chat.message import Message # 假设 Message 类型被 _convert_to_message 使用
from src.config.config import global_config from src.config.config import global_config
from ..person_info.person_info import person_info_manager from ..person_info.person_info import person_info_manager
from ..person_info.relationship_manager import relationship_manager from ..person_info.relationship_manager import relationship_manager
@ -28,8 +28,7 @@ from .PFC_idle.idle_chat import IdleChat
from .waiter import Waiter from .waiter import Waiter
from .reply_checker import ReplyChecker from .reply_checker import ReplyChecker
# >>> 新增导入 <<< from .conversation_loop import run_conversation_loop
from .conversation_loop import run_conversation_loop # 导入新的循环函数
from rich.traceback import install from rich.traceback import install
@ -37,13 +36,6 @@ install(extra_lines=3)
logger = get_logger("pfc_conversation") logger = get_logger("pfc_conversation")
# 时区配置移到 loop 文件或更全局的位置,这里不再需要
# configured_tz = getattr(global_config, 'TIME_ZONE', 'Asia/Shanghai')
# TIME_ZONE = tz.gettz(configured_tz)
# if TIME_ZONE is None:
# logger.error(f"配置的时区 '{configured_tz}' 无效,将使用默认时区 'Asia/Shanghai'")
# TIME_ZONE = tz.gettz('Asia/Shanghai')
class Conversation: class Conversation:
""" """
@ -58,7 +50,7 @@ class Conversation:
self.stream_id: str = stream_id self.stream_id: str = stream_id
self.private_name: str = private_name self.private_name: str = private_name
self.state: ConversationState = ConversationState.INIT self.state: ConversationState = ConversationState.INIT
self.should_continue: bool = False # Manager 会在初始化后设置 self.should_continue: bool = False
self.ignore_until_timestamp: Optional[float] = None self.ignore_until_timestamp: Optional[float] = None
self.generated_reply: str = "" self.generated_reply: str = ""
self.chat_stream: Optional[ChatStream] = None self.chat_stream: Optional[ChatStream] = None
@ -81,13 +73,15 @@ class Conversation:
self.conversation_info: Optional[ConversationInfo] = None self.conversation_info: Optional[ConversationInfo] = None
self.reply_checker: Optional[ReplyChecker] = None self.reply_checker: Optional[ReplyChecker] = None
self._initialized: bool = False # Manager 会在初始化成功后设为 True self._initialized: bool = False
self.bot_qq_str: Optional[str] = str(global_config.BOT_QQ) if global_config.BOT_QQ else None self.bot_qq_str: Optional[str] = str(global_config.BOT_QQ) if global_config.BOT_QQ else None
if not self.bot_qq_str: if not self.bot_qq_str:
logger.error(f"[私聊][{self.private_name}] 严重错误:未能从配置中获取 BOT_QQ ID") logger.error(f"[私聊][{self.private_name}] 严重错误:未能从配置中获取 BOT_QQ ID")
# _initialize 和 _load_initial_history 方法已被移除 #确保这个属性被正确初始化
self.consecutive_llm_action_failures: int = 0 # LLM相关动作连续失败的计数器
async def start(self): async def start(self):
""" """
@ -103,27 +97,27 @@ class Conversation:
logger.info(f"[私聊][{self.private_name}] 对话系统启动,准备创建规划循环任务...") logger.info(f"[私聊][{self.private_name}] 对话系统启动,准备创建规划循环任务...")
try: try:
# >>> 修改后的调用 <<< # 创建PFC主循环任务
_loop_task = asyncio.create_task(run_conversation_loop(self)) _loop_task = asyncio.create_task(run_conversation_loop(self))
logger.info(f"[私聊][{self.private_name}] 规划循环任务已创建。") logger.info(f"[私聊][{self.private_name}] 规划循环任务已创建。")
except Exception as task_err: except Exception as task_err:
logger.error(f"[私聊][{self.private_name}] 创建规划循环任务时出错: {task_err}") logger.error(f"[私聊][{self.private_name}] 创建规划循环任务时出错: {task_err}")
await self.stop() await self.stop() # 发生错误时尝试停止
async def stop(self): async def stop(self):
""" """
停止对话实例并清理相关资源 停止对话实例并清理相关资源
""" """
logger.info(f"[私聊][{self.private_name}] 正在停止对话实例: {self.stream_id}") logger.info(f"[私聊][{self.private_name}] 正在停止对话实例: {self.stream_id}")
self.should_continue = False self.should_continue = False # 设置标志以退出循环
# 最终关系评估 # 最终关系评估
if ( if (
self._initialized self._initialized # 确保已初始化
and self.relationship_updater and self.relationship_updater
and self.conversation_info and self.conversation_info
and self.observation_info and self.observation_info
and self.chat_observer and self.chat_observer # 确保所有需要的组件都存在
): ):
try: try:
logger.info(f"[私聊][{self.private_name}] 准备执行最终关系评估...") logger.info(f"[私聊][{self.private_name}] 准备执行最终关系评估...")
@ -141,24 +135,23 @@ class Conversation:
# 停止其他组件 # 停止其他组件
if self.idle_chat: if self.idle_chat:
# 减少活跃实例计数而不是停止IdleChat await self.idle_chat.decrement_active_instances() # 减少活跃实例计数
await self.idle_chat.decrement_active_instances()
logger.debug(f"[私聊][{self.private_name}] 已减少IdleChat活跃实例计数") logger.debug(f"[私聊][{self.private_name}] 已减少IdleChat活跃实例计数")
if self.observation_info and self.chat_observer: if self.observation_info and self.chat_observer: # 确保二者都存在
self.observation_info.unbind_from_chat_observer() self.observation_info.unbind_from_chat_observer() # 解绑
if self.mood_mng and hasattr(self.mood_mng, "stop_mood_update") and self.mood_mng._running: # type: ignore if self.mood_mng and hasattr(self.mood_mng, "stop_mood_update") and self.mood_mng._running: # type: ignore
self.mood_mng.stop_mood_update() # type: ignore self.mood_mng.stop_mood_update() # type: ignore
logger.debug(f"[私聊][{self.private_name}] MoodManager 后台更新已停止。") logger.debug(f"[私聊][{self.private_name}] MoodManager 后台更新已停止。")
self._initialized = False # 标记为未初始化 self._initialized = False # 标记为未初始化
logger.info(f"[私聊][{self.private_name}] 对话实例 {self.stream_id} 已停止。") logger.info(f"[私聊][{self.private_name}] 对话实例 {self.stream_id} 已停止。")
# _plan_and_action_loop 方法已被移除
def _convert_to_message(self, msg_dict: Dict[str, Any]) -> Optional[Message]: def _convert_to_message(self, msg_dict: Dict[str, Any]) -> Optional[Message]:
"""将从数据库或其他来源获取的消息字典转换为内部使用的 Message 对象""" """将从数据库或其他来源获取的消息字典转换为内部使用的 Message 对象"""
# 这个方法似乎没有被其他内部方法调用,但为了完整性暂时保留 # 这个方法似乎没有被其他内部方法调用,但为了完整性暂时保留
try: try:
# 尝试获取与此对话实例关联的 ChatStream
chat_stream_to_use = self.chat_stream or chat_manager.get_stream(self.stream_id) chat_stream_to_use = self.chat_stream or chat_manager.get_stream(self.stream_id)
if not chat_stream_to_use: if not chat_stream_to_use:
logger.error( logger.error(
@ -166,6 +159,7 @@ class Conversation:
) )
return None return None
# 解析 UserInfo
user_info_dict = msg_dict.get("user_info", {}) user_info_dict = msg_dict.get("user_info", {})
user_info: Optional[UserInfo] = None user_info: Optional[UserInfo] = None
if isinstance(user_info_dict, dict): if isinstance(user_info_dict, dict):
@ -175,21 +169,22 @@ class Conversation:
logger.warning( logger.warning(
f"[私聊][{self.private_name}] 从字典创建 UserInfo 时出错: {e}, dict: {user_info_dict}" f"[私聊][{self.private_name}] 从字典创建 UserInfo 时出错: {e}, dict: {user_info_dict}"
) )
if not user_info: if not user_info: # 如果没有有效的 UserInfo则无法创建 Message 对象
logger.warning( logger.warning(
f"[私聊][{self.private_name}] 消息缺少有效的 UserInfo无法转换。 msg_id: {msg_dict.get('message_id')}" f"[私聊][{self.private_name}] 消息缺少有效的 UserInfo无法转换。 msg_id: {msg_dict.get('message_id')}"
) )
return None return None
# 创建并返回 Message 对象
return Message( return Message(
message_id=msg_dict.get("message_id", f"gen_{time.time()}"), message_id=msg_dict.get("message_id", f"gen_{time.time()}"), # 提供默认 message_id
chat_stream=chat_stream_to_use, chat_stream=chat_stream_to_use,
time=msg_dict.get("time", time.time()), time=msg_dict.get("time", time.time()), # 提供默认时间
user_info=user_info, user_info=user_info,
processed_plain_text=msg_dict.get("processed_plain_text", ""), processed_plain_text=msg_dict.get("processed_plain_text", ""), # 提供默认文本
detailed_plain_text=msg_dict.get("detailed_plain_text", ""), detailed_plain_text=msg_dict.get("detailed_plain_text", ""), # 提供默认详细文本
) )
except Exception as e: except Exception as e:
logger.error(f"[私聊][{self.private_name}] 转换消息时出错: {e}") logger.error(f"[私聊][{self.private_name}] 转换消息时出错: {e}")
logger.error(f"[私聊][{self.private_name}] {traceback.format_exc()}") logger.error(f"[私聊][{self.private_name}] {traceback.format_exc()}")
return None return None # 出错时返回 None