docs(planner): 为规划器相关模块添加详细的文档字符串
为 `plan_executor`、`planner` 和 `planner_prompts` 模块中的类和函数补充了详细的文档字符串(docstrings)。 这提高了代码的可读性和可维护性,阐明了每个组件的职责、参数和返回值,使得其他开发者能更容易地理解和使用这些模块。
This commit is contained in:
@@ -10,15 +10,32 @@ logger = get_logger("plan_executor")
|
|||||||
|
|
||||||
class PlanExecutor:
|
class PlanExecutor:
|
||||||
"""
|
"""
|
||||||
执行 Plan 中最终确定的动作。
|
负责接收一个 Plan 对象,并执行其中最终确定的所有动作。
|
||||||
|
|
||||||
|
这个类是规划流程的最后一步,将规划结果转化为实际的动作执行。
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
action_manager (ActionManager): 用于实际执行各种动作的管理器实例。
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, action_manager: ActionManager):
|
def __init__(self, action_manager: ActionManager):
|
||||||
|
"""
|
||||||
|
初始化 PlanExecutor。
|
||||||
|
|
||||||
|
Args:
|
||||||
|
action_manager (ActionManager): 一个 ActionManager 实例,用于执行动作。
|
||||||
|
"""
|
||||||
self.action_manager = action_manager
|
self.action_manager = action_manager
|
||||||
|
|
||||||
async def execute(self, plan: Plan):
|
async def execute(self, plan: Plan):
|
||||||
"""
|
"""
|
||||||
读取 Plan 对象的 decided_actions 字段并执行。
|
遍历并执行 Plan 对象中 `decided_actions` 列表里的所有动作。
|
||||||
|
|
||||||
|
如果动作类型为 "no_action",则会记录原因并跳过。
|
||||||
|
否则,它将调用 ActionManager 来执行相应的动作。
|
||||||
|
|
||||||
|
Args:
|
||||||
|
plan (Plan): 包含待执行动作列表的 Plan 对象。
|
||||||
"""
|
"""
|
||||||
if not plan.decided_actions:
|
if not plan.decided_actions:
|
||||||
logger.info("没有需要执行的动作。")
|
logger.info("没有需要执行的动作。")
|
||||||
|
|||||||
@@ -15,10 +15,25 @@ from src.plugin_system.core.component_registry import component_registry
|
|||||||
|
|
||||||
class PlanGenerator:
|
class PlanGenerator:
|
||||||
"""
|
"""
|
||||||
搜集信息并生成初始 Plan 对象。
|
PlanGenerator 负责在规划流程的初始阶段收集所有必要信息。
|
||||||
|
|
||||||
|
它会汇总以下信息来构建一个“原始”的 Plan 对象,该对象后续会由 PlanFilter 进行筛选:
|
||||||
|
- 当前聊天信息 (ID, 目标用户)
|
||||||
|
- 当前可用的动作列表
|
||||||
|
- 最近的聊天历史记录
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
chat_id (str): 当前聊天的唯一标识符。
|
||||||
|
action_manager (ActionManager): 用于获取可用动作列表的管理器。
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, chat_id: str):
|
def __init__(self, chat_id: str):
|
||||||
|
"""
|
||||||
|
初始化 PlanGenerator。
|
||||||
|
|
||||||
|
Args:
|
||||||
|
chat_id (str): 当前聊天的 ID。
|
||||||
|
"""
|
||||||
from src.chat.planner_actions.action_manager import ActionManager
|
from src.chat.planner_actions.action_manager import ActionManager
|
||||||
self.chat_id = chat_id
|
self.chat_id = chat_id
|
||||||
# 注意:ActionManager 可能需要根据实际情况初始化
|
# 注意:ActionManager 可能需要根据实际情况初始化
|
||||||
@@ -26,7 +41,15 @@ class PlanGenerator:
|
|||||||
|
|
||||||
async def generate(self, mode: ChatMode) -> Plan:
|
async def generate(self, mode: ChatMode) -> Plan:
|
||||||
"""
|
"""
|
||||||
生成并填充初始的 Plan 对象。
|
收集所有信息,生成并返回一个初始的 Plan 对象。
|
||||||
|
|
||||||
|
这个 Plan 对象包含了决策所需的所有上下文信息。
|
||||||
|
|
||||||
|
Args:
|
||||||
|
mode (ChatMode): 当前的聊天模式。
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Plan: 一个填充了初始上下文信息的 Plan 对象。
|
||||||
"""
|
"""
|
||||||
_is_group_chat, chat_target_info_dict = get_chat_type_and_target_info(self.chat_id)
|
_is_group_chat, chat_target_info_dict = get_chat_type_and_target_info(self.chat_id)
|
||||||
|
|
||||||
@@ -55,7 +78,13 @@ class PlanGenerator:
|
|||||||
|
|
||||||
def _get_available_actions(self) -> Dict[str, "ActionInfo"]:
|
def _get_available_actions(self) -> Dict[str, "ActionInfo"]:
|
||||||
"""
|
"""
|
||||||
获取当前可用的动作。
|
从 ActionManager 和组件注册表中获取当前所有可用的动作。
|
||||||
|
|
||||||
|
它会合并已注册的动作和系统级动作(如 "no_reply"),
|
||||||
|
并以字典形式返回。
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Dict[str, "ActionInfo"]: 一个字典,键是动作名称,值是 ActionInfo 对象。
|
||||||
"""
|
"""
|
||||||
current_available_actions_dict = self.action_manager.get_using_actions()
|
current_available_actions_dict = self.action_manager.get_using_actions()
|
||||||
all_registered_actions: Dict[str, ActionInfo] = component_registry.get_components_by_type( # type: ignore
|
all_registered_actions: Dict[str, ActionInfo] = component_registry.get_components_by_type( # type: ignore
|
||||||
|
|||||||
@@ -20,10 +20,29 @@ logger = get_logger("planner")
|
|||||||
|
|
||||||
class ActionPlanner:
|
class ActionPlanner:
|
||||||
"""
|
"""
|
||||||
协调器,按顺序调用 Generator -> Filter -> Executor。
|
ActionPlanner 是规划系统的核心协调器。
|
||||||
|
|
||||||
|
它负责整合规划流程的三个主要阶段:
|
||||||
|
1. **生成 (Generate)**: 使用 PlanGenerator 创建一个初始的行动计划。
|
||||||
|
2. **筛选 (Filter)**: 使用 PlanFilter 对生成的计划进行审查和优化。
|
||||||
|
3. **执行 (Execute)**: 使用 PlanExecutor 执行最终确定的行动。
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
chat_id (str): 当前聊天的唯一标识符。
|
||||||
|
action_manager (ActionManager): 用于执行具体动作的管理器。
|
||||||
|
generator (PlanGenerator): 负责生成初始计划。
|
||||||
|
filter (PlanFilter): 负责筛选和优化计划。
|
||||||
|
executor (PlanExecutor): 负责执行最终计划。
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, chat_id: str, action_manager: ActionManager):
|
def __init__(self, chat_id: str, action_manager: ActionManager):
|
||||||
|
"""
|
||||||
|
初始化 ActionPlanner。
|
||||||
|
|
||||||
|
Args:
|
||||||
|
chat_id (str): 当前聊天的 ID。
|
||||||
|
action_manager (ActionManager): 一个 ActionManager 实例。
|
||||||
|
"""
|
||||||
self.chat_id = chat_id
|
self.chat_id = chat_id
|
||||||
self.action_manager = action_manager
|
self.action_manager = action_manager
|
||||||
self.generator = PlanGenerator(chat_id)
|
self.generator = PlanGenerator(chat_id)
|
||||||
@@ -34,7 +53,18 @@ class ActionPlanner:
|
|||||||
self, mode: ChatMode = ChatMode.FOCUS
|
self, mode: ChatMode = ChatMode.FOCUS
|
||||||
) -> Tuple[List[Dict], Optional[Dict]]:
|
) -> Tuple[List[Dict], Optional[Dict]]:
|
||||||
"""
|
"""
|
||||||
执行完整的规划流程。
|
执行从生成到执行的完整规划流程。
|
||||||
|
|
||||||
|
这个方法按顺序协调生成、筛选和执行三个阶段。
|
||||||
|
|
||||||
|
Args:
|
||||||
|
mode (ChatMode): 当前的聊天模式,默认为 FOCUS。
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Tuple[List[Dict], Optional[Dict]]: 一个元组,包含:
|
||||||
|
- final_actions_dict (List[Dict]): 最终确定的动作列表(字典格式)。
|
||||||
|
- final_target_message_dict (Optional[Dict]): 最终的目标消息(字典格式),如果没有则为 None。
|
||||||
|
这与旧版 planner 的返回值保持兼容。
|
||||||
"""
|
"""
|
||||||
# 1. 生成初始 Plan
|
# 1. 生成初始 Plan
|
||||||
initial_plan = await self.generator.generate(mode)
|
initial_plan = await self.generator.generate(mode)
|
||||||
|
|||||||
@@ -1,12 +1,21 @@
|
|||||||
"""
|
"""
|
||||||
本文件集中管理所有与规划器相关的提示词模板。
|
本文件集中管理所有与规划器(Planner)相关的提示词(Prompt)模板。
|
||||||
|
|
||||||
|
通过将提示词与代码逻辑分离,可以更方便地对模型的行为进行迭代和优化,
|
||||||
|
而无需修改核心代码。
|
||||||
"""
|
"""
|
||||||
from src.chat.utils.prompt import Prompt
|
from src.chat.utils.prompt import Prompt
|
||||||
|
|
||||||
|
|
||||||
def init_prompts():
|
def init_prompts():
|
||||||
"""
|
"""
|
||||||
初始化并注册所有规划器相关的提示词。
|
初始化并向 Prompt 注册系统注册所有规划器相关的提示词。
|
||||||
|
|
||||||
|
这个函数会在模块加载时自动调用,确保所有提示词在系统启动时都已准备就绪。
|
||||||
"""
|
"""
|
||||||
|
# 核心规划器提示词,用于在接收到新消息时决定如何回应。
|
||||||
|
# 它构建了一个复杂的上下文,包括历史记录、可用动作、角色设定等,
|
||||||
|
# 并要求模型以 JSON 格式输出一个或多个动作组合。
|
||||||
Prompt(
|
Prompt(
|
||||||
"""
|
"""
|
||||||
{schedule_block}
|
{schedule_block}
|
||||||
@@ -83,6 +92,8 @@ def init_prompts():
|
|||||||
"planner_prompt",
|
"planner_prompt",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# 主动思考规划器提示词,用于在没有新消息时决定是否要主动发起对话。
|
||||||
|
# 它模拟了人类的自发性思考,允许模型根据长期记忆和最近的对话来决定是否开启新话题。
|
||||||
Prompt(
|
Prompt(
|
||||||
"""
|
"""
|
||||||
# 主动思考决策
|
# 主动思考决策
|
||||||
@@ -140,6 +151,8 @@ def init_prompts():
|
|||||||
"proactive_planner_prompt",
|
"proactive_planner_prompt",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# 单个动作的格式化提示词模板。
|
||||||
|
# 用于将每个可用动作的信息格式化后,插入到主提示词的 {action_options_text} 占位符中。
|
||||||
Prompt(
|
Prompt(
|
||||||
"""
|
"""
|
||||||
动作:{action_name}
|
动作:{action_name}
|
||||||
@@ -154,5 +167,6 @@ def init_prompts():
|
|||||||
"action_prompt",
|
"action_prompt",
|
||||||
)
|
)
|
||||||
|
|
||||||
# 在模块加载时自动初始化
|
|
||||||
|
# 在模块加载时自动调用,完成提示词的注册。
|
||||||
init_prompts()
|
init_prompts()
|
||||||
Reference in New Issue
Block a user