from pydantic import BaseModel, Field, model_validator class CreateGenerationTaskRequest(BaseModel): """创建生成任务请求。 支持两种模式(至少提供一种): - 项目模式:project_id + asset_library_id(向后兼容) - 模板模式:template_id + asset_ids / title_ids / voice_ids """ project_id: str = "" asset_library_id: str = "" strategy_id: str = "" voice_library_id: str = "" created_by_user_id: str = "" # ── 模板模式新增字段 ── template_id: str = "" asset_ids: list[str] = Field(default_factory=list) title_ids: list[str] = Field(default_factory=list) voice_ids: list[str] = Field(default_factory=list) @model_validator(mode="after") def _check_at_least_one_mode(self) -> "CreateGenerationTaskRequest": has_project = bool(self.project_id.strip()) has_template = bool(self.template_id.strip()) if not has_project and not has_template: raise ValueError("project_id 或 template_id 至少需要提供一个") has_library = bool(self.asset_library_id.strip()) has_assets = bool(self.asset_ids or self.title_ids or self.voice_ids) if not has_library and not has_assets: raise ValueError("asset_library_id 或 asset_ids/title_ids/voice_ids 至少需要提供一个") return self class GenerationTaskResponse(BaseModel): id: str project_id: str asset_library_id: str strategy_id: str voice_library_id: str template_id: str = "" asset_ids: list[str] = Field(default_factory=list) title_ids: list[str] = Field(default_factory=list) voice_ids: list[str] = Field(default_factory=list) status: str progress: float result_count: int error_message: str class ListGenerationTasksResponse(BaseModel): """用户级生成任务列表响应(跨 project)。""" items: list[GenerationTaskResponse]