planner.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. """
  2. HealthRecord 健康档案规划师 (planner Agent)
  3. 负责对健康档案、体检报告进行分析任务的拆解和规划
  4. """
  5. import os
  6. import json
  7. from datetime import datetime
  8. from core.exceptions import AgentException
  9. from typing import Dict, Any, List
  10. from agents.base import BaseAgent
  11. class PlannerAgent(BaseAgent):
  12. """任务规划智能体"""
  13. def __init__(self, task_id=None, llm=None):
  14. super().__init__(name="Planner", task_id=task_id, llm=llm)
  15. async def run(self, input_data: Dict[str, Any]) -> Dict[str, Any]:
  16. """
  17. Planner 的唯一入口
  18. """
  19. await self.validate_input(input_data)
  20. self.set_state("running")
  21. try:
  22. goal = input_data["goal"]
  23. context = input_data.get("context", {})
  24. prompt = self._build_planner_prompt(goal, context)
  25. response = await self.think(prompt)
  26. plan = self._parse_plan(response)
  27. self.set_state("completed")
  28. self._add_to_history(f"生成计划,包含 {len(plan)} 个步骤")
  29. result = {
  30. "status": "success",
  31. "goal": goal,
  32. "plan": plan,
  33. "created_at": datetime.now().isoformat()
  34. }
  35. self.set_state("completed")
  36. return result
  37. except Exception as e:
  38. self.set_state("error")
  39. raise AgentException(f"PlannerAgent 执行失败: {str(e)}")
  40. def get_required_fields(self) -> List[str]:
  41. """
  42. Planner 只关心 goal
  43. """
  44. return ["goal"]
  45. # ======================
  46. # 内部方法
  47. # ======================
  48. def _build_planner_prompt(self, goal: str, context: Dict[str, Any]) -> str:
  49. """
  50. 构造 Planner Prompt (Plan-And-Solve)
  51. """
  52. return f"""
  53. 你是一个 Planner Agent,擅长将复杂目标拆解为可执行的子任务。
  54. 【总目标】
  55. {goal}
  56. 【上下文信息】
  57. {json.dumps(context, ensure_ascii=False, indent=2)}
  58. 请遵循以下原则:
  59. 1.将目标拆解为 3 到 6 个清晰、可执行的步骤
  60. 2.每个步骤只做一件事
  61. 3.明确该步骤最适合由哪类智能体完成
  62. 4.步骤之间应具有逻辑顺序
  63. 5.不要执行任务,只做规划
  64. 【可用智能体类型示例】
  65. - HealthAnalyzer:健康数据解析
  66. - RiskEvaluator:风险评估
  67. - KnowledgeRetriever:医学知识查询
  68. - ReportWriter:总结与建议生成
  69. 【输出格式】
  70. 请严格以 JSON 格式输出,不要包含多余解释:
  71. {{
  72. "plan": [
  73. {{
  74. "step": 1,
  75. "agent": "AgentName",
  76. "task": "任务描述",
  77. "input": "该步骤需要的输入"
  78. }}
  79. ]
  80. }}
  81. """
  82. def _parse_plan(self, response: str) -> List[Dict[str, Any]]:
  83. """
  84. 解析 LLM 输出的 Plan
  85. """
  86. try:
  87. data = json.loads(response)
  88. plan = data.get("plan", [])
  89. if not plan:
  90. raise ValueError("Plan 为空")
  91. return plan
  92. except Exception:
  93. return [
  94. {
  95. "step": 1,
  96. "agent": "FallbackAgent",
  97. "task": "解析失败,需人工或二次规划",
  98. "input": response
  99. }
  100. ]