Seedance 2.5 is nu live — Als eerste op Atlas Cloud

Uw MiniMax H3 Poll Loop eindigt nooit. Hier is de tutorial die daadwerkelijk eindigt.

Een MiniMax H3-tutorial met de volledige async-loop: de create-aanroep, een poll-loop die alle vijf echte statussen afhandelt, de 3-seconden callback-uitdaging, en de twee dingen die stilletjes verlopen.

Jouw eerste POST kwam binnen tien seconden terug met een task_id. Leek een overwinning.

Toen gebeurde er zes minuten lang niets. Je had while status != "Success" uit een of andere tutorial gekopieerd en de lus bleef maar draaien, omdat dit endpoint het woord Success niet meer teruggeeft. Dus schakelde je over op een webhook. Geen enkele push arriveerde en nergens werd verteld waarom. De volgende ochtend ging je terug naar de render van gisteren en de link gaf een 404.

Die vier dingen lijken niets met elkaar te maken. Geen ervan is de schuld van het model. Alle vier zijn het gevolg van het async-contract, dat bijna niemand opschrijft. Hier is het volledige contract, plus een echte tweeshot-korte film die er aan de andere kant uitkwam.

Belangrijkste punten

  • Drie endpoints, één lus: create retourneert een task_id en verbreekt de verbinding, je pollt, je downloadt. Alles wat lastig is, gebeurt na de create-aanroep.
  • De vijf echte statussen zijn queued, running, succeeded, failed, cancelled. Er is geen expired-status, wat een blogpost je ook verteld heeft.
  • Twee dingen verlopen wel, en geen van beide is een status: de download-URL is tijdgebonden en de taakrecord zelf is slechts 7 dagen opvraagbaar.
  • Als je een callback gebruikt, stuurt MiniMax eerst een verificatieverzoek met een challenge-veld en je moet dat binnen 3 seconden ongewijzigd terugsturen. Lukt dat niet, dan krijg je geen foutmelding, alleen eeuwige stilte.
  • Voor tekst-only generatie is ratio verplicht en mag niet adaptive zijn. Bij image-to-video bepaalt het eerste frame het frame en wordt elke ratio die je meegeeft genegeerd.

Het afgewerkte resultaat eerst

De volledige opbrengst van deze tutorial: twee MiniMax H3-shots in 2K, aaneengevoegd, 14,6 seconden. Shot A is image-to-video van een gegenereerd eerste frame, shot B is text-to-video. Zet het geluid aan. De audio is geen soundtrack die eroverheen is gelegd, H3 heeft de tandwielen, de regen en de gefluisterde regel gegenereerd als onderdeel van dezelfde generatie.

Drie API-aanroepen hebben dit mogelijk gemaakt. Eén beeldmodel voor het eerste frame, twee H3-endpoints voor de shots, één ffmpeg-regel om ze samen te voegen. De onderstaande code is de code die het heeft gemaakt.

Waarom de meeste MiniMax H3-tutorials bij de tweede aanvraag breken

Bijna elke handleiding voor dit model stopt bij de create-aanroep. Dat is de gemakkelijke helft. De create-aanroep valideert je payload, geeft je een task_id en verbreekt de verbinding, en dan sta je er alleen voor met een taak die minuten duurt en een set regels die niemand heeft afgedrukt.

De fouten zijn saai herhaalbaar. Ik heb er vijf van deze zes in één middag gehad.

