| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- """
- HealthRecord 健康档案规划师 (planner Agent)
- 负责对健康档案、体检报告进行分析任务的拆解和规划
- """
- import os
- import json
- from datetime import datetime
- from core.exceptions import AgentException
- from typing import Dict, Any, List
- from agents.base import BaseAgent
- class PlannerAgent(BaseAgent):
- """任务规划智能体"""
- def __init__(self, task_id=None, llm=None):
- super().__init__(name="Planner", task_id=task_id, llm=llm)
- async def run(self, input_data: Dict[str, Any]) -> Dict[str, Any]:
- """
- Planner 的唯一入口
- """
- await self.validate_input(input_data)
- self.set_state("running")
- try:
- goal = input_data["goal"]
- context = input_data.get("context", {})
- prompt = self._build_planner_prompt(goal, context)
- response = await self.think(prompt)
- plan = self._parse_plan(response)
- self.set_state("completed")
- self._add_to_history(f"生成计划,包含 {len(plan)} 个步骤")
- result = {
- "status": "success",
- "goal": goal,
- "plan": plan,
- "created_at": datetime.now().isoformat()
- }
- self.set_state("completed")
- return result
- except Exception as e:
- self.set_state("error")
- raise AgentException(f"PlannerAgent 执行失败: {str(e)}")
-
- def get_required_fields(self) -> List[str]:
- """
- Planner 只关心 goal
- """
- return ["goal"]
- # ======================
- # 内部方法
- # ======================
- def _build_planner_prompt(self, goal: str, context: Dict[str, Any]) -> str:
- """
- 构造 Planner Prompt (Plan-And-Solve)
- """
- return f"""
- 你是一个 Planner Agent,擅长将复杂目标拆解为可执行的子任务。
- 【总目标】
- {goal}
- 【上下文信息】
- {json.dumps(context, ensure_ascii=False, indent=2)}
- 请遵循以下原则:
- 1.将目标拆解为 3 到 6 个清晰、可执行的步骤
- 2.每个步骤只做一件事
- 3.明确该步骤最适合由哪类智能体完成
- 4.步骤之间应具有逻辑顺序
- 5.不要执行任务,只做规划
- 【可用智能体类型示例】
- - HealthAnalyzer:健康数据解析
- - RiskEvaluator:风险评估
- - KnowledgeRetriever:医学知识查询
- - ReportWriter:总结与建议生成
- 【输出格式】
- 请严格以 JSON 格式输出,不要包含多余解释:
- {{
- "plan": [
- {{
- "step": 1,
- "agent": "AgentName",
- "task": "任务描述",
- "input": "该步骤需要的输入"
- }}
- ]
- }}
- """
- def _parse_plan(self, response: str) -> List[Dict[str, Any]]:
- """
- 解析 LLM 输出的 Plan
- """
- try:
- data = json.loads(response)
- plan = data.get("plan", [])
- if not plan:
- raise ValueError("Plan 为空")
- return plan
- except Exception:
- return [
- {
- "step": 1,
- "agent": "FallbackAgent",
- "task": "解析失败,需人工或二次规划",
- "input": response
- }
- ]
|