ai_gen_video_api.py 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. """
  2. AI图生视频API接口
  3. 提供RESTful API接口,支持图生视频、历史记录查询等功能
  4. """
  5. from fastapi import HTTPException, APIRouter
  6. from pydantic import BaseModel, Field
  7. from typing import Optional
  8. from backend.services.ai_gen_video_service import AIGenVideoService
  9. from backend.modules.database.operations import DatabaseOperations
  10. from backend.utils.logger_config import setup_logger
  11. from backend.services.task_queue_service import get_task_queue_service
  12. logger = setup_logger(__name__)
  13. router = APIRouter()
  14. # 创建服务实例
  15. ai_gen_video_service = AIGenVideoService()
  16. db_ops = DatabaseOperations()
  17. # 启动任务队列服务
  18. task_queue_service = get_task_queue_service()
  19. task_queue_service.start()
  20. # ==================== 数据模型 ====================
  21. class GenVideoRequest(BaseModel):
  22. user_id: int = Field(..., description="用户ID")
  23. image_id: int = Field(..., description="图片ID")
  24. prompt: str = Field(..., description="提示词", max_length=500)
  25. quantity: Optional[int] = Field(1, ge=1, le=10, description="每组生成数量")
  26. class GenVideoResponse(BaseModel):
  27. success: bool
  28. task_id: Optional[str] = None
  29. process_record_id: Optional[int] = None
  30. result_image_id: Optional[int] = None
  31. copywriter_text: Optional[str] = None
  32. error: Optional[str] = None
  33. error_type: Optional[str] = None
  34. # ==================== 中间件和依赖 ====================
  35. async def verify_user(user_id: int):
  36. """验证用户是否存在且有效"""
  37. user = db_ops.get_user_by_id(user_id)
  38. if not user:
  39. raise HTTPException(status_code=404, detail=f"用户ID {user_id} 不存在")
  40. if not user.get("is_active", False):
  41. raise HTTPException(status_code=403, detail="用户账户已被禁用")
  42. return user
  43. # ==================== API路由 ====================
  44. @router.post("/api/v1/i2v", response_model=GenVideoResponse, tags=["AI图生视频"])
  45. async def process_gen_video(request: GenVideoRequest):
  46. """
  47. 执行AI图生视频(异步任务)
  48. - **user_id**: 用户ID
  49. - **image_id**: 图片ID
  50. - **prompt**: 提示词
  51. - **quantity**: 每组生成数量(可选)
  52. """
  53. try:
  54. # 验证用户
  55. await verify_user(request.user_id)
  56. # 提交任务到队列(非阻塞)
  57. task_id = ai_gen_video_service.submit_gen_video_task(
  58. user_id=request.user_id,
  59. image_id=request.image_id,
  60. prompt=request.prompt,
  61. quantity=request.quantity or 1
  62. )
  63. logger.info(f"用户 {request.user_id} 图生视频任务已提交,任务ID: {task_id}")
  64. return GenVideoResponse(
  65. success=True,
  66. task_id=task_id,
  67. process_record_id=None,
  68. result_image_id=None,
  69. copywriter_text=None
  70. )
  71. except HTTPException:
  72. raise
  73. except Exception as e:
  74. logger.error(f"API处理异常: {str(e)}", exc_info=True)
  75. raise HTTPException(status_code=500, detail=f"服务器内部错误: {str(e)}")