使用 TypeScript 构建 AI 视频任务队列
AI 视频生成并非标准的 HTTP 请求。用户发送提示词(prompt)和设置,结果需要几分钟才能返回。
你的后端必须处理以下几个步骤:
- 验证输入。
- 创建任务记录。
- 将任务提交给供应商。
- 轮询结果。
- 处理失败。
- 向用户展示状态。
你应该使用队列和适配器层(adapter layer)。这可以防止特定供应商的代码破坏你的整个应用程序。
定义一个核心任务类型,作为你的产品契约。
type JobStatus = "queued" | "validating" | "running" | "delayed" | "succeeded" | "failed";
type VideoJob = {
id: string;
userId: string;
model: string;
prompt: string;
aspectRatio: "16:9" | "9:16" | "1:1";
durationSeconds: number;
status: JobStatus;
providerTaskId?: string;
outputUrl?: string;
errorCode?: VideoJobErrorCode;
};
为你的供应商使用接口(interface)。这能保持你的 worker 逻辑简洁。
interface VideoProvider {
submit(job: VideoJob): Promise<{ providerTaskId: string }>;
poll(providerTaskId: string): Promise<
| { status: "running" }
| { status: "succeeded"; outputUrl: string }
| { status: "failed"; error: unknown }
>;
normalizeError(error: unknown): VideoJobErrorCode;
}
请遵循以下工作流最佳实践:
先进行低成本检查。在调用昂贵的 API 之前,先验证提示词和时长。
使用轮询策略。实现一个带有递增延迟的循环。
处理延迟。如果任务耗时过长,将其移至“delayed”(延迟)状态。使用独立的 worker 在稍后检查延迟任务。
规范化错误。永远不要向用户展示供应商的原始错误。将技术错误映射为人类可读的消息。
用户消息示例:
- "queued":您的视频正在等待开始。
- "running":您的视频正在生成中。
- "delayed":这比平时耗时更长。
- "moderation_rejected":此请求无法处理。
将 AI 视频视为一个任务系统。稳定的队列和清晰的错误分类法(error taxonomy)会让你的产品更易于维护和扩展。
来源:https://dev.to/miao_cunhui_587ccddb6acc1/building-an-ai-video-job-queue-in-typescript-1349