GPT-6 Sol & Claude Opus 5.5 sind daGPT-6 Sol zum halben Preis von 5.6 Sol

Wan 3.0 API: Text-to-Video und Image-to-Video mit Python

Ein Skript, zwei Clips: der Code, die echten Laufzeiten und Alibabas Preis pro Sekunde.

Kiki, OmniaKey COO8 Min. Lesezeit
Auf dieser Seite

Wan 3.0 läuft in Alibaba Cloud Model Studio als wan3.0-video und als schnelleres wan3.0-video-prime. Jeder Aufruf ist asynchron: Aufgabe anlegen, ID abfragen, MP4 herunterladen. Unser Python-Skript hat einen 5-Sekunden-Clip in 720P aus Text in 2 min 42 s erzeugt und einen aus einem Standbild in 3 min 20 s, beide mit Ton.

  1. Den Key in OMNIAKEY_API_KEY eintragen.
  2. POST https://api.omniakey.com/v1/media/tasks mit Modell, Operation, Prompt, Parametern und einem neuen Idempotency-Key.
  3. GET /v1/media/tasks/{id} abfragen, bis der Status succeeded lautet, dann sofort assets[0].url herunterladen.

Gibt es eine offizielle Wan 3.0 API, und welches Modell nehme ich?

Ja. Alibaba Cloud Model Studio ist die offizielle API, mit wan3.0-video und wan3.0-video-prime (Referenz aktualisiert am 15. Oktober 2026). Der Create-Aufruf braucht den Header X-DashScope-Async: enable, und Alibabas Python-Weg ist das DashScope SDK 2.0.1 oder neuer.

Alibaba Model StudioOmniaKey
Beide Modell-IDsJaJa
Async-Header nötigJaNein
Videolink gilt24 StundenEtwa 1 Stunde, erneuerbar
AbrechnungPro SekundePro Sekunde
PythonDashScope SDKStandardbibliothek

Beide IDs nehmen denselben Request-Body, und das Modell wählt den Modus über die Medien, die du mitschickst. Das Skript unten nutzt wan3.0-video, die Zeile MODEL schaltet um. Wan 3.0 Prime haben wir nicht ausgeführt; laut OmniaKey-Doku bietet es dieselben Fähigkeiten bei etwa halber Laufzeit (geprüft am 31. Oktober 2026).

Was brauchst du vor dem ersten Aufruf?

Drei Dinge, und das erste ist der Key:

  1. Einen OmniaKey-API-Key, in der Shell exportiert:

    bash
    export OMNIAKEY_API_KEY="your-key"
    
  2. Python 3. Das Skript nutzt nur die Standardbibliothek, python3 führt es direkt aus.

  3. Für Image to Video ein erstes Bild: ein JPEG mit etwa 1024 px Breite oder eine öffentliche HTTPS-URL. Das Skript lehnt eine Datei über 700.000 Byte ab, weil Base64 ein Drittel dazulegt und der Body bei 1 MiB endet (Doku, geprüft am 31. Oktober 2026).

Welche Parameter zählen?

Sieben Felder machen den größten Teil der Arbeit, und jedes ist ein Wert in parameters.

ParameterWas er tutStandard
DauerLänge des Clips, Sekunden5
AuflösungStufe der Bildgröße1080P
VerhältnisForm des Bildesadaptive
AudioTonspuran
SeedHinweis für Wiederholbarkeit-1
Prompt erweiternSchreibt den Prompt uman
WasserzeichenSetzt eine Eckmarkeaus

Das Skript setzt Dauer, Auflösung und Verhältnis. Es fragt 720P an, während Alibabas Standard 1080P ist, was zu Listenpreisen pro Sekunde doppelt so viel kostet.

Wie sieht der Python-Code aus?

Das Skript unten lief am 31. Oktober 2026 unverändert: nur Standardbibliothek, beide Modi, eine Zeile MODEL zum Umschalten.

python
import base64
import json
import os
import time
import urllib.error
import urllib.request
import uuid

API = "https://api.omniakey.com/v1/media/tasks"
KEY = os.environ["OMNIAKEY_API_KEY"]
MODEL = "wan3.0-video"