SymptoomWat je zietWerkelijke oorzaakOplossing
Poll-lus eindigt nooitTerminal printt oneindig, taak al lang klaarJe exit-voorwaarde vergelijkt met v1-woorden zoals Success / Fail. Het v2-query-endpoint retourneert lowercase succeeded / failedMatchen op de v2-enum, en een fout gooien bij elke onbekende status
Instant 400 bij text-to-videoVerzoek afgewezen voordat er render startratio ontbreekt, of staat op adaptive, wat tekst-only modus weigertGeef een expliciete ratio door, zoals 16:9
Je ratio wordt stilzwijgend genegeerdUitvoerframe is niet wat je hebt gevraagdImage-to-video leidt het frame af van de eerste frame-afbeelding, dus ratio is daar een no-opKnip of genereer het eerste frame op het gewenste frame
Webhook vuurt nooit, geen foutNul pushes, schone logs, geen klacht van de APIDe verificatie-handshake is mislukt. MiniMax stuurde een challenge en jouw endpoint heeft die niet binnen 3 seconden ongewijzigd teruggestuurdBeantwoord de challenge synchroon, vóór eventuele auth- of queue-middleware
URL van gisteren geeft 404Downloadlink dood, render lijkt wegDe download-URL is tijdgebonden. De render is in ordeVraag dezelfde task_id opnieuw op voor een nieuwe URL, binnen het 7-daagse venster
Willekeurige 429's onder belastingSommige submits afgewezen, geen wachtrijConcurrency is beperkt, en het is een harde limiet, geen wachtrijBeperk je eigen aantal in-flight-verzoeken en probeer de submit opnieuw, niet de render

De eerste rij is degene die hele avonden opslokt, en het is de moeite waard om precies te zijn. MiniMax's oudere video-API rapporteerde voortgang met hoofdletterwoorden in de familie Preparing / Queueing / Processing / Success / Fail. Het v2-query-endpoint dat door H3 wordt gebruikt, retourneert queued, running, succeeded, failed, cancelled (MiniMax API Reference, augustus 2026). Veel documentatie van externe wederverkopers drukt nog steeds de oude set af, of mengt beide op één pagina. Als je een lus hebt geërfd van een van die, kan deze niet beëindigen, omdat de string waarop hij wacht nooit wordt verzonden.

MiniMax H3 Tutorial Workflow: Drie Endpoints, Vijf Statussen, Eén Lus

H3 is gelanceerd op 31-07-2026 als een omni-modaal videomodel: tekst, afbeelding, video en audio leven allemaal in dezelfde contextvenster, output tot 15 seconden in 2K met native stereo-audio (MarkTechPost, augustus 2026). Voor de API betekent dat één create-endpoint met een content-array, en wat je in de array stopt, bepaalt in welke modus je zit.

ModusWat er in content gaatrol op het afbeelding-itemWat ratio doetGebruik het voor
Text-to-videoéén tekstitemgeenVerplicht, en adaptive wordt geweigerdShots zonder bronafbeelding, volledige controle over het frame
Image-to-videotekstitem plus afbeeldingitemfirst_frame (optioneel ook last_frame)Genegeerd, het eerste frame beslistEen stilstaand beeld animeren dat je al hebt vormgegeven
Reference-to-videotekstitem plus referentie-itemreference_image (ook reference_video, reference_audio)Verplicht, hetzelfde als tekst-onlyEen personage of stem consistent houden over shots heen

En het deel dat je code daadwerkelijk moet afhandelen. Vijf statussen, vijf verschillende takken.

StatusWat het betekentWat je code doet
queuedGeaccepteerd, wacht op een plekBlijf pollen, back off
runningAan het renderenBlijf pollen, back off
succeededKlaar, content.url is gevuldDownload onmiddellijk, in deze iteratie
failedRender misluktLees de foutmelding, log het, probeer niet blindelings dezelfde payload opnieuw
cancelledTaak is geannuleerdVerlaat de lus, behandel als eindstatus
al het andereNiet in de enumGooi een fout. Een nieuwe status die je stilzwijgend als "blijf wachten" behandelt, is de bug uit de tabel hierboven

Er is geen expired-status. Dat woord wordt vaak aan deze API gekoppeld en het hoort bij twee andere dingen: de download-URL, die tijdgebonden en verversbaar is, en de taakrecord, die alleen opvraagbaar is voor de laatste 7 dagen. Beide worden behandeld in Stap 4.

