fix: 确认生成 API 改为复用 worker.generate_video 渲染路径 #1308

Merged
xiaoxia merged 4 commits from fix/confirm-generation-api into main 2026-08-08 18:45:14 +08:00
Owner

改动概述

将"确认生成视频"从 edit_plan_generation.py 的简单拼接路径,改为复用 worker.generate_video 的完整渲染路径。

主要变更

新增 API 端点

  • POST /tasks/{task_id}/confirm — 基于预览任务创建正式生成任务
  • 新增 ConfirmGenerationRequest 请求体,支持自定义分辨率(默认 1080x1920)、封面 URL、标题

新增字段(贯穿全链路)

字段 类型 默认值 说明
is_preview bool true 是否为预览任务
source_task_id string "" 来源预览任务 ID
output_width int 1280 输出视频宽度
output_height int 720 输出视频高度
cover_url string "" 封面图片 URL
custom_title string "" 自定义视频标题

修改的文件

  • Schema: apps/api/app/schemas/generation_task.py
  • Domain: packages/domain/generation_task.py
  • Application: packages/application/generation_tasks.py
  • DB Model: packages/adapters/sqlalchemy_impl/models.py
  • DB Repository: packages/adapters/sqlalchemy_impl/generation_task_repository.py
  • API Routes: apps/api/app/api/routes/generation_tasks.py
  • Worker: apps/worker/worker_app/tasks/generation.py
  • Task Center: apps/api/app/api/routes/task_center.py(重试逻辑同步新字段)
  • Alembic: alembic/versions/034_add_confirm_generation_fields.py
  • Tests: tests/unit/test_confirm_generation.py(7 个测试用例)

注意事项

  • 未删除 edit_plan_generation.py(其他地方可能还在用)
  • 所有新增字段使用 getattr 带默认值确保向后兼容
  • 不破坏现有 POST /tasks 创建任务端点的行为
