from typing import Optional import logging from src.graphs.tongue import get_tongue_graph logger = logging.getLogger(__name__) class TongueDiagnosisAgent: """舌诊分析 Agent — 调用 LangGraph 舌诊 graph(glm-5 视觉模型)""" async def diagnose( self, image_url: str, user_id: int, additional_context: Optional[dict] = None, prompt_template: Optional[str] = None, ) -> dict: return await self._via_llm(image_url, prompt_template=prompt_template) async def _via_llm(self, image_url: str, prompt_template: Optional[str] = None) -> dict: try: graph = get_tongue_graph() result = graph.invoke({ "request": {"image_url": image_url, "prompt_template": prompt_template or ""}, "image_base64": None, "raw_response": "", "overall_assessment": "", "indicators": [], "error": None, }) if result.get("error"): logger.warning("舌诊 graph 失败: %s", result["error"]) return self._mock_result() return { "overall_assessment": result["overall_assessment"], "indicators": result["indicators"], } except Exception as e: logger.warning("舌诊 graph 执行异常: %s", e) return self._mock_result() def _mock_result(self) -> dict: return { "overall_assessment": "舌象基本正常, 舌质淡红, 苔薄白, 提示脾胃功能尚可。", "indicators": [ {"code": "tongue_color", "value": "淡红"}, {"code": "coating_color", "value": "薄白"}, {"code": "coating_texture", "value": "润"}, {"code": "fissure", "value": "无"}, {"code": "teeth_mark", "value": "轻"}, {"code": "sublingual_vein", "value": "正常"}, {"code": "constitution", "value": "平和质"}, ], }