Building Wan 3.0: The Hard Parts of an AI Video Workspace The engineering team behind Wan 3.0, an AI video workspace, detailed the complex backend required to support text, image, frame, and reference-based video generation. They highlighted the use of explicit scene types, provider adapters, and a five-state task lifecycle to handle asynchronous generation, retries, and varying provider APIs. The team emphasized that early validation and normalized task records are crucial for reliability and auditability. A prompt box makes an AI product look simple. The user writes a sentence, clicks Generate , and waits for a video. The real system is less tidy. A request can outlive the browser tab, a provider can accept a job and fail later, and a retry can accidentally create a second billable task. Add multiple models, several input modes, and usage-based pricing, and the prompt box becomes the smallest part of the product. These are some of the engineering decisions behind Wan 3.0 https://wan3.io , the AI video workspace we have been building for text, image, frame, and reference-based generation. This is not a launch post disguised as a tutorial. It is a practical look at the parts that took more thought than the interface suggests. Text-to-video and image-to-video may end with the same file type, but they do not begin with the same contract. A text request needs a prompt, aspect ratio, resolution, and duration. An image-to-video request also needs an uploaded asset. A frame transition needs two ordered images, while reference-based generation may accept a clip or a set of visual references. Model support differs as well. We represent those paths as explicit scenes rather than stretching one loose payload across every model: type VideoScene = | 'text-to-video' | 'image-to-video' | 'frames-to-video' | 'reference-to-video' | 'video-edit' | 'video-extend' | 'video-upscale'; Each model declares the scenes and fields it supports. The UI can then adapt to the chosen workflow, and the server can reject combinations that do not make sense before contacting a provider. That early validation matters. An upstream API error is slower, harder to explain, and sometimes more expensive than a local validation error. Provider APIs disagree about nearly everything: parameter names, callback formats, status values, result shapes, and whether polling or webhooks are the preferred completion path. Letting those differences leak into the product would couple every form and task screen to a specific vendor. Instead, Wan 3.0 puts a small adapter around each provider: interface AIProvider { readonly name: string; readonly supportsWebhook: boolean; generate params: AIGenerateParams : Promise