/** * 批量变体剪辑计划 API(#1744) * * 批量预览时向后端申请 N 个变体的「独立剪辑计划片段」: * - 变体 0 保留源 plan(用户在编辑器/智能选片产出的片段,含标题样式编辑结果); * - 变体 1..N-1 由后端 reselect_plan_for_variant 完整重跑单视频选片流程 * (素材洗牌 + main 片段顺序洗牌 + 镜头/起点随机 + 跨变体 20% 区间避让 + * 素材使用区间写回 metadata),与正式批量生成 POST /generation/tasks?count=N * 使用同一套选片逻辑; * - 正式生成时把 variant_plan_ids 原样回传,后端直接关联这些 plan 渲染, * 不再重新选片 —— 预览所见即成片。 * * 该接口只做选片/建 plan(秒级),不触发视频渲染,无渲染成本。 * 后端端点未上线(404)或选片失败(素材不足等)时前端降级为本地 variantSeed * 模拟预览,不阻塞用户流程。 */ import apiClient from "../client" import type { EditPlanClip } from "../template-editor" /** 批量变体计划请求体 */ export interface BatchVariantPlansRequest { template_id: string /** 本批次素材池(手动选择或智能匹配结果) */ asset_ids: string[] /** 变体数量(≥1);=1 时只返回源 plan 片段 */ count: number /** 源剪辑计划 ID:优先取预览/草稿关联的 plan;不传由后端按 template_id+user 兜底最新 plan */ source_edit_plan_id?: string } /** 单个变体的计划片段 */ export interface VariantPlan { /** 变体序号,从 0 开始 */ variant_index: number /** 该变体关联的剪辑计划 ID(正式生成时回传,实现预览即成片) */ plan_id: string /** 该变体的真实片段(顺序/素材/起点与正式成片一致) */ clips: EditPlanClip[] } /** 批量变体计划响应 */ export interface BatchVariantPlansResponse { items: VariantPlan[] total: number } /** * 创建批量变体剪辑计划并返回各变体片段。 * * 注意:端点 404(后端未上线)/ 400(素材不足)等失败由调用方 catch 后降级, * 不要抛 unhandled rejection。 */ export async function createBatchVariantPlans( params: BatchVariantPlansRequest, ): Promise { const response = await apiClient.post( "/generation/variant-plans", params, ) return response.data }