การสร้างคิวงานวิดีโอ AI ด้วย TypeScript

การสร้างวิดีโอด้วย AI ไม่ใช่การส่งคำขอ HTTP แบบมาตรฐาน ผู้ใช้จะส่ง prompt และการตั้งค่าต่างๆ และต้องใช้เวลาหลายนาทีกว่าที่ผลลัพธ์จะส่งกลับมา

Backend ของคุณต้องจัดการขั้นตอนต่างๆ ดังนี้:

  • ตรวจสอบความถูกต้องของข้อมูลนำเข้า (Validate input)
  • สร้างบันทึกงาน (Create a job record)
  • ส่งงานไปยังผู้ให้บริการ (Submit the job to a provider)
  • ตรวจสอบผลลัพธ์เป็นระยะ (Poll for results)
  • จัดการเมื่อเกิดข้อผิดพลาด (Handle failures)
  • แสดงสถานะให้ผู้ใช้ทราบ (Show status to the user)

คุณควรใช้คิว (Queue) และเลเยอร์ตัวปรับแต่ง (Adapter layer) เพื่อป้องกันไม่ให้โค้ดที่เฉพาะเจาะจงสำหรับผู้ให้บริการรายใดรายหนึ่งส่งผลกระทบต่อแอปพลิเคชันทั้งหมดของคุณ

กำหนด core job type เพื่อใช้เป็นข้อตกลงหลัก (Product contract) ของผลิตภัณฑ์คุณ

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

ปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุด (Best practices) เหล่านี้สำหรับเวิร์กโฟลว์ของคุณ:

  1. ทำการตรวจสอบที่ใช้ทรัพยากรน้อยก่อน (Do cheap checks first) ตรวจสอบความถูกต้องของ prompt และระยะเวลา (duration) ก่อนที่จะเรียกใช้ API ที่มีค่าใช้จ่ายสูง

  2. ใช้กลยุทธ์การตรวจสอบเป็นระยะ (Use a polling strategy) โดยการสร้าง loop ที่มีการเพิ่มระยะเวลาหน่วง (delay) ขึ้นเรื่อยๆ

  3. จัดการกับความล่าช้า (Handle delays) หากงานใช้เวลานานเกินไป ให้เปลี่ยนสถานะเป็น "delayed" และใช้ worker แยกต่างหากเพื่อตรวจสอบงานที่ล่าช้าในภายหลัง

  4. ปรับรูปแบบข้อผิดพลาดให้เป็นมาตรฐาน (Normalize errors) อย่าแสดงข้อผิดพลาดดิบ (raw errors) จากผู้ให้บริการให้ผู้ใช้เห็นโดยตรง แต่ให้แปลงข้อผิดพลาดทางเทคนิคเป็นข้อความที่มนุษย์อ่านเข้าใจง่ายแทน

ตัวอย่างข้อความสำหรับผู้ใช้:

  • "queued": วิดีโอของคุณกำลังรอการเริ่มทำงาน
  • "running": วิดีโอของคุณกำลังถูกสร้างขึ้น
  • "delayed": ขั้นตอนนี้ใช้เวลานานกว่าปกติ
  • "moderation_rejected": ไม่สามารถดำเนินการตามคำขอนี้ได้

ให้มองว่าการสร้างวิดีโอด้วย AI คือระบบจัดการงาน (Job system) การมีคิวที่เสถียรและการจัดหมวดหมู่ข้อผิดพลาด (Error taxonomy) ที่ชัดเจน จะช่วยให้ผลิตภัณฑ์ของคุณดูแลรักษาและขยายระบบ (Scale) ได้ง่ายขึ้น

ที่มา: https://dev.to/miao_cunhui_587ccddb6acc1/building-an-ai-video-job-queue-in-typescript-1349