Создание очереди задач для ИИ-видео на TypeScript

Генерация ИИ-видео — это не стандартный HTTP-запрос. Пользователь отправляет промпт и настройки, а получение результата может занять несколько минут.

Ваш бэкенд должен выполнять несколько этапов:

  • Валидация входных данных.
  • Создание записи о задаче.
  • Отправка задачи провайдеру.
  • Опрос (polling) для получения результатов.
  • Обработка ошибок.
  • Отображение статуса пользователю.

Вам следует использовать очередь и слой адаптеров. Это предотвратит поломку всего приложения из-за специфического кода конкретного провайдера.

Определите основной тип задачи, который будет служить контрактом вашего продукта.

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 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. Используйте стратегию опроса (polling). Реализуйте цикл с увеличивающимися задержками.

  3. Обрабатывайте задержки. Если задача выполняется слишком долго, переведите её в статус "delayed". Используйте отдельный воркер для последующей проверки задержанных задач.

  4. Нормализуйте ошибки. Никогда не показывайте пользователям «сырые» ошибки провайдера. Преобразуйте технические ошибки в понятные человеку сообщения.

Примеры сообщений для пользователя:

  • "queued": Ваше видео ожидает начала генерации.
  • "running": Ваше видео генерируется.
  • "delayed": Это занимает больше времени, чем обычно.
  • "moderation_rejected": Этот запрос не может быть обработан.

Относитесь к генерации ИИ-видео как к системе задач. Стабильная очередь и четкая таксономия ошибок сделают ваш продукт более простым в обслуживании и масштабировании.

Источник: https://dev.to/miao_cunhui_587ccddb6acc1/building-an-ai-video-job-queue-in-typescript-1349