分镜生成:各服务商与模型的 message_filter 形态与兼容策略
本文档记录目前前端/后端对不同服务商与模型返回的分镜 JSON(通常位于 message_filter 或文本内容)进行解析的兼容方式,便于后续查阅与优化。
服务商与模型
- Volcengine(火山引擎):如
Doubao-Seed-1.6、DeepSeek-V3.1等,通过 Ark API 返回。 - Qianwen(通义千问):文本或对象结构,可能包含嵌套的
message.message_filter。 - 其他模型:遵循相同的解析流程,只要能提取到包含
storyboard或分镜数组/对象的 JSON 即可。
常见返回结构
纯文本或字符串包裹的 JSON
- 可能带 Markdown 代码块或额外前后缀。
- 兼容策略:
extractJsonSubstring提取首个完整{}/[]片段;cleanArkResponseString清洗代码块与异常字符;tryJsonDecode自动提取有效 JSON 子串。
Volcengine Ark 返回数组项
- 形态:
[{ message_filter: "..." }, ...]或其他对象内含message_filter。 - 兼容策略:遍历数组,优先读取
item.message_filter,再做清洗与解析。
- 形态:
Qianwen 返回对象或数组
- 可能存在:
obj.message.message_filter、obj.message_filter、obj.text、obj.content、obj.responseData[i].message_filter等。 - 兼容策略:在
StoryBoard.vue/LLMGeneratePanel.vue中使用pickText/pickMF递归提取。
- 可能存在:
分镜数据形态
- 对象:
{ storyboard: { 分镜1: {...}, 分镜2: {...} }, meta?... }或直接是{ 分镜1: {...} }。 - 数组:
[ { "分镜1": {...} }, { "分镜2": {...} } ]。 - 兼容策略:
- 归一化:
normalizeStoryboardShape(StoryBoard.vue)与normalizeStoryboardList(LLMGeneratePanel.vue)。 - 扁平化数组的单键对象:
[{"分镜1": {...}}]提升为分镜项并保留__indexLabel。 - 数字排序分镜键:按键名中的数字升序(如
分镜1、分镜2)。
- 归一化:
- 对象:
字段名兼容(分镜项)
- line(台词):
['line','台词','对白','对白文本','对白内容','台词内容','字幕','text'] - title(标题):
['title','titile','标题','分镜标题','镜头名称','名称'] - description(描述):
['description','描述','镜头描述','画面描述','场景描述'] - name(角色/人物):
['name','角色','人物','角色名','人物名称'] - prompt(提示词):['prompt','Prompt','PROMPT','提示词']
- 兼容来源:顶层字段或嵌套在
effect对象中。
- 兼容来源:顶层字段或嵌套在
- effect(效果)
- 可能为对象或字符串。
- 兼容策略:在
StoryBoard.vue中统一为字符串(生成流程入口),或保留对象(模板结果应用入口);在两种入口中均会从对象型effect中提升prompt到顶层。
解析与清洗流程(关键方法)
extractJsonSubstring(s):从文本里提取第一个完整的 JSON 片段({}或[])。cleanArkResponseString(s):去除 Markdown 代码块和异常字符,便于 JSON 解码。tryJsonDecode(s):尝试直接JSON.parse,失败时自动截取有效子串再解析。normalizeStoryboardShape/normalizeStoryboardList:- 支持对象/数组形态,扁平化单键对象数组项。
- 提取/提升
effect.prompt到顶层prompt。
processLineContent:过滤台词中括号与注释,保留原始台词到lineOrigin。normalizeEffectToString:将effect统一为字符串(或在模板应用入口保持对象)。
预览与编辑(生成结果确认弹窗)
LLMGeneratePanel.vue:- 解析后构建树:展示
description/line/prompt。 - 编辑器支持修改
description/line/effect(JSON)/prompt,保存后重建树。
- 解析后构建树:展示
问题诊断清单
- 预览不显示:检查
generatedResult是否为清洗后的字符串;若为空或非 JSON,查看原始字符串并手动验证。 prompt缺失:确认是否在顶层或effect内部;现在两处入口均会提升并显示。- 分镜数量不对:检查是否为数组单键对象形态;归一化已扁平化处理。
后续优化建议
- 统一使用
prompt字段,彻底移除prompt_en的历史遗留代码。 - 为
effect配置显示模板,支持富文本/结构化渲染,提高可读性。 - 增加服务商/模型返回差异的单元测试数据集,自动回归解析兼容性。