app.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import json
  2. from datetime import datetime
  3. from dotenv import load_dotenv
  4. load_dotenv()
  5. from fastapi import APIRouter, FastAPI
  6. from fastapi.responses import JSONResponse
  7. from .schemas.questionnaire import GenerateRequest, GenerateResponse
  8. from .graphs.questionnaire import get_questionnaire_graph
  9. from .schemas.emotion import EmotionRequest, EmotionResponse, EmotionItem
  10. from .graphs.emotion import get_emotion_graph
  11. router = APIRouter(prefix="/api/v1", tags=["questionnaire"])
  12. @router.post("/questionnaire/generate")
  13. async def generate_questionnaire(req: GenerateRequest):
  14. graph = get_questionnaire_graph()
  15. try:
  16. result = graph.invoke({
  17. "request": req,
  18. "raw_response": "",
  19. "questionnaire": None,
  20. "error": None,
  21. })
  22. if result.get("error"):
  23. return JSONResponse(
  24. status_code=500,
  25. content={"error": result["error"]}
  26. )
  27. version = datetime.now().strftime("%Y%m%d%H%M%S")
  28. return GenerateResponse(
  29. questionnaire_json=json.dumps(result["questionnaire"], ensure_ascii=False),
  30. version=version,
  31. )
  32. except Exception as e:
  33. return JSONResponse(
  34. status_code=500,
  35. content={"error": f"graph 执行失败: {str(e)}"}
  36. )
  37. app = FastAPI(title="CFC LangGraph 问卷生成服务")
  38. app.include_router(router)
  39. @app.get("/health")
  40. def health():
  41. return {"status": "ok"}
  42. # ── 情绪识别 ─────────────────────────────────────────────────
  43. @router.post("/emotion/recognize")
  44. async def recognize_emotion(req: EmotionRequest):
  45. graph = get_emotion_graph()
  46. try:
  47. result = graph.invoke({
  48. "request": req.model_dump(),
  49. "image_bytes": None,
  50. "image_path": None,
  51. "emotion_result": None,
  52. "emotions": [],
  53. "dominant_emotion": "neutral",
  54. "dominant_label_zh": "平静",
  55. "all_emotions": {},
  56. "error": None,
  57. })
  58. if result.get("error"):
  59. return JSONResponse(
  60. status_code=400,
  61. content={"error": result["error"]}
  62. )
  63. return EmotionResponse(
  64. emotions=[
  65. EmotionItem(emotion=e["emotion"], confidence=e["confidence"])
  66. for e in result["emotions"]
  67. ],
  68. dominant_emotion=result["dominant_emotion"],
  69. dominant_label_zh=result["dominant_label_zh"],
  70. all_emotions=result["all_emotions"],
  71. )
  72. except Exception as e:
  73. return JSONResponse(
  74. status_code=500,
  75. content={"error": f"graph 执行失败: {str(e)}"}
  76. )