Nog één getal voordat de code komt. Concurrency voor videogeneratie op H3 wordt beperkt door het aantal verbindingen, niet door verzoeken per minuut: 2 gelijktijdige taken op de gratis laag, 15 zodra je betaalt (MiniMax Rate Limits, augustus 2026). Boven de limiet krijg je direct een 429. Er wordt niets voor je in de wachtrij gezet. Ik heb ook 20 gelijktijdige H3-taken via een routing-gateway gestuurd en alle 20 geland, en ik heb op een andere dag een 429 gehad op dezelfde opzet, dus behandel elk getal boven de gedocumenteerde limiet als weersomstandigheden, niet als constante.

Direct of via een gateway

De drie stappen zijn in beide gevallen hetzelfde, maar de strings verschillen, en dat is belangrijk wanneer je om 1 uur 's nachts aan het debuggen bent.

MiniMax directUnified gateway (Atlas Cloud)
IndienenPOST /v2/video_generationPOST /api/v1/model/generateVideo
PollenGET /v2/query/video_generation/{task_id}GET /api/v1/model/prediction/{id}
Statuswoordenqueued / running / succeeded / failed / cancelledcompleted bij succes, failed bij mislukking
PushmeldingenCallback-URL met de 3-seconden challenge-handshakePoll de prediction-id
Concurrency2 gratis, 15 betaald, harde 429Niet gepubliceerd als een per-model-limiet, in de praktijk breder gemeten
Eerste-frame-beeldmodel op dezelfde sleutelNee, apart accountJa, GPT Image 2 en H3 zitten achter één sleutel
H3-prijsGepubliceerd per resolutielaagPer seconde output, gelaagd per resolutie, geprijsd op de Run-knop voordat je indient

De reden dat ik deze tutorial-keten op een gateway heb uitgevoerd, is puur de voorlaatste rij: het eerste frame komt van een OpenAI-beeldmodel en de twee shots komen van MiniMax, en ik wilde niet twee leveranciers, twee sleutels en twee facturatiepagina's voor één film van 14 seconden. Als je al binnen het MiniMax-platform zit, blijf daar dan, de lus hieronder werkt ongewijzigd, behalve de paden en de statuswoorden.

Hailuo AI Video Generator: Hoe Gebruik Je Het Voordat Je Code Schrijft

Als je hier bent gekomen door te zoeken naar hoe je de Hailuo AI-videogenerator moet gebruiken, ben je op de juiste plek en heb je nog geen code nodig. Hailuo is de consumenten-app van MiniMax en H3 is de modelnaam die de API gebruikt. Dezelfde engine, andere deur.

Drie minuten, geen terminal:

  1. Open een modelpagina, bijvoorbeeld MiniMax H3 image-to-video. De playground is het rechterpaneel van de pagina.
  2. Sleep een eerste-frame-afbeelding erin, of schakel over naar de text-to-video-pagina en schrijf gewoon een prompt. Stel resolutie en duur in. Zeg hardop wat je wilt horen, niet alleen wat je wilt zien: H3 genereert de audio in dezelfde doorgang, dus "regen tikt op glas, kleine servoklikken" is een echte instructie, geen versiering.
  3. Druk op Run. De knop toont de exacte prijs voor de door jou gekozen instellingen voordat je bevestigt. Wacht, download.

Dat is het volledige no-code-pad, en voor eenmalige clips is het echt de snellere optie. Op het moment dat je tien varianten wilt, of een eerste frame gegenereerd door een ander model en direct wilt invoeren, kom dan terug naar de code. Dat is waar de rest van dit artikel over gaat.

De MiniMax H3 Tutorial: Creëren, Pollen, Downloaden, Herhalen

Eén voorbeeld doorloopt alle zeven stappen: een klokkenmaker repareert een klein mechanisch vogeltje van messing, fluistert er één regel tegen en het vogeltje vliegt de werkplaats uit. Twee shots. Shot A is image-to-video zodat het interieur is vormgegeven. Shot B is text-to-video omdat er geen bronframe voor de lucht is.

Stap 1: Genereer het eerste frame met GPT Image 2

