report.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. """
  2. 健康报告生成 Agent
  3. """
  4. import json
  5. from typing import Dict, Any, List
  6. from agents.base import BaseAgent
  7. from core.exceptions import AgentException
  8. class ReportAgent(BaseAgent):
  9. def __init__(self, task_id=None, llm=None):
  10. super().__init__(name="ReportAgent", task_id=task_id, llm=llm)
  11. async def run(self, input_data: Dict[str, Any]) -> Dict[str, Any]:
  12. self.set_state("running")
  13. indicators = input_data.get("indicators", [])
  14. risk_assessment = input_data.get("risk_assessment", {})
  15. advice = input_data.get("advice") or {}
  16. confidence = risk_assessment.get("confidence", 0.5)
  17. retrieved_memory = str(input_data.get("retrieved_memory") or "(暂无召回记忆)")
  18. advice_list = advice.get("advice", [])
  19. prompt = self._build_prompt(
  20. indicators, risk_assessment, advice_list, confidence, retrieved_memory
  21. )
  22. response = await self.think(prompt)
  23. try:
  24. result = json.loads(response)
  25. summary = result.get("summary", "根据当前分析生成的健康报告摘要。")
  26. except json.JSONDecodeError:
  27. result = {
  28. "summary": "解析失败,返回原始结果",
  29. "raw_response": response
  30. }
  31. # 构建最终报告
  32. report = {
  33. "title": "个人健康评估报告",
  34. "summary": summary,
  35. "indicator_section": indicators,
  36. "risk_section": risk_assessment,
  37. "advice_section": advice_list,
  38. "confidence": confidence,
  39. "disclaimer": "本报告仅供健康管理参考,不构成医疗诊断。"
  40. }
  41. self.set_state("completed")
  42. return {
  43. "report": {
  44. **report,
  45. "report_text": summary
  46. }
  47. }
  48. def _build_prompt(
  49. self,
  50. indicators: List[Dict[str, Any]],
  51. risk_assessment: Dict[str, Any],
  52. advice_list: List[Dict[str, Any]],
  53. confidence: float,
  54. retrieved_memory: str,
  55. ) -> str:
  56. return f"""
  57. 你是一名健康报告整理助手。
  58. 请根据以下结构化分析结果,生成一份清晰、专业、易读的健康评估报告。
  59. 健康指标分析结果:
  60. {json.dumps(indicators, ensure_ascii=False, indent=2)}
  61. 健康风险评估结果:
  62. {json.dumps(risk_assessment, ensure_ascii=False, indent=2)}
  63. 健康建议:
  64. {json.dumps(advice_list, ensure_ascii=False, indent=2)}
  65. 整体置信度:
  66. {confidence}
  67. 历史记忆召回(RAG):
  68. {retrieved_memory}
  69. 要求:
  70. - 不新增分析结论
  71. - 不修改已有判断
  72. - 语言清晰、结构清楚
  73. - 面向普通用户
  74. 请返回 JSON 格式:
  75. {{
  76. "summary": "..."
  77. }}
  78. """
  79. def get_required_fields(self) -> list[str]:
  80. return []