diff --git a/src/chat/focus_chat/heartFC_chat.py b/src/chat/focus_chat/heartFC_chat.py index c431fcd3a..2ebc5e25b 100644 --- a/src/chat/focus_chat/heartFC_chat.py +++ b/src/chat/focus_chat/heartFC_chat.py @@ -122,7 +122,9 @@ class HeartFChatting: self.expressor = DefaultExpressor(chat_id=self.stream_id) self.replyer = DefaultReplyer(chat_id=self.stream_id) self.action_manager = ActionManager() - self.action_planner = PlannerFactory.create_planner(log_prefix=self.log_prefix, action_manager=self.action_manager) + self.action_planner = PlannerFactory.create_planner( + log_prefix=self.log_prefix, action_manager=self.action_manager + ) self.action_modifier = ActionModifier(action_manager=self.action_manager) self.action_observation = ActionObservation(observe_id=self.stream_id) diff --git a/src/chat/focus_chat/planners/base_planner.py b/src/chat/focus_chat/planners/base_planner.py index f707445cf..eea4859b6 100644 --- a/src/chat/focus_chat/planners/base_planner.py +++ b/src/chat/focus_chat/planners/base_planner.py @@ -3,23 +3,24 @@ from typing import List, Dict, Any from src.chat.focus_chat.planners.action_manager import ActionManager from src.chat.focus_chat.info.info_base import InfoBase + class BasePlanner(ABC): """规划器基类""" - + def __init__(self, log_prefix: str, action_manager: ActionManager): self.log_prefix = log_prefix self.action_manager = action_manager - + @abstractmethod async def plan(self, all_plan_info: List[InfoBase], running_memorys: List[Dict[str, Any]]) -> Dict[str, Any]: """ 规划下一步行动 - + Args: all_plan_info: 所有计划信息 running_memorys: 回忆信息 - + Returns: Dict[str, Any]: 规划结果 """ - pass \ No newline at end of file + pass diff --git a/src/chat/focus_chat/planners/planner_factory.py b/src/chat/focus_chat/planners/planner_factory.py index 82d2cc3c7..e0df9f762 100644 --- a/src/chat/focus_chat/planners/planner_factory.py +++ b/src/chat/focus_chat/planners/planner_factory.py @@ -8,45 +8,46 @@ from src.common.logger_manager import get_logger logger = get_logger("planner_factory") + class PlannerFactory: """规划器工厂类,用于创建不同类型的规划器实例""" - + # 注册所有可用的规划器类型 _planner_types: Dict[str, Type[BasePlanner]] = { "complex": ComplexActionPlanner, "simple": SimpleActionPlanner, } - + @classmethod def register_planner(cls, name: str, planner_class: Type[BasePlanner]) -> None: """ 注册新的规划器类型 - + Args: name: 规划器类型名称 planner_class: 规划器类 """ cls._planner_types[name] = planner_class logger.info(f"注册新的规划器类型: {name}") - + @classmethod def create_planner(cls, log_prefix: str, action_manager: ActionManager) -> BasePlanner: """ 创建规划器实例 - + Args: log_prefix: 日志前缀 action_manager: 动作管理器实例 - + Returns: BasePlanner: 规划器实例 """ planner_type = global_config.focus_chat.planner_type - + if planner_type not in cls._planner_types: logger.warning(f"{log_prefix} 未知的规划器类型: {planner_type},使用默认规划器") planner_type = "complex" - + planner_class = cls._planner_types[planner_type] logger.info(f"{log_prefix} 使用{planner_type}规划器") - return planner_class(log_prefix=log_prefix, action_manager=action_manager) \ No newline at end of file + return planner_class(log_prefix=log_prefix, action_manager=action_manager) diff --git a/src/chat/focus_chat/planners/planner_simple.py b/src/chat/focus_chat/planners/planner_simple.py index cd5e1a775..3bee2e96f 100644 --- a/src/chat/focus_chat/planners/planner_simple.py +++ b/src/chat/focus_chat/planners/planner_simple.py @@ -56,8 +56,9 @@ def init_prompt(): """, "planner_prompt", ) - - Prompt(""" + + Prompt( + """ {raw_output} 请从上面这段内容中提取出JSON内容,不要有任何其他文字或解释。 以严格的 JSON 格式输出,且仅包含 JSON 内容,不要有任何其他文字或解释。 @@ -68,11 +69,8 @@ def init_prompt(): }} 请输出你提取的JSON,不要有任何其他文字或解释:""", - "planner_prompt_json", + "planner_prompt_json", ) - - - Prompt( """ @@ -93,7 +91,7 @@ class ActionPlanner(BasePlanner): max_tokens=1000, request_type="focus.planner", # 用于动作规划 ) - + self.utils_llm = LLMRequest( model=global_config.model.utils_small, max_tokens=1000, @@ -193,20 +191,20 @@ class ActionPlanner(BasePlanner): try: prompt = f"{prompt}" llm_content, (reasoning_content, _) = await self.planner_llm.generate_response_async(prompt=prompt) - + logger.debug( f"{self.log_prefix}规划器Prompt:\n{prompt}\n\n决策动作:{action},\n动作信息: '{action_data}'\n理由: {reasoning}" ) - + logger.debug(f"{self.log_prefix}LLM 原始响应: {llm_content}") logger.debug(f"{self.log_prefix}LLM 原始理由响应: {reasoning_content}") except Exception as req_e: logger.error(f"{self.log_prefix}LLM 请求执行失败: {req_e}") reasoning = f"LLM 请求失败,你的模型出现问题: {req_e}" action = "no_reply" - + # try: - # prompt_json = await global_prompt_manager.get_prompt_async("planner_prompt_json") + # prompt_json = await global_prompt_manager.get_prompt_async("planner_prompt_json") # prompt_json = prompt_json.format(raw_output=llm_content) # llm_content_json, (reasoning_content_json, _) = await self.utils_llm.generate_response_async(prompt=prompt_json) # logger.debug(f"{self.log_prefix}LLM格式化JSON: {llm_content_json}") @@ -215,8 +213,6 @@ class ActionPlanner(BasePlanner): # logger.error(f"{self.log_prefix}解析LLM响应JSON失败,模型返回不标准: {json_e}. LLM原始输出: '{llm_content}'") # reasoning = f"解析LLM响应JSON失败: {json_e}. 将使用默认动作 'no_reply'." # action = "no_reply" - - if llm_content: try: @@ -241,7 +237,7 @@ class ActionPlanner(BasePlanner): for key, value in parsed_json.items(): if key not in ["action", "reasoning"]: action_data[key] = value - + action_data["identity"] = self_info # 对于reply动作不需要额外处理,因为相关字段已经在上面的循环中添加到action_data @@ -358,7 +354,7 @@ class ActionPlanner(BasePlanner): param_text = f"参数:\n{param_text}" else: param_text = "无需参数" - + using_action_prompt = using_action_prompt.format( action_name=using_actions_name, action_description=using_actions_info["description"],