Image-to-video negeert ratio, dus het eerste frame is waar je het frame van shot A bepaalt. Genereer het in 16:9 en op de hoogste kwaliteitslaag, omdat H3 elk gebrek ervan zal overnemen en er bewegingsonscherpte aan toevoegt.

Model: openai/gpt-image-2/text-to-image. Instellingen: kwaliteit high, 2048x1152, 16:9, PNG.

text
1Een rommelige klokkenmakerswerkplaats bij schemering, warme wolfraamlamp boven een
2geb ladderde eiken werkbank. Een oude reparateur in een leren schort buigt zich
3over een klein mechanisch vogeltje van messing dat in zijn gevouwen handen rust,
4de vleugelplaten half open, kleine tandwielen zichtbaar. Regen striemt door het
5raam met roeden achter hem; een kolenkachel gloeit amberkleurig links in beeld.
6Kleine scherptediepte, 35 mm, volumetrisch stof in de lampstraal, diep amber en
7groenblauw palet, fotorealistisch, geen tekst.
8

AI-afbeeldingsgenerator-interface met een tekstprompt en gegenereerde output

GPT Image 2-playground op Atlas Cloud met de eerste-frame-prompt van deze tutorial en de weergegeven klokkenmakerswerkplaats in het uitvoerpaneel

GPT Image 2 op Atlas Cloud, kwaliteit high op 2048x1152. De Run-knop toont de exacte prijs voor de door jou gekozen instellingen, $0,1745 voor deze, voordat je bevestigt.

Bewaar de geretourneerde URL. Stap 2 voert deze rechtstreeks naar H3, zonder heen-en-weer-download.

Stap 2: Maak de MiniMax H3-taak aan en houd de task_id vast

De create-aanroep doet twee dingen en stopt dan met om je geven: hij valideert de payload en retourneert een task_id. Een 400 hier is jouw payload, geen tijdelijke fout, dus zet het niet achter een herhaallus. Elke andere klasse van problemen verschijnt later, tijdens het pollen.

De enige gewoonte die echt geld bespaart: persisteer de task_id voordat je iets anders doet. Taken zijn slechts 7 dagen opvraagbaar, en als je proces sterft met de id in het geheugen, heb je betaald voor een render die je niet meer kunt bereiken.

python
1import 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        # jouw payload is verkeerd. opnieuw proberen is gewoon opnieuw fout.
14        raise ValueError(f"afgewezen: {r.text}")
15    r.raise_for_status()
16    task_id = r.json()["task_id"]
17    with open("tasks.jsonl", "a") as f:                 # persisteer VOORDAT je iets anders doet
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    "De handen van de oude reparateur stabiliseren het vogeltje van messing. De glazen ogen "
24    "flakkeren aan, vleugelplaten klikken een voor een open. Hij buigt zich voorover en fluistert, "
25    "dicht bij de microfoon: "Laten we kijken of je je de lucht nog herinnert." Langzame 50mm "
26    "push-in, lamplicht strijkt over het messing, regen tikt op het raam, kolenkachel knettert, "
27    "kleine servoklikken onder zijn stem. Warme amber sleutel, groenblauwe raamvulling. Geen "
28    "tekst op het scherm."
29)
30
31shot_a = create_task({
32    "model": "MiniMax-H3",
33    "resolution": "2K",
34    "duration": 8,
35    # geen "ratio" hier met opzet: image-to-video neemt het frame van het eerste frame
36    "content": [
37        {"type": "text", "text": SHOT_A_PROMPT},
38        {"type": "image_url", "role": "first_frame",
39         "image_url": {"url": FIRST_FRAME_URL}},
40    ],
41})
42print("shot A taak:", shot_a)
43

Hier is die exacte prompt en dat eerste frame dat als taak wordt uitgevoerd, zodat je kunt zien hoe een gezonde indiening er aan de andere kant uitziet:

Screenshot van een AI-videogenerator-interface met invoer en uitvoer

MiniMax H3 image-to-video-playground op Atlas Cloud met het eerste frame van de werkplaats geladen en de weergegeven clip in het uitvoerpaneel

