multimodal_agent.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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. prompt_template: Optional[str] = None,
  13. ) -> dict:
  14. return await self._via_llm(image_url, prompt_template=prompt_template)
  15. async def _via_llm(self, image_url: str, prompt_template: Optional[str] = None) -> dict:
  16. try:
  17. graph = get_tongue_graph()
  18. result = graph.invoke({
  19. "request": {"image_url": image_url, "prompt_template": prompt_template or ""},
  20. "image_base64": None,
  21. "raw_response": "",
  22. "overall_assessment": "",
  23. "indicators": [],
  24. "error": None,
  25. })
  26. if result.get("error"):
  27. logger.warning("舌诊 graph 失败: %s", result["error"])
  28. return self._mock_result()
  29. return {
  30. "overall_assessment": result["overall_assessment"],
  31. "indicators": result["indicators"],
  32. }
  33. except Exception as e:
  34. logger.warning("舌诊 graph 执行异常: %s", e)
  35. return self._mock_result()
  36. def _mock_result(self) -> dict:
  37. return {
  38. "overall_assessment": "舌象基本正常, 舌质淡红, 苔薄白, 提示脾胃功能尚可。",
  39. "indicators": [
  40. {"code": "tongue_color", "value": "淡红"},
  41. {"code": "coating_color", "value": "薄白"},
  42. {"code": "coating_texture", "value": "润"},
  43. {"code": "fissure", "value": "无"},
  44. {"code": "teeth_mark", "value": "轻"},
  45. {"code": "sublingual_vein", "value": "正常"},
  46. {"code": "constitution", "value": "平和质"},
  47. ],
  48. }