fix: #1286 can_generate 增加最后防线自动修复,解决「没有可渲染的就绪片段」报错 #1288

Merged
xiaoxia merged 4 commits from feature/1286-can-generate-auto-repair into develop 2026-08-07 22:42:20 +08:00
Owner

问题

智能剪辑流程走完素材选择后,can_generate(edit_plan_service.py:571)在 mark_clips_ready 之前执行。PR #1276 修的是 mark_clips_ready,但报错来自 can_generate,没覆盖到。

根因:generate_editor_draft 的 fallback 链路(_fallback.py)太长太脆弱,任何一环出问题都导致最终 can_generate 验证失败,且无日志追踪。

修复

1. can_generate 增加最后防线自动修复

如果 clips 存在但都没有 asset_id,且 config.asset_ids 非空,直接在 can_generate 内部执行素材分配:

  • 按顺序循环分配 config.asset_ids 给所有 clips
  • 分配后重新加载验证
  • 有详细 warning/info 日志

2. _auto_fallback_assign_assets 增强

  • 进入时记录诊断日志(total_clips、clips_without_asset、config_asset_ids)
  • 分配加 try-except 防止单个失败导致全部中断
  • 分配后重新检查实际状态

3. generation.py 防御性日志

  • fallback 链路结束后、can_generate 前,记录 plan 状态、clip 数量、有素材 clip 数量

测试

10 个新单元测试覆盖:

  • clips 无素材 + config.asset_ids 非空 → 自动修复成功
  • clips 无素材 + config.asset_ids 为空 → 仍返回 False
  • clips 已有素材 → 不触发修复
  • 素材少于 clips → 循环分配
  • config 为 None → 安全降级
  • 无 clips → 仍返回 False
  • 部分有素材 → 正常通过
  • 多素材按序分配
  • 幂等性验证
  • 预览流程不受影响

56 个已有 edit_plan_service 测试全部通过。

## 问题 智能剪辑流程走完素材选择后,`can_generate`(edit_plan_service.py:571)在 `mark_clips_ready` 之前执行。PR #1276 修的是 `mark_clips_ready`,但报错来自 `can_generate`,没覆盖到。 根因:`generate_editor_draft` 的 fallback 链路(_fallback.py)太长太脆弱,任何一环出问题都导致最终 `can_generate` 验证失败,且无日志追踪。 ## 修复 ### 1. can_generate 增加最后防线自动修复 如果 clips 存在但都没有 asset_id,且 `config.asset_ids` 非空,直接在 can_generate 内部执行素材分配: - 按顺序循环分配 config.asset_ids 给所有 clips - 分配后重新加载验证 - 有详细 warning/info 日志 ### 2. _auto_fallback_assign_assets 增强 - 进入时记录诊断日志(total_clips、clips_without_asset、config_asset_ids) - 分配加 try-except 防止单个失败导致全部中断 - 分配后重新检查实际状态 ### 3. generation.py 防御性日志 - fallback 链路结束后、can_generate 前,记录 plan 状态、clip 数量、有素材 clip 数量 ## 测试 10 个新单元测试覆盖: - ✅ clips 无素材 + config.asset_ids 非空 → 自动修复成功 - ✅ clips 无素材 + config.asset_ids 为空 → 仍返回 False - ✅ clips 已有素材 → 不触发修复 - ✅ 素材少于 clips → 循环分配 - ✅ config 为 None → 安全降级 - ✅ 无 clips → 仍返回 False - ✅ 部分有素材 → 正常通过 - ✅ 多素材按序分配 - ✅ 幂等性验证 - ✅ 预览流程不受影响 56 个已有 edit_plan_service 测试全部通过。
xiaoxia added 1 commit 2026-08-07 22:16:06 +08:00
fix: #1286 can_generate 增加最后防线自动修复,解决「没有可渲染的就绪片段」报错
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1m1s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m9s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m6s
CI/CD Pipeline / Validate - Code Quality (pull_request) Has been cancelled
CI/CD Pipeline / Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Frontend Lint (pull_request) Has been cancelled
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / PR Build API Image (pull_request) Has been cancelled
CI/CD Pipeline / PR Build Web Image (pull_request) Has been cancelled
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been cancelled
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been cancelled
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
AI Code Review / AI Code Review (pull_request) Has been cancelled
PR Automation / Auto Approve on CI Green (pull_request) Has been cancelled
PR Automation / Auto Merge on CI Green + Approved (pull_request) Has been cancelled
Preview Deploy / Deploy Preview Environment (pull_request) Has been cancelled
4bfe456ca7
问题:智能剪辑流程走完素材选择后,can_generate 在 mark_clips_ready 之前执行,
fallback 链路任何一环出问题都导致最终验证失败。

