첫 번째 POST가 10초 만에 task_id를 반환했습니다. 승리처럼 보였습니다.
그런 다음 6분 동안 아무 일도 일어나지 않았습니다. 어떤 튜토리얼에서 while status != "Success"를 복사해 왔고, 루프는 계속 돌기만 했습니다. 이 엔드포인트는 더 이상 Success라는 단어를 반환하지 않기 때문입니다. 그래서 웹훅으로 전환했습니다. 단 하나의 푸시도 도착하지 않았고, 아무 곳에서도 그 이유를 알려주지 않았습니다. 다음 날 아침 어제의 렌더링을 확인하러 갔더니 링크가 404를 반환했습니다.
이 네 가지는 서로 관련이 없어 보입니다. 그 중 어느 것도 모델의 잘못이 아닙니다. 네 가지 모두 비동기 계약의 문제이며, 거의 아무도 이를 문서화하지 않습니다. 다음은 전체 계약과 그 결과로 나온 실제 2-shot 단편 영화 하나입니다.
핵심 요약
- 세 개의 엔드포인트, 하나의 루프: create는
task_id를 반환하고 연결을 끊습니다. 폴링하고 다운로드합니다. 모든 어려운 작업은 create 호출 이후에 발생합니다. - 실제 다섯 가지 상태는
queued,running,succeeded,failed,cancelled입니다. 블로그 게시물에서 무엇을 말하든expired상태는 없습니다. - 만료되는 것은 두 가지이며, 어느 것도 상태가 아닙니다: 다운로드 URL은 시간 제한이 있고, 작업 레코드 자체는 7일 동안만 조회 가능합니다.
- 콜백을 사용하는 경우 MiniMax가 먼저
challenge필드가 포함된 확인 요청을 보내며, 3초 이내에 변경 없이 다시 보내야 합니다. 실패하면 오류 없이 영원히 침묵만 유지됩니다. - 텍스트 전용 생성의 경우
ratio는 필수이며adaptive일 수 없습니다. 이미지-투-비디오의 경우 첫 번째 프레임이 프레임을 결정하며, 전달하는ratio는 무시됩니다.
먼저 완성된 결과물
이 튜토리얼의 전체 성과: 두 개의 MiniMax H3 샷을 2K로 연결, 14.6초. 샷 A는 생성된 첫 번째 프레임에서 이미지-투-비디오, 샷 B는 텍스트-투-비디오입니다. 사운드를 켜세요. 오디오는 위에 덧씌운 사운드트랙이 아닙니다. H3가 기어, 빗소리, 속삭임을 동일한 생성의 일부로 렌더링했습니다.
세 번의 API 호출로 만들어졌습니다. 첫 번째 프레임을 위한 이미지 모델 하나, 샷을 위한 두 개의 H3 엔드포인트, 연결을 위한 하나의 ffmpeg 명령어. 아래 코드는 이를 만든 코드입니다.
대부분의 MiniMax H3 튜토리얼이 두 번째 요청에서 실패하는 이유
이 모델에 대한 거의 모든 가이드는 create 호출에서 멈춥니다. 그것은 쉬운 절반입니다. create 호출은 페이로드를 검증하고 task_id를 건네준 후 연결을 끊습니다. 그러면 당신은 몇 분이 걸리는 작업과 아무도 인쇄하지 않은 규칙 집합과 함께 혼자 남겨집니다.
실패는 지루할 정도로 반복적입니다. 저는 이 여섯 가지 중 다섯 가지를 한 오후에 겪었습니다.
| 증상 | 보이는 것 | 실제 원인 | 수정 방법 |
|---|---|---|---|
| 폴링 루프가 종료되지 않음 | 터미널이 영원히 출력, 작업은 이미 오래 전에 완료 | 종료 조건이 v1 단어(Success/Fail)와 비교됨. v2 쿼리 엔드포인트는 소문자 succeeded/failed 반환 | v2 열거형과 일치시키고, 인식하지 못하는 상태는 예외 발생 |
| 텍스트-투-비디오에서 즉시 400 | 렌더링 시작 전에 요청 거부 | ratio가 누락되었거나 adaptive로 설정됨. 텍스트 전용 모드는 이를 거부 | 16:9와 같은 명시적인 ratio 전달 |
| ratio가 조용히 무시됨 | 출력 프레임이 요청한 것과 다름 | 이미지-투-비디오는 첫 번째 프레임 이미지에서 프레임을 파생하므로 ratio는 무의미 | 원하는 프레임으로 첫 번째 프레임을 자르거나 생성 |
| 웹훅이 절대 실행되지 않음, 오류 없음 | 푸시 제로, 깨끗한 로그, API로부터 불만 없음 | 확인 핸드셰이크 실패. MiniMax가 challenge를 보냈고 엔드포인트가 3초 이내에 변경 없이 다시 보내지 않음 | 인증 또는 큐 미들웨어보다 먼저 동기식으로 challenge에 응답 |
| 어제의 URL이 404 | 다운로드 링크 작동 안 함, 렌더링이 사라진 것 같음 | 다운로드 URL에 시간 제한이 있음. 렌더링은 정상임 | 7일 이내에 동일한 task_id를 다시 쿼리하여 새 URL 획득 |
| 부하 시 무작위 429 | 일부 제출 거부, 큐 없음 | 동시성에 상한이 있으며, 대기 줄이 아닌 하드 상한임 | 자신의 진행 중인 요청 수를 제한하고 렌더링이 아닌 제출을 재시도 |
첫 번째 행은 저녁 전체를 잡아먹는 경우이며, 정확히 이해하는 것이 중요합니다. MiniMax의 이전 비디오 API는 Preparing / Queueing / Processing / Success / Fail 계열의 대문자 단어로 진행 상황을 보고했습니다. H3에서 사용하는 v2 쿼리 엔드포인트는 queued, running, succeeded, failed, cancelled를 반환합니다(MiniMax API 참조, 2026년 8월). 많은 타사 리셀러 문서는 여전히 이전 집합을 인쇄하거나 한 페이지에 둘을 혼합합니다. 그러한 것 중 하나에서 루프를 상속받았다면, 기다리는 문자열이 절대 전송되지 않기 때문에 종료할 수 없습니다.
MiniMax H3 튜토리얼 워크플로우: 세 개의 엔드포인트, 다섯 가지 상태, 하나의 루프
H3는 2026-07-31에 옴니모달 비디오 모델로 출시되었습니다: 텍스트, 이미지, 비디오 및 오디오가 모두 동일한 컨텍스트 창에 있으며, 기본 스테레오 오디오로 최대 15초 2K를 출력합니다(MarkTechPost, 2026년 8월). API의 경우 하나의 create 엔드포인트에 content 배열이 있으며, 배열에 넣는 내용에 따라 사용 중인 모드가 결정됩니다.
| 모드 | content에 들어가는 것 | 이미지 항목의 역할 | ratio의 역할 | 용도 |
|---|---|---|---|---|
| Text-to-video | 텍스트 항목 하나 | 없음 | 필수, adaptive는 거부됨 | 소스 이미지가 없는 샷, 프레임에 대한 완전한 제어 |
| Image-to-video | 텍스트 항목 + 이미지 항목 | first_frame (선택적으로 last_frame도 가능) | 무시됨, 첫 번째 프레임이 결정함 | 이미 아트 디렉션한 스틸을 애니메이션화 |
| Reference-to-video | 텍스트 항목 + 참조 항목 | reference_image (reference_video, reference_audio도 가능) | 필수, 텍스트 전용과 동일 | 샷 간에 하나의 캐릭터 또는 목소리 유지 |
그리고 코드가 실제로 처리해야 하는 부분입니다. 다섯 가지 상태, 다섯 가지 다른 분기.
| 상태 | 의미 | 코드가 수행하는 작업 |
|---|---|---|
| queued | 수락됨, 슬롯 대기 중 | 계속 폴링, 백오프 |
| running | 렌더링 중 | 계속 폴링, 백오프 |
| succeeded | 완료됨, content.url이 채워짐 | 즉시 다운로드, 이 반복에서 |
| failed | 렌더링 실패 | 오류 본문을 읽고 기록, 동일한 페이로드를 무턱대고 재시도하지 않음 |
| cancelled | 작업이 취소됨 | 루프 종료, 터미널로 처리 |
| 다른 모든 것 | 열거형에 없음 | 예외 발생. 새로운 상태를 조용히 "계속 기다림"으로 처리하는 것은 위 표의 버그입니다. |
expired 상태는 없습니다. 이 단어는 이 API에 자주 붙지만 실제로는 두 가지 다른 것에 속합니다: 다운로드 URL(시간 제한이 있고 새로 고칠 수 있음)과 작업 레코드(지난 7일 동안만 조회 가능). 둘 다 4단계에서 다룹니다.
코드 전에 한 가지 더 숫자입니다. H3의 비디오 생성 동시성은 분당 요청 수가 아닌 연결 수로 제한됩니다: 무료 등급에서 동시 작업 2개, 유료 시 15개(MiniMax 속도 제한, 2026년 8월). 상한을 초과하면 즉시 429가 발생합니다. 대신 큐에 넣어주지 않습니다. 또한 라우팅 게이트웨이를 통해 20개의 동시 H3 작업을 푸시하여 모두 성공한 적도 있고, 다른 날에는 동일한 설정에서 429가 발생한 적도 있으므로 문서화된 상한 이상의 숫자는 상수가 아닌 날씨로 취급하십시오.
직접 또는 게이트웨이를 통해
세 단계는 어느 쪽이든 동일하지만 문자열이 다르며, 이는 새벽 1시에 디버깅할 때 중요합니다.
| MiniMax 직접 | 통합 게이트웨이 (Atlas Cloud) | |
|---|---|---|
| 제출 | POST /v2/video_generation | POST /api/v1/model/generateVideo |
| 폴링 | GET /v2/query/video_generation/{task_id} | GET /api/v1/model/prediction/{id} |
| 상태 단어 | queued / running / succeeded / failed / cancelled | 성공 시 completed, 실패 시 failed |
| 푸시 알림 | 3초 challenge 핸드셰이크가 있는 콜백 URL | prediction id 폴링 |
| 동시성 | 무료 2, 유료 15, 하드 429 | 모델별 상한으로 게시되지 않음, 실제로는 더 넓게 측정됨 |
| 동일 키의 첫 번째 프레임 이미지 모델 | 아니요, 별도 계정 | 예, GPT Image 2와 H3가 하나의 키 뒤에 있음 |
| H3 가격 | 해상도별로 게시됨 | 출력 초당, 해상도별 차등, 제출 전에 실행 버튼에 견적 표시 |
이 튜토리얼의 체인을 게이트웨이에서 실행한 이유는 순전히 두 번째에서 마지막 행 때문입니다: 첫 번째 프레임은 OpenAI 이미지 모델에서, 두 샷은 MiniMax에서 가져오는데, 하나의 14초 영화를 위해 두 개의 공급업체, 두 개의 키, 두 개의 청구 페이지를 원하지 않았습니다. 이미 MiniMax 플랫폼 내에 있다면 그곳에 머무르십시오. 아래 루프는 경로와 상태 단어만 변경하면 그대로 작동합니다.
Hailuo AI 비디오 생성기: 코드를 작성하기 전에 사용하는 방법
Hailuo AI 비디오 생성기 사용 방법을 검색하다가 여기에 오셨다면, 올바른 위치에 있으며 아직 코드가 필요하지 않습니다. Hailuo는 MiniMax의 소비자용 앱이고 H3는 API가 사용하는 모델 이름입니다. 동일한 엔진, 다른 문입니다.
3분, 터미널 없음:
- 모델 페이지(예: MiniMax H3 이미지-투-비디오)를 엽니다. 플레이그라운드는 페이지 오른쪽 패널입니다.
- 첫 번째 프레임 이미지를 드롭하거나 텍스트-투-비디오 페이지로 전환하여 프롬프트만 작성합니다. 해상도와 지속 시간을 설정합니다. 보고 싶은 것뿐만 아니라 듣고 싶은 것도 큰 소리로 말하세요. H3는 동일한 패스에서 오디오를 생성하므로 "유리에 빗방울, 작은 서보 클릭"은 실제 명령이지 장식이 아닙니다.
- 실행을 누릅니다. 버튼은 선택한 설정에 대한 정확한 요금을 약속하기 전에 표시합니다. 기다렸다가 다운로드합니다.
이것이 전체 코드 없는 경로이며, 일회성 클립의 경우 확실히 더 빠른 옵션입니다. 열 가지 변형을 원하거나 다른 모델에서 생성된 첫 번째 프레임을 바로 주입하려는 경우 코드로 돌아오십시오. 이것이 나머지 내용입니다.
MiniMax H3 튜토리얼: 생성, 폴링, 다운로드, 반복
하나의 예제가 일곱 단계를 모두 실행합니다: 시계 제작자가 작은 황동 기계 새를 수리하고, 한 마디를 속삭인 다음 새가 작업장 밖으로 날아갑니다. 두 개의 샷. 샷 A는 이미지-투-비디오이므로 내부가 아트 디렉션되었습니다. 샷 B는 텍스트-투-비디오입니다. 하늘에 대한 소스 프레임이 없기 때문입니다.
1단계: GPT Image 2로 첫 번째 프레임 생성
이미지-투-비디오는 ratio를 무시하므로 첫 번째 프레임이 샷 A의 프레임을 결정하는 곳입니다. 16:9 및 최고 품질 등급으로 생성하십시오. H3는 모든 결함을 상속한 다음 모션 블러를 추가하기 때문입니다.
모델: openai/gpt-image-2/text-to-image. 설정: 품질 high, 2048x1152, 16:9, PNG.
text1해질녘 어수선한 시계 제작자의 작업장, 흠집난 오크 벤치 위의 따뜻한 텅스텐 램프. 2가죽 앞치마를 입은 나이든 수리공이 두 손에 감싸 쥔 작은 황동 기계 새에 가까이 기대고 있습니다. 3새의 날개판이 반쯤 열려 있고 작은 기어가 보입니다. 빗줄기가 그 뒤의 멀리언 창문을 타고 흐릅니다. 4석탄 난로가 프레임 왼쪽에서 호박색으로 빛납니다. 얕은 피사계 심도, 35mm, 램프 빛 속의 체적 먼지, 5깊은 호박색과 청록색 팔레트, 포토리얼리스틱, 텍스트 없음. 6

