Alibaba · Tongyi Lab
Wan 2.2
An open family of large-scale video generative models covering text-to-video, image-to-video and a compact hybrid text/image-to-video checkpoint. Weights are published on Hugging Face under Apache-2.0.
What changed in 2.2
Wan 2.2 revises the 2.1 architecture in three places. The claims below are the authors' own, taken from the model cards and technical report.
Mixture-of-experts denoiser
The denoising trajectory is split across specialised expert models rather than one monolithic network, which raises total parameter count without a matching rise in per-step inference cost.
Curated aesthetic supervision
Training data carries explicit labels for lighting, composition, contrast and colour tone, so cinematographic attributes can be steered from the prompt instead of emerging by chance.
Larger motion corpus
The authors report training on 65.6% more images and 83.2% more video than Wan 2.1, aimed primarily at motion fidelity and prompt adherence.
High-compression VAE
The TI2V-5B checkpoint pairs with a Wan2.2-VAE at a 16×16×4 compression ratio, which is what makes 720p/24fps generation practical at that model size.
Released checkpoints
All weights are on the Hugging Face Hub under the Wan-AI organisation.
Run it
If you would rather not provision GPUs, the same checkpoints are served as a hosted endpoint. Available variants: wan-2.2/t2v-480p, t2v-720p, i2v-480p and i2v-720p.
# 1. submit the job
curl -X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/wan-2.2/t2v-480p" \
-H "Authorization: Bearer $WAVESPEED_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A paper boat drifting down a rain-slicked gutter at dusk, shallow depth of field, warm street lights",
"duration": 5,
"enable_sync_mode": false
}'
# -> {"code": 200, "data": {"id": "<request-id>", "status": "created", ...}}
# 2. poll until status is "completed"
curl "https://api.wavespeed.ai/api/v3/predictions/<request-id>/result" \
-H "Authorization: Bearer $WAVESPEED_API_KEY"
# -> {"code": 200, "data": {"status": "completed", "outputs": ["https://..."]}}
import os, time, requests
API = "https://api.wavespeed.ai/api/v3"
KEY = os.environ["WAVESPEED_API_KEY"]
HEADERS = {"Authorization": f"Bearer {KEY}"}
# submit
res = requests.post(
f"{API}/wavespeed-ai/wan-2.2/t2v-480p",
headers={**HEADERS, "Content-Type": "application/json"},
json={
"prompt": "A paper boat drifting down a rain-slicked gutter at dusk, shallow depth of field, warm street lights",
"duration": 5,
"enable_sync_mode": false
},
timeout=30,
)
res.raise_for_status()
request_id = res.json()["data"]["id"]
# poll
while True:
data = requests.get(
f"{API}/predictions/{request_id}/result",
headers=HEADERS,
timeout=30,
).json()["data"]
if data["status"] == "completed":
print(data["outputs"][0])
break
if data["status"] == "failed":
raise RuntimeError(data.get("error", "generation failed"))
time.sleep(1.5)
const API = "https://api.wavespeed.ai/api/v3";
const KEY = process.env.WAVESPEED_API_KEY;
const headers = { Authorization: `Bearer ${KEY}` };
// submit
const submit = await fetch(`${API}/wavespeed-ai/wan-2.2/t2v-480p`, {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({
"prompt": "A paper boat drifting down a rain-slicked gutter at dusk, shallow depth of field, warm street lights",
"duration": 5,
"enable_sync_mode": false
}),
});
const { data: { id } } = await submit.json();
// poll
for (;;) {
const res = await fetch(`${API}/predictions/${id}/result`, { headers });
const { data } = await res.json();
if (data.status === "completed") {
console.log(data.outputs[0]);
break;
}
if (data.status === "failed") throw new Error(data.error ?? "generation failed");
await new Promise((r) => setTimeout(r, 1500));
}
Requests are asynchronous: POST returns a request id, then you poll /predictions/<id>/result until status is completed. Set enable_sync_mode: true to have the call block and return outputs directly.
API keys are created in the WaveSpeed dashboard.