การสร้างคิวงานวิดีโอ 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) เหล่านี้สำหรับเวิร์กโฟลว์ของคุณ:
ทำการตรวจสอบที่ใช้ทรัพยากรน้อยก่อน (Do cheap checks first) ตรวจสอบความถูกต้องของ prompt และระยะเวลา (duration) ก่อนที่จะเรียกใช้ API ที่มีค่าใช้จ่ายสูง
ใช้กลยุทธ์การตรวจสอบเป็นระยะ (Use a polling strategy) โดยการสร้าง loop ที่มีการเพิ่มระยะเวลาหน่วง (delay) ขึ้นเรื่อยๆ
จัดการกับความล่าช้า (Handle delays) หากงานใช้เวลานานเกินไป ให้เปลี่ยนสถานะเป็น "delayed" และใช้ worker แยกต่างหากเพื่อตรวจสอบงานที่ล่าช้าในภายหลัง
ปรับรูปแบบข้อผิดพลาดให้เป็นมาตรฐาน (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