2025-08-31 18:38:41 +08:00

164 lines
4.5 KiB
Python

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()