pull/937/head
Bakadax 2025-05-06 11:06:32 +08:00
parent e74ee67376
commit fec9c19b6b
3 changed files with 857 additions and 260 deletions

View File

@ -276,11 +276,13 @@ class ActionPlanner:
time_info = "" time_info = ""
try: try:
if not observation_info or not observation_info.bot_id: return "" if not observation_info or not observation_info.bot_id:
return ""
bot_id_str = str(observation_info.bot_id) bot_id_str = str(observation_info.bot_id)
if hasattr(observation_info, "chat_history") and observation_info.chat_history: if hasattr(observation_info, "chat_history") and observation_info.chat_history:
for msg in reversed(observation_info.chat_history): for msg in reversed(observation_info.chat_history):
if not isinstance(msg, dict): continue if not isinstance(msg, dict):
continue
sender_info = msg.get("user_info", {}) sender_info = msg.get("user_info", {})
sender_id = str(sender_info.get("user_id")) if isinstance(sender_info, dict) else None sender_id = str(sender_info.get("user_id")) if isinstance(sender_info, dict) else None
msg_time = msg.get("time") msg_time = msg.get("time")
@ -289,8 +291,10 @@ class ActionPlanner:
if time_diff < 60.0: if time_diff < 60.0:
time_info = f"提示:你上一条成功发送的消息是在 {time_diff:.1f} 秒前。\n" time_info = f"提示:你上一条成功发送的消息是在 {time_diff:.1f} 秒前。\n"
break break
except AttributeError as e: logger.warning(f"[私聊][{self.private_name}] 获取 Bot 上次发言时间时属性错误: {e}") except AttributeError as e:
except Exception as e: logger.warning(f"[私聊][{self.private_name}] 获取 Bot 上次发言时间时出错: {e}") logger.warning(f"[私聊][{self.private_name}] 获取 Bot 上次发言时间时属性错误: {e}")
except Exception as e:
logger.warning(f"[私聊][{self.private_name}] 获取 Bot 上次发言时间时出错: {e}")
return time_info return time_info
def _get_timeout_context(self, conversation_info: ConversationInfo) -> str: def _get_timeout_context(self, conversation_info: ConversationInfo) -> str:
@ -301,14 +305,18 @@ class ActionPlanner:
if hasattr(conversation_info, "goal_list") and conversation_info.goal_list: if hasattr(conversation_info, "goal_list") and conversation_info.goal_list:
last_goal_item = conversation_info.goal_list[-1] last_goal_item = conversation_info.goal_list[-1]
last_goal_text = "" last_goal_text = ""
if isinstance(last_goal_item, dict): last_goal_text = last_goal_item.get("goal", "") if isinstance(last_goal_item, dict):
elif isinstance(last_goal_item, str): last_goal_text = last_goal_item last_goal_text = last_goal_item.get("goal", "")
elif isinstance(last_goal_item, str):
last_goal_text = last_goal_item
if isinstance(last_goal_text, str) and "分钟," in last_goal_text and "思考接下来要做什么" in last_goal_text: if isinstance(last_goal_text, str) and "分钟," in last_goal_text and "思考接下来要做什么" in last_goal_text:
wait_time_str = last_goal_text.split("分钟,")[0].replace("你等待了","").strip() wait_time_str = last_goal_text.split("分钟,")[0].replace("你等待了","").strip()
timeout_context = f"重要提示:对方已经长时间(约 {wait_time_str} 分钟)没有回复你的消息了,请基于此情况规划下一步。\n" timeout_context = f"重要提示:对方已经长时间(约 {wait_time_str} 分钟)没有回复你的消息了,请基于此情况规划下一步。\n"
logger.debug(f"[私聊][{self.private_name}] 检测到超时目标: {last_goal_text}") logger.debug(f"[私聊][{self.private_name}] 检测到超时目标: {last_goal_text}")
except AttributeError as e: logger.warning(f"[私聊][{self.private_name}] 检查超时目标时属性错误: {e}") except AttributeError as e:
except Exception as e: logger.warning(f"[私聊][{self.private_name}] 检查超时目标时出错: {e}") logger.warning(f"[私聊][{self.private_name}] 检查超时目标时属性错误: {e}")
except Exception as e:
logger.warning(f"[私聊][{self.private_name}] 检查超时目标时出错: {e}")
return timeout_context return timeout_context
def _build_goals_string(self, conversation_info: ConversationInfo) -> str: def _build_goals_string(self, conversation_info: ConversationInfo) -> str:
@ -319,9 +327,11 @@ class ActionPlanner:
if hasattr(conversation_info, "goal_list") and conversation_info.goal_list: if hasattr(conversation_info, "goal_list") and conversation_info.goal_list:
recent_goals = conversation_info.goal_list[-3:] recent_goals = conversation_info.goal_list[-3:]
for goal_item in recent_goals: for goal_item in recent_goals:
goal = "目标内容缺失"; reasoning = "没有明确原因" goal = "目标内容缺失"
reasoning = "没有明确原因"
if isinstance(goal_item, dict): if isinstance(goal_item, dict):
goal = goal_item.get("goal", goal); reasoning = goal_item.get("reasoning", reasoning) goal = goal_item.get("goal", goal)
reasoning = goal_item.get("reasoning", reasoning)
elif isinstance(goal_item, str): goal = goal_item elif isinstance(goal_item, str): goal = goal_item
goal = str(goal) if goal is not None else "目标内容缺失" goal = str(goal) if goal is not None else "目标内容缺失"
reasoning = str(reasoning) if reasoning is not None else "没有明确原因" reasoning = str(reasoning) if reasoning is not None else "没有明确原因"