MiniMax H3 image-to-video: eerste frame geladen aan de linkerkant, afgewerkte 2K-clip in OUTPUT aan de rechterkant. Merk op dat het Aspect Ratio-veld is vastgezet op adaptive, en de $1,12-prijs voor 2K bij 8 seconden.

Stap 3: Poll het en behandel alle vijf MiniMax H3-statussen

Dit is de lus die iedereen verkeerd doet, dus het is de moeite waard om hem volledig uit te schrijven. Vier regels: back off in plaats van hameren, cap de totale wachttijd, behandel succeeded als "download nu", en gooi een fout bij elke status die niet in de enum staat.

python
1TERMINAL_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 is NU 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            # een status die de enum niet heeft. val NIET door naar "blijf wachten".
20            raise RuntimeError(f"onbekende status {status!r} -- lees de changelog")
21
22        print(f"  {status} ... volgende check in {delay:.0f}s")
23        time.sleep(delay)
24        delay = min(delay * 1.5, 15.0)                    # 3s -> 15s plafond
25    raise TimeoutError(f"{task_id} nog steeds niet eindstatus na {timeout_s}s")
26

Drie dingen hierin zijn bewust:

status not in IN_FLIGHT gooit een fout in plaats van door te gaan. Als MiniMax volgende kwartaal een zesde status toevoegt, wil je een luide crash, geen lus die wacht op een woord dat nooit komt. Deze enkele regel is het verschil tussen de kapotte tutorial en deze.

failed probeert het niet opnieuw. Een mislukte render betekent meestal dat de prompt een filter heeft geactiveerd of dat de payload een slechte combinatie had, en het opnieuw afvuren van de identieke payload levert je de identieke fout op tegen de volledige prijs. Log de body, bekijk hem, beslis dan.

De backoff begint bij 3 seconden en landt op 15. H3 in 2K duurt minuten, niet seconden. Een keer per seconde pollen verbrandt gewoon je snelheidslimiet op het query-endpoint.

Stap 4: Download voordat de URL verloopt

Op het moment dat succeeded binnenkomt, stream het bestand naar schijf. De URL in content.url is expliciet een tijdgebonden link: "Download of bewaar het onmiddellijk; vraag opnieuw een URL aan nadat deze is verlopen" (MiniMax API Reference, augustus 2026). Het is geen CDN-pad dat je in je database kunt zetten en vergeten.

Die tweede helft is het goede nieuws, en het is het antwoord op de 404 die je de volgende ochtend kreeg. De render is niet weg. Vraag dezelfde task_id opnieuw op en je krijgt een nieuwe URL, tot 7 dagen na creatie.

python
1def 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    """Dode link? De render is in orde. Vraag opnieuw, binnen het 7-daagse venster."""
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

Wat er terugkomt voor shot A, naast de stilstaande afbeelding waar het van begon:

Zij-aan-zij vergelijking van een vakman die een mechanisch vogeltje onderzoekt

Zij aan zij: het gegenereerde eerste frame aan de linkerkant, een frame uit de afgewerkte MiniMax H3-clip aan de rechterkant, met de geopende vleugelplaten en de verlichte ogen van het vogeltje

Links: de GPT Image 2-stilstaande afbeelding uit Stap 1, exact zoals ingediend. Rechts: een frame uit de 2K-clip die H3 retourneerde. Dezelfde set, hetzelfde licht, de vleugelplaten en de ogen zijn wat bewoog.

Stap 5: Shot B met MiniMax H3 text-to-video, waar ratio verplicht is

Geen bronframe voor de lucht, dus shot B is tekst-only. Dat draait de ratio-regel om van "genegeerd" naar "verplicht": voor een tekst-only prompt is ratio verplicht en mag niet adaptive zijn (MiniMax API Reference, augustus 2026). Laat het weg of stuur adaptive en je krijgt een onmiddellijke 400, voordat er een render begint.

Model: minimax/h3/text-to-video. Instellingen: 2K, duur 6, ratio 16:9.

