修复序列帧去背景队列与幂等发布

序列帧去背景改用本地绿幕算法并在 durable 父任务内并行处理。

将去背景操作加入生成结果白名单,并按 operation_id 隔离帧对象路径。

去背景结果发布为新的序列资源、素材和画布图层,同时保留原始序列。

同步前端生成占位、相关测试及队列与资源契约文档。
This commit is contained in:
2026-08-15 11:59:50 +08:00
parent 05f0e2db06
commit 13afdd7a3b
11 changed files with 404 additions and 125 deletions
@@ -465,6 +465,7 @@ flowchart TD
- 对同一 job kind 解析 v2;
- 对部署前旧 payload 做兼容转换;
- phase 继续使用 `generating -> processing`;
- `editor_character_animation_background_removal` 与 AI 图片生成一样先入现有 durable queue;其单个父 job 内使用受控的 `buffer_unordered(frame_count.max(1))` 并行帧处理,完成后统一排序和原子发布,不拆成逐帧队列任务;
- 不需要新增逐帧进度列。画布上的 `15/30` 是播放帧数,不是 worker 进度。
### 8.5 计费
@@ -604,9 +605,11 @@ flowchart TD
AI 生成链默认逐帧去背景,视频直接转换固定保留源背景。`character-animation` 浮动工具栏继续提供 `去背景`,与 `改造 / 拆帧 / 下载` 并列;点击后必须走现有 durable 派生任务,不得把序列第一帧当普通图片处理。派生任务保持以下边界:
- 原始不透明序列与透明序列是两个正式 resource;
- 去背景全帧成功后一次性发布新序列;
- 去背景全帧成功后一次性发布新的 `character-animation` / `image-sequence` 资源、素材和画布图层,保留原始序列图层不被替换;
- 任一帧失败不产生残缺结果;
- 当前费用固定为 0 泥点,失败不产生不完整正式结果。
- 当前费用固定为 0 泥点,失败不产生不完整正式结果;请求先进入现有 `external_generation_job` 队列,不能由 HTTP 请求同步执行。
- 队列 worker 保持一个父 job,在 job 内按帧并行执行下载、纯本地绿幕扣除、最终 PNG 上传和帧对象准备;所有已发出的帧必须 drain 完成后再按帧号排序,一帧失败即清理未提交对象并整批失败,不新增逐帧子任务表或独立计费。
- 帧对象路径绑定本次 job 的 `operationId`,同一 job 重放复用路径,不同 job 即使请求 fingerprint 相同也不得复用旧 object location,避免新 `asset_object` 与历史结果发生幂等冲突。
#### 拆帧