Atlas Cloud의 GPT Image 2 플레이그라운드, 이 튜토리얼의 첫 번째 프레임 프롬프트와 출력 패널에 렌더링된 시계 제작자 작업장
Atlas Cloud의 GPT Image 2, 2048x1152에서 품질 high. 실행 버튼은 선택한 설정에 대한 정확한 요금($0.1745)을 약속하기 전에 표시합니다.
반환된 URL을 보관하십시오. 2단계에서 다운로드 왕복 없이 바로 H3에 공급합니다.
2단계: MiniMax H3 작업 생성 및 task_id 보관
create 호출은 두 가지 작업을 수행한 후 더 이상 신경 쓰지 않습니다: 페이로드를 검증하고 task_id를 반환합니다. 여기서 400이 발생하면 일시적인 오류가 아닌 페이로드 문제이므로 재시도 루프 뒤에 두지 마십시오. 다른 모든 종류의 문제는 나중에 폴링 중에 나타납니다.
실제 비용을 절약하는 한 가지 습관: 다른 작업을 수행하기 전에 task_id를 영구 저장하십시오. 작업은 7일 동안만 조회 가능하며, 프로세스가 메모리에서 id를 잃어버리면 더 이상 접근할 수 없는 렌더링 비용을 지불하게 됩니다.
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 # 페이로드가 잘못되었습니다. 다시 시도해도 또 틀릴 뿐입니다. 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: # 다른 작업보다 먼저 영구 저장 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 "늙은 수리공의 손이 황동 새를 안정시킵니다. 새의 유리 눈이 깜빡이며 켜지고, " 24 "날개판이 하나씩 딸깍거리며 열립니다. 그는 가까이 다가가 마이크 가까이에서 속삭입니다. " 25 ""네가 아직 하늘을 기억하는지 한번 보자." 느린 50mm 푸시인, 램프 빛이 황동 위를 비스듬히 비추고, " 26 "빗방울이 창문을 두드리고, 석탄 난로가 지글거리며, 그의 목소리 아래에서 작은 서보 클릭 소리가 납니다. " 27 "따뜻한 호박색 키, 청록색 창문 필. 화면상 텍스트 없음." 28) 29 30shot_a = create_task({ 31 "model": "MiniMax-H3", 32 "resolution": "2K", 33 "duration": 8, 34 # 여기에 "ratio"가 없는 것은 의도적입니다: 이미지-투-비디오는 첫 번째 프레임에서 프레임을 가져옵니다. 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
다음은 해당 프롬프트와 첫 번째 프레임이 작업으로 실행되는 모습입니다. 정상적인 제출이 다른 쪽에서 어떻게 보이는지 확인할 수 있습니다.