def request(method, url, body=None, extra_headers=None):
    headers = {"Authorization": f"Bearer {KEY}", "User-Agent": "omniakey-example/1"}
    data = None
    if body is not None:
        headers["Content-Type"] = "application/json"
        data = json.dumps(body).encode()
    headers.update(extra_headers or {})
    req = urllib.request.Request(url, data=data, headers=headers, method=method)
    with urllib.request.urlopen(req, timeout=120) as resp:
        return json.load(resp)

def poll(url, attempts=5):
    for attempt in range(attempts):
        try:
            return request("GET", url)
        except urllib.error.HTTPError as err:
            if err.code < 500 or attempt == attempts - 1:
                raise
        except urllib.error.URLError:
            if attempt == attempts - 1:
                raise
        time.sleep(5 * (attempt + 1))

def run_task(body, out_path):
    task = request("POST", API, body, {"Idempotency-Key": str(uuid.uuid4())})["id"]
    print("task", task, flush=True)
    for _ in range(180):  # 5-second polls, up to 15 minutes
        time.sleep(5)
        state = poll(f"{API}/{task}")
        if state["status"] not in ("queued", "processing"):
            break
    else:
        raise TimeoutError(f"{task} is still {state['status']}: poll it again later, do not resubmit")
    if state["status"] != "succeeded":
        raise RuntimeError(state.get("error") or state["status"])
    asset_url = state["assets"][0]["url"]  # signed link: short-lived, so download now
    req = urllib.request.Request(asset_url, headers={"User-Agent": "omniakey-example/1"})
    with urllib.request.urlopen(req, timeout=300) as resp, open(out_path, "wb") as f:
        f.write(resp.read())
    return task

def text_to_video(prompt, out_path, duration=5, resolution="720P", ratio="16:9"):
    body = {
        "model": MODEL,
        "type": "video",
        "operation": "text_to_video",
        "input": {"prompt": prompt},
        "parameters": {"duration": duration, "resolution": resolution, "ratio": ratio},
    }
    return run_task(body, out_path)

def image_to_video(prompt, image_path, out_path, duration=5, resolution="720P"):
    with open(image_path, "rb") as f:
        raw = f.read()
    if len(raw) > 700_000:  # base64 adds a third, and the whole body must stay under 1 MiB
        raise ValueError("first frame too large: save it as a JPEG about 1024 px wide")
    frame = "data:image/jpeg;base64," + base64.b64encode(raw).decode()
    body = {
        "model": MODEL,
        "type": "video",
        "operation": "image_to_video",
        "input": {"prompt": prompt, "media": [{"type": "first_frame", "url": frame}]},
        "parameters": {"duration": duration, "resolution": resolution, "ratio": "adaptive"},
    }
    return run_task(body, out_path)

if __name__ == "__main__":
    print("done", text_to_video(
        "A blacksmith hammers a glowing horseshoe on an anvil in a dark forge. Sparks fly at each "
        "strike and light his leather apron. The camera slowly pushes in. Sound of the hammer ringing "
        "on steel and the fire crackling. No dialogue, no music, no text.",
        "forge.mp4",
    ))
    print("done", image_to_video(
        "Image 1 is the first frame. The paper boat drifts slowly to the right across the puddle. "
        "Light rain makes small ripples and the cafe lights shimmer in the water. The camera stays "
        "low and still. Sound of light rain. No dialogue, no music, no text.",
        "boat.jpg",
        "boat-drifts.mp4",
    ))

Was die einzelnen Teile machen:

  • run_task erzeugt für jede Aufgabe einen neuen Idempotency-Key. Wird derselbe Key mit demselben Body erneut geschickt, kommt die ursprüngliche Aufgabe zurück, und es wird nie doppelt abgerechnet (Doku, geprüft am 31. Oktober 2026).
  • Es fragt alle 5 Sekunden ab, bis zu 15 Minuten lang, und wirft danach TimeoutError.
  • Ein Timeout heißt: dieselbe ID später erneut abfragen. Ein erneutes Absenden erzeugt einen neuen Key, eine zweite Aufgabe und eine zweite Rechnung.
  • Es lädt die erste Asset-URL sofort herunter, weil der signierte Link kurzlebig ist.
  • image_to_video lehnt ein Bild über 700.000 Byte ab: Base64 legt ein Drittel drauf, und der Body endet bei 1 MiB.
  • Der Bild-Aufruf setzt das Verhältnis auf adaptive, damit der Clip die Form des Standbilds übernimmt.

Was es ausgegeben hat:

text
task task_<id>
done task_<id>
task task_<id>
done task_<id>

