Ihr erster POST kam in zehn Sekunden mit einer task_id zurück. Sah nach einem Erfolg aus.
Dann passierte sechs Minuten lang nichts. Sie hatten while status != "Success" aus einem Tutorial kopiert, und die Schleife drehte sich einfach weiter, weil dieser Endpunkt das Wort Success nicht mehr zurückgibt. Also sind Sie auf einen Webhook umgestiegen. Kein einziger Push kam an, und nirgendwo wurde Ihnen gesagt, warum. Am nächsten Morgen gingen Sie zurück zu Ihrem gestrigen Render – der Link 404.
Diese vier Dinge sehen unabhängig aus. Keines davon ist die Schuld des Modells. Alle vier sind der Async-Vertrag, den fast niemand aufschreibt. Hier ist der gesamte Vertrag, plus ein echter Kurzfilm aus zwei Einstellungen, der am anderen Ende herauskam.
Die wichtigsten Erkenntnisse
- Drei Endpunkte, eine Schleife: Create gibt eine
task_idzurück und legt auf, Sie pollten, Sie laden herunter. Der ganze harte Teil kommt nach dem Create-Aufruf. - Die fünf echten Status sind
queued,running,succeeded,failed,cancelled. Es gibt keinen Statusexpired, egal was ein Blogbeitrag Ihnen erzählt hat. - Zwei Dinge laufen ab, und keines davon ist ein Status: Die Download-URL ist zeitlich begrenzt, und der Task-Datensatz selbst ist nur 7 Tage lang abfragbar.
- Wenn Sie einen Callback verwenden, sendet MiniMax zuerst eine Verifikationsanfrage mit einem
challenge-Feld, und Sie müssen es innerhalb von 3 Sekunden unverändert zurücksenden. Scheitert das, erhalten Sie keinen Fehler, sondern nur Stille für immer. - Bei reinem Text-to-Video ist
ratioerforderlich und kann nichtadaptivesein. Bei Image-to-Video bestimmt das erste Bild die Bildseite, und jedesratio, das Sie übergeben, wird ignoriert.
Das fertige Ergebnis zuerst
Der ganze Lohn dieses Tutorials: zwei MiniMax H3 Einstellungen in 2K, aneinandergereiht, 14,6 Sekunden. Einstellung A ist Image-to-Video von einem generierten ersten Bild, Einstellung B ist Text-to-Video. Schalten Sie den Ton ein. Der Audio ist kein Soundtrack, der darübergelegt wurde – H3 hat die Zahnräder, den Regen und die geflüsterte Zeile als Teil derselben Generierung gerendert.
Drei API-Aufrufe haben das ermöglicht. Ein Bildmodell für das erste Bild, zwei H3-Endpunkte für die Einstellungen, eine ffmpeg-Zeile, um sie zu verbinden. Der Code unten ist der Code, der es gemacht hat.
Warum die meisten MiniMax H3 Tutorials beim zweiten Request scheitern
Fast jede Anleitung für dieses Modell hört beim Create-Aufruf auf. Das ist die einfache Hälfte. Der Create-Aufruf validiert Ihre Payload, gibt Ihnen eine task_id und trennt die Verbindung – und dann sind Sie allein mit einem Job, der Minuten dauert und einem Satz Regeln, die niemand gedruckt hat.
Die Fehler sind langweilig wiederholbar. Ich bin an einem Nachmittag auf fünf dieser sechs gestoßen.
| Symptom | Was Sie sehen | Tatsächliche Ursache | Lösung |
|---|---|---|---|
| Poll-Schleife endet nie | Terminal druckt ewig, Job ist längst fertig | Ihre Abbruchbedingung vergleicht mit v1-Wörtern wie Success / Fail. Der v2-Query-Endpunkt gibt lowercase succeeded / failed zurück | Auf das v2-Enum matchen und bei jedem unbekannten Status einen Fehler werfen |
| Sofortiger 400 bei Text-to-Video | Request wird abgelehnt, bevor ein Render beginnt | ratio fehlt oder ist auf adaptive gesetzt, was der Text-only-Modus ablehnt | Ein explizites ratio wie 16:9 übergeben |
Ihr ratio wird still ignoriert | Ausgabe-Frame ist nicht das, was Sie wollten | Image-to-Video leitet die Bildseite vom ersten Frame ab, ratio ist dort wirkungslos | Ersten Frame auf die gewünschte Bildseite zuschneiden oder generieren |
| Webhook feuert nie, kein Fehler | Null Pushs, saubere Logs, keine Beschwerde von der API | Der Verifikations-Handshake ist fehlgeschlagen. MiniMax hat eine challenge gesendet und Ihr Endpunkt hat sie nicht innerhalb von 3 Sekunden unverändert zurückgesendet | Die challenge synchron beantworten, vor jeder Auth- oder Queue-Middleware |
| Die URL von gestern 404t | Download-Link tot, Render scheint weg | Die Download-URL ist zeitlich begrenzt. Der Render ist in Ordnung | Dieselbe task_id erneut abfragen, um eine frische URL zu erhalten (innerhalb des 7-Tage-Fensters) |
| Zufällige 429 unter Last | Manche Submits werden abgelehnt, keine Warteschlange | Das Concurrency-Limit ist ein hartes Limit, keine Warteschlange | Eigene In-Flight-Zahl begrenzen und den Submit wiederholen, nicht den Render |
Die erste Zeile ist die, die ganze Abende frisst, und es lohnt sich, präzise zu sein. MiniMaxs ältere Video-API meldete Fortschritt mit großgeschriebenen Wörtern aus der Familie Preparing / Queueing / Processing / Success / Fail. Der v2-Query-Endpunkt von H3 gibt queued, running, succeeded, failed, cancelled zurück (MiniMax API Reference, August 2026). Viele Dokumentationen von Drittanbietern drucken noch immer den alten Satz oder mischen beide in einer Seite. Wenn Sie eine Schleife aus einer solchen geerbt haben, kann sie nicht terminieren, weil der String, auf den sie wartet, nie gesendet wird.
MiniMax H3 Tutorial Workflow: Drei Endpunkte, fünf Status, eine Schleife
H3 wurde am 2026-07-31 als omni-modales Video-Modell ausgeliefert: Text, Bild, Video und Audio leben alle im selben Kontextfenster, Ausgabe bis zu 15 Sekunden in 2K mit nativem Stereo-Audio (MarkTechPost, August 2026). Für die API bedeutet das einen Create-Endpunkt mit einem content-Array, und was Sie in das Array stecken, bestimmt, in welchem Modus Sie sind.
| Modus | Was in content kommt | Rolle des Bild-Elements | Was ratio tut | Verwenden für |
|---|---|---|---|---|
| Text-to-video | ein Text-Item | keine | Erforderlich, adaptive wird abgelehnt | Einstellungen ohne Quellbild, volle Kontrolle der Bildseite |
| Image-to-video | Text-Item plus Bild-Item | first_frame (optional auch last_frame) | Ignoriert, das erste Bild entscheidet | Ein Standbild animieren, das Sie bereits gestaltet haben |
| Reference-to-video | Text-Item plus Referenz-Item | reference_image (auch reference_video, reference_audio) | Erforderlich, wie bei Text-only | Eine Figur oder eine Stimme über Einstellungen hinweg beibehalten |
Und der Teil, den Ihr Code tatsächlich handhaben muss. Fünf Status, fünf verschiedene Verzweigungen.
| Status | Was es bedeutet | Was Ihr Code tut |
|---|---|---|
| queued | Akzeptiert, wartet auf einen Slot | Weiter pollten, zurückhalten |
| running | Rendering | Weiter pollten, zurückhalten |
| succeeded | Fertig, content.url ist befüllt | Sofort herunterladen, in dieser Iteration |
| failed | Render fehlgeschlagen | Fehlerbody lesen, loggen, nicht blind die gleiche Payload wiederholen |
| cancelled | Job wurde abgebrochen | Schleife verlassen, als terminal behandeln |
| alles andere | Nicht im Enum | Fehler werfen. Ein neuer Status, den Sie stillschweigend als "weiter warten" behandeln, ist der Bug aus der Tabelle oben |
Es gibt keinen Status expired. Dieses Wort wird dieser API oft zugeordnet, gehört aber zu zwei anderen Dingen: der Download-URL, die zeitlich begrenzt und aktualisierbar ist, und dem Task-Datensatz, der nur für die letzten 7 Tage abfragbar ist. Beides wird in Schritt 4 behandelt.
Noch eine Zahl vor dem Code. Das Concurrency-Limit für die Videogenerierung auf H3 ist verbindungsbasiert, nicht requests pro Minute: 2 gleichzeitige Tasks im Free-Tier, 15 im Paid-Tier (MiniMax Rate Limits, August 2026). Über dem Limit erhalten Sie sofort einen 429. Nichts wird in Ihrem Namen in die Warteschlange gestellt. Ich habe auch 20 gleichzeitige H3-Jobs durch ein Routing-Gateway geschickt und hatte alle 20 erfolgreich, und ich hatte an einem anderen Tag einen 429 auf dem gleichen Setup – behandeln Sie jede Zahl über dem dokumentierten Limit als Wetter, nicht als Konstante.
Direkt oder über ein Gateway
Die drei Schritte sind egal, aber die Strings unterscheiden sich, und das ist wichtig, wenn Sie um 1 Uhr morgens debuggen.
| MiniMax direkt | Unified Gateway (Atlas Cloud) | |
|---|---|---|
| Einreichen | POST /v2/video_generation | POST /api/v1/model/generateVideo |
| Pollen | GET /v2/query/video_generation/{task_id} | GET /api/v1/model/prediction/{id} |
| Statuswörter | queued / running / succeeded / failed / cancelled | completed bei Erfolg, failed bei Fehler |
| Push-Benachrichtigungen | Callback-URL mit 3-Sekunden-Challenge-Handshake | Auf die prediction id pollten |
| Concurrency | 2 free, 15 paid, harter 429 | Nicht als Pro-Modell-Limit veröffentlicht, in der Praxis breiter gemessen |
| Erstes-Bild-Modell mit demselben Key | Nein, separates Konto | Ja, GPT Image 2 und H3 liegen hinter einem Key |
| H3-Preis | Veröffentlicht pro Auflösungsstufe | Pro Sekunde Ausgabe, gestaffelt nach Auflösung, vor dem Absenden auf dem Run-Button zitiert |
Der Grund, warum ich die Kette dieses Tutorials über ein Gateway laufen ließ, ist rein die vorletzte Zeile: Das erste Bild kommt von einem OpenAI-Bildmodell und die beiden Einstellungen von MiniMax, und ich wollte für einen 14-Sekunden-Film nicht zwei Anbieter, zwei Keys und zwei Abrechnungsseiten. Wenn Sie bereits auf der MiniMax-Plattform sind, bleiben Sie dort – die Schleife unten funktioniert unverändert, abgesehen von den Pfaden und den Statuswörtern.
Hailuo AI Video Generator: So verwenden Sie ihn, bevor Sie Code schreiben
Wenn Sie hier gelandet sind, weil Sie nach der Verwendung des Hailuo AI Video Generators suchen, sind Sie hier richtig und brauchen noch keinen Code. Hailuo ist die verbraucherorientierte App von MiniMax, und H3 ist der Modellname, den die API verwendet. Gleicher Motor, andere Tür.
Drei Minuten, kein Terminal:
- Öffnen Sie eine Modellseite, z.B. MiniMax H3 Image-to-Video. Das Playground ist das rechte Panel der Seite.
- Ziehen Sie ein erstes Bild hinein oder wechseln Sie zur Text-to-Video-Seite und schreiben Sie einfach einen Prompt. Stellen Sie Auflösung und Dauer ein. Sagen Sie laut, was Sie hören wollen, nicht nur, was Sie sehen wollen: H3 generiert das Audio im selben Durchlauf, also ist "Regen auf Glas tickt, winzige Servoklicks" eine echte Anweisung, keine Dekoration.
- Klicken Sie auf Run. Der Button zeigt den genauen Preis für die von Ihnen gewählten Einstellungen, bevor Sie sich festlegen. Warten, herunterladen.
Das ist der gesamte No-Code-Pfad, und für einmalige Clips ist er tatsächlich die schnellere Option. Sobald Sie zehn Varianten oder ein erstes Bild wollen, das von einem anderen Modell generiert und direkt eingespeist wird, kehren Sie zum Code zurück. Das ist der Rest hier.
Das MiniMax H3 Tutorial: Erstellen, Pollen, Herunterladen, Wiederholen
Ein Beispiel durchläuft alle sieben Schritte: Ein Uhrmacher repariert einen kleinen mechanischen Vogel aus Messing, flüstert ihm eine Zeile zu, und der Vogel fliegt aus der Werkstatt. Zwei Einstellungen. Einstellung A ist Image-to-Video, damit das Interieur gestaltet ist. Einstellung B ist Text-to-Video, weil es kein Quellbild für den Himmel gibt.
Schritt 1: Das erste Bild mit GPT Image 2 generieren
Image-to-Video ignoriert ratio, daher ist das erste Bild der Ort, an dem Sie die Bildseite von Einstellung A festlegen. Generieren Sie es in 16:9 und auf der höchsten Qualitätsstufe, weil H3 jeden Fehler darin erbt und dann noch Bewegungsunschärfe hinzufügt.
Modell: openai/gpt-image-2/text-to-image. Einstellungen: Quality high, 2048x1152, 16:9, PNG.
text1A cluttered clockmaker's workshop at dusk, warm tungsten lamp over a scarred oak 2bench. An old repairman in a leather apron leans close to a small brass mechanical 3bird resting in his cupped hands, its wing plates half-open, tiny gears visible. 4Rain streaks the mullioned window behind him; a coal stove glows amber at frame 5left. Shallow depth of field, 35mm, volumetric dust in the lamp beam, deep amber 6and teal palette, photoreal, no text. 7

