health.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from fastapi import APIRouter, UploadFile, File
  2. from pydantic import BaseModel
  3. from io import BytesIO
  4. import pdfplumber
  5. from uuid import uuid4
  6. import asyncio
  7. from service.health_analysis import HealthAnalysisService
  8. router = APIRouter()
  9. class HealthRequest(BaseModel):
  10. report_text: str
  11. @router.post("/health/analysis")
  12. async def analysis_health(request: HealthRequest):
  13. task_id = str(uuid4())
  14. service = HealthAnalysisService(task_id=task_id)
  15. # 异步启动分析,不阻塞接口返回
  16. asyncio.create_task(service.run(request.report_text))
  17. return {"task_id": task_id}
  18. @router.post("/health/analysis/pdf")
  19. async def analysis_health_pdf(file: UploadFile = File(...)):
  20. # 读取 PDF 二进制
  21. contents = await file.read()
  22. text = ""
  23. # 使用 pdfplumber 提取文本
  24. with pdfplumber.open(BytesIO(contents)) as pdf:
  25. for page in pdf.pages:
  26. page_text = page.extract_text()
  27. if page_text:
  28. text += page_text + "\n"
  29. if not text.strip():
  30. return {"error": "无法从PDF中提取文本"}
  31. task_id = str(uuid4())
  32. service = HealthAnalysisService(task_id=task_id)
  33. asyncio.create_task(service.run(text))
  34. return {"task_id": task_id}
  35. @router.get("/health/task_status/{task_id}")
  36. async def task_status(task_id: str):
  37. from agents.base import get_task_status
  38. status = get_task_status(task_id)
  39. if not status:
  40. return {"error": "task not found"}
  41. return status