Was haben die beiden Aufrufe erzeugt?

Beide Dateien kamen als 5,04-Sekunden-MP4 zurück, 150 Frames bei 30 fps, H.264, mit einer AAC-Stereo-Tonspur bei 44,1 kHz.

Text to Video: die Schmiede

Vier Frames aus dem Schmiede-Clip von Wan 3.0
Text to Video, 5 s in 720P: Frames bei 0,3, 2,2, 3,5 und 4,7 Sekunden.

Der Clip folgt dem Prompt: Ein Schmied in dunklem Hemd und Lederschürze hämmert auf ein glühend oranges Hufeisen, bei 2,2 Sekunden sprühen Funken, und die Kamera fährt etwas näher heran. Der Fehler ist ein eingestempeltes Meisterzeichen aus unlesbaren Buchstaben auf dem Amboss, obwohl der Prompt keinen Text verlangte. Vom Start bis zur Datei vergingen 2 min 42 s; das MP4 ist 1280×720 groß und 6,6 MB.

Image to Video: das Papierboot

Das Standbild des ersten Frames und drei Frames aus dem Papierboot-Clip von Wan 3.0
Image to Video: das gesendete Standbild (oben links), dann der Clip bei 1,6, 3,5 und 4,7 Sekunden.

Der erste Frame war ein Standbild aus Nano Banana 2.1, ein rotes Papierboot auf einer Regenpfütze, auf ein JPEG mit 1024×571 und 158 KB verkleinert und inline als Data-URL geschickt. Der Clip behält das Dämmerlicht und das nasse Kopfsteinpflaster, lässt das Boot wie gewünscht von links nach rechts treiben, zeigt bei 1,6 Sekunden Wellenringe und hält die Kamera tief und ruhig. Zurück kam er als 1284×716, weil adaptive der Form des Standbilds folgte, in 3 min 20 s bei 7,4 MB.

Ist der Ton an, und greift "no music"?

Der Ton ist standardmäßig an. Gemini 3.8 Flash beschrieb die Tonspur der Schmiede als metallisches Klirren ohne Sprache und ohne Musik und die des Papierboots als melancholische, ruhige Klaviermelodie, obwohl dieser Prompt mit "no music" endete. Alibabas Prompt-Guide (aktualisiert am 16. Oktober 2026) empfiehlt "No BGM" oder "No background music", und unser Prompt nutzte keins von beiden.

Mit "audio": false trägt die Datei nur eine Videospur: Unser 2-Sekunden-Job in 480P mit der Laterne hatte keine Tonspur, und Alibaba rechnet in beiden Fällen gleich ab.

ClipZeitGrößeTon
Schmiede (Text)2 min 42 s1280×720Klirren, keine Musik
Papierboot (Bild)3 min 20 s1284×716Klavier trotz "no music"
Laterne, Audio aus4 min 36 s854×480Keine Tonspur

Die Wartezeit schwankt: Der 2-Sekunden-Job ohne Audio brauchte 4 min 36 s, länger als beide 5-Sekunden-Clips in 720P. Für die Formulierung von Prompts hat der Wan 3.0 Prompt-Guide den Aufbau und Beispiel-Prompts.

GET /v1/media/tasks/{id} abfragen, bis der Status succeeded, failed oder canceled lautet; während der Job läuft, steht dort queued oder processing. Eine fertige Aufgabe liefert eine signierte Asset-URL, die etwa eine Stunde gilt (OmniaKey-Doku, geprüft am 31. Oktober 2026). Lade sie sofort herunter und frage die Aufgabe später erneut ab, wenn die alte URL abläuft, denn der Eintrag bleibt 24 Stunden bestehen.

Die Datei ist ein MP4 mit H.264-Video bei 30 fps, und Alibabas eigene Video-URL gilt 24 Stunden. Der Abbruch eines Wan-3.0-Jobs stoppt das Rendern nicht, und ein Job, der nach dem Abbruch erfolgreich endet, wird trotzdem abgerechnet; prüfe Dauer und Auflösung, bevor du absendest.

Welche Fehler wirst du sehen?

