report_parse.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from fastapi import APIRouter, HTTPException
  2. from pydantic import BaseModel
  3. from typing import Optional, Any
  4. from app.agents.report_parse_agent import ReportParseAgent
  5. import logging
  6. import os
  7. import json
  8. logger = logging.getLogger(__name__)
  9. router = APIRouter(prefix="/api/v1", tags=["report_parse"])
  10. _agent = None
  11. def get_agent():
  12. global _agent
  13. if _agent is None:
  14. _agent = ReportParseAgent()
  15. return _agent
  16. class ParseRequest(BaseModel):
  17. file_path: str
  18. family_id: Optional[int] = None
  19. user_id: Optional[int] = None
  20. class ParseResponse(BaseModel):
  21. code: int = 200
  22. message: str = "ok"
  23. data: dict = {}
  24. @router.post("/report/parse", response_model=ParseResponse)
  25. async def parse_report(req: ParseRequest):
  26. if not os.path.exists(req.file_path):
  27. raise HTTPException(status_code=400, detail=f"文件不存在: {req.file_path}")
  28. logger.info("report_parse: file_path=%s family_id=%s user_id=%s",
  29. req.file_path, req.family_id, req.user_id)
  30. agent = get_agent()
  31. try:
  32. result = await agent.parse(req.file_path)
  33. return ParseResponse(data=result)
  34. except Exception as e:
  35. logger.error("报告解析失败: %s", e, exc_info=True)
  36. return ParseResponse(code=500, message=f"解析失败: {str(e)}", data={})
  37. class GenericParseRequest(BaseModel):
  38. file_path: str
  39. extra_context: Optional[dict] = None
  40. class GenericParseResponse(BaseModel):
  41. code: int = 200
  42. message: str = "ok"
  43. data: dict = {}
  44. @router.post("/report/parse-generic", response_model=GenericParseResponse)
  45. async def parse_report_generic(req: GenericParseRequest):
  46. """通用报告 LLM 兜底解析。
  47. 适用于指纹检测未匹配的未知类型报告。
  48. 直接交给 LLM 提取结构化数据,不经过算法预解析。
  49. """
  50. if not os.path.exists(req.file_path):
  51. raise HTTPException(status_code=400, detail=f"文件不存在: {req.file_path}")
  52. logger.info("report_parse_generic: file_path=%s", req.file_path)
  53. agent = get_agent()
  54. try:
  55. result = await agent.parse_generic(req.file_path, req.extra_context)
  56. return GenericParseResponse(data=result)
  57. except Exception as e:
  58. logger.error("通用报告解析失败: %s", e, exc_info=True)
  59. return GenericParseResponse(code=500, message=f"解析失败: {str(e)}", data={})