Files
meijiaka-zy/python-api/app/schemas/script.py
T

116 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
脚本相关 Schema
===============
"""
from typing import Any
from pydantic import BaseModel, Field
from app.schemas.segment import Segment
ScriptShot = Segment
class SubcategoryItem(BaseModel):
"""小类项"""
code: str = Field(..., description="小类代码")
name: str = Field(..., description="小类名称")
count: int = Field(..., description="提示词文件数量")
class CategoryItem(BaseModel):
"""大类项"""
code: str = Field(..., description="大类代码")
name: str = Field(..., description="大类名称")
subcategories: list[SubcategoryItem] = Field(..., description="小类列表")
class GenerateScriptRequest(BaseModel):
"""生成脚本请求"""
category: str = Field(..., description="大类代码,如 bk")
subcategory: str = Field(..., description="小类代码,如 ht")
duration: int = Field(default=45, ge=30, le=180, description="视频时长(秒)")
script_type: str = Field(default="干货型", description="脚本类型")
model: str | None = Field(None, description="指定模型(可选)")
class PolishRequest(BaseModel):
"""润色请求"""
content: str = Field(..., description="待润色内容", min_length=1)
polish_type: str = Field(default="voiceover", description="润色类型:scene / voiceover")
shot_type: str | None = Field(
default="segment",
description="镜头类型:segment(分镜) / empty_shot(空镜),用于画面润色时区分",
)
class ScriptGenerationEvent(BaseModel):
"""
脚本生成 SSE 事件
与前端 ScriptGenerationEvent 对应
事件类型说明:
- start: 初始化(0-5%
- analyzing: 分析主题(5-15%
- generating: AI 生成中(15-85%
- validating: 验证格式(85-92%
- parsing: 解析分镜(92-98%
- finalizing: 整理结果(98-100%
- complete: 完成(100%
- error: 错误
"""
type: str = Field(
...,
description="事件类型:start / analyzing / generating / validating / parsing / finalizing / complete / error",
)
progress: int = Field(default=0, ge=0, le=100, description="进度百分比")
message: str = Field(..., description="状态描述")
result: list[Any] | None = Field(None, description="生成的分镜结果(complete 时)")
extracted_info: dict[str, Any] | None = Field(
None, description="提取的视频信息(complete 时,如果是视频链接)"
)
class ModelHealthInfo(BaseModel):
"""模型健康信息"""
id: str = Field(..., description="模型 ID")
name: str = Field(..., description="模型名称")
is_available: bool = Field(..., description="是否可用")
response_time: float = Field(..., description="响应时间(毫秒)")
last_error: str | None = Field(None, description="上次错误信息")
class ModelHealthResponse(BaseModel):
"""模型健康检查响应"""
status: str = Field(..., description="整体状态:healthy / unhealthy / error")
models: list[ModelHealthInfo] = Field(..., description="各模型状态")
recommended_model: ModelHealthInfo | None = Field(None, description="推荐的模型")
total_models: int = Field(..., description="模型总数")
available_models: int = Field(..., description="可用模型数")
error: str | None = Field(None, description="错误信息")
class TestModelRequest(BaseModel):
"""测试模型请求"""
model_id: str | None = Field(None, description="要测试的模型 ID")
class TestModelResponse(BaseModel):
"""测试模型响应"""
success: bool = Field(..., description="是否成功")
model: str = Field(..., description="模型名称")
response_time: float | None = Field(None, description="响应时间(毫秒)")
error: str | None = Field(None, description="错误信息")
checked_at: str | None = Field(None, description="检查时间 ISO 格式")