tongue.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. from fastapi import APIRouter, UploadFile, File, Form
  2. from typing import Optional
  3. from app.agents.multimodal_agent import TongueDiagnosisAgent
  4. import logging
  5. logger = logging.getLogger(__name__)
  6. router = APIRouter(prefix="/api/v1", tags=["tongue"])
  7. _agent: Optional[TongueDiagnosisAgent] = None
  8. def get_agent() -> TongueDiagnosisAgent:
  9. global _agent
  10. if _agent is None:
  11. _agent = TongueDiagnosisAgent()
  12. return _agent
  13. @router.post("/tongue/diagnose")
  14. async def tongue_diagnose(
  15. file: UploadFile = File(...),
  16. user_id: int = Form(...),
  17. prompt_template: Optional[str] = Form(None),
  18. ):
  19. """舌诊分析: 上传舌苔图片, 返回分析结果"""
  20. agent = get_agent()
  21. import tempfile, os
  22. ext = os.path.splitext(file.filename or "tongue.jpg")[1] or ".jpg"
  23. tmp = tempfile.NamedTemporaryFile(delete=False, suffix=ext)
  24. content = await file.read()
  25. tmp.write(content)
  26. tmp.close()
  27. try:
  28. import base64
  29. b64 = base64.b64encode(content).decode()
  30. data_url = f"data:image/{ext[1:]};base64,{b64}"
  31. result = await agent.diagnose(image_url=data_url, user_id=user_id, prompt_template=prompt_template)
  32. return {"code": 200, "data": result}
  33. except Exception as e:
  34. logger.error("舌诊分析失败: %s", e, exc_info=True)
  35. return {"code": 500, "message": "舌诊分析失败"}
  36. finally:
  37. os.unlink(tmp.name)