multimodal_agent.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. from typing import Optional
  2. import logging
  3. from src.graphs.tongue import get_tongue_graph
  4. logger = logging.getLogger(__name__)
  5. class TongueDiagnosisAgent:
  6. """舌诊分析 Agent — 调用 LangGraph 舌诊 graph(glm-5 视觉模型)"""
  7. async def diagnose(
  8. self,
  9. image_url: str,
  10. user_id: int,
  11. additional_context: Optional[dict] = None,
  12. ) -> dict:
  13. return await self._via_llm(image_url)
  14. async def _via_llm(self, image_url: str) -> dict:
  15. try:
  16. graph = get_tongue_graph()
  17. result = graph.invoke({
  18. "request": {"image_url": image_url},
  19. "image_base64": None,
  20. "raw_response": "",
  21. "overall_assessment": "",
  22. "indicators": [],
  23. "error": None,
  24. })
  25. if result.get("error"):
  26. logger.warning("舌诊 graph 失败: %s", result["error"])
  27. return self._mock_result()
  28. return {
  29. "overall_assessment": result["overall_assessment"],
  30. "indicators": result["indicators"],
  31. }
  32. except Exception as e:
  33. logger.warning("舌诊 graph 执行异常: %s", e)
  34. return self._mock_result()
  35. def _mock_result(self) -> dict:
  36. return {
  37. "overall_assessment": "舌象基本正常, 舌质淡红, 苔薄白, 提示脾胃功能尚可。",
  38. "indicators": [
  39. {"code": "tongue_color", "value": "淡红"},
  40. {"code": "coating_color", "value": "薄白"},
  41. {"code": "coating_texture", "value": "润"},
  42. {"code": "fissure", "value": "无"},
  43. {"code": "teeth_mark", "value": "轻"},
  44. {"code": "sublingual_vein", "value": "正常"},
  45. {"code": "constitution", "value": "平和质"},
  46. ],
  47. }