feat(#1197): Phase 1 预览生成接口 — 单版本预览(480p低清版) #1207
Reference in New Issue
Block a user
Delete Branch "feat/preview-generation-1197"
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?
变更说明
#1197 预览生成 Phase 1:实现单版本预览生成接口,复用现有 generation 链路,通过
is_preview字段区分。核心改动(10个文件,+946行)
packages/domain/generation_task.pyis_preview: bool = Falsepackages/adapters/sqlalchemy_impl/models.pyis_preview列 + 索引alembic/versions/053_generation_task_is_preview.pygeneration_task_repository.pypackages/application/generation_tasks.pyis_preview字段apps/api/app/schemas/generation_task.pyapps/api/app/api/routes/generation_preview.pyapps/api/app/api/router.pyapps/worker/worker_app/tasks/generation.pytests/unit/test_generation_preview.pyAPI 接口
/api/v1/generation/preview— 创建预览任务(201)/api/v1/generation/preview/{task_id}— 查询预览任务状态关键设计
is_preview标记区分,代码复用率 90%+测试
Phase 2 规划
/generation/preview/batch)/generation/preview/{task_id}/promote)032714adadto00ac2d0960🚀 预览环境已部署
83ef3297d4to366c7c4de8CI全绿,自动审批通过。
CI全绿,自动审批通过。
- 新增 _to_preview_response 辅助函数测试(7个用例) - 新增 POST /preview 路由测试(8个用例:成功/429/503/400/500/入队失败) - 新增 GET /preview/{task_id} 路由测试(5个用例:404/403/非预览/状态查询/结果查询) - 新增 Worker 预览分辨率强制逻辑测试(4个用例) - 总计 24 个新测试,累计 53 个测试全绿7a535e8168to2d1471446389457be9aftoabab3ebb3097465372a3to4bb01fa315faa3c485dato784dbd7bc3【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
[apps/worker/worker_app/tasks/generation.py: 1058-1070] 任务渲染配置污染风险
_render_video函数中,虽然代码试图通过dict()拷贝配置字典来避免污染源对象,但最后执行了virtual_plan.config = plan_cfg。如果virtual_plan对象(通常来自模板缓存)是在多个任务间共享的,或者该对象的生命周期长于单次渲染,此操作会直接修改共享对象的属性。这会导致后续使用同一模板的其他任务(如正式生成任务)意外继承预览任务的低分辨率(480p)或低码率配置,导致严重的数据/功能错误。virtual_plan对象。建议将处理后的plan_cfg传递给渲染适配器,或者在函数开始时对virtual_plan进行深拷贝(copy.deepcopy),确保修改完全隔离。[apps/api/app/schemas/generation_task.py: 138] Schema 字段与实际处理逻辑不一致
CreatePreviewGenerationTaskRequestSchema 中定义了duration字段,但在generation_preview.py的create_preview_generation_task接口实现中,该字段未被读取,也未传递给CreateGenerationTaskCommand(该 Command 也不支持 duration 参数)。这会导致前端传入的 duration 参数被静默忽略,如果业务意图是预览时长可配置,则功能缺失;如果意图是忽略,则 Schema 中不应存在该字段以免误导调用方。duration字段,要么在 Domain 层和 Application 层增加对duration的支持,确保参数能正确传递和生效。💡 改进建议(不阻塞合并)
_calc_preview_resolution函数中使用了ratio_map.get(video_ratio.strip(), PREVIEW_RESOLUTION),这是很好的写法。建议在函数开头增加对video_ratio为None的防御性检查,或者保持现状(因为None.strip()会报错,但在 Pydantic 模型验证中通常不会传入 None,除非字段是 Optional)。当前代码依赖 Pydantic 的类型校验,可以接受,但显式处理会更健壮。✅ 良好实践
create_preview_generation_task中,当任务入队失败时,通过_mark_task_failed将任务标记为失败,有效避免了产生僵尸 Pending 数据。get_preview_generation_task中增加了严格的用户归属校验,防止越权访问。🤖 由 AI 代码审查机器人自动生成 | 2026-08-01 09:06:31 | 模型:
🗑️ 预览环境已清理
PR #1207 已关闭或合并,对应的预览环境已被清理。