Die meisten davon kommen zurück, bevor eine Aufgabe existiert, und jeder hat eine Lösung im Request oder im Key.

  • 400 model_price_error — Dauer außerhalb von 2 bis 30 Sekunden. Unser Test mit "duration": 1 scheiterte in 0,9 s mit "media duration must be between 2 and 30 seconds"; es wurde keine Aufgabe angelegt und nichts abgerechnet.
  • 400 missing_idempotency_key — kein Idempotency-Key-Header. Füge einen hinzu, bis 255 Zeichen.
  • 409 idempotency_key_reused — gleicher Key, anderer Body. Erzeuge für jeden Prompt einen neuen Key.
  • 403 model_not_allowed — der Key darf dieses Modell nicht aufrufen. Prüfe den Wert model, dann die Einstellungen des Keys.
  • 403 mit einer Meldung zu Guthaben oder Ausgabenlimit — wenig Guthaben oder ein Limit pro Key. Aufladen oder Limit anheben.
  • 404 task_not_found — falsche ID oder eine Aufgabe, die über 24 Stunden alt ist. Frage die ID ab, die der Create-Aufruf zurückgegeben hat.
  • 409 task_state_conflict — der Job ist schon fertig, etwa wenn ein Abbruch nach dem Erfolg eintrifft. Lies zuerst den Status.
  • 429 — zu viele Anfragen. OmniaKey veröffentlicht keine festen Rate-Limits, also warte mit exponentieller Verzögerung und Jitter.
  • 503 no_available_channel — kein Kanal für diese Operation, etwa Video to Video. Nutze Text to Video oder Image to Video.
  • TimeoutError — läuft nach 15 Minuten noch. Frage dieselbe ID später ab; ein erneutes Absenden erzeugt eine zweite Aufgabe und eine zweite Rechnung.

Was kostet ein Wan-3.0-Clip?

Alibaba rechnet pro Sekunde Video ab, und eine fehlgeschlagene Anfrage wird nicht berechnet (Preisseite aktualisiert am 29. Oktober 2026). Die Tabelle zeigt Alibabas Listenpreise pro Sekunde für Singapur, geprüft am 31. Oktober 2026, aus Alibabas Preisseite für Model Studio.

Modell480P720P1080P
Wan 3.0$0.05$0.1$0.2
Wan 3.0 Prime$0.068$0.14$0.28

Ein 5-Sekunden-Clip in 720P kostet bei Alibaba $0.50 mit Wan 3.0 (5 × $0.1) und $0.70 mit Prime (5 × $0.14). Die drei Wan-3.0-Preise tragen die Kennzeichnung "Limited-time 30% off", und die Seite sagt nicht, ob die Zahlen sie enthalten. Ton an oder aus kostet gleich viel.

Alibabas kostenloses Kontingent sind 30 Sekunden Video, Eingabe plus Ausgabe, bei wan3.0-video in Singapur; Prime hat keins. Bei Alibaba in China (Peking) stehen niedrigere Dollar-Sätze für das Standardmodell: $0.041256, $0.082513 und $0.165025 pro Sekunde bei 480P, 720P und 1080P.

OmniaKey rechnet ebenfalls pro Sekunde ab, die aktuellen Sätze stehen auf den Modellseiten Wan 3.0 und Wan 3.0 Prime.

Häufige Fragen

Wie lange dauert ein Aufruf?

Laut Alibaba dauert ein Job typischerweise 1 bis 5 Minuten, und die Referenz empfiehlt, alle 15 Sekunden abzufragen (geprüft am 31. Oktober 2026). Unsere drei Jobs brauchten 2 min 42 s, 3 min 20 s und 4 min 36 s.

Wie schalte ich den Ton aus?

Setze "audio": false in parameters, dann kommt das MP4 nur mit Videospur an, wie bei unserem Laternen-Job. Der Preis bleibt gleich.

wan3.0-video oder wan3.0-video-prime?

Nimm wan3.0-video für Alibabas niedrigeren Listenpreis und das kostenlose Kontingent von 30 Sekunden in Singapur, und Prime, wenn die Laufzeit wichtiger ist. OmniaKey beschreibt Prime als dieselben Fähigkeiten bei etwa der halben Zeit.

Etwa eine Stunde bei OmniaKey, und eine erneute Abfrage der Aufgabe liefert einen frischen Link, solange der Eintrag 24 Stunden besteht. Alibabas eigene Video-URL gilt 24 Stunden.

Geprüfte Quellen

Modelle in diesem Artikel

Wan 3.0video APIPythontext-to-videoimage-to-video

Verwandte Artikel

Neueste Beiträge