video_schema.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. """
  2. AI视频相关的数据传输对象定义
  3. 定义数字人合成、视频合成API的请求和响应数据结构
  4. """
  5. from typing import List, Optional
  6. from decimal import Decimal
  7. from pydantic import BaseModel, Field
  8. # ==================== 数字人相关Schema ====================
  9. class AvatarDetectRequest(BaseModel):
  10. """数字人图像检测请求"""
  11. image_url: str = Field(..., description="人物图片URL")
  12. class AvatarDetectResponse(BaseModel):
  13. """数字人图像检测响应"""
  14. check_pass: bool = Field(..., description="是否通过检测")
  15. humanoid: bool = Field(..., description="是否为人像")
  16. message: Optional[str] = Field(default=None, description="检测结果说明")
  17. class AvatarGenerateRequest(BaseModel):
  18. """数字人合成请求"""
  19. image_url: str = Field(..., description="人物图片URL")
  20. audio_url: str = Field(..., description="音频文件URL(wav/mp3,<15M,<20s)")
  21. resolution: str = Field(default="480P", description="分辨率:480P/720P")
  22. # ==================== 视频合成相关Schema ====================
  23. class VideoGenerateRequest(BaseModel):
  24. """视频生成请求(统一端点)"""
  25. model: Optional[str] = Field(default=None, description="视频生成模型,如 wan2.6-t2v、wan2.5-t2v-preview、wan2.6-i2v 等,不传则自动选择")
  26. prompt: str = Field(..., description="视频描述提示词")
  27. first_frame_url: Optional[str] = Field(default=None, description="首帧图片URL")
  28. last_frame_url: Optional[str] = Field(default=None, description="尾帧图片URL(需先有首帧)")
  29. negative_prompt: Optional[str] = Field(default=None, description="反向提示词")
  30. resolution: str = Field(default="720P", description="分辨率:720P/1080P")
  31. duration: int = Field(default=5, description="视频时长:5/10/15秒")
  32. audio_url: Optional[str] = Field(default=None, description="自定义音频URL")
  33. audio: bool = Field(default=True, description="是否自动生成音频")
  34. prompt_extend: bool = Field(default=True, description="是否智能改写提示词")
  35. shot_type: str = Field(default="single", description="镜头类型:single/multi(仅文生视频)")
  36. watermark: bool = Field(default=False, description="是否添加水印")
  37. seed: Optional[int] = Field(default=None, description="随机种子")
  38. class VideoTaskResponse(BaseModel):
  39. """视频任务创建响应"""
  40. task_id: str = Field(..., description="任务ID")
  41. task_status: str = Field(..., description="任务状态:PENDING")
  42. class VideoTaskResult(BaseModel):
  43. """视频任务状态查询响应"""
  44. task_id: str = Field(..., description="任务ID")
  45. task_status: str = Field(..., description="任务状态:PENDING/RUNNING/SUCCEEDED/FAILED")
  46. video_url: Optional[str] = Field(default=None, description="视频OSS URL")
  47. video_duration: Optional[float] = Field(default=None, description="视频时长(秒)")
  48. actual_prompt: Optional[str] = Field(default=None, description="智能改写后的提示词")
  49. error_message: Optional[str] = Field(default=None, description="错误信息")
  50. # ==================== 历史记录相关Schema ====================
  51. class VideoHistoryItem(BaseModel):
  52. """视频历史记录项"""
  53. id: int
  54. task_id: str
  55. model_name: str
  56. video_type: str
  57. prompt: Optional[str] = None
  58. custom_name: Optional[str] = None
  59. video_url: Optional[str] = None
  60. video_duration: Optional[float] = None
  61. resolution: Optional[str] = None
  62. status: str
  63. bill: float
  64. created_at: str
  65. class VideoHistoryResponse(BaseModel):
  66. """视频历史记录响应"""
  67. items: List[VideoHistoryItem]
  68. total: int
  69. page: int
  70. page_size: int
  71. # ==================== 模型配置相关Schema ====================
  72. class VideoModelConfigResponse(BaseModel):
  73. """视频模型配置响应"""
  74. model_name: str
  75. model_id: str
  76. model_type: str
  77. supported_params: dict
  78. class VideoModelInfo(BaseModel):
  79. """视频模型信息"""
  80. model_id: str
  81. model_name: str
  82. description: str
  83. video_type: str # 'text_to_video' | 'image_to_video' | 'avatar'
  84. price_per_second: str
  85. class UpdateVideoNameRequest(BaseModel):
  86. """更新视频名称请求"""
  87. custom_name: str = Field(..., max_length=200, description="自定义名称")