diff --git a/backend/app/api/v1/routes/film/generated_video.py b/backend/app/api/v1/routes/film/generated_video.py index b5e7b18..94a0f62 100644 --- a/backend/app/api/v1/routes/film/generated_video.py +++ b/backend/app/api/v1/routes/film/generated_video.py @@ -65,7 +65,6 @@ async def create_video_generation_task( reference_mode=body.reference_mode, prompt=body.prompt, images=body.images, - size=body.size, ratio=body.ratio, ) diff --git a/backend/app/api/v1/routes/film/video_request.py b/backend/app/api/v1/routes/film/video_request.py index 95f4757..b3882b8 100644 --- a/backend/app/api/v1/routes/film/video_request.py +++ b/backend/app/api/v1/routes/film/video_request.py @@ -3,6 +3,7 @@ from __future__ import annotations from typing import Literal from pydantic import BaseModel, Field +from app.core.contracts.video_generation import VideoRatio class VideoGenerationTaskRequest(BaseModel): """视频生成任务请求。""" @@ -19,7 +20,5 @@ class VideoGenerationTaskRequest(BaseModel): description="参考图 file_id 列表,数量需与 reference_mode 严格匹配", ) - size: str | None = Field(None, description="分辨率(可选),如 720x1280") - ratio: str | None = Field(None, description="画幅比例(可选),如 16:9 / 9:16") + ratio: VideoRatio = Field(..., description="视频画幅比例,如 16:9 / 9:16") # seconds 由 ShotDetail.duration 自动确定;请求体不再接收覆盖值。 - diff --git a/backend/app/api/v1/routes/llm.py b/backend/app/api/v1/routes/llm.py index 90e6ef6..8c6a769 100644 --- a/backend/app/api/v1/routes/llm.py +++ b/backend/app/api/v1/routes/llm.py @@ -9,6 +9,7 @@ from app.dependencies import get_db from app.models.llm import ModelCategoryKey from app.schemas.common import ApiResponse, PaginatedData, created_response, empty_response, success_response from app.schemas.llm import ( + ImageGenerationOptionsRead, ModelCreate, ModelRead, ModelSettingsRead, @@ -17,6 +18,7 @@ from app.schemas.llm import ( ProviderCreate, ProviderRead, ProviderSupportedRead, + VideoGenerationOptionsRead, ProviderUpdate, ) from app.services.llm.manage import ( @@ -27,6 +29,8 @@ from app.services.llm.manage import ( get_model as get_model_service, get_model_settings as get_model_settings_service, get_provider as get_provider_service, + get_image_generation_options as get_image_generation_options_service, + get_video_generation_options as get_video_generation_options_service, list_supported_providers as list_supported_providers_service, list_models_paginated, list_providers_paginated, @@ -83,6 +87,30 @@ async def list_supported_providers( return success_response(items) +@router.get( + "/image-generation-options", + response_model=ApiResponse[ImageGenerationOptionsRead], + summary="获取当前默认图片模型的关键帧规格选项", +) +async def get_image_generation_options( + db: AsyncSession = Depends(get_db), +) -> ApiResponse[ImageGenerationOptionsRead]: + data = await get_image_generation_options_service(db) + return success_response(data) + + +@router.get( + "/video-generation-options", + response_model=ApiResponse[VideoGenerationOptionsRead], + summary="获取当前默认视频模型的动态比例选项", +) +async def get_video_generation_options( + db: AsyncSession = Depends(get_db), +) -> ApiResponse[VideoGenerationOptionsRead]: + data = await get_video_generation_options_service(db) + return success_response(data) + + @router.post( "/providers", response_model=ApiResponse[ProviderRead], diff --git a/backend/app/api/v1/routes/studio/image_tasks.py b/backend/app/api/v1/routes/studio/image_tasks.py index 862d790..620db2a 100644 --- a/backend/app/api/v1/routes/studio/image_tasks.py +++ b/backend/app/api/v1/routes/studio/image_tasks.py @@ -11,6 +11,7 @@ from pydantic import BaseModel, Field from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession +from app.core.contracts.image_generation import ImageResolutionProfile, ImageTargetRatio from app.dependencies import get_db from app.models.studio import ( ShotDetail, @@ -101,6 +102,14 @@ class ShotFrameImageTaskRequest(BaseModel): "无效条目会被跳过。" ), ) + target_ratio: ImageTargetRatio = Field( + ..., + description="目标视频画幅比例;关键帧将按该画幅生成,以提升后续视频参考稳定性", + ) + resolution_profile: ImageResolutionProfile | None = Field( + "standard", + description="关键帧输出分辨率档位,默认 standard", + ) class ShotFramePromptRenderRequest(BaseModel): @@ -386,6 +395,9 @@ async def create_shot_frame_image_generation_task( relation_entity_id=str(shot_frame_image.id), prompt=submission.prompt, images=ref_images if ref_images else None, + target_ratio=body.target_ratio, + resolution_profile=body.resolution_profile, + purpose="video_reference", render_context=submission_extra.get("render_context"), ) return created_response(TaskCreated(task_id=task_id)) diff --git a/backend/app/api/v1/routes/studio/projects.py b/backend/app/api/v1/routes/studio/projects.py index c856845..16d324b 100644 --- a/backend/app/api/v1/routes/studio/projects.py +++ b/backend/app/api/v1/routes/studio/projects.py @@ -32,10 +32,6 @@ from app.schemas.studio.projects import ( router = APIRouter() PROJECT_ORDER_FIELDS = {"name", "created_at", "updated_at", "progress"} -VIDEO_RATIO_OPTIONS = ("16:9", "4:3", "1:1", "3:4", "9:16", "21:9") -VIDEO_SIZE_OPTIONS = ("1920x1080", "1280x720", "1080x1920", "720x1280", "1024x1024") -DEFAULT_VIDEO_RATIO = "16:9" -DEFAULT_VIDEO_SIZE = "1920x1080" def _build_project_style_options() -> tuple[dict[ProjectVisualStyle, list[ProjectStyle]], dict[ProjectVisualStyle, ProjectStyle]]: @@ -68,9 +64,10 @@ def _validate_project_style_combo(*, visual_style: ProjectVisualStyle, style: Pr @router.get( "/style-options", response_model=ApiResponse[ProjectStyleOptionsRead], - summary="获取项目风格与视频参数候选项", + summary="获取项目风格候选项", ) -async def get_project_style_options() -> ApiResponse[ProjectStyleOptionsRead]: +async def get_project_style_options( +) -> ApiResponse[ProjectStyleOptionsRead]: mapping, defaults = _build_project_style_options() data = ProjectStyleOptionsRead( visual_styles=[StyleOption(value=x.value, label=x.value) for x in ProjectVisualStyle], @@ -79,10 +76,6 @@ async def get_project_style_options() -> ApiResponse[ProjectStyleOptionsRead]: for visual, styles in mapping.items() }, default_style_by_visual_style={visual.value: style.value for visual, style in defaults.items()}, - default_video_ratio=DEFAULT_VIDEO_RATIO, - default_video_size=DEFAULT_VIDEO_SIZE, - video_ratios=[StyleOption(value=x, label=x) for x in VIDEO_RATIO_OPTIONS], - video_sizes=[StyleOption(value=x, label=x) for x in VIDEO_SIZE_OPTIONS], ) return success_response(data) diff --git a/backend/app/core/contracts/image_generation.py b/backend/app/core/contracts/image_generation.py index bd224a0..56f26d1 100644 --- a/backend/app/core/contracts/image_generation.py +++ b/backend/app/core/contracts/image_generation.py @@ -9,6 +9,9 @@ from pydantic import BaseModel, ConfigDict, Field, model_validator from app.core.contracts.provider import ProviderKey ResponseFormat = Literal["url", "b64_json"] +ImageTargetRatio = Literal["16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "3:2", "2:3"] +ImageResolutionProfile = Literal["standard", "high"] +ImagePurpose = Literal["generic", "video_reference", "asset_image"] class InputImageRef(BaseModel): @@ -43,6 +46,18 @@ class ImageGenerationInput(BaseModel): description="参考图片列表:存在时 OpenAI 走 /images/edits,火山映射为 image[]", ) model: Optional[str] = Field(None, description="模型名称(如 gpt-image-1.5 / doubao-seedream-*)") + target_ratio: ImageTargetRatio | None = Field( + None, + description="目标画幅比例,用于视频参考帧等需要与视频构图对齐的场景", + ) + resolution_profile: ImageResolutionProfile | None = Field( + None, + description="输出分辨率档位,如 standard / high;由供应商适配层映射为最终 size", + ) + purpose: ImagePurpose = Field( + "generic", + description="生成用途,如 generic / video_reference / asset_image", + ) size: Optional[str] = Field( None, description="分辨率,如 1024x1024 / 1024x1536 等;不同供应商可选项不同", diff --git a/backend/app/core/contracts/video_generation.py b/backend/app/core/contracts/video_generation.py index bff497b..9a2fb4b 100644 --- a/backend/app/core/contracts/video_generation.py +++ b/backend/app/core/contracts/video_generation.py @@ -16,6 +16,9 @@ def _strip_optional_b64(value: str | None) -> str | None: return s if s else None +VideoRatio = Literal["16:9", "4:3", "1:1", "3:4", "9:16", "21:9"] + + class VideoGenerationInput(BaseModel): """视频生成输入:支持文本提示词 + 可选的三种帧参考图(纯 base64 或 data URL)。""" @@ -28,7 +31,7 @@ class VideoGenerationInput(BaseModel): key_frame_base64: Optional[str] = Field(None, description="关键帧图:纯 base64 或 data URL") model: Optional[str] = Field(None, description="视频模型名称(可选,供应商透传)") - size: Optional[str] = Field(None, description="分辨率,如 720x1280(可选,供应商透传)") + ratio: VideoRatio = Field(..., description="视频宽高比,业务层唯一主参数") seconds: Optional[int] = Field(None, description="时长(秒)(可选,供应商透传)") seed: Optional[int] = Field( None, @@ -37,10 +40,6 @@ class VideoGenerationInput(BaseModel): description="随机种子,-1 或 [0, 2^32-1],供应商/模型可能有差异", ) watermark: Optional[bool] = Field(None, description="是否包含水印,供应商/模型可能有差异") - ratio: Optional[Literal["16:9", "4:3", "1:1", "3:4", "9:16", "21:9"]] = Field( - None, - description="视频宽高比,供应商/模型可能有差异", - ) @model_validator(mode="after") def require_prompt_or_any_reference(self) -> "VideoGenerationInput": diff --git a/backend/app/core/integrations/image_capabilities.py b/backend/app/core/integrations/image_capabilities.py index 3685475..15f3cf0 100644 --- a/backend/app/core/integrations/image_capabilities.py +++ b/backend/app/core/integrations/image_capabilities.py @@ -7,6 +7,17 @@ from dataclasses import dataclass from app.core.contracts.image_generation import ImageGenerationInput from app.core.contracts.provider import ProviderKey +DEFAULT_VIDEO_REFERENCE_RATIO_SIZE_MAP: dict[str, dict[str, str]] = { + "16:9": {"standard": "1792x1024", "high": "2048x1152"}, + "4:3": {"standard": "1536x1152", "high": "2048x1536"}, + "1:1": {"standard": "1024x1024", "high": "1536x1536"}, + "3:2": {"standard": "1536x1024", "high": "2048x1365"}, + "2:3": {"standard": "1024x1536", "high": "1365x2048"}, + "3:4": {"standard": "1152x1536", "high": "1536x2048"}, + "9:16": {"standard": "1024x1792", "high": "1152x2048"}, + "21:9": {"standard": "2048x896", "high": "2304x1024"}, +} + @dataclass(frozen=True, slots=True) class ImageModelCapability: @@ -15,6 +26,9 @@ class ImageModelCapability: supports_seed: bool = True supports_watermark: bool = True allowed_sizes: set[str] | None = None + supported_ratios: set[str] | None = None + default_resolution_profile: str | None = "standard" + ratio_size_profiles: dict[str, dict[str, str]] | None = None min_n: int | None = 1 max_n: int | None = 10 @@ -61,6 +75,45 @@ def resolve_image_capability(*, provider: ProviderKey, model: str | None) -> Ima return resolve_volcengine_image_capability(model) +def resolve_image_size( + *, + provider: ProviderKey, + model: str | None, + purpose: str, + target_ratio: str | None, + resolution_profile: str | None, + requested_size: str | None, +) -> str | None: + """解析图片最终 size。 + + 普通图片任务优先保留显式传入的 requested_size; + 视频参考帧场景则优先根据 target_ratio + resolution_profile 从 capability 推导, + 以保证关键帧与目标视频画幅保持一致。 + """ + if purpose != "video_reference": + return requested_size + + ratio = (target_ratio or "").strip() + if not ratio: + return requested_size + + cap = resolve_image_capability(provider=provider, model=model) + if cap.supported_ratios is not None and ratio not in cap.supported_ratios: + raise ValueError( + f"Unsupported target_ratio for provider={provider} model={model or ''}: {ratio}. " + f"Allowed: {sorted(cap.supported_ratios)}" + ) + + profile = (resolution_profile or cap.default_resolution_profile or "standard").strip() or "standard" + profiles = cap.ratio_size_profiles or DEFAULT_VIDEO_REFERENCE_RATIO_SIZE_MAP + size = profiles.get(ratio, {}).get(profile) + if size: + return size + + fallback_profiles = DEFAULT_VIDEO_REFERENCE_RATIO_SIZE_MAP.get(ratio, {}) + return fallback_profiles.get(profile) or fallback_profiles.get("standard") or requested_size + + def validate_image_options( *, provider: ProviderKey, diff --git a/backend/app/core/integrations/openai/images.py b/backend/app/core/integrations/openai/images.py index eda2c21..b45e32b 100644 --- a/backend/app/core/integrations/openai/images.py +++ b/backend/app/core/integrations/openai/images.py @@ -17,6 +17,7 @@ from app.core.contracts.image_generation import ( ImageItem, ) from app.core.contracts.provider import ProviderConfig +from app.core.integrations.image_capabilities import resolve_image_size from app.core.integrations.openai.image_capabilities import validate_openai_image_options @@ -36,31 +37,40 @@ class OpenAIImageApiAdapter: raise RuntimeError("httpx is required for image generation tasks") from e base_url = (cfg.base_url or "https://api.openai.com/v1").rstrip("/") - validate_openai_image_options(inp) + resolved_size = resolve_image_size( + provider="openai", + model=inp.model, + purpose=inp.purpose, + target_ratio=inp.target_ratio, + resolution_profile=inp.resolution_profile, + requested_size=inp.size, + ) + resolved_input = inp.model_copy(update={"size": resolved_size}) + validate_openai_image_options(resolved_input) headers = { "Authorization": f"Bearer {cfg.api_key}", "Content-Type": "application/json", } async with httpx.AsyncClient(timeout=timeout_s) as client: - if inp.images: + if resolved_input.images: body: dict[str, Any] = { - "prompt": inp.prompt, - "n": inp.n, + "prompt": resolved_input.prompt, + "n": resolved_input.n, } - if inp.model: - body["model"] = inp.model - if inp.size: - body["size"] = inp.size - if inp.watermark is not None: - body["watermark"] = bool(inp.watermark) + if resolved_input.model: + body["model"] = resolved_input.model + if resolved_input.size: + body["size"] = resolved_input.size + if resolved_input.watermark is not None: + body["watermark"] = bool(resolved_input.watermark) body["images"] = [ { **({"file_id": ref.file_id} if ref.file_id else {}), **({"image_url": ref.image_url} if ref.image_url else {}), } - for ref in inp.images + for ref in resolved_input.images ] url = f"{base_url}/images/edits" @@ -75,16 +85,16 @@ class OpenAIImageApiAdapter: r = await client.post(url, headers=headers, json=body) else: body = { - "prompt": inp.prompt, - "n": inp.n, - "response_format": inp.response_format, + "prompt": resolved_input.prompt, + "n": resolved_input.n, + "response_format": resolved_input.response_format, } - if inp.model: - body["model"] = inp.model - if inp.size: - body["size"] = inp.size - if inp.watermark is not None: - body["watermark"] = bool(inp.watermark) + if resolved_input.model: + body["model"] = resolved_input.model + if resolved_input.size: + body["size"] = resolved_input.size + if resolved_input.watermark is not None: + body["watermark"] = bool(resolved_input.watermark) url = f"{base_url}/images/generations" t0 = time.perf_counter() diff --git a/backend/app/core/integrations/openai/video_capabilities.py b/backend/app/core/integrations/openai/video_capabilities.py index 8870bca..44e89f3 100644 --- a/backend/app/core/integrations/openai/video_capabilities.py +++ b/backend/app/core/integrations/openai/video_capabilities.py @@ -13,6 +13,7 @@ _OPENAI_DEFAULT = VideoModelCapability( supports_seed=True, supports_watermark=True, allowed_ratios=set(ALLOWED_RATIOS), + default_ratio="16:9", ) # key: 模型前缀(小写) diff --git a/backend/app/core/integrations/openai/video_payload.py b/backend/app/core/integrations/openai/video_payload.py index fa16ad6..8c79afd 100644 --- a/backend/app/core/integrations/openai/video_payload.py +++ b/backend/app/core/integrations/openai/video_payload.py @@ -5,7 +5,7 @@ from __future__ import annotations from typing import Any from app.core.integrations.openai.video_capabilities import validate_openai_video_options -from app.core.integrations.video_capabilities import resolve_effective_ratio +from app.core.integrations.video_capabilities import derive_provider_size, resolve_effective_ratio from app.core.contracts.video_generation import VideoGenerationInput, _strip_optional_b64 @@ -33,8 +33,9 @@ def build_create_video_body(input_: VideoGenerationInput) -> dict[str, Any]: body: dict[str, Any] = {"prompt": input_.prompt or ""} if input_.model: body["model"] = input_.model - if input_.size: - body["size"] = input_.size + size = derive_provider_size(provider="openai", model=input_.model, ratio=input_.ratio) + if size: + body["size"] = size if input_.seconds is not None: body["seconds"] = str(int(input_.seconds)) effective_ratio = resolve_effective_ratio(input_) diff --git a/backend/app/core/integrations/video_capabilities.py b/backend/app/core/integrations/video_capabilities.py index c6e6ca3..20233cc 100644 --- a/backend/app/core/integrations/video_capabilities.py +++ b/backend/app/core/integrations/video_capabilities.py @@ -3,12 +3,19 @@ from __future__ import annotations from dataclasses import dataclass -from math import gcd from app.core.contracts.provider import ProviderKey -from app.core.contracts.video_generation import VideoGenerationInput +from app.core.contracts.video_generation import VideoGenerationInput, VideoRatio ALLOWED_RATIOS = {"16:9", "4:3", "1:1", "3:4", "9:16", "21:9"} +DEFAULT_RATIO_TO_SIZE_MAPPING: dict[str, str] = { + "16:9": "1280x720", + "4:3": "1024x768", + "1:1": "1024x1024", + "3:4": "768x1024", + "9:16": "720x1280", + "21:9": "1680x720", +} @dataclass(frozen=True, slots=True) @@ -18,7 +25,8 @@ class VideoModelCapability: supports_seed: bool = True supports_watermark: bool = True allowed_ratios: set[str] | None = None - allowed_sizes: set[str] | None = None + default_ratio: str | None = None + ratio_to_size_mapping: dict[str, str] | None = None min_seconds: int | None = 1 max_seconds: int | None = None @@ -65,32 +73,28 @@ def resolve_video_capability(*, provider: ProviderKey, model: str | None) -> Vid return resolve_volcengine_video_capability(model) -def infer_ratio_from_size(size: str | None) -> str | None: - if not size: - return None - value = size.strip().lower() - if not value: - return None - if ":" in value: - return value if value in ALLOWED_RATIOS else None - if "x" not in value: - return None - left, right = value.split("x", 1) - if not left.isdigit() or not right.isdigit(): - return None - width = int(left) - height = int(right) - if width <= 0 or height <= 0: - return None - factor = gcd(width, height) - ratio = f"{width // factor}:{height // factor}" - return ratio if ratio in ALLOWED_RATIOS else None - - def resolve_effective_ratio(input_: VideoGenerationInput) -> str | None: - if input_.ratio: - return input_.ratio - return infer_ratio_from_size(input_.size) + return input_.ratio + + +def resolve_default_ratio(*, provider: ProviderKey, model: str | None) -> str | None: + cap = resolve_video_capability(provider=provider, model=model) + if cap.default_ratio: + return cap.default_ratio + if cap.allowed_ratios: + return sorted(cap.allowed_ratios)[0] + return "16:9" + + +def derive_provider_size( + *, + provider: ProviderKey, + model: str | None, + ratio: VideoRatio, +) -> str | None: + cap = resolve_video_capability(provider=provider, model=model) + mapping = cap.ratio_to_size_mapping or DEFAULT_RATIO_TO_SIZE_MAPPING + return mapping.get(ratio) def validate_video_options( @@ -100,21 +104,11 @@ def validate_video_options( input_: VideoGenerationInput, ) -> None: cap = resolve_video_capability(provider=provider, model=model) - inferred_ratio = infer_ratio_from_size(input_.size) if input_.ratio and cap.allowed_ratios is not None and input_.ratio not in cap.allowed_ratios: raise ValueError( f"Unsupported ratio for provider={provider} model={model or ''}: {input_.ratio}. " f"Allowed: {sorted(cap.allowed_ratios)}" ) - if input_.ratio and inferred_ratio and inferred_ratio != input_.ratio: - raise ValueError( - f"ratio conflicts with size: ratio={input_.ratio}, size={input_.size} (implies {inferred_ratio})" - ) - if input_.size and cap.allowed_sizes is not None and input_.size not in cap.allowed_sizes: - raise ValueError( - f"Unsupported size for provider={provider} model={model or ''}: {input_.size}. " - f"Allowed: {sorted(cap.allowed_sizes)}" - ) if input_.seconds is not None: if cap.min_seconds is not None and input_.seconds < cap.min_seconds: raise ValueError(f"seconds must be >= {cap.min_seconds}") diff --git a/backend/app/core/integrations/volcengine/image_capabilities.py b/backend/app/core/integrations/volcengine/image_capabilities.py index eab3470..41329ef 100644 --- a/backend/app/core/integrations/volcengine/image_capabilities.py +++ b/backend/app/core/integrations/volcengine/image_capabilities.py @@ -9,9 +9,28 @@ from app.core.integrations.image_capabilities import ImageModelCapability if TYPE_CHECKING: from app.core.contracts.image_generation import ImageGenerationInput +_VOLCENGINE_RATIO_SIZE_PROFILES = { + "1:1": {"standard": "2048x2048", "high": "3072x3072"}, + "4:3": {"standard": "2304x1728", "high": "3456x2592"}, + "3:4": {"standard": "1728x2304", "high": "2592x3456"}, + "16:9": {"standard": "2848x1600", "high": "4096x2304"}, + "9:16": {"standard": "1600x2848", "high": "2304x4096"}, + "3:2": {"standard": "2496x1664", "high": "3744x2496"}, + "2:3": {"standard": "1664x2496", "high": "2496x3744"}, + "21:9": {"standard": "3136x1344", "high": "4704x2016"}, +} + _VOLCENGINE_DEFAULT = ImageModelCapability( supports_seed=True, supports_watermark=True, + allowed_sizes={ + size + for profiles in _VOLCENGINE_RATIO_SIZE_PROFILES.values() + for size in profiles.values() + }, + supported_ratios=set(_VOLCENGINE_RATIO_SIZE_PROFILES.keys()), + default_resolution_profile="standard", + ratio_size_profiles=_VOLCENGINE_RATIO_SIZE_PROFILES, ) # key: 模型前缀(小写) diff --git a/backend/app/core/integrations/volcengine/images.py b/backend/app/core/integrations/volcengine/images.py index e27c731..fe272f1 100644 --- a/backend/app/core/integrations/volcengine/images.py +++ b/backend/app/core/integrations/volcengine/images.py @@ -17,6 +17,7 @@ from app.core.contracts.image_generation import ( ImageItem, ) from app.core.contracts.provider import ProviderConfig +from app.core.integrations.image_capabilities import resolve_image_size from app.core.integrations.volcengine.image_capabilities import validate_volcengine_image_options @@ -36,13 +37,22 @@ class VolcengineImageApiAdapter: raise RuntimeError("httpx is required for image generation tasks") from e base_url = (cfg.base_url or "https://ark.cn-beijing.volces.com/api/v3").rstrip("/") - validate_volcengine_image_options(inp) + resolved_size = resolve_image_size( + provider="volcengine", + model=inp.model, + purpose=inp.purpose, + target_ratio=inp.target_ratio, + resolution_profile=inp.resolution_profile, + requested_size=inp.size, + ) + resolved_input = inp.model_copy(update={"size": resolved_size}) + validate_volcengine_image_options(resolved_input) headers = { "Authorization": f"Bearer {cfg.api_key}", "Content-Type": "application/json", } - body = _build_image_body(inp) + body = _build_image_body(resolved_input) async with httpx.AsyncClient(timeout=timeout_s) as client: url = f"{base_url}/images/generations" diff --git a/backend/app/core/integrations/volcengine/video_capabilities.py b/backend/app/core/integrations/volcengine/video_capabilities.py index 1c5718b..1591668 100644 --- a/backend/app/core/integrations/volcengine/video_capabilities.py +++ b/backend/app/core/integrations/volcengine/video_capabilities.py @@ -13,6 +13,7 @@ _VOLCENGINE_DEFAULT = VideoModelCapability( supports_seed=True, supports_watermark=True, allowed_ratios=set(ALLOWED_RATIOS), + default_ratio="16:9", ) # key: 模型前缀(小写) diff --git a/backend/app/core/integrations/volcengine/video_payload.py b/backend/app/core/integrations/volcengine/video_payload.py index 7aa40f8..3e8f20d 100644 --- a/backend/app/core/integrations/volcengine/video_payload.py +++ b/backend/app/core/integrations/volcengine/video_payload.py @@ -10,15 +10,6 @@ from app.core.integrations.volcengine.video_capabilities import validate_volceng from app.core.contracts.video_generation import VideoGenerationInput, _strip_optional_b64 -def volcengine_ratio(size: str | None) -> str: - if not size or not str(size).strip(): - return "adaptive" - s = str(size).strip() - if s.lower() == "adaptive" or ":" in s: - return s - return "adaptive" - - def build_content(input_: VideoGenerationInput) -> list[dict[str, Any]]: items: list[dict[str, Any]] = [] prompt = (input_.prompt or "").strip() @@ -61,7 +52,7 @@ def build_create_task_body(input_: VideoGenerationInput) -> dict[str, Any]: if not content: raise RuntimeError("Volcengine video requires non-empty content (prompt and/or reference frames)") - effective_ratio = resolve_effective_ratio(input_) or volcengine_ratio(input_.size) + effective_ratio = resolve_effective_ratio(input_) body: dict[str, Any] = { "content": content, "ratio": effective_ratio, diff --git a/backend/app/models/studio_projects.py b/backend/app/models/studio_projects.py index 55dce12..d61d0c6 100644 --- a/backend/app/models/studio_projects.py +++ b/backend/app/models/studio_projects.py @@ -36,12 +36,6 @@ class Project(Base, TimestampMixin): seed: Mapped[int] = mapped_column(Integer, nullable=False, default=0, comment="随机种子") unify_style: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True, comment="是否统一风格(跨章节)") progress: Mapped[int] = mapped_column(Integer, nullable=False, default=0, comment="进度百分比(0-100)") - default_video_size: Mapped[str | None] = mapped_column( - String(32), - nullable=True, - default=None, - comment="项目级默认视频尺寸(可为空;分镜未覆盖时使用)", - ) default_video_ratio: Mapped[str | None] = mapped_column( String(16), nullable=True, @@ -250,4 +244,3 @@ __all__ = [ "ProjectPropLink", "ProjectCostumeLink", ] - diff --git a/backend/app/models/studio_shots.py b/backend/app/models/studio_shots.py index e8f5397..137097f 100644 --- a/backend/app/models/studio_shots.py +++ b/backend/app/models/studio_shots.py @@ -171,12 +171,6 @@ class ShotDetail(Base,TimestampMixin): comment="关联场景 ID(可空);应用层需保证与镜头所属项目一致或全局", ) duration: Mapped[int] = mapped_column(Integer, nullable=False, default=0, comment="时长(秒);镜头唯一时长来源") - override_video_size: Mapped[str | None] = mapped_column( - String(32), - nullable=True, - default=None, - comment="分镜级视频尺寸覆盖(为空表示继承项目默认)", - ) override_video_ratio: Mapped[str | None] = mapped_column( String(16), nullable=True, diff --git a/backend/app/schemas/llm.py b/backend/app/schemas/llm.py index dce7f6d..9b288bb 100644 --- a/backend/app/schemas/llm.py +++ b/backend/app/schemas/llm.py @@ -72,6 +72,30 @@ class ProviderSupportedRead(BaseModel): is_experimental: bool = Field(False, description="是否实验性供应商") +class VideoGenerationOptionsRead(BaseModel): + """当前默认视频模型对应的生成参数选项。""" + + provider: str = Field(..., description="供应商稳定键") + model_id: str = Field(..., description="默认视频模型 ID") + model_name: str = Field(..., description="默认视频模型名称") + allowed_ratios: list[str] = Field(default_factory=list, description="当前模型允许的比例选项") + default_ratio: str = Field(..., description="当前模型默认比例") + + +class ImageGenerationOptionsRead(BaseModel): + """当前默认图片模型对应的关键帧规格选项。""" + + provider: str = Field(..., description="供应商稳定键") + model_id: str = Field(..., description="默认图片模型 ID") + model_name: str = Field(..., description="默认图片模型名称") + supported_ratios: list[str] = Field(default_factory=list, description="当前模型支持的目标比例") + default_resolution_profile: str = Field(..., description="当前模型默认分辨率档位") + ratio_size_profiles: dict[str, dict[str, str]] = Field( + default_factory=dict, + description="按比例和分辨率档位映射得到的像素尺寸", + ) + + class ModelBase(BaseModel): """模型通用字段。""" diff --git a/backend/app/schemas/studio/projects.py b/backend/app/schemas/studio/projects.py index dd09d7a..4c266e8 100644 --- a/backend/app/schemas/studio/projects.py +++ b/backend/app/schemas/studio/projects.py @@ -20,7 +20,6 @@ class ProjectBase(BaseModel): seed: int = Field(0, description="随机种子") unify_style: bool = Field(True, description="是否统一风格") progress: int = Field(0, description="进度百分比(0-100)") - default_video_size: str | None = Field(None, description="项目级默认视频尺寸;分镜未覆盖时生效") default_video_ratio: str | None = Field(None, description="项目级默认视频比例;分镜未覆盖时生效") stats: dict[str, Any] = Field(default_factory=dict, description="聚合统计(JSON)") @@ -37,7 +36,6 @@ class ProjectUpdate(BaseModel): seed: int | None = None unify_style: bool | None = None progress: int | None = None - default_video_size: str | None = None default_video_ratio: str | None = None stats: dict[str, Any] | None = None @@ -89,7 +87,7 @@ class StyleOption(BaseModel): class ProjectStyleOptionsRead(BaseModel): - """项目风格与视频参数候选项。""" + """项目风格候选项。""" visual_styles: list[StyleOption] = Field(default_factory=list, description="视觉风格可选项") styles_by_visual_style: dict[str, list[StyleOption]] = Field( @@ -100,13 +98,3 @@ class ProjectStyleOptionsRead(BaseModel): default_factory=dict, description="各视觉风格默认视频风格", ) - default_video_ratio: str | None = Field( - None, - description="默认视频比例(用于创建项目时的初始值)", - ) - default_video_size: str | None = Field( - None, - description="默认视频尺寸(用于创建项目时的初始值)", - ) - video_ratios: list[StyleOption] = Field(default_factory=list, description="视频比例候选项") - video_sizes: list[StyleOption] = Field(default_factory=list, description="视频尺寸候选项") diff --git a/backend/app/schemas/studio/shots.py b/backend/app/schemas/studio/shots.py index f5aa762..5691e6e 100644 --- a/backend/app/schemas/studio/shots.py +++ b/backend/app/schemas/studio/shots.py @@ -132,7 +132,6 @@ class ShotDetailBase(BaseModel): movement: CameraMovement = Field(..., description="运镜方式") scene_id: str | None = Field(None, description="关联场景 ID(可空)") duration: int = Field(0, description="时长(秒)") - override_video_size: str | None = Field(None, description="分镜级视频尺寸覆盖;为空表示继承项目默认") override_video_ratio: str | None = Field(None, description="分镜级视频比例覆盖;为空表示继承项目默认") mood_tags: list[str] = Field(default_factory=list, description="情绪标签") atmosphere: str = Field("", description="氛围描述") @@ -164,7 +163,6 @@ class ShotDetailUpdate(BaseModel): movement: CameraMovement | None = None scene_id: str | None = None duration: int | None = None - override_video_size: str | None = None override_video_ratio: str | None = None mood_tags: list[str] | None = None atmosphere: str | None = None diff --git a/backend/app/services/film/generated_video.py b/backend/app/services/film/generated_video.py index 63ddb0d..c5618bb 100644 --- a/backend/app/services/film/generated_video.py +++ b/backend/app/services/film/generated_video.py @@ -16,9 +16,8 @@ from app.core.contracts.video_generation import VideoGenerationInput, VideoGener from app.core.tasks import VideoGenerationTask from app.models.llm import Model, ModelCategoryKey, ModelSettings from app.models.task_links import GenerationTaskLink -from app.models.studio import Chapter, FileItem, Project, Shot, ShotDetail, ShotFrameType +from app.models.studio import FileItem, Shot, ShotDetail, ShotFrameType from app.models.types import FileUsageKind -from app.core.integrations.video_capabilities import infer_ratio_from_size from app.services.common import entity_not_found from app.services.llm.provider_resolver import resolve_provider_config_by_model from app.services.studio.file_usages import sync_usage_from_shot_context @@ -131,48 +130,13 @@ def _normalize_optional_text(value: str | None) -> str | None: async def resolve_effective_video_options( - db: AsyncSession, - *, - shot_id: str, - shot_detail: ShotDetail, - requested_size: str | None, requested_ratio: str | None, -) -> tuple[str | None, str | None]: - """解析视频参数优先级:请求参数 > 分镜覆盖 > 项目默认。""" - req_size = _normalize_optional_text(requested_size) +) -> str: + """解析视频比例:请求参数为唯一主参数。""" req_ratio = _normalize_optional_text(requested_ratio) - shot_size = _normalize_optional_text(getattr(shot_detail, "override_video_size", None)) - shot_ratio = _normalize_optional_text(getattr(shot_detail, "override_video_ratio", None)) - - project_size: str | None = None - project_ratio: str | None = None - if req_size is None or req_ratio is None: - stmt = ( - select(Project.default_video_size, Project.default_video_ratio) - .select_from(Shot) - .join(Chapter, Chapter.id == Shot.chapter_id) - .join(Project, Project.id == Chapter.project_id) - .where(Shot.id == shot_id) - .limit(1) - ) - row = (await db.execute(stmt)).first() - if row is not None: - project_size = _normalize_optional_text(row[0]) - project_ratio = _normalize_optional_text(row[1]) - - resolved_size = req_size or shot_size or project_size - resolved_ratio = req_ratio or shot_ratio or project_ratio - - implied_ratio = infer_ratio_from_size(resolved_size) - if resolved_ratio and implied_ratio and implied_ratio != resolved_ratio: - raise HTTPException( - status_code=400, - detail=( - f"ratio conflicts with size: ratio={resolved_ratio}, " - f"size={resolved_size} (implies {implied_ratio})" - ), - ) - return resolved_size, resolved_ratio + if not req_ratio: + raise HTTPException(status_code=400, detail="ratio is required") + return req_ratio async def build_run_args( @@ -182,20 +146,13 @@ async def build_run_args( reference_mode: str, prompt: str | None, images: list[str], - size: str | None, ratio: str | None, ) -> dict: model = await resolve_default_video_model(db) provider_cfg = await load_provider_config_by_model(db, model) shot_detail = await validate_shot_and_duration(db, shot_id) - resolved_size, resolved_ratio = await resolve_effective_video_options( - db, - shot_id=shot_id, - shot_detail=shot_detail, - requested_size=size, - requested_ratio=ratio, - ) - base = build_video_base_draft(shot_id=shot_id, prompt=prompt, size=resolved_size) + resolved_ratio = await resolve_effective_video_options(requested_ratio=ratio) + base = build_video_base_draft(shot_id=shot_id, prompt=prompt) context = await build_video_context( db, shot_id=shot_id, @@ -224,7 +181,6 @@ async def build_run_args( "last_frame_base64": frame_map.get(ShotFrameType.last), "key_frame_base64": frame_map.get(ShotFrameType.key), "model": model.name, - "size": resolved_size, "ratio": resolved_ratio, "seconds": shot_detail.duration, }, diff --git a/backend/app/services/llm/manage.py b/backend/app/services/llm/manage.py index 3c892a4..015be1f 100644 --- a/backend/app/services/llm/manage.py +++ b/backend/app/services/llm/manage.py @@ -8,8 +8,14 @@ from sqlalchemy.ext.asyncio import AsyncSession from app.api.utils import apply_keyword_filter, apply_order, paginate from app.models.llm import Model, ModelCategoryKey, ModelSettings, Provider +from app.core.integrations.image_capabilities import ( + DEFAULT_VIDEO_REFERENCE_RATIO_SIZE_MAP, + resolve_image_capability, +) +from app.core.integrations.video_capabilities import resolve_default_ratio, resolve_video_capability from app.schemas.common import ApiResponse, PaginatedData, paginated_response from app.schemas.llm import ( + ImageGenerationOptionsRead, ModelCreate, ModelRead, ModelSettingsUpdate, @@ -17,6 +23,7 @@ from app.schemas.llm import ( ProviderCreate, ProviderRead, ProviderSupportedRead, + VideoGenerationOptionsRead, ProviderUpdate, ) from app.services.llm.provider_registry import ( @@ -276,6 +283,72 @@ async def update_model_settings( return await flush_and_refresh(db, settings) +async def get_video_generation_options( + db: AsyncSession, +) -> VideoGenerationOptionsRead: + """返回当前默认视频模型的动态 ratio 枚举。""" + settings = await get_or_create_settings(db) + model_id = settings.default_video_model_id + if not model_id: + return VideoGenerationOptionsRead( + provider="", + model_id="", + model_name="", + allowed_ratios=["16:9"], + default_ratio="16:9", + ) + + model = await get_or_404(db, Model, model_id, detail=entity_not_found("Model")) + provider = await get_or_404(db, Provider, model.provider_id, detail=entity_not_found("Provider")) + provider_key = resolve_provider_key_from_name(provider.name) + capability = resolve_video_capability(provider=provider_key, model=model.name) + allowed_ratios = sorted(capability.allowed_ratios or {"16:9"}) + default_ratio = resolve_default_ratio(provider=provider_key, model=model.name) or allowed_ratios[0] + if default_ratio not in allowed_ratios: + allowed_ratios = sorted({*allowed_ratios, default_ratio}) + + return VideoGenerationOptionsRead( + provider=provider_key, + model_id=model.id, + model_name=model.name, + allowed_ratios=allowed_ratios, + default_ratio=default_ratio, + ) + + +async def get_image_generation_options( + db: AsyncSession, +) -> ImageGenerationOptionsRead: + """返回当前默认图片模型对应的关键帧比例/像素规格选项。""" + settings = await get_or_create_settings(db) + model_id = settings.default_image_model_id + if not model_id: + return ImageGenerationOptionsRead( + provider="", + model_id="", + model_name="", + supported_ratios=sorted(DEFAULT_VIDEO_REFERENCE_RATIO_SIZE_MAP.keys()), + default_resolution_profile="standard", + ratio_size_profiles=DEFAULT_VIDEO_REFERENCE_RATIO_SIZE_MAP, + ) + + model = await get_or_404(db, Model, model_id, detail=entity_not_found("Model")) + provider = await get_or_404(db, Provider, model.provider_id, detail=entity_not_found("Provider")) + provider_key = resolve_provider_key_from_name(provider.name) + capability = resolve_image_capability(provider=provider_key, model=model.name) + ratio_size_profiles = capability.ratio_size_profiles or DEFAULT_VIDEO_REFERENCE_RATIO_SIZE_MAP + supported_ratios = sorted(capability.supported_ratios or ratio_size_profiles.keys()) + + return ImageGenerationOptionsRead( + provider=provider_key, + model_id=model.id, + model_name=model.name, + supported_ratios=supported_ratios, + default_resolution_profile=capability.default_resolution_profile or "standard", + ratio_size_profiles=ratio_size_profiles, + ) + + def list_supported_providers(*, category: ModelCategoryKey | None) -> list[ProviderSupportedRead]: # 防御性初始化:保证在非应用生命周期上下文(如单测)下也可返回内置清单。 bootstrap_all_registries() diff --git a/backend/app/services/studio/generation/video/build_base.py b/backend/app/services/studio/generation/video/build_base.py index 3573d39..9cd83c2 100644 --- a/backend/app/services/studio/generation/video/build_base.py +++ b/backend/app/services/studio/generation/video/build_base.py @@ -9,18 +9,14 @@ class VideoBaseDraft(GenerationBaseDraft): kind: str = "video" shot_id: str prompt: str - size: str | None = None def build_video_base_draft( *, shot_id: str, prompt: str | None, - size: str | None = None, ) -> VideoBaseDraft: return VideoBaseDraft( shot_id=shot_id, prompt=(prompt or "").strip(), - size=(size or "").strip() or None, ) - diff --git a/backend/app/services/studio/image_task_runner.py b/backend/app/services/studio/image_task_runner.py index aab1c17..9b1b784 100644 --- a/backend/app/services/studio/image_task_runner.py +++ b/backend/app/services/studio/image_task_runner.py @@ -246,6 +246,9 @@ async def create_image_task_and_link( relation_entity_id: str, prompt: str, images: list[dict[str, str]] | None = None, + target_ratio: str | None = None, + resolution_profile: str | None = None, + purpose: str = "generic", render_context: dict | None = None, ) -> str: """创建图片生成任务,并建立任务关联。""" @@ -264,6 +267,9 @@ async def create_image_task_and_link( "input": { "prompt": prompt, "model": model.name, + "target_ratio": target_ratio, + "resolution_profile": resolution_profile, + "purpose": purpose, }, } if images: diff --git a/backend/sql/007-add-video-size-ratio-defaults-and-overrides.sql b/backend/sql/007-add-video-size-ratio-defaults-and-overrides.sql index 9301044..e0570ee 100644 --- a/backend/sql/007-add-video-size-ratio-defaults-and-overrides.sql +++ b/backend/sql/007-add-video-size-ratio-defaults-and-overrides.sql @@ -1,20 +1,3 @@ -SET @has_projects_default_video_size = ( - SELECT COUNT(*) - FROM information_schema.COLUMNS - WHERE TABLE_SCHEMA = DATABASE() - AND TABLE_NAME = 'projects' - AND COLUMN_NAME = 'default_video_size' -); - -SET @add_projects_default_video_size = IF( - @has_projects_default_video_size = 0, - "ALTER TABLE projects ADD COLUMN default_video_size VARCHAR(32) NULL COMMENT '项目级默认视频尺寸(可为空;分镜未覆盖时使用)'", - 'SELECT 1' -); -PREPARE stmt_add_projects_default_video_size FROM @add_projects_default_video_size; -EXECUTE stmt_add_projects_default_video_size; -DEALLOCATE PREPARE stmt_add_projects_default_video_size; - SET @has_projects_default_video_ratio = ( SELECT COUNT(*) FROM information_schema.COLUMNS @@ -32,23 +15,6 @@ PREPARE stmt_add_projects_default_video_ratio FROM @add_projects_default_video_r EXECUTE stmt_add_projects_default_video_ratio; DEALLOCATE PREPARE stmt_add_projects_default_video_ratio; -SET @has_shot_details_override_video_size = ( - SELECT COUNT(*) - FROM information_schema.COLUMNS - WHERE TABLE_SCHEMA = DATABASE() - AND TABLE_NAME = 'shot_details' - AND COLUMN_NAME = 'override_video_size' -); - -SET @add_shot_details_override_video_size = IF( - @has_shot_details_override_video_size = 0, - "ALTER TABLE shot_details ADD COLUMN override_video_size VARCHAR(32) NULL COMMENT '分镜级视频尺寸覆盖(为空表示继承项目默认)'", - 'SELECT 1' -); -PREPARE stmt_add_shot_details_override_video_size FROM @add_shot_details_override_video_size; -EXECUTE stmt_add_shot_details_override_video_size; -DEALLOCATE PREPARE stmt_add_shot_details_override_video_size; - SET @has_shot_details_override_video_ratio = ( SELECT COUNT(*) FROM information_schema.COLUMNS diff --git a/backend/tests/core/integrations/test_image_adapters.py b/backend/tests/core/integrations/test_image_adapters.py index 46ad4e1..395b780 100644 --- a/backend/tests/core/integrations/test_image_adapters.py +++ b/backend/tests/core/integrations/test_image_adapters.py @@ -78,6 +78,40 @@ async def test_openai_image_adapter_edits_when_references(monkeypatch: pytest.Mo assert result.images[0].b64_json == "abc" +@pytest.mark.asyncio +async def test_openai_image_adapter_resolves_video_reference_size(monkeypatch: pytest.MonkeyPatch) -> None: + captured: dict[str, str] = {} + + def handler(request: httpx.Request) -> httpx.Response: + captured["body"] = request.content.decode() + return httpx.Response(200, json={"data": [{"url": "https://cdn.example.com/ref.png"}]}) + + _patch_httpx_client(monkeypatch, httpx.MockTransport(handler)) + clear_image_model_capability_overrides(provider="openai") + register_image_model_capability( + provider="openai", + model_prefix="gpt-image-video-ref", + capability=ImageModelCapability( + supported_ratios={"16:9"}, + ratio_size_profiles={"16:9": {"standard": "1792x1024"}}, + ), + ) + cfg = ProviderConfig(provider="openai", api_key="sk-test", base_url="https://api.openai.com/v1") + inp = ImageGenerationInput( + prompt="video ref", + model="gpt-image-video-ref-1", + target_ratio="16:9", + resolution_profile="standard", + purpose="video_reference", + ) + try: + await OpenAIImageApiAdapter().generate(cfg=cfg, inp=inp, timeout_s=30.0) + body = json.loads(captured["body"]) + assert body["size"] == "1792x1024" + finally: + clear_image_model_capability_overrides(provider="openai") + + @pytest.mark.asyncio async def test_volcengine_image_adapter_generations(monkeypatch: pytest.MonkeyPatch) -> None: def handler(request: httpx.Request) -> httpx.Response: @@ -86,6 +120,7 @@ async def test_volcengine_image_adapter_generations(monkeypatch: pytest.MonkeyPa assert payload["prompt"] == "火山" assert payload["n"] == 1 assert payload["watermark"] is True + assert payload["size"] == "1600x2848" return httpx.Response( 200, json={ @@ -97,7 +132,15 @@ async def test_volcengine_image_adapter_generations(monkeypatch: pytest.MonkeyPa _patch_httpx_client(monkeypatch, httpx.MockTransport(handler)) cfg = ProviderConfig(provider="volcengine", api_key="ak-test") - inp = ImageGenerationInput(prompt="火山", n=1, seed=42, watermark=True) + inp = ImageGenerationInput( + prompt="火山", + n=1, + seed=42, + watermark=True, + target_ratio="9:16", + resolution_profile="standard", + purpose="video_reference", + ) result = await VolcengineImageApiAdapter().generate(cfg=cfg, inp=inp, timeout_s=30.0) assert result.provider == "volcengine" assert result.provider_task_id == "task-xyz" diff --git a/backend/tests/core/integrations/test_image_capabilities.py b/backend/tests/core/integrations/test_image_capabilities.py index e3f5391..25165b8 100644 --- a/backend/tests/core/integrations/test_image_capabilities.py +++ b/backend/tests/core/integrations/test_image_capabilities.py @@ -10,6 +10,7 @@ from app.core.integrations.image_capabilities import ( clear_image_model_capability_overrides, register_image_model_capability, resolve_image_capability, + resolve_image_size, validate_image_options, ) @@ -48,3 +49,48 @@ def test_validate_image_options_rejects_capability_mismatch() -> None: assert "watermark is not supported" in str(exc_info.value) finally: clear_image_model_capability_overrides(provider="volcengine") + + +def test_resolve_image_size_uses_video_reference_ratio_profile() -> None: + clear_image_model_capability_overrides(provider="openai") + register_image_model_capability( + provider="openai", + model_prefix="gpt-image-video-ref", + capability=ImageModelCapability( + supported_ratios={"16:9"}, + ratio_size_profiles={"16:9": {"standard": "1792x1024"}}, + ), + ) + try: + size = resolve_image_size( + provider="openai", + model="gpt-image-video-ref-1", + purpose="video_reference", + target_ratio="16:9", + resolution_profile="standard", + requested_size=None, + ) + assert size == "1792x1024" + finally: + clear_image_model_capability_overrides(provider="openai") + + +def test_resolve_image_size_uses_volcengine_builtin_2k_3k_profiles() -> None: + size_2k = resolve_image_size( + provider="volcengine", + model="seedream-v3", + purpose="video_reference", + target_ratio="9:16", + resolution_profile="standard", + requested_size=None, + ) + size_3k = resolve_image_size( + provider="volcengine", + model="seedream-v3", + purpose="video_reference", + target_ratio="21:9", + resolution_profile="high", + requested_size=None, + ) + assert size_2k == "1600x2848" + assert size_3k == "4704x2016" diff --git a/backend/tests/core/integrations/test_video_adapters.py b/backend/tests/core/integrations/test_video_adapters.py index 4edbbc9..29c3a39 100644 --- a/backend/tests/core/integrations/test_video_adapters.py +++ b/backend/tests/core/integrations/test_video_adapters.py @@ -77,7 +77,7 @@ async def test_volcengine_video_create_and_get(monkeypatch: pytest.MonkeyPatch) _patch_httpx_client(monkeypatch, httpx.MockTransport(handler)) cfg = ProviderConfig(provider="volcengine", api_key="ak-test") - inp = VideoGenerationInput(prompt="舞", size="720x1280", seconds=8, seed=7, watermark=True) + inp = VideoGenerationInput(prompt="舞", ratio="9:16", seconds=8, seed=7, watermark=True) tid = await VolcengineVideoApiAdapter().create_contents_task(cfg=cfg, input_=inp, timeout_s=30.0) assert tid == "t-1" meta = await VolcengineVideoApiAdapter().get_contents_task(cfg=cfg, task_id=tid, timeout_s=30.0) @@ -86,20 +86,7 @@ async def test_volcengine_video_create_and_get(monkeypatch: pytest.MonkeyPatch) def test_video_input_seed_bounds_validation() -> None: - VideoGenerationInput(prompt="ok", seed=-1) - VideoGenerationInput(prompt="ok", seed=4294967295) + VideoGenerationInput(prompt="ok", ratio="16:9", seed=-1) + VideoGenerationInput(prompt="ok", ratio="16:9", seed=4294967295) with pytest.raises(ValidationError): - VideoGenerationInput(prompt="bad", seed=4294967296) - - -@pytest.mark.asyncio -async def test_openai_video_create_rejects_ratio_size_conflict(monkeypatch: pytest.MonkeyPatch) -> None: - def handler(_request: httpx.Request) -> httpx.Response: - return httpx.Response(500) - - _patch_httpx_client(monkeypatch, httpx.MockTransport(handler)) - cfg = ProviderConfig(provider="openai", api_key="sk-test") - inp = VideoGenerationInput(prompt="a cat", ratio="16:9", size="720x1280") - with pytest.raises(ValueError) as exc_info: - await OpenAIVideoApiAdapter().create_video(cfg=cfg, input_=inp, timeout_s=30.0) - assert "ratio conflicts with size" in str(exc_info.value) + VideoGenerationInput(prompt="bad", ratio="16:9", seed=4294967296) diff --git a/backend/tests/test_generated_video_api_responses.py b/backend/tests/test_generated_video_api_responses.py index a660055..74cd76b 100644 --- a/backend/tests/test_generated_video_api_responses.py +++ b/backend/tests/test_generated_video_api_responses.py @@ -65,7 +65,7 @@ def test_preview_video_generation_prompt_returns_success_envelope(client: TestCl "reference_mode": "first_last", "prompt": "生成一个压迫感强的镜头", "images": [], - "size": "720x1280", + "ratio": "9:16", }, ) finally: @@ -97,6 +97,7 @@ def test_preview_video_generation_prompt_not_found_returns_api_response( "reference_mode": "text_only", "prompt": "仅文本生成", "images": [], + "ratio": "16:9", }, ) finally: @@ -125,7 +126,7 @@ def test_create_video_generation_task_returns_created_envelope(client: TestClien "reference_mode": "first", "prompt": "生成一个节奏紧张的视频片段", "images": [], - "size": "720x1280", + "ratio": "9:16", }, ) finally: @@ -152,6 +153,7 @@ def test_create_video_generation_task_validation_error_returns_api_response(clie "reference_mode": "invalid-mode", "prompt": "bad", "images": [], + "ratio": "16:9", }, ) finally: diff --git a/backend/tests/test_generated_video_service.py b/backend/tests/test_generated_video_service.py index 2037dc1..df5705e 100644 --- a/backend/tests/test_generated_video_service.py +++ b/backend/tests/test_generated_video_service.py @@ -172,8 +172,7 @@ async def test_build_run_args_maps_reference_images(monkeypatch: pytest.MonkeyPa reference_mode="first_last", prompt="最终视频提示词", images=["img-first", "img-last"], - size="720x1280", - ratio=None, + ratio="9:16", ) assert run_args["provider"] == "openai" @@ -182,6 +181,7 @@ async def test_build_run_args_maps_reference_images(monkeypatch: pytest.MonkeyPa assert run_args["input"]["first_frame_base64"] == "data:image/png;base64,img-first" assert run_args["input"]["last_frame_base64"] == "data:image/png;base64,img-last" assert run_args["input"]["key_frame_base64"] is None + assert run_args["input"]["ratio"] == "9:16" assert run_args["input"]["seconds"] == 6 await engine.dispose() @@ -211,11 +211,11 @@ async def test_build_run_args_uses_prompt_pack_when_prompt_missing(monkeypatch: reference_mode="text_only", prompt=None, images=[], - size=None, - ratio=None, + ratio="16:9", ) assert "镜头标题:镜头一" in run_args["input"]["prompt"] + assert run_args["input"]["ratio"] == "16:9" assert run_args["prompt_preview"]["shot_id"] == "s1" await engine.dispose() @@ -244,8 +244,7 @@ async def test_build_run_args_rejects_disabled_provider() -> None: reference_mode="text_only", prompt="最终视频提示词", images=[], - size=None, - ratio=None, + ratio="16:9", ) assert exc_info.value.status_code == 503 @@ -299,18 +298,10 @@ async def test_shot_video_readiness_reports_missing_reference_frame() -> None: @pytest.mark.asyncio -async def test_build_run_args_prefers_shot_override_over_project_default(monkeypatch: pytest.MonkeyPatch) -> None: +async def test_build_run_args_uses_request_ratio_as_final_value(monkeypatch: pytest.MonkeyPatch) -> None: db, engine = await _build_session() async with db: await _seed_shot_graph(db) - project = await db.get(Project, "p1") - assert project is not None - project.default_video_size = "1024x576" - project.default_video_ratio = "16:9" - detail = await db.get(ShotDetail, "s1") - assert detail is not None - detail.override_video_size = "720x1280" - detail.override_video_ratio = "9:16" provider = Provider(id="p1", name="OpenAI", base_url="https://api.openai.com/v1", api_key="k") model = Model(id="m_video", name="sora-mini", category=ModelCategoryKey.video, provider_id="p1") settings = ModelSettings(id=1, default_video_model_id="m_video") @@ -331,97 +322,15 @@ async def test_build_run_args_prefers_shot_override_over_project_default(monkeyp reference_mode="text_only", prompt="最终视频提示词", images=[], - size=None, - ratio=None, + ratio="9:16", ) - assert run_args["input"]["size"] == "720x1280" assert run_args["input"]["ratio"] == "9:16" await engine.dispose() @pytest.mark.asyncio -async def test_build_run_args_uses_project_default_when_shot_override_missing(monkeypatch: pytest.MonkeyPatch) -> None: - db, engine = await _build_session() - async with db: - await _seed_shot_graph(db) - project = await db.get(Project, "p1") - assert project is not None - project.default_video_size = "1280x720" - project.default_video_ratio = "16:9" - provider = Provider(id="p1", name="OpenAI", base_url="https://api.openai.com/v1", api_key="k") - model = Model(id="m_video", name="sora-mini", category=ModelCategoryKey.video, provider_id="p1") - settings = ModelSettings(id=1, default_video_model_id="m_video") - db.add_all([provider, model, settings]) - await db.commit() - - async def _fake_file_id_to_data_url(_db: AsyncSession, *, file_id: str) -> str: - return f"data:image/png;base64,{file_id}" - - monkeypatch.setattr( - "app.services.film.generated_video.file_id_to_data_url", - _fake_file_id_to_data_url, - ) - - run_args = await build_run_args( - db, - shot_id="s1", - reference_mode="text_only", - prompt="最终视频提示词", - images=[], - size=None, - ratio=None, - ) - - assert run_args["input"]["size"] == "1280x720" - assert run_args["input"]["ratio"] == "16:9" - await engine.dispose() - - -@pytest.mark.asyncio -async def test_build_run_args_prefers_request_params_over_inherited(monkeypatch: pytest.MonkeyPatch) -> None: - db, engine = await _build_session() - async with db: - await _seed_shot_graph(db) - project = await db.get(Project, "p1") - assert project is not None - project.default_video_size = "1280x720" - project.default_video_ratio = "16:9" - detail = await db.get(ShotDetail, "s1") - assert detail is not None - detail.override_video_size = "720x1280" - detail.override_video_ratio = "9:16" - provider = Provider(id="p1", name="OpenAI", base_url="https://api.openai.com/v1", api_key="k") - model = Model(id="m_video", name="sora-mini", category=ModelCategoryKey.video, provider_id="p1") - settings = ModelSettings(id=1, default_video_model_id="m_video") - db.add_all([provider, model, settings]) - await db.commit() - - async def _fake_file_id_to_data_url(_db: AsyncSession, *, file_id: str) -> str: - return f"data:image/png;base64,{file_id}" - - monkeypatch.setattr( - "app.services.film.generated_video.file_id_to_data_url", - _fake_file_id_to_data_url, - ) - - run_args = await build_run_args( - db, - shot_id="s1", - reference_mode="text_only", - prompt="最终视频提示词", - images=[], - size="1920x1080", - ratio="16:9", - ) - - assert run_args["input"]["size"] == "1920x1080" - assert run_args["input"]["ratio"] == "16:9" - await engine.dispose() - - -@pytest.mark.asyncio -async def test_build_run_args_rejects_conflicting_size_and_ratio(monkeypatch: pytest.MonkeyPatch) -> None: +async def test_build_run_args_rejects_missing_ratio(monkeypatch: pytest.MonkeyPatch) -> None: db, engine = await _build_session() async with db: await _seed_shot_graph(db) @@ -446,9 +355,76 @@ async def test_build_run_args_rejects_conflicting_size_and_ratio(monkeypatch: py reference_mode="text_only", prompt="最终视频提示词", images=[], - size="1920x1080", - ratio="9:16", + ratio=None, ) + assert exc_info.value.status_code == 400 - assert "ratio conflicts with size" in str(exc_info.value.detail) + assert exc_info.value.detail == "ratio is required" + await engine.dispose() + + +@pytest.mark.asyncio +async def test_build_run_args_does_not_read_shot_override_ratio(monkeypatch: pytest.MonkeyPatch) -> None: + db, engine = await _build_session() + async with db: + await _seed_shot_graph(db) + detail = await db.get(ShotDetail, "s1") + assert detail is not None + detail.override_video_ratio = "9:16" + provider = Provider(id="p1", name="OpenAI", base_url="https://api.openai.com/v1", api_key="k") + model = Model(id="m_video", name="sora-mini", category=ModelCategoryKey.video, provider_id="p1") + settings = ModelSettings(id=1, default_video_model_id="m_video") + db.add_all([provider, model, settings]) + await db.commit() + + async def _fake_file_id_to_data_url(_db: AsyncSession, *, file_id: str) -> str: + return f"data:image/png;base64,{file_id}" + + monkeypatch.setattr( + "app.services.film.generated_video.file_id_to_data_url", + _fake_file_id_to_data_url, + ) + + run_args = await build_run_args( + db, + shot_id="s1", + reference_mode="text_only", + prompt="最终视频提示词", + images=[], + ratio="16:9", + ) + + assert run_args["input"]["ratio"] == "16:9" + await engine.dispose() + + +@pytest.mark.asyncio +async def test_build_run_args_accepts_supported_ratio_without_size(monkeypatch: pytest.MonkeyPatch) -> None: + db, engine = await _build_session() + async with db: + await _seed_shot_graph(db) + provider = Provider(id="p1", name="OpenAI", base_url="https://api.openai.com/v1", api_key="k") + model = Model(id="m_video", name="sora-mini", category=ModelCategoryKey.video, provider_id="p1") + settings = ModelSettings(id=1, default_video_model_id="m_video") + db.add_all([provider, model, settings]) + await db.commit() + + async def _fake_file_id_to_data_url(_db: AsyncSession, *, file_id: str) -> str: + return f"data:image/png;base64,{file_id}" + + monkeypatch.setattr( + "app.services.film.generated_video.file_id_to_data_url", + _fake_file_id_to_data_url, + ) + + run_args = await build_run_args( + db, + shot_id="s1", + reference_mode="text_only", + prompt="最终视频提示词", + images=[], + ratio="9:16", + ) + + assert run_args["input"]["ratio"] == "9:16" await engine.dispose() diff --git a/backend/tests/test_image_tasks_api_responses.py b/backend/tests/test_image_tasks_api_responses.py index 006c9bb..baac944 100644 --- a/backend/tests/test_image_tasks_api_responses.py +++ b/backend/tests/test_image_tasks_api_responses.py @@ -109,7 +109,7 @@ def test_create_shot_frame_image_task_requires_prompt(client: TestClient) -> Non try: response = client.post( "/api/v1/studio/image-tasks/shot/shot-1/frame-image-tasks", - json={"frame_type": "first", "prompt": " ", "images": []}, + json={"frame_type": "first", "prompt": " ", "target_ratio": "16:9", "images": []}, ) finally: app.dependency_overrides.clear() @@ -190,6 +190,9 @@ def test_create_shot_frame_image_task_renders_prompt_before_submit(client: TestC assert kwargs["prompt"].startswith("## 图片内容说明") assert "图1: 陆远" in kwargs["prompt"] assert kwargs["images"] == [{"image_url": "data:image/png;base64,abc"}] + assert kwargs["target_ratio"] == "9:16" + assert kwargs["resolution_profile"] == "standard" + assert kwargs["purpose"] == "video_reference" assert kwargs["render_context"]["images"] == ["file-1"] assert kwargs["render_context"]["mappings"][0]["token"] == "图1" return "task-1" @@ -203,6 +206,8 @@ def test_create_shot_frame_image_task_renders_prompt_before_submit(client: TestC json={ "frame_type": "first", "prompt": "陆远站在温室里", + "target_ratio": "9:16", + "resolution_profile": "standard", "images": [ {"type": "character", "id": "char-1", "name": "陆远", "file_id": "file-1"}, ], diff --git a/backend/tests/test_llm_api_responses.py b/backend/tests/test_llm_api_responses.py index d594718..395c703 100644 --- a/backend/tests/test_llm_api_responses.py +++ b/backend/tests/test_llm_api_responses.py @@ -1,4 +1,4 @@ -"""LLM 接口响应壳测试:聚焦 Provider CRUD。""" +"""LLM 接口响应壳测试:聚焦 Provider CRUD 与生成能力选项。""" from __future__ import annotations @@ -9,7 +9,7 @@ import pytest from fastapi.testclient import TestClient from app.dependencies import get_db -from app.models.llm import Provider, ProviderStatus +from app.models.llm import Model, ModelCategoryKey, ModelSettings, Provider, ProviderStatus from tests.support.llm_api_app import build_llm_only_app # 仅挂载 /api/v1/llm,避免导入 app.main 时连带加载 film 路由与 Celery。 @@ -27,14 +27,29 @@ class _FakeLlmDB: def __init__(self) -> None: self.providers: dict[str, Provider] = {} + self.models: dict[str, Model] = {} + self.model_settings: dict[int, ModelSettings] = {} async def get(self, model: type, entity_id: str) -> Provider | None: # noqa: ANN401 - if model is not Provider: - return None - return self.providers.get(entity_id) + if model is Provider: + return self.providers.get(entity_id) + if model is Model: + return self.models.get(entity_id) + if model is ModelSettings: + return self.model_settings.get(int(entity_id)) + return None - def add(self, obj: Provider) -> None: - self.providers[obj.id] = obj + def add(self, obj: Provider | Model | ModelSettings) -> None: + if isinstance(obj, Provider): + self.providers[obj.id] = obj + return + if isinstance(obj, Model): + self.models[obj.id] = obj + return + if isinstance(obj, ModelSettings): + self.model_settings[obj.id] = obj + return + raise TypeError(f"Unsupported object type: {type(obj)!r}") async def flush(self) -> None: return None @@ -67,6 +82,30 @@ def _seed_provider(db: _FakeLlmDB, provider_id: str = "p-1") -> Provider: return obj +def _seed_video_model(db: _FakeLlmDB, *, provider_id: str = "p-video", model_id: str = "m-video") -> None: + provider = _seed_provider(db, provider_id) + provider.name = "OpenAI" + db.models[model_id] = Model( + id=model_id, + name="sora-mini", + category=ModelCategoryKey.video, + provider_id=provider.id, + ) + db.model_settings[1] = ModelSettings(id=1, default_video_model_id=model_id) + + +def _seed_image_model(db: _FakeLlmDB, *, provider_id: str = "p-image", model_id: str = "m-image") -> None: + provider = _seed_provider(db, provider_id) + provider.name = "火山引擎" + db.models[model_id] = Model( + id=model_id, + name="seedream-4.0", + category=ModelCategoryKey.image, + provider_id=provider.id, + ) + db.model_settings[1] = ModelSettings(id=1, default_image_model_id=model_id) + + def _override_db(db: _FakeLlmDB): async def _get_db() -> AsyncGenerator[_FakeLlmDB, None]: yield db @@ -185,3 +224,42 @@ def test_list_supported_providers_can_filter_by_category(client: TestClient) -> assert isinstance(body["data"], list) for item in body["data"]: assert "video" in item["supported_categories"] + + +def test_get_video_generation_options_returns_ratio_capability(client: TestClient) -> None: + db = _FakeLlmDB() + _seed_video_model(db) + llm_app.dependency_overrides[get_db] = _override_db(db) + try: + response = client.get("/api/v1/llm/video-generation-options") + finally: + llm_app.dependency_overrides.clear() + + assert response.status_code == 200 + body = response.json() + assert body["code"] == 200 + assert body["data"]["provider"] == "openai" + assert body["data"]["model_id"] == "m-video" + assert body["data"]["model_name"] == "sora-mini" + assert "16:9" in body["data"]["allowed_ratios"] + assert body["data"]["default_ratio"] == "16:9" + + +def test_get_image_generation_options_returns_ratio_size_profiles(client: TestClient) -> None: + db = _FakeLlmDB() + _seed_image_model(db) + llm_app.dependency_overrides[get_db] = _override_db(db) + try: + response = client.get("/api/v1/llm/image-generation-options") + finally: + llm_app.dependency_overrides.clear() + + assert response.status_code == 200 + body = response.json() + assert body["code"] == 200 + assert body["data"]["provider"] == "volcengine" + assert body["data"]["model_id"] == "m-image" + assert body["data"]["model_name"] == "seedream-4.0" + assert body["data"]["default_resolution_profile"] == "standard" + assert body["data"]["ratio_size_profiles"]["16:9"]["standard"] == "2848x1600" + assert body["data"]["ratio_size_profiles"]["16:9"]["high"] == "4096x2304" diff --git a/backend/tests/test_llm_manage.py b/backend/tests/test_llm_manage.py index 259485c..5d02eda 100644 --- a/backend/tests/test_llm_manage.py +++ b/backend/tests/test_llm_manage.py @@ -11,6 +11,7 @@ from app.schemas.llm import ModelCreate, ModelSettingsUpdate, ModelUpdate, Provi from app.services.llm.manage import ( create_model, create_provider, + get_image_generation_options, get_or_create_settings, list_models_paginated, update_model, @@ -211,3 +212,40 @@ async def test_update_model_rejects_switch_to_unsupported_provider_category_comb assert exc_info.value.status_code == 400 assert "does not support category=video" in str(exc_info.value.detail) await engine.dispose() + + +@pytest.mark.asyncio +async def test_get_image_generation_options_uses_default_image_model_capability() -> None: + db, engine = await _build_session() + async with db: + await create_provider( + db, + body=ProviderCreate( + id="p-volc", + name="火山引擎", + base_url="https://ark.cn-beijing.volces.com/api/v3", + api_key="k", + ), + ) + await create_model( + db, + body=ModelCreate( + id="m-image-default", + name="seedream-4.0", + category=ModelCategoryKey.image, + provider_id="p-volc", + ), + ) + await update_model_settings( + db, + body=ModelSettingsUpdate(default_image_model_id="m-image-default"), + ) + + options = await get_image_generation_options(db) + + assert options.provider == "volcengine" + assert options.model_id == "m-image-default" + assert options.default_resolution_profile == "standard" + assert options.ratio_size_profiles["9:16"]["standard"] == "1600x2848" + assert options.ratio_size_profiles["21:9"]["high"] == "4704x2016" + await engine.dispose() diff --git a/backend/tests/test_studio_api_responses.py b/backend/tests/test_studio_api_responses.py index 5a2fbb8..58c41f9 100644 --- a/backend/tests/test_studio_api_responses.py +++ b/backend/tests/test_studio_api_responses.py @@ -70,6 +70,13 @@ class _FakeStudioDB: return raise TypeError(f"Unsupported object type: {type(obj)!r}") + async def execute(self, _stmt): # noqa: ANN001 + class _EmptyResult: + def all(self) -> list[tuple]: + return [] + + return _EmptyResult() + def _override_db(db: _FakeStudioDB): async def _get_db() -> AsyncGenerator[_FakeStudioDB, None]: @@ -181,9 +188,8 @@ def test_project_style_options_returns_grouped_choices(client: TestClient) -> No assert "视觉" in body["data"]["visual_styles"][0]["label"] or body["data"]["visual_styles"][0]["value"] in {"现实", "动漫"} assert "现实" in body["data"]["styles_by_visual_style"] assert "动漫" in body["data"]["styles_by_visual_style"] - assert "16:9" in [item["value"] for item in body["data"]["video_ratios"]] - assert body["data"]["default_video_ratio"] == "16:9" - assert body["data"]["default_video_size"] == "1920x1080" + assert "video_ratios" not in body["data"] + assert "default_video_ratio" not in body["data"] def test_create_project_rejects_invalid_style_combo(client: TestClient) -> None: diff --git a/front/openapi.json b/front/openapi.json index 138b3dc..aed1462 100644 --- a/front/openapi.json +++ b/front/openapi.json @@ -1 +1 @@ -{"openapi":"3.1.0","info":{"title":"Jellyfish API","version":"0.1.0"},"paths":{"/api/v1/health":{"get":{"tags":["health"],"summary":"V1 Health","operationId":"v1_health_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_dict_"}}}}}}},"/api/v1/film/tasks/video/preview-prompt":{"post":{"tags":["film"],"summary":"视频提示词预览","description":"预览视频生成的提示词与自动关联参考图。","operationId":"preview_video_generation_prompt_api_v1_film_tasks_video_preview_prompt_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoGenerationTaskRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_VideoPromptPreviewResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/film/tasks/video":{"post":{"tags":["film"],"summary":"视频生成(任务版)","description":"创建视频生成任务并后台执行,结果通过 /tasks/{task_id}/result 获取。","operationId":"create_video_generation_task_api_v1_film_tasks_video_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoGenerationTaskRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskCreated_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/film/tasks/shot-frame-prompts":{"post":{"tags":["film"],"summary":"镜头分镜帧提示词生成(任务版)","operationId":"create_shot_frame_prompt_task_api_v1_film_tasks_shot_frame_prompts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotFramePromptRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskCreated_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/film/tasks":{"get":{"tags":["film"],"summary":"全局任务列表(任务中心)","operationId":"list_tasks_api_v1_film_tasks_get","parameters":[{"name":"statuses","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/TaskStatus"}},{"type":"null"}],"description":"按任务状态过滤,可多选","title":"Statuses"},"description":"按任务状态过滤,可多选"},{"name":"task_kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按 task_kind 过滤","title":"Task Kind"},"description":"按 task_kind 过滤"},{"name":"relation_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按 relation_type 过滤","title":"Relation Type"},"description":"按 relation_type 过滤"},{"name":"relation_entity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按 relation_entity_id 过滤","title":"Relation Entity Id"},"description":"按 relation_entity_id 过滤"},{"name":"recent_seconds","in":"query","required":false,"schema":{"type":"integer","maximum":86400,"minimum":0,"description":"默认返回最近结束任务的时间窗口(秒)","default":300,"title":"Recent Seconds"},"description":"默认返回最近结束任务的时间窗口(秒)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"页码","default":1,"title":"Page"},"description":"页码"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"每页条数","default":20,"title":"Page Size"},"description":"每页条数"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_TaskListItemRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/film/tasks/{task_id}/status":{"get":{"tags":["film"],"summary":"查询任务状态/进度(轮询)","operationId":"get_task_status_api_v1_film_tasks__task_id__status_get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskStatusRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/film/tasks/{task_id}/result":{"get":{"tags":["film"],"summary":"获取任务结果","operationId":"get_task_result_api_v1_film_tasks__task_id__result_get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskResultRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/film/tasks/{task_id}/cancel":{"post":{"tags":["film"],"summary":"请求取消任务","operationId":"cancel_task_api_v1_film_tasks__task_id__cancel_post","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskCancelRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskCancelRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/film/task-links/adopt":{"patch":{"tags":["film"],"summary":"更新任务关联的采用状态(仅可正向变更)","description":"将指定任务链接的状态设为 accepted;已采用不可改为未采用。","operationId":"adopt_task_link_api_v1_film_task_links_adopt_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskLinkAdoptRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskLinkAdoptRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/film/task-links":{"get":{"tags":["film"],"summary":"生成任务关联列表(分页,支持多条件过滤)","operationId":"list_task_links_api_v1_film_task_links_get","parameters":[{"name":"resource_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按 resource_type 过滤","title":"Resource Type"},"description":"按 resource_type 过滤"},{"name":"relation_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按 relation_type 过滤","title":"Relation Type"},"description":"按 relation_type 过滤"},{"name":"relation_entity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按 relation_entity_id 过滤","title":"Relation Entity Id"},"description":"按 relation_entity_id 过滤"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按关联状态过滤(accepted/todo/rejected)","title":"Status"},"description":"按关联状态过滤(accepted/todo/rejected)"},{"name":"task_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按 task_id 过滤","title":"Task Id"},"description":"按 task_id 过滤"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"排序字段:updated_at/created_at/id/status","title":"Order"},"description":"排序字段:updated_at/created_at/id/status"},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","description":"是否倒序;默认 true","default":true,"title":"Is Desc"},"description":"是否倒序;默认 true"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"页码","default":1,"title":"Page"},"description":"页码"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"每页条数","default":10,"title":"Page Size"},"description":"每页条数"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_GenerationTaskLinkRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["film"],"summary":"创建生成任务关联","operationId":"create_task_link_api_v1_film_task_links_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationTaskLinkCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_GenerationTaskLinkRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/film/task-links/{link_id}":{"get":{"tags":["film"],"summary":"获取生成任务关联详情","operationId":"get_task_link_api_v1_film_task_links__link_id__get","parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_GenerationTaskLinkRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["film"],"summary":"更新生成任务关联(不支持直接修改 is_adopted)","operationId":"update_task_link_api_v1_film_task_links__link_id__patch","parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","title":"Link Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationTaskLinkUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_GenerationTaskLinkRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["film"],"summary":"删除生成任务关联","operationId":"delete_task_link_api_v1_film_task_links__link_id__delete","parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/llm/providers":{"get":{"tags":["llm"],"summary":"列出模型供应商(分页)","operationId":"list_providers_api_v1_llm_providers_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键字,过滤 name/description","title":"Q"},"description":"关键字,过滤 name/description"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"排序字段:name, created_at, updated_at","title":"Order"},"description":"排序字段:name, created_at, updated_at"},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","description":"是否倒序","default":false,"title":"Is Desc"},"description":"是否倒序"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"页码","default":1,"title":"Page"},"description":"页码"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"每页条数","default":10,"title":"Page Size"},"description":"每页条数"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_ProviderRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["llm"],"summary":"创建模型供应商","operationId":"create_provider_api_v1_llm_providers_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProviderRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/llm/providers/supported":{"get":{"tags":["llm"],"summary":"列出系统支持的供应商能力","operationId":"list_supported_providers_api_v1_llm_providers_supported_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ModelCategoryKey"},{"type":"null"}],"description":"按模型类别过滤:text/image/video","title":"Category"},"description":"按模型类别过滤:text/image/video"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_list_ProviderSupportedRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/llm/providers/{provider_id}":{"get":{"tags":["llm"],"summary":"获取单个模型供应商","operationId":"get_provider_api_v1_llm_providers__provider_id__get","parameters":[{"name":"provider_id","in":"path","required":true,"schema":{"type":"string","title":"Provider Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProviderRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["llm"],"summary":"更新模型供应商","operationId":"update_provider_api_v1_llm_providers__provider_id__patch","parameters":[{"name":"provider_id","in":"path","required":true,"schema":{"type":"string","title":"Provider Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProviderRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["llm"],"summary":"删除模型供应商","operationId":"delete_provider_api_v1_llm_providers__provider_id__delete","parameters":[{"name":"provider_id","in":"path","required":true,"schema":{"type":"string","title":"Provider Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/llm/models":{"get":{"tags":["llm"],"summary":"列出模型(分页)","operationId":"list_models_api_v1_llm_models_get","parameters":[{"name":"provider_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按供应商过滤","title":"Provider Id"},"description":"按供应商过滤"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ModelCategoryKey"},{"type":"null"}],"description":"按模型类别过滤","title":"Category"},"description":"按模型类别过滤"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键字,过滤 name/description","title":"Q"},"description":"关键字,过滤 name/description"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"排序字段:name, category, created_at, updated_at","title":"Order"},"description":"排序字段:name, category, created_at, updated_at"},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","description":"是否倒序","default":false,"title":"Is Desc"},"description":"是否倒序"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"页码","default":1,"title":"Page"},"description":"页码"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"每页条数","default":10,"title":"Page Size"},"description":"每页条数"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_ModelRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["llm"],"summary":"创建模型","operationId":"create_model_api_v1_llm_models_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ModelRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/llm/models/{model_id}":{"get":{"tags":["llm"],"summary":"获取单个模型","operationId":"get_model_api_v1_llm_models__model_id__get","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ModelRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["llm"],"summary":"更新模型","operationId":"update_model_api_v1_llm_models__model_id__patch","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ModelRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["llm"],"summary":"删除模型","operationId":"delete_model_api_v1_llm_models__model_id__delete","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/llm/model-settings":{"get":{"tags":["llm"],"summary":"获取模型全局设置(单例)","operationId":"get_model_settings_api_v1_llm_model_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ModelSettingsRead_"}}}}}},"put":{"tags":["llm"],"summary":"更新模型全局设置(单例)","operationId":"update_model_settings_api_v1_llm_model_settings_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelSettingsUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ModelSettingsRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/projects/style-options":{"get":{"tags":["studio/projects"],"summary":"获取项目风格与视频参数候选项","operationId":"get_project_style_options_api_v1_studio_projects_style_options_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProjectStyleOptionsRead_"}}}}}}},"/api/v1/studio/projects":{"get":{"tags":["studio/projects"],"summary":"项目列表(分页)","operationId":"list_projects_api_v1_studio_projects_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键字,过滤 name/description","title":"Q"},"description":"关键字,过滤 name/description"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"排序字段","title":"Order"},"description":"排序字段"},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","description":"是否倒序","default":false,"title":"Is Desc"},"description":"是否倒序"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_ProjectRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/projects"],"summary":"创建项目","operationId":"create_project_api_v1_studio_projects_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProjectRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/projects/{project_id}":{"get":{"tags":["studio/projects"],"summary":"获取项目","operationId":"get_project_api_v1_studio_projects__project_id__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProjectRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["studio/projects"],"summary":"更新项目","operationId":"update_project_api_v1_studio_projects__project_id__patch","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProjectRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/projects"],"summary":"删除项目","operationId":"delete_project_api_v1_studio_projects__project_id__delete","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/chapters":{"get":{"tags":["studio/chapters"],"summary":"章节列表(分页)","operationId":"list_chapters_api_v1_studio_chapters_get","parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按项目过滤","title":"Project Id"},"description":"按项目过滤"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键字,过滤 title/summary","title":"Q"},"description":"关键字,过滤 title/summary"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"排序字段","title":"Order"},"description":"排序字段"},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","description":"是否倒序","default":false,"title":"Is Desc"},"description":"是否倒序"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_ChapterRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/chapters"],"summary":"创建章节","operationId":"create_chapter_api_v1_studio_chapters_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapterCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ChapterRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/chapters/{chapter_id}":{"get":{"tags":["studio/chapters"],"summary":"获取章节","operationId":"get_chapter_api_v1_studio_chapters__chapter_id__get","parameters":[{"name":"chapter_id","in":"path","required":true,"schema":{"type":"string","title":"Chapter Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ChapterRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["studio/chapters"],"summary":"更新章节","operationId":"update_chapter_api_v1_studio_chapters__chapter_id__patch","parameters":[{"name":"chapter_id","in":"path","required":true,"schema":{"type":"string","title":"Chapter Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapterUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ChapterRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/chapters"],"summary":"删除章节","operationId":"delete_chapter_api_v1_studio_chapters__chapter_id__delete","parameters":[{"name":"chapter_id","in":"path","required":true,"schema":{"type":"string","title":"Chapter Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots":{"get":{"tags":["studio/shots"],"summary":"镜头列表(分页)","operationId":"list_shots_api_v1_studio_shots_get","parameters":[{"name":"chapter_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按章节过滤","title":"Chapter Id"},"description":"按章节过滤"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键字,过滤 title/script_excerpt","title":"Q"},"description":"关键字,过滤 title/script_excerpt"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"}},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Desc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_ShotRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/shots"],"summary":"创建镜头","operationId":"create_shot_api_v1_studio_shots_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/runtime-summary":{"get":{"tags":["studio/shots"],"summary":"按章节获取镜头运行时任务态摘要","operationId":"list_shot_runtime_summary_api_v1_studio_shots_runtime_summary_get","parameters":[{"name":"chapter_id","in":"query","required":true,"schema":{"type":"string","description":"章节 ID","title":"Chapter Id"},"description":"章节 ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_list_ShotRuntimeSummaryRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/extraction-draft":{"get":{"tags":["studio/shots"],"summary":"分镜详情:按镜头关联拼装 StudioScriptExtractionDraft","operationId":"get_shot_extraction_draft_api_v1_studio_shots__shot_id__extraction_draft_get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_StudioScriptExtractionDraft_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/extracted-candidates":{"get":{"tags":["studio/shots"],"summary":"获取镜头提取候选项","operationId":"get_shot_extracted_candidates_api_v1_studio_shots__shot_id__extracted_candidates_get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_list_ShotExtractedCandidateRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/extracted-dialogue-candidates":{"get":{"tags":["studio/shots"],"summary":"获取镜头提取对白候选项","operationId":"get_shot_extracted_dialogue_candidates_api_v1_studio_shots__shot_id__extracted_dialogue_candidates_get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_list_ShotExtractedDialogueCandidateRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/assets-overview":{"get":{"tags":["studio/shots"],"summary":"获取镜头资产总览(已关联资产 + 提取候选)","operationId":"get_shot_assets_overview_api_api_v1_studio_shots__shot_id__assets_overview_get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotAssetsOverviewRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/preparation-state":{"get":{"tags":["studio/shots"],"summary":"获取镜头准备页聚合状态","operationId":"get_shot_preparation_state_api_api_v1_studio_shots__shot_id__preparation_state_get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotPreparationStateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/preparation-link":{"post":{"tags":["studio/shots"],"summary":"准备页关联现有实体并返回最新聚合状态","operationId":"link_existing_asset_for_preparation_api_api_v1_studio_shots__shot_id__preparation_link_post","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotPreparationLinkRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotPreparationMutationResultRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/video-prompt-preview":{"get":{"tags":["studio/shots"],"summary":"预览镜头视频提示词","operationId":"preview_shot_video_prompt_api_v1_studio_shots__shot_id__video_prompt_preview_get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}},{"name":"template_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"指定视频提示词模板 ID;不传则使用默认模板","title":"Template Id"},"description":"指定视频提示词模板 ID;不传则使用默认模板"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotVideoPromptPreviewRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/video-readiness":{"get":{"tags":["studio/shots"],"summary":"获取镜头视频生成准备度","operationId":"get_shot_video_readiness_api_api_v1_studio_shots__shot_id__video_readiness_get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}},{"name":"reference_mode","in":"query","required":false,"schema":{"type":"string","description":"参考模式:first/last/key/first_last/first_last_key/text_only","default":"text_only","title":"Reference Mode"},"description":"参考模式:first/last/key/first_last/first_last_key/text_only"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotVideoReadinessRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/skip-extraction":{"patch":{"tags":["studio/shots"],"summary":"设置是否跳过镜头信息提取","operationId":"update_shot_skip_extraction_api_v1_studio_shots__shot_id__skip_extraction_patch","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotSkipExtractionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotPreparationMutationResultRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/extracted-candidates/{candidate_id}/link":{"patch":{"tags":["studio/shots"],"summary":"确认并关联镜头提取候选项","operationId":"link_extracted_candidate_api_v1_studio_shots_extracted_candidates__candidate_id__link_patch","parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"integer","title":"Candidate Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotExtractedCandidateLinkRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotPreparationMutationResultRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/extracted-candidates/{candidate_id}/ignore":{"patch":{"tags":["studio/shots"],"summary":"忽略镜头提取候选项","operationId":"ignore_extracted_candidate_api_v1_studio_shots_extracted_candidates__candidate_id__ignore_patch","parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"integer","title":"Candidate Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotPreparationMutationResultRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/extracted-dialogue-candidates/{candidate_id}/accept":{"patch":{"tags":["studio/shots"],"summary":"接受镜头提取对白候选项","operationId":"accept_extracted_dialogue_candidate_api_v1_studio_shots_extracted_dialogue_candidates__candidate_id__accept_patch","parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"integer","title":"Candidate Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ShotExtractedDialogueCandidateAcceptRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotPreparationMutationResultRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/extracted-dialogue-candidates/{candidate_id}/ignore":{"patch":{"tags":["studio/shots"],"summary":"忽略镜头提取对白候选项","operationId":"ignore_extracted_dialogue_candidate_api_v1_studio_shots_extracted_dialogue_candidates__candidate_id__ignore_patch","parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"integer","title":"Candidate Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotPreparationMutationResultRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}":{"get":{"tags":["studio/shots"],"summary":"获取镜头","operationId":"get_shot_api_v1_studio_shots__shot_id__get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["studio/shots"],"summary":"更新镜头","operationId":"update_shot_api_v1_studio_shots__shot_id__patch","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/shots"],"summary":"删除镜头","operationId":"delete_shot_api_v1_studio_shots__shot_id__delete","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/linked-assets":{"get":{"tags":["studio/shots"],"summary":"获取镜头关联的角色/道具/场景/服装(分页)","operationId":"list_shot_linked_assets_api_v1_studio_shots__shot_id__linked_assets_get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_ShotLinkedAssetItem__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-details":{"get":{"tags":["studio/shot-details"],"summary":"镜头细节列表(分页)","operationId":"list_shot_details_api_v1_studio_shot_details_get","parameters":[{"name":"shot_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按镜头过滤(id 同 shot_id)","title":"Shot Id"},"description":"按镜头过滤(id 同 shot_id)"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"}},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Desc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_ShotDetailRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/shot-details"],"summary":"创建镜头细节","operationId":"create_shot_detail_api_v1_studio_shot_details_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotDetailCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotDetailRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-details/{shot_id}":{"get":{"tags":["studio/shot-details"],"summary":"获取镜头细节","operationId":"get_shot_detail_api_v1_studio_shot_details__shot_id__get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotDetailRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["studio/shot-details"],"summary":"更新镜头细节","operationId":"update_shot_detail_api_v1_studio_shot_details__shot_id__patch","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotDetailUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotDetailRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/shot-details"],"summary":"删除镜头细节","operationId":"delete_shot_detail_api_v1_studio_shot_details__shot_id__delete","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-dialog-lines":{"get":{"tags":["studio/shot-dialog-lines"],"summary":"镜头对话行列表(分页)","operationId":"list_shot_dialog_lines_api_v1_studio_shot_dialog_lines_get","parameters":[{"name":"shot_detail_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按镜头细节过滤","title":"Shot Detail Id"},"description":"按镜头细节过滤"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键字,过滤 text","title":"Q"},"description":"关键字,过滤 text"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"}},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Desc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_ShotDialogLineRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/shot-dialog-lines"],"summary":"创建镜头对话行","operationId":"create_shot_dialog_line_api_v1_studio_shot_dialog_lines_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotDialogLineCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotDialogLineRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-dialog-lines/{line_id}":{"patch":{"tags":["studio/shot-dialog-lines"],"summary":"更新镜头对话行","operationId":"update_shot_dialog_line_api_v1_studio_shot_dialog_lines__line_id__patch","parameters":[{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotDialogLineUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotDialogLineRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/shot-dialog-lines"],"summary":"删除镜头对话行","operationId":"delete_shot_dialog_line_api_v1_studio_shot_dialog_lines__line_id__delete","parameters":[{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-links/{entity_type}":{"get":{"tags":["studio/shot-links"],"summary":"项目-章节-镜头-实体关联列表(分页)","operationId":"list_project_entity_links_api_v1_studio_shot_links__entity_type__get","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"}},{"name":"chapter_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id"}},{"name":"shot_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id"}},{"name":"asset_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Id"}},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"}},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Desc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_Any__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-links/actor":{"post":{"tags":["studio/shot-links"],"summary":"创建项目-章节-镜头-演员关联","operationId":"create_project_actor_link_api_v1_studio_shot_links_actor_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAssetLinkCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProjectActorLinkRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-links/actor/{link_id}":{"delete":{"tags":["studio/shot-links"],"summary":"删除项目-章节-镜头-演员关联","operationId":"delete_project_actor_link_api_v1_studio_shot_links_actor__link_id__delete","parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-links/scene":{"post":{"tags":["studio/shot-links"],"summary":"创建项目-章节-镜头-场景关联","operationId":"create_project_scene_link_api_v1_studio_shot_links_scene_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAssetLinkCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProjectSceneLinkRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-links/scene/{link_id}":{"delete":{"tags":["studio/shot-links"],"summary":"删除项目-章节-镜头-场景关联","operationId":"delete_project_scene_link_api_v1_studio_shot_links_scene__link_id__delete","parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-links/prop":{"post":{"tags":["studio/shot-links"],"summary":"创建项目-章节-镜头-道具关联","operationId":"create_project_prop_link_api_v1_studio_shot_links_prop_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAssetLinkCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProjectPropLinkRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-links/prop/{link_id}":{"delete":{"tags":["studio/shot-links"],"summary":"删除项目-章节-镜头-道具关联","operationId":"delete_project_prop_link_api_v1_studio_shot_links_prop__link_id__delete","parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-links/costume":{"post":{"tags":["studio/shot-links"],"summary":"创建项目-章节-镜头-服装关联","operationId":"create_project_costume_link_api_v1_studio_shot_links_costume_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAssetLinkCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProjectCostumeLinkRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-links/costume/{link_id}":{"delete":{"tags":["studio/shot-links"],"summary":"删除项目-章节-镜头-服装关联","operationId":"delete_project_costume_link_api_v1_studio_shot_links_costume__link_id__delete","parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-frame-images":{"get":{"tags":["studio/shot-frame-images"],"summary":"镜头分镜帧图片列表(分页)","operationId":"list_shot_frame_images_api_v1_studio_shot_frame_images_get","parameters":[{"name":"shot_detail_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按镜头细节过滤","title":"Shot Detail Id"},"description":"按镜头细节过滤"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"}},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Desc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_ShotFrameImageRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/shot-frame-images"],"summary":"创建镜头分镜帧图片","operationId":"create_shot_frame_image_api_v1_studio_shot_frame_images_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotFrameImageCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotFrameImageRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-frame-images/{image_id}":{"patch":{"tags":["studio/shot-frame-images"],"summary":"更新镜头分镜帧图片","operationId":"update_shot_frame_image_api_v1_studio_shot_frame_images__image_id__patch","parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"integer","title":"Image Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotFrameImageUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotFrameImageRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/shot-frame-images"],"summary":"删除镜头分镜帧图片","operationId":"delete_shot_frame_image_api_v1_studio_shot_frame_images__image_id__delete","parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"integer","title":"Image Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/entities/existence-check":{"post":{"tags":["studio/entities"],"summary":"批量检测资产名称是否存在(模糊匹配,不分页)","operationId":"check_entity_names_existence_api_v1_studio_entities_existence_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityNameExistenceCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_EntityNameExistenceCheckResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/entities/{entity_type}":{"get":{"tags":["studio/entities"],"summary":"统一实体列表(分页)","operationId":"list_entities_api_v1_studio_entities__entity_type__get","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键字,过滤 name/description","title":"Q"},"description":"关键字,过滤 name/description"},{"name":"style","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"题材/风格(单值)","title":"Style"},"description":"题材/风格(单值)"},{"name":"visual_style","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"画面表现形式(单值:真人/动漫)","title":"Visual Style"},"description":"画面表现形式(单值:真人/动漫)"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"}},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Desc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_dict_str__Any___"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/entities"],"summary":"统一创建实体","operationId":"create_entity_api_v1_studio_entities__entity_type__post","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_dict_str__Any__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/entities/{entity_type}/{entity_id}":{"get":{"tags":["studio/entities"],"summary":"统一获取实体","operationId":"get_entity_api_v1_studio_entities__entity_type___entity_id__get","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_dict_str__Any__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["studio/entities"],"summary":"统一更新实体","operationId":"update_entity_api_v1_studio_entities__entity_type___entity_id__patch","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_dict_str__Any__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/entities"],"summary":"统一删除实体","operationId":"delete_entity_api_v1_studio_entities__entity_type___entity_id__delete","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/entities/{entity_type}/{entity_id}/images":{"get":{"tags":["studio/entities"],"summary":"统一实体图片列表(分页)","operationId":"list_entity_images_api_v1_studio_entities__entity_type___entity_id__images_get","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"}},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Desc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_dict_str__Any___"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/entities"],"summary":"统一创建实体图片","operationId":"create_entity_image_api_v1_studio_entities__entity_type___entity_id__images_post","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_dict_str__Any__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/entities/{entity_type}/{entity_id}/images/{image_id}":{"patch":{"tags":["studio/entities"],"summary":"统一更新实体图片","operationId":"update_entity_image_api_v1_studio_entities__entity_type___entity_id__images__image_id__patch","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"image_id","in":"path","required":true,"schema":{"type":"integer","title":"Image Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_dict_str__Any__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/entities"],"summary":"统一删除实体图片","operationId":"delete_entity_image_api_v1_studio_entities__entity_type___entity_id__images__image_id__delete","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"image_id","in":"path","required":true,"schema":{"type":"integer","title":"Image Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/prompts":{"get":{"tags":["studio/prompts"],"summary":"提示词模板列表(分页)","operationId":"list_prompt_templates_api_v1_studio_prompts_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PromptCategory"},{"type":"null"}],"description":"按类别过滤","title":"Category"},"description":"按类别过滤"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键字,过滤 name","title":"Q"},"description":"关键字,过滤 name"},{"name":"is_default","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"过滤是否为默认","title":"Is Default"},"description":"过滤是否为默认"},{"name":"is_system","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"过滤是否为系统预置","title":"Is System"},"description":"过滤是否为系统预置"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"}},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Desc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_PromptTemplateRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/prompts"],"summary":"创建提示词模板","operationId":"create_prompt_template_api_v1_studio_prompts_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptTemplateCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PromptTemplateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/prompts/categories":{"get":{"tags":["studio/prompts"],"summary":"获取提示词类别枚举(含中文映射)","operationId":"list_prompt_categories_api_v1_studio_prompts_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_list_PromptCategoryOptionRead__"}}}}}}},"/api/v1/studio/prompts/{template_id}":{"get":{"tags":["studio/prompts"],"summary":"获取提示词模板详情","operationId":"get_prompt_template_api_v1_studio_prompts__template_id__get","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PromptTemplateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["studio/prompts"],"summary":"局部更新提示词模板","operationId":"update_prompt_template_api_v1_studio_prompts__template_id__patch","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptTemplateUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PromptTemplateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/prompts"],"summary":"删除提示词模板","operationId":"delete_prompt_template_api_v1_studio_prompts__template_id__delete","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/files":{"get":{"tags":["studio/files"],"summary":"文件列表(分页)","operationId":"list_files_api_api_v1_studio_files_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键字,过滤 name","title":"Q"},"description":"关键字,过滤 name"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"}},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Desc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}},{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按 file_usages 限定项目;提供后仅返回该项目下有关联记录的文件","title":"Project Id"},"description":"按 file_usages 限定项目;提供后仅返回该项目下有关联记录的文件"},{"name":"chapter_title","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"章节标题(精确匹配,与 project_id 联用)","title":"Chapter Title"},"description":"章节标题(精确匹配,与 project_id 联用)"},{"name":"shot_title","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"镜头标题(精确匹配,与 project_id 联用)","title":"Shot Title"},"description":"镜头标题(精确匹配,与 project_id 联用)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_FileRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/files/upload":{"post":{"tags":["studio/files"],"summary":"上传文件并创建 FileItem 记录","operationId":"upload_file_api_api_v1_studio_files_upload_post","parameters":[{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_file_api_api_v1_studio_files_upload_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_FileRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/files/{file_id}/download":{"get":{"tags":["studio/files"],"summary":"下载文件二进制内容","operationId":"download_file_api_api_v1_studio_files__file_id__download_get","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/files/{file_id}/storage-info":{"get":{"tags":["studio/files"],"summary":"获取对象存储详情(head_object)","operationId":"get_file_storage_info_api_api_v1_studio_files__file_id__storage_info_get","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_dict_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/files/{file_id}":{"get":{"tags":["studio/files"],"summary":"获取文件详情(元信息 + file_usages)","operationId":"get_file_detail_api_v1_studio_files__file_id__get","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_FileDetailRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["studio/files"],"summary":"更新文件元信息","operationId":"update_file_meta_api_v1_studio_files__file_id__patch","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_FileRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/files"],"summary":"删除文件(记录 + 存储对象)","operationId":"delete_file_api_api_v1_studio_files__file_id__delete","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/image-tasks/actors/{actor_id}/image-tasks":{"post":{"tags":["studio/image-tasks"],"summary":"演员图片生成(任务版)","description":"为指定演员创建图片生成任务,并通过 `GenerationTaskLink` 关联。","operationId":"create_actor_image_generation_task_api_v1_studio_image_tasks_actors__actor_id__image_tasks_post","parameters":[{"name":"actor_id","in":"path","required":true,"schema":{"type":"string","title":"Actor Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioImageTaskRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskCreated_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/image-tasks/actors/{actor_id}/render-prompt":{"post":{"tags":["studio/image-tasks"],"summary":"演员图片提示词渲染","operationId":"render_actor_image_prompt_api_v1_studio_image_tasks_actors__actor_id__render_prompt_post","parameters":[{"name":"actor_id","in":"path","required":true,"schema":{"type":"string","title":"Actor Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioImageTaskRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_RenderedPromptResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/image-tasks/assets/{asset_type}/{asset_id}/image-tasks":{"post":{"tags":["studio/image-tasks"],"summary":"道具/场景/服装图片生成(任务版)","description":"为道具/场景/服装创建图片生成任务。\n\n- asset_type: prop / scene / costume\n- path 参数 asset_id 为对应资产 ID\n- body.image_id 必须为该资产下对应图片表记录的 ID(PropImage/SceneImage/CostumeImage)","operationId":"create_asset_image_generation_task_api_v1_studio_image_tasks_assets__asset_type___asset_id__image_tasks_post","parameters":[{"name":"asset_type","in":"path","required":true,"schema":{"type":"string","title":"Asset Type"}},{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioImageTaskRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskCreated_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/image-tasks/assets/{asset_type}/{asset_id}/render-prompt":{"post":{"tags":["studio/image-tasks"],"summary":"道具/场景/服装图片提示词渲染","operationId":"render_asset_image_prompt_api_v1_studio_image_tasks_assets__asset_type___asset_id__render_prompt_post","parameters":[{"name":"asset_type","in":"path","required":true,"schema":{"type":"string","title":"Asset Type"}},{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioImageTaskRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_RenderedPromptResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/image-tasks/characters/{character_id}/image-tasks":{"post":{"tags":["studio/image-tasks"],"summary":"角色图片生成(任务版)","description":"为角色创建图片生成任务(对应 CharacterImage 业务)。\n\n- path 参数 character_id 为 Character.id\n- body.image_id 必须为该角色下的 CharacterImage.id","operationId":"create_character_image_generation_task_api_v1_studio_image_tasks_characters__character_id__image_tasks_post","parameters":[{"name":"character_id","in":"path","required":true,"schema":{"type":"string","title":"Character Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioImageTaskRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskCreated_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/image-tasks/characters/{character_id}/render-prompt":{"post":{"tags":["studio/image-tasks"],"summary":"角色图片提示词渲染","operationId":"render_character_image_prompt_api_v1_studio_image_tasks_characters__character_id__render_prompt_post","parameters":[{"name":"character_id","in":"path","required":true,"schema":{"type":"string","title":"Character Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioImageTaskRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_RenderedPromptResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/image-tasks/shot/{shot_id}/frame-image-tasks":{"post":{"tags":["studio/image-tasks"],"summary":"镜头分镜帧图片生成(任务版)","description":"为镜头分镜帧图片生成任务(基于 `shot_id + frame_type` 自动定位数据)。","operationId":"create_shot_frame_image_generation_task_api_v1_studio_image_tasks_shot__shot_id__frame_image_tasks_post","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotFrameImageTaskRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskCreated_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/image-tasks/shot/{shot_id}/frame-render-prompt":{"post":{"tags":["studio/image-tasks"],"summary":"镜头分镜帧提示词渲染","operationId":"render_shot_frame_prompt_api_v1_studio_image_tasks_shot__shot_id__frame_render_prompt_post","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotFramePromptRenderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_RenderedShotFramePromptRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-character-links":{"get":{"tags":["studio/shot-character-links"],"summary":"查询镜头角色关联列表(ShotCharacterLink)","operationId":"list_shot_character_links_api_v1_studio_shot_character_links_get","parameters":[{"name":"shot_id","in":"query","required":true,"schema":{"type":"string","description":"镜头 ID","title":"Shot Id"},"description":"镜头 ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_list_ShotCharacterLinkRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/shot-character-links"],"summary":"创建/更新镜头角色关联(ShotCharacterLink)","operationId":"upsert_shot_character_link_api_v1_studio_shot_character_links_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotCharacterLinkCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotCharacterLinkRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/divide-async":{"post":{"tags":["script-processing"],"summary":"异步将剧本分割为多个镜头","description":"创建章节分镜提取任务并立即返回 task_id;前端可通过任务状态接口轮询。","operationId":"divide_script_async_api_v1_script_processing_divide_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptDividerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/divide":{"post":{"tags":["script-processing"],"summary":"将剧本分割为多个镜头","description":"输入完整剧本文本,输出分镜列表(index/start_line/end_line/script_excerpt/shot_name/time_of_day)。注意:此阶段不强制稳定ID,角色以“称呼/名字”弱信息输出,稳定ID在合并阶段统一分配。当前同步接口主要用于兼容旧调用与调试场景;页面主流程优先使用 divide-async。","operationId":"divide_script_api_v1_script_processing_divide_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptDividerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ScriptDivisionResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/merge-entities-async":{"post":{"tags":["script-processing"],"summary":"异步合并多镜头的实体信息","description":"创建实体合并任务并立即返回 task_id;当前保留为预备能力,尚无真实前端入口。","operationId":"merge_entities_async_api_v1_script_processing_merge_entities_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityMergerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/merge-entities":{"post":{"tags":["script-processing"],"summary":"合并多镜头的实体信息","description":"输入全部分镜提取结果(可选带上脚本分镜与历史实体库),输出合并后的实体库:角色库/地点库/场景库/道具库(静态画像 + 变体列表)。该步骤会统一分配稳定ID(如 char_001/loc_001/prop_001/scene_001)。当提供 previous_merge 与 conflict_resolutions 时,将进行冲突重试合并,优先消解 conflicts 并尽量保持 ID 稳定。当前接口保留为预备能力,尚无真实前端入口。","operationId":"merge_entities_api_v1_script_processing_merge_entities_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityMergerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_EntityMergeResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-variants-async":{"post":{"tags":["script-processing"],"summary":"异步分析服装/外形变体","description":"创建变体分析任务并立即返回 task_id;当前保留为预备能力,尚无真实前端入口。","operationId":"analyze_variants_async_api_v1_script_processing_analyze_variants_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VariantAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-variants":{"post":{"tags":["script-processing"],"summary":"分析服装/外形变体","description":"检测角色服装/外形变化,构建演变时间线,生成章节变体建议列表与变体建议。当前接口保留为预备能力,尚无真实前端入口。","operationId":"analyze_variants_api_v1_script_processing_analyze_variants_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VariantAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_VariantAnalysisResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/check-consistency-async":{"post":{"tags":["script-processing"],"summary":"异步检查角色混淆一致性(基于原文)","description":"创建一致性检查任务并立即返回 task_id;前端可通过任务状态接口轮询。","operationId":"check_consistency_async_api_v1_script_processing_check_consistency_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptConsistencyCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/check-consistency":{"post":{"tags":["script-processing"],"summary":"检查角色混淆一致性(基于原文)","description":"检测同一角色在不同段落/镜头被赋予不同身份/行为主体导致混淆,并给出修改建议。当前同步接口主要用于兼容旧调用与调试场景;页面主流程优先使用 check-consistency-async。","operationId":"check_consistency_api_v1_script_processing_check_consistency_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptConsistencyCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ScriptConsistencyCheckResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-character-portrait-async":{"post":{"tags":["script-processing"],"summary":"异步分析人物画像缺失信息","description":"创建人物画像分析任务并立即返回 task_id;前端可通过任务状态接口轮询。","operationId":"analyze_character_portrait_async_api_v1_script_processing_analyze_character_portrait_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharacterPortraitAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-character-portrait":{"post":{"tags":["script-processing"],"summary":"分析人物画像缺失信息","description":"根据原文人物上下文与人物描述,判断缺少哪些关键信息,并给出优化后的人物画像描述。当前同步接口主要用于兼容旧调用与调试场景;页面主流程优先使用 analyze-character-portrait-async。","operationId":"analyze_character_portrait_api_v1_script_processing_analyze_character_portrait_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharacterPortraitAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_CharacterPortraitAnalysisResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-prop-info-async":{"post":{"tags":["script-processing"],"summary":"异步分析道具信息缺失项","description":"创建道具信息分析任务并立即返回 task_id;前端可通过任务状态接口轮询。","operationId":"analyze_prop_info_async_api_v1_script_processing_analyze_prop_info_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropInfoAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-prop-info":{"post":{"tags":["script-processing"],"summary":"分析道具信息缺失项","description":"根据原文道具上下文与道具描述,判断缺少哪些关键信息,并给出优化后的可生成道具描述。当前同步接口主要用于兼容旧调用与调试场景;页面主流程优先使用 analyze-prop-info-async。","operationId":"analyze_prop_info_api_v1_script_processing_analyze_prop_info_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropInfoAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PropInfoAnalysisResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-scene-info-async":{"post":{"tags":["script-processing"],"summary":"异步分析场景信息缺失项","description":"创建场景信息分析任务并立即返回 task_id;前端可通过任务状态接口轮询。","operationId":"analyze_scene_info_async_api_v1_script_processing_analyze_scene_info_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SceneInfoAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-scene-info":{"post":{"tags":["script-processing"],"summary":"分析场景信息缺失项","description":"根据原文场景上下文与场景描述,判断缺少哪些关键信息,并给出优化后的可生成场景描述。当前同步接口主要用于兼容旧调用与调试场景;页面主流程优先使用 analyze-scene-info-async。","operationId":"analyze_scene_info_api_v1_script_processing_analyze_scene_info_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SceneInfoAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_SceneInfoAnalysisResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-costume-info-async":{"post":{"tags":["script-processing"],"summary":"异步分析服装信息缺失项","description":"创建服装信息分析任务并立即返回 task_id;前端可通过任务状态接口轮询。","operationId":"analyze_costume_info_async_api_v1_script_processing_analyze_costume_info_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CostumeInfoAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-costume-info":{"post":{"tags":["script-processing"],"summary":"分析服装信息缺失项","description":"根据原文服装上下文与服装描述,判断缺少哪些关键信息,并给出优化后的可生成服装描述。当前同步接口主要用于兼容旧调用与调试场景;页面主流程优先使用 analyze-costume-info-async。","operationId":"analyze_costume_info_api_v1_script_processing_analyze_costume_info_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CostumeInfoAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_CostumeInfoAnalysisResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/optimize-script-async":{"post":{"tags":["script-processing"],"summary":"异步基于一致性检查优化剧本","description":"创建剧本优化任务并立即返回 task_id;前端可通过任务状态接口轮询。","operationId":"optimize_script_async_api_v1_script_processing_optimize_script_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptOptimizeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/optimize-script":{"post":{"tags":["script-processing"],"summary":"基于一致性检查优化剧本","description":"将一致性检查输出及原文作为输入,生成优化后的剧本(尽量少改,只改与角色混淆 issues 相关段落)。当前同步接口主要用于兼容旧调用与调试场景;页面主流程优先使用 optimize-script-async。","operationId":"optimize_script_api_v1_script_processing_optimize_script_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptOptimizeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ScriptOptimizationResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/simplify-script":{"post":{"tags":["script-processing"],"summary":"智能精简剧本","description":"在保留剧情主体并保证剧情连续的前提下精简剧本文本。当前同步接口主要用于兼容旧调用与调试场景;页面主流程优先使用 simplify-script-async。","operationId":"simplify_script_api_v1_script_processing_simplify_script_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptSimplifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ScriptSimplificationResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/simplify-script-async":{"post":{"tags":["script-processing"],"summary":"异步智能精简剧本","description":"创建剧本精简任务并立即返回 task_id;前端可通过任务状态接口轮询。","operationId":"simplify_script_async_api_v1_script_processing_simplify_script_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptSimplifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/extract-async":{"post":{"tags":["script-processing"],"summary":"异步项目级信息提取(最终输出)","description":"创建项目级信息提取任务并立即返回 task_id;前端可通过任务状态接口轮询。","operationId":"extract_script_async_api_v1_script_processing_extract_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptExtractRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/extract":{"post":{"tags":["script-processing"],"summary":"项目级信息提取(最终输出)","description":"输入分镜结果(可选带一致性检查结果),输出可导入 Studio 的草稿结构(name-based,ID 由导入接口生成)。当前同步接口主要用于兼容旧调用与调试场景;页面主流程优先使用 extract-async。","operationId":"extract_script_api_v1_script_processing_extract_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptExtractRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_StudioScriptExtractionDraft_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","description":"健康检查。","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"ApiResponse_AsyncTaskCreateRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/AsyncTaskCreateRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[AsyncTaskCreateRead]"},"ApiResponse_ChapterRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ChapterRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ChapterRead]"},"ApiResponse_CharacterPortraitAnalysisResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/CharacterPortraitAnalysisResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[CharacterPortraitAnalysisResult]"},"ApiResponse_CostumeInfoAnalysisResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/CostumeInfoAnalysisResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[CostumeInfoAnalysisResult]"},"ApiResponse_EntityMergeResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/EntityMergeResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[EntityMergeResult]"},"ApiResponse_EntityNameExistenceCheckResponse_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/EntityNameExistenceCheckResponse"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[EntityNameExistenceCheckResponse]"},"ApiResponse_FileDetailRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/FileDetailRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[FileDetailRead]"},"ApiResponse_FileRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/FileRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[FileRead]"},"ApiResponse_GenerationTaskLinkRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/GenerationTaskLinkRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[GenerationTaskLinkRead]"},"ApiResponse_ModelRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ModelRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ModelRead]"},"ApiResponse_ModelSettingsRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ModelSettingsRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ModelSettingsRead]"},"ApiResponse_NoneType_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"type":"null","title":"Data","description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[NoneType]"},"ApiResponse_PaginatedData_Any__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_Any_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[Any]]"},"ApiResponse_PaginatedData_ChapterRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_ChapterRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[ChapterRead]]"},"ApiResponse_PaginatedData_FileRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_FileRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[FileRead]]"},"ApiResponse_PaginatedData_GenerationTaskLinkRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_GenerationTaskLinkRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[GenerationTaskLinkRead]]"},"ApiResponse_PaginatedData_ModelRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_ModelRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[ModelRead]]"},"ApiResponse_PaginatedData_ProjectRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_ProjectRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[ProjectRead]]"},"ApiResponse_PaginatedData_PromptTemplateRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_PromptTemplateRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[PromptTemplateRead]]"},"ApiResponse_PaginatedData_ProviderRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_ProviderRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[ProviderRead]]"},"ApiResponse_PaginatedData_ShotDetailRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_ShotDetailRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[ShotDetailRead]]"},"ApiResponse_PaginatedData_ShotDialogLineRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_ShotDialogLineRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[ShotDialogLineRead]]"},"ApiResponse_PaginatedData_ShotFrameImageRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_ShotFrameImageRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[ShotFrameImageRead]]"},"ApiResponse_PaginatedData_ShotLinkedAssetItem__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_ShotLinkedAssetItem_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[ShotLinkedAssetItem]]"},"ApiResponse_PaginatedData_ShotRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_ShotRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[ShotRead]]"},"ApiResponse_PaginatedData_TaskListItemRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_TaskListItemRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[TaskListItemRead]]"},"ApiResponse_PaginatedData_dict_str__Any___":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_dict_str__Any__"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[dict[str, Any]]]"},"ApiResponse_ProjectActorLinkRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ProjectActorLinkRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ProjectActorLinkRead]"},"ApiResponse_ProjectCostumeLinkRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ProjectCostumeLinkRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ProjectCostumeLinkRead]"},"ApiResponse_ProjectPropLinkRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ProjectPropLinkRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ProjectPropLinkRead]"},"ApiResponse_ProjectRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ProjectRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ProjectRead]"},"ApiResponse_ProjectSceneLinkRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ProjectSceneLinkRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ProjectSceneLinkRead]"},"ApiResponse_ProjectStyleOptionsRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ProjectStyleOptionsRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ProjectStyleOptionsRead]"},"ApiResponse_PromptTemplateRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PromptTemplateRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PromptTemplateRead]"},"ApiResponse_PropInfoAnalysisResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PropInfoAnalysisResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PropInfoAnalysisResult]"},"ApiResponse_ProviderRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ProviderRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ProviderRead]"},"ApiResponse_RenderedPromptResponse_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/RenderedPromptResponse"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[RenderedPromptResponse]"},"ApiResponse_RenderedShotFramePromptRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/RenderedShotFramePromptRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[RenderedShotFramePromptRead]"},"ApiResponse_SceneInfoAnalysisResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/SceneInfoAnalysisResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[SceneInfoAnalysisResult]"},"ApiResponse_ScriptConsistencyCheckResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ScriptConsistencyCheckResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ScriptConsistencyCheckResult]"},"ApiResponse_ScriptDivisionResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ScriptDivisionResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ScriptDivisionResult]"},"ApiResponse_ScriptOptimizationResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ScriptOptimizationResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ScriptOptimizationResult]"},"ApiResponse_ScriptSimplificationResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ScriptSimplificationResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ScriptSimplificationResult]"},"ApiResponse_ShotAssetsOverviewRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotAssetsOverviewRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotAssetsOverviewRead]"},"ApiResponse_ShotCharacterLinkRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotCharacterLinkRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotCharacterLinkRead]"},"ApiResponse_ShotDetailRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotDetailRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotDetailRead]"},"ApiResponse_ShotDialogLineRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotDialogLineRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotDialogLineRead]"},"ApiResponse_ShotFrameImageRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotFrameImageRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotFrameImageRead]"},"ApiResponse_ShotPreparationMutationResultRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotPreparationMutationResultRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotPreparationMutationResultRead]"},"ApiResponse_ShotPreparationStateRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotPreparationStateRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotPreparationStateRead]"},"ApiResponse_ShotRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotRead]"},"ApiResponse_ShotVideoPromptPreviewRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotVideoPromptPreviewRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotVideoPromptPreviewRead]"},"ApiResponse_ShotVideoReadinessRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotVideoReadinessRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotVideoReadinessRead]"},"ApiResponse_StudioScriptExtractionDraft_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/StudioScriptExtractionDraft"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[StudioScriptExtractionDraft]"},"ApiResponse_TaskCancelRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/TaskCancelRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[TaskCancelRead]"},"ApiResponse_TaskCreated_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/TaskCreated"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[TaskCreated]"},"ApiResponse_TaskLinkAdoptRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/TaskLinkAdoptRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[TaskLinkAdoptRead]"},"ApiResponse_TaskResultRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/TaskResultRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[TaskResultRead]"},"ApiResponse_TaskStatusRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/TaskStatusRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[TaskStatusRead]"},"ApiResponse_VariantAnalysisResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/VariantAnalysisResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[VariantAnalysisResult]"},"ApiResponse_VideoPromptPreviewResponse_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/VideoPromptPreviewResponse"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[VideoPromptPreviewResponse]"},"ApiResponse_dict_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[dict]"},"ApiResponse_dict_str__Any__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[dict[str, Any]]"},"ApiResponse_list_PromptCategoryOptionRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/PromptCategoryOptionRead"},"type":"array"},{"type":"null"}],"title":"Data","description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[list[PromptCategoryOptionRead]]"},"ApiResponse_list_ProviderSupportedRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/ProviderSupportedRead"},"type":"array"},{"type":"null"}],"title":"Data","description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[list[ProviderSupportedRead]]"},"ApiResponse_list_ShotCharacterLinkRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/ShotCharacterLinkRead"},"type":"array"},{"type":"null"}],"title":"Data","description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[list[ShotCharacterLinkRead]]"},"ApiResponse_list_ShotExtractedCandidateRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/ShotExtractedCandidateRead"},"type":"array"},{"type":"null"}],"title":"Data","description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[list[ShotExtractedCandidateRead]]"},"ApiResponse_list_ShotExtractedDialogueCandidateRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/ShotExtractedDialogueCandidateRead"},"type":"array"},{"type":"null"}],"title":"Data","description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[list[ShotExtractedDialogueCandidateRead]]"},"ApiResponse_list_ShotRuntimeSummaryRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/ShotRuntimeSummaryRead"},"type":"array"},{"type":"null"}],"title":"Data","description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[list[ShotRuntimeSummaryRead]]"},"AsyncTaskCreateRead":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"任务 ID"},"status":{"$ref":"#/components/schemas/TaskStatus","description":"任务状态"},"reused":{"type":"boolean","title":"Reused","description":"是否复用了当前业务实体已有的活跃任务","default":false},"relation_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Type","description":"业务关联类型"},"relation_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Entity Id","description":"业务关联实体 ID"}},"type":"object","required":["task_id","status"],"title":"AsyncTaskCreateRead"},"Body_upload_file_api_api_v1_studio_files_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"要上传的二进制文件"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"可选:写入 file_usages 的项目 ID"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id"},"usage_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Usage Kind","description":"与 project_id 同时提供时写入 file_usages"},"source_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Ref"}},"type":"object","required":["file"],"title":"Body_upload_file_api_api_v1_studio_files_upload_post"},"CameraAngle":{"type":"string","enum":["EYE_LEVEL","HIGH_ANGLE","LOW_ANGLE","BIRD_EYE","DUTCH","OVER_SHOULDER"],"title":"CameraAngle","description":"机位角度(与 `app.schemas.skills.common.CameraAngle` 对齐,存英文 code)。"},"CameraMovement":{"type":"string","enum":["STATIC","PAN","TILT","DOLLY_IN","DOLLY_OUT","TRACK","CRANE","HANDHELD","STEADICAM","ZOOM_IN","ZOOM_OUT"],"title":"CameraMovement","description":"运镜方式(与 `app.schemas.skills.common.CameraMovement` 对齐,存英文 code)。"},"CameraShotType":{"type":"string","enum":["ECU","CU","MCU","MS","MLS","LS","ELS"],"title":"CameraShotType","description":"景别(与 `app.schemas.skills.common.ShotType` 对齐,存英文 code)。"},"ChapterCreate":{"properties":{"project_id":{"type":"string","title":"Project Id","description":"所属项目 ID"},"index":{"type":"integer","title":"Index","description":"章节序号(项目内唯一)"},"title":{"type":"string","title":"Title","description":"章节标题"},"summary":{"type":"string","title":"Summary","description":"章节摘要","default":""},"raw_text":{"type":"string","title":"Raw Text","description":"章节原文","default":""},"condensed_text":{"type":"string","title":"Condensed Text","description":"精简原文","default":""},"storyboard_count":{"type":"integer","title":"Storyboard Count","description":"分镜数量","default":0},"status":{"$ref":"#/components/schemas/ChapterStatus","description":"章节状态","default":"draft"},"id":{"type":"string","title":"Id","description":"章节 ID"}},"type":"object","required":["project_id","index","title","id"],"title":"ChapterCreate"},"ChapterRead":{"properties":{"project_id":{"type":"string","title":"Project Id","description":"所属项目 ID"},"index":{"type":"integer","title":"Index","description":"章节序号(项目内唯一)"},"title":{"type":"string","title":"Title","description":"章节标题"},"summary":{"type":"string","title":"Summary","description":"章节摘要","default":""},"raw_text":{"type":"string","title":"Raw Text","description":"章节原文","default":""},"condensed_text":{"type":"string","title":"Condensed Text","description":"精简原文","default":""},"storyboard_count":{"type":"integer","title":"Storyboard Count","description":"分镜数量","default":0},"status":{"$ref":"#/components/schemas/ChapterStatus","description":"章节状态","default":"draft"},"id":{"type":"string","title":"Id"},"shot_count":{"type":"integer","title":"Shot Count","description":"分镜数(shots 条数聚合)","default":0}},"type":"object","required":["project_id","index","title","id"],"title":"ChapterRead"},"ChapterStatus":{"type":"string","enum":["draft","shooting","done"],"title":"ChapterStatus","description":"章节生产状态。"},"ChapterUpdate":{"properties":{"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"},"index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Index"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"raw_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Text"},"condensed_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condensed Text"},"storyboard_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Storyboard Count"},"status":{"anyOf":[{"$ref":"#/components/schemas/ChapterStatus"},{"type":"null"}]}},"type":"object","title":"ChapterUpdate"},"CharacterPortraitAnalysisRequest":{"properties":{"relation_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Entity Id","description":"任务关联实体 ID(资产页恢复任务可选)"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"项目 ID(异步任务关联可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(异步任务关联可选)"},"character_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Character Context","description":"原文人物上下文(可为空;用于提供额外背景,帮助判断缺失信息)"},"character_description":{"type":"string","minLength":1,"title":"Character Description","description":"原文人物描述"}},"type":"object","required":["character_description"],"title":"CharacterPortraitAnalysisRequest","description":"人物画像缺失信息分析请求。"},"CharacterPortraitAnalysisResult":{"properties":{"issues":{"items":{"type":"string"},"type":"array","title":"Issues"},"optimized_description":{"type":"string","title":"Optimized Description"}},"additionalProperties":false,"type":"object","required":["issues","optimized_description"],"title":"CharacterPortraitAnalysisResult","description":"根据原文人物描述,分析缺少的信息,并给出优化后的可生成画像描述。"},"CostumeInfoAnalysisRequest":{"properties":{"relation_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Entity Id","description":"任务关联实体 ID(资产页恢复任务可选)"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"项目 ID(异步任务关联可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(异步任务关联可选)"},"costume_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Costume Context","description":"原文服装上下文(可为空;用于提供额外背景,帮助判断缺失信息)"},"costume_description":{"type":"string","minLength":1,"title":"Costume Description","description":"原文服装描述"}},"type":"object","required":["costume_description"],"title":"CostumeInfoAnalysisRequest","description":"服装信息缺失分析请求。"},"CostumeInfoAnalysisResult":{"properties":{"issues":{"items":{"type":"string"},"type":"array","title":"Issues"},"optimized_description":{"type":"string","title":"Optimized Description"}},"additionalProperties":false,"type":"object","required":["issues","optimized_description"],"title":"CostumeInfoAnalysisResult","description":"根据原文服装/造型描述,分析缺少的信息,并给出优化后的可生成服装描述。"},"CostumeTimeline":{"properties":{"character_id":{"type":"string","title":"Character Id","description":"角色稳定ID"},"character_name":{"type":"string","title":"Character Name","description":"角色名称"},"timeline_entries":{"items":{"$ref":"#/components/schemas/CostumeTimelineEntry"},"type":"array","title":"Timeline Entries","description":"时间线条目"}},"additionalProperties":false,"type":"object","required":["character_id","character_name"],"title":"CostumeTimeline","description":"单角色的服装演变时间线。"},"CostumeTimelineEntry":{"properties":{"shot_index":{"type":"integer","minimum":1.0,"title":"Shot Index","description":"镜头序号"},"scene_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scene Id","description":"可选:所属场景稳定ID(若已可推断)"},"costume_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Costume Note","description":"服装/外形要点(简短)"},"changes":{"items":{"type":"string"},"type":"array","title":"Changes","description":"与上一条相比的变化点"},"evidence":{"items":{"$ref":"#/components/schemas/EvidenceSpan"},"type":"array","title":"Evidence","description":"原文依据(可选)"}},"additionalProperties":false,"type":"object","required":["shot_index"],"title":"CostumeTimelineEntry","description":"单角色的服装演变时间线条目。"},"DialogueLineMode":{"type":"string","enum":["DIALOGUE","VOICE_OVER","OFF_SCREEN","PHONE"],"title":"DialogueLineMode","description":"对白模式(与 `app.schemas.skills.common.DialogueLineMode` 对齐,存英文 code)。"},"EntityEntry":{"properties":{"id":{"type":"string","title":"Id","description":"实体稳定ID(合并阶段分配)"},"name":{"type":"string","title":"Name","description":"实体名称"},"type":{"type":"string","enum":["character","scene","prop","location"],"title":"Type","description":"实体类型"},"normalized_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Name","description":"归一化名称(来自文本,可选)"},"aliases":{"items":{"type":"string"},"type":"array","title":"Aliases","description":"别名/称呼(来自文本,可选)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"基础画像/描述(忠实文本,简短)"},"confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Confidence","description":"合并确定度 0-1(可选)"},"first_appearance":{"anyOf":[{"$ref":"#/components/schemas/EvidenceSpan"},{"type":"null"}],"description":"首次出场证据(可选)"},"costume_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Costume Note","description":"服装/造型描述(可选,便于变体与资产关联)"},"traits":{"items":{"type":"string"},"type":"array","title":"Traits","description":"性格/特征词(可选)"},"location_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Type","description":"地点类型:房间/街道/森林/车厢等(可选)"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"道具类别(可选:weapon/document/vehicle/clothing/device/magic_item/other)"},"owner_character_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Character Id","description":"拥有者角色ID(可选)"},"evidence":{"items":{"$ref":"#/components/schemas/EvidenceSpan"},"type":"array","title":"Evidence","description":"支撑该实体画像的证据片段(可选)"},"first_shot":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"First Shot","description":"首次出现的镜头序号"},"appearances":{"items":{"type":"integer"},"type":"array","title":"Appearances","description":"出现镜头列表"},"variants":{"items":{"$ref":"#/components/schemas/EntityVariant"},"type":"array","title":"Variants","description":"变体列表"}},"additionalProperties":false,"type":"object","required":["id","name","type"],"title":"EntityEntry","description":"合并后的实体条目(脚本处理中间态)。"},"EntityLibrary":{"properties":{"characters":{"items":{"$ref":"#/components/schemas/EntityEntry"},"type":"array","title":"Characters","description":"角色库"},"locations":{"items":{"$ref":"#/components/schemas/EntityEntry"},"type":"array","title":"Locations","description":"地点库"},"scenes":{"items":{"$ref":"#/components/schemas/EntityEntry"},"type":"array","title":"Scenes","description":"场景库"},"props":{"items":{"$ref":"#/components/schemas/EntityEntry"},"type":"array","title":"Props","description":"道具库"},"total_entries":{"type":"integer","minimum":0.0,"title":"Total Entries","description":"总实体数"}},"additionalProperties":false,"type":"object","required":["total_entries"],"title":"EntityLibrary","description":"合并后的实体库(脚本处理中间态)。"},"EntityMergeResult":{"properties":{"merged_library":{"$ref":"#/components/schemas/EntityLibrary","description":"合并后的实体库"},"merge_stats":{"additionalProperties":true,"type":"object","title":"Merge Stats","description":"合并统计信息"},"conflicts":{"items":{"type":"string"},"type":"array","title":"Conflicts","description":"发现的冲突/待处理项"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","description":"合并说明"}},"additionalProperties":false,"type":"object","required":["merged_library"],"title":"EntityMergeResult","description":"实体合并结果(脚本处理中间态)。"},"EntityMergerRequest":{"properties":{"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"项目 ID(异步任务关联可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(异步任务关联可选)"},"all_shot_extractions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"All Shot Extractions","description":"所有镜头提取结果(ShotElementExtractionResult 的序列化形式)"},"historical_library":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Historical Library","description":"历史实体库(可选,用于增量合并)"},"script_division":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Script Division","description":"脚本分镜结果(可选;ScriptDivisionResult 序列化),用于定位与统计"},"previous_merge":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Previous Merge","description":"上一次合并结果(可选;EntityMergeResult 序列化),用于冲突重试合并"},"conflict_resolutions":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Conflict Resolutions","description":"冲突解决建议列表(可选;用于冲突重试合并)"}},"type":"object","required":["all_shot_extractions"],"title":"EntityMergerRequest","description":"实体合并请求。"},"EntityNameExistenceCheckRequest":{"properties":{"project_id":{"type":"string","minLength":1,"title":"Project Id","description":"项目 ID(必填)"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id","description":"镜头 ID(可选;不传则 linked_to_shot 恒为 false)"},"character_names":{"items":{"type":"string"},"type":"array","title":"Character Names","description":"角色名称列表"},"prop_names":{"items":{"type":"string"},"type":"array","title":"Prop Names","description":"道具名称列表"},"scene_names":{"items":{"type":"string"},"type":"array","title":"Scene Names","description":"场景名称列表"},"costume_names":{"items":{"type":"string"},"type":"array","title":"Costume Names","description":"服装名称列表"}},"additionalProperties":false,"type":"object","required":["project_id"],"title":"EntityNameExistenceCheckRequest","description":"批量检测项目内/全局资产名称是否存在(模糊匹配)。"},"EntityNameExistenceCheckResponse":{"properties":{"characters":{"items":{"$ref":"#/components/schemas/EntityNameExistenceItem"},"type":"array","title":"Characters"},"props":{"items":{"$ref":"#/components/schemas/EntityNameExistenceItem"},"type":"array","title":"Props"},"scenes":{"items":{"$ref":"#/components/schemas/EntityNameExistenceItem"},"type":"array","title":"Scenes"},"costumes":{"items":{"$ref":"#/components/schemas/EntityNameExistenceItem"},"type":"array","title":"Costumes"}},"additionalProperties":false,"type":"object","title":"EntityNameExistenceCheckResponse","description":"批量存在性检测结果(按资产类型分组)。"},"EntityNameExistenceItem":{"properties":{"name":{"type":"string","title":"Name","description":"输入名称(原样回传)"},"exists":{"type":"boolean","title":"Exists","description":"数据库中是否存在(模糊命中)"},"linked_to_project":{"type":"boolean","title":"Linked To Project","description":"是否已关联到该项目(角色等同于 exists)"},"linked_to_shot":{"type":"boolean","title":"Linked To Shot","description":"是否已关联到请求中的 shot(未传 shot_id 时为 false)","default":false},"asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Id","description":"命中的资产 ID(如 prop_id/scene_id/costume_id/character_id)"},"link_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Link Id","description":"若已关联到项目,对应 Project*Link 的 id;否则为空"}},"additionalProperties":false,"type":"object","required":["name","exists","linked_to_project"],"title":"EntityNameExistenceItem","description":"单个名称的存在性结果。"},"EntityVariant":{"properties":{"variant_key":{"type":"string","title":"Variant Key","description":"变体键(例如 outfit_v1、wounded_state 等)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"变体描述(简短)"},"affected_shots":{"items":{"type":"integer"},"type":"array","title":"Affected Shots","description":"涉及镜头序号"},"evidence":{"items":{"$ref":"#/components/schemas/EvidenceSpan"},"type":"array","title":"Evidence","description":"原文依据(可选)"}},"additionalProperties":false,"type":"object","required":["variant_key"],"title":"EntityVariant","description":"实体变体条目(最小可用结构,便于服装/外形演变)。"},"EvidenceSpan":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id","description":"输入文本块的唯一ID(例如 chapter1_p03)"},"start_char":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Start Char","description":"在该 chunk 中的起始字符位置(可选)"},"end_char":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"End Char","description":"在该 chunk 中的结束字符位置(可选)"},"quote":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quote","description":"不超过200字的原文摘录(可选,便于人工审核)"}},"additionalProperties":false,"type":"object","required":["chunk_id"],"title":"EvidenceSpan","description":"可追溯证据:原文定位(chunk + 起止位置/摘录),用于审核与回查。"},"FileDetailRead":{"properties":{"id":{"type":"string","title":"Id","description":"文件 ID"},"type":{"$ref":"#/components/schemas/FileTypeEnum","description":"文件类型"},"name":{"type":"string","title":"Name","description":"文件名/标题"},"thumbnail":{"type":"string","title":"Thumbnail","description":"缩略图 URL/路径","default":""},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"标签"},"usages":{"items":{"$ref":"#/components/schemas/FileUsageRead"},"type":"array","title":"Usages"}},"type":"object","required":["id","type","name"],"title":"FileDetailRead","description":"含 file_usages 列表(详情接口)。"},"FileRead":{"properties":{"id":{"type":"string","title":"Id","description":"文件 ID"},"type":{"$ref":"#/components/schemas/FileTypeEnum","description":"文件类型"},"name":{"type":"string","title":"Name","description":"文件名/标题"},"thumbnail":{"type":"string","title":"Thumbnail","description":"缩略图 URL/路径","default":""},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"标签"}},"type":"object","required":["id","type","name"],"title":"FileRead"},"FileTypeEnum":{"type":"string","enum":["image","video"],"title":"FileTypeEnum"},"FileUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"usage":{"anyOf":[{"$ref":"#/components/schemas/FileUsageWrite"},{"type":"null"}],"description":"若提供则 upsert 一条 file_usages"}},"type":"object","title":"FileUpdate"},"FileUsageRead":{"properties":{"id":{"type":"integer","title":"Id"},"file_id":{"type":"string","title":"File Id"},"project_id":{"type":"string","title":"Project Id"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id"},"usage_kind":{"type":"string","title":"Usage Kind"},"source_ref":{"type":"string","title":"Source Ref"}},"type":"object","required":["id","file_id","project_id","chapter_id","shot_id","usage_kind","source_ref"],"title":"FileUsageRead"},"FileUsageWrite":{"properties":{"project_id":{"type":"string","title":"Project Id","description":"项目 ID"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id","description":"镜头 ID"},"usage_kind":{"type":"string","title":"Usage Kind","description":"用途:shot_frame / generated_video / character_image / asset_image / upload / api 等"},"source_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Ref","description":"幂等键(可选)"}},"type":"object","required":["project_id","usage_kind"],"title":"FileUsageWrite","description":"写入 file_usages 的关联信息(与 FileItem 一并提交)。"},"GenerationTaskLinkCreate":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"生成任务 ID"},"resource_type":{"type":"string","title":"Resource Type","description":"生成资源类型(如 image/video/text/task_link)"},"relation_type":{"type":"string","title":"Relation Type","description":"业务类型(如 prop/costume/scene 等)"},"relation_entity_id":{"type":"string","title":"Relation Entity Id","description":"关联业务实体 ID"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"关联产物文件 ID(files.id;适用于图片/音频/视频)"},"status":{"type":"string","title":"Status","description":"关联状态:accepted=已采用、todo=待操作、rejected=未采用;默认 todo","default":"todo"}},"type":"object","required":["task_id","resource_type","relation_type","relation_entity_id"],"title":"GenerationTaskLinkCreate","description":"创建生成任务关联请求体。"},"GenerationTaskLinkRead":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"生成任务 ID"},"resource_type":{"type":"string","title":"Resource Type","description":"生成资源类型(如 image/video/text/task_link)"},"relation_type":{"type":"string","title":"Relation Type","description":"业务类型(如 prop/costume/scene 等)"},"relation_entity_id":{"type":"string","title":"Relation Entity Id","description":"关联业务实体 ID"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"关联产物文件 ID(files.id;适用于图片/音频/视频)"},"status":{"type":"string","title":"Status","description":"关联状态:accepted=已采用、todo=待操作、rejected=未采用"},"id":{"type":"integer","title":"Id","description":"关联行 ID"}},"type":"object","required":["task_id","resource_type","relation_type","relation_entity_id","status","id"],"title":"GenerationTaskLinkRead","description":"生成任务关联返回体。"},"GenerationTaskLinkUpdate":{"properties":{"resource_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Type","description":"生成资源类型(如 image/video/text/task_link)"},"relation_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Type","description":"业务类型(如 prop/costume/scene 等)"},"relation_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Entity Id","description":"关联业务实体 ID"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"关联产物文件 ID(files.id;适用于图片/音频/视频)"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"关联状态:accepted=已采用、todo=待操作、rejected=未采用"}},"type":"object","title":"GenerationTaskLinkUpdate","description":"更新生成任务关联请求体(不包含 is_adopted,采用状态由专用接口正向变更)。"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LogLevel":{"type":"string","enum":["debug","info","warn","error"],"title":"LogLevel","description":"全局日志级别。"},"ModelCategoryKey":{"type":"string","enum":["text","image","video"],"title":"ModelCategoryKey","description":"模型类别:文本/图片/视频。"},"ModelCreate":{"properties":{"name":{"type":"string","title":"Name","description":"模型名称"},"category":{"$ref":"#/components/schemas/ModelCategoryKey","description":"模型类别:text/image/video"},"provider_id":{"type":"string","title":"Provider Id","description":"所属供应商 ID"},"params":{"additionalProperties":true,"type":"object","title":"Params","description":"模型参数(JSON)"},"description":{"type":"string","title":"Description","description":"说明","default":""},"created_by":{"type":"string","title":"Created By","description":"创建人","default":""},"id":{"type":"string","title":"Id","description":"模型 ID"}},"type":"object","required":["name","category","provider_id","id"],"title":"ModelCreate","description":"创建模型请求体。"},"ModelRead":{"properties":{"name":{"type":"string","title":"Name","description":"模型名称"},"category":{"$ref":"#/components/schemas/ModelCategoryKey","description":"模型类别:text/image/video"},"provider_id":{"type":"string","title":"Provider Id","description":"所属供应商 ID"},"params":{"additionalProperties":true,"type":"object","title":"Params","description":"模型参数(JSON)"},"description":{"type":"string","title":"Description","description":"说明","default":""},"created_by":{"type":"string","title":"Created By","description":"创建人","default":""},"id":{"type":"string","title":"Id","description":"模型 ID"}},"type":"object","required":["name","category","provider_id","id"],"title":"ModelRead","description":"对外返回的模型信息。"},"ModelSettingsRead":{"properties":{"default_text_model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Text Model Id","description":"默认文本模型 ID"},"default_image_model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Image Model Id","description":"默认图片模型 ID"},"default_video_model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Video Model Id","description":"默认视频模型 ID"},"api_timeout":{"type":"integer","title":"Api Timeout","description":"API 超时(秒)","default":30},"log_level":{"$ref":"#/components/schemas/LogLevel","description":"日志级别","default":"info"},"id":{"type":"integer","title":"Id","description":"设置行 ID(通常为 1)"}},"type":"object","required":["id"],"title":"ModelSettingsRead","description":"对外返回的模型全局设置。"},"ModelSettingsUpdate":{"properties":{"default_text_model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Text Model Id","description":"默认文本模型 ID"},"default_image_model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Image Model Id","description":"默认图片模型 ID"},"default_video_model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Video Model Id","description":"默认视频模型 ID"},"api_timeout":{"type":"integer","title":"Api Timeout","description":"API 超时(秒)","default":30},"log_level":{"$ref":"#/components/schemas/LogLevel","description":"日志级别","default":"info"}},"type":"object","title":"ModelSettingsUpdate","description":"更新或保存模型全局设置请求体。"},"ModelUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"模型名称"},"category":{"anyOf":[{"$ref":"#/components/schemas/ModelCategoryKey"},{"type":"null"}],"description":"模型类别"},"provider_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Id","description":"所属供应商 ID"},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Params","description":"模型参数(JSON)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"说明"}},"type":"object","title":"ModelUpdate","description":"更新模型请求体(全部可选)。"},"PaginatedData_Any_":{"properties":{"items":{"items":{},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[Any]"},"PaginatedData_ChapterRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ChapterRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[ChapterRead]"},"PaginatedData_FileRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/FileRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[FileRead]"},"PaginatedData_GenerationTaskLinkRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/GenerationTaskLinkRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[GenerationTaskLinkRead]"},"PaginatedData_ModelRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ModelRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[ModelRead]"},"PaginatedData_ProjectRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ProjectRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[ProjectRead]"},"PaginatedData_PromptTemplateRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PromptTemplateRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[PromptTemplateRead]"},"PaginatedData_ProviderRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ProviderRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[ProviderRead]"},"PaginatedData_ShotDetailRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ShotDetailRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[ShotDetailRead]"},"PaginatedData_ShotDialogLineRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ShotDialogLineRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[ShotDialogLineRead]"},"PaginatedData_ShotFrameImageRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ShotFrameImageRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[ShotFrameImageRead]"},"PaginatedData_ShotLinkedAssetItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ShotLinkedAssetItem"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[ShotLinkedAssetItem]"},"PaginatedData_ShotRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ShotRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[ShotRead]"},"PaginatedData_TaskListItemRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TaskListItemRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[TaskListItemRead]"},"PaginatedData_dict_str__Any__":{"properties":{"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[dict[str, Any]]"},"Pagination":{"properties":{"page":{"type":"integer","title":"Page","description":"当前页,从 1 开始"},"page_size":{"type":"integer","title":"Page Size","description":"每页条数"},"total":{"type":"integer","title":"Total","description":"总条数"},"max_page":{"type":"integer","title":"Max Page","description":"最大页码"}},"type":"object","required":["page","page_size","total","max_page"],"title":"Pagination","description":"分页信息。"},"ProjectActorLinkRead":{"properties":{"id":{"type":"integer","title":"Id","description":"关联行 ID"},"project_id":{"type":"string","title":"Project Id","description":"项目 ID"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(可空)"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id","description":"镜头 ID(可空)"},"actor_id":{"type":"string","title":"Actor Id"},"thumbnail":{"type":"string","title":"Thumbnail","description":"演员缩略图下载地址","default":""}},"type":"object","required":["id","project_id","actor_id"],"title":"ProjectActorLinkRead"},"ProjectAssetLinkCreate":{"properties":{"project_id":{"type":"string","title":"Project Id"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id"},"asset_id":{"type":"string","title":"Asset Id"}},"type":"object","required":["project_id","asset_id"],"title":"ProjectAssetLinkCreate"},"ProjectCostumeLinkRead":{"properties":{"id":{"type":"integer","title":"Id","description":"关联行 ID"},"project_id":{"type":"string","title":"Project Id","description":"项目 ID"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(可空)"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id","description":"镜头 ID(可空)"},"costume_id":{"type":"string","title":"Costume Id"},"thumbnail":{"type":"string","title":"Thumbnail","description":"服装缩略图下载地址","default":""}},"type":"object","required":["id","project_id","costume_id"],"title":"ProjectCostumeLinkRead"},"ProjectCreate":{"properties":{"name":{"type":"string","title":"Name","description":"项目名称"},"description":{"type":"string","title":"Description","description":"项目简介","default":""},"style":{"$ref":"#/components/schemas/ProjectStyle","description":"题材/风格","examples":["真人都市","真人科幻","真人古装","动漫科幻","动漫3D","国漫","水墨画"]},"visual_style":{"$ref":"#/components/schemas/ProjectVisualStyle","description":"画面表现形式","default":"现实"},"seed":{"type":"integer","title":"Seed","description":"随机种子","default":0},"unify_style":{"type":"boolean","title":"Unify Style","description":"是否统一风格","default":true},"progress":{"type":"integer","title":"Progress","description":"进度百分比(0-100)","default":0},"default_video_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Video Size","description":"项目级默认视频尺寸;分镜未覆盖时生效"},"default_video_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Video Ratio","description":"项目级默认视频比例;分镜未覆盖时生效"},"stats":{"additionalProperties":true,"type":"object","title":"Stats","description":"聚合统计(JSON)"},"id":{"type":"string","title":"Id","description":"项目 ID"}},"type":"object","required":["name","style","id"],"title":"ProjectCreate"},"ProjectPropLinkRead":{"properties":{"id":{"type":"integer","title":"Id","description":"关联行 ID"},"project_id":{"type":"string","title":"Project Id","description":"项目 ID"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(可空)"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id","description":"镜头 ID(可空)"},"prop_id":{"type":"string","title":"Prop Id"},"thumbnail":{"type":"string","title":"Thumbnail","description":"道具缩略图下载地址","default":""}},"type":"object","required":["id","project_id","prop_id"],"title":"ProjectPropLinkRead"},"ProjectRead":{"properties":{"name":{"type":"string","title":"Name","description":"项目名称"},"description":{"type":"string","title":"Description","description":"项目简介","default":""},"style":{"$ref":"#/components/schemas/ProjectStyle","description":"题材/风格","examples":["真人都市","真人科幻","真人古装","动漫科幻","动漫3D","国漫","水墨画"]},"visual_style":{"$ref":"#/components/schemas/ProjectVisualStyle","description":"画面表现形式","default":"现实"},"seed":{"type":"integer","title":"Seed","description":"随机种子","default":0},"unify_style":{"type":"boolean","title":"Unify Style","description":"是否统一风格","default":true},"progress":{"type":"integer","title":"Progress","description":"进度百分比(0-100)","default":0},"default_video_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Video Size","description":"项目级默认视频尺寸;分镜未覆盖时生效"},"default_video_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Video Ratio","description":"项目级默认视频比例;分镜未覆盖时生效"},"stats":{"additionalProperties":true,"type":"object","title":"Stats","description":"聚合统计(JSON)"},"id":{"type":"string","title":"Id"}},"type":"object","required":["name","style","id"],"title":"ProjectRead"},"ProjectSceneLinkRead":{"properties":{"id":{"type":"integer","title":"Id","description":"关联行 ID"},"project_id":{"type":"string","title":"Project Id","description":"项目 ID"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(可空)"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id","description":"镜头 ID(可空)"},"scene_id":{"type":"string","title":"Scene Id"},"thumbnail":{"type":"string","title":"Thumbnail","description":"场景缩略图下载地址","default":""}},"type":"object","required":["id","project_id","scene_id"],"title":"ProjectSceneLinkRead"},"ProjectStyle":{"type":"string","enum":["真人都市","真人科幻","真人古装","动漫科幻","动漫3D","国漫","水墨画"],"title":"ProjectStyle","description":"项目题材/风格维度(不用于区分真人/动漫)。"},"ProjectStyleOptionsRead":{"properties":{"visual_styles":{"items":{"$ref":"#/components/schemas/StyleOption"},"type":"array","title":"Visual Styles","description":"视觉风格可选项"},"styles_by_visual_style":{"additionalProperties":{"items":{"$ref":"#/components/schemas/StyleOption"},"type":"array"},"type":"object","title":"Styles By Visual Style","description":"按视觉风格分组的视频风格选项"},"default_style_by_visual_style":{"additionalProperties":{"type":"string"},"type":"object","title":"Default Style By Visual Style","description":"各视觉风格默认视频风格"},"default_video_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Video Ratio","description":"默认视频比例(用于创建项目时的初始值)"},"default_video_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Video Size","description":"默认视频尺寸(用于创建项目时的初始值)"},"video_ratios":{"items":{"$ref":"#/components/schemas/StyleOption"},"type":"array","title":"Video Ratios","description":"视频比例候选项"},"video_sizes":{"items":{"$ref":"#/components/schemas/StyleOption"},"type":"array","title":"Video Sizes","description":"视频尺寸候选项"}},"type":"object","title":"ProjectStyleOptionsRead","description":"项目风格与视频参数候选项。"},"ProjectUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"style":{"anyOf":[{"$ref":"#/components/schemas/ProjectStyle"},{"type":"null"}],"description":"题材/风格","examples":["真人都市","真人科幻","真人古装","动漫科幻","动漫3D","国漫","水墨画"]},"visual_style":{"anyOf":[{"$ref":"#/components/schemas/ProjectVisualStyle"},{"type":"null"}]},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"},"unify_style":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Unify Style"},"progress":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress"},"default_video_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Video Size"},"default_video_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Video Ratio"},"stats":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Stats"}},"type":"object","title":"ProjectUpdate"},"ProjectVisualStyle":{"type":"string","enum":["现实","动漫"],"title":"ProjectVisualStyle","description":"画面表现形式维度:用于区分现实/动漫等。"},"PromptCategory":{"type":"string","enum":["frame_head_image","frame_tail_image","frame_key_image","frame_head_prompt","frame_tail_prompt","frame_key_prompt","video_prompt","storyboard_prompt","bgm","sfx","character_image_front","character_image_other","actor_image_front","actor_image_other","prop_image_front","prop_image_other","scene_image_front","scene_image_other","costume_image_front","costume_image_other","combined"],"title":"PromptCategory","description":"提示词模板类别。"},"PromptCategoryOptionRead":{"properties":{"value":{"$ref":"#/components/schemas/PromptCategory","description":"类别枚举值"},"label":{"type":"string","title":"Label","description":"中文名称"},"description":{"type":"string","title":"Description","description":"类别简介","default":""}},"type":"object","required":["value","label"],"title":"PromptCategoryOptionRead","description":"提示词类别选项(枚举值 + 中文标签 + 简介)。"},"PromptTemplateCreate":{"properties":{"category":{"$ref":"#/components/schemas/PromptCategory","description":"模板类别"},"name":{"type":"string","title":"Name","description":"模板名称"},"content":{"type":"string","title":"Content","description":"模板内容"},"preview":{"type":"string","title":"Preview","description":"预览文案","default":""},"variables":{"items":{"type":"string"},"type":"array","title":"Variables","description":"变量名列表"},"is_default":{"type":"boolean","title":"Is Default","description":"是否为默认提示词","default":false}},"type":"object","required":["category","name","content"],"title":"PromptTemplateCreate","description":"创建提示词模板。id 由后端自动生成;is_system 不可由客户端设置。"},"PromptTemplateRead":{"properties":{"id":{"type":"string","title":"Id","description":"模板 ID"},"category":{"$ref":"#/components/schemas/PromptCategory","description":"模板类别"},"name":{"type":"string","title":"Name","description":"模板名称"},"preview":{"type":"string","title":"Preview","description":"预览文案"},"content":{"type":"string","title":"Content","description":"模板内容"},"variables":{"items":{"type":"string"},"type":"array","title":"Variables","description":"变量名列表"},"is_default":{"type":"boolean","title":"Is Default","description":"是否为默认提示词"},"is_system":{"type":"boolean","title":"Is System","description":"是否为系统预置"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"创建时间"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"最后更新时间"}},"type":"object","required":["id","category","name","preview","content","variables","is_default","is_system","created_at","updated_at"],"title":"PromptTemplateRead","description":"读取提示词模板(含全部字段)。"},"PromptTemplateUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"模板名称"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","description":"模板内容"},"preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview","description":"预览文案"},"variables":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Variables","description":"变量名列表(整体替换)"},"is_default":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Default","description":"是否为默认提示词"}},"type":"object","title":"PromptTemplateUpdate","description":"局部更新提示词模板。不含 id / is_system。"},"PropInfoAnalysisRequest":{"properties":{"relation_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Entity Id","description":"任务关联实体 ID(资产页恢复任务可选)"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"项目 ID(异步任务关联可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(异步任务关联可选)"},"prop_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prop Context","description":"原文道具上下文(可为空;用于提供额外背景,帮助判断缺失信息)"},"prop_description":{"type":"string","minLength":1,"title":"Prop Description","description":"原文道具描述"}},"type":"object","required":["prop_description"],"title":"PropInfoAnalysisRequest","description":"道具信息缺失分析请求。"},"PropInfoAnalysisResult":{"properties":{"issues":{"items":{"type":"string"},"type":"array","title":"Issues"},"optimized_description":{"type":"string","title":"Optimized Description"}},"additionalProperties":false,"type":"object","required":["issues","optimized_description"],"title":"PropInfoAnalysisResult","description":"根据原文道具描述,分析缺少的信息,并给出优化后的可生成道具描述。"},"ProviderCreate":{"properties":{"name":{"type":"string","title":"Name","description":"供应商名称"},"base_url":{"type":"string","title":"Base Url","description":"文本/通用 API Base URL"},"image_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Base Url","description":"图片能力 API Base URL(可选覆盖)"},"video_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Base Url","description":"视频能力 API Base URL(可选覆盖)"},"description":{"type":"string","title":"Description","description":"说明","default":""},"status":{"$ref":"#/components/schemas/ProviderStatus","description":"状态:active/testing/disabled","default":"testing"},"created_by":{"type":"string","title":"Created By","description":"创建人","default":""},"id":{"type":"string","title":"Id","description":"供应商 ID"},"api_key":{"type":"string","title":"Api Key","description":"API Key(敏感,不在响应中回显)","default":""},"api_secret":{"type":"string","title":"Api Secret","description":"API Secret(敏感,不在响应中回显)","default":""}},"type":"object","required":["name","base_url","id"],"title":"ProviderCreate","description":"创建供应商时的请求体,允许填写敏感字段。"},"ProviderRead":{"properties":{"name":{"type":"string","title":"Name","description":"供应商名称"},"base_url":{"type":"string","title":"Base Url","description":"文本/通用 API Base URL"},"image_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Base Url","description":"图片能力 API Base URL(可选覆盖)"},"video_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Base Url","description":"视频能力 API Base URL(可选覆盖)"},"description":{"type":"string","title":"Description","description":"说明","default":""},"status":{"$ref":"#/components/schemas/ProviderStatus","description":"状态:active/testing/disabled","default":"testing"},"created_by":{"type":"string","title":"Created By","description":"创建人","default":""},"id":{"type":"string","title":"Id","description":"供应商 ID"}},"type":"object","required":["name","base_url","id"],"title":"ProviderRead","description":"对外返回的供应商信息(不包含 api_key/api_secret)。"},"ProviderStatus":{"type":"string","enum":["active","testing","disabled"],"title":"ProviderStatus","description":"供应商启用状态。"},"ProviderSupportedRead":{"properties":{"key":{"type":"string","title":"Key","description":"供应商稳定键"},"display_name":{"type":"string","title":"Display Name","description":"供应商展示名"},"aliases":{"items":{"type":"string"},"type":"array","title":"Aliases","description":"可识别别名"},"supported_categories":{"items":{"$ref":"#/components/schemas/ModelCategoryKey"},"type":"array","title":"Supported Categories","description":"支持的模型类别"},"default_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Base Url","description":"默认 API Base URL"},"requires_api_key":{"type":"boolean","title":"Requires Api Key","description":"是否要求 api_key","default":true},"requires_api_secret":{"type":"boolean","title":"Requires Api Secret","description":"是否要求 api_secret","default":false},"is_experimental":{"type":"boolean","title":"Is Experimental","description":"是否实验性供应商","default":false}},"type":"object","required":["key","display_name"],"title":"ProviderSupportedRead","description":"系统支持的供应商能力清单。"},"ProviderUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"供应商名称"},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url","description":"文本/通用 API Base URL"},"image_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Base Url","description":"图片能力 API Base URL(可选覆盖)"},"video_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Base Url","description":"视频能力 API Base URL(可选覆盖)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"说明"},"status":{"anyOf":[{"$ref":"#/components/schemas/ProviderStatus"},{"type":"null"}],"description":"状态:active/testing/disabled"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key","description":"API Key(敏感,不在响应中回显)"},"api_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Secret","description":"API Secret(敏感,不在响应中回显)"}},"type":"object","title":"ProviderUpdate","description":"更新供应商时的可选字段。"},"RenderedPromptResponse":{"properties":{"prompt":{"type":"string","title":"Prompt","description":"渲染后的提示词(已套用模板与变量替换)"},"images":{"items":{"type":"string"},"type":"array","title":"Images","description":"参考图 file_id 列表(自动选择;顺序有效)"}},"type":"object","required":["prompt"],"title":"RenderedPromptResponse"},"RenderedShotFramePromptRead":{"properties":{"base_prompt":{"type":"string","title":"Base Prompt","description":"原始基础提示词(不含图片映射说明)"},"rendered_prompt":{"type":"string","title":"Rendered Prompt","description":"最终提交给模型的提示词(含图片映射说明)"},"images":{"items":{"type":"string"},"type":"array","title":"Images","description":"最终参考图 file_id 列表,顺序与 mappings 一致"},"mappings":{"items":{"$ref":"#/components/schemas/ShotFramePromptMappingRead"},"type":"array","title":"Mappings","description":"图片与实体名称的映射关系,顺序与 images 完全一致"}},"type":"object","required":["base_prompt","rendered_prompt"],"title":"RenderedShotFramePromptRead","description":"关键帧最终生成提示词渲染结果。"},"SceneInfoAnalysisRequest":{"properties":{"relation_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Entity Id","description":"任务关联实体 ID(资产页恢复任务可选)"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"项目 ID(异步任务关联可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(异步任务关联可选)"},"scene_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scene Context","description":"原文场景上下文(可为空;用于提供额外背景,帮助判断缺失信息)"},"scene_description":{"type":"string","minLength":1,"title":"Scene Description","description":"原文场景描述"}},"type":"object","required":["scene_description"],"title":"SceneInfoAnalysisRequest","description":"场景信息缺失分析请求。"},"SceneInfoAnalysisResult":{"properties":{"issues":{"items":{"type":"string"},"type":"array","title":"Issues"},"optimized_description":{"type":"string","title":"Optimized Description"}},"additionalProperties":false,"type":"object","required":["issues","optimized_description"],"title":"SceneInfoAnalysisResult","description":"根据原文场景描述,分析缺少的信息,并给出优化后的可生成场景描述。"},"ScriptConsistencyCheckRequest":{"properties":{"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"项目 ID(异步任务关联可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(异步任务关联可选)"},"script_text":{"type":"string","minLength":1,"title":"Script Text","description":"完整剧本文本"}},"type":"object","required":["script_text"],"title":"ScriptConsistencyCheckRequest","description":"一致性检查请求(角色混淆)。"},"ScriptConsistencyCheckResult":{"properties":{"issues":{"items":{"$ref":"#/components/schemas/ScriptConsistencyIssue"},"type":"array","title":"Issues","description":"问题列表"},"has_issues":{"type":"boolean","title":"Has Issues","description":"是否发现问题"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"总结(可选)"}},"additionalProperties":false,"type":"object","required":["has_issues"],"title":"ScriptConsistencyCheckResult","description":"基于原文的一致性检查结果(聚焦角色混淆)。"},"ScriptConsistencyIssue":{"properties":{"issue_type":{"type":"string","const":"character_confusion","title":"Issue Type","description":"固定为角色混淆类问题","default":"character_confusion"},"character_candidates":{"items":{"type":"string"},"type":"array","title":"Character Candidates","description":"涉及的角色候选(名字/称呼/ID 皆可,优先用原文称呼)"},"description":{"type":"string","title":"Description","description":"问题描述(为什么会混淆)"},"suggestion":{"type":"string","title":"Suggestion","description":"修改建议(如何改写以消除混淆)"},"affected_lines":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Affected Lines","description":"受影响的行号范围,形如 {start_line: x, end_line: y}"},"evidence":{"items":{"$ref":"#/components/schemas/EvidenceSpan"},"type":"array","title":"Evidence","description":"原文依据(可选)"}},"additionalProperties":false,"type":"object","required":["description","suggestion"],"title":"ScriptConsistencyIssue","description":"角色混淆类一致性问题:同一角色在不同镜头被赋予不同身份/行为主体导致混淆。"},"ScriptDividerRequest":{"properties":{"script_text":{"type":"string","minLength":1,"title":"Script Text","description":"完整剧本文本"},"write_to_db":{"type":"boolean","title":"Write To Db","description":"是否将分镜写入数据库(AI Studio shots 表)","default":false},"chapter_id":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(write_to_db=true 时必填)"}},"type":"object","required":["script_text"],"title":"ScriptDividerRequest","description":"剧本分镜请求。"},"ScriptDivisionResult":{"properties":{"shots":{"items":{"$ref":"#/components/schemas/ShotDivision"},"type":"array","title":"Shots","description":"分镜列表"},"total_shots":{"type":"integer","minimum":0.0,"title":"Total Shots","description":"总镜头数"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","description":"拆分说明或建议(可选)"}},"additionalProperties":false,"type":"object","required":["total_shots"],"title":"ScriptDivisionResult","description":"剧本分镜结果:镜头列表(每镜起止行号+预览文本)。"},"ScriptExtractRequest":{"properties":{"project_id":{"type":"string","minLength":1,"title":"Project Id","description":"项目 ID"},"chapter_id":{"type":"string","minLength":1,"title":"Chapter Id","description":"章节 ID"},"script_division":{"additionalProperties":true,"type":"object","title":"Script Division","description":"分镜结果(ScriptDivisionResult 序列化)"},"consistency":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Consistency","description":"一致性检查结果(可选;ScriptConsistencyCheckResult 序列化)"},"refresh_cache":{"type":"boolean","title":"Refresh Cache","description":"是否跳过后端缓存并强制重新提取","default":false}},"type":"object","required":["project_id","chapter_id","script_division"],"title":"ScriptExtractRequest","description":"项目级信息提取请求(最终输出)。"},"ScriptOptimizationResult":{"properties":{"optimized_script_text":{"type":"string","title":"Optimized Script Text","description":"优化后的剧本文本"},"change_summary":{"type":"string","title":"Change Summary","description":"改动摘要(只围绕 issues)"}},"additionalProperties":false,"type":"object","required":["optimized_script_text","change_summary"],"title":"ScriptOptimizationResult","description":"剧本优化输出:仅在发现角色混淆问题时使用。"},"ScriptOptimizeRequest":{"properties":{"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"项目 ID(异步任务关联可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(异步任务关联可选)"},"script_text":{"type":"string","minLength":1,"title":"Script Text","description":"原文剧本文本"},"consistency":{"additionalProperties":true,"type":"object","title":"Consistency","description":"一致性检查输出(ScriptConsistencyCheckResult 序列化)"}},"type":"object","required":["script_text","consistency"],"title":"ScriptOptimizeRequest","description":"剧本优化请求(基于一致性检查结果)。"},"ScriptSimplificationResult":{"properties":{"simplified_script_text":{"type":"string","title":"Simplified Script Text","description":"精简后的剧本文本"},"simplification_summary":{"type":"string","title":"Simplification Summary","description":"精简策略摘要(说明删改原则)"}},"additionalProperties":false,"type":"object","required":["simplified_script_text","simplification_summary"],"title":"ScriptSimplificationResult","description":"剧本精简输出:在保留剧情主体与连续性的前提下压缩篇幅。"},"ScriptSimplifyRequest":{"properties":{"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"项目 ID(异步任务关联可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(异步任务关联可选)"},"script_text":{"type":"string","minLength":1,"title":"Script Text","description":"原文剧本文本"}},"type":"object","required":["script_text"],"title":"ScriptSimplifyRequest","description":"智能精简剧本请求。"},"ShotAssetOverviewItem":{"properties":{"key":{"type":"string","title":"Key","description":"合并键:type:name"},"type":{"type":"string","enum":["character","prop","scene","costume"],"title":"Type","description":"实体类型:character/prop/scene/costume"},"name":{"type":"string","title":"Name","description":"资产名称"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"候选描述(来自 extraction payload)"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail","description":"缩略图"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"缩略图或参考图文件 ID"},"source":{"type":"string","enum":["linked","candidate","both"],"title":"Source","description":"来源:linked/candidate/both"},"candidate_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Candidate Id","description":"候选项 ID"},"candidate_status":{"anyOf":[{"$ref":"#/components/schemas/ShotCandidateStatus"},{"type":"null"}],"description":"候选确认状态"},"linked_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linked Entity Id","description":"当前已关联实体 ID"},"linked_image_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Linked Image Id","description":"当前已关联实体的 image 行 ID"},"is_linked":{"type":"boolean","title":"Is Linked","description":"当前是否已关联到镜头"}},"type":"object","required":["key","type","name","source","is_linked"],"title":"ShotAssetOverviewItem","description":"分镜资产总览项:统一返回已关联资产与提取候选的合并视图。"},"ShotAssetsOverviewRead":{"properties":{"shot_id":{"type":"string","title":"Shot Id","description":"镜头 ID"},"skip_extraction":{"type":"boolean","title":"Skip Extraction","description":"是否明确跳过提取"},"status":{"$ref":"#/components/schemas/ShotStatus","description":"镜头流程状态"},"summary":{"$ref":"#/components/schemas/ShotAssetsOverviewSummary","description":"总览统计"},"items":{"items":{"$ref":"#/components/schemas/ShotAssetOverviewItem"},"type":"array","title":"Items","description":"资产总览项"}},"type":"object","required":["shot_id","skip_extraction","status","summary"],"title":"ShotAssetsOverviewRead"},"ShotAssetsOverviewSummary":{"properties":{"linked_count":{"type":"integer","title":"Linked Count","description":"已关联项数量"},"pending_count":{"type":"integer","title":"Pending Count","description":"待确认候选数量"},"ignored_count":{"type":"integer","title":"Ignored Count","description":"已忽略候选数量"},"total_count":{"type":"integer","title":"Total Count","description":"总项数(含 ignored)"}},"type":"object","required":["linked_count","pending_count","ignored_count","total_count"],"title":"ShotAssetsOverviewSummary"},"ShotCandidateStatus":{"type":"string","enum":["pending","linked","ignored"],"title":"ShotCandidateStatus","description":"镜头提取候选确认状态。"},"ShotCandidateType":{"type":"string","enum":["character","scene","prop","costume"],"title":"ShotCandidateType","description":"镜头提取候选类型。"},"ShotCharacterLinkCreate":{"properties":{"shot_id":{"type":"string","title":"Shot Id"},"character_id":{"type":"string","title":"Character Id"},"index":{"type":"integer","title":"Index","default":0},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["shot_id","character_id"],"title":"ShotCharacterLinkCreate"},"ShotCharacterLinkRead":{"properties":{"id":{"type":"integer","title":"Id","description":"关联行 ID"},"shot_id":{"type":"string","title":"Shot Id","description":"镜头 ID"},"character_id":{"type":"string","title":"Character Id","description":"角色 ID"},"index":{"type":"integer","title":"Index","description":"镜头内角色排序","default":0},"note":{"type":"string","title":"Note","description":"备注","default":""}},"type":"object","required":["id","shot_id","character_id"],"title":"ShotCharacterLinkRead"},"ShotCreate":{"properties":{"id":{"type":"string","title":"Id","description":"镜头 ID"},"chapter_id":{"type":"string","title":"Chapter Id","description":"所属章节 ID"},"index":{"type":"integer","title":"Index","description":"镜头序号(章节内唯一)"},"title":{"type":"string","title":"Title","description":"镜头标题"},"thumbnail":{"type":"string","title":"Thumbnail","description":"缩略图 URL/路径","default":""},"status":{"$ref":"#/components/schemas/ShotStatus","description":"镜头状态","default":"pending"},"skip_extraction":{"type":"boolean","title":"Skip Extraction","description":"是否明确跳过信息提取","default":false},"script_excerpt":{"type":"string","title":"Script Excerpt","description":"剧本摘录","default":""},"generated_video_file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated Video File Id","description":"已生成视频关联的文件 ID(files.id,type=video)"}},"type":"object","required":["id","chapter_id","index","title"],"title":"ShotCreate"},"ShotDetailCreate":{"properties":{"id":{"type":"string","title":"Id","description":"镜头 ID(与 shots.id 共享主键)"},"camera_shot":{"$ref":"#/components/schemas/CameraShotType","description":"景别"},"angle":{"$ref":"#/components/schemas/CameraAngle","description":"机位角度"},"movement":{"$ref":"#/components/schemas/CameraMovement","description":"运镜方式"},"scene_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scene Id","description":"关联场景 ID(可空)"},"duration":{"type":"integer","title":"Duration","description":"时长(秒)","default":0},"override_video_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Override Video Size","description":"分镜级视频尺寸覆盖;为空表示继承项目默认"},"override_video_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Override Video Ratio","description":"分镜级视频比例覆盖;为空表示继承项目默认"},"mood_tags":{"items":{"type":"string"},"type":"array","title":"Mood Tags","description":"情绪标签"},"atmosphere":{"type":"string","title":"Atmosphere","description":"氛围描述","default":""},"follow_atmosphere":{"type":"boolean","title":"Follow Atmosphere","description":"是否沿用氛围","default":true},"has_bgm":{"type":"boolean","title":"Has Bgm","description":"是否包含 BGM","default":false},"vfx_type":{"$ref":"#/components/schemas/VFXType","description":"视效类型","default":"NONE"},"vfx_note":{"type":"string","title":"Vfx Note","description":"视效说明","default":""},"first_frame_prompt":{"type":"string","title":"First Frame Prompt","description":"镜头分镜首帧提示词","default":""},"last_frame_prompt":{"type":"string","title":"Last Frame Prompt","description":"镜头分镜尾帧提示词","default":""},"key_frame_prompt":{"type":"string","title":"Key Frame Prompt","description":"镜头分镜关键帧提示词","default":""}},"type":"object","required":["id","camera_shot","angle","movement"],"title":"ShotDetailCreate"},"ShotDetailRead":{"properties":{"id":{"type":"string","title":"Id","description":"镜头 ID(与 shots.id 共享主键)"},"camera_shot":{"$ref":"#/components/schemas/CameraShotType","description":"景别"},"angle":{"$ref":"#/components/schemas/CameraAngle","description":"机位角度"},"movement":{"$ref":"#/components/schemas/CameraMovement","description":"运镜方式"},"scene_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scene Id","description":"关联场景 ID(可空)"},"duration":{"type":"integer","title":"Duration","description":"时长(秒)","default":0},"override_video_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Override Video Size","description":"分镜级视频尺寸覆盖;为空表示继承项目默认"},"override_video_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Override Video Ratio","description":"分镜级视频比例覆盖;为空表示继承项目默认"},"mood_tags":{"items":{"type":"string"},"type":"array","title":"Mood Tags","description":"情绪标签"},"atmosphere":{"type":"string","title":"Atmosphere","description":"氛围描述","default":""},"follow_atmosphere":{"type":"boolean","title":"Follow Atmosphere","description":"是否沿用氛围","default":true},"has_bgm":{"type":"boolean","title":"Has Bgm","description":"是否包含 BGM","default":false},"vfx_type":{"$ref":"#/components/schemas/VFXType","description":"视效类型","default":"NONE"},"vfx_note":{"type":"string","title":"Vfx Note","description":"视效说明","default":""},"first_frame_prompt":{"type":"string","title":"First Frame Prompt","description":"镜头分镜首帧提示词","default":""},"last_frame_prompt":{"type":"string","title":"Last Frame Prompt","description":"镜头分镜尾帧提示词","default":""},"key_frame_prompt":{"type":"string","title":"Key Frame Prompt","description":"镜头分镜关键帧提示词","default":""}},"type":"object","required":["id","camera_shot","angle","movement"],"title":"ShotDetailRead"},"ShotDetailUpdate":{"properties":{"camera_shot":{"anyOf":[{"$ref":"#/components/schemas/CameraShotType"},{"type":"null"}]},"angle":{"anyOf":[{"$ref":"#/components/schemas/CameraAngle"},{"type":"null"}]},"movement":{"anyOf":[{"$ref":"#/components/schemas/CameraMovement"},{"type":"null"}]},"scene_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scene Id"},"duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration"},"override_video_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Override Video Size"},"override_video_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Override Video Ratio"},"mood_tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Mood Tags"},"atmosphere":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Atmosphere"},"follow_atmosphere":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Follow Atmosphere"},"has_bgm":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Bgm"},"vfx_type":{"anyOf":[{"$ref":"#/components/schemas/VFXType"},{"type":"null"}]},"vfx_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vfx Note"},"first_frame_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Frame Prompt"},"last_frame_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Frame Prompt"},"key_frame_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Frame Prompt"}},"type":"object","title":"ShotDetailUpdate"},"ShotDialogLineCreate":{"properties":{"shot_detail_id":{"type":"string","title":"Shot Detail Id"},"index":{"type":"integer","title":"Index","default":0},"text":{"type":"string","title":"Text"},"line_mode":{"$ref":"#/components/schemas/DialogueLineMode","default":"DIALOGUE"},"speaker_character_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speaker Character Id"},"target_character_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Character Id"},"speaker_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speaker Name"},"target_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Name"}},"type":"object","required":["shot_detail_id","text"],"title":"ShotDialogLineCreate"},"ShotDialogLineRead":{"properties":{"id":{"type":"integer","title":"Id","description":"对话行 ID"},"shot_detail_id":{"type":"string","title":"Shot Detail Id","description":"所属镜头细节 ID"},"index":{"type":"integer","title":"Index","description":"行号(镜头内排序)","default":0},"text":{"type":"string","title":"Text","description":"台词内容"},"line_mode":{"$ref":"#/components/schemas/DialogueLineMode","description":"对白模式","default":"DIALOGUE"},"speaker_character_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speaker Character Id","description":"说话角色 ID"},"target_character_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Character Id","description":"听者角色 ID"},"speaker_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speaker Name","description":"说话角色名称(用于回填关联;可空)"},"target_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Name","description":"听者角色名称(用于回填关联;可空)"}},"type":"object","required":["id","shot_detail_id","text"],"title":"ShotDialogLineRead"},"ShotDialogLineUpdate":{"properties":{"index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Index"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"line_mode":{"anyOf":[{"$ref":"#/components/schemas/DialogueLineMode"},{"type":"null"}]},"speaker_character_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speaker Character Id"},"target_character_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Character Id"},"speaker_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speaker Name"},"target_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Name"}},"type":"object","title":"ShotDialogLineUpdate"},"ShotDialogueCandidateStatus":{"type":"string","enum":["pending","accepted","ignored"],"title":"ShotDialogueCandidateStatus","description":"镜头对白提取候选确认状态。"},"ShotDivision":{"properties":{"index":{"type":"integer","minimum":1.0,"title":"Index","description":"镜头序号(章节内唯一)"},"start_line":{"type":"integer","minimum":1.0,"title":"Start Line","description":"起始行号(1-based)"},"end_line":{"type":"integer","minimum":1.0,"title":"End Line","description":"结束行号(1-based)"},"script_excerpt":{"type":"string","title":"Script Excerpt","description":"镜头对应的剧本摘录/文本"},"shot_name":{"type":"string","title":"Shot Name","description":"镜头名称(分镜名/镜头标题)","default":""},"time_of_day":{"anyOf":[{"type":"string","enum":["DAY","NIGHT","DAWN","DUSK","UNKNOWN","日","夜","黎明","黄昏","不明","未知"]},{"type":"null"}],"title":"Time Of Day","description":"时间(日/夜/未知等,可选)"}},"additionalProperties":false,"type":"object","required":["index","start_line","end_line","script_excerpt"],"title":"ShotDivision","description":"剧本分镜中的单镜信息:行号 + 预览文本(可选弱语义)。"},"ShotExtractedCandidateLinkRequest":{"properties":{"linked_entity_id":{"type":"string","title":"Linked Entity Id","description":"确认关联到的实体 ID"}},"type":"object","required":["linked_entity_id"],"title":"ShotExtractedCandidateLinkRequest"},"ShotExtractedCandidateRead":{"properties":{"id":{"type":"integer","title":"Id","description":"候选项 ID"},"shot_id":{"type":"string","title":"Shot Id","description":"所属镜头 ID"},"candidate_type":{"$ref":"#/components/schemas/ShotCandidateType","description":"候选类型"},"candidate_name":{"type":"string","title":"Candidate Name","description":"提取出的候选名称"},"candidate_status":{"$ref":"#/components/schemas/ShotCandidateStatus","description":"候选确认状态"},"linked_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linked Entity Id","description":"已关联实体 ID"},"source":{"type":"string","title":"Source","description":"候选来源"},"payload":{"additionalProperties":true,"type":"object","title":"Payload","description":"候选附加信息"},"confirmed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Confirmed At","description":"确认时间"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"创建时间"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"更新时间"}},"type":"object","required":["id","shot_id","candidate_type","candidate_name","candidate_status","source","created_at","updated_at"],"title":"ShotExtractedCandidateRead"},"ShotExtractedDialogueCandidateAcceptRequest":{"properties":{"index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Index","description":"写入对白行时使用的排序;为空则使用候选排序"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text","description":"接受时可覆盖对白文本"},"line_mode":{"anyOf":[{"$ref":"#/components/schemas/DialogueLineMode"},{"type":"null"}],"description":"接受时可覆盖对白模式"},"speaker_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speaker Name","description":"接受时可覆盖说话角色名称"},"target_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Name","description":"接受时可覆盖听者角色名称"}},"type":"object","title":"ShotExtractedDialogueCandidateAcceptRequest"},"ShotExtractedDialogueCandidateRead":{"properties":{"id":{"type":"integer","title":"Id","description":"对白候选项 ID"},"shot_id":{"type":"string","title":"Shot Id","description":"所属镜头 ID"},"index":{"type":"integer","title":"Index","description":"镜头内对白候选排序"},"text":{"type":"string","title":"Text","description":"提取出的对白文本"},"line_mode":{"$ref":"#/components/schemas/DialogueLineMode","description":"对白模式"},"speaker_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speaker Name","description":"说话角色名称"},"target_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Name","description":"听者角色名称"},"candidate_status":{"$ref":"#/components/schemas/ShotDialogueCandidateStatus","description":"对白候选确认状态"},"linked_dialog_line_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Linked Dialog Line Id","description":"已接受后关联的对白行 ID"},"source":{"type":"string","title":"Source","description":"候选来源"},"payload":{"additionalProperties":true,"type":"object","title":"Payload","description":"候选附加信息"},"confirmed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Confirmed At","description":"确认时间"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"创建时间"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"更新时间"}},"type":"object","required":["id","shot_id","index","text","line_mode","candidate_status","source","created_at","updated_at"],"title":"ShotExtractedDialogueCandidateRead"},"ShotExtractionSummaryRead":{"properties":{"state":{"type":"string","enum":["not_extracted","extracted_empty","extracted_pending","extracted_resolved","skipped"],"title":"State","description":"镜头提取确认状态摘要"},"has_extracted":{"type":"boolean","title":"Has Extracted","description":"是否已执行过提取"},"last_extracted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Extracted At","description":"最近一次提取完成时间"},"asset_candidate_total":{"type":"integer","title":"Asset Candidate Total","description":"资产候选总数","default":0},"dialogue_candidate_total":{"type":"integer","title":"Dialogue Candidate Total","description":"对白候选总数","default":0},"pending_asset_count":{"type":"integer","title":"Pending Asset Count","description":"待确认资产候选数","default":0},"pending_dialogue_count":{"type":"integer","title":"Pending Dialogue Count","description":"待确认对白候选数","default":0}},"type":"object","required":["state","has_extracted"],"title":"ShotExtractionSummaryRead"},"ShotFrameImageCreate":{"properties":{"shot_detail_id":{"type":"string","title":"Shot Detail Id"},"frame_type":{"$ref":"#/components/schemas/ShotFrameType"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"format":{"type":"string","title":"Format","default":"png"}},"type":"object","required":["shot_detail_id","frame_type"],"title":"ShotFrameImageCreate"},"ShotFrameImageRead":{"properties":{"id":{"type":"integer","title":"Id","description":"图片行 ID"},"shot_detail_id":{"type":"string","title":"Shot Detail Id","description":"所属镜头细节 ID"},"frame_type":{"$ref":"#/components/schemas/ShotFrameType","description":"帧类型:first/last/key"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"关联的 FileItem ID(可为空,允许先创建占位)"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width","description":"宽(px)"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height","description":"高(px)"},"format":{"type":"string","title":"Format","description":"格式","default":"png"}},"type":"object","required":["id","shot_detail_id","frame_type"],"title":"ShotFrameImageRead"},"ShotFrameImageTaskRequest":{"properties":{"model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Id","description":"可选模型 ID(models.id);不传则使用 ModelSettings.default_image_model_id;Provider 由模型关联反查"},"frame_type":{"$ref":"#/components/schemas/ShotFrameType","description":"first | last | key"},"prompt":{"type":"string","minLength":1,"title":"Prompt","description":"提示词(由前端传入,创建任务接口必填)。"},"images":{"items":{"$ref":"#/components/schemas/ShotLinkedAssetItem"},"type":"array","title":"Images","description":"参考资产条目列表(可多张,顺序有效)。后端会使用 item.file_id 作为参考图;无效条目会被跳过。"}},"type":"object","required":["frame_type","prompt"],"title":"ShotFrameImageTaskRequest","description":"镜头分镜帧图片生成请求体:只根据 `shot_id + frame_type` 定位 ShotFrameImage。\n\n用于替代旧接口中通过 `image_id` 直接传入 ShotFrameImage.id 的方式。"},"ShotFrameImageUpdate":{"properties":{"frame_type":{"anyOf":[{"$ref":"#/components/schemas/ShotFrameType"},{"type":"null"}]},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"}},"type":"object","title":"ShotFrameImageUpdate"},"ShotFramePromptMappingRead":{"properties":{"token":{"type":"string","title":"Token","description":"提示词中的图片占位 token,如 图1 / 图2"},"type":{"type":"string","enum":["character","prop","scene","costume"],"title":"Type","description":"实体类型:character/prop/scene/costume"},"id":{"type":"string","title":"Id","description":"实体 ID(如 character_id/prop_id/scene_id/costume_id)"},"name":{"type":"string","title":"Name","description":"实体名称"},"file_id":{"type":"string","title":"File Id","description":"本次渲染与生成使用的文件 ID"}},"type":"object","required":["token","type","id","name","file_id"],"title":"ShotFramePromptMappingRead","description":"关键帧提示词渲染后的图片映射关系。"},"ShotFramePromptRenderRequest":{"properties":{"frame_type":{"$ref":"#/components/schemas/ShotFrameType","description":"first | last | key"},"prompt":{"type":"string","minLength":1,"title":"Prompt","description":"原始基础提示词。渲染接口要求显式传入,用于生成最终提示词。"},"images":{"items":{"$ref":"#/components/schemas/ShotLinkedAssetItem"},"type":"array","title":"Images","description":"参考资产条目列表(可多张,顺序有效)。后端会使用 item.file_id 作为参考图;无效条目会被跳过。"}},"type":"object","required":["frame_type","prompt"],"title":"ShotFramePromptRenderRequest","description":"镜头分镜帧提示词渲染请求体。"},"ShotFramePromptRequest":{"properties":{"shot_id":{"type":"string","title":"Shot Id","description":"镜头 ID"},"frame_type":{"type":"string","title":"Frame Type","description":"first | last | key"}},"type":"object","required":["shot_id","frame_type"],"title":"ShotFramePromptRequest","description":"镜头分镜帧提示词生成任务请求。"},"ShotFrameType":{"type":"string","enum":["first","last","key"],"title":"ShotFrameType","description":"镜头分镜帧类型:首帧/尾帧/关键帧。"},"ShotLinkedAssetItem":{"properties":{"type":{"type":"string","enum":["character","prop","scene","costume"],"title":"Type","description":"实体类型:character/prop/scene/costume"},"id":{"type":"string","title":"Id","description":"实体 ID(如 character_id/prop_id/scene_id/costume_id)"},"image_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Image Id","description":"最佳缩略图对应的 image 行 ID(如 PropImage.id);无图则为 null"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"最佳缩略图对应的文件 ID(files.id);用于参考图输入;无图则为 null"},"name":{"type":"string","title":"Name","description":"实体名称"},"thumbnail":{"type":"string","title":"Thumbnail","description":"缩略图下载地址(/api/v1/studio/files/{file_id}/download)","default":""}},"type":"object","required":["type","id","name"],"title":"ShotLinkedAssetItem","description":"按分镜聚合返回的关联资产条目(角色/道具/场景/服装)。"},"ShotPreparationLinkEntityType":{"type":"string","enum":["character","scene","prop","costume"],"title":"ShotPreparationLinkEntityType"},"ShotPreparationLinkRequest":{"properties":{"project_id":{"type":"string","title":"Project Id","description":"项目 ID"},"chapter_id":{"type":"string","title":"Chapter Id","description":"章节 ID"},"entity_type":{"$ref":"#/components/schemas/ShotPreparationLinkEntityType","description":"准备页关联的实体类型"},"linked_entity_id":{"type":"string","title":"Linked Entity Id","description":"要关联的实体 ID"}},"type":"object","required":["project_id","chapter_id","entity_type","linked_entity_id"],"title":"ShotPreparationLinkRequest"},"ShotPreparationMutationAction":{"type":"string","enum":["link_asset_candidate","ignore_asset_candidate","accept_dialogue_candidate","ignore_dialogue_candidate","skip_extraction","resume_extraction"],"title":"ShotPreparationMutationAction"},"ShotPreparationMutationResultRead":{"properties":{"action":{"$ref":"#/components/schemas/ShotPreparationMutationAction","description":"本次执行的准备页动作"},"state":{"$ref":"#/components/schemas/ShotPreparationStateRead","description":"动作完成后的最新准备页聚合状态"}},"type":"object","required":["action","state"],"title":"ShotPreparationMutationResultRead","description":"准备页命令执行后的统一响应。"},"ShotPreparationStateRead":{"properties":{"shot":{"$ref":"#/components/schemas/ShotRead","description":"当前镜头最新状态"},"assets_overview":{"$ref":"#/components/schemas/ShotAssetsOverviewRead","description":"资产确认区聚合状态"},"dialogue_candidates":{"items":{"$ref":"#/components/schemas/ShotExtractedDialogueCandidateRead"},"type":"array","title":"Dialogue Candidates","description":"当前待处理/已存在的对白候选"},"saved_dialogue_lines":{"items":{"$ref":"#/components/schemas/ShotDialogLineRead"},"type":"array","title":"Saved Dialogue Lines","description":"当前已保存的对白行"},"pending_confirm_count":{"type":"integer","title":"Pending Confirm Count","description":"当前仍待确认的总数量(资产 + 对白)"},"ready_for_generation":{"type":"boolean","title":"Ready For Generation","description":"当前镜头是否已完成准备,可进入后续生成"}},"type":"object","required":["shot","assets_overview","pending_confirm_count","ready_for_generation"],"title":"ShotPreparationStateRead","description":"分镜准备页聚合状态。"},"ShotPromptAssetRef":{"properties":{"type":{"type":"string","enum":["character","prop","scene","costume"],"title":"Type","description":"资产类型"},"name":{"type":"string","title":"Name","description":"资产名称"},"description":{"type":"string","title":"Description","description":"资产描述或提取候选描述","default":""},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"可作为参考图的文件 ID"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail","description":"缩略图"}},"type":"object","required":["type","name"],"title":"ShotPromptAssetRef","description":"用于提示词渲染的镜头资产引用。"},"ShotPromptCameraInfo":{"properties":{"camera_shot":{"type":"string","title":"Camera Shot","description":"景别","default":""},"angle":{"type":"string","title":"Angle","description":"机位角度","default":""},"movement":{"type":"string","title":"Movement","description":"运镜方式","default":""},"duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration","description":"镜头时长(秒)"}},"type":"object","title":"ShotPromptCameraInfo","description":"用于提示词渲染的镜头语言信息。"},"ShotRead":{"properties":{"id":{"type":"string","title":"Id","description":"镜头 ID"},"chapter_id":{"type":"string","title":"Chapter Id","description":"所属章节 ID"},"index":{"type":"integer","title":"Index","description":"镜头序号(章节内唯一)"},"title":{"type":"string","title":"Title","description":"镜头标题"},"thumbnail":{"type":"string","title":"Thumbnail","description":"缩略图 URL/路径","default":""},"status":{"$ref":"#/components/schemas/ShotStatus","description":"镜头状态","default":"pending"},"skip_extraction":{"type":"boolean","title":"Skip Extraction","description":"是否明确跳过信息提取","default":false},"script_excerpt":{"type":"string","title":"Script Excerpt","description":"剧本摘录","default":""},"generated_video_file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated Video File Id","description":"已生成视频关联的文件 ID(files.id,type=video)"},"last_extracted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Extracted At","description":"最近一次完成信息提取的时间"},"extraction":{"$ref":"#/components/schemas/ShotExtractionSummaryRead","description":"镜头提取状态摘要"}},"type":"object","required":["id","chapter_id","index","title","extraction"],"title":"ShotRead"},"ShotRuntimeSummaryRead":{"properties":{"shot_id":{"type":"string","title":"Shot Id","description":"镜头 ID"},"has_active_tasks":{"type":"boolean","title":"Has Active Tasks","description":"是否存在进行中的关联任务"},"has_active_video_tasks":{"type":"boolean","title":"Has Active Video Tasks","description":"是否存在进行中的视频任务"},"has_active_prompt_tasks":{"type":"boolean","title":"Has Active Prompt Tasks","description":"是否存在进行中的提示词任务"},"has_active_frame_tasks":{"type":"boolean","title":"Has Active Frame Tasks","description":"是否存在进行中的分镜帧图片任务"},"active_task_count":{"type":"integer","title":"Active Task Count","description":"进行中的唯一任务数"}},"type":"object","required":["shot_id","has_active_tasks","has_active_video_tasks","has_active_prompt_tasks","has_active_frame_tasks","active_task_count"],"title":"ShotRuntimeSummaryRead"},"ShotSkipExtractionUpdate":{"properties":{"skip":{"type":"boolean","title":"Skip","description":"是否明确跳过信息提取"}},"type":"object","required":["skip"],"title":"ShotSkipExtractionUpdate"},"ShotStatus":{"type":"string","enum":["pending","generating","ready"],"title":"ShotStatus","description":"镜头生成状态(更多是“生产流程”而非剧情状态)。"},"ShotUpdate":{"properties":{"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id"},"index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Index"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail"},"status":{"anyOf":[{"$ref":"#/components/schemas/ShotStatus"},{"type":"null"}]},"skip_extraction":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Skip Extraction"},"script_excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Script Excerpt"},"generated_video_file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated Video File Id"}},"type":"object","title":"ShotUpdate"},"ShotVideoPromptPackRead":{"properties":{"shot_id":{"type":"string","title":"Shot Id","description":"镜头 ID"},"title":{"type":"string","title":"Title","description":"镜头标题","default":""},"script_excerpt":{"type":"string","title":"Script Excerpt","description":"剧本摘录","default":""},"action_beats":{"items":{"type":"string"},"type":"array","title":"Action Beats","description":"动作/场景要点"},"dialogue_summary":{"type":"string","title":"Dialogue Summary","description":"对白摘要","default":""},"characters":{"items":{"$ref":"#/components/schemas/ShotPromptAssetRef"},"type":"array","title":"Characters","description":"角色引用"},"scene":{"anyOf":[{"$ref":"#/components/schemas/ShotPromptAssetRef"},{"type":"null"}],"description":"场景引用"},"props":{"items":{"$ref":"#/components/schemas/ShotPromptAssetRef"},"type":"array","title":"Props","description":"道具引用"},"costumes":{"items":{"$ref":"#/components/schemas/ShotPromptAssetRef"},"type":"array","title":"Costumes","description":"服装引用"},"camera":{"$ref":"#/components/schemas/ShotPromptCameraInfo","description":"镜头语言"},"atmosphere":{"type":"string","title":"Atmosphere","description":"氛围描述","default":""},"visual_style":{"type":"string","title":"Visual Style","description":"项目视觉风格","default":""},"style":{"type":"string","title":"Style","description":"项目题材/风格","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","description":"默认负面提示词","default":""}},"type":"object","required":["shot_id"],"title":"ShotVideoPromptPackRead","description":"视频提示词渲染前的标准上下文包。"},"ShotVideoPromptPreviewRead":{"properties":{"shot_id":{"type":"string","title":"Shot Id","description":"镜头 ID"},"template_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Id","description":"使用的提示词模板 ID"},"template_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Name","description":"使用的提示词模板名称"},"rendered_prompt":{"type":"string","title":"Rendered Prompt","description":"渲染后的提示词"},"pack":{"$ref":"#/components/schemas/ShotVideoPromptPackRead","description":"渲染上下文包"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings","description":"渲染时发现的非阻塞提示"}},"type":"object","required":["shot_id","rendered_prompt","pack"],"title":"ShotVideoPromptPreviewRead","description":"视频提示词预览结果。"},"ShotVideoReadinessCheck":{"properties":{"key":{"type":"string","title":"Key","description":"检查项 key"},"ok":{"type":"boolean","title":"Ok","description":"是否通过"},"message":{"type":"string","title":"Message","description":"面向前端展示的说明"}},"type":"object","required":["key","ok","message"],"title":"ShotVideoReadinessCheck","description":"单项视频生成准备度检查结果。"},"ShotVideoReadinessRead":{"properties":{"shot_id":{"type":"string","title":"Shot Id","description":"镜头 ID"},"reference_mode":{"type":"string","title":"Reference Mode","description":"参考模式"},"ready":{"type":"boolean","title":"Ready","description":"是否满足当前 reference_mode 下的视频生成条件"},"checks":{"items":{"$ref":"#/components/schemas/ShotVideoReadinessCheck"},"type":"array","title":"Checks","description":"准备度检查项"}},"type":"object","required":["shot_id","reference_mode","ready"],"title":"ShotVideoReadinessRead","description":"镜头视频生成准备度。"},"StudioAssetDraft":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"资产 ID(已落库时回填,如 scene_id / prop_id / costume_id)"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"关联的文件 ID(可空)"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail","description":"缩略图下载地址(可空)"},"name":{"type":"string","title":"Name","description":"名称(同项目内建议唯一)"},"description":{"type":"string","title":"Description","description":"描述","default":""},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"标签"},"prompt_template_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt Template Id","description":"提示词模板 ID(可空)"},"view_count":{"type":"integer","minimum":1.0,"title":"View Count","description":"计划生成视角图数量","default":1}},"additionalProperties":false,"type":"object","required":["name"],"title":"StudioAssetDraft","description":"Studio 资产草稿(Scene/Prop/Costume)。\n\n导入 API 未传 id 时由服务端生成;分镜详情回填时可带 scene_id/prop_id/costume_id。"},"StudioCharacterDraft":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"角色 ID(已落库时回填 character_id)"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"关联的文件 ID(可空)"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail","description":"缩略图下载地址(可空)"},"index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Index","description":"镜头内角色排序(shot_character_links.index)"},"name":{"type":"string","title":"Name","description":"角色名称(同项目内建议唯一)"},"description":{"type":"string","title":"Description","description":"角色描述","default":""},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"标签(可选)"},"costume_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Costume Name","description":"服装名称(可选,导入时映射到 costume_id)"},"prop_names":{"items":{"type":"string"},"type":"array","title":"Prop Names","description":"角色常用道具名称列表(可选)"}},"additionalProperties":false,"type":"object","required":["name"],"title":"StudioCharacterDraft","description":"Studio 角色草稿。\n\n导入 API 未传 id 时由服务端生成;分镜详情回填时可带 character_id。"},"StudioImageTaskRequest":{"properties":{"model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Id","description":"可选模型 ID(models.id);不传则使用 ModelSettings.default_image_model_id;Provider 由模型关联反查"},"image_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Image Id","description":"图片模型 ID,如 ActorImage.id / SceneImage.id / PropImage.id 等;必须与路径主体 ID 匹配"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt","description":"提示词(由前端传入)。创建任务接口必填;render-prompt 接口可不传"},"images":{"items":{"type":"string"},"type":"array","title":"Images","description":"参考图 file_id 列表(可多张,顺序有效)。创建任务接口会基于 file_id 从数据中解析为参考图"}},"type":"object","title":"StudioImageTaskRequest","description":"Studio 专用图片任务请求体:可选模型 ID,不传则用默认图片模型;供应商由模型反查。\n\nimage_id 表示具体的图片模型 ID,例如:\n- 演员图片:ActorImage.id\n- 场景图片:SceneImage.id\n- 道具图片:PropImage.id\n- 服装图片:CostumeImage.id\n- 角色图片:CharacterImage.id\n- 分镜帧图片:ShotFrameImage.id"},"StudioScriptExtractionDraft":{"properties":{"project_id":{"type":"string","title":"Project Id","description":"项目 ID(必填)"},"chapter_id":{"type":"string","title":"Chapter Id","description":"章节 ID(必填,用于创建 shots/links)"},"script_text":{"type":"string","title":"Script Text","description":"剧本文本(可为优化后版本)"},"characters":{"items":{"$ref":"#/components/schemas/StudioCharacterDraft"},"type":"array","title":"Characters"},"scenes":{"items":{"$ref":"#/components/schemas/StudioAssetDraft"},"type":"array","title":"Scenes"},"props":{"items":{"$ref":"#/components/schemas/StudioAssetDraft"},"type":"array","title":"Props"},"costumes":{"items":{"$ref":"#/components/schemas/StudioAssetDraft"},"type":"array","title":"Costumes"},"shots":{"items":{"$ref":"#/components/schemas/StudioShotDraft"},"type":"array","title":"Shots","description":"镜头草稿列表"}},"additionalProperties":false,"type":"object","required":["project_id","chapter_id","script_text"],"title":"StudioScriptExtractionDraft","description":"用于导入 Studio 的提取结果草稿(name-based)。"},"StudioShotDraft":{"properties":{"index":{"type":"integer","minimum":1.0,"title":"Index","description":"镜头序号(章节内唯一)"},"title":{"type":"string","title":"Title","description":"镜头标题"},"script_excerpt":{"type":"string","title":"Script Excerpt","description":"剧本摘录","default":""},"scene_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scene Name","description":"场景名称(可选)"},"character_names":{"items":{"type":"string"},"type":"array","title":"Character Names","description":"本镜出现角色名称列表"},"prop_names":{"items":{"type":"string"},"type":"array","title":"Prop Names","description":"本镜关键道具名称列表"},"costume_names":{"items":{"type":"string"},"type":"array","title":"Costume Names","description":"本镜服装名称列表"},"dialogue_lines":{"items":{"$ref":"#/components/schemas/StudioShotDraftDialogueLine"},"type":"array","title":"Dialogue Lines","description":"对白列表"},"actions":{"items":{"type":"string"},"type":"array","title":"Actions","description":"动作/场景描述"}},"additionalProperties":false,"type":"object","required":["index","title"],"title":"StudioShotDraft","description":"镜头草稿:不含 shot_id,由导入 API 生成;引用实体用 name。"},"StudioShotDraftDialogueLine":{"properties":{"index":{"type":"integer","minimum":0.0,"title":"Index","description":"镜头内排序","default":0},"text":{"type":"string","title":"Text","description":"台词内容"},"line_mode":{"type":"string","enum":["DIALOGUE","VOICE_OVER","OFF_SCREEN","PHONE"],"title":"Line Mode","description":"对白模式","default":"DIALOGUE"},"speaker_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speaker Name","description":"说话角色名称(可空)"},"target_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Name","description":"听者角色名称(可空)"}},"additionalProperties":false,"type":"object","required":["text"],"title":"StudioShotDraftDialogueLine","description":"镜头对白草稿:speaker/target 使用角色 name,导入时映射为 character_id。"},"StyleOption":{"properties":{"value":{"type":"string","title":"Value","description":"选项值"},"label":{"type":"string","title":"Label","description":"选项展示文案"}},"type":"object","required":["value","label"],"title":"StyleOption","description":"通用下拉选项。"},"TaskCancelRead":{"properties":{"task_id":{"type":"string","title":"Task Id"},"status":{"$ref":"#/components/schemas/TaskStatus"},"cancel_requested":{"type":"boolean","title":"Cancel Requested","description":"是否已登记取消请求"},"cancel_requested_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cancel Requested At Ts","description":"请求取消时间戳"},"effective_immediately":{"type":"boolean","title":"Effective Immediately","description":"是否已立即取消完成","default":false}},"type":"object","required":["task_id","status","cancel_requested"],"title":"TaskCancelRead"},"TaskCancelRequest":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"取消原因(可选)"}},"type":"object","title":"TaskCancelRequest"},"TaskCreated":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"任务 ID"}},"type":"object","required":["task_id"],"title":"TaskCreated"},"TaskLinkAdoptRead":{"properties":{"task_id":{"type":"string","title":"Task Id"},"link_type":{"type":"string","title":"Link Type","description":"project | chapter | shot"},"entity_id":{"type":"string","title":"Entity Id","description":"项目/章节/镜头 ID"},"is_adopted":{"type":"boolean","title":"Is Adopted","description":"是否采用(仅可正向变更为 true)"}},"type":"object","required":["task_id","link_type","entity_id","is_adopted"],"title":"TaskLinkAdoptRead","description":"采用状态更新结果。"},"TaskLinkAdoptRequest":{"properties":{"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"绑定项目 ID(可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"绑定章节 ID(可选)"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id","description":"绑定镜头 ID(可选)"},"task_id":{"type":"string","title":"Task Id","description":"任务 ID"}},"type":"object","required":["task_id"],"title":"TaskLinkAdoptRequest","description":"更新采用状态请求:task_id + 三选一绑定对象(project_id/chapter_id/shot_id)。"},"TaskListItemRead":{"properties":{"task_id":{"type":"string","title":"Task Id"},"task_kind":{"type":"string","title":"Task Kind","description":"业务任务类型"},"status":{"$ref":"#/components/schemas/TaskStatus"},"progress":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Progress"},"cancel_requested":{"type":"boolean","title":"Cancel Requested","description":"是否已请求取消","default":false},"cancel_requested_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cancel Requested At Ts","description":"请求取消时间戳"},"started_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Started At Ts","description":"任务开始执行时间戳"},"finished_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Finished At Ts","description":"任务结束时间戳"},"elapsed_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elapsed Ms","description":"任务累计执行耗时(毫秒)"},"created_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At Ts","description":"任务创建时间戳"},"updated_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Updated At Ts","description":"任务更新时间戳"},"executor_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Executor Type","description":"执行器类型,如 celery"},"executor_task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Executor Task Id","description":"执行器侧任务 ID"},"relation_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Type","description":"业务关联类型"},"relation_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Entity Id","description":"业务关联实体 ID"},"resource_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Type","description":"资源类型"},"navigate_relation_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navigate Relation Type","description":"前端默认跳转关联类型"},"navigate_relation_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navigate Relation Entity Id","description":"前端默认跳转关联实体 ID"}},"type":"object","required":["task_id","task_kind","status","progress"],"title":"TaskListItemRead"},"TaskResultRead":{"properties":{"task_id":{"type":"string","title":"Task Id"},"status":{"$ref":"#/components/schemas/TaskStatus"},"progress":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Progress"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result"},"error":{"type":"string","title":"Error","default":""},"cancel_requested":{"type":"boolean","title":"Cancel Requested","description":"是否已请求取消","default":false},"cancel_requested_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cancel Requested At Ts","description":"请求取消时间戳"},"started_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Started At Ts","description":"任务开始执行时间戳"},"finished_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Finished At Ts","description":"任务结束时间戳"},"elapsed_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elapsed Ms","description":"任务累计执行耗时(毫秒)"}},"type":"object","required":["task_id","status","progress"],"title":"TaskResultRead"},"TaskStatus":{"type":"string","enum":["pending","running","streaming","succeeded","failed","cancelled"],"title":"TaskStatus","description":"任务状态枚举。"},"TaskStatusRead":{"properties":{"task_id":{"type":"string","title":"Task Id"},"status":{"$ref":"#/components/schemas/TaskStatus"},"progress":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Progress"},"cancel_requested":{"type":"boolean","title":"Cancel Requested","description":"是否已请求取消","default":false},"cancel_requested_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cancel Requested At Ts","description":"请求取消时间戳"},"started_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Started At Ts","description":"任务开始执行时间戳"},"finished_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Finished At Ts","description":"任务结束时间戳"},"elapsed_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elapsed Ms","description":"任务累计执行耗时(毫秒)"}},"type":"object","required":["task_id","status","progress"],"title":"TaskStatusRead"},"VFXType":{"type":"string","enum":["NONE","PARTICLES","VOLUMETRIC_FOG","CG_DOUBLE","DIGITAL_ENVIRONMENT","MATTE_PAINTING","FIRE_SMOKE","WATER_SIM","DESTRUCTION","ENERGY_MAGIC","COMPOSITING_CLEANUP","SLOW_MOTION_TIME","OTHER"],"title":"VFXType","description":"视效类型(与 `app.schemas.skills.common.VFXType` 对齐,存英文 code)。"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VariantAnalysisRequest":{"properties":{"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"项目 ID(异步任务关联可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(异步任务关联可选)"},"merged_library":{"additionalProperties":true,"type":"object","title":"Merged Library","description":"合并后的实体库(EntityLibrary 的序列化形式;来自 EntityMerger 输出的 merged_library)"},"all_shot_extractions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"All Shot Extractions","description":"所有镜头提取结果"},"script_division":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Script Division","description":"脚本分镜结果(可选;ScriptDivisionResult 序列化),用于章节/段落分组"}},"type":"object","required":["merged_library","all_shot_extractions"],"title":"VariantAnalysisRequest","description":"变体分析请求。"},"VariantAnalysisResult":{"properties":{"costume_timelines":{"items":{"$ref":"#/components/schemas/CostumeTimeline"},"type":"array","title":"Costume Timelines","description":"各角色服装演变时间线"},"variant_suggestions":{"items":{"$ref":"#/components/schemas/VariantSuggestion"},"type":"array","title":"Variant Suggestions","description":"变体建议列表"},"chapter_variants":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Chapter Variants","description":"章节变体建议"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","description":"分析说明"}},"additionalProperties":false,"type":"object","title":"VariantAnalysisResult","description":"变体分析结果。"},"VariantSuggestion":{"properties":{"entity_id":{"type":"string","title":"Entity Id","description":"实体ID"},"entity_name":{"type":"string","title":"Entity Name","description":"实体名称"},"entity_type":{"type":"string","title":"Entity Type","description":"实体类型(character/scene/prop/location)"},"suggestion":{"type":"string","title":"Suggestion","description":"变体建议说明"},"affected_shots":{"items":{"type":"integer"},"type":"array","title":"Affected Shots","description":"涉及的镜头"},"evidence":{"items":{"$ref":"#/components/schemas/EvidenceSpan"},"type":"array","title":"Evidence","description":"原文依据(可选)"}},"additionalProperties":false,"type":"object","required":["entity_id","entity_name","entity_type","suggestion"],"title":"VariantSuggestion","description":"变体建议。"},"VideoGenerationTaskRequest":{"properties":{"shot_id":{"type":"string","title":"Shot Id","description":"镜头 ID"},"reference_mode":{"type":"string","enum":["first","last","key","first_last","first_last_key","text_only"],"title":"Reference Mode","description":"参考模式:first | last | key | first_last | first_last_key | text_only"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt","description":"视频提示词(text_only 必填)"},"images":{"items":{"type":"string"},"type":"array","title":"Images","description":"参考图 file_id 列表,数量需与 reference_mode 严格匹配"},"size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Size","description":"分辨率(可选),如 720x1280"},"ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ratio","description":"画幅比例(可选),如 16:9 / 9:16"}},"type":"object","required":["shot_id","reference_mode"],"title":"VideoGenerationTaskRequest","description":"视频生成任务请求。"},"VideoPromptPreviewResponse":{"properties":{"prompt":{"type":"string","title":"Prompt","description":"最终用于视频生成的提示词"},"images":{"items":{"type":"string"},"type":"array","title":"Images","description":"关联参考图 file_id 列表"}},"type":"object","required":["prompt"],"title":"VideoPromptPreviewResponse"}}}} \ No newline at end of file +{"openapi":"3.1.0","info":{"title":"Jellyfish API","version":"0.1.0"},"paths":{"/api/v1/health":{"get":{"tags":["health"],"summary":"V1 Health","operationId":"v1_health_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_dict_"}}}}}}},"/api/v1/film/tasks/video/preview-prompt":{"post":{"tags":["film"],"summary":"视频提示词预览","description":"预览视频生成的提示词与自动关联参考图。","operationId":"preview_video_generation_prompt_api_v1_film_tasks_video_preview_prompt_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoGenerationTaskRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_VideoPromptPreviewResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/film/tasks/video":{"post":{"tags":["film"],"summary":"视频生成(任务版)","description":"创建视频生成任务并后台执行,结果通过 /tasks/{task_id}/result 获取。","operationId":"create_video_generation_task_api_v1_film_tasks_video_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoGenerationTaskRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskCreated_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/film/tasks/shot-frame-prompts":{"post":{"tags":["film"],"summary":"镜头分镜帧提示词生成(任务版)","operationId":"create_shot_frame_prompt_task_api_v1_film_tasks_shot_frame_prompts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotFramePromptRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskCreated_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/film/tasks":{"get":{"tags":["film"],"summary":"全局任务列表(任务中心)","operationId":"list_tasks_api_v1_film_tasks_get","parameters":[{"name":"statuses","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/TaskStatus"}},{"type":"null"}],"description":"按任务状态过滤,可多选","title":"Statuses"},"description":"按任务状态过滤,可多选"},{"name":"task_kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按 task_kind 过滤","title":"Task Kind"},"description":"按 task_kind 过滤"},{"name":"relation_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按 relation_type 过滤","title":"Relation Type"},"description":"按 relation_type 过滤"},{"name":"relation_entity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按 relation_entity_id 过滤","title":"Relation Entity Id"},"description":"按 relation_entity_id 过滤"},{"name":"recent_seconds","in":"query","required":false,"schema":{"type":"integer","maximum":86400,"minimum":0,"description":"默认返回最近结束任务的时间窗口(秒)","default":300,"title":"Recent Seconds"},"description":"默认返回最近结束任务的时间窗口(秒)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"页码","default":1,"title":"Page"},"description":"页码"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"每页条数","default":20,"title":"Page Size"},"description":"每页条数"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_TaskListItemRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/film/tasks/{task_id}/status":{"get":{"tags":["film"],"summary":"查询任务状态/进度(轮询)","operationId":"get_task_status_api_v1_film_tasks__task_id__status_get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskStatusRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/film/tasks/{task_id}/result":{"get":{"tags":["film"],"summary":"获取任务结果","operationId":"get_task_result_api_v1_film_tasks__task_id__result_get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskResultRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/film/tasks/{task_id}/cancel":{"post":{"tags":["film"],"summary":"请求取消任务","operationId":"cancel_task_api_v1_film_tasks__task_id__cancel_post","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskCancelRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskCancelRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/film/task-links/adopt":{"patch":{"tags":["film"],"summary":"更新任务关联的采用状态(仅可正向变更)","description":"将指定任务链接的状态设为 accepted;已采用不可改为未采用。","operationId":"adopt_task_link_api_v1_film_task_links_adopt_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskLinkAdoptRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskLinkAdoptRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/film/task-links":{"get":{"tags":["film"],"summary":"生成任务关联列表(分页,支持多条件过滤)","operationId":"list_task_links_api_v1_film_task_links_get","parameters":[{"name":"resource_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按 resource_type 过滤","title":"Resource Type"},"description":"按 resource_type 过滤"},{"name":"relation_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按 relation_type 过滤","title":"Relation Type"},"description":"按 relation_type 过滤"},{"name":"relation_entity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按 relation_entity_id 过滤","title":"Relation Entity Id"},"description":"按 relation_entity_id 过滤"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按关联状态过滤(accepted/todo/rejected)","title":"Status"},"description":"按关联状态过滤(accepted/todo/rejected)"},{"name":"task_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按 task_id 过滤","title":"Task Id"},"description":"按 task_id 过滤"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"排序字段:updated_at/created_at/id/status","title":"Order"},"description":"排序字段:updated_at/created_at/id/status"},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","description":"是否倒序;默认 true","default":true,"title":"Is Desc"},"description":"是否倒序;默认 true"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"页码","default":1,"title":"Page"},"description":"页码"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"每页条数","default":10,"title":"Page Size"},"description":"每页条数"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_GenerationTaskLinkRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["film"],"summary":"创建生成任务关联","operationId":"create_task_link_api_v1_film_task_links_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationTaskLinkCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_GenerationTaskLinkRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/film/task-links/{link_id}":{"get":{"tags":["film"],"summary":"获取生成任务关联详情","operationId":"get_task_link_api_v1_film_task_links__link_id__get","parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_GenerationTaskLinkRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["film"],"summary":"更新生成任务关联(不支持直接修改 is_adopted)","operationId":"update_task_link_api_v1_film_task_links__link_id__patch","parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","title":"Link Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationTaskLinkUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_GenerationTaskLinkRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["film"],"summary":"删除生成任务关联","operationId":"delete_task_link_api_v1_film_task_links__link_id__delete","parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/llm/providers":{"get":{"tags":["llm"],"summary":"列出模型供应商(分页)","operationId":"list_providers_api_v1_llm_providers_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键字,过滤 name/description","title":"Q"},"description":"关键字,过滤 name/description"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"排序字段:name, created_at, updated_at","title":"Order"},"description":"排序字段:name, created_at, updated_at"},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","description":"是否倒序","default":false,"title":"Is Desc"},"description":"是否倒序"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"页码","default":1,"title":"Page"},"description":"页码"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"每页条数","default":10,"title":"Page Size"},"description":"每页条数"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_ProviderRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["llm"],"summary":"创建模型供应商","operationId":"create_provider_api_v1_llm_providers_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProviderRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/llm/providers/supported":{"get":{"tags":["llm"],"summary":"列出系统支持的供应商能力","operationId":"list_supported_providers_api_v1_llm_providers_supported_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ModelCategoryKey"},{"type":"null"}],"description":"按模型类别过滤:text/image/video","title":"Category"},"description":"按模型类别过滤:text/image/video"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_list_ProviderSupportedRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/llm/image-generation-options":{"get":{"tags":["llm"],"summary":"获取当前默认图片模型的关键帧规格选项","operationId":"get_image_generation_options_api_v1_llm_image_generation_options_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ImageGenerationOptionsRead_"}}}}}}},"/api/v1/llm/video-generation-options":{"get":{"tags":["llm"],"summary":"获取当前默认视频模型的动态比例选项","operationId":"get_video_generation_options_api_v1_llm_video_generation_options_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_VideoGenerationOptionsRead_"}}}}}}},"/api/v1/llm/providers/{provider_id}":{"get":{"tags":["llm"],"summary":"获取单个模型供应商","operationId":"get_provider_api_v1_llm_providers__provider_id__get","parameters":[{"name":"provider_id","in":"path","required":true,"schema":{"type":"string","title":"Provider Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProviderRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["llm"],"summary":"更新模型供应商","operationId":"update_provider_api_v1_llm_providers__provider_id__patch","parameters":[{"name":"provider_id","in":"path","required":true,"schema":{"type":"string","title":"Provider Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProviderRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["llm"],"summary":"删除模型供应商","operationId":"delete_provider_api_v1_llm_providers__provider_id__delete","parameters":[{"name":"provider_id","in":"path","required":true,"schema":{"type":"string","title":"Provider Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/llm/models":{"get":{"tags":["llm"],"summary":"列出模型(分页)","operationId":"list_models_api_v1_llm_models_get","parameters":[{"name":"provider_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按供应商过滤","title":"Provider Id"},"description":"按供应商过滤"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ModelCategoryKey"},{"type":"null"}],"description":"按模型类别过滤","title":"Category"},"description":"按模型类别过滤"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键字,过滤 name/description","title":"Q"},"description":"关键字,过滤 name/description"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"排序字段:name, category, created_at, updated_at","title":"Order"},"description":"排序字段:name, category, created_at, updated_at"},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","description":"是否倒序","default":false,"title":"Is Desc"},"description":"是否倒序"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"页码","default":1,"title":"Page"},"description":"页码"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"每页条数","default":10,"title":"Page Size"},"description":"每页条数"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_ModelRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["llm"],"summary":"创建模型","operationId":"create_model_api_v1_llm_models_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ModelRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/llm/models/{model_id}":{"get":{"tags":["llm"],"summary":"获取单个模型","operationId":"get_model_api_v1_llm_models__model_id__get","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ModelRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["llm"],"summary":"更新模型","operationId":"update_model_api_v1_llm_models__model_id__patch","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ModelRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["llm"],"summary":"删除模型","operationId":"delete_model_api_v1_llm_models__model_id__delete","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/llm/model-settings":{"get":{"tags":["llm"],"summary":"获取模型全局设置(单例)","operationId":"get_model_settings_api_v1_llm_model_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ModelSettingsRead_"}}}}}},"put":{"tags":["llm"],"summary":"更新模型全局设置(单例)","operationId":"update_model_settings_api_v1_llm_model_settings_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelSettingsUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ModelSettingsRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/projects/style-options":{"get":{"tags":["studio/projects"],"summary":"获取项目风格候选项","operationId":"get_project_style_options_api_v1_studio_projects_style_options_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProjectStyleOptionsRead_"}}}}}}},"/api/v1/studio/projects":{"get":{"tags":["studio/projects"],"summary":"项目列表(分页)","operationId":"list_projects_api_v1_studio_projects_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键字,过滤 name/description","title":"Q"},"description":"关键字,过滤 name/description"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"排序字段","title":"Order"},"description":"排序字段"},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","description":"是否倒序","default":false,"title":"Is Desc"},"description":"是否倒序"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_ProjectRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/projects"],"summary":"创建项目","operationId":"create_project_api_v1_studio_projects_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProjectRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/projects/{project_id}":{"get":{"tags":["studio/projects"],"summary":"获取项目","operationId":"get_project_api_v1_studio_projects__project_id__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProjectRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["studio/projects"],"summary":"更新项目","operationId":"update_project_api_v1_studio_projects__project_id__patch","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProjectRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/projects"],"summary":"删除项目","operationId":"delete_project_api_v1_studio_projects__project_id__delete","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/chapters":{"get":{"tags":["studio/chapters"],"summary":"章节列表(分页)","operationId":"list_chapters_api_v1_studio_chapters_get","parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按项目过滤","title":"Project Id"},"description":"按项目过滤"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键字,过滤 title/summary","title":"Q"},"description":"关键字,过滤 title/summary"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"排序字段","title":"Order"},"description":"排序字段"},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","description":"是否倒序","default":false,"title":"Is Desc"},"description":"是否倒序"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_ChapterRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/chapters"],"summary":"创建章节","operationId":"create_chapter_api_v1_studio_chapters_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapterCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ChapterRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/chapters/{chapter_id}":{"get":{"tags":["studio/chapters"],"summary":"获取章节","operationId":"get_chapter_api_v1_studio_chapters__chapter_id__get","parameters":[{"name":"chapter_id","in":"path","required":true,"schema":{"type":"string","title":"Chapter Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ChapterRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["studio/chapters"],"summary":"更新章节","operationId":"update_chapter_api_v1_studio_chapters__chapter_id__patch","parameters":[{"name":"chapter_id","in":"path","required":true,"schema":{"type":"string","title":"Chapter Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapterUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ChapterRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/chapters"],"summary":"删除章节","operationId":"delete_chapter_api_v1_studio_chapters__chapter_id__delete","parameters":[{"name":"chapter_id","in":"path","required":true,"schema":{"type":"string","title":"Chapter Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots":{"get":{"tags":["studio/shots"],"summary":"镜头列表(分页)","operationId":"list_shots_api_v1_studio_shots_get","parameters":[{"name":"chapter_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按章节过滤","title":"Chapter Id"},"description":"按章节过滤"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键字,过滤 title/script_excerpt","title":"Q"},"description":"关键字,过滤 title/script_excerpt"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"}},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Desc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_ShotRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/shots"],"summary":"创建镜头","operationId":"create_shot_api_v1_studio_shots_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/runtime-summary":{"get":{"tags":["studio/shots"],"summary":"按章节获取镜头运行时任务态摘要","operationId":"list_shot_runtime_summary_api_v1_studio_shots_runtime_summary_get","parameters":[{"name":"chapter_id","in":"query","required":true,"schema":{"type":"string","description":"章节 ID","title":"Chapter Id"},"description":"章节 ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_list_ShotRuntimeSummaryRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/extraction-draft":{"get":{"tags":["studio/shots"],"summary":"分镜详情:按镜头关联拼装 StudioScriptExtractionDraft","operationId":"get_shot_extraction_draft_api_v1_studio_shots__shot_id__extraction_draft_get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_StudioScriptExtractionDraft_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/extracted-candidates":{"get":{"tags":["studio/shots"],"summary":"获取镜头提取候选项","operationId":"get_shot_extracted_candidates_api_v1_studio_shots__shot_id__extracted_candidates_get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_list_ShotExtractedCandidateRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/extracted-dialogue-candidates":{"get":{"tags":["studio/shots"],"summary":"获取镜头提取对白候选项","operationId":"get_shot_extracted_dialogue_candidates_api_v1_studio_shots__shot_id__extracted_dialogue_candidates_get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_list_ShotExtractedDialogueCandidateRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/assets-overview":{"get":{"tags":["studio/shots"],"summary":"获取镜头资产总览(已关联资产 + 提取候选)","operationId":"get_shot_assets_overview_api_api_v1_studio_shots__shot_id__assets_overview_get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotAssetsOverviewRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/preparation-state":{"get":{"tags":["studio/shots"],"summary":"获取镜头准备页聚合状态","operationId":"get_shot_preparation_state_api_api_v1_studio_shots__shot_id__preparation_state_get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotPreparationStateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/preparation-link":{"post":{"tags":["studio/shots"],"summary":"准备页关联现有实体并返回最新聚合状态","operationId":"link_existing_asset_for_preparation_api_api_v1_studio_shots__shot_id__preparation_link_post","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotPreparationLinkRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotPreparationMutationResultRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/video-prompt-preview":{"get":{"tags":["studio/shots"],"summary":"预览镜头视频提示词","operationId":"preview_shot_video_prompt_api_v1_studio_shots__shot_id__video_prompt_preview_get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}},{"name":"template_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"指定视频提示词模板 ID;不传则使用默认模板","title":"Template Id"},"description":"指定视频提示词模板 ID;不传则使用默认模板"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotVideoPromptPreviewRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/video-readiness":{"get":{"tags":["studio/shots"],"summary":"获取镜头视频生成准备度","operationId":"get_shot_video_readiness_api_api_v1_studio_shots__shot_id__video_readiness_get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}},{"name":"reference_mode","in":"query","required":false,"schema":{"type":"string","description":"参考模式:first/last/key/first_last/first_last_key/text_only","default":"text_only","title":"Reference Mode"},"description":"参考模式:first/last/key/first_last/first_last_key/text_only"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotVideoReadinessRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/skip-extraction":{"patch":{"tags":["studio/shots"],"summary":"设置是否跳过镜头信息提取","operationId":"update_shot_skip_extraction_api_v1_studio_shots__shot_id__skip_extraction_patch","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotSkipExtractionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotPreparationMutationResultRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/extracted-candidates/{candidate_id}/link":{"patch":{"tags":["studio/shots"],"summary":"确认并关联镜头提取候选项","operationId":"link_extracted_candidate_api_v1_studio_shots_extracted_candidates__candidate_id__link_patch","parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"integer","title":"Candidate Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotExtractedCandidateLinkRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotPreparationMutationResultRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/extracted-candidates/{candidate_id}/ignore":{"patch":{"tags":["studio/shots"],"summary":"忽略镜头提取候选项","operationId":"ignore_extracted_candidate_api_v1_studio_shots_extracted_candidates__candidate_id__ignore_patch","parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"integer","title":"Candidate Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotPreparationMutationResultRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/extracted-dialogue-candidates/{candidate_id}/accept":{"patch":{"tags":["studio/shots"],"summary":"接受镜头提取对白候选项","operationId":"accept_extracted_dialogue_candidate_api_v1_studio_shots_extracted_dialogue_candidates__candidate_id__accept_patch","parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"integer","title":"Candidate Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ShotExtractedDialogueCandidateAcceptRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotPreparationMutationResultRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/extracted-dialogue-candidates/{candidate_id}/ignore":{"patch":{"tags":["studio/shots"],"summary":"忽略镜头提取对白候选项","operationId":"ignore_extracted_dialogue_candidate_api_v1_studio_shots_extracted_dialogue_candidates__candidate_id__ignore_patch","parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"integer","title":"Candidate Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotPreparationMutationResultRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}":{"get":{"tags":["studio/shots"],"summary":"获取镜头","operationId":"get_shot_api_v1_studio_shots__shot_id__get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["studio/shots"],"summary":"更新镜头","operationId":"update_shot_api_v1_studio_shots__shot_id__patch","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/shots"],"summary":"删除镜头","operationId":"delete_shot_api_v1_studio_shots__shot_id__delete","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shots/{shot_id}/linked-assets":{"get":{"tags":["studio/shots"],"summary":"获取镜头关联的角色/道具/场景/服装(分页)","operationId":"list_shot_linked_assets_api_v1_studio_shots__shot_id__linked_assets_get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_ShotLinkedAssetItem__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-details":{"get":{"tags":["studio/shot-details"],"summary":"镜头细节列表(分页)","operationId":"list_shot_details_api_v1_studio_shot_details_get","parameters":[{"name":"shot_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按镜头过滤(id 同 shot_id)","title":"Shot Id"},"description":"按镜头过滤(id 同 shot_id)"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"}},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Desc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_ShotDetailRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/shot-details"],"summary":"创建镜头细节","operationId":"create_shot_detail_api_v1_studio_shot_details_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotDetailCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotDetailRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-details/{shot_id}":{"get":{"tags":["studio/shot-details"],"summary":"获取镜头细节","operationId":"get_shot_detail_api_v1_studio_shot_details__shot_id__get","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotDetailRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["studio/shot-details"],"summary":"更新镜头细节","operationId":"update_shot_detail_api_v1_studio_shot_details__shot_id__patch","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotDetailUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotDetailRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/shot-details"],"summary":"删除镜头细节","operationId":"delete_shot_detail_api_v1_studio_shot_details__shot_id__delete","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-dialog-lines":{"get":{"tags":["studio/shot-dialog-lines"],"summary":"镜头对话行列表(分页)","operationId":"list_shot_dialog_lines_api_v1_studio_shot_dialog_lines_get","parameters":[{"name":"shot_detail_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按镜头细节过滤","title":"Shot Detail Id"},"description":"按镜头细节过滤"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键字,过滤 text","title":"Q"},"description":"关键字,过滤 text"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"}},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Desc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_ShotDialogLineRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/shot-dialog-lines"],"summary":"创建镜头对话行","operationId":"create_shot_dialog_line_api_v1_studio_shot_dialog_lines_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotDialogLineCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotDialogLineRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-dialog-lines/{line_id}":{"patch":{"tags":["studio/shot-dialog-lines"],"summary":"更新镜头对话行","operationId":"update_shot_dialog_line_api_v1_studio_shot_dialog_lines__line_id__patch","parameters":[{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotDialogLineUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotDialogLineRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/shot-dialog-lines"],"summary":"删除镜头对话行","operationId":"delete_shot_dialog_line_api_v1_studio_shot_dialog_lines__line_id__delete","parameters":[{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-links/{entity_type}":{"get":{"tags":["studio/shot-links"],"summary":"项目-章节-镜头-实体关联列表(分页)","operationId":"list_project_entity_links_api_v1_studio_shot_links__entity_type__get","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"}},{"name":"chapter_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id"}},{"name":"shot_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id"}},{"name":"asset_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Id"}},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"}},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Desc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_Any__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-links/actor":{"post":{"tags":["studio/shot-links"],"summary":"创建项目-章节-镜头-演员关联","operationId":"create_project_actor_link_api_v1_studio_shot_links_actor_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAssetLinkCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProjectActorLinkRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-links/actor/{link_id}":{"delete":{"tags":["studio/shot-links"],"summary":"删除项目-章节-镜头-演员关联","operationId":"delete_project_actor_link_api_v1_studio_shot_links_actor__link_id__delete","parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-links/scene":{"post":{"tags":["studio/shot-links"],"summary":"创建项目-章节-镜头-场景关联","operationId":"create_project_scene_link_api_v1_studio_shot_links_scene_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAssetLinkCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProjectSceneLinkRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-links/scene/{link_id}":{"delete":{"tags":["studio/shot-links"],"summary":"删除项目-章节-镜头-场景关联","operationId":"delete_project_scene_link_api_v1_studio_shot_links_scene__link_id__delete","parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-links/prop":{"post":{"tags":["studio/shot-links"],"summary":"创建项目-章节-镜头-道具关联","operationId":"create_project_prop_link_api_v1_studio_shot_links_prop_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAssetLinkCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProjectPropLinkRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-links/prop/{link_id}":{"delete":{"tags":["studio/shot-links"],"summary":"删除项目-章节-镜头-道具关联","operationId":"delete_project_prop_link_api_v1_studio_shot_links_prop__link_id__delete","parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-links/costume":{"post":{"tags":["studio/shot-links"],"summary":"创建项目-章节-镜头-服装关联","operationId":"create_project_costume_link_api_v1_studio_shot_links_costume_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAssetLinkCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ProjectCostumeLinkRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-links/costume/{link_id}":{"delete":{"tags":["studio/shot-links"],"summary":"删除项目-章节-镜头-服装关联","operationId":"delete_project_costume_link_api_v1_studio_shot_links_costume__link_id__delete","parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-frame-images":{"get":{"tags":["studio/shot-frame-images"],"summary":"镜头分镜帧图片列表(分页)","operationId":"list_shot_frame_images_api_v1_studio_shot_frame_images_get","parameters":[{"name":"shot_detail_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按镜头细节过滤","title":"Shot Detail Id"},"description":"按镜头细节过滤"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"}},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Desc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_ShotFrameImageRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/shot-frame-images"],"summary":"创建镜头分镜帧图片","operationId":"create_shot_frame_image_api_v1_studio_shot_frame_images_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotFrameImageCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotFrameImageRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-frame-images/{image_id}":{"patch":{"tags":["studio/shot-frame-images"],"summary":"更新镜头分镜帧图片","operationId":"update_shot_frame_image_api_v1_studio_shot_frame_images__image_id__patch","parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"integer","title":"Image Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotFrameImageUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotFrameImageRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/shot-frame-images"],"summary":"删除镜头分镜帧图片","operationId":"delete_shot_frame_image_api_v1_studio_shot_frame_images__image_id__delete","parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"integer","title":"Image Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/entities/existence-check":{"post":{"tags":["studio/entities"],"summary":"批量检测资产名称是否存在(模糊匹配,不分页)","operationId":"check_entity_names_existence_api_v1_studio_entities_existence_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityNameExistenceCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_EntityNameExistenceCheckResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/entities/{entity_type}":{"get":{"tags":["studio/entities"],"summary":"统一实体列表(分页)","operationId":"list_entities_api_v1_studio_entities__entity_type__get","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键字,过滤 name/description","title":"Q"},"description":"关键字,过滤 name/description"},{"name":"style","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"题材/风格(单值)","title":"Style"},"description":"题材/风格(单值)"},{"name":"visual_style","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"画面表现形式(单值:真人/动漫)","title":"Visual Style"},"description":"画面表现形式(单值:真人/动漫)"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"}},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Desc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_dict_str__Any___"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/entities"],"summary":"统一创建实体","operationId":"create_entity_api_v1_studio_entities__entity_type__post","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_dict_str__Any__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/entities/{entity_type}/{entity_id}":{"get":{"tags":["studio/entities"],"summary":"统一获取实体","operationId":"get_entity_api_v1_studio_entities__entity_type___entity_id__get","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_dict_str__Any__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["studio/entities"],"summary":"统一更新实体","operationId":"update_entity_api_v1_studio_entities__entity_type___entity_id__patch","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_dict_str__Any__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/entities"],"summary":"统一删除实体","operationId":"delete_entity_api_v1_studio_entities__entity_type___entity_id__delete","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/entities/{entity_type}/{entity_id}/images":{"get":{"tags":["studio/entities"],"summary":"统一实体图片列表(分页)","operationId":"list_entity_images_api_v1_studio_entities__entity_type___entity_id__images_get","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"}},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Desc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_dict_str__Any___"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/entities"],"summary":"统一创建实体图片","operationId":"create_entity_image_api_v1_studio_entities__entity_type___entity_id__images_post","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_dict_str__Any__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/entities/{entity_type}/{entity_id}/images/{image_id}":{"patch":{"tags":["studio/entities"],"summary":"统一更新实体图片","operationId":"update_entity_image_api_v1_studio_entities__entity_type___entity_id__images__image_id__patch","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"image_id","in":"path","required":true,"schema":{"type":"integer","title":"Image Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_dict_str__Any__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/entities"],"summary":"统一删除实体图片","operationId":"delete_entity_image_api_v1_studio_entities__entity_type___entity_id__images__image_id__delete","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"image_id","in":"path","required":true,"schema":{"type":"integer","title":"Image Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/prompts":{"get":{"tags":["studio/prompts"],"summary":"提示词模板列表(分页)","operationId":"list_prompt_templates_api_v1_studio_prompts_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PromptCategory"},{"type":"null"}],"description":"按类别过滤","title":"Category"},"description":"按类别过滤"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键字,过滤 name","title":"Q"},"description":"关键字,过滤 name"},{"name":"is_default","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"过滤是否为默认","title":"Is Default"},"description":"过滤是否为默认"},{"name":"is_system","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"过滤是否为系统预置","title":"Is System"},"description":"过滤是否为系统预置"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"}},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Desc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_PromptTemplateRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/prompts"],"summary":"创建提示词模板","operationId":"create_prompt_template_api_v1_studio_prompts_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptTemplateCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PromptTemplateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/prompts/categories":{"get":{"tags":["studio/prompts"],"summary":"获取提示词类别枚举(含中文映射)","operationId":"list_prompt_categories_api_v1_studio_prompts_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_list_PromptCategoryOptionRead__"}}}}}}},"/api/v1/studio/prompts/{template_id}":{"get":{"tags":["studio/prompts"],"summary":"获取提示词模板详情","operationId":"get_prompt_template_api_v1_studio_prompts__template_id__get","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PromptTemplateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["studio/prompts"],"summary":"局部更新提示词模板","operationId":"update_prompt_template_api_v1_studio_prompts__template_id__patch","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptTemplateUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PromptTemplateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/prompts"],"summary":"删除提示词模板","operationId":"delete_prompt_template_api_v1_studio_prompts__template_id__delete","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/files":{"get":{"tags":["studio/files"],"summary":"文件列表(分页)","operationId":"list_files_api_api_v1_studio_files_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"关键字,过滤 name","title":"Q"},"description":"关键字,过滤 name"},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order"}},{"name":"is_desc","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Is Desc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Page Size"}},{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按 file_usages 限定项目;提供后仅返回该项目下有关联记录的文件","title":"Project Id"},"description":"按 file_usages 限定项目;提供后仅返回该项目下有关联记录的文件"},{"name":"chapter_title","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"章节标题(精确匹配,与 project_id 联用)","title":"Chapter Title"},"description":"章节标题(精确匹配,与 project_id 联用)"},{"name":"shot_title","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"镜头标题(精确匹配,与 project_id 联用)","title":"Shot Title"},"description":"镜头标题(精确匹配,与 project_id 联用)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PaginatedData_FileRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/files/upload":{"post":{"tags":["studio/files"],"summary":"上传文件并创建 FileItem 记录","operationId":"upload_file_api_api_v1_studio_files_upload_post","parameters":[{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_file_api_api_v1_studio_files_upload_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_FileRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/files/{file_id}/download":{"get":{"tags":["studio/files"],"summary":"下载文件二进制内容","operationId":"download_file_api_api_v1_studio_files__file_id__download_get","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/files/{file_id}/storage-info":{"get":{"tags":["studio/files"],"summary":"获取对象存储详情(head_object)","operationId":"get_file_storage_info_api_api_v1_studio_files__file_id__storage_info_get","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_dict_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/files/{file_id}":{"get":{"tags":["studio/files"],"summary":"获取文件详情(元信息 + file_usages)","operationId":"get_file_detail_api_v1_studio_files__file_id__get","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_FileDetailRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["studio/files"],"summary":"更新文件元信息","operationId":"update_file_meta_api_v1_studio_files__file_id__patch","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_FileRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio/files"],"summary":"删除文件(记录 + 存储对象)","operationId":"delete_file_api_api_v1_studio_files__file_id__delete","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_NoneType_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/image-tasks/actors/{actor_id}/image-tasks":{"post":{"tags":["studio/image-tasks"],"summary":"演员图片生成(任务版)","description":"为指定演员创建图片生成任务,并通过 `GenerationTaskLink` 关联。","operationId":"create_actor_image_generation_task_api_v1_studio_image_tasks_actors__actor_id__image_tasks_post","parameters":[{"name":"actor_id","in":"path","required":true,"schema":{"type":"string","title":"Actor Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioImageTaskRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskCreated_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/image-tasks/actors/{actor_id}/render-prompt":{"post":{"tags":["studio/image-tasks"],"summary":"演员图片提示词渲染","operationId":"render_actor_image_prompt_api_v1_studio_image_tasks_actors__actor_id__render_prompt_post","parameters":[{"name":"actor_id","in":"path","required":true,"schema":{"type":"string","title":"Actor Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioImageTaskRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_RenderedPromptResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/image-tasks/assets/{asset_type}/{asset_id}/image-tasks":{"post":{"tags":["studio/image-tasks"],"summary":"道具/场景/服装图片生成(任务版)","description":"为道具/场景/服装创建图片生成任务。\n\n- asset_type: prop / scene / costume\n- path 参数 asset_id 为对应资产 ID\n- body.image_id 必须为该资产下对应图片表记录的 ID(PropImage/SceneImage/CostumeImage)","operationId":"create_asset_image_generation_task_api_v1_studio_image_tasks_assets__asset_type___asset_id__image_tasks_post","parameters":[{"name":"asset_type","in":"path","required":true,"schema":{"type":"string","title":"Asset Type"}},{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioImageTaskRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskCreated_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/image-tasks/assets/{asset_type}/{asset_id}/render-prompt":{"post":{"tags":["studio/image-tasks"],"summary":"道具/场景/服装图片提示词渲染","operationId":"render_asset_image_prompt_api_v1_studio_image_tasks_assets__asset_type___asset_id__render_prompt_post","parameters":[{"name":"asset_type","in":"path","required":true,"schema":{"type":"string","title":"Asset Type"}},{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioImageTaskRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_RenderedPromptResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/image-tasks/characters/{character_id}/image-tasks":{"post":{"tags":["studio/image-tasks"],"summary":"角色图片生成(任务版)","description":"为角色创建图片生成任务(对应 CharacterImage 业务)。\n\n- path 参数 character_id 为 Character.id\n- body.image_id 必须为该角色下的 CharacterImage.id","operationId":"create_character_image_generation_task_api_v1_studio_image_tasks_characters__character_id__image_tasks_post","parameters":[{"name":"character_id","in":"path","required":true,"schema":{"type":"string","title":"Character Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioImageTaskRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskCreated_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/image-tasks/characters/{character_id}/render-prompt":{"post":{"tags":["studio/image-tasks"],"summary":"角色图片提示词渲染","operationId":"render_character_image_prompt_api_v1_studio_image_tasks_characters__character_id__render_prompt_post","parameters":[{"name":"character_id","in":"path","required":true,"schema":{"type":"string","title":"Character Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioImageTaskRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_RenderedPromptResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/image-tasks/shot/{shot_id}/frame-image-tasks":{"post":{"tags":["studio/image-tasks"],"summary":"镜头分镜帧图片生成(任务版)","description":"为镜头分镜帧图片生成任务(基于 `shot_id + frame_type` 自动定位数据)。","operationId":"create_shot_frame_image_generation_task_api_v1_studio_image_tasks_shot__shot_id__frame_image_tasks_post","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotFrameImageTaskRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_TaskCreated_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/image-tasks/shot/{shot_id}/frame-render-prompt":{"post":{"tags":["studio/image-tasks"],"summary":"镜头分镜帧提示词渲染","operationId":"render_shot_frame_prompt_api_v1_studio_image_tasks_shot__shot_id__frame_render_prompt_post","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"string","title":"Shot Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotFramePromptRenderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_RenderedShotFramePromptRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/shot-character-links":{"get":{"tags":["studio/shot-character-links"],"summary":"查询镜头角色关联列表(ShotCharacterLink)","operationId":"list_shot_character_links_api_v1_studio_shot_character_links_get","parameters":[{"name":"shot_id","in":"query","required":true,"schema":{"type":"string","description":"镜头 ID","title":"Shot Id"},"description":"镜头 ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_list_ShotCharacterLinkRead__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["studio/shot-character-links"],"summary":"创建/更新镜头角色关联(ShotCharacterLink)","operationId":"upsert_shot_character_link_api_v1_studio_shot_character_links_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShotCharacterLinkCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ShotCharacterLinkRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/divide-async":{"post":{"tags":["script-processing"],"summary":"异步将剧本分割为多个镜头","description":"创建章节分镜提取任务并立即返回 task_id;前端可通过任务状态接口轮询。","operationId":"divide_script_async_api_v1_script_processing_divide_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptDividerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/divide":{"post":{"tags":["script-processing"],"summary":"将剧本分割为多个镜头","description":"输入完整剧本文本,输出分镜列表(index/start_line/end_line/script_excerpt/shot_name/time_of_day)。注意:此阶段不强制稳定ID,角色以“称呼/名字”弱信息输出,稳定ID在合并阶段统一分配。当前同步接口主要用于兼容旧调用与调试场景;页面主流程优先使用 divide-async。","operationId":"divide_script_api_v1_script_processing_divide_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptDividerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ScriptDivisionResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/merge-entities-async":{"post":{"tags":["script-processing"],"summary":"异步合并多镜头的实体信息","description":"创建实体合并任务并立即返回 task_id;当前保留为预备能力,尚无真实前端入口。","operationId":"merge_entities_async_api_v1_script_processing_merge_entities_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityMergerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/merge-entities":{"post":{"tags":["script-processing"],"summary":"合并多镜头的实体信息","description":"输入全部分镜提取结果(可选带上脚本分镜与历史实体库),输出合并后的实体库:角色库/地点库/场景库/道具库(静态画像 + 变体列表)。该步骤会统一分配稳定ID(如 char_001/loc_001/prop_001/scene_001)。当提供 previous_merge 与 conflict_resolutions 时,将进行冲突重试合并,优先消解 conflicts 并尽量保持 ID 稳定。当前接口保留为预备能力,尚无真实前端入口。","operationId":"merge_entities_api_v1_script_processing_merge_entities_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityMergerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_EntityMergeResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-variants-async":{"post":{"tags":["script-processing"],"summary":"异步分析服装/外形变体","description":"创建变体分析任务并立即返回 task_id;当前保留为预备能力,尚无真实前端入口。","operationId":"analyze_variants_async_api_v1_script_processing_analyze_variants_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VariantAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-variants":{"post":{"tags":["script-processing"],"summary":"分析服装/外形变体","description":"检测角色服装/外形变化,构建演变时间线,生成章节变体建议列表与变体建议。当前接口保留为预备能力,尚无真实前端入口。","operationId":"analyze_variants_api_v1_script_processing_analyze_variants_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VariantAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_VariantAnalysisResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/check-consistency-async":{"post":{"tags":["script-processing"],"summary":"异步检查角色混淆一致性(基于原文)","description":"创建一致性检查任务并立即返回 task_id;前端可通过任务状态接口轮询。","operationId":"check_consistency_async_api_v1_script_processing_check_consistency_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptConsistencyCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/check-consistency":{"post":{"tags":["script-processing"],"summary":"检查角色混淆一致性(基于原文)","description":"检测同一角色在不同段落/镜头被赋予不同身份/行为主体导致混淆,并给出修改建议。当前同步接口主要用于兼容旧调用与调试场景;页面主流程优先使用 check-consistency-async。","operationId":"check_consistency_api_v1_script_processing_check_consistency_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptConsistencyCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ScriptConsistencyCheckResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-character-portrait-async":{"post":{"tags":["script-processing"],"summary":"异步分析人物画像缺失信息","description":"创建人物画像分析任务并立即返回 task_id;前端可通过任务状态接口轮询。","operationId":"analyze_character_portrait_async_api_v1_script_processing_analyze_character_portrait_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharacterPortraitAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-character-portrait":{"post":{"tags":["script-processing"],"summary":"分析人物画像缺失信息","description":"根据原文人物上下文与人物描述,判断缺少哪些关键信息,并给出优化后的人物画像描述。当前同步接口主要用于兼容旧调用与调试场景;页面主流程优先使用 analyze-character-portrait-async。","operationId":"analyze_character_portrait_api_v1_script_processing_analyze_character_portrait_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharacterPortraitAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_CharacterPortraitAnalysisResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-prop-info-async":{"post":{"tags":["script-processing"],"summary":"异步分析道具信息缺失项","description":"创建道具信息分析任务并立即返回 task_id;前端可通过任务状态接口轮询。","operationId":"analyze_prop_info_async_api_v1_script_processing_analyze_prop_info_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropInfoAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-prop-info":{"post":{"tags":["script-processing"],"summary":"分析道具信息缺失项","description":"根据原文道具上下文与道具描述,判断缺少哪些关键信息,并给出优化后的可生成道具描述。当前同步接口主要用于兼容旧调用与调试场景;页面主流程优先使用 analyze-prop-info-async。","operationId":"analyze_prop_info_api_v1_script_processing_analyze_prop_info_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropInfoAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PropInfoAnalysisResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-scene-info-async":{"post":{"tags":["script-processing"],"summary":"异步分析场景信息缺失项","description":"创建场景信息分析任务并立即返回 task_id;前端可通过任务状态接口轮询。","operationId":"analyze_scene_info_async_api_v1_script_processing_analyze_scene_info_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SceneInfoAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-scene-info":{"post":{"tags":["script-processing"],"summary":"分析场景信息缺失项","description":"根据原文场景上下文与场景描述,判断缺少哪些关键信息,并给出优化后的可生成场景描述。当前同步接口主要用于兼容旧调用与调试场景;页面主流程优先使用 analyze-scene-info-async。","operationId":"analyze_scene_info_api_v1_script_processing_analyze_scene_info_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SceneInfoAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_SceneInfoAnalysisResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-costume-info-async":{"post":{"tags":["script-processing"],"summary":"异步分析服装信息缺失项","description":"创建服装信息分析任务并立即返回 task_id;前端可通过任务状态接口轮询。","operationId":"analyze_costume_info_async_api_v1_script_processing_analyze_costume_info_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CostumeInfoAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/analyze-costume-info":{"post":{"tags":["script-processing"],"summary":"分析服装信息缺失项","description":"根据原文服装上下文与服装描述,判断缺少哪些关键信息,并给出优化后的可生成服装描述。当前同步接口主要用于兼容旧调用与调试场景;页面主流程优先使用 analyze-costume-info-async。","operationId":"analyze_costume_info_api_v1_script_processing_analyze_costume_info_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CostumeInfoAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_CostumeInfoAnalysisResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/optimize-script-async":{"post":{"tags":["script-processing"],"summary":"异步基于一致性检查优化剧本","description":"创建剧本优化任务并立即返回 task_id;前端可通过任务状态接口轮询。","operationId":"optimize_script_async_api_v1_script_processing_optimize_script_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptOptimizeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/optimize-script":{"post":{"tags":["script-processing"],"summary":"基于一致性检查优化剧本","description":"将一致性检查输出及原文作为输入,生成优化后的剧本(尽量少改,只改与角色混淆 issues 相关段落)。当前同步接口主要用于兼容旧调用与调试场景;页面主流程优先使用 optimize-script-async。","operationId":"optimize_script_api_v1_script_processing_optimize_script_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptOptimizeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ScriptOptimizationResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/simplify-script":{"post":{"tags":["script-processing"],"summary":"智能精简剧本","description":"在保留剧情主体并保证剧情连续的前提下精简剧本文本。当前同步接口主要用于兼容旧调用与调试场景;页面主流程优先使用 simplify-script-async。","operationId":"simplify_script_api_v1_script_processing_simplify_script_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptSimplifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ScriptSimplificationResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/simplify-script-async":{"post":{"tags":["script-processing"],"summary":"异步智能精简剧本","description":"创建剧本精简任务并立即返回 task_id;前端可通过任务状态接口轮询。","operationId":"simplify_script_async_api_v1_script_processing_simplify_script_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptSimplifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/extract-async":{"post":{"tags":["script-processing"],"summary":"异步项目级信息提取(最终输出)","description":"创建项目级信息提取任务并立即返回 task_id;前端可通过任务状态接口轮询。","operationId":"extract_script_async_api_v1_script_processing_extract_async_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptExtractRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsyncTaskCreateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/script-processing/extract":{"post":{"tags":["script-processing"],"summary":"项目级信息提取(最终输出)","description":"输入分镜结果(可选带一致性检查结果),输出可导入 Studio 的草稿结构(name-based,ID 由导入接口生成)。当前同步接口主要用于兼容旧调用与调试场景;页面主流程优先使用 extract-async。","operationId":"extract_script_api_v1_script_processing_extract_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptExtractRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_StudioScriptExtractionDraft_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","description":"健康检查。","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"ApiResponse_AsyncTaskCreateRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/AsyncTaskCreateRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[AsyncTaskCreateRead]"},"ApiResponse_ChapterRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ChapterRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ChapterRead]"},"ApiResponse_CharacterPortraitAnalysisResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/CharacterPortraitAnalysisResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[CharacterPortraitAnalysisResult]"},"ApiResponse_CostumeInfoAnalysisResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/CostumeInfoAnalysisResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[CostumeInfoAnalysisResult]"},"ApiResponse_EntityMergeResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/EntityMergeResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[EntityMergeResult]"},"ApiResponse_EntityNameExistenceCheckResponse_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/EntityNameExistenceCheckResponse"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[EntityNameExistenceCheckResponse]"},"ApiResponse_FileDetailRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/FileDetailRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[FileDetailRead]"},"ApiResponse_FileRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/FileRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[FileRead]"},"ApiResponse_GenerationTaskLinkRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/GenerationTaskLinkRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[GenerationTaskLinkRead]"},"ApiResponse_ImageGenerationOptionsRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ImageGenerationOptionsRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ImageGenerationOptionsRead]"},"ApiResponse_ModelRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ModelRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ModelRead]"},"ApiResponse_ModelSettingsRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ModelSettingsRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ModelSettingsRead]"},"ApiResponse_NoneType_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"type":"null","title":"Data","description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[NoneType]"},"ApiResponse_PaginatedData_Any__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_Any_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[Any]]"},"ApiResponse_PaginatedData_ChapterRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_ChapterRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[ChapterRead]]"},"ApiResponse_PaginatedData_FileRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_FileRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[FileRead]]"},"ApiResponse_PaginatedData_GenerationTaskLinkRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_GenerationTaskLinkRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[GenerationTaskLinkRead]]"},"ApiResponse_PaginatedData_ModelRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_ModelRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[ModelRead]]"},"ApiResponse_PaginatedData_ProjectRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_ProjectRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[ProjectRead]]"},"ApiResponse_PaginatedData_PromptTemplateRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_PromptTemplateRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[PromptTemplateRead]]"},"ApiResponse_PaginatedData_ProviderRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_ProviderRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[ProviderRead]]"},"ApiResponse_PaginatedData_ShotDetailRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_ShotDetailRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[ShotDetailRead]]"},"ApiResponse_PaginatedData_ShotDialogLineRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_ShotDialogLineRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[ShotDialogLineRead]]"},"ApiResponse_PaginatedData_ShotFrameImageRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_ShotFrameImageRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[ShotFrameImageRead]]"},"ApiResponse_PaginatedData_ShotLinkedAssetItem__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_ShotLinkedAssetItem_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[ShotLinkedAssetItem]]"},"ApiResponse_PaginatedData_ShotRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_ShotRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[ShotRead]]"},"ApiResponse_PaginatedData_TaskListItemRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_TaskListItemRead_"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[TaskListItemRead]]"},"ApiResponse_PaginatedData_dict_str__Any___":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PaginatedData_dict_str__Any__"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PaginatedData[dict[str, Any]]]"},"ApiResponse_ProjectActorLinkRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ProjectActorLinkRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ProjectActorLinkRead]"},"ApiResponse_ProjectCostumeLinkRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ProjectCostumeLinkRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ProjectCostumeLinkRead]"},"ApiResponse_ProjectPropLinkRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ProjectPropLinkRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ProjectPropLinkRead]"},"ApiResponse_ProjectRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ProjectRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ProjectRead]"},"ApiResponse_ProjectSceneLinkRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ProjectSceneLinkRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ProjectSceneLinkRead]"},"ApiResponse_ProjectStyleOptionsRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ProjectStyleOptionsRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ProjectStyleOptionsRead]"},"ApiResponse_PromptTemplateRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PromptTemplateRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PromptTemplateRead]"},"ApiResponse_PropInfoAnalysisResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PropInfoAnalysisResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[PropInfoAnalysisResult]"},"ApiResponse_ProviderRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ProviderRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ProviderRead]"},"ApiResponse_RenderedPromptResponse_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/RenderedPromptResponse"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[RenderedPromptResponse]"},"ApiResponse_RenderedShotFramePromptRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/RenderedShotFramePromptRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[RenderedShotFramePromptRead]"},"ApiResponse_SceneInfoAnalysisResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/SceneInfoAnalysisResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[SceneInfoAnalysisResult]"},"ApiResponse_ScriptConsistencyCheckResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ScriptConsistencyCheckResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ScriptConsistencyCheckResult]"},"ApiResponse_ScriptDivisionResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ScriptDivisionResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ScriptDivisionResult]"},"ApiResponse_ScriptOptimizationResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ScriptOptimizationResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ScriptOptimizationResult]"},"ApiResponse_ScriptSimplificationResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ScriptSimplificationResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ScriptSimplificationResult]"},"ApiResponse_ShotAssetsOverviewRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotAssetsOverviewRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotAssetsOverviewRead]"},"ApiResponse_ShotCharacterLinkRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotCharacterLinkRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotCharacterLinkRead]"},"ApiResponse_ShotDetailRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotDetailRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotDetailRead]"},"ApiResponse_ShotDialogLineRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotDialogLineRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotDialogLineRead]"},"ApiResponse_ShotFrameImageRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotFrameImageRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotFrameImageRead]"},"ApiResponse_ShotPreparationMutationResultRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotPreparationMutationResultRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotPreparationMutationResultRead]"},"ApiResponse_ShotPreparationStateRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotPreparationStateRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotPreparationStateRead]"},"ApiResponse_ShotRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotRead]"},"ApiResponse_ShotVideoPromptPreviewRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotVideoPromptPreviewRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotVideoPromptPreviewRead]"},"ApiResponse_ShotVideoReadinessRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ShotVideoReadinessRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[ShotVideoReadinessRead]"},"ApiResponse_StudioScriptExtractionDraft_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/StudioScriptExtractionDraft"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[StudioScriptExtractionDraft]"},"ApiResponse_TaskCancelRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/TaskCancelRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[TaskCancelRead]"},"ApiResponse_TaskCreated_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/TaskCreated"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[TaskCreated]"},"ApiResponse_TaskLinkAdoptRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/TaskLinkAdoptRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[TaskLinkAdoptRead]"},"ApiResponse_TaskResultRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/TaskResultRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[TaskResultRead]"},"ApiResponse_TaskStatusRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/TaskStatusRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[TaskStatusRead]"},"ApiResponse_VariantAnalysisResult_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/VariantAnalysisResult"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[VariantAnalysisResult]"},"ApiResponse_VideoGenerationOptionsRead_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/VideoGenerationOptionsRead"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[VideoGenerationOptionsRead]"},"ApiResponse_VideoPromptPreviewResponse_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/VideoPromptPreviewResponse"},{"type":"null"}],"description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[VideoPromptPreviewResponse]"},"ApiResponse_dict_":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[dict]"},"ApiResponse_dict_str__Any__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[dict[str, Any]]"},"ApiResponse_list_PromptCategoryOptionRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/PromptCategoryOptionRead"},"type":"array"},{"type":"null"}],"title":"Data","description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[list[PromptCategoryOptionRead]]"},"ApiResponse_list_ProviderSupportedRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/ProviderSupportedRead"},"type":"array"},{"type":"null"}],"title":"Data","description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[list[ProviderSupportedRead]]"},"ApiResponse_list_ShotCharacterLinkRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/ShotCharacterLinkRead"},"type":"array"},{"type":"null"}],"title":"Data","description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[list[ShotCharacterLinkRead]]"},"ApiResponse_list_ShotExtractedCandidateRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/ShotExtractedCandidateRead"},"type":"array"},{"type":"null"}],"title":"Data","description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[list[ShotExtractedCandidateRead]]"},"ApiResponse_list_ShotExtractedDialogueCandidateRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/ShotExtractedDialogueCandidateRead"},"type":"array"},{"type":"null"}],"title":"Data","description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[list[ShotExtractedDialogueCandidateRead]]"},"ApiResponse_list_ShotRuntimeSummaryRead__":{"properties":{"code":{"type":"integer","title":"Code","description":"与 HTTP 状态码一致","default":200},"message":{"type":"string","title":"Message","description":"提示信息","default":"success"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/ShotRuntimeSummaryRead"},"type":"array"},{"type":"null"}],"title":"Data","description":"实际数据"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"附加元信息"}},"type":"object","title":"ApiResponse[list[ShotRuntimeSummaryRead]]"},"AsyncTaskCreateRead":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"任务 ID"},"status":{"$ref":"#/components/schemas/TaskStatus","description":"任务状态"},"reused":{"type":"boolean","title":"Reused","description":"是否复用了当前业务实体已有的活跃任务","default":false},"relation_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Type","description":"业务关联类型"},"relation_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Entity Id","description":"业务关联实体 ID"}},"type":"object","required":["task_id","status"],"title":"AsyncTaskCreateRead"},"Body_upload_file_api_api_v1_studio_files_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"要上传的二进制文件"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"可选:写入 file_usages 的项目 ID"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id"},"usage_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Usage Kind","description":"与 project_id 同时提供时写入 file_usages"},"source_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Ref"}},"type":"object","required":["file"],"title":"Body_upload_file_api_api_v1_studio_files_upload_post"},"CameraAngle":{"type":"string","enum":["EYE_LEVEL","HIGH_ANGLE","LOW_ANGLE","BIRD_EYE","DUTCH","OVER_SHOULDER"],"title":"CameraAngle","description":"机位角度(与 `app.schemas.skills.common.CameraAngle` 对齐,存英文 code)。"},"CameraMovement":{"type":"string","enum":["STATIC","PAN","TILT","DOLLY_IN","DOLLY_OUT","TRACK","CRANE","HANDHELD","STEADICAM","ZOOM_IN","ZOOM_OUT"],"title":"CameraMovement","description":"运镜方式(与 `app.schemas.skills.common.CameraMovement` 对齐,存英文 code)。"},"CameraShotType":{"type":"string","enum":["ECU","CU","MCU","MS","MLS","LS","ELS"],"title":"CameraShotType","description":"景别(与 `app.schemas.skills.common.ShotType` 对齐,存英文 code)。"},"ChapterCreate":{"properties":{"project_id":{"type":"string","title":"Project Id","description":"所属项目 ID"},"index":{"type":"integer","title":"Index","description":"章节序号(项目内唯一)"},"title":{"type":"string","title":"Title","description":"章节标题"},"summary":{"type":"string","title":"Summary","description":"章节摘要","default":""},"raw_text":{"type":"string","title":"Raw Text","description":"章节原文","default":""},"condensed_text":{"type":"string","title":"Condensed Text","description":"精简原文","default":""},"storyboard_count":{"type":"integer","title":"Storyboard Count","description":"分镜数量","default":0},"status":{"$ref":"#/components/schemas/ChapterStatus","description":"章节状态","default":"draft"},"id":{"type":"string","title":"Id","description":"章节 ID"}},"type":"object","required":["project_id","index","title","id"],"title":"ChapterCreate"},"ChapterRead":{"properties":{"project_id":{"type":"string","title":"Project Id","description":"所属项目 ID"},"index":{"type":"integer","title":"Index","description":"章节序号(项目内唯一)"},"title":{"type":"string","title":"Title","description":"章节标题"},"summary":{"type":"string","title":"Summary","description":"章节摘要","default":""},"raw_text":{"type":"string","title":"Raw Text","description":"章节原文","default":""},"condensed_text":{"type":"string","title":"Condensed Text","description":"精简原文","default":""},"storyboard_count":{"type":"integer","title":"Storyboard Count","description":"分镜数量","default":0},"status":{"$ref":"#/components/schemas/ChapterStatus","description":"章节状态","default":"draft"},"id":{"type":"string","title":"Id"},"shot_count":{"type":"integer","title":"Shot Count","description":"分镜数(shots 条数聚合)","default":0}},"type":"object","required":["project_id","index","title","id"],"title":"ChapterRead"},"ChapterStatus":{"type":"string","enum":["draft","shooting","done"],"title":"ChapterStatus","description":"章节生产状态。"},"ChapterUpdate":{"properties":{"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"},"index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Index"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"raw_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Text"},"condensed_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condensed Text"},"storyboard_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Storyboard Count"},"status":{"anyOf":[{"$ref":"#/components/schemas/ChapterStatus"},{"type":"null"}]}},"type":"object","title":"ChapterUpdate"},"CharacterPortraitAnalysisRequest":{"properties":{"relation_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Entity Id","description":"任务关联实体 ID(资产页恢复任务可选)"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"项目 ID(异步任务关联可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(异步任务关联可选)"},"character_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Character Context","description":"原文人物上下文(可为空;用于提供额外背景,帮助判断缺失信息)"},"character_description":{"type":"string","minLength":1,"title":"Character Description","description":"原文人物描述"}},"type":"object","required":["character_description"],"title":"CharacterPortraitAnalysisRequest","description":"人物画像缺失信息分析请求。"},"CharacterPortraitAnalysisResult":{"properties":{"issues":{"items":{"type":"string"},"type":"array","title":"Issues"},"optimized_description":{"type":"string","title":"Optimized Description"}},"additionalProperties":false,"type":"object","required":["issues","optimized_description"],"title":"CharacterPortraitAnalysisResult","description":"根据原文人物描述,分析缺少的信息,并给出优化后的可生成画像描述。"},"CostumeInfoAnalysisRequest":{"properties":{"relation_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Entity Id","description":"任务关联实体 ID(资产页恢复任务可选)"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"项目 ID(异步任务关联可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(异步任务关联可选)"},"costume_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Costume Context","description":"原文服装上下文(可为空;用于提供额外背景,帮助判断缺失信息)"},"costume_description":{"type":"string","minLength":1,"title":"Costume Description","description":"原文服装描述"}},"type":"object","required":["costume_description"],"title":"CostumeInfoAnalysisRequest","description":"服装信息缺失分析请求。"},"CostumeInfoAnalysisResult":{"properties":{"issues":{"items":{"type":"string"},"type":"array","title":"Issues"},"optimized_description":{"type":"string","title":"Optimized Description"}},"additionalProperties":false,"type":"object","required":["issues","optimized_description"],"title":"CostumeInfoAnalysisResult","description":"根据原文服装/造型描述,分析缺少的信息,并给出优化后的可生成服装描述。"},"CostumeTimeline":{"properties":{"character_id":{"type":"string","title":"Character Id","description":"角色稳定ID"},"character_name":{"type":"string","title":"Character Name","description":"角色名称"},"timeline_entries":{"items":{"$ref":"#/components/schemas/CostumeTimelineEntry"},"type":"array","title":"Timeline Entries","description":"时间线条目"}},"additionalProperties":false,"type":"object","required":["character_id","character_name"],"title":"CostumeTimeline","description":"单角色的服装演变时间线。"},"CostumeTimelineEntry":{"properties":{"shot_index":{"type":"integer","minimum":1.0,"title":"Shot Index","description":"镜头序号"},"scene_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scene Id","description":"可选:所属场景稳定ID(若已可推断)"},"costume_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Costume Note","description":"服装/外形要点(简短)"},"changes":{"items":{"type":"string"},"type":"array","title":"Changes","description":"与上一条相比的变化点"},"evidence":{"items":{"$ref":"#/components/schemas/EvidenceSpan"},"type":"array","title":"Evidence","description":"原文依据(可选)"}},"additionalProperties":false,"type":"object","required":["shot_index"],"title":"CostumeTimelineEntry","description":"单角色的服装演变时间线条目。"},"DialogueLineMode":{"type":"string","enum":["DIALOGUE","VOICE_OVER","OFF_SCREEN","PHONE"],"title":"DialogueLineMode","description":"对白模式(与 `app.schemas.skills.common.DialogueLineMode` 对齐,存英文 code)。"},"EntityEntry":{"properties":{"id":{"type":"string","title":"Id","description":"实体稳定ID(合并阶段分配)"},"name":{"type":"string","title":"Name","description":"实体名称"},"type":{"type":"string","enum":["character","scene","prop","location"],"title":"Type","description":"实体类型"},"normalized_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Name","description":"归一化名称(来自文本,可选)"},"aliases":{"items":{"type":"string"},"type":"array","title":"Aliases","description":"别名/称呼(来自文本,可选)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"基础画像/描述(忠实文本,简短)"},"confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Confidence","description":"合并确定度 0-1(可选)"},"first_appearance":{"anyOf":[{"$ref":"#/components/schemas/EvidenceSpan"},{"type":"null"}],"description":"首次出场证据(可选)"},"costume_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Costume Note","description":"服装/造型描述(可选,便于变体与资产关联)"},"traits":{"items":{"type":"string"},"type":"array","title":"Traits","description":"性格/特征词(可选)"},"location_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Type","description":"地点类型:房间/街道/森林/车厢等(可选)"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"道具类别(可选:weapon/document/vehicle/clothing/device/magic_item/other)"},"owner_character_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Character Id","description":"拥有者角色ID(可选)"},"evidence":{"items":{"$ref":"#/components/schemas/EvidenceSpan"},"type":"array","title":"Evidence","description":"支撑该实体画像的证据片段(可选)"},"first_shot":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"First Shot","description":"首次出现的镜头序号"},"appearances":{"items":{"type":"integer"},"type":"array","title":"Appearances","description":"出现镜头列表"},"variants":{"items":{"$ref":"#/components/schemas/EntityVariant"},"type":"array","title":"Variants","description":"变体列表"}},"additionalProperties":false,"type":"object","required":["id","name","type"],"title":"EntityEntry","description":"合并后的实体条目(脚本处理中间态)。"},"EntityLibrary":{"properties":{"characters":{"items":{"$ref":"#/components/schemas/EntityEntry"},"type":"array","title":"Characters","description":"角色库"},"locations":{"items":{"$ref":"#/components/schemas/EntityEntry"},"type":"array","title":"Locations","description":"地点库"},"scenes":{"items":{"$ref":"#/components/schemas/EntityEntry"},"type":"array","title":"Scenes","description":"场景库"},"props":{"items":{"$ref":"#/components/schemas/EntityEntry"},"type":"array","title":"Props","description":"道具库"},"total_entries":{"type":"integer","minimum":0.0,"title":"Total Entries","description":"总实体数"}},"additionalProperties":false,"type":"object","required":["total_entries"],"title":"EntityLibrary","description":"合并后的实体库(脚本处理中间态)。"},"EntityMergeResult":{"properties":{"merged_library":{"$ref":"#/components/schemas/EntityLibrary","description":"合并后的实体库"},"merge_stats":{"additionalProperties":true,"type":"object","title":"Merge Stats","description":"合并统计信息"},"conflicts":{"items":{"type":"string"},"type":"array","title":"Conflicts","description":"发现的冲突/待处理项"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","description":"合并说明"}},"additionalProperties":false,"type":"object","required":["merged_library"],"title":"EntityMergeResult","description":"实体合并结果(脚本处理中间态)。"},"EntityMergerRequest":{"properties":{"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"项目 ID(异步任务关联可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(异步任务关联可选)"},"all_shot_extractions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"All Shot Extractions","description":"所有镜头提取结果(ShotElementExtractionResult 的序列化形式)"},"historical_library":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Historical Library","description":"历史实体库(可选,用于增量合并)"},"script_division":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Script Division","description":"脚本分镜结果(可选;ScriptDivisionResult 序列化),用于定位与统计"},"previous_merge":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Previous Merge","description":"上一次合并结果(可选;EntityMergeResult 序列化),用于冲突重试合并"},"conflict_resolutions":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Conflict Resolutions","description":"冲突解决建议列表(可选;用于冲突重试合并)"}},"type":"object","required":["all_shot_extractions"],"title":"EntityMergerRequest","description":"实体合并请求。"},"EntityNameExistenceCheckRequest":{"properties":{"project_id":{"type":"string","minLength":1,"title":"Project Id","description":"项目 ID(必填)"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id","description":"镜头 ID(可选;不传则 linked_to_shot 恒为 false)"},"character_names":{"items":{"type":"string"},"type":"array","title":"Character Names","description":"角色名称列表"},"prop_names":{"items":{"type":"string"},"type":"array","title":"Prop Names","description":"道具名称列表"},"scene_names":{"items":{"type":"string"},"type":"array","title":"Scene Names","description":"场景名称列表"},"costume_names":{"items":{"type":"string"},"type":"array","title":"Costume Names","description":"服装名称列表"}},"additionalProperties":false,"type":"object","required":["project_id"],"title":"EntityNameExistenceCheckRequest","description":"批量检测项目内/全局资产名称是否存在(模糊匹配)。"},"EntityNameExistenceCheckResponse":{"properties":{"characters":{"items":{"$ref":"#/components/schemas/EntityNameExistenceItem"},"type":"array","title":"Characters"},"props":{"items":{"$ref":"#/components/schemas/EntityNameExistenceItem"},"type":"array","title":"Props"},"scenes":{"items":{"$ref":"#/components/schemas/EntityNameExistenceItem"},"type":"array","title":"Scenes"},"costumes":{"items":{"$ref":"#/components/schemas/EntityNameExistenceItem"},"type":"array","title":"Costumes"}},"additionalProperties":false,"type":"object","title":"EntityNameExistenceCheckResponse","description":"批量存在性检测结果(按资产类型分组)。"},"EntityNameExistenceItem":{"properties":{"name":{"type":"string","title":"Name","description":"输入名称(原样回传)"},"exists":{"type":"boolean","title":"Exists","description":"数据库中是否存在(模糊命中)"},"linked_to_project":{"type":"boolean","title":"Linked To Project","description":"是否已关联到该项目(角色等同于 exists)"},"linked_to_shot":{"type":"boolean","title":"Linked To Shot","description":"是否已关联到请求中的 shot(未传 shot_id 时为 false)","default":false},"asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Id","description":"命中的资产 ID(如 prop_id/scene_id/costume_id/character_id)"},"link_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Link Id","description":"若已关联到项目,对应 Project*Link 的 id;否则为空"}},"additionalProperties":false,"type":"object","required":["name","exists","linked_to_project"],"title":"EntityNameExistenceItem","description":"单个名称的存在性结果。"},"EntityVariant":{"properties":{"variant_key":{"type":"string","title":"Variant Key","description":"变体键(例如 outfit_v1、wounded_state 等)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"变体描述(简短)"},"affected_shots":{"items":{"type":"integer"},"type":"array","title":"Affected Shots","description":"涉及镜头序号"},"evidence":{"items":{"$ref":"#/components/schemas/EvidenceSpan"},"type":"array","title":"Evidence","description":"原文依据(可选)"}},"additionalProperties":false,"type":"object","required":["variant_key"],"title":"EntityVariant","description":"实体变体条目(最小可用结构,便于服装/外形演变)。"},"EvidenceSpan":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id","description":"输入文本块的唯一ID(例如 chapter1_p03)"},"start_char":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Start Char","description":"在该 chunk 中的起始字符位置(可选)"},"end_char":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"End Char","description":"在该 chunk 中的结束字符位置(可选)"},"quote":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quote","description":"不超过200字的原文摘录(可选,便于人工审核)"}},"additionalProperties":false,"type":"object","required":["chunk_id"],"title":"EvidenceSpan","description":"可追溯证据:原文定位(chunk + 起止位置/摘录),用于审核与回查。"},"FileDetailRead":{"properties":{"id":{"type":"string","title":"Id","description":"文件 ID"},"type":{"$ref":"#/components/schemas/FileTypeEnum","description":"文件类型"},"name":{"type":"string","title":"Name","description":"文件名/标题"},"thumbnail":{"type":"string","title":"Thumbnail","description":"缩略图 URL/路径","default":""},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"标签"},"usages":{"items":{"$ref":"#/components/schemas/FileUsageRead"},"type":"array","title":"Usages"}},"type":"object","required":["id","type","name"],"title":"FileDetailRead","description":"含 file_usages 列表(详情接口)。"},"FileRead":{"properties":{"id":{"type":"string","title":"Id","description":"文件 ID"},"type":{"$ref":"#/components/schemas/FileTypeEnum","description":"文件类型"},"name":{"type":"string","title":"Name","description":"文件名/标题"},"thumbnail":{"type":"string","title":"Thumbnail","description":"缩略图 URL/路径","default":""},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"标签"}},"type":"object","required":["id","type","name"],"title":"FileRead"},"FileTypeEnum":{"type":"string","enum":["image","video"],"title":"FileTypeEnum"},"FileUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"usage":{"anyOf":[{"$ref":"#/components/schemas/FileUsageWrite"},{"type":"null"}],"description":"若提供则 upsert 一条 file_usages"}},"type":"object","title":"FileUpdate"},"FileUsageRead":{"properties":{"id":{"type":"integer","title":"Id"},"file_id":{"type":"string","title":"File Id"},"project_id":{"type":"string","title":"Project Id"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id"},"usage_kind":{"type":"string","title":"Usage Kind"},"source_ref":{"type":"string","title":"Source Ref"}},"type":"object","required":["id","file_id","project_id","chapter_id","shot_id","usage_kind","source_ref"],"title":"FileUsageRead"},"FileUsageWrite":{"properties":{"project_id":{"type":"string","title":"Project Id","description":"项目 ID"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id","description":"镜头 ID"},"usage_kind":{"type":"string","title":"Usage Kind","description":"用途:shot_frame / generated_video / character_image / asset_image / upload / api 等"},"source_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Ref","description":"幂等键(可选)"}},"type":"object","required":["project_id","usage_kind"],"title":"FileUsageWrite","description":"写入 file_usages 的关联信息(与 FileItem 一并提交)。"},"GenerationTaskLinkCreate":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"生成任务 ID"},"resource_type":{"type":"string","title":"Resource Type","description":"生成资源类型(如 image/video/text/task_link)"},"relation_type":{"type":"string","title":"Relation Type","description":"业务类型(如 prop/costume/scene 等)"},"relation_entity_id":{"type":"string","title":"Relation Entity Id","description":"关联业务实体 ID"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"关联产物文件 ID(files.id;适用于图片/音频/视频)"},"status":{"type":"string","title":"Status","description":"关联状态:accepted=已采用、todo=待操作、rejected=未采用;默认 todo","default":"todo"}},"type":"object","required":["task_id","resource_type","relation_type","relation_entity_id"],"title":"GenerationTaskLinkCreate","description":"创建生成任务关联请求体。"},"GenerationTaskLinkRead":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"生成任务 ID"},"resource_type":{"type":"string","title":"Resource Type","description":"生成资源类型(如 image/video/text/task_link)"},"relation_type":{"type":"string","title":"Relation Type","description":"业务类型(如 prop/costume/scene 等)"},"relation_entity_id":{"type":"string","title":"Relation Entity Id","description":"关联业务实体 ID"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"关联产物文件 ID(files.id;适用于图片/音频/视频)"},"status":{"type":"string","title":"Status","description":"关联状态:accepted=已采用、todo=待操作、rejected=未采用"},"id":{"type":"integer","title":"Id","description":"关联行 ID"}},"type":"object","required":["task_id","resource_type","relation_type","relation_entity_id","status","id"],"title":"GenerationTaskLinkRead","description":"生成任务关联返回体。"},"GenerationTaskLinkUpdate":{"properties":{"resource_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Type","description":"生成资源类型(如 image/video/text/task_link)"},"relation_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Type","description":"业务类型(如 prop/costume/scene 等)"},"relation_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Entity Id","description":"关联业务实体 ID"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"关联产物文件 ID(files.id;适用于图片/音频/视频)"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"关联状态:accepted=已采用、todo=待操作、rejected=未采用"}},"type":"object","title":"GenerationTaskLinkUpdate","description":"更新生成任务关联请求体(不包含 is_adopted,采用状态由专用接口正向变更)。"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImageGenerationOptionsRead":{"properties":{"provider":{"type":"string","title":"Provider","description":"供应商稳定键"},"model_id":{"type":"string","title":"Model Id","description":"默认图片模型 ID"},"model_name":{"type":"string","title":"Model Name","description":"默认图片模型名称"},"supported_ratios":{"items":{"type":"string"},"type":"array","title":"Supported Ratios","description":"当前模型支持的目标比例"},"default_resolution_profile":{"type":"string","title":"Default Resolution Profile","description":"当前模型默认分辨率档位"},"ratio_size_profiles":{"additionalProperties":{"additionalProperties":{"type":"string"},"type":"object"},"type":"object","title":"Ratio Size Profiles","description":"按比例和分辨率档位映射得到的像素尺寸"}},"type":"object","required":["provider","model_id","model_name","default_resolution_profile"],"title":"ImageGenerationOptionsRead","description":"当前默认图片模型对应的关键帧规格选项。"},"LogLevel":{"type":"string","enum":["debug","info","warn","error"],"title":"LogLevel","description":"全局日志级别。"},"ModelCategoryKey":{"type":"string","enum":["text","image","video"],"title":"ModelCategoryKey","description":"模型类别:文本/图片/视频。"},"ModelCreate":{"properties":{"name":{"type":"string","title":"Name","description":"模型名称"},"category":{"$ref":"#/components/schemas/ModelCategoryKey","description":"模型类别:text/image/video"},"provider_id":{"type":"string","title":"Provider Id","description":"所属供应商 ID"},"params":{"additionalProperties":true,"type":"object","title":"Params","description":"模型参数(JSON)"},"description":{"type":"string","title":"Description","description":"说明","default":""},"created_by":{"type":"string","title":"Created By","description":"创建人","default":""},"id":{"type":"string","title":"Id","description":"模型 ID"}},"type":"object","required":["name","category","provider_id","id"],"title":"ModelCreate","description":"创建模型请求体。"},"ModelRead":{"properties":{"name":{"type":"string","title":"Name","description":"模型名称"},"category":{"$ref":"#/components/schemas/ModelCategoryKey","description":"模型类别:text/image/video"},"provider_id":{"type":"string","title":"Provider Id","description":"所属供应商 ID"},"params":{"additionalProperties":true,"type":"object","title":"Params","description":"模型参数(JSON)"},"description":{"type":"string","title":"Description","description":"说明","default":""},"created_by":{"type":"string","title":"Created By","description":"创建人","default":""},"id":{"type":"string","title":"Id","description":"模型 ID"}},"type":"object","required":["name","category","provider_id","id"],"title":"ModelRead","description":"对外返回的模型信息。"},"ModelSettingsRead":{"properties":{"default_text_model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Text Model Id","description":"默认文本模型 ID"},"default_image_model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Image Model Id","description":"默认图片模型 ID"},"default_video_model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Video Model Id","description":"默认视频模型 ID"},"api_timeout":{"type":"integer","title":"Api Timeout","description":"API 超时(秒)","default":30},"log_level":{"$ref":"#/components/schemas/LogLevel","description":"日志级别","default":"info"},"id":{"type":"integer","title":"Id","description":"设置行 ID(通常为 1)"}},"type":"object","required":["id"],"title":"ModelSettingsRead","description":"对外返回的模型全局设置。"},"ModelSettingsUpdate":{"properties":{"default_text_model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Text Model Id","description":"默认文本模型 ID"},"default_image_model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Image Model Id","description":"默认图片模型 ID"},"default_video_model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Video Model Id","description":"默认视频模型 ID"},"api_timeout":{"type":"integer","title":"Api Timeout","description":"API 超时(秒)","default":30},"log_level":{"$ref":"#/components/schemas/LogLevel","description":"日志级别","default":"info"}},"type":"object","title":"ModelSettingsUpdate","description":"更新或保存模型全局设置请求体。"},"ModelUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"模型名称"},"category":{"anyOf":[{"$ref":"#/components/schemas/ModelCategoryKey"},{"type":"null"}],"description":"模型类别"},"provider_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Id","description":"所属供应商 ID"},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Params","description":"模型参数(JSON)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"说明"}},"type":"object","title":"ModelUpdate","description":"更新模型请求体(全部可选)。"},"PaginatedData_Any_":{"properties":{"items":{"items":{},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[Any]"},"PaginatedData_ChapterRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ChapterRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[ChapterRead]"},"PaginatedData_FileRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/FileRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[FileRead]"},"PaginatedData_GenerationTaskLinkRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/GenerationTaskLinkRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[GenerationTaskLinkRead]"},"PaginatedData_ModelRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ModelRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[ModelRead]"},"PaginatedData_ProjectRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ProjectRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[ProjectRead]"},"PaginatedData_PromptTemplateRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PromptTemplateRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[PromptTemplateRead]"},"PaginatedData_ProviderRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ProviderRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[ProviderRead]"},"PaginatedData_ShotDetailRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ShotDetailRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[ShotDetailRead]"},"PaginatedData_ShotDialogLineRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ShotDialogLineRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[ShotDialogLineRead]"},"PaginatedData_ShotFrameImageRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ShotFrameImageRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[ShotFrameImageRead]"},"PaginatedData_ShotLinkedAssetItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ShotLinkedAssetItem"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[ShotLinkedAssetItem]"},"PaginatedData_ShotRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ShotRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[ShotRead]"},"PaginatedData_TaskListItemRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TaskListItemRead"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[TaskListItemRead]"},"PaginatedData_dict_str__Any__":{"properties":{"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items","description":"当前页数据"},"pagination":{"$ref":"#/components/schemas/Pagination","description":"分页信息"}},"type":"object","required":["items","pagination"],"title":"PaginatedData[dict[str, Any]]"},"Pagination":{"properties":{"page":{"type":"integer","title":"Page","description":"当前页,从 1 开始"},"page_size":{"type":"integer","title":"Page Size","description":"每页条数"},"total":{"type":"integer","title":"Total","description":"总条数"},"max_page":{"type":"integer","title":"Max Page","description":"最大页码"}},"type":"object","required":["page","page_size","total","max_page"],"title":"Pagination","description":"分页信息。"},"ProjectActorLinkRead":{"properties":{"id":{"type":"integer","title":"Id","description":"关联行 ID"},"project_id":{"type":"string","title":"Project Id","description":"项目 ID"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(可空)"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id","description":"镜头 ID(可空)"},"actor_id":{"type":"string","title":"Actor Id"},"thumbnail":{"type":"string","title":"Thumbnail","description":"演员缩略图下载地址","default":""}},"type":"object","required":["id","project_id","actor_id"],"title":"ProjectActorLinkRead"},"ProjectAssetLinkCreate":{"properties":{"project_id":{"type":"string","title":"Project Id"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id"},"asset_id":{"type":"string","title":"Asset Id"}},"type":"object","required":["project_id","asset_id"],"title":"ProjectAssetLinkCreate"},"ProjectCostumeLinkRead":{"properties":{"id":{"type":"integer","title":"Id","description":"关联行 ID"},"project_id":{"type":"string","title":"Project Id","description":"项目 ID"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(可空)"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id","description":"镜头 ID(可空)"},"costume_id":{"type":"string","title":"Costume Id"},"thumbnail":{"type":"string","title":"Thumbnail","description":"服装缩略图下载地址","default":""}},"type":"object","required":["id","project_id","costume_id"],"title":"ProjectCostumeLinkRead"},"ProjectCreate":{"properties":{"name":{"type":"string","title":"Name","description":"项目名称"},"description":{"type":"string","title":"Description","description":"项目简介","default":""},"style":{"$ref":"#/components/schemas/ProjectStyle","description":"题材/风格","examples":["真人都市","真人科幻","真人古装","动漫科幻","动漫3D","国漫","水墨画"]},"visual_style":{"$ref":"#/components/schemas/ProjectVisualStyle","description":"画面表现形式","default":"现实"},"seed":{"type":"integer","title":"Seed","description":"随机种子","default":0},"unify_style":{"type":"boolean","title":"Unify Style","description":"是否统一风格","default":true},"progress":{"type":"integer","title":"Progress","description":"进度百分比(0-100)","default":0},"default_video_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Video Ratio","description":"项目级默认视频比例;分镜未覆盖时生效"},"stats":{"additionalProperties":true,"type":"object","title":"Stats","description":"聚合统计(JSON)"},"id":{"type":"string","title":"Id","description":"项目 ID"}},"type":"object","required":["name","style","id"],"title":"ProjectCreate"},"ProjectPropLinkRead":{"properties":{"id":{"type":"integer","title":"Id","description":"关联行 ID"},"project_id":{"type":"string","title":"Project Id","description":"项目 ID"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(可空)"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id","description":"镜头 ID(可空)"},"prop_id":{"type":"string","title":"Prop Id"},"thumbnail":{"type":"string","title":"Thumbnail","description":"道具缩略图下载地址","default":""}},"type":"object","required":["id","project_id","prop_id"],"title":"ProjectPropLinkRead"},"ProjectRead":{"properties":{"name":{"type":"string","title":"Name","description":"项目名称"},"description":{"type":"string","title":"Description","description":"项目简介","default":""},"style":{"$ref":"#/components/schemas/ProjectStyle","description":"题材/风格","examples":["真人都市","真人科幻","真人古装","动漫科幻","动漫3D","国漫","水墨画"]},"visual_style":{"$ref":"#/components/schemas/ProjectVisualStyle","description":"画面表现形式","default":"现实"},"seed":{"type":"integer","title":"Seed","description":"随机种子","default":0},"unify_style":{"type":"boolean","title":"Unify Style","description":"是否统一风格","default":true},"progress":{"type":"integer","title":"Progress","description":"进度百分比(0-100)","default":0},"default_video_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Video Ratio","description":"项目级默认视频比例;分镜未覆盖时生效"},"stats":{"additionalProperties":true,"type":"object","title":"Stats","description":"聚合统计(JSON)"},"id":{"type":"string","title":"Id"}},"type":"object","required":["name","style","id"],"title":"ProjectRead"},"ProjectSceneLinkRead":{"properties":{"id":{"type":"integer","title":"Id","description":"关联行 ID"},"project_id":{"type":"string","title":"Project Id","description":"项目 ID"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(可空)"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id","description":"镜头 ID(可空)"},"scene_id":{"type":"string","title":"Scene Id"},"thumbnail":{"type":"string","title":"Thumbnail","description":"场景缩略图下载地址","default":""}},"type":"object","required":["id","project_id","scene_id"],"title":"ProjectSceneLinkRead"},"ProjectStyle":{"type":"string","enum":["真人都市","真人科幻","真人古装","动漫科幻","动漫3D","国漫","水墨画"],"title":"ProjectStyle","description":"项目题材/风格维度(不用于区分真人/动漫)。"},"ProjectStyleOptionsRead":{"properties":{"visual_styles":{"items":{"$ref":"#/components/schemas/StyleOption"},"type":"array","title":"Visual Styles","description":"视觉风格可选项"},"styles_by_visual_style":{"additionalProperties":{"items":{"$ref":"#/components/schemas/StyleOption"},"type":"array"},"type":"object","title":"Styles By Visual Style","description":"按视觉风格分组的视频风格选项"},"default_style_by_visual_style":{"additionalProperties":{"type":"string"},"type":"object","title":"Default Style By Visual Style","description":"各视觉风格默认视频风格"}},"type":"object","title":"ProjectStyleOptionsRead","description":"项目风格候选项。"},"ProjectUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"style":{"anyOf":[{"$ref":"#/components/schemas/ProjectStyle"},{"type":"null"}],"description":"题材/风格","examples":["真人都市","真人科幻","真人古装","动漫科幻","动漫3D","国漫","水墨画"]},"visual_style":{"anyOf":[{"$ref":"#/components/schemas/ProjectVisualStyle"},{"type":"null"}]},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"},"unify_style":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Unify Style"},"progress":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress"},"default_video_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Video Ratio"},"stats":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Stats"}},"type":"object","title":"ProjectUpdate"},"ProjectVisualStyle":{"type":"string","enum":["现实","动漫"],"title":"ProjectVisualStyle","description":"画面表现形式维度:用于区分现实/动漫等。"},"PromptCategory":{"type":"string","enum":["frame_head_image","frame_tail_image","frame_key_image","frame_head_prompt","frame_tail_prompt","frame_key_prompt","video_prompt","storyboard_prompt","bgm","sfx","character_image_front","character_image_other","actor_image_front","actor_image_other","prop_image_front","prop_image_other","scene_image_front","scene_image_other","costume_image_front","costume_image_other","combined"],"title":"PromptCategory","description":"提示词模板类别。"},"PromptCategoryOptionRead":{"properties":{"value":{"$ref":"#/components/schemas/PromptCategory","description":"类别枚举值"},"label":{"type":"string","title":"Label","description":"中文名称"},"description":{"type":"string","title":"Description","description":"类别简介","default":""}},"type":"object","required":["value","label"],"title":"PromptCategoryOptionRead","description":"提示词类别选项(枚举值 + 中文标签 + 简介)。"},"PromptTemplateCreate":{"properties":{"category":{"$ref":"#/components/schemas/PromptCategory","description":"模板类别"},"name":{"type":"string","title":"Name","description":"模板名称"},"content":{"type":"string","title":"Content","description":"模板内容"},"preview":{"type":"string","title":"Preview","description":"预览文案","default":""},"variables":{"items":{"type":"string"},"type":"array","title":"Variables","description":"变量名列表"},"is_default":{"type":"boolean","title":"Is Default","description":"是否为默认提示词","default":false}},"type":"object","required":["category","name","content"],"title":"PromptTemplateCreate","description":"创建提示词模板。id 由后端自动生成;is_system 不可由客户端设置。"},"PromptTemplateRead":{"properties":{"id":{"type":"string","title":"Id","description":"模板 ID"},"category":{"$ref":"#/components/schemas/PromptCategory","description":"模板类别"},"name":{"type":"string","title":"Name","description":"模板名称"},"preview":{"type":"string","title":"Preview","description":"预览文案"},"content":{"type":"string","title":"Content","description":"模板内容"},"variables":{"items":{"type":"string"},"type":"array","title":"Variables","description":"变量名列表"},"is_default":{"type":"boolean","title":"Is Default","description":"是否为默认提示词"},"is_system":{"type":"boolean","title":"Is System","description":"是否为系统预置"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"创建时间"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"最后更新时间"}},"type":"object","required":["id","category","name","preview","content","variables","is_default","is_system","created_at","updated_at"],"title":"PromptTemplateRead","description":"读取提示词模板(含全部字段)。"},"PromptTemplateUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"模板名称"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","description":"模板内容"},"preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview","description":"预览文案"},"variables":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Variables","description":"变量名列表(整体替换)"},"is_default":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Default","description":"是否为默认提示词"}},"type":"object","title":"PromptTemplateUpdate","description":"局部更新提示词模板。不含 id / is_system。"},"PropInfoAnalysisRequest":{"properties":{"relation_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Entity Id","description":"任务关联实体 ID(资产页恢复任务可选)"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"项目 ID(异步任务关联可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(异步任务关联可选)"},"prop_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prop Context","description":"原文道具上下文(可为空;用于提供额外背景,帮助判断缺失信息)"},"prop_description":{"type":"string","minLength":1,"title":"Prop Description","description":"原文道具描述"}},"type":"object","required":["prop_description"],"title":"PropInfoAnalysisRequest","description":"道具信息缺失分析请求。"},"PropInfoAnalysisResult":{"properties":{"issues":{"items":{"type":"string"},"type":"array","title":"Issues"},"optimized_description":{"type":"string","title":"Optimized Description"}},"additionalProperties":false,"type":"object","required":["issues","optimized_description"],"title":"PropInfoAnalysisResult","description":"根据原文道具描述,分析缺少的信息,并给出优化后的可生成道具描述。"},"ProviderCreate":{"properties":{"name":{"type":"string","title":"Name","description":"供应商名称"},"base_url":{"type":"string","title":"Base Url","description":"文本/通用 API Base URL"},"image_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Base Url","description":"图片能力 API Base URL(可选覆盖)"},"video_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Base Url","description":"视频能力 API Base URL(可选覆盖)"},"description":{"type":"string","title":"Description","description":"说明","default":""},"status":{"$ref":"#/components/schemas/ProviderStatus","description":"状态:active/testing/disabled","default":"testing"},"created_by":{"type":"string","title":"Created By","description":"创建人","default":""},"id":{"type":"string","title":"Id","description":"供应商 ID"},"api_key":{"type":"string","title":"Api Key","description":"API Key(敏感,不在响应中回显)","default":""},"api_secret":{"type":"string","title":"Api Secret","description":"API Secret(敏感,不在响应中回显)","default":""}},"type":"object","required":["name","base_url","id"],"title":"ProviderCreate","description":"创建供应商时的请求体,允许填写敏感字段。"},"ProviderRead":{"properties":{"name":{"type":"string","title":"Name","description":"供应商名称"},"base_url":{"type":"string","title":"Base Url","description":"文本/通用 API Base URL"},"image_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Base Url","description":"图片能力 API Base URL(可选覆盖)"},"video_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Base Url","description":"视频能力 API Base URL(可选覆盖)"},"description":{"type":"string","title":"Description","description":"说明","default":""},"status":{"$ref":"#/components/schemas/ProviderStatus","description":"状态:active/testing/disabled","default":"testing"},"created_by":{"type":"string","title":"Created By","description":"创建人","default":""},"id":{"type":"string","title":"Id","description":"供应商 ID"}},"type":"object","required":["name","base_url","id"],"title":"ProviderRead","description":"对外返回的供应商信息(不包含 api_key/api_secret)。"},"ProviderStatus":{"type":"string","enum":["active","testing","disabled"],"title":"ProviderStatus","description":"供应商启用状态。"},"ProviderSupportedRead":{"properties":{"key":{"type":"string","title":"Key","description":"供应商稳定键"},"display_name":{"type":"string","title":"Display Name","description":"供应商展示名"},"aliases":{"items":{"type":"string"},"type":"array","title":"Aliases","description":"可识别别名"},"supported_categories":{"items":{"$ref":"#/components/schemas/ModelCategoryKey"},"type":"array","title":"Supported Categories","description":"支持的模型类别"},"default_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Base Url","description":"默认 API Base URL"},"requires_api_key":{"type":"boolean","title":"Requires Api Key","description":"是否要求 api_key","default":true},"requires_api_secret":{"type":"boolean","title":"Requires Api Secret","description":"是否要求 api_secret","default":false},"is_experimental":{"type":"boolean","title":"Is Experimental","description":"是否实验性供应商","default":false}},"type":"object","required":["key","display_name"],"title":"ProviderSupportedRead","description":"系统支持的供应商能力清单。"},"ProviderUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"供应商名称"},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url","description":"文本/通用 API Base URL"},"image_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Base Url","description":"图片能力 API Base URL(可选覆盖)"},"video_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Base Url","description":"视频能力 API Base URL(可选覆盖)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"说明"},"status":{"anyOf":[{"$ref":"#/components/schemas/ProviderStatus"},{"type":"null"}],"description":"状态:active/testing/disabled"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key","description":"API Key(敏感,不在响应中回显)"},"api_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Secret","description":"API Secret(敏感,不在响应中回显)"}},"type":"object","title":"ProviderUpdate","description":"更新供应商时的可选字段。"},"RenderedPromptResponse":{"properties":{"prompt":{"type":"string","title":"Prompt","description":"渲染后的提示词(已套用模板与变量替换)"},"images":{"items":{"type":"string"},"type":"array","title":"Images","description":"参考图 file_id 列表(自动选择;顺序有效)"}},"type":"object","required":["prompt"],"title":"RenderedPromptResponse"},"RenderedShotFramePromptRead":{"properties":{"base_prompt":{"type":"string","title":"Base Prompt","description":"原始基础提示词(不含图片映射说明)"},"rendered_prompt":{"type":"string","title":"Rendered Prompt","description":"最终提交给模型的提示词(含图片映射说明)"},"images":{"items":{"type":"string"},"type":"array","title":"Images","description":"最终参考图 file_id 列表,顺序与 mappings 一致"},"mappings":{"items":{"$ref":"#/components/schemas/ShotFramePromptMappingRead"},"type":"array","title":"Mappings","description":"图片与实体名称的映射关系,顺序与 images 完全一致"}},"type":"object","required":["base_prompt","rendered_prompt"],"title":"RenderedShotFramePromptRead","description":"关键帧最终生成提示词渲染结果。"},"SceneInfoAnalysisRequest":{"properties":{"relation_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Entity Id","description":"任务关联实体 ID(资产页恢复任务可选)"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"项目 ID(异步任务关联可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(异步任务关联可选)"},"scene_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scene Context","description":"原文场景上下文(可为空;用于提供额外背景,帮助判断缺失信息)"},"scene_description":{"type":"string","minLength":1,"title":"Scene Description","description":"原文场景描述"}},"type":"object","required":["scene_description"],"title":"SceneInfoAnalysisRequest","description":"场景信息缺失分析请求。"},"SceneInfoAnalysisResult":{"properties":{"issues":{"items":{"type":"string"},"type":"array","title":"Issues"},"optimized_description":{"type":"string","title":"Optimized Description"}},"additionalProperties":false,"type":"object","required":["issues","optimized_description"],"title":"SceneInfoAnalysisResult","description":"根据原文场景描述,分析缺少的信息,并给出优化后的可生成场景描述。"},"ScriptConsistencyCheckRequest":{"properties":{"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"项目 ID(异步任务关联可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(异步任务关联可选)"},"script_text":{"type":"string","minLength":1,"title":"Script Text","description":"完整剧本文本"}},"type":"object","required":["script_text"],"title":"ScriptConsistencyCheckRequest","description":"一致性检查请求(角色混淆)。"},"ScriptConsistencyCheckResult":{"properties":{"issues":{"items":{"$ref":"#/components/schemas/ScriptConsistencyIssue"},"type":"array","title":"Issues","description":"问题列表"},"has_issues":{"type":"boolean","title":"Has Issues","description":"是否发现问题"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"总结(可选)"}},"additionalProperties":false,"type":"object","required":["has_issues"],"title":"ScriptConsistencyCheckResult","description":"基于原文的一致性检查结果(聚焦角色混淆)。"},"ScriptConsistencyIssue":{"properties":{"issue_type":{"type":"string","const":"character_confusion","title":"Issue Type","description":"固定为角色混淆类问题","default":"character_confusion"},"character_candidates":{"items":{"type":"string"},"type":"array","title":"Character Candidates","description":"涉及的角色候选(名字/称呼/ID 皆可,优先用原文称呼)"},"description":{"type":"string","title":"Description","description":"问题描述(为什么会混淆)"},"suggestion":{"type":"string","title":"Suggestion","description":"修改建议(如何改写以消除混淆)"},"affected_lines":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Affected Lines","description":"受影响的行号范围,形如 {start_line: x, end_line: y}"},"evidence":{"items":{"$ref":"#/components/schemas/EvidenceSpan"},"type":"array","title":"Evidence","description":"原文依据(可选)"}},"additionalProperties":false,"type":"object","required":["description","suggestion"],"title":"ScriptConsistencyIssue","description":"角色混淆类一致性问题:同一角色在不同镜头被赋予不同身份/行为主体导致混淆。"},"ScriptDividerRequest":{"properties":{"script_text":{"type":"string","minLength":1,"title":"Script Text","description":"完整剧本文本"},"write_to_db":{"type":"boolean","title":"Write To Db","description":"是否将分镜写入数据库(AI Studio shots 表)","default":false},"chapter_id":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(write_to_db=true 时必填)"}},"type":"object","required":["script_text"],"title":"ScriptDividerRequest","description":"剧本分镜请求。"},"ScriptDivisionResult":{"properties":{"shots":{"items":{"$ref":"#/components/schemas/ShotDivision"},"type":"array","title":"Shots","description":"分镜列表"},"total_shots":{"type":"integer","minimum":0.0,"title":"Total Shots","description":"总镜头数"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","description":"拆分说明或建议(可选)"}},"additionalProperties":false,"type":"object","required":["total_shots"],"title":"ScriptDivisionResult","description":"剧本分镜结果:镜头列表(每镜起止行号+预览文本)。"},"ScriptExtractRequest":{"properties":{"project_id":{"type":"string","minLength":1,"title":"Project Id","description":"项目 ID"},"chapter_id":{"type":"string","minLength":1,"title":"Chapter Id","description":"章节 ID"},"script_division":{"additionalProperties":true,"type":"object","title":"Script Division","description":"分镜结果(ScriptDivisionResult 序列化)"},"consistency":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Consistency","description":"一致性检查结果(可选;ScriptConsistencyCheckResult 序列化)"},"refresh_cache":{"type":"boolean","title":"Refresh Cache","description":"是否跳过后端缓存并强制重新提取","default":false}},"type":"object","required":["project_id","chapter_id","script_division"],"title":"ScriptExtractRequest","description":"项目级信息提取请求(最终输出)。"},"ScriptOptimizationResult":{"properties":{"optimized_script_text":{"type":"string","title":"Optimized Script Text","description":"优化后的剧本文本"},"change_summary":{"type":"string","title":"Change Summary","description":"改动摘要(只围绕 issues)"}},"additionalProperties":false,"type":"object","required":["optimized_script_text","change_summary"],"title":"ScriptOptimizationResult","description":"剧本优化输出:仅在发现角色混淆问题时使用。"},"ScriptOptimizeRequest":{"properties":{"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"项目 ID(异步任务关联可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(异步任务关联可选)"},"script_text":{"type":"string","minLength":1,"title":"Script Text","description":"原文剧本文本"},"consistency":{"additionalProperties":true,"type":"object","title":"Consistency","description":"一致性检查输出(ScriptConsistencyCheckResult 序列化)"}},"type":"object","required":["script_text","consistency"],"title":"ScriptOptimizeRequest","description":"剧本优化请求(基于一致性检查结果)。"},"ScriptSimplificationResult":{"properties":{"simplified_script_text":{"type":"string","title":"Simplified Script Text","description":"精简后的剧本文本"},"simplification_summary":{"type":"string","title":"Simplification Summary","description":"精简策略摘要(说明删改原则)"}},"additionalProperties":false,"type":"object","required":["simplified_script_text","simplification_summary"],"title":"ScriptSimplificationResult","description":"剧本精简输出:在保留剧情主体与连续性的前提下压缩篇幅。"},"ScriptSimplifyRequest":{"properties":{"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"项目 ID(异步任务关联可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(异步任务关联可选)"},"script_text":{"type":"string","minLength":1,"title":"Script Text","description":"原文剧本文本"}},"type":"object","required":["script_text"],"title":"ScriptSimplifyRequest","description":"智能精简剧本请求。"},"ShotAssetOverviewItem":{"properties":{"key":{"type":"string","title":"Key","description":"合并键:type:name"},"type":{"type":"string","enum":["character","prop","scene","costume"],"title":"Type","description":"实体类型:character/prop/scene/costume"},"name":{"type":"string","title":"Name","description":"资产名称"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"候选描述(来自 extraction payload)"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail","description":"缩略图"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"缩略图或参考图文件 ID"},"source":{"type":"string","enum":["linked","candidate","both"],"title":"Source","description":"来源:linked/candidate/both"},"candidate_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Candidate Id","description":"候选项 ID"},"candidate_status":{"anyOf":[{"$ref":"#/components/schemas/ShotCandidateStatus"},{"type":"null"}],"description":"候选确认状态"},"linked_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linked Entity Id","description":"当前已关联实体 ID"},"linked_image_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Linked Image Id","description":"当前已关联实体的 image 行 ID"},"is_linked":{"type":"boolean","title":"Is Linked","description":"当前是否已关联到镜头"}},"type":"object","required":["key","type","name","source","is_linked"],"title":"ShotAssetOverviewItem","description":"分镜资产总览项:统一返回已关联资产与提取候选的合并视图。"},"ShotAssetsOverviewRead":{"properties":{"shot_id":{"type":"string","title":"Shot Id","description":"镜头 ID"},"skip_extraction":{"type":"boolean","title":"Skip Extraction","description":"是否明确跳过提取"},"status":{"$ref":"#/components/schemas/ShotStatus","description":"镜头流程状态"},"summary":{"$ref":"#/components/schemas/ShotAssetsOverviewSummary","description":"总览统计"},"items":{"items":{"$ref":"#/components/schemas/ShotAssetOverviewItem"},"type":"array","title":"Items","description":"资产总览项"}},"type":"object","required":["shot_id","skip_extraction","status","summary"],"title":"ShotAssetsOverviewRead"},"ShotAssetsOverviewSummary":{"properties":{"linked_count":{"type":"integer","title":"Linked Count","description":"已关联项数量"},"pending_count":{"type":"integer","title":"Pending Count","description":"待确认候选数量"},"ignored_count":{"type":"integer","title":"Ignored Count","description":"已忽略候选数量"},"total_count":{"type":"integer","title":"Total Count","description":"总项数(含 ignored)"}},"type":"object","required":["linked_count","pending_count","ignored_count","total_count"],"title":"ShotAssetsOverviewSummary"},"ShotCandidateStatus":{"type":"string","enum":["pending","linked","ignored"],"title":"ShotCandidateStatus","description":"镜头提取候选确认状态。"},"ShotCandidateType":{"type":"string","enum":["character","scene","prop","costume"],"title":"ShotCandidateType","description":"镜头提取候选类型。"},"ShotCharacterLinkCreate":{"properties":{"shot_id":{"type":"string","title":"Shot Id"},"character_id":{"type":"string","title":"Character Id"},"index":{"type":"integer","title":"Index","default":0},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["shot_id","character_id"],"title":"ShotCharacterLinkCreate"},"ShotCharacterLinkRead":{"properties":{"id":{"type":"integer","title":"Id","description":"关联行 ID"},"shot_id":{"type":"string","title":"Shot Id","description":"镜头 ID"},"character_id":{"type":"string","title":"Character Id","description":"角色 ID"},"index":{"type":"integer","title":"Index","description":"镜头内角色排序","default":0},"note":{"type":"string","title":"Note","description":"备注","default":""}},"type":"object","required":["id","shot_id","character_id"],"title":"ShotCharacterLinkRead"},"ShotCreate":{"properties":{"id":{"type":"string","title":"Id","description":"镜头 ID"},"chapter_id":{"type":"string","title":"Chapter Id","description":"所属章节 ID"},"index":{"type":"integer","title":"Index","description":"镜头序号(章节内唯一)"},"title":{"type":"string","title":"Title","description":"镜头标题"},"thumbnail":{"type":"string","title":"Thumbnail","description":"缩略图 URL/路径","default":""},"status":{"$ref":"#/components/schemas/ShotStatus","description":"镜头状态","default":"pending"},"skip_extraction":{"type":"boolean","title":"Skip Extraction","description":"是否明确跳过信息提取","default":false},"script_excerpt":{"type":"string","title":"Script Excerpt","description":"剧本摘录","default":""},"generated_video_file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated Video File Id","description":"已生成视频关联的文件 ID(files.id,type=video)"}},"type":"object","required":["id","chapter_id","index","title"],"title":"ShotCreate"},"ShotDetailCreate":{"properties":{"id":{"type":"string","title":"Id","description":"镜头 ID(与 shots.id 共享主键)"},"camera_shot":{"$ref":"#/components/schemas/CameraShotType","description":"景别"},"angle":{"$ref":"#/components/schemas/CameraAngle","description":"机位角度"},"movement":{"$ref":"#/components/schemas/CameraMovement","description":"运镜方式"},"scene_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scene Id","description":"关联场景 ID(可空)"},"duration":{"type":"integer","title":"Duration","description":"时长(秒)","default":0},"override_video_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Override Video Ratio","description":"分镜级视频比例覆盖;为空表示继承项目默认"},"mood_tags":{"items":{"type":"string"},"type":"array","title":"Mood Tags","description":"情绪标签"},"atmosphere":{"type":"string","title":"Atmosphere","description":"氛围描述","default":""},"follow_atmosphere":{"type":"boolean","title":"Follow Atmosphere","description":"是否沿用氛围","default":true},"has_bgm":{"type":"boolean","title":"Has Bgm","description":"是否包含 BGM","default":false},"vfx_type":{"$ref":"#/components/schemas/VFXType","description":"视效类型","default":"NONE"},"vfx_note":{"type":"string","title":"Vfx Note","description":"视效说明","default":""},"first_frame_prompt":{"type":"string","title":"First Frame Prompt","description":"镜头分镜首帧提示词","default":""},"last_frame_prompt":{"type":"string","title":"Last Frame Prompt","description":"镜头分镜尾帧提示词","default":""},"key_frame_prompt":{"type":"string","title":"Key Frame Prompt","description":"镜头分镜关键帧提示词","default":""}},"type":"object","required":["id","camera_shot","angle","movement"],"title":"ShotDetailCreate"},"ShotDetailRead":{"properties":{"id":{"type":"string","title":"Id","description":"镜头 ID(与 shots.id 共享主键)"},"camera_shot":{"$ref":"#/components/schemas/CameraShotType","description":"景别"},"angle":{"$ref":"#/components/schemas/CameraAngle","description":"机位角度"},"movement":{"$ref":"#/components/schemas/CameraMovement","description":"运镜方式"},"scene_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scene Id","description":"关联场景 ID(可空)"},"duration":{"type":"integer","title":"Duration","description":"时长(秒)","default":0},"override_video_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Override Video Ratio","description":"分镜级视频比例覆盖;为空表示继承项目默认"},"mood_tags":{"items":{"type":"string"},"type":"array","title":"Mood Tags","description":"情绪标签"},"atmosphere":{"type":"string","title":"Atmosphere","description":"氛围描述","default":""},"follow_atmosphere":{"type":"boolean","title":"Follow Atmosphere","description":"是否沿用氛围","default":true},"has_bgm":{"type":"boolean","title":"Has Bgm","description":"是否包含 BGM","default":false},"vfx_type":{"$ref":"#/components/schemas/VFXType","description":"视效类型","default":"NONE"},"vfx_note":{"type":"string","title":"Vfx Note","description":"视效说明","default":""},"first_frame_prompt":{"type":"string","title":"First Frame Prompt","description":"镜头分镜首帧提示词","default":""},"last_frame_prompt":{"type":"string","title":"Last Frame Prompt","description":"镜头分镜尾帧提示词","default":""},"key_frame_prompt":{"type":"string","title":"Key Frame Prompt","description":"镜头分镜关键帧提示词","default":""}},"type":"object","required":["id","camera_shot","angle","movement"],"title":"ShotDetailRead"},"ShotDetailUpdate":{"properties":{"camera_shot":{"anyOf":[{"$ref":"#/components/schemas/CameraShotType"},{"type":"null"}]},"angle":{"anyOf":[{"$ref":"#/components/schemas/CameraAngle"},{"type":"null"}]},"movement":{"anyOf":[{"$ref":"#/components/schemas/CameraMovement"},{"type":"null"}]},"scene_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scene Id"},"duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration"},"override_video_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Override Video Ratio"},"mood_tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Mood Tags"},"atmosphere":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Atmosphere"},"follow_atmosphere":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Follow Atmosphere"},"has_bgm":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Bgm"},"vfx_type":{"anyOf":[{"$ref":"#/components/schemas/VFXType"},{"type":"null"}]},"vfx_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vfx Note"},"first_frame_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Frame Prompt"},"last_frame_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Frame Prompt"},"key_frame_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Frame Prompt"}},"type":"object","title":"ShotDetailUpdate"},"ShotDialogLineCreate":{"properties":{"shot_detail_id":{"type":"string","title":"Shot Detail Id"},"index":{"type":"integer","title":"Index","default":0},"text":{"type":"string","title":"Text"},"line_mode":{"$ref":"#/components/schemas/DialogueLineMode","default":"DIALOGUE"},"speaker_character_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speaker Character Id"},"target_character_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Character Id"},"speaker_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speaker Name"},"target_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Name"}},"type":"object","required":["shot_detail_id","text"],"title":"ShotDialogLineCreate"},"ShotDialogLineRead":{"properties":{"id":{"type":"integer","title":"Id","description":"对话行 ID"},"shot_detail_id":{"type":"string","title":"Shot Detail Id","description":"所属镜头细节 ID"},"index":{"type":"integer","title":"Index","description":"行号(镜头内排序)","default":0},"text":{"type":"string","title":"Text","description":"台词内容"},"line_mode":{"$ref":"#/components/schemas/DialogueLineMode","description":"对白模式","default":"DIALOGUE"},"speaker_character_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speaker Character Id","description":"说话角色 ID"},"target_character_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Character Id","description":"听者角色 ID"},"speaker_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speaker Name","description":"说话角色名称(用于回填关联;可空)"},"target_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Name","description":"听者角色名称(用于回填关联;可空)"}},"type":"object","required":["id","shot_detail_id","text"],"title":"ShotDialogLineRead"},"ShotDialogLineUpdate":{"properties":{"index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Index"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"line_mode":{"anyOf":[{"$ref":"#/components/schemas/DialogueLineMode"},{"type":"null"}]},"speaker_character_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speaker Character Id"},"target_character_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Character Id"},"speaker_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speaker Name"},"target_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Name"}},"type":"object","title":"ShotDialogLineUpdate"},"ShotDialogueCandidateStatus":{"type":"string","enum":["pending","accepted","ignored"],"title":"ShotDialogueCandidateStatus","description":"镜头对白提取候选确认状态。"},"ShotDivision":{"properties":{"index":{"type":"integer","minimum":1.0,"title":"Index","description":"镜头序号(章节内唯一)"},"start_line":{"type":"integer","minimum":1.0,"title":"Start Line","description":"起始行号(1-based)"},"end_line":{"type":"integer","minimum":1.0,"title":"End Line","description":"结束行号(1-based)"},"script_excerpt":{"type":"string","title":"Script Excerpt","description":"镜头对应的剧本摘录/文本"},"shot_name":{"type":"string","title":"Shot Name","description":"镜头名称(分镜名/镜头标题)","default":""},"time_of_day":{"anyOf":[{"type":"string","enum":["DAY","NIGHT","DAWN","DUSK","UNKNOWN","日","夜","黎明","黄昏","不明","未知"]},{"type":"null"}],"title":"Time Of Day","description":"时间(日/夜/未知等,可选)"}},"additionalProperties":false,"type":"object","required":["index","start_line","end_line","script_excerpt"],"title":"ShotDivision","description":"剧本分镜中的单镜信息:行号 + 预览文本(可选弱语义)。"},"ShotExtractedCandidateLinkRequest":{"properties":{"linked_entity_id":{"type":"string","title":"Linked Entity Id","description":"确认关联到的实体 ID"}},"type":"object","required":["linked_entity_id"],"title":"ShotExtractedCandidateLinkRequest"},"ShotExtractedCandidateRead":{"properties":{"id":{"type":"integer","title":"Id","description":"候选项 ID"},"shot_id":{"type":"string","title":"Shot Id","description":"所属镜头 ID"},"candidate_type":{"$ref":"#/components/schemas/ShotCandidateType","description":"候选类型"},"candidate_name":{"type":"string","title":"Candidate Name","description":"提取出的候选名称"},"candidate_status":{"$ref":"#/components/schemas/ShotCandidateStatus","description":"候选确认状态"},"linked_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linked Entity Id","description":"已关联实体 ID"},"source":{"type":"string","title":"Source","description":"候选来源"},"payload":{"additionalProperties":true,"type":"object","title":"Payload","description":"候选附加信息"},"confirmed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Confirmed At","description":"确认时间"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"创建时间"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"更新时间"}},"type":"object","required":["id","shot_id","candidate_type","candidate_name","candidate_status","source","created_at","updated_at"],"title":"ShotExtractedCandidateRead"},"ShotExtractedDialogueCandidateAcceptRequest":{"properties":{"index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Index","description":"写入对白行时使用的排序;为空则使用候选排序"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text","description":"接受时可覆盖对白文本"},"line_mode":{"anyOf":[{"$ref":"#/components/schemas/DialogueLineMode"},{"type":"null"}],"description":"接受时可覆盖对白模式"},"speaker_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speaker Name","description":"接受时可覆盖说话角色名称"},"target_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Name","description":"接受时可覆盖听者角色名称"}},"type":"object","title":"ShotExtractedDialogueCandidateAcceptRequest"},"ShotExtractedDialogueCandidateRead":{"properties":{"id":{"type":"integer","title":"Id","description":"对白候选项 ID"},"shot_id":{"type":"string","title":"Shot Id","description":"所属镜头 ID"},"index":{"type":"integer","title":"Index","description":"镜头内对白候选排序"},"text":{"type":"string","title":"Text","description":"提取出的对白文本"},"line_mode":{"$ref":"#/components/schemas/DialogueLineMode","description":"对白模式"},"speaker_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speaker Name","description":"说话角色名称"},"target_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Name","description":"听者角色名称"},"candidate_status":{"$ref":"#/components/schemas/ShotDialogueCandidateStatus","description":"对白候选确认状态"},"linked_dialog_line_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Linked Dialog Line Id","description":"已接受后关联的对白行 ID"},"source":{"type":"string","title":"Source","description":"候选来源"},"payload":{"additionalProperties":true,"type":"object","title":"Payload","description":"候选附加信息"},"confirmed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Confirmed At","description":"确认时间"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"创建时间"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"更新时间"}},"type":"object","required":["id","shot_id","index","text","line_mode","candidate_status","source","created_at","updated_at"],"title":"ShotExtractedDialogueCandidateRead"},"ShotExtractionSummaryRead":{"properties":{"state":{"type":"string","enum":["not_extracted","extracted_empty","extracted_pending","extracted_resolved","skipped"],"title":"State","description":"镜头提取确认状态摘要"},"has_extracted":{"type":"boolean","title":"Has Extracted","description":"是否已执行过提取"},"last_extracted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Extracted At","description":"最近一次提取完成时间"},"asset_candidate_total":{"type":"integer","title":"Asset Candidate Total","description":"资产候选总数","default":0},"dialogue_candidate_total":{"type":"integer","title":"Dialogue Candidate Total","description":"对白候选总数","default":0},"pending_asset_count":{"type":"integer","title":"Pending Asset Count","description":"待确认资产候选数","default":0},"pending_dialogue_count":{"type":"integer","title":"Pending Dialogue Count","description":"待确认对白候选数","default":0}},"type":"object","required":["state","has_extracted"],"title":"ShotExtractionSummaryRead"},"ShotFrameImageCreate":{"properties":{"shot_detail_id":{"type":"string","title":"Shot Detail Id"},"frame_type":{"$ref":"#/components/schemas/ShotFrameType"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"format":{"type":"string","title":"Format","default":"png"}},"type":"object","required":["shot_detail_id","frame_type"],"title":"ShotFrameImageCreate"},"ShotFrameImageRead":{"properties":{"id":{"type":"integer","title":"Id","description":"图片行 ID"},"shot_detail_id":{"type":"string","title":"Shot Detail Id","description":"所属镜头细节 ID"},"frame_type":{"$ref":"#/components/schemas/ShotFrameType","description":"帧类型:first/last/key"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"关联的 FileItem ID(可为空,允许先创建占位)"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width","description":"宽(px)"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height","description":"高(px)"},"format":{"type":"string","title":"Format","description":"格式","default":"png"}},"type":"object","required":["id","shot_detail_id","frame_type"],"title":"ShotFrameImageRead"},"ShotFrameImageTaskRequest":{"properties":{"model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Id","description":"可选模型 ID(models.id);不传则使用 ModelSettings.default_image_model_id;Provider 由模型关联反查"},"frame_type":{"$ref":"#/components/schemas/ShotFrameType","description":"first | last | key"},"prompt":{"type":"string","minLength":1,"title":"Prompt","description":"提示词(由前端传入,创建任务接口必填)。"},"images":{"items":{"$ref":"#/components/schemas/ShotLinkedAssetItem"},"type":"array","title":"Images","description":"参考资产条目列表(可多张,顺序有效)。后端会使用 item.file_id 作为参考图;无效条目会被跳过。"},"target_ratio":{"type":"string","enum":["16:9","4:3","1:1","3:4","9:16","21:9","3:2","2:3"],"title":"Target Ratio","description":"目标视频画幅比例;关键帧将按该画幅生成,以提升后续视频参考稳定性"},"resolution_profile":{"anyOf":[{"type":"string","enum":["standard","high"]},{"type":"null"}],"title":"Resolution Profile","description":"关键帧输出分辨率档位,默认 standard","default":"standard"}},"type":"object","required":["frame_type","prompt","target_ratio"],"title":"ShotFrameImageTaskRequest","description":"镜头分镜帧图片生成请求体:只根据 `shot_id + frame_type` 定位 ShotFrameImage。\n\n用于替代旧接口中通过 `image_id` 直接传入 ShotFrameImage.id 的方式。"},"ShotFrameImageUpdate":{"properties":{"frame_type":{"anyOf":[{"$ref":"#/components/schemas/ShotFrameType"},{"type":"null"}]},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"}},"type":"object","title":"ShotFrameImageUpdate"},"ShotFramePromptMappingRead":{"properties":{"token":{"type":"string","title":"Token","description":"提示词中的图片占位 token,如 图1 / 图2"},"type":{"type":"string","enum":["character","prop","scene","costume"],"title":"Type","description":"实体类型:character/prop/scene/costume"},"id":{"type":"string","title":"Id","description":"实体 ID(如 character_id/prop_id/scene_id/costume_id)"},"name":{"type":"string","title":"Name","description":"实体名称"},"file_id":{"type":"string","title":"File Id","description":"本次渲染与生成使用的文件 ID"}},"type":"object","required":["token","type","id","name","file_id"],"title":"ShotFramePromptMappingRead","description":"关键帧提示词渲染后的图片映射关系。"},"ShotFramePromptRenderRequest":{"properties":{"frame_type":{"$ref":"#/components/schemas/ShotFrameType","description":"first | last | key"},"prompt":{"type":"string","minLength":1,"title":"Prompt","description":"原始基础提示词。渲染接口要求显式传入,用于生成最终提示词。"},"images":{"items":{"$ref":"#/components/schemas/ShotLinkedAssetItem"},"type":"array","title":"Images","description":"参考资产条目列表(可多张,顺序有效)。后端会使用 item.file_id 作为参考图;无效条目会被跳过。"}},"type":"object","required":["frame_type","prompt"],"title":"ShotFramePromptRenderRequest","description":"镜头分镜帧提示词渲染请求体。"},"ShotFramePromptRequest":{"properties":{"shot_id":{"type":"string","title":"Shot Id","description":"镜头 ID"},"frame_type":{"type":"string","title":"Frame Type","description":"first | last | key"}},"type":"object","required":["shot_id","frame_type"],"title":"ShotFramePromptRequest","description":"镜头分镜帧提示词生成任务请求。"},"ShotFrameType":{"type":"string","enum":["first","last","key"],"title":"ShotFrameType","description":"镜头分镜帧类型:首帧/尾帧/关键帧。"},"ShotLinkedAssetItem":{"properties":{"type":{"type":"string","enum":["character","prop","scene","costume"],"title":"Type","description":"实体类型:character/prop/scene/costume"},"id":{"type":"string","title":"Id","description":"实体 ID(如 character_id/prop_id/scene_id/costume_id)"},"image_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Image Id","description":"最佳缩略图对应的 image 行 ID(如 PropImage.id);无图则为 null"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"最佳缩略图对应的文件 ID(files.id);用于参考图输入;无图则为 null"},"name":{"type":"string","title":"Name","description":"实体名称"},"thumbnail":{"type":"string","title":"Thumbnail","description":"缩略图下载地址(/api/v1/studio/files/{file_id}/download)","default":""}},"type":"object","required":["type","id","name"],"title":"ShotLinkedAssetItem","description":"按分镜聚合返回的关联资产条目(角色/道具/场景/服装)。"},"ShotPreparationLinkEntityType":{"type":"string","enum":["character","scene","prop","costume"],"title":"ShotPreparationLinkEntityType"},"ShotPreparationLinkRequest":{"properties":{"project_id":{"type":"string","title":"Project Id","description":"项目 ID"},"chapter_id":{"type":"string","title":"Chapter Id","description":"章节 ID"},"entity_type":{"$ref":"#/components/schemas/ShotPreparationLinkEntityType","description":"准备页关联的实体类型"},"linked_entity_id":{"type":"string","title":"Linked Entity Id","description":"要关联的实体 ID"}},"type":"object","required":["project_id","chapter_id","entity_type","linked_entity_id"],"title":"ShotPreparationLinkRequest"},"ShotPreparationMutationAction":{"type":"string","enum":["link_asset_candidate","ignore_asset_candidate","accept_dialogue_candidate","ignore_dialogue_candidate","skip_extraction","resume_extraction"],"title":"ShotPreparationMutationAction"},"ShotPreparationMutationResultRead":{"properties":{"action":{"$ref":"#/components/schemas/ShotPreparationMutationAction","description":"本次执行的准备页动作"},"state":{"$ref":"#/components/schemas/ShotPreparationStateRead","description":"动作完成后的最新准备页聚合状态"}},"type":"object","required":["action","state"],"title":"ShotPreparationMutationResultRead","description":"准备页命令执行后的统一响应。"},"ShotPreparationStateRead":{"properties":{"shot":{"$ref":"#/components/schemas/ShotRead","description":"当前镜头最新状态"},"assets_overview":{"$ref":"#/components/schemas/ShotAssetsOverviewRead","description":"资产确认区聚合状态"},"dialogue_candidates":{"items":{"$ref":"#/components/schemas/ShotExtractedDialogueCandidateRead"},"type":"array","title":"Dialogue Candidates","description":"当前待处理/已存在的对白候选"},"saved_dialogue_lines":{"items":{"$ref":"#/components/schemas/ShotDialogLineRead"},"type":"array","title":"Saved Dialogue Lines","description":"当前已保存的对白行"},"pending_confirm_count":{"type":"integer","title":"Pending Confirm Count","description":"当前仍待确认的总数量(资产 + 对白)"},"ready_for_generation":{"type":"boolean","title":"Ready For Generation","description":"当前镜头是否已完成准备,可进入后续生成"}},"type":"object","required":["shot","assets_overview","pending_confirm_count","ready_for_generation"],"title":"ShotPreparationStateRead","description":"分镜准备页聚合状态。"},"ShotPromptAssetRef":{"properties":{"type":{"type":"string","enum":["character","prop","scene","costume"],"title":"Type","description":"资产类型"},"name":{"type":"string","title":"Name","description":"资产名称"},"description":{"type":"string","title":"Description","description":"资产描述或提取候选描述","default":""},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"可作为参考图的文件 ID"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail","description":"缩略图"}},"type":"object","required":["type","name"],"title":"ShotPromptAssetRef","description":"用于提示词渲染的镜头资产引用。"},"ShotPromptCameraInfo":{"properties":{"camera_shot":{"type":"string","title":"Camera Shot","description":"景别","default":""},"angle":{"type":"string","title":"Angle","description":"机位角度","default":""},"movement":{"type":"string","title":"Movement","description":"运镜方式","default":""},"duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration","description":"镜头时长(秒)"}},"type":"object","title":"ShotPromptCameraInfo","description":"用于提示词渲染的镜头语言信息。"},"ShotRead":{"properties":{"id":{"type":"string","title":"Id","description":"镜头 ID"},"chapter_id":{"type":"string","title":"Chapter Id","description":"所属章节 ID"},"index":{"type":"integer","title":"Index","description":"镜头序号(章节内唯一)"},"title":{"type":"string","title":"Title","description":"镜头标题"},"thumbnail":{"type":"string","title":"Thumbnail","description":"缩略图 URL/路径","default":""},"status":{"$ref":"#/components/schemas/ShotStatus","description":"镜头状态","default":"pending"},"skip_extraction":{"type":"boolean","title":"Skip Extraction","description":"是否明确跳过信息提取","default":false},"script_excerpt":{"type":"string","title":"Script Excerpt","description":"剧本摘录","default":""},"generated_video_file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated Video File Id","description":"已生成视频关联的文件 ID(files.id,type=video)"},"last_extracted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Extracted At","description":"最近一次完成信息提取的时间"},"extraction":{"$ref":"#/components/schemas/ShotExtractionSummaryRead","description":"镜头提取状态摘要"}},"type":"object","required":["id","chapter_id","index","title","extraction"],"title":"ShotRead"},"ShotRuntimeSummaryRead":{"properties":{"shot_id":{"type":"string","title":"Shot Id","description":"镜头 ID"},"has_active_tasks":{"type":"boolean","title":"Has Active Tasks","description":"是否存在进行中的关联任务"},"has_active_video_tasks":{"type":"boolean","title":"Has Active Video Tasks","description":"是否存在进行中的视频任务"},"has_active_prompt_tasks":{"type":"boolean","title":"Has Active Prompt Tasks","description":"是否存在进行中的提示词任务"},"has_active_frame_tasks":{"type":"boolean","title":"Has Active Frame Tasks","description":"是否存在进行中的分镜帧图片任务"},"active_task_count":{"type":"integer","title":"Active Task Count","description":"进行中的唯一任务数"}},"type":"object","required":["shot_id","has_active_tasks","has_active_video_tasks","has_active_prompt_tasks","has_active_frame_tasks","active_task_count"],"title":"ShotRuntimeSummaryRead"},"ShotSkipExtractionUpdate":{"properties":{"skip":{"type":"boolean","title":"Skip","description":"是否明确跳过信息提取"}},"type":"object","required":["skip"],"title":"ShotSkipExtractionUpdate"},"ShotStatus":{"type":"string","enum":["pending","generating","ready"],"title":"ShotStatus","description":"镜头生成状态(更多是“生产流程”而非剧情状态)。"},"ShotUpdate":{"properties":{"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id"},"index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Index"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail"},"status":{"anyOf":[{"$ref":"#/components/schemas/ShotStatus"},{"type":"null"}]},"skip_extraction":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Skip Extraction"},"script_excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Script Excerpt"},"generated_video_file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated Video File Id"}},"type":"object","title":"ShotUpdate"},"ShotVideoPromptPackRead":{"properties":{"shot_id":{"type":"string","title":"Shot Id","description":"镜头 ID"},"title":{"type":"string","title":"Title","description":"镜头标题","default":""},"script_excerpt":{"type":"string","title":"Script Excerpt","description":"剧本摘录","default":""},"action_beats":{"items":{"type":"string"},"type":"array","title":"Action Beats","description":"动作/场景要点"},"dialogue_summary":{"type":"string","title":"Dialogue Summary","description":"对白摘要","default":""},"characters":{"items":{"$ref":"#/components/schemas/ShotPromptAssetRef"},"type":"array","title":"Characters","description":"角色引用"},"scene":{"anyOf":[{"$ref":"#/components/schemas/ShotPromptAssetRef"},{"type":"null"}],"description":"场景引用"},"props":{"items":{"$ref":"#/components/schemas/ShotPromptAssetRef"},"type":"array","title":"Props","description":"道具引用"},"costumes":{"items":{"$ref":"#/components/schemas/ShotPromptAssetRef"},"type":"array","title":"Costumes","description":"服装引用"},"camera":{"$ref":"#/components/schemas/ShotPromptCameraInfo","description":"镜头语言"},"atmosphere":{"type":"string","title":"Atmosphere","description":"氛围描述","default":""},"visual_style":{"type":"string","title":"Visual Style","description":"项目视觉风格","default":""},"style":{"type":"string","title":"Style","description":"项目题材/风格","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","description":"默认负面提示词","default":""}},"type":"object","required":["shot_id"],"title":"ShotVideoPromptPackRead","description":"视频提示词渲染前的标准上下文包。"},"ShotVideoPromptPreviewRead":{"properties":{"shot_id":{"type":"string","title":"Shot Id","description":"镜头 ID"},"template_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Id","description":"使用的提示词模板 ID"},"template_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Name","description":"使用的提示词模板名称"},"rendered_prompt":{"type":"string","title":"Rendered Prompt","description":"渲染后的提示词"},"pack":{"$ref":"#/components/schemas/ShotVideoPromptPackRead","description":"渲染上下文包"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings","description":"渲染时发现的非阻塞提示"}},"type":"object","required":["shot_id","rendered_prompt","pack"],"title":"ShotVideoPromptPreviewRead","description":"视频提示词预览结果。"},"ShotVideoReadinessCheck":{"properties":{"key":{"type":"string","title":"Key","description":"检查项 key"},"ok":{"type":"boolean","title":"Ok","description":"是否通过"},"message":{"type":"string","title":"Message","description":"面向前端展示的说明"}},"type":"object","required":["key","ok","message"],"title":"ShotVideoReadinessCheck","description":"单项视频生成准备度检查结果。"},"ShotVideoReadinessRead":{"properties":{"shot_id":{"type":"string","title":"Shot Id","description":"镜头 ID"},"reference_mode":{"type":"string","title":"Reference Mode","description":"参考模式"},"ready":{"type":"boolean","title":"Ready","description":"是否满足当前 reference_mode 下的视频生成条件"},"checks":{"items":{"$ref":"#/components/schemas/ShotVideoReadinessCheck"},"type":"array","title":"Checks","description":"准备度检查项"}},"type":"object","required":["shot_id","reference_mode","ready"],"title":"ShotVideoReadinessRead","description":"镜头视频生成准备度。"},"StudioAssetDraft":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"资产 ID(已落库时回填,如 scene_id / prop_id / costume_id)"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"关联的文件 ID(可空)"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail","description":"缩略图下载地址(可空)"},"name":{"type":"string","title":"Name","description":"名称(同项目内建议唯一)"},"description":{"type":"string","title":"Description","description":"描述","default":""},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"标签"},"prompt_template_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt Template Id","description":"提示词模板 ID(可空)"},"view_count":{"type":"integer","minimum":1.0,"title":"View Count","description":"计划生成视角图数量","default":1}},"additionalProperties":false,"type":"object","required":["name"],"title":"StudioAssetDraft","description":"Studio 资产草稿(Scene/Prop/Costume)。\n\n导入 API 未传 id 时由服务端生成;分镜详情回填时可带 scene_id/prop_id/costume_id。"},"StudioCharacterDraft":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"角色 ID(已落库时回填 character_id)"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"关联的文件 ID(可空)"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail","description":"缩略图下载地址(可空)"},"index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Index","description":"镜头内角色排序(shot_character_links.index)"},"name":{"type":"string","title":"Name","description":"角色名称(同项目内建议唯一)"},"description":{"type":"string","title":"Description","description":"角色描述","default":""},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"标签(可选)"},"costume_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Costume Name","description":"服装名称(可选,导入时映射到 costume_id)"},"prop_names":{"items":{"type":"string"},"type":"array","title":"Prop Names","description":"角色常用道具名称列表(可选)"}},"additionalProperties":false,"type":"object","required":["name"],"title":"StudioCharacterDraft","description":"Studio 角色草稿。\n\n导入 API 未传 id 时由服务端生成;分镜详情回填时可带 character_id。"},"StudioImageTaskRequest":{"properties":{"model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Id","description":"可选模型 ID(models.id);不传则使用 ModelSettings.default_image_model_id;Provider 由模型关联反查"},"image_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Image Id","description":"图片模型 ID,如 ActorImage.id / SceneImage.id / PropImage.id 等;必须与路径主体 ID 匹配"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt","description":"提示词(由前端传入)。创建任务接口必填;render-prompt 接口可不传"},"images":{"items":{"type":"string"},"type":"array","title":"Images","description":"参考图 file_id 列表(可多张,顺序有效)。创建任务接口会基于 file_id 从数据中解析为参考图"}},"type":"object","title":"StudioImageTaskRequest","description":"Studio 专用图片任务请求体:可选模型 ID,不传则用默认图片模型;供应商由模型反查。\n\nimage_id 表示具体的图片模型 ID,例如:\n- 演员图片:ActorImage.id\n- 场景图片:SceneImage.id\n- 道具图片:PropImage.id\n- 服装图片:CostumeImage.id\n- 角色图片:CharacterImage.id\n- 分镜帧图片:ShotFrameImage.id"},"StudioScriptExtractionDraft":{"properties":{"project_id":{"type":"string","title":"Project Id","description":"项目 ID(必填)"},"chapter_id":{"type":"string","title":"Chapter Id","description":"章节 ID(必填,用于创建 shots/links)"},"script_text":{"type":"string","title":"Script Text","description":"剧本文本(可为优化后版本)"},"characters":{"items":{"$ref":"#/components/schemas/StudioCharacterDraft"},"type":"array","title":"Characters"},"scenes":{"items":{"$ref":"#/components/schemas/StudioAssetDraft"},"type":"array","title":"Scenes"},"props":{"items":{"$ref":"#/components/schemas/StudioAssetDraft"},"type":"array","title":"Props"},"costumes":{"items":{"$ref":"#/components/schemas/StudioAssetDraft"},"type":"array","title":"Costumes"},"shots":{"items":{"$ref":"#/components/schemas/StudioShotDraft"},"type":"array","title":"Shots","description":"镜头草稿列表"}},"additionalProperties":false,"type":"object","required":["project_id","chapter_id","script_text"],"title":"StudioScriptExtractionDraft","description":"用于导入 Studio 的提取结果草稿(name-based)。"},"StudioShotDraft":{"properties":{"index":{"type":"integer","minimum":1.0,"title":"Index","description":"镜头序号(章节内唯一)"},"title":{"type":"string","title":"Title","description":"镜头标题"},"script_excerpt":{"type":"string","title":"Script Excerpt","description":"剧本摘录","default":""},"scene_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scene Name","description":"场景名称(可选)"},"character_names":{"items":{"type":"string"},"type":"array","title":"Character Names","description":"本镜出现角色名称列表"},"prop_names":{"items":{"type":"string"},"type":"array","title":"Prop Names","description":"本镜关键道具名称列表"},"costume_names":{"items":{"type":"string"},"type":"array","title":"Costume Names","description":"本镜服装名称列表"},"dialogue_lines":{"items":{"$ref":"#/components/schemas/StudioShotDraftDialogueLine"},"type":"array","title":"Dialogue Lines","description":"对白列表"},"actions":{"items":{"type":"string"},"type":"array","title":"Actions","description":"动作/场景描述"}},"additionalProperties":false,"type":"object","required":["index","title"],"title":"StudioShotDraft","description":"镜头草稿:不含 shot_id,由导入 API 生成;引用实体用 name。"},"StudioShotDraftDialogueLine":{"properties":{"index":{"type":"integer","minimum":0.0,"title":"Index","description":"镜头内排序","default":0},"text":{"type":"string","title":"Text","description":"台词内容"},"line_mode":{"type":"string","enum":["DIALOGUE","VOICE_OVER","OFF_SCREEN","PHONE"],"title":"Line Mode","description":"对白模式","default":"DIALOGUE"},"speaker_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speaker Name","description":"说话角色名称(可空)"},"target_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Name","description":"听者角色名称(可空)"}},"additionalProperties":false,"type":"object","required":["text"],"title":"StudioShotDraftDialogueLine","description":"镜头对白草稿:speaker/target 使用角色 name,导入时映射为 character_id。"},"StyleOption":{"properties":{"value":{"type":"string","title":"Value","description":"选项值"},"label":{"type":"string","title":"Label","description":"选项展示文案"}},"type":"object","required":["value","label"],"title":"StyleOption","description":"通用下拉选项。"},"TaskCancelRead":{"properties":{"task_id":{"type":"string","title":"Task Id"},"status":{"$ref":"#/components/schemas/TaskStatus"},"cancel_requested":{"type":"boolean","title":"Cancel Requested","description":"是否已登记取消请求"},"cancel_requested_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cancel Requested At Ts","description":"请求取消时间戳"},"effective_immediately":{"type":"boolean","title":"Effective Immediately","description":"是否已立即取消完成","default":false}},"type":"object","required":["task_id","status","cancel_requested"],"title":"TaskCancelRead"},"TaskCancelRequest":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"取消原因(可选)"}},"type":"object","title":"TaskCancelRequest"},"TaskCreated":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"任务 ID"}},"type":"object","required":["task_id"],"title":"TaskCreated"},"TaskLinkAdoptRead":{"properties":{"task_id":{"type":"string","title":"Task Id"},"link_type":{"type":"string","title":"Link Type","description":"project | chapter | shot"},"entity_id":{"type":"string","title":"Entity Id","description":"项目/章节/镜头 ID"},"is_adopted":{"type":"boolean","title":"Is Adopted","description":"是否采用(仅可正向变更为 true)"}},"type":"object","required":["task_id","link_type","entity_id","is_adopted"],"title":"TaskLinkAdoptRead","description":"采用状态更新结果。"},"TaskLinkAdoptRequest":{"properties":{"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"绑定项目 ID(可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"绑定章节 ID(可选)"},"shot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shot Id","description":"绑定镜头 ID(可选)"},"task_id":{"type":"string","title":"Task Id","description":"任务 ID"}},"type":"object","required":["task_id"],"title":"TaskLinkAdoptRequest","description":"更新采用状态请求:task_id + 三选一绑定对象(project_id/chapter_id/shot_id)。"},"TaskListItemRead":{"properties":{"task_id":{"type":"string","title":"Task Id"},"task_kind":{"type":"string","title":"Task Kind","description":"业务任务类型"},"status":{"$ref":"#/components/schemas/TaskStatus"},"progress":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Progress"},"cancel_requested":{"type":"boolean","title":"Cancel Requested","description":"是否已请求取消","default":false},"cancel_requested_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cancel Requested At Ts","description":"请求取消时间戳"},"started_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Started At Ts","description":"任务开始执行时间戳"},"finished_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Finished At Ts","description":"任务结束时间戳"},"elapsed_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elapsed Ms","description":"任务累计执行耗时(毫秒)"},"created_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At Ts","description":"任务创建时间戳"},"updated_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Updated At Ts","description":"任务更新时间戳"},"executor_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Executor Type","description":"执行器类型,如 celery"},"executor_task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Executor Task Id","description":"执行器侧任务 ID"},"relation_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Type","description":"业务关联类型"},"relation_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relation Entity Id","description":"业务关联实体 ID"},"resource_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Type","description":"资源类型"},"navigate_relation_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navigate Relation Type","description":"前端默认跳转关联类型"},"navigate_relation_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navigate Relation Entity Id","description":"前端默认跳转关联实体 ID"}},"type":"object","required":["task_id","task_kind","status","progress"],"title":"TaskListItemRead"},"TaskResultRead":{"properties":{"task_id":{"type":"string","title":"Task Id"},"status":{"$ref":"#/components/schemas/TaskStatus"},"progress":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Progress"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result"},"error":{"type":"string","title":"Error","default":""},"cancel_requested":{"type":"boolean","title":"Cancel Requested","description":"是否已请求取消","default":false},"cancel_requested_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cancel Requested At Ts","description":"请求取消时间戳"},"started_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Started At Ts","description":"任务开始执行时间戳"},"finished_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Finished At Ts","description":"任务结束时间戳"},"elapsed_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elapsed Ms","description":"任务累计执行耗时(毫秒)"}},"type":"object","required":["task_id","status","progress"],"title":"TaskResultRead"},"TaskStatus":{"type":"string","enum":["pending","running","streaming","succeeded","failed","cancelled"],"title":"TaskStatus","description":"任务状态枚举。"},"TaskStatusRead":{"properties":{"task_id":{"type":"string","title":"Task Id"},"status":{"$ref":"#/components/schemas/TaskStatus"},"progress":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Progress"},"cancel_requested":{"type":"boolean","title":"Cancel Requested","description":"是否已请求取消","default":false},"cancel_requested_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cancel Requested At Ts","description":"请求取消时间戳"},"started_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Started At Ts","description":"任务开始执行时间戳"},"finished_at_ts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Finished At Ts","description":"任务结束时间戳"},"elapsed_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elapsed Ms","description":"任务累计执行耗时(毫秒)"}},"type":"object","required":["task_id","status","progress"],"title":"TaskStatusRead"},"VFXType":{"type":"string","enum":["NONE","PARTICLES","VOLUMETRIC_FOG","CG_DOUBLE","DIGITAL_ENVIRONMENT","MATTE_PAINTING","FIRE_SMOKE","WATER_SIM","DESTRUCTION","ENERGY_MAGIC","COMPOSITING_CLEANUP","SLOW_MOTION_TIME","OTHER"],"title":"VFXType","description":"视效类型(与 `app.schemas.skills.common.VFXType` 对齐,存英文 code)。"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VariantAnalysisRequest":{"properties":{"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"项目 ID(异步任务关联可选)"},"chapter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Id","description":"章节 ID(异步任务关联可选)"},"merged_library":{"additionalProperties":true,"type":"object","title":"Merged Library","description":"合并后的实体库(EntityLibrary 的序列化形式;来自 EntityMerger 输出的 merged_library)"},"all_shot_extractions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"All Shot Extractions","description":"所有镜头提取结果"},"script_division":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Script Division","description":"脚本分镜结果(可选;ScriptDivisionResult 序列化),用于章节/段落分组"}},"type":"object","required":["merged_library","all_shot_extractions"],"title":"VariantAnalysisRequest","description":"变体分析请求。"},"VariantAnalysisResult":{"properties":{"costume_timelines":{"items":{"$ref":"#/components/schemas/CostumeTimeline"},"type":"array","title":"Costume Timelines","description":"各角色服装演变时间线"},"variant_suggestions":{"items":{"$ref":"#/components/schemas/VariantSuggestion"},"type":"array","title":"Variant Suggestions","description":"变体建议列表"},"chapter_variants":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Chapter Variants","description":"章节变体建议"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","description":"分析说明"}},"additionalProperties":false,"type":"object","title":"VariantAnalysisResult","description":"变体分析结果。"},"VariantSuggestion":{"properties":{"entity_id":{"type":"string","title":"Entity Id","description":"实体ID"},"entity_name":{"type":"string","title":"Entity Name","description":"实体名称"},"entity_type":{"type":"string","title":"Entity Type","description":"实体类型(character/scene/prop/location)"},"suggestion":{"type":"string","title":"Suggestion","description":"变体建议说明"},"affected_shots":{"items":{"type":"integer"},"type":"array","title":"Affected Shots","description":"涉及的镜头"},"evidence":{"items":{"$ref":"#/components/schemas/EvidenceSpan"},"type":"array","title":"Evidence","description":"原文依据(可选)"}},"additionalProperties":false,"type":"object","required":["entity_id","entity_name","entity_type","suggestion"],"title":"VariantSuggestion","description":"变体建议。"},"VideoGenerationOptionsRead":{"properties":{"provider":{"type":"string","title":"Provider","description":"供应商稳定键"},"model_id":{"type":"string","title":"Model Id","description":"默认视频模型 ID"},"model_name":{"type":"string","title":"Model Name","description":"默认视频模型名称"},"allowed_ratios":{"items":{"type":"string"},"type":"array","title":"Allowed Ratios","description":"当前模型允许的比例选项"},"default_ratio":{"type":"string","title":"Default Ratio","description":"当前模型默认比例"}},"type":"object","required":["provider","model_id","model_name","default_ratio"],"title":"VideoGenerationOptionsRead","description":"当前默认视频模型对应的生成参数选项。"},"VideoGenerationTaskRequest":{"properties":{"shot_id":{"type":"string","title":"Shot Id","description":"镜头 ID"},"reference_mode":{"type":"string","enum":["first","last","key","first_last","first_last_key","text_only"],"title":"Reference Mode","description":"参考模式:first | last | key | first_last | first_last_key | text_only"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt","description":"视频提示词(text_only 必填)"},"images":{"items":{"type":"string"},"type":"array","title":"Images","description":"参考图 file_id 列表,数量需与 reference_mode 严格匹配"},"ratio":{"type":"string","enum":["16:9","4:3","1:1","3:4","9:16","21:9"],"title":"Ratio","description":"视频画幅比例,如 16:9 / 9:16"}},"type":"object","required":["shot_id","reference_mode","ratio"],"title":"VideoGenerationTaskRequest","description":"视频生成任务请求。"},"VideoPromptPreviewResponse":{"properties":{"prompt":{"type":"string","title":"Prompt","description":"最终用于视频生成的提示词"},"images":{"items":{"type":"string"},"type":"array","title":"Images","description":"关联参考图 file_id 列表"}},"type":"object","required":["prompt"],"title":"VideoPromptPreviewResponse"}}}} \ No newline at end of file diff --git a/front/src/pages/aiStudio/chapter/ChapterStudio.tsx b/front/src/pages/aiStudio/chapter/ChapterStudio.tsx index 2f3fd75..60c3728 100644 --- a/front/src/pages/aiStudio/chapter/ChapterStudio.tsx +++ b/front/src/pages/aiStudio/chapter/ChapterStudio.tsx @@ -60,6 +60,7 @@ import { import { useLocation, useParams, Link } from 'react-router-dom' import { FilmService, + LlmService, StudioChaptersService, StudioEntitiesService, StudioFilesService, @@ -79,6 +80,7 @@ import type { CameraShotType, ChapterRead, EntityNameExistenceItem, + ImageGenerationOptionsRead, ProjectActorLinkRead, ProjectCostumeLinkRead, ShotDetailRead, @@ -110,6 +112,7 @@ import { useGenerationDraft, type GenerationDraftState } from '../hooks/useGener import { useTaskPageContext } from '../components/taskPageContext' import type { RelationTaskState } from '../project/ProjectWorkbench/chapterDivisionTasks' import { toRelationTaskStateFromStatusRead } from '../project/ProjectWorkbench/chapterDivisionTasks' +import { useProjectStyleOptions } from '../project/useProjectStyleOptions' import './chapterStudio.separation.css' const { Sider, Content } = Layout @@ -192,6 +195,8 @@ type KeyframeCardState = { applyingFileId: string | null } +type KeyframeResolutionProfile = 'standard' | 'high' + type InspectorTabKey = 'ops' | 'camera' | 'prompt_image' | 'dialogue' | 'keyframe_gen' | 'gen_ref' const LAYOUT_STORAGE_KEY = 'jellyfish_chapter_studio_layout_v1' @@ -205,6 +210,22 @@ function sleep(ms: number) { return new Promise((resolve) => window.setTimeout(resolve, ms)) } +function getResolutionProfileLabel(profile: KeyframeResolutionProfile): string { + return profile === 'high' ? '高清(3K)' : '标准(2K)' +} + +function resolveKeyframePixelSize( + options: ImageGenerationOptionsRead | null, + ratio: string, + profile: KeyframeResolutionProfile, +): string { + const normalizedRatio = String(ratio ?? '').trim() + if (!options || !normalizedRatio) return '' + const profiles = options.ratio_size_profiles?.[normalizedRatio] ?? null + if (!profiles) return '' + return profiles[profile] ?? profiles.standard ?? '' +} + function mapGenerationDraftStateToRenderState( state: GenerationDraftState, ): 'idle' | 'stale' | 'syncing' | 'clean' | 'error' { @@ -395,6 +416,9 @@ const ChapterStudio: React.FC = () => { const [chapter, setChapter] = useState(null) const [projectVisualStyle, setProjectVisualStyle] = useState<'现实' | '动漫'>('现实') const [projectStyle, setProjectStyle] = useState('真人都市') + const [projectDefaultVideoRatio, setProjectDefaultVideoRatio] = useState('') + const { videoRatioOptions, defaultVideoRatio: capabilityDefaultVideoRatio } = useProjectStyleOptions() + const [imageGenerationOptions, setImageGenerationOptions] = useState(null) const [shots, setShots] = useState([]) const [shotRuntimeMap, setShotRuntimeMap] = useState>({}) const [selectedShotId, setSelectedShotId] = useState(null) @@ -430,6 +454,7 @@ const ChapterStudio: React.FC = () => { const [promptAssetsUpdating, setPromptAssetsUpdating] = useState(false) const [frameTab, setFrameTab] = useState<'head' | 'keyframes' | 'tail' | 'compare'>('keyframes') + const [keyframeResolutionProfile, setKeyframeResolutionProfile] = useState('standard') const [frameFileTagsMap, setFrameFileTagsMap] = useState>({}) const [frameFileTagsLoading, setFrameFileTagsLoading] = useState(false) const [playbackRate, setPlaybackRate] = useState(1) @@ -447,6 +472,23 @@ const ChapterStudio: React.FC = () => { const [dragOverShotId, setDragOverShotId] = useState(null) const [isResizing, setIsResizing] = useState(false) + useEffect(() => { + let active = true + void (async () => { + try { + const res = await LlmService.getImageGenerationOptionsApiV1LlmImageGenerationOptionsGet() + if (!active) return + setImageGenerationOptions(res.data ?? null) + } catch { + if (!active) return + setImageGenerationOptions(null) + } + })() + return () => { + active = false + } + }, []) + const containerRef = useRef(null) const dragStateRef = useRef(null) const resizeRafRef = useRef(null) @@ -454,6 +496,15 @@ const ChapterStudio: React.FC = () => { const showPreviewMinimizeButton = false const showPreviewFrameSegmented = false const showChapterTimeline = false + const resolveShotVideoRatio = useCallback( + (detail?: ShotDetailRead | null) => { + const shotRatio = String(detail?.override_video_ratio ?? '').trim() + const projectRatio = String(projectDefaultVideoRatio ?? '').trim() + const fallbackRatio = String(capabilityDefaultVideoRatio ?? '').trim() + return shotRatio || projectRatio || fallbackRatio + }, + [capabilityDefaultVideoRatio, projectDefaultVideoRatio], + ) const hiddenKey = useMemo(() => (chapterId ? `jellyfish_hidden_shots_${chapterId}` : null), [chapterId]) const hiddenIds = useMemo(() => { @@ -621,15 +672,18 @@ const ChapterStudio: React.FC = () => { setChapter(toUIChapter(data)) const nextVisualStyle = projectRes?.data?.visual_style const nextStyle = projectRes?.data?.style + const nextDefaultRatio = typeof projectRes?.data?.default_video_ratio === 'string' ? projectRes.data.default_video_ratio : '' if (nextVisualStyle === '现实' || nextVisualStyle === '动漫') { setProjectVisualStyle(nextVisualStyle) } if (typeof nextStyle === 'string' && nextStyle.trim()) { setProjectStyle(nextStyle) } + setProjectDefaultVideoRatio(nextDefaultRatio) } catch { // 章节信息仅用于标题展示,失败不阻断工作台 setChapter(null) + setProjectDefaultVideoRatio('') } } @@ -1037,13 +1091,22 @@ const ChapterStudio: React.FC = () => { : null }) .filter(Boolean) + const targetRatio = resolveShotVideoRatio(d) + if (!targetRatio) continue await StudioImageTasksService.createShotFrameImageGenerationTaskApiV1StudioImageTasksShotShotIdFrameImageTasksPost({ shotId: id, - requestBody: { frame_type: target.frame_type as any, model_id: null, prompt, images: imagesPayload } as any, + requestBody: { + frame_type: target.frame_type as any, + model_id: null, + prompt, + images: imagesPayload, + target_ratio: targetRatio, + resolution_profile: keyframeResolutionProfile, + } as any, }) } }, - [], + [keyframeResolutionProfile, resolveShotVideoRatio], ) const updatePromptProps = async (propIds: string[]) => { @@ -1205,9 +1268,21 @@ const ChapterStudio: React.FC = () => { : null }) .filter(Boolean) + const targetRatio = resolveShotVideoRatio(shotDetail) + if (!targetRatio) { + message.warning('请先设置视频比例') + return + } await StudioImageTasksService.createShotFrameImageGenerationTaskApiV1StudioImageTasksShotShotIdFrameImageTasksPost({ shotId: selectedShotId, - requestBody: { frame_type: target.frame_type as any, model_id: null, prompt, images: imagesPayload } as any, + requestBody: { + frame_type: target.frame_type as any, + model_id: null, + prompt, + images: imagesPayload, + target_ratio: targetRatio, + resolution_profile: keyframeResolutionProfile, + } as any, }) message.success('已创建生成任务') } catch { @@ -1344,6 +1419,7 @@ const ChapterStudio: React.FC = () => { assignIfChanged('atmosphere') assignIfChanged('follow_atmosphere') assignIfChanged('has_bgm') + assignIfChanged('override_video_ratio') assignIfChanged('vfx_type') assignIfChanged('vfx_note') assignIfChanged('first_frame_prompt') @@ -2525,10 +2601,16 @@ const ChapterStudio: React.FC = () => { }} > { chapterId={chapterId} projectVisualStyle={projectVisualStyle} projectStyle={projectStyle} + projectDefaultVideoRatio={projectDefaultVideoRatio} + capabilityDefaultVideoRatio={capabilityDefaultVideoRatio} + videoRatioOptions={videoRatioOptions} + imageGenerationOptions={imageGenerationOptions} + keyframeResolutionProfile={keyframeResolutionProfile} + onChangeKeyframeResolutionProfile={setKeyframeResolutionProfile} loadingDetail={loadingDetail} shotDetail={shotDetail} dialogLines={dialogLines} @@ -2735,6 +2823,12 @@ function Inspector(props: { chapterId?: string projectVisualStyle: '现实' | '动漫' projectStyle: string + projectDefaultVideoRatio: string + capabilityDefaultVideoRatio: string + videoRatioOptions: Array<{ value: string; label: React.ReactNode }> + imageGenerationOptions: ImageGenerationOptionsRead | null + keyframeResolutionProfile: KeyframeResolutionProfile + onChangeKeyframeResolutionProfile: (value: KeyframeResolutionProfile) => void loadingDetail: boolean shotDetail: ShotDetailRead | null dialogLines: ShotDialogLineRead[] @@ -2768,6 +2862,12 @@ function Inspector(props: { chapterId, projectVisualStyle, projectStyle, + projectDefaultVideoRatio, + capabilityDefaultVideoRatio, + videoRatioOptions, + imageGenerationOptions, + keyframeResolutionProfile, + onChangeKeyframeResolutionProfile, loadingDetail, shotDetail, dialogLines, @@ -2855,6 +2955,18 @@ function Inspector(props: { const [videoPromptPreviewOpen, setVideoPromptPreviewOpen] = useState(false) const [videoPromptPreviewLoading, setVideoPromptPreviewLoading] = useState(false) const [videoPromptPreviewSubmitting, setVideoPromptPreviewSubmitting] = useState(false) + const resolveVideoRatioForRequest = useCallback(() => { + const shotRatio = String(shotDetail?.override_video_ratio ?? '').trim() + const projectRatio = String(projectDefaultVideoRatio ?? '').trim() + const fallbackRatio = String(capabilityDefaultVideoRatio ?? '').trim() + return shotRatio || projectRatio || fallbackRatio + }, [capabilityDefaultVideoRatio, projectDefaultVideoRatio, shotDetail?.override_video_ratio]) + const resolvedKeyframeRatio = resolveVideoRatioForRequest() + const resolvedKeyframePixelSize = resolveKeyframePixelSize( + imageGenerationOptions, + resolvedKeyframeRatio, + keyframeResolutionProfile, + ) const videoPromptDraft = useGenerationDraft< { prompt: string }, { referenceMode: VideoReferenceMode; images: string[] }, @@ -2867,12 +2979,17 @@ function Inspector(props: { if (!selectedShot?.id) { throw new Error('shot is required') } + const ratio = resolveVideoRatioForRequest() + if (!ratio) { + throw new Error('video ratio is required') + } const res = await FilmService.previewVideoGenerationPromptApiV1FilmTasksVideoPreviewPromptPost({ requestBody: { shot_id: selectedShot.id, reference_mode: context.referenceMode, prompt: (base.prompt || '').trim() || null, images: context.images, + ratio, } as any, }) const data = res.data as any @@ -2885,12 +3002,17 @@ function Inspector(props: { if (!selectedShot?.id) { throw new Error('shot is required') } + const ratio = resolveVideoRatioForRequest() + if (!ratio) { + throw new Error('video ratio is required') + } const created = await FilmService.createVideoGenerationTaskApiV1FilmTasksVideoPost({ requestBody: { shot_id: selectedShot.id, reference_mode: context.referenceMode, prompt: (derived.prompt || '').trim(), images: derived.images, + ratio, } as any, }) return { @@ -3590,6 +3712,10 @@ function Inspector(props: { } }) + const ratio = resolveVideoRatioForRequest() + if (!ratio) { + throw new Error('video ratio is required') + } const created = await StudioImageTasksService.createShotFrameImageGenerationTaskApiV1StudioImageTasksShotShotIdFrameImageTasksPost({ shotId: selectedShot.id, requestBody: { @@ -3597,6 +3723,8 @@ function Inspector(props: { model_id: null, prompt: (base.prompt || '').trim(), images: resolvedItems as any, + target_ratio: ratio, + resolution_profile: keyframeResolutionProfile, } as any, }) return { @@ -3652,6 +3780,7 @@ function Inspector(props: { }, [ keyframePromptDraft, + keyframeResolutionProfile, keyframePromptPreviewDraft, keyframePromptPreviewFrameType, keyframePromptPreviewRefFileIds, @@ -4020,6 +4149,10 @@ function Inspector(props: { message.warning('请先选择一个分镜') return } + if (!resolveVideoRatioForRequest()) { + message.warning('当前镜头缺少视频比例,请先设置项目默认比例或镜头覆盖比例') + return + } const prompt = (videoPromptPreviewDraft || '').trim() if (!prompt) { message.warning('请输入视频提示词') @@ -4553,6 +4686,23 @@ function Inspector(props: { /> +
+
视频比例
+ onChangeKeyframeResolutionProfile(value as KeyframeResolutionProfile)} + /> +
+
+
+ 当前规格:{resolvedKeyframeRatio || '未设置比例'} ·{' '} + {getResolutionProfileLabel(keyframeResolutionProfile)} + {resolvedKeyframePixelSize ? ` → ${resolvedKeyframePixelSize}` : ''} +
+
+ 当前模型:{imageGenerationOptions?.provider || '未识别供应商'} + {imageGenerationOptions?.model_name ? ` / ${imageGenerationOptions.model_name}` : ''} +
+
+ {(['first', 'key', 'last'] as PromptFrameType[]).map((ft) => { const st = keyframeCards[ft] const slot = frameImages.find((x) => x.frame_type === ft) diff --git a/front/src/pages/aiStudio/project/ProjectLobby.tsx b/front/src/pages/aiStudio/project/ProjectLobby.tsx index b71f8ae..7907263 100644 --- a/front/src/pages/aiStudio/project/ProjectLobby.tsx +++ b/front/src/pages/aiStudio/project/ProjectLobby.tsx @@ -56,7 +56,6 @@ type ProjectStageSummary = { type ProjectFlowStatsMap = Record type ProjectView = Project & { visualStyle?: ProjectVisualStyleChoice - defaultVideoSize?: string | null defaultVideoRatio?: string | null } @@ -79,9 +78,7 @@ const ProjectLobby: React.FC = () => { const [projectFlowStatsMap, setProjectFlowStatsMap] = useState({}) const { options: projectStyleOptions, - videoSizeOptions, videoRatioOptions, - defaultVideoSize, defaultVideoRatio, } = useProjectStyleOptions() const [form] = Form.useForm() @@ -117,7 +114,6 @@ const ProjectLobby: React.FC = () => { }, updatedAt, visualStyle: (p.visual_style as ProjectVisualStyleChoice | undefined) ?? '现实', - defaultVideoSize: p.default_video_size ?? null, defaultVideoRatio: p.default_video_ratio ?? null, } } @@ -382,7 +378,6 @@ const ProjectLobby: React.FC = () => { style: defaultStyle, seed: Math.floor(Math.random() * 99999), unifyStyle: true, - default_video_size: defaultVideoSize, default_video_ratio: defaultVideoRatio, }) setCreateModalOpen(true) @@ -395,7 +390,6 @@ const ProjectLobby: React.FC = () => { visual_style: ProjectVisualStyleChoice seed: number unifyStyle: boolean - default_video_size?: string default_video_ratio?: string }) => { try { @@ -409,7 +403,6 @@ const ProjectLobby: React.FC = () => { visual_style: values.visual_style as any, seed: values.seed, unify_style: values.unifyStyle, - default_video_size: values.default_video_size || null, default_video_ratio: values.default_video_ratio || null, progress: 0, }, @@ -436,7 +429,6 @@ const ProjectLobby: React.FC = () => { visual_style: p.visualStyle ?? '现实', seed: p.seed, unifyStyle: p.unifyStyle, - default_video_size: p.defaultVideoSize ?? undefined, default_video_ratio: p.defaultVideoRatio ?? undefined, }) setEditModalOpen(true) @@ -449,7 +441,6 @@ const ProjectLobby: React.FC = () => { visual_style: ProjectVisualStyleChoice seed: number unifyStyle: boolean - default_video_size?: string default_video_ratio?: string }) => { if (!editingProject) return @@ -463,7 +454,6 @@ const ProjectLobby: React.FC = () => { visual_style: values.visual_style as any, seed: values.seed, unify_style: values.unifyStyle, - default_video_size: values.default_video_size || null, default_video_ratio: values.default_video_ratio || null, }, }) @@ -982,7 +972,6 @@ const ProjectLobby: React.FC = () => { '真人都市', seed: Math.floor(Math.random() * 99999), unifyStyle: true, - default_video_size: defaultVideoSize, default_video_ratio: defaultVideoRatio, }} > @@ -1004,9 +993,6 @@ const ProjectLobby: React.FC = () => { > - - @@ -1052,9 +1038,6 @@ const ProjectLobby: React.FC = () => { - - diff --git a/front/src/pages/aiStudio/project/useProjectStyleOptions.ts b/front/src/pages/aiStudio/project/useProjectStyleOptions.ts index 0ab9708..0056d64 100644 --- a/front/src/pages/aiStudio/project/useProjectStyleOptions.ts +++ b/front/src/pages/aiStudio/project/useProjectStyleOptions.ts @@ -1,5 +1,5 @@ import { useEffect, useMemo, useState } from 'react' -import { StudioProjectsService } from '../../../services/generated' +import { LlmService, StudioProjectsService } from '../../../services/generated' import type { ProjectStyleOptionsRead } from '../../../services/generated' import type { ProjectStyleFieldOptions } from './ProjectVisualStyleAndStyleFields' @@ -30,15 +30,12 @@ const FALLBACK_OPTIONS: ProjectStyleFieldOptions = { type OptionItem = { value: string; label: string } type ProjectStyleOptionsSnapshot = { options: ProjectStyleFieldOptions - videoSizeOptions: OptionItem[] videoRatioOptions: OptionItem[] - defaultVideoSize: string defaultVideoRatio: string } let cachedSnapshot: ProjectStyleOptionsSnapshot | null = null let loadingSnapshotPromise: Promise | null = null -const FALLBACK_DEFAULT_VIDEO_SIZE = '1920x1080' const FALLBACK_DEFAULT_VIDEO_RATIO = '16:9' function normalizeOptionItems(items: OptionItem[] | null | undefined): OptionItem[] { @@ -79,23 +76,25 @@ async function loadProjectStyleOptionsSnapshot(): Promise { try { - const res = await StudioProjectsService.getProjectStyleOptionsApiV1StudioProjectsStyleOptionsGet() - const data = res.data + const [styleRes, videoRes] = await Promise.all([ + StudioProjectsService.getProjectStyleOptionsApiV1StudioProjectsStyleOptionsGet(), + LlmService.getVideoGenerationOptionsApiV1LlmVideoGenerationOptionsGet(), + ]) + const styleData = styleRes.data + const videoData = videoRes.data const snapshot: ProjectStyleOptionsSnapshot = { - options: normalizeStyleOptions(data ?? undefined), - videoSizeOptions: normalizeOptionItems((data?.video_sizes ?? []) as OptionItem[]), - videoRatioOptions: normalizeOptionItems((data?.video_ratios ?? []) as OptionItem[]), - defaultVideoSize: data?.default_video_size ?? FALLBACK_DEFAULT_VIDEO_SIZE, - defaultVideoRatio: data?.default_video_ratio ?? FALLBACK_DEFAULT_VIDEO_RATIO, + options: normalizeStyleOptions(styleData ?? undefined), + videoRatioOptions: normalizeOptionItems( + (videoData?.allowed_ratios ?? []).map((value) => ({ value, label: value })), + ), + defaultVideoRatio: videoData?.default_ratio ?? FALLBACK_DEFAULT_VIDEO_RATIO, } cachedSnapshot = snapshot return snapshot } catch { const snapshot: ProjectStyleOptionsSnapshot = { options: FALLBACK_OPTIONS, - videoSizeOptions: [], videoRatioOptions: [], - defaultVideoSize: FALLBACK_DEFAULT_VIDEO_SIZE, defaultVideoRatio: FALLBACK_DEFAULT_VIDEO_RATIO, } cachedSnapshot = snapshot @@ -109,9 +108,7 @@ async function loadProjectStyleOptionsSnapshot(): Promise(cachedSnapshot?.options ?? FALLBACK_OPTIONS) - const [videoSizeOptions, setVideoSizeOptions] = useState(cachedSnapshot?.videoSizeOptions ?? []) const [videoRatioOptions, setVideoRatioOptions] = useState(cachedSnapshot?.videoRatioOptions ?? []) - const [defaultVideoSize, setDefaultVideoSize] = useState(cachedSnapshot?.defaultVideoSize ?? FALLBACK_DEFAULT_VIDEO_SIZE) const [defaultVideoRatio, setDefaultVideoRatio] = useState(cachedSnapshot?.defaultVideoRatio ?? FALLBACK_DEFAULT_VIDEO_RATIO) useEffect(() => { @@ -120,9 +117,7 @@ export function useProjectStyleOptions() { const snapshot = await loadProjectStyleOptionsSnapshot() if (!active) return setOptions(snapshot.options) - setVideoSizeOptions(snapshot.videoSizeOptions) setVideoRatioOptions(snapshot.videoRatioOptions) - setDefaultVideoSize(snapshot.defaultVideoSize) setDefaultVideoRatio(snapshot.defaultVideoRatio) })() return () => { @@ -138,9 +133,7 @@ export function useProjectStyleOptions() { return { options, - videoSizeOptions, videoRatioOptions, - defaultVideoSize, defaultVideoRatio, defaultVisualStyle, getDefaultStyle, diff --git a/front/src/services/generated/index.ts b/front/src/services/generated/index.ts index 98cbeb6..99419b4 100644 --- a/front/src/services/generated/index.ts +++ b/front/src/services/generated/index.ts @@ -18,6 +18,7 @@ export type { ApiResponse_EntityNameExistenceCheckResponse_ } from './models/Api export type { ApiResponse_FileDetailRead_ } from './models/ApiResponse_FileDetailRead_'; export type { ApiResponse_FileRead_ } from './models/ApiResponse_FileRead_'; export type { ApiResponse_GenerationTaskLinkRead_ } from './models/ApiResponse_GenerationTaskLinkRead_'; +export type { ApiResponse_ImageGenerationOptionsRead_ } from './models/ApiResponse_ImageGenerationOptionsRead_'; export type { ApiResponse_list_PromptCategoryOptionRead__ } from './models/ApiResponse_list_PromptCategoryOptionRead__'; export type { ApiResponse_list_ProviderSupportedRead__ } from './models/ApiResponse_list_ProviderSupportedRead__'; export type { ApiResponse_list_ShotCharacterLinkRead__ } from './models/ApiResponse_list_ShotCharacterLinkRead__'; @@ -75,6 +76,7 @@ export type { ApiResponse_TaskLinkAdoptRead_ } from './models/ApiResponse_TaskLi export type { ApiResponse_TaskResultRead_ } from './models/ApiResponse_TaskResultRead_'; export type { ApiResponse_TaskStatusRead_ } from './models/ApiResponse_TaskStatusRead_'; export type { ApiResponse_VariantAnalysisResult_ } from './models/ApiResponse_VariantAnalysisResult_'; +export type { ApiResponse_VideoGenerationOptionsRead_ } from './models/ApiResponse_VideoGenerationOptionsRead_'; export type { ApiResponse_VideoPromptPreviewResponse_ } from './models/ApiResponse_VideoPromptPreviewResponse_'; export type { AsyncTaskCreateRead } from './models/AsyncTaskCreateRead'; export type { Body_upload_file_api_api_v1_studio_files_upload_post } from './models/Body_upload_file_api_api_v1_studio_files_upload_post'; @@ -111,6 +113,7 @@ export type { GenerationTaskLinkCreate } from './models/GenerationTaskLinkCreate export type { GenerationTaskLinkRead } from './models/GenerationTaskLinkRead'; export type { GenerationTaskLinkUpdate } from './models/GenerationTaskLinkUpdate'; export type { HTTPValidationError } from './models/HTTPValidationError'; +export type { ImageGenerationOptionsRead } from './models/ImageGenerationOptionsRead'; export type { LogLevel } from './models/LogLevel'; export type { ModelCategoryKey } from './models/ModelCategoryKey'; export type { ModelCreate } from './models/ModelCreate'; @@ -238,6 +241,7 @@ export type { VariantAnalysisRequest } from './models/VariantAnalysisRequest'; export type { VariantAnalysisResult } from './models/VariantAnalysisResult'; export type { VariantSuggestion } from './models/VariantSuggestion'; export type { VFXType } from './models/VFXType'; +export type { VideoGenerationOptionsRead } from './models/VideoGenerationOptionsRead'; export type { VideoGenerationTaskRequest } from './models/VideoGenerationTaskRequest'; export type { VideoPromptPreviewResponse } from './models/VideoPromptPreviewResponse'; diff --git a/front/src/services/generated/models/ApiResponse_ImageGenerationOptionsRead_.ts b/front/src/services/generated/models/ApiResponse_ImageGenerationOptionsRead_.ts new file mode 100644 index 0000000..b8878f4 --- /dev/null +++ b/front/src/services/generated/models/ApiResponse_ImageGenerationOptionsRead_.ts @@ -0,0 +1,24 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ImageGenerationOptionsRead } from './ImageGenerationOptionsRead'; +export type ApiResponse_ImageGenerationOptionsRead_ = { + /** + * 与 HTTP 状态码一致 + */ + code?: number; + /** + * 提示信息 + */ + message?: string; + /** + * 实际数据 + */ + data?: (ImageGenerationOptionsRead | null); + /** + * 附加元信息 + */ + meta?: (Record | null); +}; + diff --git a/front/src/services/generated/models/ApiResponse_VideoGenerationOptionsRead_.ts b/front/src/services/generated/models/ApiResponse_VideoGenerationOptionsRead_.ts new file mode 100644 index 0000000..0a9225d --- /dev/null +++ b/front/src/services/generated/models/ApiResponse_VideoGenerationOptionsRead_.ts @@ -0,0 +1,24 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { VideoGenerationOptionsRead } from './VideoGenerationOptionsRead'; +export type ApiResponse_VideoGenerationOptionsRead_ = { + /** + * 与 HTTP 状态码一致 + */ + code?: number; + /** + * 提示信息 + */ + message?: string; + /** + * 实际数据 + */ + data?: (VideoGenerationOptionsRead | null); + /** + * 附加元信息 + */ + meta?: (Record | null); +}; + diff --git a/front/src/services/generated/models/ImageGenerationOptionsRead.ts b/front/src/services/generated/models/ImageGenerationOptionsRead.ts new file mode 100644 index 0000000..ec0387a --- /dev/null +++ b/front/src/services/generated/models/ImageGenerationOptionsRead.ts @@ -0,0 +1,34 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * 当前默认图片模型对应的关键帧规格选项。 + */ +export type ImageGenerationOptionsRead = { + /** + * 供应商稳定键 + */ + provider: string; + /** + * 默认图片模型 ID + */ + model_id: string; + /** + * 默认图片模型名称 + */ + model_name: string; + /** + * 当前模型支持的目标比例 + */ + supported_ratios?: Array; + /** + * 当前模型默认分辨率档位 + */ + default_resolution_profile: string; + /** + * 按比例和分辨率档位映射得到的像素尺寸 + */ + ratio_size_profiles?: Record>; +}; + diff --git a/front/src/services/generated/models/ProjectCreate.ts b/front/src/services/generated/models/ProjectCreate.ts index 6b45edb..7b140b0 100644 --- a/front/src/services/generated/models/ProjectCreate.ts +++ b/front/src/services/generated/models/ProjectCreate.ts @@ -33,10 +33,6 @@ export type ProjectCreate = { * 进度百分比(0-100) */ progress?: number; - /** - * 项目级默认视频尺寸;分镜未覆盖时生效 - */ - default_video_size?: (string | null); /** * 项目级默认视频比例;分镜未覆盖时生效 */ diff --git a/front/src/services/generated/models/ProjectRead.ts b/front/src/services/generated/models/ProjectRead.ts index da85f78..5be4394 100644 --- a/front/src/services/generated/models/ProjectRead.ts +++ b/front/src/services/generated/models/ProjectRead.ts @@ -33,10 +33,6 @@ export type ProjectRead = { * 进度百分比(0-100) */ progress?: number; - /** - * 项目级默认视频尺寸;分镜未覆盖时生效 - */ - default_video_size?: (string | null); /** * 项目级默认视频比例;分镜未覆盖时生效 */ diff --git a/front/src/services/generated/models/ProjectStyleOptionsRead.ts b/front/src/services/generated/models/ProjectStyleOptionsRead.ts index 8ce207e..bcbe6c3 100644 --- a/front/src/services/generated/models/ProjectStyleOptionsRead.ts +++ b/front/src/services/generated/models/ProjectStyleOptionsRead.ts @@ -4,7 +4,7 @@ /* eslint-disable */ import type { StyleOption } from './StyleOption'; /** - * 项目风格与视频参数候选项。 + * 项目风格候选项。 */ export type ProjectStyleOptionsRead = { /** @@ -19,21 +19,5 @@ export type ProjectStyleOptionsRead = { * 各视觉风格默认视频风格 */ default_style_by_visual_style?: Record; - /** - * 默认视频比例(用于创建项目时的初始值) - */ - default_video_ratio?: (string | null); - /** - * 默认视频尺寸(用于创建项目时的初始值) - */ - default_video_size?: (string | null); - /** - * 视频比例候选项 - */ - video_ratios?: Array; - /** - * 视频尺寸候选项 - */ - video_sizes?: Array; }; diff --git a/front/src/services/generated/models/ProjectUpdate.ts b/front/src/services/generated/models/ProjectUpdate.ts index ed650b5..a7fac77 100644 --- a/front/src/services/generated/models/ProjectUpdate.ts +++ b/front/src/services/generated/models/ProjectUpdate.ts @@ -15,7 +15,6 @@ export type ProjectUpdate = { seed?: (number | null); unify_style?: (boolean | null); progress?: (number | null); - default_video_size?: (string | null); default_video_ratio?: (string | null); stats?: (Record | null); }; diff --git a/front/src/services/generated/models/ShotDetailCreate.ts b/front/src/services/generated/models/ShotDetailCreate.ts index 4448072..5a05862 100644 --- a/front/src/services/generated/models/ShotDetailCreate.ts +++ b/front/src/services/generated/models/ShotDetailCreate.ts @@ -31,10 +31,6 @@ export type ShotDetailCreate = { * 时长(秒) */ duration?: number; - /** - * 分镜级视频尺寸覆盖;为空表示继承项目默认 - */ - override_video_size?: (string | null); /** * 分镜级视频比例覆盖;为空表示继承项目默认 */ diff --git a/front/src/services/generated/models/ShotDetailRead.ts b/front/src/services/generated/models/ShotDetailRead.ts index 7825a9c..1df8cc2 100644 --- a/front/src/services/generated/models/ShotDetailRead.ts +++ b/front/src/services/generated/models/ShotDetailRead.ts @@ -31,10 +31,6 @@ export type ShotDetailRead = { * 时长(秒) */ duration?: number; - /** - * 分镜级视频尺寸覆盖;为空表示继承项目默认 - */ - override_video_size?: (string | null); /** * 分镜级视频比例覆盖;为空表示继承项目默认 */ diff --git a/front/src/services/generated/models/ShotDetailUpdate.ts b/front/src/services/generated/models/ShotDetailUpdate.ts index 288091a..11d6345 100644 --- a/front/src/services/generated/models/ShotDetailUpdate.ts +++ b/front/src/services/generated/models/ShotDetailUpdate.ts @@ -12,7 +12,6 @@ export type ShotDetailUpdate = { movement?: (CameraMovement | null); scene_id?: (string | null); duration?: (number | null); - override_video_size?: (string | null); override_video_ratio?: (string | null); mood_tags?: (Array | null); atmosphere?: (string | null); diff --git a/front/src/services/generated/models/ShotFrameImageTaskRequest.ts b/front/src/services/generated/models/ShotFrameImageTaskRequest.ts index 12be446..f8655f5 100644 --- a/front/src/services/generated/models/ShotFrameImageTaskRequest.ts +++ b/front/src/services/generated/models/ShotFrameImageTaskRequest.ts @@ -26,5 +26,13 @@ export type ShotFrameImageTaskRequest = { * 参考资产条目列表(可多张,顺序有效)。后端会使用 item.file_id 作为参考图;无效条目会被跳过。 */ images?: Array; + /** + * 目标视频画幅比例;关键帧将按该画幅生成,以提升后续视频参考稳定性 + */ + target_ratio: '16:9' | '4:3' | '1:1' | '3:4' | '9:16' | '21:9' | '3:2' | '2:3'; + /** + * 关键帧输出分辨率档位,默认 standard + */ + resolution_profile?: ('standard' | 'high' | null); }; diff --git a/front/src/services/generated/models/VideoGenerationOptionsRead.ts b/front/src/services/generated/models/VideoGenerationOptionsRead.ts new file mode 100644 index 0000000..3b16cf9 --- /dev/null +++ b/front/src/services/generated/models/VideoGenerationOptionsRead.ts @@ -0,0 +1,30 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * 当前默认视频模型对应的生成参数选项。 + */ +export type VideoGenerationOptionsRead = { + /** + * 供应商稳定键 + */ + provider: string; + /** + * 默认视频模型 ID + */ + model_id: string; + /** + * 默认视频模型名称 + */ + model_name: string; + /** + * 当前模型允许的比例选项 + */ + allowed_ratios?: Array; + /** + * 当前模型默认比例 + */ + default_ratio: string; +}; + diff --git a/front/src/services/generated/models/VideoGenerationTaskRequest.ts b/front/src/services/generated/models/VideoGenerationTaskRequest.ts index 8fc8ae2..a78b847 100644 --- a/front/src/services/generated/models/VideoGenerationTaskRequest.ts +++ b/front/src/services/generated/models/VideoGenerationTaskRequest.ts @@ -23,12 +23,8 @@ export type VideoGenerationTaskRequest = { */ images?: Array; /** - * 分辨率(可选),如 720x1280 + * 视频画幅比例,如 16:9 / 9:16 */ - size?: (string | null); - /** - * 画幅比例(可选),如 16:9 / 9:16 - */ - ratio?: (string | null); + ratio: '16:9' | '4:3' | '1:1' | '3:4' | '9:16' | '21:9'; }; diff --git a/front/src/services/generated/services/LlmService.ts b/front/src/services/generated/services/LlmService.ts index 2c45dcb..aeca498 100644 --- a/front/src/services/generated/services/LlmService.ts +++ b/front/src/services/generated/services/LlmService.ts @@ -2,6 +2,7 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import type { ApiResponse_ImageGenerationOptionsRead_ } from '../models/ApiResponse_ImageGenerationOptionsRead_'; import type { ApiResponse_list_ProviderSupportedRead__ } from '../models/ApiResponse_list_ProviderSupportedRead__'; import type { ApiResponse_ModelRead_ } from '../models/ApiResponse_ModelRead_'; import type { ApiResponse_ModelSettingsRead_ } from '../models/ApiResponse_ModelSettingsRead_'; @@ -9,6 +10,7 @@ import type { ApiResponse_NoneType_ } from '../models/ApiResponse_NoneType_'; import type { ApiResponse_PaginatedData_ModelRead__ } from '../models/ApiResponse_PaginatedData_ModelRead__'; import type { ApiResponse_PaginatedData_ProviderRead__ } from '../models/ApiResponse_PaginatedData_ProviderRead__'; import type { ApiResponse_ProviderRead_ } from '../models/ApiResponse_ProviderRead_'; +import type { ApiResponse_VideoGenerationOptionsRead_ } from '../models/ApiResponse_VideoGenerationOptionsRead_'; import type { ModelCategoryKey } from '../models/ModelCategoryKey'; import type { ModelCreate } from '../models/ModelCreate'; import type { ModelSettingsUpdate } from '../models/ModelSettingsUpdate'; @@ -111,6 +113,28 @@ export class LlmService { }, }); } + /** + * 获取当前默认图片模型的关键帧规格选项 + * @returns ApiResponse_ImageGenerationOptionsRead_ Successful Response + * @throws ApiError + */ + public static getImageGenerationOptionsApiV1LlmImageGenerationOptionsGet(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v1/llm/image-generation-options', + }); + } + /** + * 获取当前默认视频模型的动态比例选项 + * @returns ApiResponse_VideoGenerationOptionsRead_ Successful Response + * @throws ApiError + */ + public static getVideoGenerationOptionsApiV1LlmVideoGenerationOptionsGet(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v1/llm/video-generation-options', + }); + } /** * 获取单个模型供应商 * @returns ApiResponse_ProviderRead_ Successful Response diff --git a/front/src/services/generated/services/StudioProjectsService.ts b/front/src/services/generated/services/StudioProjectsService.ts index fe33192..cb9532a 100644 --- a/front/src/services/generated/services/StudioProjectsService.ts +++ b/front/src/services/generated/services/StudioProjectsService.ts @@ -13,7 +13,7 @@ import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class StudioProjectsService { /** - * 获取项目风格与视频参数候选项 + * 获取项目风格候选项 * @returns ApiResponse_ProjectStyleOptionsRead_ Successful Response * @throws ApiError */ diff --git a/site/content/docs/architecture/generation-workspace.md b/site/content/docs/architecture/generation-workspace.md index 512760d..6fdde83 100644 --- a/site/content/docs/architecture/generation-workspace.md +++ b/site/content/docs/architecture/generation-workspace.md @@ -70,12 +70,17 @@ backend/app/services/studio/generation/ 当前 `preview-prompt` 与 `create video task` 已共享同一份 `reference_mode + images` 上下文。 -当前视频参数(`size` / `ratio`)采用“项目默认 + 分镜覆盖 + 请求显式参数”解析: +当前视频参数已收口为以 `ratio` 为唯一业务主参数: -- 项目级默认:`Project.default_video_size` / `Project.default_video_ratio` -- 分镜级覆盖:`ShotDetail.override_video_size` / `ShotDetail.override_video_ratio` -- 执行优先级:请求参数 > 分镜覆盖 > 项目默认 > 供应商默认 -- 冲突规则:若 `size` 推导比例与 `ratio` 冲突,任务创建阶段直接报错 +- 项目级默认:`Project.default_video_ratio` +- 分镜级覆盖:`ShotDetail.override_video_ratio` +- 前端在提交视频任务时显式传入本次生效的 `ratio` +- 后端直接使用请求中的 `ratio` 创建任务 +- 若某个供应商不直接支持 `ratio`,由 provider adapter 在执行层内部派生辅助 `size` +- 前端比例枚举来自当前默认视频模型 capability 动态返回,不再使用静态常量 +- 关键帧图片若用于视频参考,提交时会显式携带 `target_ratio + resolution_profile` +- 后端根据当前默认图片模型 capability 解析对应 `size`,保证关键帧画幅与目标视频保持一致 +- 工作室会展示当前关键帧规格预览:`ratio + resolution_profile -> size` ### `asset_image`