File diff suppressed because it is too large Load Diff

View File

@ -61,8 +61,10 @@ class PFCManager:
logger.warning(f"[私聊][{private_name}] 发现无效或已停止的旧实例,清理并重新创建: {stream_id}") logger.warning(f"[私聊][{private_name}] 发现无效或已停止的旧实例,清理并重新创建: {stream_id}")
await self._cleanup_conversation(instance) await self._cleanup_conversation(instance)
# 从字典中移除,确保下面能创建新的 # 从字典中移除,确保下面能创建新的
if stream_id in self._instances: del self._instances[stream_id] if stream_id in self._instances:
if stream_id in self._initializing: del self._initializing[stream_id] del self._instances[stream_id]
if stream_id in self._initializing:
del self._initializing[stream_id]
# --- 创建并初始化新实例 --- # --- 创建并初始化新实例 ---
@ -88,7 +90,8 @@ class PFCManager:
logger.error(f"[私聊][{private_name}] 初始化未成功完成,无法启动实例 {stream_id}") logger.error(f"[私聊][{private_name}] 初始化未成功完成,无法启动实例 {stream_id}")
# 清理可能部分创建的实例 # 清理可能部分创建的实例
await self._cleanup_conversation(conversation_instance) await self._cleanup_conversation(conversation_instance)
if stream_id in self._instances: del self._instances[stream_id] if stream_id in self._instances:
del self._instances[stream_id]
conversation_instance = None # 返回 None 表示失败 conversation_instance = None # 返回 None 表示失败
except Exception as e: except Exception as e:
@ -97,7 +100,8 @@ class PFCManager:
# 确保清理 # 确保清理
if conversation_instance: if conversation_instance:
await self._cleanup_conversation(conversation_instance) await self._cleanup_conversation(conversation_instance)
if stream_id in self._instances: del self._instances[stream_id] if stream_id in self._instances:
del self._instances[stream_id]
conversation_instance = None # 返回 None conversation_instance = None # 返回 None
finally: finally:
@ -131,7 +135,8 @@ class PFCManager:
async def _cleanup_conversation(self, conversation: Conversation): async def _cleanup_conversation(self, conversation: Conversation):
"""清理会话实例的资源""" """清理会话实例的资源"""
if not conversation: return if not conversation:
return
stream_id = conversation.stream_id stream_id = conversation.stream_id
private_name = conversation.private_name private_name = conversation.private_name
logger.info(f"[私聊][{private_name}] 开始清理会话实例资源: {stream_id}") logger.info(f"[私聊][{private_name}] 开始清理会话实例资源: {stream_id}")
@ -173,7 +178,8 @@ class PFCManager:
try: try:
# 先从字典中移除引用,防止新的请求获取到正在清理的实例 # 先从字典中移除引用,防止新的请求获取到正在清理的实例
del self._instances[stream_id] del self._instances[stream_id]
if stream_id in self._initializing: del self._initializing[stream_id] if stream_id in self._initializing:
del self._initializing[stream_id]
# 清理资源 # 清理资源
await self._cleanup_conversation(instance_to_remove) await self._cleanup_conversation(instance_to_remove)
logger.info(f"[管理器] 会话实例 {stream_id} 已成功移除并清理") logger.info(f"[管理器] 会话实例 {stream_id} 已成功移除并清理")