fix(api): 一键生成自动选素材全链路修复,4个核心根因一次性解决 #491
Reference in New Issue
Block a user
Delete Branch "fix/auto-material-all-root-causes"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
背景
一键生成PIP模板创建计划后,片段asset_id全空、end_time全0,导致渲染找不到可用片段。
全链路系统性排查后,发现不止一个根因,共找到4个核心问题,一次性全部修复。
修复的4个核心根因
🔴 根因1(P0): PIP/VOICE_PIP模式 + 有clip_configs时素材分配完全失败
apps/api/app/services/plan_generator_service.py🔴 根因2(P0): generate-from-template漏写plan.config.asset_ids
apps/api/app/api/routes/edit_plans_timeline.py🟠 根因3(P1): 兜底2只建片段不分素材
apps/api/app/api/routes/edit_plans_generation.py🟠 根因4(P1): 兜底4 material_mode默认manual永不触发
apps/api/app/api/routes/edit_plans_generation.py测试
- 根因1(P0): PIP/VOICE_PIP模式+有clip_configs时素材分配完全失败 * ClipType枚举只有main/intro/outro等,没有overlay/background/corner_voice/b_roll * _distribute_pip/_distribute_voice_pip按类型筛选永远找不到目标片段 * 修复: _create_clips_from_configs后调用_map_clip_types_for_mode 将MAIN类型片段按顺序映射为对应模式的角色类型 - 根因2(P0): generate-from-template漏写plan.config.asset_ids * create_plan有这一步兜底用,timeline入口漏掉了 * 修复: 补上asset_ids写入config,与create_plan保持一致 - 根因3(P1): 兜底2 _auto_fallback_copy_template_clips只建片段不分素材 * 兜底4去掉material_mode限制后,兜底2创建的片段能通过兜底4自动分配 * 等于间接修复了兜底2的素材问题 - 根因4(P1): 兜底4 material_mode默认manual永不触发 * 全代码库没有任何地方设置material_mode=auto * 修复: 去掉material_mode检查,只要有project_id且有无素材片段就自动选 * 确保最后一道兜底防线真正生效 新增2个单元测试验证PIP/VOICE_PIP+有clip_configs场景的素材分配代码审查结果 - PR #491
⚠️ 问题(2个需要修改)
apps/api/app/api/routes/edit_plans_timeline.py 第223行:日志格式化参数类型不匹配,可能导致运行时崩溃。
%s改为%d,但在 FastAPI 等框架中,user参数通常是 User 对象或 Pydantic 模型而非整数 ID。直接传入对象给%d会引发TypeError。%s,或者确认user为整数后改为user.id。apps/api/app/api/routes/edit_plans_generation.py 第136行:移除
material_mode校验可能导致非预期的行为变更。material_mode == "auto"时触发兜底,现逻辑只要project_id存在且有无素材片段就触发。虽然注释解释了原代码是死代码,但若此函数被用于“手动模式”的编辑场景,强制自动填充素材会违背用户的“手动”意图,导致用户无法保留空片段。editing_mode或显式传入auto_fill标志)。💡 建议(2个可选)
apps/api/app/api/routes/edit_plans_timeline.py 第219-226行:在生成流程中直接进行数据库更新可能存在事务风险。
generate_from_template函数内部实例化EditPlanService并调用update_plan,会产生副作用。如果外层事务回滚,这里的更新可能造成数据不一致;反之亦然。db作用域和事务管理在调用链路中是安全的,或者将 Config 的更新逻辑上移至事务边界更清晰的地方。apps/api/app/services/plan_generator_service.py 第220-234行:硬编码字符串赋值给枚举字段存在类型安全隐患。
"overlay","background"等字符串赋值给clip.clip_type。如果EditPlanClip模型中的clip_type字段定义了严格的ClipType枚举校验,这种赋值可能会导致数据校验失败或后续处理异常。ClipType枚举或数据库 Schema 支持这些新增的字符串值,或者确保该字段在模型层是宽松的字符串类型。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-07-18 09:19:25 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。