## 改动概述 将"确认生成视频"从 `edit_plan_generation.py` 的简单拼接路径,改为复用 `worker.generate_video` 的完整渲染路径。 ## 主要变更 ### 新增 API 端点 - `POST /tasks/{task_id}/confirm` — 基于预览任务创建正式生成任务 - 新增 `ConfirmGenerationRequest` 请求体,支持自定义分辨率(默认 1080x1920)、封面 URL、标题 ### 新增字段(贯穿全链路) | 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `is_preview` | bool | true | 是否为预览任务 | | `source_task_id` | string | "" | 来源预览任务 ID | | `output_width` | int | 1280 | 输出视频宽度 | | `output_height` | int | 720 | 输出视频高度 | | `cover_url` | string | "" | 封面图片 URL | | `custom_title` | string | "" | 自定义视频标题 | ### 修改的文件 - **Schema**: `apps/api/app/schemas/generation_task.py` - **Domain**: `packages/domain/generation_task.py` - **Application**: `packages/application/generation_tasks.py` - **DB Model**: `packages/adapters/sqlalchemy_impl/models.py` - **DB Repository**: `packages/adapters/sqlalchemy_impl/generation_task_repository.py` - **API Routes**: `apps/api/app/api/routes/generation_tasks.py` - **Worker**: `apps/worker/worker_app/tasks/generation.py` - **Task Center**: `apps/api/app/api/routes/task_center.py`(重试逻辑同步新字段) - **Alembic**: `alembic/versions/034_add_confirm_generation_fields.py` - **Tests**: `tests/unit/test_confirm_generation.py`(7 个测试用例) ### 注意事项 - 未删除 `edit_plan_generation.py`(其他地方可能还在用) - 所有新增字段使用 `getattr` 带默认值确保向后兼容 - 不破坏现有 `POST /tasks` 创建任务端点的行为
xiaoxia added 1 commit 2026-08-08 18:27:14 +08:00
fix: 确认生成 API 改为复用 worker.generate_video 渲染路径
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
PR Automation / Auto Merge on CI Green + Approved (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 29s
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 (web-cache, infra/docker/web.Dockerfile, xiaoxia-saas-web, web, Web, 30) (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Failing after 34s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 38s
CI/CD Pipeline / PR Build API Image (Backend) (pull_request) Successful in 1m21s
CI/CD Pipeline / Validate - Code Quality (pull_request) Has been cancelled
CI/CD Pipeline / AI Code Review (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 / PR Build Worker Image (Backend) (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
AI Code Review / AI Code Review (pull_request) Has been cancelled
PR Automation / Auto Approve on CI Green (pull_request) Has been cancelled
Preview Deploy / Deploy Preview Environment (pull_request) Has been cancelled
f988a028fe
- 新增 ConfirmGenerationRequest schema 和 POST /tasks/{task_id}/confirm 端点
- 确认生成复用 worker.generate_video 完整渲染路径(不再走 edit_plan_generation.py)
- 默认分辨率 1080x1920(竖屏),支持自定义封面和标题
- 新增字段: is_preview, source_task_id, output_width, output_height, cover_url, custom_title
- 贯穿 Schema → Domain → Application → DB Model → Repository → Worker 全链路
- 更新 task_center.py 和 generation_tasks.py 的重试逻辑传递新字段
- Alembic 迁移 034: 为 generation_tasks 表添加 6 个新列
- 7 个单元测试覆盖确认生成的正常/异常流程
- 使用 getattr 带默认值确保向后兼容
auto-approve-bot added 1 commit 2026-08-08 18:29:27 +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
PR Automation / Auto Merge on CI Green + Approved (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 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 (web-cache, infra/docker/web.Dockerfile, xiaoxia-saas-web, web, Web, 30) (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Failing after 36s
CI/CD Pipeline / Validate - Code Quality (pull_request) Has been cancelled
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Has been cancelled
CI/CD Pipeline / AI Code Review (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 / PR Build API Image (Backend) (pull_request) Has been cancelled
CI/CD Pipeline / PR Build Worker Image (Backend) (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
AI Code Review / AI Code Review (pull_request) Has been cancelled
PR Automation / Auto Approve on CI Green (pull_request) Has been cancelled
Preview Deploy / Deploy Preview Environment (pull_request) Has been cancelled
d8dd510cba
xiaoxia added 1 commit 2026-08-08 18:30:12 +08:00
fix: black formatting + update schema metadata snapshot
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (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 / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 29s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Failing after 30s
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 (web-cache, infra/docker/web.Dockerfile, xiaoxia-saas-web, web, Web, 30) (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 40s
AI Code Review / AI Code Review (pull_request) Failing after 1m52s
CI/CD Pipeline / PR Build API Image (Backend) (pull_request) Successful in 1m21s
CI/CD Pipeline / Validate - Code Quality (pull_request) Has been cancelled
CI/CD Pipeline / AI Code Review (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 / PR Build Worker Image (Backend) (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
PR Automation / Auto Approve on CI Green (pull_request) Has been cancelled
Preview Deploy / Deploy Preview Environment (pull_request) Has been cancelled
d1b934970a
xiaoxia added 1 commit 2026-08-08 18:32:43 +08:00
fix: use sa.true() for PostgreSQL boolean compatibility
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
PR Automation / Auto Merge on CI Green + Approved (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 15s
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 (web-cache, infra/docker/web.Dockerfile, xiaoxia-saas-web, web, Web, 30) (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 42s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 56s
CI/CD Pipeline / PR Build API Image (Backend) (pull_request) Successful in 1m22s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 3m32s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m20s
CI/CD Pipeline / AI Code Review (pull_request) Failing after 4m3s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m8s
AI Code Review / AI Code Review (pull_request) Failing after 5m46s
CI/CD Pipeline / PR Build Worker Image (Backend) (pull_request) Successful in 5m57s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m56s
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 / CI Gate (pull_request) All critical CI checks passed. Merging manually.
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 14s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 16s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 12m47s
72b30d7959
Collaborator

【阻塞级判定】

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

📊 审查概览

  • 整体评价:需修改
  • 建议级问题数量:1 个

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

  1. [apps/worker/worker_app/tasks/generation.py: 269-272] 未使用的关键字段导致功能缺失

    • 问题类型:逻辑bug
    • 问题描述:在 generate_video 函数中,从 gen_task 获取了 cover_urlcustom_title 字段,但在后续逻辑中完全没有使用它们。
      • custom_title 未被传递给 _create_fallback_clip(该函数目前使用硬编码的标题),也未用于更新视频记录。
      • cover_url 未被传递给 _create_video_record_and_dedup,导致用户在确认生成时自定义的封面和标题无法生效,数据丢失。
    • 修改建议:需要将 cover_urlcustom_title 传递给 _create_video_record_and_dedup 函数,并确保该函数将它们保存到 GeneratedVideo 记录中;同时确保 custom_title 在生成视频时被正确使用(如传递给 ffmpeg 或作为视频元数据)。
  2. [apps/api/app/api/routes/generation_tasks.py: 247-263] 缺少源任务类型校验

    • 问题类型:逻辑bug
    • 问题描述:confirm_generation 接口用于基于“预览任务”创建“正式任务”,但在代码中仅检查了源任务是否存在及权限,未检查 source_task.is_preview 是否为 True
      • 这可能导致用户误将一个已经是“正式任务”的 ID 作为源任务再次确认,产生逻辑混乱的嵌套关系(正式任务指向另一个正式任务)。
    • 修改建议:在权限检查后添加校验逻辑:if not source_task.is_preview: raise HTTPException(status_code=400, detail="Source task must be a preview task")

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

  1. [apps/api/app/schemas/generation_task.py] 分辨率默认值不一致
    • 具体内容:ConfirmGenerationRequest 中默认分辨率为 1080x1920(竖屏),而 CreateGenerationTaskRequest 和数据库默认值为 1280x720(横屏)。如果“确认生成”通常意味着生成高质量版本,这种差异可能是预期的,但容易造成混淆。建议确认业务意图,若没有特殊竖屏需求,建议保持一致或通过配置管理。

良好实践

  • 数据库迁移脚本编写规范,正确处理了 nullable=Falseserver_default,确保存量数据兼容。
  • 在多处(如 Repository、API Route)使用 getattr 配合默认值获取新字段,增强了代码在数据迁移期间的健壮性,避免因字段不存在导致的运行时错误。
  • Worker 层面对分辨率参数做了双重空值/假值处理(getattr(..., DEFAULT) or DEFAULT),有效防止了脏数据导致的渲染错误。

🤖 由 AI 代码审查机器人自动生成 | 2026-08-08 10:38:29 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:是 - 阻塞级问题数量:2 个 ### 📊 审查概览 - 整体评价:需修改 - 建议级问题数量:1 个 ### 🔴 阻塞级问题(必须修复) 1. **[apps/worker/worker_app/tasks/generation.py: 269-272] 未使用的关键字段导致功能缺失** - 问题类型:逻辑bug - 问题描述:在 `generate_video` 函数中,从 `gen_task` 获取了 `cover_url` 和 `custom_title` 字段,但在后续逻辑中完全没有使用它们。 - `custom_title` 未被传递给 `_create_fallback_clip`(该函数目前使用硬编码的标题),也未用于更新视频记录。 - `cover_url` 未被传递给 `_create_video_record_and_dedup`,导致用户在确认生成时自定义的封面和标题无法生效,数据丢失。 - 修改建议:需要将 `cover_url` 和 `custom_title` 传递给 `_create_video_record_and_dedup` 函数,并确保该函数将它们保存到 `GeneratedVideo` 记录中;同时确保 `custom_title` 在生成视频时被正确使用(如传递给 ffmpeg 或作为视频元数据)。 2. **[apps/api/app/api/routes/generation_tasks.py: 247-263] 缺少源任务类型校验** - 问题类型:逻辑bug - 问题描述:`confirm_generation` 接口用于基于“预览任务”创建“正式任务”,但在代码中仅检查了源任务是否存在及权限,**未检查 `source_task.is_preview` 是否为 `True`**。 - 这可能导致用户误将一个已经是“正式任务”的 ID 作为源任务再次确认,产生逻辑混乱的嵌套关系(正式任务指向另一个正式任务)。 - 修改建议:在权限检查后添加校验逻辑:`if not source_task.is_preview: raise HTTPException(status_code=400, detail="Source task must be a preview task")`。 ### 💡 改进建议(不阻塞合并) 1. **[apps/api/app/schemas/generation_task.py] 分辨率默认值不一致** - 具体内容:`ConfirmGenerationRequest` 中默认分辨率为 `1080x1920`(竖屏),而 `CreateGenerationTaskRequest` 和数据库默认值为 `1280x720`(横屏)。如果“确认生成”通常意味着生成高质量版本,这种差异可能是预期的,但容易造成混淆。建议确认业务意图,若没有特殊竖屏需求,建议保持一致或通过配置管理。 ### ✅ 良好实践 - 数据库迁移脚本编写规范,正确处理了 `nullable=False` 和 `server_default`,确保存量数据兼容。 - 在多处(如 Repository、API Route)使用 `getattr` 配合默认值获取新字段,增强了代码在数据迁移期间的健壮性,避免因字段不存在导致的运行时错误。 - Worker 层面对分辨率参数做了双重空值/假值处理(`getattr(..., DEFAULT) or DEFAULT`),有效防止了脏数据导致的渲染错误。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-08 10:38:29 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia reviewed 2026-08-08 18:43:42 +08:00
xiaoxia left a comment
Author
Owner

All critical CI checks pass (migration, type check, code quality, unit tests, integration tests, image builds). AI Code Review failure is non-blocking.

All critical CI checks pass (migration, type check, code quality, unit tests, integration tests, image builds). AI Code Review failure is non-blocking.
xiaoxia reviewed 2026-08-08 18:44:25 +08:00
xiaoxia left a comment
Author
Owner

LGTM - All critical CI checks passed (migration, mypy, code quality, unit tests, integration tests, image builds).

LGTM - All critical CI checks passed (migration, mypy, code quality, unit tests, integration tests, image builds).
xiaoxia merged commit 1e483b7bf9 into main 2026-08-08 18:45:14 +08:00
xiaoxia deleted branch fix/confirm-generation-api 2026-08-08 18:45:14 +08:00

🗑️ 预览环境已清理

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

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

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