diff --git a/src/chat/focus_chat/heartFC_chat.py b/src/chat/focus_chat/heartFC_chat.py index ea5bc8040..f73d41dd5 100644 --- a/src/chat/focus_chat/heartFC_chat.py +++ b/src/chat/focus_chat/heartFC_chat.py @@ -32,6 +32,7 @@ from src.chat.focus_chat.hfc_performance_logger import HFCPerformanceLogger from src.chat.focus_chat.hfc_version_manager import get_hfc_version from src.chat.focus_chat.info.relation_info import RelationInfo from src.chat.focus_chat.info.expression_selection_info import ExpressionSelectionInfo +from src.chat.focus_chat.info.structured_info import StructuredInfo install(extra_lines=3) @@ -51,12 +52,12 @@ OBSERVATION_CLASSES = { # 定义处理器映射:键是处理器名称,值是 (处理器类, 可选的配置键名) PROCESSOR_CLASSES = { "ChattingInfoProcessor": (ChattingInfoProcessor, None), - "ToolProcessor": (ToolProcessor, "tool_use_processor"), "WorkingMemoryProcessor": (WorkingMemoryProcessor, "working_memory_processor"), } # 定义后期处理器映射:在规划后、动作执行前运行的处理器 POST_PLANNING_PROCESSOR_CLASSES = { + "ToolProcessor": (ToolProcessor, "tool_use_processor"), "PersonImpressionpProcessor": (PersonImpressionpProcessor, "person_impression_processor"), "ExpressionSelectorProcessor": (ExpressionSelectorProcessor, "expression_selector_processor"), } @@ -212,7 +213,6 @@ class HeartFChatting: processor_actual_class = processor_info[0] # 获取实际的类定义 # 根据处理器类名判断是否需要 subheartflow_id if name in [ - "ToolProcessor", "WorkingMemoryProcessor", ]: self.processors.append(processor_actual_class(subheartflow_id=self.stream_id)) @@ -249,6 +249,7 @@ class HeartFChatting: processor_actual_class = processor_info[0] # 获取实际的类定义 # 根据处理器类名判断是否需要 subheartflow_id if name in [ + "ToolProcessor", "PersonImpressionpProcessor", "ExpressionSelectorProcessor", ]: @@ -715,32 +716,33 @@ class HeartFChatting: relation_info = "" selected_expressions = [] - + structured_info = "" + for info in all_post_plan_info: if isinstance(info, RelationInfo): relation_info = info.get_processed_info() elif isinstance(info, ExpressionSelectionInfo): selected_expressions = info.get_expressions_for_action_data() + elif isinstance(info, StructuredInfo): + structured_info = info.get_processed_info() if relation_info: updated_action_data["relation_info_block"] = relation_info - # 将选中的表达方式传递给action_data if selected_expressions: - updated_action_data["selected_expressions"] = selected_expressions - logger.info(f"{self.log_prefix} 传递{len(selected_expressions)}个选中的表达方式到action_data") - - # 将记忆信息也添加到action_data中 - if running_memorys: - updated_action_data["running_memories"] = running_memorys + updated_action_data["selected_expressions"] = selected_expressions - # 生成兼容的memory_block格式 + if structured_info: + updated_action_data["structured_info"] = structured_info + + #特殊处理running_memorys + if running_memorys: memory_str = "以下是当前在聊天中,你回忆起的记忆:\n" for running_memory in running_memorys: memory_str += f"{running_memory['content']}\n" updated_action_data["memory_block"] = memory_str - logger.info(f"{self.log_prefix} 添加了 {len(running_memorys)} 个激活的记忆到action_data") + if all_post_plan_info or running_memorys: logger.info(f"{self.log_prefix} 后期处理完成,产生了 {len(all_post_plan_info)} 个信息项和 {len(running_memorys)} 个记忆") diff --git a/src/chat/focus_chat/info_processors/tool_processor.py b/src/chat/focus_chat/info_processors/tool_processor.py index fad6d8fad..682f87f87 100644 --- a/src/chat/focus_chat/info_processors/tool_processor.py +++ b/src/chat/focus_chat/info_processors/tool_processor.py @@ -67,7 +67,7 @@ class ToolProcessor(BaseProcessor): if isinstance(observation, ChattingObservation): result, used_tools, prompt = await self.execute_tools(observation) - logger.debug(f"工具调用结果: {result}") + logger.info(f"工具调用结果: {result}") # 更新WorkingObservation中的结构化信息 for observation in observations: if isinstance(observation, StructureObservation): diff --git a/src/chat/focus_chat/planners/planner_simple.py b/src/chat/focus_chat/planners/planner_simple.py index 98fcef4b2..72a011eae 100644 --- a/src/chat/focus_chat/planners/planner_simple.py +++ b/src/chat/focus_chat/planners/planner_simple.py @@ -9,7 +9,6 @@ from src.chat.focus_chat.info.obs_info import ObsInfo from src.chat.focus_chat.info.action_info import ActionInfo from src.chat.focus_chat.info.structured_info import StructuredInfo from src.chat.focus_chat.info.relation_info import RelationInfo -from src.chat.focus_chat.info.expression_selection_info import ExpressionSelectionInfo from src.common.logger import get_logger from src.chat.utils.prompt_builder import Prompt, global_prompt_manager from src.chat.focus_chat.planners.action_manager import ActionManager @@ -48,7 +47,6 @@ def init_prompt(): 你现在需要根据聊天内容,选择的合适的action来参与聊天。 {chat_context_description},以下是具体的聊天内容: {chat_content_block} -{relation_info_block} {moderation_prompt} 现在请你选择合适的action: @@ -114,14 +112,11 @@ class ActionPlanner(BasePlanner): # 获取观察信息 extra_info: list[str] = [] - structured_info = "" extra_info = [] observed_messages = [] observed_messages_str = "" chat_type = "group" is_group_chat = True - relation_info = "" - selected_expressions = [] chat_id = None # 添加chat_id变量 for info in all_plan_info: @@ -132,14 +127,6 @@ class ActionPlanner(BasePlanner): is_group_chat = chat_type == "group" # 从ObsInfo中获取chat_id chat_id = info.get_chat_id() - # elif isinstance(info, CycleInfo): - # cycle_info = info.get_observe_info() - elif isinstance(info, RelationInfo): - relation_info = info.get_processed_info() - elif isinstance(info, StructuredInfo): - structured_info = info.get_processed_info() - elif isinstance(info, ExpressionSelectionInfo): - selected_expressions = info.get_expressions_for_action_data() else: extra_info.append(info.get_processed_info()) @@ -191,15 +178,10 @@ class ActionPlanner(BasePlanner): # --- 构建提示词 (调用修改后的 PromptBuilder 方法) --- prompt = await self.build_planner_prompt( - relation_info_block=relation_info, is_group_chat=is_group_chat, # <-- Pass HFC state chat_target_info=chat_target_info, # <-- 传递获取到的聊天目标信息 observed_messages_str=observed_messages_str, # <-- Pass local variable - structured_info=structured_info, # <-- Pass SubMind info current_available_actions=current_available_actions, # <-- Pass determined actions - # cycle_info=cycle_info, # <-- Pass cycle info - extra_info=extra_info, - running_memorys=running_memorys, ) # --- 调用 LLM (普通文本生成) --- @@ -254,22 +236,6 @@ class ActionPlanner(BasePlanner): if key not in ["action", "reasoning"]: action_data[key] = value - extra_info_block = "\n".join(extra_info) - extra_info_block += f"\n{structured_info}" - if extra_info or structured_info: - extra_info_block = f"以下是一些额外的信息,现在请你阅读以下内容,进行决策\n{extra_info_block}\n以上是一些额外的信息,现在请你阅读以下内容,进行决策" - else: - extra_info_block = "" - - action_data["extra_info_block"] = extra_info_block - - if relation_info: - action_data["relation_info_block"] = relation_info - - # 将选中的表达方式传递给action_data - if selected_expressions: - action_data["selected_expressions"] = selected_expressions - logger.debug(f"{self.log_prefix} 传递{len(selected_expressions)}个选中的表达方式到action_data") action_data["loop_start_time"] = loop_start_time @@ -324,23 +290,13 @@ class ActionPlanner(BasePlanner): async def build_planner_prompt( self, - relation_info_block: str, is_group_chat: bool, # Now passed as argument chat_target_info: Optional[dict], # Now passed as argument observed_messages_str: str, - structured_info: Optional[str], current_available_actions: Dict[str, ActionInfo], - # cycle_info: Optional[str], - extra_info: list[str], - running_memorys: List[Dict[str, Any]], ) -> str: """构建 Planner LLM 的提示词 (获取模板并填充数据)""" try: - if relation_info_block: - relation_info_block = f"以下内容是你对发言对象之前的了解:\n{relation_info_block}\n这是你对他们先前的印象,不要和他们现在的聊天内容混淆。" - else: - relation_info_block = "" - chat_context_description = "你现在正在一个群聊中" chat_target_name = None # Only relevant for private if not is_group_chat and chat_target_info: @@ -394,13 +350,6 @@ class ActionPlanner(BasePlanner): action_options_block += using_action_prompt - extra_info_block = "\n".join(extra_info) - extra_info_block += f"\n{structured_info}" - if extra_info or structured_info: - extra_info_block = f"以下是一些额外的信息,现在请你阅读以下内容,进行决策\n{extra_info_block}\n以上是一些额外的信息,现在请你阅读以下内容,进行决策" - else: - extra_info_block = "" - # moderation_prompt_block = "请不要输出违法违规内容,不要输出色情,暴力,政治相关内容,如有敏感内容,请规避。" moderation_prompt_block = "" @@ -419,7 +368,6 @@ class ActionPlanner(BasePlanner): template_name = "simple_planner_prompt_private" if not is_group_chat else "simple_planner_prompt" planner_prompt_template = await global_prompt_manager.get_prompt_async(template_name) prompt = planner_prompt_template.format( - relation_info_block=relation_info_block, time_block=time_block, chat_context_description=chat_context_description, chat_content_block=chat_content_block, diff --git a/src/chat/focus_chat/replyer/default_generator.py b/src/chat/focus_chat/replyer/default_generator.py index 27e706e22..9d008a1b6 100644 --- a/src/chat/focus_chat/replyer/default_generator.py +++ b/src/chat/focus_chat/replyer/default_generator.py @@ -29,9 +29,10 @@ def init_prompt(): Prompt( """ {expression_habits_block} -{extra_info_block} +{structured_info_block} {memory_block} {relation_info_block} +{extra_info_block} {time_block} {chat_target} {chat_info} @@ -51,8 +52,10 @@ def init_prompt(): Prompt( """ {expression_habits_block} -{extra_info_block} +{structured_info_block} {memory_block} +{relation_info_block} +{extra_info_block} {time_block} {chat_target} {chat_info} @@ -278,10 +281,13 @@ class DefaultReplyer: is_group_chat = bool(chat_stream.group_info) self_info_block = reply_data.get("self_info_block", "") - extra_info_block = reply_data.get("extra_info_block", "") + structured_info = reply_data.get("structured_info", "") relation_info_block = reply_data.get("relation_info_block", "") reply_to = reply_data.get("reply_to", "none") memory_block = reply_data.get("memory_block", "") + + # 优先使用 extra_info_block,没有则用 extra_info + extra_info_block = reply_data.get("extra_info_block", "") or reply_data.get("extra_info", "") sender = "" target = "" @@ -338,6 +344,16 @@ class DefaultReplyer: if grammar_habbits_str.strip(): expression_habits_block += f"请你根据情景使用以下句法:\n{grammar_habbits_str}\n" + if structured_info: + structured_info_block = f"以下是一些额外的信息,现在请你阅读以下内容,进行决策\n{structured_info}\n以上是一些额外的信息,现在请你阅读以下内容,进行决策" + else: + structured_info_block = "" + + if extra_info_block: + extra_info_block = f"以下是你在回复时需要参考的信息,现在请你阅读以下内容,进行决策\n{extra_info_block}\n以上是你在回复时需要参考的信息,现在请你阅读以下内容,进行决策" + else: + extra_info_block = "" + # 关键词检测与反应 keywords_reaction_prompt = "" try: @@ -396,6 +412,7 @@ class DefaultReplyer: chat_target=chat_target_1, chat_info=chat_talking_prompt, memory_block=memory_block, + structured_info_block=structured_info_block, extra_info_block=extra_info_block, relation_info_block=relation_info_block, self_info_block=self_info_block, @@ -422,6 +439,7 @@ class DefaultReplyer: chat_target=chat_target_1, chat_info=chat_talking_prompt, memory_block=memory_block, + structured_info_block=structured_info_block, extra_info_block=extra_info_block, time_block=time_block, keywords_reaction_prompt=keywords_reaction_prompt, diff --git a/src/chat/heart_flow/observation/chatting_observation.py b/src/chat/heart_flow/observation/chatting_observation.py index 9f86a0f2a..4cd8124f9 100644 --- a/src/chat/heart_flow/observation/chatting_observation.py +++ b/src/chat/heart_flow/observation/chatting_observation.py @@ -74,9 +74,9 @@ class ChattingObservation(Observation): self.oldest_messages = [] self.oldest_messages_str = "" - self.last_observe_time = datetime.now().timestamp() - 1 - print(f"last_observe_time: {self.last_observe_time}") + self.last_observe_time = datetime.now().timestamp() initial_messages = get_raw_msg_before_timestamp_with_chat(self.chat_id, self.last_observe_time, 10) + print(f"initial_messages: {initial_messages}") self.last_observe_time = initial_messages[-1]["time"] if initial_messages else self.last_observe_time self.talking_message = initial_messages self.talking_message_str = build_readable_messages(self.talking_message, show_actions=True)