diff --git a/src/plugins/PFC/action_planner.py b/src/plugins/PFC/action_planner.py index 4b48f127f..a80e96b15 100644 --- a/src/plugins/PFC/action_planner.py +++ b/src/plugins/PFC/action_planner.py @@ -374,13 +374,15 @@ class ActionPlanner: # 使用新的 PROMPT_END_DECISION end_decision_prompt = PROMPT_END_DECISION.format( - persona_text=persona_text, # 复用之前的 persona_text - chat_history_text=chat_history_text # 复用之前的 chat_history_text + persona_text=persona_text, # 复用之前的 persona_text + chat_history_text=chat_history_text, # 复用之前的 chat_history_text ) - logger.debug(f"[私聊][{self.private_name}]发送到LLM的结束决策提示词:\n------\n{end_decision_prompt}\n------") + logger.debug( + f"[私聊][{self.private_name}]发送到LLM的结束决策提示词:\n------\n{end_decision_prompt}\n------" + ) try: - end_content, _ = await self.llm.generate_response_async(end_decision_prompt) # 再次调用LLM + end_content, _ = await self.llm.generate_response_async(end_decision_prompt) # 再次调用LLM logger.debug(f"[私聊][{self.private_name}]LLM (结束决策) 原始返回内容: {end_content}") # 解析结束决策的JSON @@ -390,32 +392,36 @@ class ActionPlanner: "say_bye", "reason", default_values={"say_bye": "no", "reason": "结束决策LLM返回格式错误,默认不告别"}, - required_types={"say_bye": str, "reason": str} # 明确类型 + required_types={"say_bye": str, "reason": str}, # 明确类型 ) - say_bye_decision = end_result.get("say_bye", "no").lower() # 转小写方便比较 + say_bye_decision = end_result.get("say_bye", "no").lower() # 转小写方便比较 end_decision_reason = end_result.get("reason", "未提供原因") if end_success and say_bye_decision == "yes": # 决定要告别,返回新的 'say_goodbye' 动作 - logger.info(f"[私聊][{self.private_name}]结束决策: yes, 准备生成告别语. 原因: {end_decision_reason}") + logger.info( + f"[私聊][{self.private_name}]结束决策: yes, 准备生成告别语. 原因: {end_decision_reason}" + ) # 注意:这里的 reason 可以考虑拼接初始原因和结束决策原因,或者只用结束决策原因 final_action = "say_goodbye" final_reason = f"决定发送告别语。决策原因: {end_decision_reason} (原结束理由: {initial_reason})" return final_action, final_reason else: # 决定不告别 (包括解析失败或明确说no) - logger.info(f"[私聊][{self.private_name}]结束决策: no, 直接结束对话. 原因: {end_decision_reason}") + logger.info( + f"[私聊][{self.private_name}]结束决策: no, 直接结束对话. 原因: {end_decision_reason}" + ) # 返回原始的 'end_conversation' 动作 final_action = "end_conversation" - final_reason = initial_reason # 保持原始的结束理由 + final_reason = initial_reason # 保持原始的结束理由 return final_action, final_reason except Exception as end_e: logger.error(f"[私聊][{self.private_name}]调用结束决策LLM或处理结果时出错: {str(end_e)}") # 出错时,默认执行原始的结束对话 logger.warning(f"[私聊][{self.private_name}]结束决策出错,将按原计划执行 end_conversation") - return "end_conversation", initial_reason # 返回原始动作和原因 + return "end_conversation", initial_reason # 返回原始动作和原因 else: action = initial_action @@ -429,9 +435,9 @@ class ActionPlanner: "wait", "listening", "rethink_goal", - "end_conversation", # 仍然需要验证,因为可能从上面决策后返回 + "end_conversation", # 仍然需要验证,因为可能从上面决策后返回 "block_and_ignore", - "say_goodbye" # 也要验证这个新动作 + "say_goodbye", # 也要验证这个新动作 ] if action not in valid_actions: logger.warning(f"[私聊][{self.private_name}]LLM返回了未知的行动类型: '{action}',强制改为 wait") @@ -445,4 +451,4 @@ class ActionPlanner: except Exception as e: # 外层异常处理保持不变 logger.error(f"[私聊][{self.private_name}]规划行动时调用 LLM 或处理结果出错: {str(e)}") - return "wait", f"行动规划处理中发生错误,暂时等待: {str(e)}" \ No newline at end of file + return "wait", f"行动规划处理中发生错误,暂时等待: {str(e)}" diff --git a/src/plugins/PFC/conversation.py b/src/plugins/PFC/conversation.py index 638427e6d..c1b314266 100644 --- a/src/plugins/PFC/conversation.py +++ b/src/plugins/PFC/conversation.py @@ -565,7 +565,7 @@ class Conversation: self.conversation_info.last_successful_reply_action = None # 重置状态 elif action == "say_goodbye": - self.state = ConversationState.GENERATING # 也可以定义一个新的状态,如 ENDING + self.state = ConversationState.GENERATING # 也可以定义一个新的状态,如 ENDING logger.info(f"[私聊][{self.private_name}]执行行动: 生成并发送告别语...") try: # 1. 生成告别语 (使用 'say_goodbye' action_type) @@ -575,14 +575,14 @@ class Conversation: logger.info(f"[私聊][{self.private_name}]生成的告别语: {self.generated_reply}") # 2. 直接发送告别语 (不经过检查) - if self.generated_reply: # 确保生成了内容 - await self._send_reply() # 调用发送方法 + if self.generated_reply: # 确保生成了内容 + await self._send_reply() # 调用发送方法 # 发送成功后,标记动作成功 action_successful = True logger.info(f"[私聊][{self.private_name}]告别语已发送。") else: logger.warning(f"[私聊][{self.private_name}]未能生成告别语内容,无法发送。") - action_successful = False # 标记动作失败 + action_successful = False # 标记动作失败 conversation_info.done_action[action_index].update( {"status": "recall", "final_reason": "未能生成告别语内容"} ) @@ -596,7 +596,7 @@ class Conversation: logger.error(f"[私聊][{self.private_name}]{traceback.format_exc()}") # 即使出错,也结束对话 self.should_continue = False - action_successful = False # 标记动作失败 + action_successful = False # 标记动作失败 conversation_info.done_action[action_index].update( {"status": "recall", "final_reason": f"生成或发送告别语时出错: {goodbye_err}"} ) diff --git a/src/plugins/PFC/reply_generator.py b/src/plugins/PFC/reply_generator.py index 6be09902d..9b497ef28 100644 --- a/src/plugins/PFC/reply_generator.py +++ b/src/plugins/PFC/reply_generator.py @@ -75,6 +75,7 @@ PROMPT_FAREWELL = """{persona_text}。你在参与一场 QQ 私聊,现在对 请直接输出最终的告别消息内容,不需要任何额外格式。""" + class ReplyGenerator: """回复生成器""" @@ -152,14 +153,13 @@ class ReplyGenerator: if action_type == "send_new_message": prompt_template = PROMPT_SEND_NEW_MESSAGE logger.info(f"[私聊][{self.private_name}]使用 PROMPT_SEND_NEW_MESSAGE (追问生成)") - elif action_type == "say_goodbye": # 处理告别动作 + elif action_type == "say_goodbye": # 处理告别动作 prompt_template = PROMPT_FAREWELL logger.info(f"[私聊][{self.private_name}]使用 PROMPT_FAREWELL (告别语生成)") else: # 默认使用 direct_reply 的 prompt (包括 'direct_reply' 或其他未明确处理的类型) prompt_template = PROMPT_DIRECT_REPLY logger.info(f"[私聊][{self.private_name}]使用 PROMPT_DIRECT_REPLY (首次/非连续回复生成)") - # --- 格式化最终的 Prompt --- prompt = prompt_template.format( persona_text=persona_text, goals_str=goals_str, chat_history_text=chat_history_text