text
1Het vogeltje van messing barst door een halfopen dakraam van de werkplaats een
2regenachtige avondlucht in, vleugels slaand in een gezoem van tandwielen,
3druppels spatten van de metalen veren terwijl het langs natte leien daken klimt
4naar een breuk in goudkleurige wolken. De camera kraait erachter omhoog, 24 mm,
5tegenlicht van de lage zon. Geluid: vleugelservo's zoemen, wind steekt op,
6verre kerkklok, regen sterft weg. Geen tekst.
7
python
1shot_b = create_task({
2    "model": "MiniMax-H3",
3    "resolution": "2K",
4    "duration": 6,
5    "ratio": "16:9",          # hier verplicht. weglaten of "adaptive" sturen -> 400
6    "content": [{"type": "text", "text": SHOT_B_PROMPT}],
7})
8download(poll(shot_b)["content"]["url"], "shot-b.mp4")
9

Screenshot van een AI-videogenerator-interface met invoer en uitvoer

MiniMax H3 text-to-video-playground op Atlas Cloud met de prompt van het vogeltje dat opvliegt en de afgewerkte clip in het uitvoerpaneel

MiniMax H3 text-to-video met de prompt van shot B en Aspect Ratio expliciet ingesteld op 16:9. Deze run gebruikte de standaard 8 seconden van de pagina in plaats van de 6 in de bovenstaande payload.

Stap 6: Sla pollen over met een callback en echo de challenge binnen 3 seconden

Als je liever verteld wordt dan vraagt, geef dan callback_url mee bij de create-aanroep. Er is precies één addertje onder het gras, het staat gedocumenteerd in een enkele haakje in de API-referentie, en het is de meest voorkomende manier waarop zelf-hosted callbacks falen.

Voordat MiniMax je iets pusht, stuurt het een verificatieverzoek met een challenge-veld, en "je moet de challenge binnen 3 seconden ongewijzigd retourneren om de verificatie te voltooien" (MiniMax API Reference, augustus 2026). Mis dit en er is nergens een foutmelding. Je create-aanroepen blijven slagen, je renders blijven afmaken en je krijgt simpelweg nooit een push. Niets in enige log zegt waarom.

Twaalf regels FastAPI, en de volgorde daarin is het hele punt:

python
1from 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:                 # verificatie-handshake, beantwoord het EERST
9        return {"challenge": body["challenge"]}   # ongewijzigd, synchroon, geen auth-gate
10    task_id = body.get("task_id")
11    status  = body.get("status")
12    enqueue(task_id, status)                # echte melding: geef door, keer snel terug
13    return {"ok": True}
14

De fouten die het doden, in volgorde van hoe vaak ik ze heb gezien:

  • Het challenge-verzoek gaat door je auth-middleware en krijgt een 401 of een redirect. Verificatie is per definitie on-geauthenticeerd. Whitelist het pad.
  • De handler plaatst de challenge in een wachtrij en antwoordt asynchroon. Te laat. Dat antwoord moet in de response-body van dat verzoek zitten.
  • De waarde wordt opnieuw geserialiseerd, ingekort of ingepakt. Echo het byte voor byte.
  • Je test via een tunnel tegen een serverloze dev-server, en de cold start alleen al is meer dan 3 seconden. Warm hem eerst op, of verifieer tegen een proces dat al draait.

Pollen is overigens prima. Als je een handvol taken per uur hebt, is de lus in Stap 3 minder code en minder om te breken. De callback loont wanneer je veel taken hebt en niet per taak een poller wilt.

Stap 7: Voeg de twee shots samen tot één film

Beide shots kwamen terug als 2560x1440 h264 bij 24 fps met AAC stereo-audio bij 32 kHz. Dezelfde container, hetzelfde alles, dus dit is een stream-copy in plaats van een hercodering. Geen kwaliteitsverlies, geen wachttijd.

Eén kleine verrassing die je kunt verwachten: het vragen om 6 seconden leverde me een bestand van 6,58 seconden op. Duren komen dicht in de buurt van wat je hebt gevraagd, niet exact op het frame, dus de twee shots tellen op tot 14,62 seconden in plaats van een nette 14.

