| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- import json
- from datetime import datetime
- from dotenv import load_dotenv
- load_dotenv()
- from fastapi import APIRouter, FastAPI
- from fastapi.responses import JSONResponse
- from .schemas.questionnaire import GenerateRequest, GenerateResponse
- from .graphs.questionnaire import get_questionnaire_graph
- from .schemas.emotion import EmotionRequest, EmotionResponse, EmotionItem
- from .graphs.emotion import get_emotion_graph
- router = APIRouter(prefix="/api/v1", tags=["questionnaire"])
- @router.post("/questionnaire/generate")
- async def generate_questionnaire(req: GenerateRequest):
- graph = get_questionnaire_graph()
- try:
- result = graph.invoke({
- "request": req,
- "raw_response": "",
- "questionnaire": None,
- "error": None,
- })
- if result.get("error"):
- return JSONResponse(
- status_code=500,
- content={"error": result["error"]}
- )
- version = datetime.now().strftime("%Y%m%d%H%M%S")
- return GenerateResponse(
- questionnaire_json=json.dumps(result["questionnaire"], ensure_ascii=False),
- version=version,
- )
- except Exception as e:
- return JSONResponse(
- status_code=500,
- content={"error": f"graph 执行失败: {str(e)}"}
- )
- app = FastAPI(title="CFC LangGraph 问卷生成服务")
- app.include_router(router)
- @app.get("/health")
- def health():
- return {"status": "ok"}
- # ── 情绪识别 ─────────────────────────────────────────────────
- @router.post("/emotion/recognize")
- async def recognize_emotion(req: EmotionRequest):
- graph = get_emotion_graph()
- try:
- result = graph.invoke({
- "request": req.model_dump(),
- "image_bytes": None,
- "image_path": None,
- "emotion_result": None,
- "emotions": [],
- "dominant_emotion": "neutral",
- "dominant_label_zh": "平静",
- "all_emotions": {},
- "error": None,
- })
- if result.get("error"):
- return JSONResponse(
- status_code=400,
- content={"error": result["error"]}
- )
- return EmotionResponse(
- emotions=[
- EmotionItem(emotion=e["emotion"], confidence=e["confidence"])
- for e in result["emotions"]
- ],
- dominant_emotion=result["dominant_emotion"],
- dominant_label_zh=result["dominant_label_zh"],
- all_emotions=result["all_emotions"],
- )
- except Exception as e:
- return JSONResponse(
- status_code=500,
- content={"error": f"graph 执行失败: {str(e)}"}
- )
|