使用 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;
}

请遵循以下工作流最佳实践:

  1. 先进行低成本检查。在调用昂贵的 API 之前,先验证提示词和时长。

  2. 使用轮询策略。实现一个带有递增延迟的循环。

  3. 处理延迟。如果任务耗时过长,将其移至“delayed”(延迟)状态。使用独立的 worker 在稍后检查延迟任务。

  4. 规范化错误。永远不要向用户展示供应商的原始错误。将技术错误映射为人类可读的消息。

用户消息示例:

  • "queued":您的视频正在等待开始。
  • "running":您的视频正在生成中。
  • "delayed":这比平时耗时更长。
  • "moderation_rejected":此请求无法处理。

将 AI 视频视为一个任务系统。稳定的队列和清晰的错误分类法(error taxonomy)会让你的产品更易于维护和扩展。

来源:https://dev.to/miao_cunhui_587ccddb6acc1/building-an-ai-video-job-queue-in-typescript-1349