GPT Image 2 Playground auf Atlas Cloud mit dem Prompts für das erste Bild dieses Tutorials und der gerenderten Uhrmacherwerkstatt im Ausgabepanel
GPT Image 2 auf Atlas Cloud, Quality high bei 2048x1152. Der Run-Button zeigt den genauen Preis für die gewählten Einstellungen, $0,1745 für dieses eine Bild, bevor Sie sich festlegen.
Behalten Sie die zurückgegebene URL. Schritt 2 speist sie direkt in H3 ein, kein Download-Roundtrip nötig.
Schritt 2: Den MiniMax H3 Task erstellen und die task_id festhalten
Der Create-Aufruf tut zwei Dinge und kümmert sich dann nicht mehr um Sie: Er validiert die Payload und gibt eine task_id zurück. Ein 400 hier liegt an Ihrer Payload, nicht an einem vorübergehenden Fehler – setzen Sie ihn also nicht in eine Retry-Schleife. Jede andere Art von Problem taucht später beim Pollen auf.
Die eine Gewohnheit, die wirklich Geld spart: Speichern Sie die task_id, bevor Sie irgendetwas anderes tun. Tasks sind nur 7 Tage lang abfragbar, und wenn Ihr Prozess mit der ID im Speicher stirbt, haben Sie für einen Render bezahlt, den Sie nicht mehr erreichen können.
python1import os, json, time, requests 2 3BASE = "https://api.minimax.io" 4HEADERS = { 5 "Authorization": f"Bearer {os.environ['MINIMAX_API_KEY']}", 6 "Content-Type": "application/json", 7} 8 9def create_task(payload: dict) -> str: 10 r = requests.post(f"{BASE}/v2/video_generation", 11 headers=HEADERS, json=payload, timeout=60) 12 if r.status_code == 400: 13 # Ihre Payload ist falsch. Wiederholen macht sie nicht richtiger. 14 raise ValueError(f"rejected: {r.text}") 15 r.raise_for_status() 16 task_id = r.json()["task_id"] 17 with open("tasks.jsonl", "a") as f: # VOR allem anderen speichern 18 f.write(json.dumps({"task_id": task_id, "at": int(time.time()), 19 "payload": payload}) + "\n") 20 return task_id 21 22SHOT_A_PROMPT = ( 23 "The old repairman's hands steady the brass bird. Its glass eyes flicker alight, " 24 "wing plates click open one by one. He leans in and whispers, close to the mic, " 25 ""Let's see if you still remember the sky." Slow 50mm push-in, lamp light raking " 26 "across the brass, rain ticking on the window, coal stove crackling, tiny servo " 27 "clicks under his voice. Warm amber key, teal window fill. No on-screen text." 28) 29 30shot_a = create_task({ 31 "model": "MiniMax-H3", 32 "resolution": "2K", 33 "duration": 8, 34 # bewusst kein "ratio" hier: Image-to-Video nimmt die Bildseite vom ersten Bild 35 "content": [ 36 {"type": "text", "text": SHOT_A_PROMPT}, 37 {"type": "image_url", "role": "first_frame", 38 "image_url": {"url": FIRST_FRAME_URL}}, 39 ], 40}) 41print("shot A task:", shot_a) 42
Hier ist genau dieser Prompt und das erste Bild, die als Job laufen, damit Sie sehen, wie ein gesunder Submit von der anderen Seite aussieht:

MiniMax H3 Image-to-Video Playground auf Atlas Cloud mit dem geladenen ersten Bild der Werkstatt und dem gerenderten Clip im Ausgabepanel
MiniMax H3 Image-to-Video: Erstes Bild links geladen, fertiger 2K-Clip in OUTPUT rechts. Beachten Sie das Feld Aspect Ratio, das auf adaptive gesetzt ist, und den Preis von $1,12 für 2K bei 8 Sekunden.
Schritt 3: Pollen und alle fünf MiniMax H3 Status behandeln
Dies ist die Schleife, die jeder falsch macht, daher lohnt es sich, sie vollständig auszuschreiben. Vier Regeln: Zurückhalten statt hämmern, die Gesamtwartezeit begrenzen, succeeded als "jetzt herunterladen" behandeln und bei jedem Status, der nicht im Enum ist, einen Fehler werfen.
python1TERMINAL_OK = {"succeeded"} 2TERMINAL_BAD = {"failed", "cancelled"} 3IN_FLIGHT = {"queued", "running"} 4 5def poll(task_id: str, timeout_s: int = 900) -> dict: 6 delay, deadline = 3.0, time.time() + timeout_s 7 while time.time() < deadline: 8 r = requests.get(f"{BASE}/v2/query/video_generation/{task_id}", 9 headers=HEADERS, timeout=30) 10 r.raise_for_status() 11 task = r.json()["task"] 12 status = task["status"] 13 14 if status in TERMINAL_OK: 15 return task # content.url ist jetzt live 16 if status in TERMINAL_BAD: 17 raise RuntimeError(f"{status}: {json.dumps(r.json())[:400]}") 18 if status not in IN_FLIGHT: 19 # ein Status, den das Enum nicht hat. NICHT in "weiter warten" fallen. 20 raise RuntimeError(f"unknown status {status!r} -- lesen Sie das Changelog") 21 22 print(f" {status} ... nächster Check in {delay:.0f}s") 23 time.sleep(delay) 24 delay = min(delay * 1.5, 15.0) # 3s -> 15s Obergrenze 25 raise TimeoutError(f"{task_id} nach {timeout_s}s immer noch nicht terminal") 26
Drei Dinge darin sind bewusst:
status not in IN_FLIGHT wirft einen Fehler, anstatt weiterzumachen. Wenn MiniMax nächstes Quartal einen sechsten Status hinzufügt, wollen Sie einen lauten Crash, keine Schleife, die auf ein Wort wartet, das nie kommt. Diese einzelne Zeile ist der Unterschied zwischen dem kaputten Tutorial und diesem.
failed wiederholt nicht. Ein fehlgeschlagener Render bedeutet normalerweise, dass der Prompt einen Filter ausgelöst hat oder die Payload eine schlechte Kombination hatte, und das erneute Senden der identischen Payload kauft Ihnen den identischen Fehler zum vollen Preis. Loggen Sie den Body, schauen Sie ihn an, dann entscheiden Sie.
Der Backoff beginnt bei 3 Sekunden und landet bei 15. H3 in 2K braucht Minuten, nicht Sekunden. Einmal pro Sekunde zu pollten, verbrennt nur Ihr Rate-Limit auf dem Query-Endpunkt.
Schritt 4: Herunterladen, bevor die URL abläuft
Sobald succeeded eintrifft, streamen Sie die Datei auf die Festplatte. Die URL in content.url ist explizit ein zeitlich begrenzter Link: "Laden Sie sie herunter oder speichern Sie sie umgehend; fragen Sie erneut ab, um nach Ablauf eine neue URL zu erhalten" (MiniMax API Reference, August 2026). Es ist kein CDN-Pfad, den Sie in Ihre Datenbank legen und vergessen können.
Die zweite Hälfte ist die gute Nachricht und die Antwort auf den 404, den Sie am nächsten Morgen hatten. Der Render ist nicht weg. Fragen Sie dieselbe task_id erneut ab, und Sie erhalten eine frische URL – bis zu 7 Tage nach der Erstellung.
python1def download(url: str, path: str) -> str: 2 with requests.get(url, stream=True, timeout=300) as r: 3 r.raise_for_status() 4 with open(path, "wb") as f: 5 for chunk in r.iter_content(1 << 20): 6 f.write(chunk) 7 return path 8 9def refresh_url(task_id: str) -> str: 10 """Toter Link? Der Render ist in Ordnung. Fragen Sie erneut, innerhalb des 7-Tage-Fensters.""" 11 r = requests.get(f"{BASE}/v2/query/video_generation/{task_id}", 12 headers=HEADERS, timeout=30) 13 r.raise_for_status() 14 return r.json()["task"]["content"]["url"] 15 16task = poll(shot_a) 17download(task["content"]["url"], "shot-a.mp4") 18
Was für Einstellung A zurückkommt, neben dem Standbild, von dem sie gestartet ist:

Seite an Seite: das generierte erste Bild links, ein Frame aus dem fertigen MiniMax H3 Clip rechts, der die geöffneten Flügelplatten und die leuchtenden Augen zeigt
Links: das GPT Image 2 Standbild aus Schritt 1, genau wie eingereicht. Rechts: ein Frame aus dem 2K-Clip, den H3 zurückgegeben hat. Gleiches Set, gleiches Licht, die Flügelplatten und die Augen sind das, was sich bewegt hat.
Schritt 5: Einstellung B mit MiniMax H3 Text-to-Video, wo ratio Pflicht ist
Kein Quellbild für den Himmel, also ist Einstellung B reiner Text. Das kehrt die ratio-Regel von "ignoriert" zu "erforderlich" um: Bei einem reinen Text-Prompt ist ratio erforderlich und kann nicht adaptive sein (MiniMax API Reference, August 2026). Lassen Sie es weg oder senden Sie adaptive, und Sie erhalten sofort einen 400, bevor ein Render beginnt.
Modell: minimax/h3/text-to-video. Einstellungen: 2K, Dauer 6, Ratio 16:9.
text1The brass bird bursts through a half-open workshop skylight into a rain-washed 2evening sky, wings beating in a whir of gears, droplets spraying off the metal 3feathers as it climbs past wet slate rooftops toward a break of gold cloud. 4Camera cranes up behind it, 24mm, backlit rim from the low sun. Sound: wing 5servos whirring, wind rising, distant church bell, rain fading out. No text. 6
python1shot_b = create_task({ 2 "model": "MiniMax-H3", 3 "resolution": "2K", 4 "duration": 6, 5 "ratio": "16:9", # hier erforderlich. Weglassen oder "adaptive" -> 400 6 "content": [{"type": "text", "text": SHOT_B_PROMPT}], 7}) 8download(poll(shot_b)["content"]["url"], "shot-b.mp4") 9

MiniMax H3 Text-to-Video Playground auf Atlas Cloud mit dem Prompt für den startenden Vogel und dem fertigen Clip im Ausgabepanel
MiniMax H3 Text-to-Video mit dem Prompt von Einstellung B und Aspect Ratio explizit auf 16:9 gesetzt. Dieser Lauf verwendete die Standardeinstellung der Seite von 8 Sekunden statt der 6 Sekunden in der Payload oben.
Schritt 6: Pollen überspringen mit einem Callback – und die Challenge in 3 Sekunden zurücksenden
Wenn Sie lieber benachrichtigt werden als fragen, übergeben Sie beim Create-Aufruf callback_url. Es gibt genau eine Falle, sie ist in einer einzigen Klammer in der API-Referenz dokumentiert, und sie ist der häufigste Grund, warum selbstgehostete Callbacks scheitern.
Bevor MiniMax Ihnen etwas pusht, sendet es eine Verifikationsanfrage mit einem challenge-Feld, und "Sie müssen die challenge innerhalb von 3 Sekunden unverändert zurücksenden, um die Verifikation abzuschließen" (MiniMax API Reference, August 2026). Verpassen Sie es, und es gibt nirgendwo einen Fehler. Ihre Create-Aufrufe gelingen weiter, Ihre Renders werden fertig, und Sie bekommen einfach nie einen Push. Nichts in irgendeinem Log sagt, warum.
Zwölf Zeilen FastAPI, und die Reihenfolge darin ist der springende Punkt:
python1from fastapi import FastAPI, Request 2 3app = FastAPI() 4 5@app.post("/minimax/callback") 6async def callback(req: Request): 7 body = await req.json() 8 if "challenge" in body: # Verifikations-Handshake, zuerst beantworten 9 return {"challenge": body["challenge"]} # unverändert, synchron, kein Auth-Gate 10 task_id = body.get("task_id") 11 status = body.get("status") 12 enqueue(task_id, status) # echte Benachrichtigung: abgeben, schnell zurück 13 return {"ok": True} 14
Die Fehler, die es killen, in der Reihenfolge, wie oft ich sie gesehen habe:
- Die Challenge-Anfrage durchläuft Ihre Auth-Middleware und erhält einen 401 oder eine Weiterleitung. Verifikation ist per Definition unauthentifiziert. Whitelisten Sie den Pfad.
- Der Handler schiebt die Challenge in eine Warteschlange und antwortet asynchron. Zu spät. Diese Antwort muss im Response-Body dieser Anfrage sein.
- Der Wert wird neu serialisiert, getrimmt oder umschlossen. Senden Sie ihn Byte für Byte zurück.
- Sie testen über einen Tunnel gegen einen serverlosen Dev-Server, und der Cold Start allein dauert über 3 Sekunden. Wärmen Sie ihn zuerst auf, oder verifizieren Sie gegen einen Prozess, der bereits läuft.
Pollen ist übrigens völlig in Ordnung. Wenn Sie eine Handvoll Jobs pro Stunde haben, ist die Schleife in Schritt 3 weniger Code und weniger anfällig. Der Callback zahlt sich aus, wenn Sie viele Jobs haben und keinen Poller pro Job wollen.
Schritt 7: Die beiden Einstellungen zu einem Film zusammenfügen
Beide Einstellungen kamen als 2560x1440 h264 bei 24fps mit AAC Stereo-Audio bei 32kHz zurück. Gleicher Container, gleiche Parameter, also ist das ein Stream-Copy, kein Re-Encode. Kein Qualitätsverlust, kein Warten.
Eine kleine Überraschung, die man erwarten sollte: Wenn ich 6 Sekunden angefordert habe, bekam ich eine 6,58 Sekunden lange Datei. Dauern kommen nahe an das zurück, was Sie angefordert haben, nicht exakt auf den Frame, also ergeben die beiden Einstellungen 14,62 Sekunden statt einer sauberen 14.
bash1printf "file 'shot-a.mp4'\nfile 'shot-b.mp4'\n" > list.txt 2ffmpeg -f concat -safe 0 -i list.txt -c copy brass-bird-two-shot.mp4 3
Diese Ausgabe ist das Video am Anfang dieses Artikels. Wenn -c copy meckert, haben Ihre beiden Einstellungen unterschiedliche Auflösungen oder Bildraten, was auf H3 bedeutet, dass Sie resolution zwischen den Aufrufen geändert haben. Passen Sie sie an, oder lassen Sie -c copy weg und akzeptieren Sie einen Re-Encode.
MiniMax H3 Tutorial Variationen, die es wert sind, geklaut zu werden
Fünf Dinge, die einen Versuch wert sind, sobald die obige Schleife funktioniert, grob sortiert nach wie viel Geld sie sparen.
Entwurf in 768P, Endfassung in 2K. Beide Stufen sind dasselbe Modell, und 768P kostet etwa 29% weniger pro Sekunde. Rendern Sie Ihre Kandidaten kurz und billig, schauen Sie sie an, führen Sie dann nur den Gewinner in 2K mit demselben Prompt erneut aus. Hier liegt das meiste Sparpotenzial in einer Shot-Liste. Welche Stufe Sie für die Auslieferung brauchen, ist eine eigene Diskussion, und ich habe sie in 768P vs 2K geführt.
Dauer ist jede ganze Zahl von 4 bis 15. Kein Set von Presets. Wenn die Aktion bei 7 Sekunden endet, fragen Sie nach 7 und hören Sie auf, für 8 zu zahlen.
Erstes Bild plus letztes Bild. Senden Sie ein zweites Bild-Item mit role: "last_frame", und H3 wird den Übergang zwischen ihnen aufbauen. Nützlich für Übergänge zwischen Einstellungen, die Sie bereits gestaltet haben.
Reference-to-Video für Kontinuität. role: "reference_image" behält eine Figur über Einstellungen hinweg bei, anstatt ihr Gesicht bei jeder Generierung neu zu würfeln. Es gibt eine passende reference_audio-Rolle mit einem 2- bis 15-Sekunden-Fenster für den Referenzclip, so bleibt eine Stimme konsistent. Siehe Reference-to-Video.
Vertikaler Talking Head. ratio: "9:16" mit einer Dialogzeile im Prompt ist derzeit das volumenstärkste Anwendungsszenario dieses Modells, weil der Audio aus demselben Durchlauf kommt und die Lippen ohne separaten Lip-Sync-Schritt passen.
Prompt Craft ist eine separate Fähigkeit von der Async-Installation, und wenn Ihre Einstellungen technisch sauber, aber visuell flach sind, liegt das Problem oberhalb dieses Artikels. Beginnen Sie mit dem H3 Prompt Guide.
Was dieses MiniMax H3 Tutorial gekostet hat
Reale Posten aus dem Lauf, der den Film am Anfang produziert hat, vom Run-Button zitiert und am 2026-08-12 verifiziert. H3 berechnet pro Sekunde Ausgabe, und der Satz ist nach Auflösung gestaffelt: Die 2K-Jobs kosteten $1,12 für 8 Sekunden, was $0,14 pro Sekunde entspricht, und der Katalogpreis von $0,10 ist die 768P-Stufe. Alle drei H3-Endpunkte sind derzeit zum vollen Preis, ohne Rabatt.
| Schritt | Modell | Einstellungen | Kosten |
|---|---|---|---|
| Erstes Bild | GPT Image 2 Text-to-Image | Quality high, 2048x1152 | $0,1745 |
| Einstellung A | H3 Image-to-Video | 2K, 8s | $1,12 |
| Einstellung B | H3 Text-to-Video | 2K, 16:9, 6s | $0,84 |
| Ausgelieferter Film | 14,6s, zwei Einstellungen, 2560x1440, Stereo-Audio | $2,13 | |
| Screenshot-Läufe für diesen Artikel | H3 i2v + t2v | 2K, 8s je | $2,24 |
Bemerkenswert: Dieselben beiden Einstellungen als Entwurf in 768P hätten $0,80 und $0,60 statt $1,12 und $0,84 gekostet, etwa 29% weniger, für Filmmaterial, an dem man einen Take absolut beurteilen kann.
Zwei Abrechnungsdetails, die man auf die teure Art lernen kann. Ein Request, der beim Submit abgelehnt wird, kostet nichts – ein 400 wegen fehlendem ratio ist also kostenlos. Ein Request, der etwas Nutzloses rendert, ist nicht kostenlos: Wenn der Job succeeded erreicht, wird Ihnen der Render in Rechnung gestellt, selbst wenn die Ausgabe nicht das ist, was Sie wollten. Das ist das eigentliche Argument für das Entwerfen in 768P.
Preise pro Sekunde, der Vergleich zwischen 768P und 2K und wie sich die Kosten über verschiedene Dauern verhalten, sind im MiniMax H3 API Pricing, dem Begleitartikel zu diesem, ordentlich aufgeschlüsselt. Dieser hier ist der Code, jener ist die Rechnung.
Namensnennung und Territorium, bevor Sie ausliefern
Zwei Dinge zu prüfen, bevor dies irgendwo öffentlich wird. Die API-Bedingungen von MiniMax enthalten eine bedingte Verteidigungsverpflichtung für Patent- und Urheberrechtsansprüche gegen API-Ausgaben, und diese Verpflichtung erstreckt sich nicht auf Marken oder Ähnlichkeiten – ein erkennbares Logo oder eine reale Person in Ihrem Prompt ist also immer noch Ihr Problem. Separat enthält die Open-Weights-Lizenz für H3 eine Klausel zu ausgeschlossenen Territorien, und diese Klausel regelt die heruntergeladenen Gewichte und deren Ausgaben, nicht die gehostete API, deren Bedingungen eine US-Serviceregion nennen, die Sie auswählen können. Lesen Sie den Vertrag, den Sie tatsächlich unterschrieben haben. Und kennzeichnen Sie H3-Ausgaben in Ihrer UI als H3-Ausgaben.
MiniMax H3 Tutorial FAQ
Was sind die MiniMax H3 Task-Status, und gibt es einen expired-Status?
Fünf: queued, running, succeeded, failed, cancelled. Es gibt keinen expired-Status. Zwei andere Dinge laufen ab und werden damit verwechselt: Die Download-URL in content.url ist zeitlich begrenzt, und der Task-Datensatz selbst ist nur für die letzten 7 Tage abfragbar.
Muss ich einen Callback verwenden, oder ist Pollen für MiniMax H3 in Ordnung?
Pollen ist in Ordnung und erfordert weniger Code. Verwenden Sie einen Callback, wenn Sie so viele gleichzeitige Jobs haben, dass ein Poller pro Job unsinnig ist. Falls Sie einen verwenden, muss der Endpunkt das challenge-Feld innerhalb von 3 Sekunden unverändert zurücksenden, synchron, vor jeder Auth-Middleware. Ein fehlgeschlagener Handshake erzeugt überhaupt keine Fehlermeldung, nur dauerhafte Stille.
Warum erhalte ich einen 400 bei meinem MiniMax H3 Text-to-Video-Request mit "ratio is required and cannot be adaptive"?
Weil Sie sich im Text-only-Modus befinden, wo es kein erstes Bild gibt, von dem die Bildseite abgeleitet werden kann. Übergeben Sie einen expliziten Wert: 21:9, 16:9, 4:3, 1:1, 3:4 oder 9:16. Dieselbe Regel ist der Grund, warum ratio bei Image-to-Video so aussieht, als würde es nichts tun – dort entscheidet das erste Bild, und jedes von Ihnen übergebene ratio wird ignoriert.
Wie viele MiniMax H3 Jobs kann ich parallel ausführen?
Das dokumentierte Limit ist verbindungsbasiert: 2 gleichzeitige Tasks kostenlos, 15 bezahlt. Über dem Limit erhalten Sie sofort einen 429 und keinen Warteschlangenplatz, also begrenzen Sie Ihre eigene In-Flight-Zahl. Routing-Gateways absorbieren manchmal mehr, und ich hatte 20 gleichzeitige Jobs, die alle erfolgreich waren, aber an einem anderen Tag wurde ich auf demselben Setup auch 429ed. Bauen Sie keinen Scheduler, der die höhere Zahl annimmt.
Meine MiniMax H3 Video-URL 404t einen Tag später. Ist der Render weg?
Nein. Die URL ist abgelaufen, der Render nicht. Fragen Sie dieselbe task_id erneut ab, und die Antwort enthält eine frische URL – zu jeder Zeit innerhalb des 7-Tage-Abfragefensters. Nach 7 Tagen ist der Task-Datensatz selbst nicht mehr abfragbar, weshalb Schritt 2 die task_id speichert, bevor irgendetwas anderes passiert.
Ich habe "hailuo ai video generator how to use" gesucht und bin auf einem MiniMax H3 Tutorial gelandet. Bin ich hier richtig?
Ja. Hailuo ist die Verbraucher-App und H3 ist der Modellname, den die API verwendet. Gleicher Motor. Wenn Sie einen einzelnen Clip wollen, verwenden Sie den Playground-Pfad im Workflow-Abschnitt oben, kein Code erforderlich. Wenn Sie zehn Varianten oder ein erstes Bild wollen, das von einem anderen Modell eingespeist wird, sind die sieben Schritte für Sie.