修复:
1. can_generate 内部增加自动修复:clips 无素材但 config.asset_ids 非空时,
   直接分配素材,不再依赖前置 fallback 链路
2. _auto_fallback_assign_assets 增加详细诊断日志和异常捕获
3. generation.py fallback 链路结束后增加防御性诊断日志

新增 10 个单元测试覆盖自动修复各场景。
auto-approve-bot added 1 commit 2026-08-07 22:21:03 +08:00
style: auto-format with black + isort + prettier [skip ci-format-check]
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 54s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m1s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 52s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m20s
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m33s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m38s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m55s
AI Code Review / AI Code Review (pull_request) Failing after 4m7s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m56s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m56s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 4m2s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m51s
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
aa49c5fd86

🚀 预览环境已部署

项目 详情
PR号 #1288
预览链接 https://pr-1288.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1288 | | 预览链接 | [https://pr-1288.preview.xiaoxiajianji.com](https://pr-1288.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 1 commit 2026-08-07 22:28:02 +08:00
fix: 修复 AI Code Review 阻塞问题
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 27s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 57s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m5s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m25s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m58s
AI Code Review / AI Code Review (pull_request) Successful in 2m37s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m9s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 3m8s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m45s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m50s
CI/CD Pipeline / Validate - Code Quality (pull_request) Has been cancelled
CI/CD Pipeline / Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
afc46a97cf
1. can_generate 自动修复中 assign_asset 加 try-except,避免单个失败导致整体崩溃
2. 移除 generation.py 冗余 DB 查询,诊断日志移入 can_generate 内部
3. 增加详细诊断日志:clips_with_asset 数量、config_asset_ids 数量
auto-approve-bot added 1 commit 2026-08-07 22:33:15 +08:00
style: auto-format with black + isort + prettier [skip ci-format-check]
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 44s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 49s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 53s
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m21s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m41s
AI Code Review / AI Code Review (pull_request) Successful in 1m54s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m18s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m16s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m31s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m9s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 4m33s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m33s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 14s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 39s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 39s
d969f1dfa6
Collaborator

【阻塞级判定】

  • 是否存在阻塞级问题:否
  • 阻塞级问题数量:0 个

📊 审查概览

  • 整体评价:通过
  • 建议级问题数量:2 个

🔴 阻塞级问题(必须修复)

💡 改进建议(不阻塞合并)

  1. [apps/api/app/services/edit_plan_service.py: 571] 方法副作用问题

    • 具体内容:can_generate 方法通常作为“检查”类方法,应当是幂等的且无副作用的。当前实现中,该方法在特定条件下直接调用了 self.assign_asset 修改了数据库状态。虽然这是为了实现“最后一道防线”的自动修复业务逻辑,但这种“检查即修改”的行为违反了单一职责原则,可能导致调用者(如外部系统或测试用例)在未预料到数据变更的情况下产生副作用。建议如果可能,将自动修复逻辑提取到独立的方法(如 auto_repair_assets),并在调用 can_generate 前显式调用,或者在 can_generate 内部调用但明确文档化此副作用风险。
  2. [apps/api/app/services/edit_plan_service.py: 603] 代码重复

    • 具体内容:edit_plan_service.py 中的自动修复逻辑(遍历 clips 并分配 asset)与 _fallback.py 中的逻辑高度相似。虽然两者的触发时机和上下文不同(一个是服务层最后防线,一个是路由层兜底),但核心算法一致。建议考虑将通用的分配逻辑抽取为 EditPlanService 的一个私有方法(如 _batch_assign_assets_clips),以减少代码重复,便于后续维护逻辑一致性。

