analyze.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from fastapi import APIRouter
  2. from pydantic import BaseModel
  3. from typing import Optional
  4. from app.graphs.analysis_graph import create_analysis_graph
  5. router = APIRouter(prefix="/api/v1", tags=["analyze"])
  6. _graph = None
  7. def get_graph():
  8. global _graph
  9. if _graph is None:
  10. _graph = create_analysis_graph()
  11. return _graph
  12. class AnalyzeRequest(BaseModel):
  13. report_id: int
  14. user_id: int
  15. focus: Optional[str] = None
  16. class AnalyzeResponse(BaseModel):
  17. analysis: str = ""
  18. recommendations: list[str] = []
  19. trace_id: str = ""
  20. @router.post("/analyze", response_model=AnalyzeResponse)
  21. async def analyze(req: AnalyzeRequest):
  22. graph = get_graph()
  23. import uuid
  24. trace_id = str(uuid.uuid4())
  25. # MemorySaver/AsyncSqliteSaver 均要求 config 提供 thread_id,缺省会抛
  26. # "Checkpointer requires one or more of the following 'configurable' keys"
  27. config = {
  28. "configurable": {"thread_id": f"analyze_{req.user_id}_{trace_id}"},
  29. }
  30. result = await graph.ainvoke({
  31. "report_id": req.report_id,
  32. "user_id": req.user_id,
  33. "focus": req.focus,
  34. "report_data": None,
  35. "survey_data": None,
  36. "dimension_scores": None,
  37. "analysis": None,
  38. "recommendations": [],
  39. }, config)
  40. return AnalyzeResponse(analysis=result.get("analysis", ""), trace_id=trace_id)