+
+
+
+
+ 视频提词 Schema 配置
+
+ 配置会被爆款开头复刻和拆镜复刻第 4 步视频 AI 提词共同复用。传给 AI 时只保留纯键值 schema,不携带显示名、启用、可编辑等管理字段。
+
+
+
+
+ 启用自定义配置
+
+ {usingDefault && 当前使用默认配置兜底}
+ {defaultConfig && 默认分组 {defaultConfig.sections.length}}
+
+
+
+
+
+
+
+
+
+ } loading={saving} onClick={save}>保存配置
+ } onClick={openPreview}>预览运行时 Schema
+ } onClick={doExport}>导出 JSON
+ } onClick={() => importInputRef.current?.click()}>导入 JSON
+
+ }>恢复默认
+
+
+
+
+
+
+ } onClick={addSection}>新增一级分组
+
+
+ ),
+ },
+ {
+ key: 'time',
+ label: '秒数切片规则',
+ children: (
+
+
+ } onClick={addTimeRule}>新增秒数规则
+ {timePlanRules.map((rule, ruleIndex) => (
+ } onClick={() => deleteTimeRule(ruleIndex)}>删除规则}
+ >
+
+ updateTimeRule(ruleIndex, { minDuration: Number(value || 1) })} />
+ updateTimeRule(ruleIndex, { maxDuration: Number(value || 1) })} />
+ } onClick={() => addSegment(ruleIndex)}>新增片段
+
+
+ {rule.segments.map((segment, segmentIndex) => (
+
+ updateSegment(ruleIndex, segmentIndex, { ratio: Number(value || 0.01) })} />
+ updateSegment(ruleIndex, segmentIndex, { stage: e.target.value })} />
+ updateSegment(ruleIndex, segmentIndex, { description: e.target.value })} />
+ } onClick={() => deleteSegment(ruleIndex, segmentIndex)} />
+
+ ))}
+
+
+ ))}
+
+ ),
+ },
+ {
+ key: 'json',
+ label: 'JSON 高级查看',
+ children:
,
+ },
+ ]}
+ />
+
+
+
+
setPreviewOpen(false)} width={980} footer={}>
+
+
+
+
+
+
+ {previewResult ? (
+ ,
+ },
+ {
+ key: 'timePlan',
+ label: `动态时间规划(${runtimePreviewTimePlan(previewResult).length} 段)`,
+ children: ,
+ },
+ {
+ key: 'snapshot',
+ label: '配置快照',
+ children: ,
+ },
+ ]}
+ />
+ ) : (
+
+ )}
+
+
+ );
+};
+
+export default AdminVideoPromptSchemaConfig;
diff --git a/video-gen-admin/src/types/index.ts b/video-gen-admin/src/types/index.ts
index aea94177..3e66a7f1 100644
--- a/video-gen-admin/src/types/index.ts
+++ b/video-gen-admin/src/types/index.ts
@@ -581,3 +581,91 @@ export interface AdminShotSegmentQueryParams {
page?: number;
pageSize?: number;
}
+
+// ── Video Prompt Schema Config (Admin) ─────────────────────
+
+export type VideoPromptSchemaNodeType = 'object' | 'array' | 'string' | 'number' | 'boolean' | 'flow';
+
+export interface VideoPromptSchemaNode {
+ key: string;
+ label: string;
+ type: VideoPromptSchemaNodeType | string;
+ enabled: boolean;
+ editable: boolean;
+ maxLength?: number;
+ value?: any;
+ children?: VideoPromptSchemaNode[];
+ contentKey?: string;
+ contentAliases?: string[];
+ itemFields?: VideoPromptFlowItemField[];
+}
+
+export interface VideoPromptFlowItemField {
+ key: string;
+ label: string;
+ enabled: boolean;
+ editable: boolean;
+ maxLength?: number;
+ value?: any;
+}
+
+export interface VideoPromptTimePlanSegment {
+ stage: string;
+ description: string;
+}
+
+export interface VideoPromptTimePlanRule {
+ minDuration: number;
+ maxDuration: number;
+ ratios: number[];
+ segments: VideoPromptTimePlanSegment[];
+}
+
+export interface VideoPromptSchemaConfigData {
+ version: string;
+ enabled: boolean;
+ sections: VideoPromptSchemaNode[];
+ timePlanRules: VideoPromptTimePlanRule[];
+}
+
+export interface VideoPromptSchemaConfigOut {
+ id?: string | null;
+ key: string;
+ description?: string | null;
+ isEnabled: boolean;
+ usingDefault: boolean;
+ data: VideoPromptSchemaConfigData;
+ defaultData: VideoPromptSchemaConfigData;
+ createdAt?: string | null;
+ updatedAt?: string | null;
+}
+
+export interface VideoPromptSchemaConfigSavePayload {
+ is_enabled: boolean;
+ data: any;
+}
+
+export interface VideoPromptSchemaExportOut {
+ version: string;
+ key: string;
+ isEnabled: boolean;
+ data: VideoPromptSchemaConfigData;
+}
+
+export interface VideoPromptSchemaPreviewPayload {
+ is_enabled: boolean;
+ data: any;
+ duration: number;
+ aspect_ratio: string;
+ resolution: string;
+ frame_rate: string;
+ supported_durations?: number[];
+ supported_ratios?: string[];
+ supported_resolutions?: string[];
+}
+
+export interface VideoPromptSchemaPreviewOut {
+ schemaConfigSnapshot: Record