Wan-AI Family

Open Video Generation, Built for Production Use

Wan-AI is Alibaba Tongyi Lab's family of video generation models, and it became the open-weight reference for turning text into moving pictures. The line covers text-to-video, image-to-video, reference-driven generation, and video editing, with recent generations unifying what previously required separate models for each task. Clips run to seconds rather than frames, with audio generated alongside the picture in the newest releases and reference inputs spanning images, audio, video, and documents. On DEVUP AI they run through the video generation endpoint — one API key, one request, billed in Algerian Dinar.

Wan-AI logo
Overview & Architecture

Video generation asks a different question of a model than image generation does. A still needs to look right once; a clip needs to stay right across every frame — the same face, the same lighting, the same physics, from the first second to the last. Wan is the open-weight family that made that consistency workable rather than aspirational, and it is where most open video tooling now points.

The family's direction across generations has been consolidation. Earlier releases split the work across separate models: one for text-to-video, another for animating a still image, another for generating from reference material, another for editing existing footage. Recent generations fold those into single models, which removes the integration overhead of routing between four endpoints and keeps quality consistent across the paths.

Two capabilities define the current line. Clip length has extended from a few seconds to long enough to carry a narrative rather than a single beat. And audio is generated in the same pass as the picture in the newest releases, rather than added afterwards against a finished clip — which is what makes generated dialogue and ambient sound land in time with what is on screen.

Reference input is where the family separates itself. Beyond a text prompt, recent models accept images, audio, video clips, and — most unusually — structured documents and web pages as references. The practical consequence is that turning a product specification or a slide deck into a finished clip is one request rather than a storyboarding exercise.

On DEVUP AI, Wan models run through the video generation endpoint. Generation is synchronous, so a request holds the connection for several minutes and needs a generous timeout. Every response carries the cost of the request and your remaining balance, and the video arrives as a signed URL valid for five minutes or as inline bytes, whichever suits your pipeline.

Available Wan-AI Models

Deploy and access all published models in this family with unified DZD pricing and zero foreign card requirement.

ModelContextDZD in / 1M tokensDZD out / 1M tokensActions
Wan3.0-VideoWan-AI/Wan3.0-Videovideo Tokens70 DZD / secondView model
Wan2.2-T2V-A14BWan-AI/Wan2.2-T2V-A14Bvideo Tokens12.6 DZD / secondView model
Wan2.6-I2VWan-AI/Wan2.6-I2Vvideo Tokens52.5 DZD / secondView model
Wan2.6-Image-EditWan-AI/Wan2.6-Image-Editimage Tokens10.5 DZD / imageView model
Wan2.6-T2IWan-AI/Wan2.6-T2Iimage Tokens10.5 DZD / imageView model
Wan2.6-T2VWan-AI/Wan2.6-T2Vvideo Tokens52.5 DZD / secondView model
Wan2.7-Image-EditWan-AI/Wan2.7-Image-Editimage Tokens10.5 DZD / imageView model
Wan2.7-I2VWan-AI/Wan2.7-I2Vvideo Tokens52.5 DZD / secondView model
Wan2.7-R2VWan-AI/Wan2.7-R2Vvideo Tokens52.5 DZD / secondView model

Call any Wan-AI model

Every model on this page uses the same API key and standard OpenAI-compatible endpoint. The example below uses the featured model Wan-AI/Wan2.6-T2V.

import requests

DEVUP_API_KEY = "$DEVUP_API_KEY"
MODEL = "Wan-AI/Wan2.6-T2V"

response = requests.post(
    "https://api.devupai.com/v1/video/generations",
    headers={
        "Authorization": f"Bearer {DEVUP_API_KEY}",
        "Content-Type": "application/json",
    },
    json={
        "model": MODEL,
        "prompt": "A serene mountain lake at sunrise, with mist rising from the water and pine trees reflected on the surface.",
    },
)

result = response.json()
# result["data"][0]["url"] contains the signed URL to the generated video
video_url = result["data"][0]["url"]
video_response = requests.get(video_url)

with open("output.mp4", "wb") as f:
    f.write(video_response.content)
curl -X POST "https://api.devupai.com/v1/video/generations" \
  -H "Authorization: Bearer $DEVUP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Wan-AI/Wan2.6-T2V",
    "prompt": "A serene mountain lake at sunrise, with mist rising from the water and pine trees reflected on the surface."
  }'
import { writeFile } from "node:fs/promises";

const response = await fetch("https://api.devupai.com/v1/video/generations", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.DEVUP_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    model: "Wan-AI/Wan2.6-T2V",
    prompt: "A serene mountain lake at sunrise, with mist rising from the water and pine trees reflected on the surface.",
  }),
});

const result = await response.json();
const video = await fetch(result.data[0].url);
await writeFile("output.mp4", Buffer.from(await video.arrayBuffer()));

Frequently Asked Questions

Several minutes for a single request, and the connection stays open the whole time — generation is synchronous rather than queued. Set a generous client timeout before your first call, because a default HTTP timeout will abort work the server is still doing, and the generation is billed regardless. Design the user experience around a wait rather than hiding it: a queued job with a notification is more honest and more reliable than a spinner running for four minutes.

The response returns a signed URL in data[0].url, valid for five minutes. Download the file when the response arrives rather than storing the URL — after that window the proxy returns 403. If your pipeline cannot fetch within five minutes, request response_format: "b64_json" and the video comes back inline as Base64 instead. Only those two values are accepted; anything else returns a 400.

It falls back automatically. Requests for b64_json where the clip exceeds the 20 MB inline limit return a signed URL in data[].url instead, with a note field inside _devup explaining why. This is a delivery fallback rather than an error, and the request is billed normally — so write your handler to accept both response shapes. Longer clips at higher resolution will hit this regularly.

Describe motion, not just the scene — a still description produces a still-feeling clip. Name the camera movement explicitly: slow pan, aerial shot, close-up, static wide. Describe the light, since direction and quality do more for perceived realism than any other single instruction. And keep the prompt focused: an overly complex brief divides the model's attention and produces inconsistent results rather than executing everything well.

Yes. The family covers image-to-video alongside text-to-video, and recent generations handle both in a single model rather than requiring a separate one. Reference-driven generation and video editing are also part of the line. Which capabilities a specific model exposes varies, so check the individual model page before building around one.

In the newest generations, yes — audio is produced in the same pass as the picture rather than added afterwards, which is what keeps it in time with what is on screen. This is not available across every model in the family. Check the individual model page for what a specific model produces.

Video generation is not deterministic. The same prompt produces a different clip on each run, so iteration works by generating several and choosing rather than by refining one. Keep the file you want — regenerating from the prompt will not bring it back. Prototype at lower resolution where the model supports it, then produce the final clip once the composition and motion are right.