Atlas Cloud의 MiniMax H3 이미지-투-비디오 플레이그라운드, 작업장 첫 번째 프레임이 로드되고 출력 패널에 렌더링된 클립
MiniMax H3 이미지-투-비디오: 왼쪽에 로드된 첫 번째 프레임, 오른쪽에 완성된 2K 클립. Aspect Ratio 필드가 adaptive로 고정되어 있고, 2K 8초에 대해 $1.12 견적이 표시됩니다.
3단계: 폴링 및 모든 5가지 MiniMax H3 상태 처리
모두가 잘못 이해하는 루프이므로 전체를 작성할 가치가 있습니다. 네 가지 규칙: 망치질 대신 백오프, 총 대기 시간 제한, succeeded를 "지금 다운로드"로 처리, 열거형에 없는 상태는 예외 발생.
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이 지금 활성 상태입니다. 16 if status in TERMINAL_BAD: 17 raise RuntimeError(f"{status}: {json.dumps(r.json())[:400]}") 18 if status not in IN_FLIGHT: 19 # 열거형에 없는 상태입니다. "계속 기다림"으로 빠져나가지 마십시오. 20 raise RuntimeError(f"unknown status {status!r} -- read the changelog") 21 22 print(f" {status} ... next check in {delay:.0f}s") 23 time.sleep(delay) 24 delay = min(delay * 1.5, 15.0) # 3초 -> 15초 상한 25 raise TimeoutError(f"{task_id} still not terminal after {timeout_s}s") 26
의도적으로 포함된 세 가지 사항:
status not in IN_FLIGHT는 계속 진행하는 대신 예외를 발생시킵니다. MiniMax가 다음 분기에 여섯 번째 상태를 추가하면 절대 오지 않는 단어를 기다리는 루프가 아닌 큰 충돌을 원합니다. 이 한 줄이 잘못된 튜토리얼과 이 튜토리얼의 차이입니다.
failed는 재시도하지 않습니다. 실패한 렌더링은 일반적으로 프롬프트가 필터를 트리거했거나 페이로드에 잘못된 조합이 있었음을 의미하며, 동일한 페이로드를 다시 발사하면 전액을 지불하고 동일한 실패를 얻게 됩니다. 본문을 기록하고 살펴본 다음 결정하십시오.
백오프는 3초에서 시작하여 15초에 도달합니다. 2K의 H3는 몇 초가 아닌 몇 분이 걸립니다. 초당 한 번 폴링하면 쿼리 엔드포인트의 속도 제한만 소모됩니다.
4단계: URL이 만료되기 전에 다운로드
succeeded가 도착하는 즉시 파일을 디스크로 스트리밍하십시오. content.url의 URL은 명시적으로 시간 제한이 있는 링크입니다: "즉시 다운로드하거나 저장하십시오. 만료된 후 새 URL을 얻으려면 다시 쿼리하십시오" (MiniMax API 참조, 2026년 8월). 데이터베이스에 넣고 잊어버릴 수 있는 CDN 경로가 아닙니다.
두 번째 부분이 좋은 소식이며, 다음 날 아침에 404를 받은 것에 대한 답변입니다. 렌더링이 사라진 것이 아닙니다. 동일한 task_id를 다시 쿼리하면 생성 후 최대 7일 동안 새 URL을 얻을 수 있습니다.
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 """죽은 링크? 렌더링은 괜찮습니다. 7일 이내에 다시 물어보십시오.""" 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
샷 A에 대해 반환된 결과, 시작된 스틸 옆에:

나란히: 왼쪽은 1단계에서 생성된 첫 번째 프레임, 오른쪽은 완성된 MiniMax H3 클립의 프레임으로 새의 날개판이 열리고 눈이 켜진 모습
왼쪽: 제출된 그대로의 GPT Image 2 스틸. 오른쪽: H3가 반환한 2K 클립에서 가져온 프레임. 동일한 세트, 동일한 조명, 움직인 것은 날개판과 눈입니다.
5단계: ratio가 필수인 MiniMax H3 텍스트-투-비디오로 샷 B
하늘에 대한 소스 프레임이 없으므로 샷 B는 텍스트 전용입니다. 이는 ratio 규칙을 "무시됨"에서 "필수"로 바꿉니다: 텍스트 전용 프롬프트의 경우 ratio는 필수이며 adaptive일 수 없습니다(MiniMax API 참조, 2026년 8월). 생략하거나 adaptive를 보내면 렌더링이 시작되기 전에 즉시 400이 발생합니다.
모델: minimax/h3/text-to-video. 설정: 2K, 지속 시간 6, 비율 16:9.
text1황동 새가 반쯤 열린 작업장 채광창을 뚫고 빗에 씻긴 저녁 하늘로 폭발합니다. 2날개가 기어의 윙윙거리는 소리와 함께 펄럭이고, 물방울이 금속 깃털에서 튀어 오르며 3젖은 슬레이트 지붕 위로 낮은 태양의 금빛 구름 틈을 향해 올라갑니다. 4카메라가 뒤에서 크레인 업, 24mm, 낮은 태양의 역광 윤곽. 사운드: 날개 서보 윙윙, 바람 상승, 5먼 교회 종, 빗소리 사라짐. 텍스트 없음. 6
python1shot_b = create_task({ 2 "model": "MiniMax-H3", 3 "resolution": "2K", 4 "duration": 6, 5 "ratio": "16:9", # 여기서 필수입니다. 생략하거나 "adaptive"를 전달하면 400이 발생합니다. 6 "content": [{"type": "text", "text": SHOT_B_PROMPT}], 7}) 8download(poll(shot_b)["content"]["url"], "shot-b.mp4") 9

MiniMax H3 텍스트-투-비디오 플레이그라운드, 새가 날아오르는 프롬프트와 출력 패널의 완성된 클립
MiniMax H3 텍스트-투-비디오, 샷 B의 프롬프트와 Aspect Ratio가 명시적으로 16:9로 설정됨. 이 실행은 위 페이로드의 6초 대신 페이지의 기본값인 8초를 사용했습니다.
6단계: 콜백으로 폴링 건너뛰기 및 3초 이내에 challenge 응답
묻는 것보다 알림을 받는 것을 선호한다면 create 호출에 callback_url을 전달하십시오. 정확히 한 가지 주의할 점이 있으며, API 참조의 한 괄호 안에 문서화되어 있으며, 자체 호스팅 콜백이 실패하는 가장 일반적인 방식입니다.
MiniMax가 푸시하기 전에 challenge 필드가 포함된 확인 요청을 보내며, "확인을 완료하려면 3초 이내에 challenge를 변경 없이 반환해야 합니다"(MiniMax API 참조, 2026년 8월). 놓치면 어디에도 오류가 없습니다. create 호출은 계속 성공하고, 렌더링은 계속 완료되며, 푸시를 절대 받지 못합니다. 어떤 로그에도 이유가 표시되지 않습니다.
FastAPI 12줄, 그 안의 순서가 핵심입니다:
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: # 확인 핸드셰이크, 먼저 응답합니다. 9 return {"challenge": body["challenge"]} # 변경 없음, 동기식, 인증 게이트 없음 10 task_id = body.get("task_id") 11 status = body.get("status") 12 enqueue(task_id, status) # 실제 알림: 넘겨주고 빠르게 반환 13 return {"ok": True} 14
이를 망가뜨리는 실수, 내가 본 빈도 순:
- challenge 요청이 인증 미들웨어를 통과하여 401 또는 리디렉션을 받습니다. 확인은 정의상 인증되지 않습니다. 경로를 허용 목록에 추가하십시오.
- 핸들러가 challenge를 큐에 푸시하고 비동기식으로 응답합니다. 너무 늦습니다. 해당 응답은 해당 요청의 응답 본문에 있어야 합니다.
- 값이 다시 직렬화되거나, 트리밍되거나, 래핑됩니다. 바이트 단위로 그대로 에코하십시오.
- 터널을 통해 서버리스 개발 서버에서 테스트 중이며, 콜드 스타트만으로 3초가 넘습니다. 먼저 워밍업하거나 이미 실행 중인 프로세스에 대해 확인하십시오.
그런데 폴링은 완전히 괜찮습니다. 시간당 소수의 작업이 있는 경우 3단계의 루프가 코드가 적고 깨질 것도 적습니다. 콜백은 작업이 많고 작업당 폴러를 원하지 않을 때 유용합니다.
7단계: 두 샷을 하나의 영화로 연결
두 샷 모두 2560x1440 h264, 24fps, AAC 스테레오 오디오 32kHz로 반환되었습니다. 동일한 컨테이너, 동일한 모든 것이므로 스트림 복사이지 재인코딩이 아닙니다. 품질 손실 없음, 대기 시간 없음.
예상할 수 있는 한 가지 작은 놀라움: 6초를 요청했지만 6.58초 파일을 받았습니다. 지속 시간은 요청한 것에 가깝게 반환되지만 프레임 단위로 정확하지는 않으므로 두 샷은 깔끔한 14초가 아닌 14.62초가 됩니다.
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
해당 출력은 이 기사 상단의 비디오입니다. -c copy가 불평하면 두 샷의 해상도 또는 프레임 속도가 다른 것입니다. H3에서 호출 간에 resolution을 변경했음을 의미합니다. 일치시키거나 -c copy를 삭제하고 재인코딩을 한 번 수락하십시오.
훔칠 가치가 있는 MiniMax H3 튜토리얼 변형
위 루프가 작동하면 시도해 볼 만한 다섯 가지, 비용을 얼마나 절약하는지 대략적인 순서입니다.
768P에서 초안, 2K에서 마무리. 두 등급 모두 동일한 모델이며, 768P는 초당 약 29% 저렴합니다. 후보를 짧고 저렴하게 렌더링하고, 시청한 다음, 동일한 프롬프트로 2K에서 승자만 다시 실행하십시오. 이것이 샷 목록에서 대부분의 비용 절감이 발생하는 곳입니다. 실제로 전달에 필요한 등급은 별도의 논쟁이며, 768P vs 2K에서 다루었습니다.
지속 시간은 4에서 15까지의 모든 정수입니다. 사전 설정 세트가 아닙니다. 동작이 7초에 끝나면 7을 요청하고 8초에 대한 비용 지불을 중단하십시오.
첫 번째 프레임 + 마지막 프레임. role: "last_frame"이 있는 두 번째 이미지 항목을 보내면 H3가 그 사이의 전환을 구축합니다. 이미 아트 디렉션한 샷 간의 전환에 유용합니다.
Reference-to-video로 연속성 유지. role: "reference_image"는 매 생성마다 얼굴을 다시 굴리는 대신 샷 간에 캐릭터를 유지합니다. 일치하는 reference_audio 역할이 있으며 참조 클립에 대해 2~15초 창이 있습니다. 이것이 음성을 일관되게 유지하는 방법입니다. reference-to-video를 참조하십시오.
세로 토킹 헤드. ratio: "9:16"에 대화 줄이 포함된 프롬프트는 현재 이 모델의 가장 높은 볼륨 사용 사례입니다. 오디오가 동일한 패스에서 나오고 입술이 별도의 립싱크 단계 없이 일치하기 때문입니다.
프롬프트 제작은 비동기 배관과는 별도의 기술이며, 샷이 기술적으로는 깨끗하지만 시각적으로 평평하다면 문제는 이 기사보다 앞서 있습니다. H3 프롬프트 가이드로 시작하십시오.
이 MiniMax H3 튜토리얼 실행 비용
상단의 영화를 제작한 실행의 실제 비용 항목, 실행 버튼에 의해 견적되고 2026-08-12에 확인됨. H3는 출력 초당 청구되며 요금은 해상도에 따라 차등 적용됩니다: 2K 작업은 8초에 $1.12로 견적되었으며, 이는 초당 $0.14이고, 카탈로그의 $0.10 시작 요금은 768P 등급입니다. 세 H3 엔드포인트 모두 현재 정가이며 할인은 적용되지 않습니다.
| 단계 | 모델 | 설정 | 요금 |
|---|---|---|---|
| 첫 번째 프레임 | GPT Image 2 text-to-image | quality high, 2048x1152 | $0.1745 |
| 샷 A | H3 image-to-video | 2K, 8s | $1.12 |
| 샷 B | H3 text-to-video | 2K, 16:9, 6s | $0.84 |
| 전달된 영화 | 14.6s, two shots, 2560x1440, stereo audio | $2.13 | |
| 이 기사용 스크린샷 실행 | H3 i2v + t2v | 2K, 8s each | $2.24 |
동일한 두 샷을 768P로 초안 작성했다면 $1.12 및 $0.84 대신 $0.80 및 $0.60이었을 것이며, 약 29% 할인된 가격으로 테이크를 판단할 수 있는 푸티지를 얻을 수 있습니다.
값비싼 방법으로 배우기 쉬운 두 가지 청구 세부 사항. 제출 시 거부된 요청은 비용이 들지 않으므로 누락된 ratio에 대한 400은 무료입니다. 쓸모없는 것을 렌더링하는 요청은 무료가 아닙니다: 작업이 succeeded에 도달하면 출력이 원하는 것이 아니더라도 요금이 청구됩니다. 이것이 768P에서 초안을 작성하는 진정한 이유입니다.
초당 요금, 768P와 2K 비교, 지속 시간에 따른 요금 동작은 이 기사의 동반 문서인 MiniMax H3 API 가격에서 제대로 분석되어 있습니다. 이 기사는 코드에 관한 것이고, 그 기사는 청구서에 관한 것입니다.
출시 전 속성 및 영역
공개하기 전에 확인해야 할 두 가지 사항. MiniMax의 API 이용약관에는 API 출력에 대한 특허 및 저작권 청구를 포괄하는 조건부 방어 의무가 포함되어 있으며, 이 의무는 상표나 초상권에는 적용되지 않으므로 프롬프트에 인식 가능한 로고나 실제 인물이 포함된 경우 여전히 귀하의 책임입니다. 별도로, H3의 오픈 가중치 라이선스에는 제외된 영역 조항이 포함되어 있으며, 이 조항은 다운로드된 가중치와 그 출력을 규율하며, 사용자가 선택할 수 있는 미국 서비스 지역을 명시하는 호스팅된 API의 이용약관과는 다릅니다. 실제로 서명한 계약을 읽으십시오. 그리고 UI에 H3 출력을 H3 출력으로 레이블을 지정하십시오.
MiniMax H3 튜토리얼 FAQ
MiniMax H3 작업 상태는 무엇이며, expired 상태가 있습니까?
다섯 가지: queued, running, succeeded, failed, cancelled. expired 상태는 없습니다. 만료되어 혼동되는 두 가지 다른 것이 있습니다: content.url의 다운로드 URL은 시간 제한이 있고, 작업 레코드 자체는 지난 7일 동안만 조회 가능합니다.
MiniMax H3에 콜백을 사용해야 합니까, 아니면 폴링으로 충분합니까?
폴링으로 충분하며 코드가 더 적습니다. 동시 작업이 충분히 많아 작업당 폴러가 비효율적일 때 콜백을 사용하십시오. 사용하는 경우 엔드포인트는 challenge 필드를 3초 이내에 동기식으로, 인증 미들웨어보다 먼저 변경 없이 다시 보내야 합니다. 실패한 핸드셰이크는 오류 메시지 없이 영구적인 침묵만 생성합니다.
MiniMax H3 텍스트-투-비디오 요청이 "ratio는 필수이며 adaptive일 수 없습니다"라는 400을 반환하는 이유는 무엇입니까?
텍스트 전용 모드이기 때문입니다. 이 모드에서는 프레임을 추론할 첫 번째 프레임이 없습니다. 명시적인 값을 전달하십시오: 21:9, 16:9, 4:3, 1:1, 3:4 또는 9:16. 동일한 규칙이 이미지-투-비디오에서 ratio가 아무것도 하지 않는 것처럼 보이는 이유이기도 합니다. 첫 번째 프레임이 결정하고 전송하는 모든 ratio는 무시됩니다.
MiniMax H3 작업을 병렬로 몇 개 실행할 수 있습니까?
문서화된 상한은 연결 기반입니다: 무료 2개, 유료 15개 동시 작업. 상한을 초과하면 큐 슬롯 대신 즉시 429가 발생하므로 자신의 진행 중인 요청 수를 제한하십시오. 라우팅 게이트웨이는 때때로 더 많이 흡수하며, 20개의 동시 작업이 모두 완료된 적도 있지만 다른 날 동일한 설정에서 429가 발생한 적도 있습니다. 더 높은 숫자를 가정하는 스케줄러를 구축하지 마십시오.
MiniMax H3 비디오 URL이 하루 후에 404가 됩니다. 렌더링이 사라진 것입니까?
아니요. URL이 만료된 것이지 렌더링이 사라진 것이 아닙니다. 동일한 task_id를 다시 쿼리하면 7일 쿼리 기간 내에 언제든지 응답에 새 URL이 포함됩니다. 7일이 지나면 작업 레코드 자체를 더 이상 쿼리할 수 없습니다. 이것이 2단계에서 다른 작업보다 먼저 task_id를 영구 저장하는 이유입니다.
"hailuo ai video generator how to use"를 검색하여 MiniMax H3 튜토리얼에 도착했습니다. 제가 올바른 위치에 있습니까?
예. Hailuo는 소비자 앱이고 H3는 API가 사용하는 모델 이름입니다. 동일한 엔진입니다. 하나의 클립을 원하면 위의 워크플로우 섹션에서 플레이그라운드 경로를 사용하십시오. 코드가 필요하지 않습니다. 열 가지 변형이나 다른 모델에서 파이프된 첫 번째 프레임을 원하면 7단계가 적합합니다.






