from enum import Enum from typing import Optional from pydantic import BaseModel, Field class Resolution(str, Enum): px256 = "256px" px768 = "768px" class AspectRatio(str, Enum): landscape = "16:9" portrait = "9:16" square = "1:1" cinematic = "2.39:1" class CondType(str, Enum): t2v = "t2v" i2v_head = "i2v_head" class GenerateRequest(BaseModel): prompt: str = Field(..., min_length=1, max_length=2000, description="文本提示词") resolution: Resolution = Field(Resolution.px256, description="分辨率") aspect_ratio: AspectRatio = Field(AspectRatio.landscape, description="画面比例") num_frames: int = Field(49, ge=1, le=129, description="帧数(4k+1,建议 49=~2s,97=~4s,129=~5s)") motion_score: int = Field(4, ge=1, le=7, description="运动幅度(1=静态,7=剧烈)") num_steps: int = Field(50, ge=10, le=100, description="扩散步数,越多质量越高但越慢") seed: Optional[int] = Field(None, description="随机种子,不填则随机") cond_type: CondType = Field(CondType.t2v, description="生成类型") class JobStatus(str, Enum): pending = "pending" processing = "processing" completed = "completed" failed = "failed" class SubmitResponse(BaseModel): job_id: str message: str = "任务已提交" class JobResponse(BaseModel): job_id: str status: JobStatus video_url: Optional[str] = None error: Optional[str] = None created_at: Optional[str] = None completed_at: Optional[str] = None