Twój pierwszy POST wrócił w dziesięć sekund z task_id. Wyglądało na sukces.
Potem przez sześć minut nic się nie działo. Skopiowałeś while status != "Success" z jakiegoś tutoriala, a pętla kręciła się w kółko, bo ten endpoint nie zwraca już słowa Success. Przerzuciłeś się więc na webhook. Nie przyszła ani jedna pushowa wiadomość, a nigdzie nie było informacji, dlaczego. Następnego ranka wróciłeś po wczorajszy render, a link zwracał 404.
Te cztery rzeczy wyglądają na niezwiązane. Żadna z nich nie jest winą modelu. Wszystkie cztery to kontrakt asynchroniczny, którego prawie nikt nie spisuje. Oto cały kontrakt, plus jeden prawdziwy dwuujęciowy film krótkometrażowy, który wyszedł na drugim końcu.
Kluczowe wnioski
- Trzy endpointy, jedna pętla: create zwraca
task_idi się rozłącza, ty odpycujesz, pobierasz. Wszystko trudne dzieje się po wywołaniu create. - Pięć rzeczywistych statusów to
queued,running,succeeded,failed,cancelled. Nie ma statusuexpired, bez względu na to, co mówi wpis na blogu. - Dwie rzeczy wygasają, a żadna z nich nie jest statusem: URL do pobrania jest ograniczony czasowo, a sam rekord zadania można odpytywać tylko przez 7 dni.
- Jeśli używasz callbacka, MiniMax najpierw wysyła żądanie weryfikacyjne z polem
challenge, a ty musisz odesłać je bez zmian w ciągu 3 sekund. Jeśli tego nie zrobisz, nie dostaniesz żadnego błędu, tylko wieczną ciszę. - W przypadku generacji tylko tekstowej,
ratiojest wymagane i nie może byćadaptive. W przypadku image-to-video, pierwsza klatka decyduje o proporcjach, a każde przekazaneratiojest ignorowane.
Najpierw gotowy efekt
Cała nagroda tego tutoriala: dwa ujęcia MiniMax H3 w 2K, połączone, 14,6 sekundy. Ujęcie A to image-to-video z wygenerowanej pierwszej klatki, ujęcie B to text-to-video. Włącz dźwięk. Audio nie jest podłożoną ścieżką dźwiękową – H3 wyrenderował tryby, deszcz i szeptaną kwestię jako część tej samej generacji.
Trzy wywołania API to umożliwiły. Jeden model obrazu dla pierwszej klatki, dwa endpointy H3 dla ujęć, jedna linijka ffmpeg do ich połączenia. Poniższy kod to kod, który to zrobił.
Dlaczego większość tutoriali MiniMax H3 psuje się przy drugim żądaniu
Prawie każdy przewodnik po tym modelu kończy się na wywołaniu create. To jest ta łatwa połowa. Wywołanie create waliduje twój ładunek, przekazuje ci task_id i się rozłącza, a potem jesteś sam z zadaniem, które trwa minuty, i zestawem reguł, których nikt nie wydrukował.
Awarie są nudno powtarzalne. W ciągu jednego popołudnia trafiłem na pięć z tych sześciu.
| Objaw | Co widzisz | Rzeczywista przyczyna | Rozwiązanie |
|---|---|---|---|
| Pętla odpytywania nigdy się nie kończy | Terminal drukuje w nieskończoność, zadanie skończyło się wieki temu | Twój warunek wyjścia porównuje się z v1 słowami jak Success / Fail. Endpoint zapytania v2 zwraca małymi literami succeeded / failed | Dopasuj do enum v2 i zgłoś błąd dla każdego nieznanego statusu |
| Natychmiastowy 400 na text-to-video | Żądanie odrzucone przed rozpoczęciem renderowania | ratio brakuje lub jest ustawione na adaptive, co tryb tylko tekstowy odrzuca | Przekaż jawny ratio, np. 16:9 |
| Twoje ratio jest po cichu ignorowane | Klatka wyjściowa nie jest tą, o którą prosiłeś | Image-to-video wyprowadza proporcje z pierwszej klatki, więc ratio jest tam bez operacji | Przytnij lub wygeneruj pierwszą klatkę w żądanych proporcjach |
| Webhook nigdy nie odpala, brak błędu | Zero pushów, czyste logi, żadnej skargi od API | Uzgodnienie weryfikacyjne nie powiodło się. MiniMax wysłał challenge, a twój endpoint nie odesłał go bez zmian w ciągu 3 sekund | Odpowiedz na challenge synchronicznie, przed jakimkolwiek middleware uwierzytelniającym lub kolejkowym |
| Wczorajszy URL 404 | Link do pobrania nie działa, render wydaje się zniknięty | URL do pobrania jest ograniczony czasowo. Render jest w porządku | Zapytaj ponownie o to samo task_id, aby uzyskać świeży URL, w ciągu 7 dni |
| Losowe 429 pod obciążeniem | Niektóre submicje odrzucone, brak kolejki | Współbieżność jest ograniczona i jest to twardy limit, a nie kolejka oczekujących | Ogranicz własną liczbę zadań w locie i ponów submicję, a nie render |
Pierwszy wiersz to ten, który pożera całe wieczory, i warto go precyzyjnie opisać. Starsze API wideo MiniMax raportowało postęp z caps lockiem w rodzinie Preparing / Queueing / Processing / Success / Fail. Endpoint zapytania v2 używany przez H3 zwraca queued, running, succeeded, failed, cancelled (MiniMax API Reference, sierpień 2026). Wiele dokumentacji zewnętrznych resellerów wciąż drukuje stare zestawy lub miesza oba na jednej stronie. Jeśli odziedziczyłeś pętlę z jednej z nich, nie może się ona zakończyć, ponieważ ciąg, na który czeka, nigdy nie jest wysyłany.
Przepływ pracy w tutorialu MiniMax H3: trzy endpointy, pięć statusów, jedna pętla
H3 został wydany 2026-07-31 jako model wideo omni-modalny: tekst, obraz, wideo i audio żyją w tym samym oknie kontekstu, wyjście do 15 sekund w 2K z natywnym stereofonicznym dźwiękiem (MarkTechPost, sierpień 2026). Dla API oznacza to jeden endpoint create z tablicą content, a to, co umieścisz w tablicy, decyduje o tym, w którym trybie jesteś.
| Tryb | Co trafia do content | rola elementu obrazu | Co robi ratio | Do czego używać |
|---|---|---|---|---|
| Text-to-video | jeden element tekstowy | brak | Wymagane, a adaptive jest odrzucane | Ujęcia bez źródłowego obrazu, pełna kontrola proporcji |
| Image-to-video | element tekstowy + obraz | first_frame (opcjonalnie także last_frame) | Ignorowane, pierwsza klatka decyduje | Animowanie statycznego, który już zaaranżowałeś |
| Reference-to-video | element tekstowy + referencja | reference_image (także reference_video, reference_audio) | Wymagane, jak dla samego tekstu | Utrzymanie jednej postaci lub jednego głosu przez ujęcia |
A część, którą twój kod faktycznie musi obsłużyć. Pięć statusów, pięć różnych gałęzi.
| Status | Co oznacza | Co robi twój kod |
|---|---|---|
| queued | Zaakceptowane, czeka na slot | Kontynuuj odpytywanie, zwolnij tempo |
| running | Renderowanie | Kontynuuj odpytywanie, zwolnij tempo |
| succeeded | Gotowe, content.url jest wypełniony | Pobierz natychmiast, w tej iteracji |
| failed | Renderowanie nie powiodło się | Przeczytaj treść błędu, zaloguj, nie próbuj ponownie ślepo tego samego ładunku |
| cancelled | Zadanie anulowane | Wyjdź z pętli, traktuj jako terminalne |
| cokolwiek innego | Nie w enum | Zgłoś błąd. Nowy status, który po cichu traktujesz jako "dalej czekaj", to błąd z tabeli powyżej |
Nie ma statusu expired. To słowo często pojawia się w kontekście tego API i dotyczy dwóch innych rzeczy: URL do pobrania, który jest ograniczony czasowo i odświeżalny, oraz rekordu zadania, który można odpytywać tylko przez ostatnie 7 dni. Oba są omówione w kroku 4.
Jeszcze jedna liczba przed kodem. Współbieżność generacji wideo na H3 jest ograniczona przez liczbę połączeń, a nie żądań na minutę: 2 równoczesne zadania na darmowym poziomie, 15 po opłaceniu (MiniMax Rate Limits, sierpień 2026). Po przekroczeniu limitu od razu dostajesz 429. Nic nie jest kolejkowane w twoim imieniu. Zdarzyło mi się przepchnąć 20 równoczesnych zadań H3 przez bramę routingu i wszystkie 20 zadziałało, a także zdarzyło mi się dostać 429 na tym samym setupie innego dnia, więc traktuj każdą liczbę powyżej udokumentowanego limitu jako pogodę, a nie stałą.
Bezpośrednio czy przez bramę
Trzy kroki są takie same w obu przypadkach, ale różnią się ciągi znaków, co ma znaczenie, gdy debugujesz o 1 w nocy.
| MiniMax bezpośrednio | Bramka zunifikowana (Atlas Cloud) | |
|---|---|---|
| Submisja | POST /v2/video_generation | POST /api/v1/model/generateVideo |
| Odpytywanie | GET /v2/query/video_generation/{task_id} | GET /api/v1/model/prediction/{id} |
| Słowa statusu | queued / running / succeeded / failed / cancelled | completed w przypadku sukcesu, failed w przypadku błędu |
| Powiadomienia pushowe | URL callback z 3-sekundowym uzgodnieniem challenge | Odpytywanie prediction id |
| Współbieżność | 2 darmowe, 15 płatne, twardy 429 | Nie publikowane jako limit per model, w praktyce mierzone szerzej |
| Model obrazu pierwszej klatki na tym samym kluczu | Nie, osobne konto | Tak, GPT Image 2 i H3 za jednym kluczem |
| Cena H3 | Publikowana według poziomu rozdzielczości | Za sekundę wyjścia, warstwami według rozdzielczości, podawana na przycisku Run przed submicją |
Powodem, dla którego uruchomiłem łańcuch tego tutoriala na bramce, jest wyłącznie przedostatni wiersz: pierwsza klatka pochodzi z modelu obrazu OpenAI, a dwa ujęcia z MiniMax, a nie chciałem dwóch dostawców, dwóch kluczy i dwóch stron rozliczeń dla jednego 14-sekundowego filmu. Jeśli już jesteś na platformie MiniMax, zostań tam, pętla poniżej działa bez zmian, poza ścieżkami i słowami statusu.
Hailuo AI Video Generator: Jak go użyć, zanim napiszesz jakikolwiek kod
Jeśli trafiłeś tutaj, szukając, jak użyć generatora wideo Hailuo AI, jesteś we właściwym miejscu i nie potrzebujesz jeszcze żadnego kodu. Hailuo to aplikacja konsumencka MiniMax, a H3 to nazwa modelu używana przez API. Ten sam silnik, inne drzwi.
Trzy minuty, żaden terminal:
- Otwórz stronę modelu, na przykład MiniMax H3 image-to-video. Playground znajduje się w prawym panelu strony.
- Wrzuć pierwszą klatkę lub przełącz na stronę text-to-video i po prostu napisz prompt. Ustaw rozdzielczość i czas trwania. Powiedz głośno, co chcesz usłyszeć, a nie tylko co chcesz zobaczyć: H3 generuje dźwięk w tym samym przebiegu, więc "deszcz uderzający w szkło, małe kliknięcia serwomechanizmów" to prawdziwa instrukcja, a nie ozdoba.
- Kliknij Run. Przycisk pokazuje dokładną opłatę za wybrane ustawienia, zanim się na nie zdecydujesz. Poczekaj, pobierz.
To cała ścieżka bez kodu, a w przypadku pojedynczych klipów jest to naprawdę szybsza opcja. W momencie, gdy potrzebujesz dziesięciu wariantów lub pierwszej klatki wygenerowanej przez inny model i wrzuconej bezpośrednio, wróć do kodu. To jest reszta tego artykułu.
Tutorial MiniMax H3: Utwórz, odpyczaj, pobierz, powtórz
Jeden przykład przechodzi przez wszystkie siedem kroków: zegarmistrz naprawia małego mosiężnego mechanicznego ptaka, szepcze mu jedną kwestię, a ptak wylatuje z warsztatu. Dwa ujęcia. Ujęcie A to image-to-video, więc wnętrze jest zaaranżowane. Ujęcie B to text-to-video, ponieważ nie ma źródłowej klatki dla nieba.
Krok 1: Wygeneruj pierwszą klatkę za pomocą GPT Image 2
Image-to-video ignoruje ratio, więc pierwsza klatka to miejsce, w którym decydujesz o proporcjach ujęcia A. Wygeneruj ją w 16:9 i w najwyższej jakości, ponieważ H3 odziedziczy każdą wadę, a potem doda rozmycie ruchu na wierzch.
Model: openai/gpt-image-2/text-to-image. Ustawienia: jakość high, 2048x1152, 16:9, PNG.
text1Zagracony warsztat zegarmistrza o zmierzchu, ciepła lampa wolframowa nad porysowanym 2dębowym stołem. Stary naprawiacz w skórzanym fartuchu pochyla się nad małym mosiężnym 3mechanicznym ptakiem spoczywającym w jego złożonych dłoniach, jego skrzydła 4półotwarte, widoczne maleńkie tryby. Deszcz smuga za oknem z kwaterami; piec węglowy 5świeci bursztynowo po lewej stronie kadru. Mała głębia ostrości, 35mm, wolumetryczny 6pył w wiązce lampy, głęboka bursztynowo-granatowa paleta, fotorealistyczny, bez tekstu. 7

