""" AI视频相关的数据传输对象定义 定义数字人合成、视频合成API的请求和响应数据结构 """ from typing import List, Optional from decimal import Decimal from pydantic import BaseModel, Field # ==================== 数字人相关Schema ==================== class AvatarDetectRequest(BaseModel): """数字人图像检测请求""" image_url: str = Field(..., description="人物图片URL") class AvatarDetectResponse(BaseModel): """数字人图像检测响应""" check_pass: bool = Field(..., description="是否通过检测") humanoid: bool = Field(..., description="是否为人像") message: Optional[str] = Field(default=None, description="检测结果说明") class AvatarGenerateRequest(BaseModel): """数字人合成请求""" image_url: str = Field(..., description="人物图片URL") audio_url: str = Field(..., description="音频文件URL(wav/mp3,<15M,<20s)") resolution: str = Field(default="480P", description="分辨率:480P/720P") # ==================== 视频合成相关Schema ==================== class VideoGenerateRequest(BaseModel): """视频生成请求(统一端点)""" model: Optional[str] = Field(default=None, description="视频生成模型,如 wan2.6-t2v、wan2.5-t2v-preview、wan2.6-i2v 等,不传则自动选择") prompt: str = Field(..., description="视频描述提示词") first_frame_url: Optional[str] = Field(default=None, description="首帧图片URL") last_frame_url: Optional[str] = Field(default=None, description="尾帧图片URL(需先有首帧)") negative_prompt: Optional[str] = Field(default=None, description="反向提示词") resolution: str = Field(default="720P", description="分辨率:720P/1080P") duration: int = Field(default=5, description="视频时长:5/10/15秒") audio_url: Optional[str] = Field(default=None, description="自定义音频URL") audio: bool = Field(default=True, description="是否自动生成音频") prompt_extend: bool = Field(default=True, description="是否智能改写提示词") shot_type: str = Field(default="single", description="镜头类型:single/multi(仅文生视频)") watermark: bool = Field(default=False, description="是否添加水印") seed: Optional[int] = Field(default=None, description="随机种子") class VideoTaskResponse(BaseModel): """视频任务创建响应""" task_id: str = Field(..., description="任务ID") task_status: str = Field(..., description="任务状态:PENDING") class VideoTaskResult(BaseModel): """视频任务状态查询响应""" task_id: str = Field(..., description="任务ID") task_status: str = Field(..., description="任务状态:PENDING/RUNNING/SUCCEEDED/FAILED") video_url: Optional[str] = Field(default=None, description="视频OSS URL") video_duration: Optional[float] = Field(default=None, description="视频时长(秒)") actual_prompt: Optional[str] = Field(default=None, description="智能改写后的提示词") error_message: Optional[str] = Field(default=None, description="错误信息") # ==================== 历史记录相关Schema ==================== class VideoHistoryItem(BaseModel): """视频历史记录项""" id: int task_id: str model_name: str video_type: str prompt: Optional[str] = None custom_name: Optional[str] = None video_url: Optional[str] = None video_duration: Optional[float] = None resolution: Optional[str] = None status: str bill: float created_at: str class VideoHistoryResponse(BaseModel): """视频历史记录响应""" items: List[VideoHistoryItem] total: int page: int page_size: int # ==================== 模型配置相关Schema ==================== class VideoModelConfigResponse(BaseModel): """视频模型配置响应""" model_name: str model_id: str model_type: str supported_params: dict class VideoModelInfo(BaseModel): """视频模型信息""" model_id: str model_name: str description: str video_type: str # 'text_to_video' | 'image_to_video' | 'avatar' price_per_second: str class UpdateVideoNameRequest(BaseModel): """更新视频名称请求""" custom_name: str = Field(..., max_length=200, description="自定义名称")