bash
1printf "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

Die output is de video bovenaan dit artikel. Als -c copy klaagt, hebben je twee shots verschillende resoluties of framesnelheden, wat op H3 betekent dat je resolution tussen aanroepen hebt gewijzigd. Match ze, of laat de -c copy vallen en accepteer één hercodering.

MiniMax H3 Tutorial-variaties Die Het Stelen Waard Zijn

Vijf dingen om te proberen zodra de bovenstaande lus werkt, in ruwe volgorde van hoeveel geld ze je besparen.

Concept op 768P, afmaken op 2K. Beide lagen zijn hetzelfde model, en 768P kost ongeveer 29% minder per seconde. Render je kandidaten kort en goedkoop, bekijk ze, voer dan alleen de winnaar opnieuw uit op 2K met dezelfde prompt. Dit is waar de meeste besparingen in een shotlijst zitten. Welke laag je daadwerkelijk nodig hebt voor levering is een aparte discussie, en ik heb die gevoerd in 768P vs 2K.

Duur is elk geheel getal van 4 tot 15. Geen set voorinstellingen. Als de actie eindigt op 7 seconden, vraag dan om 7 en stop met betalen voor 8.

Eerste frame plus laatste frame. Stuur een tweede afbeeldingitem met role: "last_frame" en H3 zal de overgang ertussen bouwen. Handig voor overgangen tussen shots die je al hebt vormgegeven.

Reference-to-video voor continuïteit. role: "reference_image" houdt een personage consistent over shots heen in plaats van hun gezicht elke generatie opnieuw te laten rollen. Er is een overeenkomende reference_audio-rol met een venster van 2 tot 15 seconden voor de referentieclip, waarmee je een stem consistent houdt. Zie reference-to-video.

Verticale pratende kop. ratio: "9:16" met een dialoogregel in de prompt is het hoogste volume gebruik van dit model op dit moment, omdat de audio uit dezelfde doorgang komt en de lippen matchen zonder een aparte lip-sync stap.

Promptcraft is een aparte vaardigheid van de async-loodgieterswerk, en als je shots technisch schoon zijn maar visueel vlak, ligt het probleem stroomopwaarts van dit artikel. Begin met de H3 promptgids.

Wat Deze MiniMax H3 Tutorial Heeft Gekost

Echte posten van de run die de film bovenaan produceerde, geprijsd door de Run-knop en geverifieerd op 2026-08-12. H3 factureert per seconde output en het tarief is gelaagd per resolutie: de 2K-taken hebben $1,12 voor 8 seconden geprijsd, wat $0,14 per seconde is, en het catalogusstarttarief van $0,10 is de 768P-laag. Alle drie de H3-endpoints zijn momenteel tegen de volle prijs, geen korting toegepast.

StapModelInstellingenPrijs
Eerste frameGPT Image 2 text-to-imagekwaliteit high, 2048x1152$0,1745
Shot AH3 image-to-video2K, 8s$1,12
Shot BH3 text-to-video2K, 16:9, 6s$0,84
Geleverde film14,6s, twee shots, 2560x1440, stereo-audio$2,13
Screenshot-runs voor dit artikelH3 i2v + t2v2K, 8s elk$2,24

Het is vermeldenswaard dat dezelfde twee shots als concept op 768P $0,80 en $0,60 zouden hebben gekost in plaats van $1,12 en $0,84, ongeveer 29% korting, voor beeldmateriaal waar je absoluut een take op kunt beoordelen.

Twee factureringsdetails die gemakkelijk op de dure manier te leren zijn. Een verzoek dat bij indiening wordt afgewezen kost niets, dus een 400 op een ontbrekende ratio is gratis. Een verzoek dat iets nutteloos rendert, is niet gratis: als de taak succeeded bereikt, wordt er in rekening gebracht, zelfs als de output niet is wat je wilde. Dat is het echte argument om te concepten op 768P.

