portrait.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from fastapi import APIRouter, HTTPException
  2. from pydantic import BaseModel
  3. from app.graphs.portrait_generation_graph import get_portrait_graph
  4. import logging
  5. logger = logging.getLogger(__name__)
  6. router = APIRouter(prefix="/api/portrait", tags=["portrait"])
  7. class PortraitGenerateRequest(BaseModel):
  8. user_id: int
  9. member_id: int | None = None
  10. previous_portrait: str | None = None
  11. profile_snapshot: dict | None = None
  12. behavior_summary: dict | None = None
  13. @router.post("/generate")
  14. async def generate_portrait(req: PortraitGenerateRequest):
  15. """AI 生成用户画像(首次生成)"""
  16. try:
  17. graph = get_portrait_graph()
  18. state = {
  19. "user_id": req.user_id,
  20. "member_id": req.member_id,
  21. "previous_portrait": None,
  22. "profile_snapshot": req.profile_snapshot,
  23. "behavior_summary": req.behavior_summary,
  24. "portrait_text": None,
  25. }
  26. result = await graph.ainvoke(state)
  27. return {"portrait_text": result["portrait_text"]}
  28. except Exception as e:
  29. logger.exception("画像生成失败")
  30. raise HTTPException(status_code=500, detail=str(e))
  31. @router.post("/regenerate")
  32. async def regenerate_portrait(req: PortraitGenerateRequest):
  33. """AI 重画用户画像(参考旧画像)"""
  34. try:
  35. graph = get_portrait_graph()
  36. state = {
  37. "user_id": req.user_id,
  38. "member_id": req.member_id,
  39. "previous_portrait": req.previous_portrait,
  40. "profile_snapshot": req.profile_snapshot,
  41. "behavior_summary": req.behavior_summary,
  42. "portrait_text": None,
  43. }
  44. result = await graph.ainvoke(state)
  45. return {"portrait_text": result["portrait_text"]}
  46. except Exception as e:
  47. logger.exception("画像重画失败")
  48. raise HTTPException(status_code=500, detail=str(e))