from pydantic import BaseModel, Field from typing import Optional, List, Dict, Any from datetime import datetime class ProjectBase(BaseModel): """项目基础模式""" name: str = Field(..., description="项目名称") class ProjectCreate(ProjectBase): """创建项目模式""" pass class ProjectUpdate(ProjectBase): """更新项目模式""" script: Optional[str] = Field(None, description="剧本内容") class ProjectResponse(ProjectBase): """项目响应模式""" id: int script: Optional[str] = None full_script: Optional[str] = None prompt: Optional[str] = None video_url: Optional[str] = None created_at: datetime updated_at: datetime deleted_at: Optional[datetime] = None class Config: from_attributes = True class ProjectListResponse(BaseModel): """项目列表响应模式""" items: List[ProjectResponse] total: int page: int size: int class ProjectDetailResponse(BaseModel): """项目详情响应模式""" project: ProjectResponse assets: List['AssetResponse'] storyboards: List['StoryboardResponse'] # 素材相关模式 class AssetBase(BaseModel): """素材基础模式""" name: str = Field(..., description="素材名称") description: Optional[str] = Field(None, description="素材描述") tags: Optional[List[str]] = Field(None, description="素材标签") class AssetCreate(AssetBase): """创建素材模式""" original_url: str = Field(..., description="素材原始URL") class AssetResponse(AssetBase): """素材响应模式""" id: int project_id: int original_url: Optional[str] = None created_at: datetime updated_at: datetime class Config: from_attributes = True # 分镜相关模式 class StoryboardBase(BaseModel): """分镜基础模式""" frame_prompt: str = Field(..., description="首帧提示词") shot_prompt: str = Field(..., description="分镜动态内容提示词") class StoryboardCreate(StoryboardBase): """创建分镜模式""" frame_asset_ids: Optional[List[int]] = Field(None, description="首帧素材ID数组") class StoryboardResponse(StoryboardBase): """分镜响应模式""" id: int project_id: int frame_asset_ids: Optional[List[int]] = None frame_image_url: Optional[str] = None shot_video_url: Optional[str] = None created_at: datetime updated_at: datetime class Config: from_attributes = True # 新增的请求模式 class GenerateScriptRequest(BaseModel): """生成剧本请求模式""" script_or_idea: str = Field(..., description="剧本或创意内容") prompt_template: str = Field(..., description="提示词模板,包含${script_or_idea}占位符") class GenerateScriptResponse(BaseModel): """生成剧本响应模式""" full_script: str = Field(..., description="生成的完整剧本") assets: List[AssetResponse] = Field(..., description="生成的素材列表") class GenerateStoryboardsRequest(BaseModel): """生成分镜请求模式""" script: str = Field(..., description="用户剧本") prompt_template: str = Field(..., description="提示词模板,包含${materials_description}、${script}占位符") class UpdateAssetImageRequest(BaseModel): """更新素材图请求模式""" image_url: str = Field(..., description="素材图片URL") class UpdateAssetImageResponse(BaseModel): """更新素材图响应模式""" message: str = Field(..., description="响应消息") class GenerateAssetImageResponse(BaseModel): """生成单个素材图响应模式""" asset: AssetResponse = Field(..., description="生成图片后的素材信息") class GuideFrameRequest(BaseModel): """首帧图指导修改请求模式""" guide_image_url: str = Field(..., description="指导图URL") class GuideFrameResponse(BaseModel): """首帧图指导修改响应模式""" frame_image_url: str = Field(..., description="修改后的首帧图URL") class DeleteProjectResponse(BaseModel): """删除项目响应模式""" message: str = Field(..., description="删除结果消息") class ComposeVideoResponse(BaseModel): """合成项目视频响应模式""" video_url: str = Field(..., description="合成后的项目视频URL") # 一键复刻相关模式 class VideoReplicateRequest(BaseModel): """一键复刻请求模式""" video_url: str = Field(..., description="要复刻的视频URL") # 更新引用 ProjectDetailResponse.model_rebuild()