Building with AI

把 AI 视频生成从一次请求,改成可追踪的任务

长耗时模型调用需要独立的任务生命周期:受理、排队、提交、轮询、终态、积分与素材清理。

  • AI
  • 异步任务
  • 状态机

视频生成可能耗时很久。如果一次前端请求要等到成片,用户切页、网络中断和请求超时都会让结果变得难以解释。先延长超时能缓解现象,但不能替代任务模型。

个人 AI 平台在迭代中将视频生成改成了持久化任务,并增加任务中心。我需要先确定任务、外部服务商和积分之间怎样关联,再推进前后端实现。

先定义用户看到的生命周期

提交成功应该表示“系统已受理”,不意味着视频已经生成。排队、提交中、服务商处理中、成功和失败,要有明确区别。

任务保留用户、模型、请求标识、参数、外部任务 ID、结果和错误信息。页面通过任务查询恢复进度,后端执行不再依赖某个页面一直等待。

提交和轮询是两种工作

提交阶段会产生新的外部动作,轮询只查询已有任务。项目将它们放在不同并发槽位中,并分别设置租约。

领取任务需要在数据库中确认状态和租约标识,写回时也要匹配当前身份。租约过期后,轮询可以重新被领取;任务完成后进入终态,不能被晚返回的处理逻辑随意覆盖。

调度器还区分文生视频与图生视频的并发,并对轮询加入逐步延长的间隔和抖动。这样并发限制能对应到真实资源,而不只是浏览器按钮是否禁用。

积分与素材跟着任务走

任务调用会关联交易,成功记录结果,失败按规则退款。相同任务的终结流程需要先检查状态,避免重复处理。

参考素材也有生命周期。浏览器里的本地引用不能直接供后台工作线程使用,需要在提交时转换成后端可用的暂存资产,并在终态或保留期结束后清理。

这要求前端、任务表、服务商客户端、积分服务和素材服务都遵守同一套契约。

本地任务表不能解决所有重复窗口

服务商已经受理,但本地还没保存外部任务 ID 时,进程仍可能退出。此时不能仅凭“本地没有 ID”就断定外部没有执行。

要缩小这段不确定性,需要服务商的幂等键、请求查询或人工核对能力。持久化任务提升了追踪和恢复能力,但不等于端到端恰好执行一次。

我更愿意把这类限制写清楚,避免把局部状态控制夸大成系统保证。

怎样验证这次改造

检查创建任务是否立即返回;关闭页面后后端是否继续处理;多次查询是否得到同一任务;租约失效是否能被接手;终态回写是否重复结算;素材是否按约定清理。

这些场景帮助我判断生成代码是否兑现了最初的产品目标,而不是只看任务表和接口是否都存在。

异步任务与任务中心分别对应 2026-07-23 的提交 5782aca21、fabc0cb8a;后续继续补充任务数量刷新与模型契约。