Playground GPT Image 2 na Atlas Cloud z promptem pierwszej klatki i wyrenderowanym warsztatem zegarmistrza w panelu wyjściowym
GPT Image 2 na Atlas Cloud, jakość high w 2048x1152. Przycisk Run podaje dokładną opłatę za wybrane ustawienia, $0.1745 za ten jeden, zanim się na niego zdecydujesz.
Zachowaj zwrócony URL. Krok 2 podaje go bezpośrednio do H3, bez potrzeby pobierania i ponownego przesyłania.
Krok 2: Utwórz zadanie MiniMax H3 i trzymaj się task_id
Wywołanie create robi dwie rzeczy, a potem przestaje się tobą interesować: waliduje ładunek i zwraca task_id. 400 tutaj oznacza problem z ładunkiem, a nie chwilowy błąd, więc nie umieszczaj go w pętli ponawiania. Każda inna klasa problemów pojawia się później, podczas odpytywania.
Jedynym nawykiem, który oszczędza prawdziwe pieniądze, jest utrwalenie task_id, zanim zrobisz cokolwiek innego. Zadania można odpytywać tylko przez 7 dni, a jeśli twój proces umrze z identyfikatorem w pamięci, zapłaciłeś za render, do którego nie możesz już dotrzeć.
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 # twój payload jest zły. ponawianie go znowu będzie po prostu znowu błędne. 14 raise ValueError(f"odrzucone: {r.text}") 15 r.raise_for_status() 16 task_id = r.json()["task_id"] 17 with open("tasks.jsonl", "a") as f: # utrwal PRZED czymkolwiek innym 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 "Stare ręce naprawiacza uspokajają mosiężnego ptaka. Jego szklane oczy migoczą, " 24 "płytki skrzydeł otwierają się jedna po drugiej. Pochyla się i szepcze, blisko mikrofonu, " 25 "„Zobaczmy, czy wciąż pamiętasz niebo.” Powolny najazd 50mm, światło lampy przecinające " 26 "mosiądz, deszcz uderzający w okno, trzaskanie pieca węglowego, małe kliknięcia serwomechanizmów " 27 "pod jego głosem. Ciepły bursztynowy klucz, granatowe wypełnienie okna. Żadnego tekstu na ekranie." 28) 29 30shot_a = create_task({ 31 "model": "MiniMax-H3", 32 "resolution": "2K", 33 "duration": 8, 34 # celowo brak "ratio" tutaj: image-to-video bierze proporcje z pierwszej klatki 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("zadanie A:", shot_a) 42
Oto dokładnie ten prompt i pierwsza klatka działa jako zadanie, abyś mógł zobaczyć, jak wygląda zdrowa submicja z drugiej strony:

Playground MiniMax H3 image-to-video na Atlas Cloud z załadowaną pierwszą klatką warsztatu i wyrenderowanym klipem w panelu wyjściowym
MiniMax H3 image-to-video: pierwsza klatka załadowana po lewej, gotowy klip 2K w OUTPUT po prawej. Zwróć uwagę na pole Aspect Ratio ustawione na adaptive i wycenę $1.12 za 2K przy 8 sekundach.
Krok 3: Odpyczaj i obsłuż wszystkie pięć statusów MiniMax H3
To jest pętla, którą każdy myli, więc warto zapisać ją w całości. Cztery zasady: zwolnij zamiast walić, ogranicz całkowity czas oczekiwania, traktuj succeeded jako "pobierz teraz", i zgłoś błąd dla każdego statusu spoza enum.
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 jest aktywny TERAZ 16 if status in TERMINAL_BAD: 17 raise RuntimeError(f"{status}: {json.dumps(r.json())[:400]}") 18 if status not in IN_FLIGHT: 19 # status, którego nie ma w enum. NIE przechodź do "dalej czekaj". 20 raise RuntimeError(f"nieznany status {status!r} -- przeczytaj changelog") 21 22 print(f" {status} ... następna kontrola za {delay:.0f}s") 23 time.sleep(delay) 24 delay = min(delay * 1.5, 15.0) # 3s -> 15s górny limit 25 raise TimeoutError(f"{task_id} wciąż nie terminalny po {timeout_s}s") 26
Trzy rzeczy w tym są celowe:
status not in IN_FLIGHT zgłasza błąd zamiast kontynuować. Jeśli MiniMax doda szósty status w przyszłym kwartale, chcesz głośnej awarii, a nie pętli czekającej na słowo, które nigdy nie przyjdzie. Ta jedna linijka to różnica między zepsutym tutorialem a tym.
failed nie ponawia. Nieudany render zwykle oznacza, że prompt wywołał filtr lub ładunek miał złą kombinację, a wysłanie identycznego ładunku ponownie daje identyczną porażkę za pełną cenę. Zaloguj treść, spójrz na nią, potem zdecyduj.
Backoff zaczyna się od 3 sekund i kończy na 15. H3 w 2K zajmuje minuty, nie sekundy. Odpytywanie raz na sekundę po prostu spala twój limit szybkości na endpoint zapytania.
Krok 4: Pobierz, zanim wygaśnie URL
W momencie, gdy succeeded zostanie osiągnięty, strumieniuj plik na dysk. URL w content.url jest wyraźnie linkiem ograniczonym czasowo: "Pobierz lub przechowaj go niezwłocznie; zapytaj ponownie, aby uzyskać nowy URL po jego wygaśnięciu" (MiniMax API Reference, sierpień 2026). To nie jest ścieżka CDN, którą możesz wrzucić do bazy danych i zapomnieć.
Druga połowa to dobra wiadomość i jest odpowiedzią na 404, które dostałeś następnego ranka. Render nie zniknął. Zapytaj ponownie o to samo task_id, a dostaniesz świeży URL, przez okres do 7 dni od utworzenia.
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 """Martwy link? Render jest w porządku. Zapytaj ponownie, w oknie 7 dni.""" 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
To, co zwraca dla ujęcia A, obok zdjęcia, z którego powstało:

Obok siebie: wygenerowana pierwsza klatka po lewej, klatka z gotowego klipu MiniMax H3 po prawej, pokazująca otwarte płytki skrzydeł ptaka i świecące oczy
Po lewej: zdjęcie GPT Image 2 z kroku 1, dokładnie takie, jak przesłane. Po prawej: klatka pobrana z klipu 2K zwróconego przez H3. Ten sam zestaw, to samo światło, płytki skrzydeł i oczy to to, co się poruszyło.
Krok 5: Ujęcie B za pomocą MiniMax H3 text-to-video, gdzie ratio jest obowiązkowe
Brak źródłowej klatki dla nieba, więc ujęcie B jest tylko tekstowe. To odwraca regułę ratio z "ignorowane" na "wymagane": dla promptu tylko tekstowego, ratio jest wymagane i nie może być adaptive (MiniMax API Reference, sierpień 2026). Pomiń je lub wyślij adaptive, a dostaniesz natychmiast 400, zanim rozpocznie się jakiekolwiek renderowanie.
Model: minimax/h3/text-to-video. Ustawienia: 2K, duration 6, ratio 16:9.
text1Mosiężny ptak przebija się przez uchylone okno dachowe warsztatu w deszczowy wieczorny 2niebo, skrzydła biją w wirze trybów, krople spryskują metalowe pióra, gdy wspina się 3obok mokrych łupkowych dachów w kierunku przerwy w złotej chmurze. Kamera podnosi się 4za nim, 24mm, podświetlona krawędź od niskiego słońca. Dźwięk: brzęczenie serw skrzydeł, 5wzmagający się wiatr, odległy dzwon kościelny, deszcz cichnie. Żadnego tekstu. 6
python1shot_b = create_task({ 2 "model": "MiniMax-H3", 3 "resolution": "2K", 4 "duration": 6, 5 "ratio": "16:9", # wymagane tutaj. pomiń go lub przekaż "adaptive" -> 400 6 "content": [{"type": "text", "text": SHOT_B_PROMPT}], 7}) 8download(poll(shot_b)["content"]["url"], "shot-b.mp4") 9

Playground MiniMax H3 text-to-video na Atlas Cloud z promptem startu ptaka i gotowym klipem w panelu wyjściowym
MiniMax H3 text-to-video z promptem ujęcia B i Aspect Ratio ustawionym jawnie na 16:9. To uruchomienie korzystało z domyślnych 8 sekund strony, a nie z 6 w powyższym ładunku.
Krok 6: Pomiń odpytywanie za pomocą callbacka i odeślij challenge w 3 sekundy
Jeśli wolisz być informowany, a nie pytać, przekaż callback_url w wywołaniu create. Jest jeden haczyk, udokumentowany w jednym nawiasie w dokumentacji API, i jest to najczęstszy sposób, w jaki samoobsługowe callbacki zawodzą.
Zanim MiniMax wyśle ci cokolwiek, wysyła żądanie weryfikacyjne zawierające pole challenge i "musisz zwrócić challenge bez zmian w ciągu 3 sekund, aby zakończyć weryfikację" (MiniMax API Reference, sierpień 2026). Jeśli tego nie zrobisz, nigdzie nie ma błędu. Twoje wywołania create nadal działają, rendery nadal się kończą, a ty po prostu nigdy nie dostajesz pusha. Nic w żadnym logu nie mówi, dlaczego.
Dwanaście linii FastAPI, a kolejność w nich to cały 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: # uzgodnienie weryfikacyjne, odpowiedz NAJPIERW 9 return {"challenge": body["challenge"]} # bez zmian, synchronicznie, bez bramy uwierzytelniania 10 task_id = body.get("task_id") 11 status = body.get("status") 12 enqueue(task_id, status) # prawdziwe powiadomienie: przekaż, zwróć szybko 13 return {"ok": True} 14
Błędy, które go zabijają, w kolejności, jak często je widziałem:
- Żądanie challenge przechodzi przez twój middleware uwierzytelniający i dostaje 401 lub przekierowanie. Weryfikacja jest z definicji nieuwierzytelniona. Biała lista ścieżki.
- Handler przekazuje challenge do kolejki i odpowiada asynchronicznie. Za późno. Ta odpowiedź musi być w treści odpowiedzi tego żądania.
- Wartość jest ponownie serializowana, przycinana lub zawijana. Odeślij ją bajt po bajcie.
- Testujesz przez tunel przeciwko serwerowi deweloperskiemu bezstanowemu, a sam zimny start przekracza 3 sekundy. Najpierw go rozgrzej lub zweryfikuj przeciwko procesowi, który już działa.
Odpytywanie jest całkowicie w porządku, nawiasem mówiąc. Jeśli masz kilka zadań na godzinę, pętla w kroku 3 to mniej kodu i mniej do zepsucia. Callback opłaca się, gdy masz wiele zadań i nie chcesz mieć osobnego odpytywacza na każde zadanie.
Krok 7: Połącz dwa ujęcia w jeden film
Oba ujęcia wróciły jako 2560x1440 h264 przy 24fps z AAC stereo audio przy 32kHz. Ten sam kontener, wszystko to samo, więc jest to kopia strumienia, a nie ponowne kodowanie. Bez utraty jakości, bez czekania.
Jedna mała niespodzianka, którą warto przewidzieć: prosząc o 6 sekund, dostałem plik 6,58 sekundy. Czas trwania wraca zbliżony do tego, o co prosiłeś, ale nie dokładnie co do klatki, więc dwa ujęcia sumują się do 14,62 sekundy, a nie do czystych 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
To wyjście to film na górze tego artykułu. Jeśli -c copy narzeka, twoje dwa ujęcia mają różne rozdzielczości lub liczbę klatek, co na H3 oznacza, że zmieniłeś resolution między wywołaniami. Dopasuj je lub porzuć -c copy i zaakceptuj jednokrotne ponowne kodowanie.
Warianty tutoriala MiniMax H3 warte ukradnięcia
Pięć rzeczy, które warto wypróbować, gdy pętla powyżej działa, w przybliżonej kolejności, ile pieniędzy ci oszczędzają.
Szkic w 768P, finalizacja w 2K. Oba poziomy to ten sam model, a 768P kosztuje około 29% mniej za sekundę. Renderuj swoje kandydatury krótko i tanio, obejrzyj je, a następnie uruchom ponownie tylko zwycięzcę w 2K z tym samym promptem. Tu leży większość oszczędności na liście ujęć. Który poziom faktycznie potrzebujesz do dostawy, to osobna dyskusja, którą przeprowadziłem w 768P vs 2K.
Czas trwania to każda liczba całkowita od 4 do 15. Nie zestaw presetów. Jeśli akcja kończy się w 7 sekund, poproś o 7 i przestań płacić za 8.
Pierwsza klatka plus ostatnia. Wyślij drugi element obrazu z role: "last_frame", a H3 zbuduje przejście między nimi. Przydatne do przejść między ujęciami, które już zaaranżowałeś.
Reference-to-video dla ciągłości. role: "reference_image" utrzymuje postać przez ujęcia, zamiast ponownie losować jej twarz przy każdej generacji. Istnieje odpowiadająca rola reference_audio z oknem od 2 do 15 sekund dla klipu referencyjnego, co pozwala utrzymać spójny głos. Zobacz reference-to-video.
Pionowa mówiąca głowa. ratio: "9:16" z kwestią dialogową w prompcie to obecnie największy wolumen użycia tego modelu, ponieważ dźwięk pochodzi z tego samego przebiegu, a usta pasują bez osobnego kroku lip-sync.
Umiejętność tworzenia promptów to osobna umiejętność od hydrauliki asynchronicznej, a jeśli twoje ujęcia są technicznie czyste, ale wizualnie płaskie, problem leży wyżej niż ten artykuł. Zacznij od przewodnika po promptach H3.
Ile kosztowało uruchomienie tego tutoriala MiniMax H3
Rzeczywiste pozycje z uruchomienia, które wyprodukowało film na górze, podane przez przycisk Run i zweryfikowane 2026-08-12. H3 rozlicza za sekundę wyjścia, a stawka jest warstwowa według rozdzielczości: zadania 2K wycenione na $1.12 za 8 sekund, czyli $0.14 za sekundę, a stawka początkowa katalogu $0.10 to poziom 768P. Wszystkie trzy endpointy H3 są teraz w pełnej cenie, bez żadnego rabatu.
| Krok | Model | Ustawienia | Opłata |
|---|---|---|---|
| Pierwsza klatka | GPT Image 2 text-to-image | jakość high, 2048x1152 | $0.1745 |
| Ujęcie A | H3 image-to-video | 2K, 8s | $1.12 |
| Ujęcie B | H3 text-to-video | 2K, 16:9, 6s | $0.84 |
| Dostarczony film | 14.6s, dwa ujęcia, 2560x1440, dźwięk stereo | $2.13 | |
| Zrzuty ekranu do tego artykułu | H3 i2v + t2v | 2K, 8s każde | $2.24 |
Warto zauważyć, że te same dwa ujęcia naszkicowane w 768P kosztowałyby $0.80 i $0.60 zamiast $1.12 i $0.84, około 29% mniej, za materiał, na którym absolutnie możesz ocenić ujęcie.
Dwa szczegóły rozliczeniowe, których łatwo nauczyć się na kosztowny sposób. Żądanie odrzucone przy submicji nic nie kosztuje, więc 400 z powodu brakującego ratio jest darmowe. Żądanie, które renderuje coś bezużytecznego, nie jest darmowe: jeśli zadanie osiągnie succeeded, jesteś obciążany, nawet jeśli wynik nie jest tym, czego chciałeś. To jest prawdziwy argument za szkicowaniem w 768P.
Stawki za sekundę, porównanie 768P i 2K oraz jak opłata zachowuje się w różnych czasach trwania, są szczegółowo omówione w cenach API MiniMax H3 towarzyszącym temu artykułowi. Ten jest o kodzie, tamten o rachunku.
Autorstwo i terytorium przed wysłaniem
Dwie rzeczy do sprawdzenia, zanim to trafi gdziekolwiek publicznie. Warunki API MiniMax zawierają warunkowe zobowiązanie do obrony obejmujące roszczenia patentowe i prawa autorskie dotyczące wyników API, a to zobowiązanie nie obejmuje znaków towarowych ani wizerunku, więc rozpoznawalne logo lub prawdziwa osoba w twoim prompcie to nadal twój problem. Osobno, licencja open-weights dla H3 zawiera klauzulę wykluczonych terytoriów, która dotyczy pobranych wag i ich wyników, a nie hostowanego API, którego warunki określają region usługi w USA, który możesz wybrać. Przeczytaj umowę, którą faktycznie podpisałeś. Oznacz wynik H3 jako wynik H3 w swoim interfejsie.
FAQ tutoriala MiniMax H3
Jakie są statusy zadań MiniMax H3 i czy istnieje expired?
Pięć: queued, running, succeeded, failed, cancelled. Nie ma statusu expired. Dwie inne rzeczy wygasają i są z nim mylone: URL do pobrania w content.url jest ograniczony czasowo, a sam rekord zadania można odpytywać tylko przez ostatnie 7 dni.
Czy muszę używać callbacka, czy odpytywanie jest w porządku dla MiniMax H3?
Odpytywanie jest w porządku i wymaga mniej kodu. Użyj callbacka, gdy masz wystarczająco dużo równoczesnych zadań, aby odpytywacz na zadanie był głupi. Jeśli tak, endpoint musi odesłać pole challenge bez zmian w ciągu 3 sekund, synchronicznie, przed jakimkolwiek middleware uwierzytelniającym. Nieudane uzgodnienie nie generuje żadnego komunikatu o błędzie, tylko wieczną ciszę.
Dlaczego moje żądanie MiniMax H3 text-to-video dostaje 400 z "ratio is required and cannot be adaptive"?
Ponieważ jesteś w trybie tylko tekstowym, gdzie nie ma pierwszej klatki, z której można wywnioskować proporcje. Przekaż jawną wartość: 21:9, 16:9, 4:3, 1:1, 3:4 lub 9:16. Ta sama reguła jest powodem, dla którego ratio wygląda, jakby nic nie robiło w image-to-video, gdzie pierwsza klatka decyduje, a każde przekazane ratio jest ignorowane.
Ile zadań MiniMax H3 mogę uruchomić równolegle?
Udokumentowany limit opiera się na połączeniach: 2 równoczesne zadania za darmo, 15 po opłaceniu. Po przekroczeniu limitu dostajesz natychmiast 429, a nie miejsce w kolejce, więc ogranicz własną liczbę zadań w locie. Bramy routingu czasami absorbują więcej, a zdarzyło mi się, że 20 równoczesnych zadań wszystkie się zakończyły, ale zdarzyło mi się też dostać 429 na tym samym setupie innego dnia. Nie buduj harmonogramu zakładającego wyższą liczbę.
Mój adres URL wideo MiniMax H3 zwraca 404 dzień później. Czy render zniknął?
Nie. URL wygasł, render nie zniknął. Zapytaj ponownie o to samo task_id, a odpowiedź przyniesie świeży URL, w dowolnym momencie w oknie 7 dni. Po 7 dniach sam rekord zadania nie jest już możliwy do odpytywania, dlatego krok 2 utrwala task_id przed zrobieniem czegokolwiek innego.
Szukałem "hailuo ai video generator how to use" i trafiłem na tutorial MiniMax H3. Czy jestem we właściwym miejscu?
Tak. Hailuo to aplikacja konsumencka, a H3 to nazwa modelu używana przez API. Ten sam silnik. Jeśli chcesz jeden klip, użyj ścieżki playground w sekcji przepływu pracy powyżej, bez kodu. Jeśli chcesz dziesięć wariantów lub pierwszą klatkę wpiętą z innego modelu, siedem kroków jest dla ciebie.