Per-seconde tarieven, de 768P- en 2K-vergelijking en hoe de prijs zich gedraagt over duren, worden goed uitgelegd in de MiniMax H3 API prijzen begeleider van dit artikel. Deze is de code, die is de rekening.

Attributie en Territorium Voordat Je Publiceert

Twee dingen om te controleren voordat dit ergens openbaar gaat. MiniMax's API-voorwaarden bevatten een voorwaardelijke verdedigingsverplichting die betrekking heeft op octrooi- en auteursrechtclaims tegen API-output, en die verplichting strekt zich niet uit tot handelsmerk of gelijkenis, dus een herkenbaar logo of een echt persoon in je prompt is nog steeds jouw probleem. Afzonderlijk bevat de open-weights-licentie voor H3 een clausule over Uitgesloten Gebieden, en die clausule is van toepassing op de gedownloade gewichten en hun outputs, niet op de gehoste API, waarvan de voorwaarden een door jou te selecteren Amerikaanse serviceregio vermelden. Lees welk contract je daadwerkelijk hebt ondertekend. En label H3-output als H3-output in je UI.

MiniMax H3 Tutorial FAQ

Wat zijn de MiniMax H3-taakstatussen en is er een expired?

Vijf: queued, running, succeeded, failed, cancelled. Er is geen expired-status. Twee andere dingen verlopen wel en worden ermee verward: de download-URL in content.url is tijdgebonden en de taakrecord zelf is slechts 7 dagen opvraagbaar.

Moet ik een callback gebruiken, of is pollen prima voor MiniMax H3?

Pollen is prima en is minder code. Gebruik een callback wanneer je zoveel gelijktijdige taken hebt dat een poller per taak onzinnig is. Als je dat doet, moet het endpoint het challenge-veld binnen 3 seconden ongewijzigd terugsturen, synchroon, vóór eventuele auth-middleware. Een mislukte handshake produceert helemaal geen foutmelding, alleen permanente stilte.

Waarom geeft mijn MiniMax H3 text-to-video-verzoek een 400 met "ratio is verplicht en mag niet adaptive zijn"?

Omdat je in tekst-only modus zit, waar er geen eerste frame is om het frame van af te leiden. Geef een expliciete waarde door: 21:9, 16:9, 4:3, 1:1, 3:4 of 9:16. Dezelfde regel is waarom ratio eruitziet alsof het niets doet in image-to-video, waar het eerste frame beslist en elke door jou gestuurde ratio wordt genegeerd.

Hoeveel MiniMax H3-taken kan ik parallel uitvoeren?

De gedocumenteerde limiet is verbindingsgebaseerd: 2 gelijktijdige taken gratis, 15 betaald. Boven de limiet krijg je een onmiddellijke 429 in plaats van een wachtrijplek, dus begrens je eigen aantal in-flight-verzoeken. Routing-gateways absorberen soms meer, en ik heb 20 gelijktijdige taken allemaal voltooid gezien, maar ik ben ook op een andere dag 429'd op dezelfde opzet. Bouw geen planner die uitgaat van het hogere aantal.

Mijn MiniMax H3-video-URL geeft een 404 een dag later. Is de render weg?

Nee. De URL is verlopen, de render niet. Vraag dezelfde task_id opnieuw op en het antwoord bevat een nieuwe URL, op elk moment binnen het 7-daagse queryvenster. Na 7 dagen is de taakrecord zelf niet langer opvraagbaar, daarom persisteert Stap 2 de task_id voordat er iets anders gebeurt.

Ik heb gezocht op "hailuo ai video generator how to use" en kwam op een MiniMax H3-tutorial terecht. Ben ik op de juiste plek?

Ja. Hailuo is de consumenten-app en H3 is de modelnaam die de API gebruikt. Dezelfde engine. Als je één clip wilt, gebruik dan het playground-pad in het workflowgedeelte hierboven, geen code vereist. Als je tien varianten wilt of een eerste frame dat van een ander model wordt ingevoerd, dan zijn de zeven stappen voor jou.

Nieuwste modellen

Eén API voor alle media-AI.

Verken alle modellen