ai_swap_bg_api.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. """
  2. AI换脸换装API接口
  3. 提供RESTful API接口,支持换脸换装、历史记录查询等功能
  4. """
  5. from fastapi import FastAPI, HTTPException, Depends, UploadFile, File, Form, Body, APIRouter
  6. from fastapi.middleware.cors import CORSMiddleware
  7. from fastapi.responses import JSONResponse
  8. from starlette.responses import FileResponse
  9. from fastapi.staticfiles import StaticFiles
  10. import os
  11. from pydantic import BaseModel, Field
  12. from typing import Optional, List, Dict, Any, Union
  13. import uvicorn
  14. from datetime import datetime, timedelta
  15. from pydantic import BaseModel
  16. from sqlalchemy import func, and_
  17. from backend.services.ai_swap_bg_service import AISwapBgService, process_swap_bg_with_record
  18. from backend.modules.database.operations import DatabaseOperations
  19. from backend.utils.logger_config import setup_logger
  20. from backend.api.auth_api import router as auth_router
  21. from backend.api.user_material_api import router as user_material_router
  22. from backend.api.user_template_api import router as user_template_router
  23. from backend.modules.database.models import ProcessRecord
  24. from backend.api.auto_post_api import router as auto_post_router
  25. logger = setup_logger(__name__)
  26. router = APIRouter()
  27. # 创建服务实例
  28. ai_swap_bg_service = AISwapBgService()
  29. db_ops = DatabaseOperations()
  30. # 启动任务队列服务
  31. from backend.services.task_queue_service import get_task_queue_service
  32. task_queue_service = get_task_queue_service()
  33. task_queue_service.start()
  34. # ==================== 数据模型 ====================
  35. class SwapBgRequest(BaseModel):
  36. user_id: int = Field(..., description="用户ID")
  37. image_id: int = Field(..., description="图片ID")
  38. prompt: str = Field(..., description="提示词", max_length=500)
  39. quantity: Optional[int] = Field(1, ge=1, le=10, description="每组生成数量")
  40. class SwapBgResponse(BaseModel):
  41. success: bool
  42. task_id: Optional[str] = None
  43. process_record_id: Optional[int] = None
  44. result_image_id: Optional[int] = None
  45. copywriter_text: Optional[str] = None
  46. history_prompt: Optional[str] = None
  47. error: Optional[str] = None
  48. error_type: Optional[str] = None
  49. # ==================== 中间件和依赖 ====================
  50. async def verify_user(user_id: int):
  51. """验证用户是否存在且有效"""
  52. user = db_ops.get_user_by_id(user_id)
  53. if not user:
  54. raise HTTPException(status_code=404, detail=f"用户ID {user_id} 不存在")
  55. if not user.get("is_active", False):
  56. raise HTTPException(status_code=403, detail="用户账户已被禁用")
  57. return user
  58. # ==================== API路由 ====================
  59. @router.post("/api/v1/swap-bg", response_model=SwapBgResponse, tags=["AI换背景"])
  60. async def process_swap_bg(request: SwapBgRequest):
  61. """
  62. 执行AI换背景(异步任务)
  63. - **user_id**: 用户ID
  64. - **image_id**: 图片ID
  65. - **prompt**: 提示词
  66. - **quantity**: 每组生成数量(可选)
  67. """
  68. try:
  69. # 验证用户
  70. await verify_user(request.user_id)
  71. # 提交任务到队列(非阻塞)
  72. task_id = ai_swap_bg_service.submit_swap_bg_task(
  73. user_id=request.user_id,
  74. image_id=request.image_id,
  75. prompt=request.prompt,
  76. quantity=request.quantity or 1
  77. )
  78. logger.info(f"用户 {request.user_id} 换背景任务已提交,任务ID: {task_id}")
  79. return SwapBgResponse(
  80. success=True,
  81. task_id=task_id,
  82. process_record_id=None,
  83. result_image_id=None,
  84. copywriter_text=None,
  85. history_prompt=None
  86. )
  87. except HTTPException:
  88. raise
  89. except Exception as e:
  90. logger.error(f"API处理异常: {str(e)}", exc_info=True)
  91. raise HTTPException(status_code=500, detail=f"服务器内部错误: {str(e)}")