Files
video-gen/video-gen-api/app/schemas/video_prompt_schema_config.py
T

101 lines
4.6 KiB
Python

from __future__ import annotations
from typing import Any
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
from app.enums.common import (
VIDEO_SCHEMA_EDITABLE_TEXT_MAX_LEN,
VIDEO_SCHEMA_FLOW_CONTENT_MAX_LEN,
VIDEO_SCHEMA_TIME_DESC_MAX_LEN,
VIDEO_SCHEMA_TIME_STAGE_MAX_LEN,
)
from app.schemas.common import NaiveDatetimeOptional
class VideoPromptSchemaConfigSaveRequest(BaseModel):
"""保存管理后台视频提词 Schema 配置。"""
model_config = ConfigDict(extra="forbid")
is_enabled: bool = Field(True, description="是否启用后台自定义配置;关闭后生成时回落默认 CLIENT_SCHEMA_V1")
data: dict[str, Any] = Field(..., description="管理后台配置数据,包含 sections、time_plan_rules 等。管理字段不会传给 AI")
@field_validator("data")
@classmethod
def _validate_data(cls, value: dict[str, Any]) -> dict[str, Any]:
if not isinstance(value, dict) or not value:
raise ValueError("data 必须是非空 JSON 对象")
return value
class VideoPromptSchemaConfigImportRequest(VideoPromptSchemaConfigSaveRequest):
"""导入 JSON 配置。"""
class VideoPromptSchemaPreviewRequest(BaseModel):
"""预览指定配置在某个视频规格下的运行时 schema。"""
model_config = ConfigDict(extra="forbid")
is_enabled: bool = Field(True, description="是否按自定义配置预览;关闭时按默认配置预览")
data: dict[str, Any] = Field(..., description="待预览的管理后台配置 JSON")
duration: int = Field(8, ge=1, le=3600, description="视频时长,单位秒")
aspect_ratio: str = Field("9:16", min_length=1, max_length=16, description="视频比例,例如 9:16")
resolution: str = Field("1080p", min_length=1, max_length=32, description="清晰度,例如 720p/1080p")
frame_rate: str = Field("30fps", min_length=1, max_length=32, description="帧率,例如 30fps")
supported_durations: list[int] = Field(default_factory=list, description="支持时长列表,仅用于预览输出规格限制")
supported_ratios: list[str] = Field(default_factory=list, description="支持比例列表,仅用于预览输出规格限制")
supported_resolutions: list[str] = Field(default_factory=list, description="支持分辨率列表,仅用于预览输出规格限制")
@model_validator(mode="after")
def _ensure_data(self) -> "VideoPromptSchemaPreviewRequest":
if not self.data:
raise ValueError("data 不能为空")
return self
def to_video_config(self) -> dict[str, Any]:
return {
"duration": self.duration,
"aspect_ratio": self.aspect_ratio,
"resolution": self.resolution,
"frame_rate": self.frame_rate,
"supported_durations": self.supported_durations,
"supported_ratios": self.supported_ratios,
"supported_resolutions": self.supported_resolutions,
}
class VideoPromptSchemaConfigOut(BaseModel):
"""管理后台视频提词 Schema 配置详情。"""
id: str | None = Field(None, description="system_configs.id;未保存时为空")
key: str = Field(..., description="system_configs.key")
description: str | None = Field(None, description="配置说明")
is_enabled: bool = Field(False, description="当前是否启用数据库自定义配置")
using_default: bool = Field(False, description="当前是否正在使用默认 CLIENT_SCHEMA_V1 兜底")
data: dict[str, Any] = Field(..., description="当前管理后台配置数据")
default_data: dict[str, Any] = Field(..., description="由 CLIENT_SCHEMA_V1 转换得到的默认配置")
created_at: NaiveDatetimeOptional = None
updated_at: NaiveDatetimeOptional = None
class VideoPromptSchemaExportOut(BaseModel):
version: str
key: str
is_enabled: bool
data: dict[str, Any]
class VideoPromptSchemaPreviewOut(BaseModel):
schema_config_snapshot: dict[str, Any] = Field(..., description="本次预览使用的配置快照")
runtime_schema: dict[str, Any] = Field(..., description="传给 AI 的纯运行时 schema,不包含 label/editable/enabled 等管理字段")
time_plan: list[dict[str, Any]] = Field(default_factory=list, description="根据秒数切片规则生成的动态时间规划")
class VideoPromptSchemaLengthLimitsOut(BaseModel):
editable_text_max_len: int = VIDEO_SCHEMA_EDITABLE_TEXT_MAX_LEN
flow_content_max_len: int = VIDEO_SCHEMA_FLOW_CONTENT_MAX_LEN
time_stage_max_len: int = VIDEO_SCHEMA_TIME_STAGE_MAX_LEN
time_desc_max_len: int = VIDEO_SCHEMA_TIME_DESC_MAX_LEN