良好实践

  • 异常处理健壮:在 _fallback.pyedit_plan_service.py 的循环中均对 assign_asset 进行了 try-except 捕获,防止单个片段分配失败导致整个流程中断,并记录了详细的日志,便于排查问题。
  • 状态重验证:在尝试自动修复后,均通过重新查询数据库(list_clips / list_by_plan)来验证修复结果,确保内存中的数据状态与数据库一致,避免了脏读或缓存问题。
  • 边界条件保护:在取模运算 i % len(config_asset_ids) 前均检查了 config_asset_ids 是否为空,有效避免了除零错误。
  • 测试覆盖全面:新增的单元测试覆盖了正常修复、修复失败、已有素材、空配置等多种场景,确保了代码改动在不同边界下的行为符合预期。

格式检查通过 | 逻辑审查通过 | 性能良好


🤖 由 AI 代码审查机器人自动生成 | 2026-08-07 14:35:09 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:通过 - 建议级问题数量:2 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 1. **[apps/api/app/services/edit_plan_service.py: 571] 方法副作用问题** - 具体内容:`can_generate` 方法通常作为“检查”类方法,应当是幂等的且无副作用的。当前实现中,该方法在特定条件下直接调用了 `self.assign_asset` 修改了数据库状态。虽然这是为了实现“最后一道防线”的自动修复业务逻辑,但这种“检查即修改”的行为违反了单一职责原则,可能导致调用者(如外部系统或测试用例)在未预料到数据变更的情况下产生副作用。建议如果可能,将自动修复逻辑提取到独立的方法(如 `auto_repair_assets`),并在调用 `can_generate` 前显式调用,或者在 `can_generate` 内部调用但明确文档化此副作用风险。 2. **[apps/api/app/services/edit_plan_service.py: 603] 代码重复** - 具体内容:`edit_plan_service.py` 中的自动修复逻辑(遍历 clips 并分配 asset)与 `_fallback.py` 中的逻辑高度相似。虽然两者的触发时机和上下文不同(一个是服务层最后防线,一个是路由层兜底),但核心算法一致。建议考虑将通用的分配逻辑抽取为 `EditPlanService` 的一个私有方法(如 `_batch_assign_assets_clips`),以减少代码重复,便于后续维护逻辑一致性。 ### ✅ 良好实践 - **异常处理健壮**:在 `_fallback.py` 和 `edit_plan_service.py` 的循环中均对 `assign_asset` 进行了 `try-except` 捕获,防止单个片段分配失败导致整个流程中断,并记录了详细的日志,便于排查问题。 - **状态重验证**:在尝试自动修复后,均通过重新查询数据库(`list_clips` / `list_by_plan`)来验证修复结果,确保内存中的数据状态与数据库一致,避免了脏读或缓存问题。 - **边界条件保护**:在取模运算 `i % len(config_asset_ids)` 前均检查了 `config_asset_ids` 是否为空,有效避免了除零错误。 - **测试覆盖全面**:新增的单元测试覆盖了正常修复、修复失败、已有素材、空配置等多种场景,确保了代码改动在不同边界下的行为符合预期。 --- ✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能良好 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-07 14:35:09 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit 76f41529fe into develop 2026-08-07 22:42:20 +08:00

🗑️ 预览环境已清理

PR #1288 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1288 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.