Seedance 2.5 ใช้งานได้แล้ววันนี้ — ที่แรกบน Atlas Cloud

ลูป Poll Loop ของ MiniMax H3 ของคุณไม่เคยสิ้นสุด นี่คือบทเรียนที่จบได้จริง

บทช่วยสอน MiniMax H3 พร้อมลูปแบบอะซิงก์ทั้งหมด: การเรียก create, ลูปการสอบถามที่จัดการสถานะจริงทั้งห้า, ความท้าทายของ callback 3 วินาที, และสองสิ่งที่หมดอายุอย่างเงียบๆ

คำขอ POST แรกของคุณกลับมาภายในสิบวินาทีพร้อม task_id ดูเหมือนจะชนะ

แล้วก็ไม่มีอะไรเกิดขึ้นเป็นเวลาหกนาที คุณคัดลอก while status != "Success" มาจากบทช่วยสอนบางอัน และลูปก็หมุนวนไปเรื่อยๆ เพราะ endpoint นี้ไม่ได้คืนคำว่า Success อีกต่อไป คุณจึงเปลี่ยนไปใช้ webhook ไม่มีการ push แบบเดียวส่งมาถึง และไม่มีอะไรบอกคุณว่าทำไม เช้าวันรุ่งขึ้นคุณกลับไปดู render ของเมื่อวาน และลิงก์ก็ 404

สิ่งสี่อย่างนี้ดูเหมือนไม่เกี่ยวข้องกัน ไม่มีอันไหนเป็นความผิดของโมเดล ทั้งสี่อย่างคือ async contract ที่แทบจะไม่มีใครเขียนบันทึกไว้ นี่คือสัญญาทั้งหมด พร้อมกับภาพยนตร์สั้นสองช็อตจริงๆ ที่ออกมาอีกด้านหนึ่ง

ข้อสรุปสำคัญ

  • สาม endpoint, หนึ่งลูป: create คืน task_id แล้วตัดสาย, คุณ poll, คุณดาวน์โหลด ทุกอย่างที่ยากเกิดขึ้นหลังจากเรียก create
  • ห้าสถานะจริงคือ queued, running, succeeded, failed, cancelled ไม่มีสถานะ expired ไม่ว่าบทความในบล็อกจะบอกอะไรคุณ
  • สองสิ่งหมดอายุ แต่ไม่ใช่สถานะ: URL ดาวน์โหลดมีเวลาจำกัด และบันทึกงานนั้นสามารถ query ได้แค่ 7 วัน
  • หากคุณใช้ callback, MiniMax จะส่งคำขอตรวจสอบพร้อมฟิลด์ challenge ก่อน และคุณต้องสะท้อนกลับเหมือนเดิมภายใน 3 วินาที หากพลาด คุณจะไม่ได้รับข้อผิดพลาดใดๆ แค่เงียบตลอดไป
  • สำหรับการสร้างแบบข้อความเท่านั้น ratio เป็นสิ่งจำเป็นและไม่สามารถเป็น adaptive สำหรับ image-to-video เฟรมแรกจะกำหนดเฟรม และ ratio ใดๆ ที่คุณส่งจะถูกเพิกเฉย

เรื่องที่เสร็จแล้วก่อน

ผลตอบแทนทั้งหมดของบทช่วยสอนนี้: สองช็อต MiniMax H3 ที่ 2K, ต่อกัน, 14.6 วินาที ช็อต A คือ image-to-video จากเฟรมแรกที่สร้างขึ้น, ช็อต B คือ text-to-video เปิดเสียงด้วย เสียงไม่ได้เป็นซาวด์แทร็กที่วางทับไว้ H3 เรนเดอร์เฟือง, ฝน และบรรทัดที่กระซิบเป็นส่วนหนึ่งของการสร้างเดียวกัน

การเรียก API สามครั้งสร้างสิ่งนั้นได้ หนึ่งโมเดลภาพสำหรับเฟรมแรก, สอง endpoint H3 สำหรับช็อต, หนึ่งบรรทัด ffmpeg เพื่อต่อเข้าด้วยกัน โค้ดด้านล่างคือโค้ดที่สร้างมันขึ้นมา

ทำไมบทช่วยสอน MiniMax H3 ส่วนใหญ่ถึงพังในการร้องขอครั้งที่สอง

คู่มือเกือบทั้งหมดสำหรับโมเดลนี้หยุดที่การเรียก create นั่นคือครึ่งที่ง่าย การเรียก create ตรวจสอบ payload ของคุณ, ส่ง task_id ให้คุณ และตัดการเชื่อมต่อ แล้วคุณก็ถูกทิ้งให้อยู่กับงานที่ใช้เวลาหลายนาทีและชุดกฎที่ไม่มีใครพิมพ์ออกมา

ความล้มเหลวนั้นซ้ำซากน่าเบื่อ ผมเจอห้าจากหกอย่างนี้ในบ่ายเดียว

อาการสิ่งที่คุณเห็นสาเหตุที่แท้จริงวิธีแก้ไข
ลูป Poll ไม่เคยออกเทอร์มินัลพิมพ์ตลอด งานเสร็จไปนานแล้วเงื่อนไขออกของคุณเปรียบเทียบกับคำแบบ v1 เช่น Success / Fail endpoint query v2 คืนเป็น lowercase succeeded / failedจับคู่กับ enum v2 และ throw สำหรับสถานะใดๆ ที่คุณไม่รู้จัก
400 ทันทีสำหรับ text-to-videoคำขอถูกปฏิเสธก่อนการเรนเดอร์เริ่มratio หายไป หรือตั้งเป็น adaptive ซึ่งโหมดข้อความเท่านั้นปฏิเสธส่ง ratio ที่ชัดเจน เช่น 16:9
ratio ของคุณถูกเพิกเฉยอย่างเงียบเฟรมเอาต์พุตไม่ใช่สิ่งที่คุณขอImage-to-video รับเฟรมจากภาพเฟรมแรก ดังนั้น ratio จึงไม่ทำงานที่นั่นครอบหรือสร้างเฟรมแรกที่เฟรมที่คุณต้องการ
Webhook ไม่เคยทำงาน, ไม่มีข้อผิดพลาดไม่มีการ push, log สะอาด, ไม่มีการร้องเรียนจาก APIการจับมือตรวจสอบล้มเหลว MiniMax ส่ง challenge และ endpoint ของคุณไม่สะท้อนกลับเหมือนเดิมภายใน 3 วินาทีตอบ challenge แบบซิงโครนัส ก่อน middleware auth หรือ queue ใดๆ
URL ของเมื่อวาน 404sลิงก์ดาวน์โหลดตาย, render ดูเหมือนหายไปURL ดาวน์โหลดมีเวลาจำกัด render ยังดีอยู่Query task_id เดิมอีกครั้งเพื่อ URL ใหม่ ภายในช่วง 7 วัน
429 สุ่มภายใต้โหลดการส่งบางอันถูกปฏิเสธ, ไม่มีคิวConcurrency ถูกจำกัด และเป็นขีดจำกัดแบบตายตัว ไม่ใช่แถวรอจำกัดจำนวนใน-flight ของคุณเอง และลองส่งใหม่ ไม่ใช่ render

แถวแรกคือสิ่งที่กินเวลาทั้งคืน และควรพูดให้ชัดเจน API วิดีโอเก่าของ MiniMax รายงานความคืบหน้าด้วยคำที่ขึ้นต้นด้วยตัวพิมพ์ใหญ่ในตระกูล Preparing / Queueing / Processing / Success / Fail endpoint query v2 ที่ใช้โดย H3 คืน queued, running, succeeded, failed, cancelled (MiniMax API Reference, สิงหาคม 2026) เอกสารของตัวแทนจำหน่ายบุคคลที่สามจำนวนมากยังพิมพ์ชุดเก่าอยู่ หรือผสมทั้งสองในหน้าเดียว หากคุณสืบทอดลูปจากหนึ่งในนั้น มันจะไม่สามารถสิ้นสุดได้ เพราะสตริงที่รอมันไม่เคยถูกส่ง

ขั้นตอนการทำงานของบทช่วยสอน MiniMax H3: สาม endpoint, ห้าสถานะ, หนึ่งลูป

H3 เปิดตัวเมื่อ 2026-07-31 ในฐานะโมเดลวิดีโอ omni-modal: ข้อความ, รูปภาพ, วิดีโอ และเสียงทั้งหมดอยู่ในหน้าต่างบริบทเดียวกัน, เอาต์พุตสูงสุด 15 วินาทีที่ 2K พร้อมเสียงสเตอริโอแบบเนทีฟ (MarkTechPost, สิงหาคม 2026) สำหรับ API นั่นหมายถึงหนึ่ง endpoint create พร้อมอาร์เรย์ content และสิ่งที่คุณใส่ในอาร์เรย์จะตัดสินว่าคุณอยู่ในโหมดใด

โหมดสิ่งที่ใส่ใน contentrole บนรายการรูปภาพสิ่งที่ ratio ทำใช้สำหรับ
Text-to-videoหนึ่งรายการข้อความnoneจำเป็น, และ adaptive ถูกปฏิเสธช็อตที่ไม่มีภาพต้นฉบับ, ควบคุมเฟรมได้เต็มที่
Image-to-videoรายการข้อความบวกรายการรูปภาพfirst_frame (อาจมี last_frame ด้วย)ถูกเพิกเฉย, เฟรมแรกเป็นตัวตัดสินทำให้ภาพนิ่งที่คุณจัดองค์ประกอบแล้วเคลื่อนไหว
Reference-to-videoรายการข้อความบวกรายการอ้างอิงreference_image (รวมถึง reference_video, reference_audio)จำเป็น, เหมือนกับข้อความเท่านั้นรักษาตัวละครหรือเสียงเดียวในหลายช็อต

และส่วนที่โค้ดของคุณต้องจัดการจริงๆ ห้าสถานะ, ห้ากิ่งที่แตกต่างกัน

สถานะความหมายสิ่งที่โค้ดของคุณทำ
queuedรับแล้ว, รอสล็อตPoll ต่อไป, ถอยหลัง
runningกำลังเรนเดอร์Poll ต่อไป, ถอยหลัง
succeededเสร็จ, content.url มีข้อมูลแล้วดาวน์โหลดทันที, ในการวนซ้ำนี้
failedเรนเดอร์ล้มเหลวอ่าน error body, log มัน, อย่า retry payload เดิมแบบไม่ดู
cancelledงานถูกยกเลิกออกจากลูป, ถือว่าสิ้นสุด
สิ่งอื่นใดไม่อยู่ใน enumRaise. สถานะใหม่ที่คุณเงียบๆ ถือว่า "รอต่อไป" คือบั๊กจากตารางด้านบน

ไม่มีสถานะ expired คำนั้นมักถูกแนบมากับ API นี้และเป็นของอีกสองสิ่ง: URL ดาวน์โหลด ซึ่งมีเวลาจำกัดและรีเฟรชได้, และบันทึกงาน ซึ่ง query ได้เฉพาะ 7 วันสุดท้าย ทั้งสองครอบคลุมในขั้นตอนที่ 4

อีกหนึ่งตัวเลขก่อนโค้ด Concurrency สำหรับการสร้างวิดีโอบน H3 ถูกจำกัดโดยจำนวนการเชื่อมต่อ ไม่ใช่คำขอต่อนาที: 2 งานพร้อมกันในระดับฟรี, 15 เมื่อคุณจ่ายเงิน (MiniMax Rate Limits, สิงหาคม 2026) เกินขีดจำกัดคุณจะได้รับ 429 ทันที ไม่มีอะไร queued ในนามของคุณ ผมยังเคย push 20 งาน H3 พร้อมกันผ่าน routing gateway และทั้ง 20 ก็สำเร็จ และผมก็เคยเจอ 429 ในการตั้งค่าเดียวกันในวันอื่น ดังนั้นให้ปฏิบัติต่อตัวเลขใดๆ ที่สูงกว่าขีดจำกัดที่ระบุไว้เป็นสภาพอากาศ ไม่ใช่ค่าคงที่

โดยตรงหรือผ่าน gateway

สามขั้นตอนเหมือนกันไม่ว่าจะใช้วิธีใด แต่สตริงต่างกัน และนั่นสำคัญเมื่อคุณกำลังดีบักตอนตี 1

MiniMax โดยตรงUnified gateway (Atlas Cloud)
ส่งPOST /v2/video_generationPOST /api/v1/model/generateVideo
PollGET /v2/query/video_generation/{task_id}GET /api/v1/model/prediction/{id}
คำสถานะqueued / running / succeeded / failed / cancelledcompleted เมื่อสำเร็จ, failed เมื่อล้มเหลว
การแจ้งเตือนแบบ PushCallback URL พร้อม handshake challenge 3 วินาทีPoll prediction id
Concurrency2 ฟรี, 15 จ่าย, 429 แบบตายตัวไม่ได้เผยแพร่เป็นขีดจำกัดต่อโมเดล, วัดได้กว้างกว่าในทางปฏิบัติ
โมเดลภาพเฟรมแรกบนคีย์เดียวกันไม่, บัญชีแยกต่างหากใช่, GPT Image 2 และ H3 อยู่หลังคีย์เดียว
ราคา H3เผยแพร่ตามระดับความละเอียดต่อวินาทีของเอาต์พุต, หลายระดับตามความละเอียด, ระบุราคาบนปุ่ม Run ก่อนส่ง

เหตุผลที่ผมรันเชนบทช่วยสอนนี้บน gateway เป็นเพียงแถวที่สองจากท้าย: เฟรมแรกมาจากโมเดลภาพ OpenAI และสองช็อตมาจาก MiniMax และผมไม่ต้องการผู้ขายสองราย, สองคีย์ และสองหน้าบิลสำหรับภาพยนตร์ 14 วินาทีหนึ่งเรื่อง หากคุณอยู่ในแพลตฟอร์ม MiniMax อยู่แล้ว อยู่ที่นั่น ลูปด้านล่างทำงานเหมือนเดิมยกเว้นพาธและคำสถานะ

Hailuo AI Video Generator: วิธีใช้ก่อนที่คุณจะเขียนโค้ดใดๆ

หากคุณมาที่นี่เพื่อค้นหาวิธีใช้ Hailuo AI video generator คุณมาถูกที่แล้ว และคุณยังไม่ต้องการโค้ดใดๆ Hailuo คือแอปสำหรับผู้บริโภคของ MiniMax และ H3 คือชื่อโมเดลที่ API ใช้ เครื่องยนต์เดียวกัน, ประตูคนละบาน

สามนาที, ไม่ต้องใช้เทอร์มินัล:

  1. เปิดหน้าโมเดล เช่น MiniMax H3 image-to-video playground คือแผงด้านขวาของหน้า
  2. วางภาพเฟรมแรก หรือสลับไปที่หน้า text-to-video แล้วเขียน prompt ตั้งค่าความละเอียดและระยะเวลา พูดออกมาดังๆ ว่าคุณต้องการได้ยินอะไร ไม่ใช่แค่ต้องการเห็นอะไร: H3 สร้างเสียงในรอบเดียวกัน ดังนั้น "ฝนตกบนกระจก, เสียงคลิกเซอร์โวเล็กๆ" คือคำสั่งจริง ไม่ใช่แค่ตกแต่ง
  3. กด Run ปุ่มจะแสดงค่าใช้จ่ายที่แน่นอนสำหรับการตั้งค่าที่คุณเลือกก่อนที่คุณจะยืนยัน รอ, ดาวน์โหลด

นั่นคือเส้นทางแบบไม่ใช้โค้ดทั้งหมด และสำหรับคลิปเดี่ยวๆ มันเป็นตัวเลือกที่เร็วกว่าจริงๆ เมื่อคุณต้องการสิบรูปแบบ หรือเฟรมแรกที่สร้างโดยโมเดลอื่นและป้อนตรงๆ ให้กลับมาที่โค้ด นั่นคือสิ่งที่เหลืออยู่ของบทความนี้

บทช่วยสอน MiniMax H3: สร้าง, Poll, ดาวน์โหลด, ทำซ้ำ

หนึ่งตัวอย่างทำงานผ่านทั้งเจ็ดขั้นตอน: ช่างซ่อมนาฬิกาซ่อมนกจักรกลทองเหลืองตัวเล็ก, กระซิบหนึ่งบรรทัดกับมัน, และนกบินออกจากโรงงาน สองช็อต ช็อต A คือ image-to-video ดังนั้นภายในจึงได้รับการจัดองค์ประกอบ ช็อต B คือ text-to-video เพราะไม่มีเฟรมต้นฉบับสำหรับท้องฟ้า

ขั้นตอนที่ 1: สร้างเฟรมแรกด้วย GPT Image 2

Image-to-video ไม่สนใจ ratio ดังนั้นเฟรมแรกคือที่ที่คุณตัดสินใจเฟรมของช็อต A สร้างที่ 16:9 และที่ระดับคุณภาพสูงสุด เพราะ H3 จะสืบทอดทุกตำหนิในนั้นแล้วเพิ่ม motion blur ทับ

โมเดล: openai/gpt-image-2/text-to-image การตั้งค่า: quality high, 2048x1152, 16:9, PNG

text
1A 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

อินเทอร์เฟซตัวสร้างภาพ AI ที่แสดง prompt ข้อความและเอาต์พุตที่สร้างขึ้น

Playground GPT Image 2 บน Atlas Cloud พร้อม prompt เฟรมแรกของบทช่วยสอนนี้และโรงงานช่างซ่อมนาฬิกาที่เรนเดอร์ในแผงเอาต์พุต

GPT Image 2 บน Atlas Cloud, quality high ที่ 2048x1152 ปุ่ม Run แสดงค่าใช้จ่ายที่แน่นอนสำหรับการตั้งค่าที่คุณเลือก, $0.1745 สำหรับอันนี้, ก่อนที่คุณจะยืนยัน

เก็บ URL ที่ส่งคืนไว้ ขั้นตอนที่ 2 ป้อนเข้าสู่ H3 โดยตรง, ไม่ต้องไปกลับดาวน์โหลด

ขั้นตอนที่ 2: สร้างงาน MiniMax H3 และเก็บ task_id ไว้

การเรียก create ทำสองสิ่งแล้วหยุดสนใจคุณ: มันตรวจสอบ payload และมันคืน task_id 400 ที่นี่คือ payload ของคุณ ไม่ใช่ความล้มเหลวชั่วคราว ดังนั้นอย่าใส่ไว้หลังลูป retry ปัญหาประเภทอื่นๆ จะปรากฏขึ้นทีหลัง, ระหว่าง polling

นิสัยหนึ่งที่ประหยัดเงินจริง: เก็บ task_id ไว้ก่อนที่คุณจะทำอะไรอย่างอื่น งานสามารถ query ได้เพียง 7 วัน และหากกระบวนการของคุณตายโดยมี id อยู่ในหน่วยความจำ คุณได้จ่ายเงินสำหรับ render ที่คุณไม่สามารถเข้าถึงได้อีกต่อไป

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        # payload ของคุณผิด การ retry ก็จะผิดอีก
14        raise ValueError(f"ถูกปฏิเสธ: {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    ""มาดูกันว่าเธอยังจำท้องฟ้าได้ไหม" Push-in เลนส์ 50mm ช้าๆ, แสงตะเกียงสาดผ่านทองเหลือง, "
26    "ฝนตกกระทบหน้าต่าง, เตาถ่านแตกปะทุ, เสียงคลิกเซอร์โวเล็กๆ ใต้เสียงของเขา "
27    "คีย์สีอำพันอบอุ่น, เติมสีฟ้าเทลที่หน้าต่าง ไม่มีข้อความบนหน้าจอ"
28)
29
30shot_a = create_task({
31    "model": "MiniMax-H3",
32    "resolution": "2K",
33    "duration": 8,
34    # ไม่มี "ratio" ที่นี่โดยเจตนา: image-to-video รับเฟรมจากเฟรมแรก
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:", shot_a)
42

นี่คือ prompt และเฟรมแรกนั้นที่ทำงานเป็นงาน คุณจึงเห็นว่าการส่งที่สมบูรณ์แข็งแรงเป็นอย่างไรจากอีกด้านหนึ่ง:

ภาพหน้าจอของอินเทอร์เฟซตัวสร้างวิดีโอ AI พร้อมอินพุตและเอาต์พุต

Playground MiniMax H3 image-to-video บน Atlas Cloud พร้อมเฟรมแรกของโรงงานที่โหลดและคลิปที่เรนเดอร์ในแผงเอาต์พุต

MiniMax H3 image-to-video: เฟรมแรกโหลดทางซ้าย, คลิป 2K ที่เสร็จแล้วใน OUTPUT ทางขวา สังเกตฟิลด์ Aspect Ratio ที่ตรึงเป็น adaptive, และราคา $1.12 สำหรับ 2K ที่ 8 วินาที

ขั้นตอนที่ 3: Poll มัน และจัดการสถานะ MiniMax H3 ทั้งห้า

นี่คือลูปที่ทุกคนทำผิด ดังนั้นจึงควรเขียนให้เต็ม สี่กฎ: ถอยหลังแทนที่จะตอก, จำกัดเวลารอทั้งหมด, ถือว่า succeeded เป็น "ดาวน์โหลดเดี๋ยวนี้", และ raise สำหรับสถานะใดๆ ที่ไม่อยู่ใน enum

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 ใช้งานได้ตอนนี้
16        if status in TERMINAL_BAD:
17            raise RuntimeError(f"{status}: {json.dumps(r.json())[:400]}")
18        if status not in IN_FLIGHT:
19            # สถานะที่ enum ไม่มี อย่าตกไปที่ "รอต่อไป"
20            raise RuntimeError(f"ไม่รู้จักสถานะ {status!r} -- อ่าน changelog")
21
22        print(f"  {status} ... ตรวจสอบครั้งต่อไปใน {delay:.0f}s")
23        time.sleep(delay)
24        delay = min(delay * 1.5, 15.0)                    # 3s -> เพดาน 15s
25    raise TimeoutError(f"{task_id} ยังไม่สิ้นสุดหลังจาก {timeout_s}s")
26

สามสิ่งในนั้นเป็นความตั้งใจ:

status not in IN_FLIGHT raise แทนที่จะดำเนินการต่อ หาก MiniMax เพิ่มสถานะที่หกในไตรมาสหน้า คุณต้องการการพังที่ดัง ไม่ใช่ลูปที่รอคำที่ไม่เคยมาถึง บรรทัดเดียวนี้คือความแตกต่างระหว่างบทช่วยสอนที่พังกับอันนี้

failed ไม่ retry การ render ที่ล้มเหลวมักหมายถึง prompt ชนตัวกรองหรือ payload มีชุดค่าผสมที่ไม่ดี และการยิง payload เดิมอีกครั้งจะทำให้คุณล้มเหลวเหมือนเดิมในราคาเต็ม Log body, ดูมัน, แล้วตัดสินใจ

การถอยหลังเริ่มต้นที่ 3 วินาทีและลงที่ 15 H3 ที่ 2K ใช้เวลาหลายนาที ไม่ใช่วินาที การ poll วินาทีละครั้งแค่เผาขีดจำกัดอัตราของคุณบน endpoint query

ขั้นตอนที่ 4: ดาวน์โหลดก่อน URL หมดอายุ

ทันทีที่ succeeded มาถึง, สตรีมไฟล์ไปยังดิสก์ URL ใน content.url เป็นลิงก์ที่มีเวลาจำกัดอย่างชัดเจน: "ดาวน์โหลดหรือเก็บไว้ทันที; query อีกครั้งเพื่อรับ URL ใหม่หลังจากหมดอายุ" (MiniMax API Reference, สิงหาคม 2026) มันไม่ใช่พาธ CDN ที่คุณสามารถใส่ในฐานข้อมูลและลืมมันไปได้

ครึ่งหลังนั้นเป็นข่าวดี และเป็นคำตอบของ 404 ที่คุณได้รับในเช้าวันรุ่งขึ้น render ไม่ได้หายไป Query task_id เดิมอีกครั้งและคุณจะได้รับ URL ใหม่, นานถึง 7 วันหลังจากการสร้าง

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    """ลิงก์ตาย? render ยังดีอยู่ ถามอีกครั้ง ภายในช่วง 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

สิ่งที่กลับมาสำหรับ shot A, ถัดจากภาพนิ่งที่มันเริ่มต้น:

การเปรียบเทียบแบบเคียงข้างกันของช่างฝีมือกำลังตรวจสอบนกจักรกล

เคียงข้างกัน: เฟรมแรกที่สร้างขึ้นทางซ้าย, เฟรมจากคลิป MiniMax H3 ที่เสร็จแล้วทางขวา, แสดงแผ่นปีกของนกที่เปิดออกและดวงตาที่สว่าง

ซ้าย: ภาพนิ่ง GPT Image 2 จากขั้นตอนที่ 1, ตามที่ส่ง ขวา: เฟรมที่ดึงมาจากคลิป 2K ที่ H3 ส่งคืน ชุดเดียวกัน, แสงเดียวกัน, แผ่นปีกและดวงตาคือสิ่งที่เคลื่อนไหว

ขั้นตอนที่ 5: ช็อต B ด้วย MiniMax H3 text-to-video, ที่ ratio เป็นสิ่งจำเป็น

ไม่มีเฟรมต้นฉบับสำหรับท้องฟ้า ดังนั้น shot B เป็นข้อความเท่านั้น นั่นพลิกกฎ ratio จาก "ถูกเพิกเฉย" เป็น "จำเป็น": สำหรับ prompt ข้อความเท่านั้น, ratio เป็นสิ่งจำเป็นและไม่สามารถเป็น adaptive (MiniMax API Reference, สิงหาคม 2026) ละไว้หรือส่ง adaptive แล้วคุณจะได้รับ 400 ทันที, ก่อนที่การเรนเดอร์ใดๆ จะเริ่มต้น

โมเดล: minimax/h3/text-to-video การตั้งค่า: 2K, duration 6, ratio 16:9

text
1The 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
python
1shot_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

ภาพหน้าจอของอินเทอร์เฟซตัวสร้างวิดีโอ AI ที่แสดงอินพุตและเอาต์พุต

Playground MiniMax H3 text-to-video บน Atlas Cloud พร้อม prompt นกบินและคลิปที่เสร็จแล้วในแผงเอาต์พุต

MiniMax H3 text-to-video พร้อม prompt ของ shot B และ Aspect Ratio ตั้งเป็น 16:9 อย่างชัดเจน การทำงานนี้ใช้ค่าเริ่มต้นของหน้า 8 วินาทีแทนที่จะเป็น 6 ใน payload ด้านบน

ขั้นตอนที่ 6: ข้าม polling ด้วย callback และสะท้อน challenge ใน 3 วินาที

หากคุณต้องการให้บอกมากกว่าถาม, ส่ง callback_url ในการเรียก create มีข้อแม้อย่างเดียว, มันถูกบันทึกไว้ในวงเล็บเดียวในเอกสารอ้างอิง API และมันเป็นวิธีที่พบบ่อยที่สุดที่ callback แบบโฮสต์เองล้มเหลว

ก่อนที่ MiniMax จะ push อะไรให้คุณ, มันส่งคำขอตรวจสอบที่มีฟิลด์ challenge, และ "คุณต้องคืน challenge ที่ไม่เปลี่ยนแปลงภายใน 3 วินาทีเพื่อให้การตรวจสอบสมบูรณ์" (MiniMax API Reference, สิงหาคม 2026) พลาดแล้วไม่มีข้อผิดพลาดใดๆ การเรียก create ของคุณยังคงสำเร็จ, render ของคุณยังคงเสร็จ, และคุณก็ไม่ได้รับการ push เลย ไม่มีอะไรใน log ว่าเพราะเหตุใด

สิบสองบรรทัดของ FastAPI, และลำดับภายในนั้นคือประเด็นทั้งหมด:

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:                 # การจับมือตรวจสอบ, ตอบมันก่อน
9        return {"challenge": body["challenge"]}   # ไม่เปลี่ยนแปลง, ซิงโครนัส, ไม่มี gate auth
10    task_id = body.get("task_id")
11    status  = body.get("status")
12    enqueue(task_id, status)                # การแจ้งเตือนจริง: ส่งต่อ, คืนค่าเร็ว
13    return {"ok": True}
14

ข้อผิดพลาดที่ฆ่ามัน, เรียงตามลำดับที่ผมเห็นบ่อยที่สุด:

  • คำขอ challenge ผ่าน middleware auth ของคุณและได้รับ 401 หรือ redirect การตรวจสอบไม่มีการรับรองความถูกต้องตามคำจำกัดความ Whitelist พาธ
  • ตัวจัดการ push challenge ไปยังคิวและตอบแบบอะซิงโครนัส สายเกินไป คำตอบนั้นต้องอยู่ใน body การตอบสนองของคำขอนั้น
  • ค่าถูก serialize ใหม่, ตัดแต่ง, หรือห่อ สะท้อนมันทีละไบต์
  • คุณกำลังทดสอบผ่าน tunnel กับ dev server แบบ serverless, และ cold start เพียงอย่างเดียวก็เกิน 3 วินาที อุ่นเครื่องก่อน, หรือตรวจสอบกับกระบวนการที่กำลังทำงานอยู่

Polling ก็ใช้ได้ดีเช่นกัน หากคุณมีงานไม่กี่งานต่อชั่วโมง, ลูปในขั้นตอนที่ 3 มีโค้ดน้อยกว่าและพังน้อยกว่า Callback จะคุ้มค่าเมื่อคุณมีงานจำนวนมากและไม่ต้องการ poller ต่องาน

ขั้นตอนที่ 7: ต่อสองช็อตเป็นภาพยนตร์เรื่องเดียว

ทั้งสองช็อตกลับมาเป็น 2560x1440 h264 ที่ 24fps พร้อม AAC stereo audio ที่ 32kHz คอนเทนเนอร์เดียวกัน, ทุกอย่างเหมือนกัน ดังนั้นนี่คือการคัดลอกสตรีมแทนที่จะเข้ารหัสใหม่ ไม่สูญเสียคุณภาพ, ไม่ต้องรอ

เรื่องเซอร์ไพรส์เล็กๆ ที่ควรคาดหวัง: การขอ 6 วินาทีได้ไฟล์ 6.58 วินาที ระยะเวลากลับมาใกล้เคียงกับที่คุณขอ, ไม่ตรงเฟรมพอดี ดังนั้นสองช็อตรวมกันเป็น 14.62 วินาทีแทนที่จะเป็น 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

เอาต์พุตนั้นคือวิดีโอที่ด้านบนของบทความนี้ หาก -c copy บ่น, แสดงว่าสองช็อตของคุณมีความละเอียดหรืออัตราเฟรมต่างกัน ซึ่งบน H3 หมายความว่าคุณเปลี่ยน resolution ระหว่างการเรียก จับคู่พวกมัน, หรือละ -c copy และยอมรับการเข้ารหัสใหม่หนึ่งครั้ง

รูปแบบบทช่วยสอน MiniMax H3 ที่น่าขโมย

ห้าสิ่งที่ควรลองเมื่อลูปด้านบนใช้ได้, เรียงตามลำดับคร่าวๆ ของจำนวนเงินที่ประหยัดได้

ร่างที่ 768P, เสร็จที่ 2K ทั้งสองระดับเป็นโมเดลเดียวกัน, และ 768P มีราคาถูกกว่าประมาณ 29% ต่อวินาที เรนเดอร์ตัวเลือกของคุณสั้นและถูก, ดูพวกมัน, แล้วรันเฉพาะผู้ชนะที่ 2K ด้วย prompt เดียวกัน นี่คือที่ที่เงินออมส่วนใหญ่ในรายการช็อตอยู่ ระดับที่คุณต้องการจริงๆ สำหรับการส่งมอบเป็นข้อโต้แย้งของตัวเอง และผมเขียนไว้ใน 768P vs 2K

Duration คือจำนวนเต็มทุกจำนวนตั้งแต่ 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" พร้อมบรรทัดบทสนทนาใน prompt คือการใช้งานที่มีปริมาณมากที่สุดของโมเดลนี้ในตอนนี้ เพราะเสียงออกมาในรอบเดียวกันและริมฝีปากตรงกันโดยไม่ต้องมีขั้นตอนแยก lip-sync

การสร้าง prompt เป็นทักษะที่แยกจากท่อ async และหากช็อตของคุณสะอาดทางเทคนิคแต่แบนทางภาพ, ปัญหาอยู่เหนือบทความนี้ เริ่มต้นด้วย คู่มือ prompt H3

บทช่วยสอน MiniMax H3 นี้มีค่าใช้จ่ายเท่าไรในการรัน

รายการค่าใช้จ่ายจริงจากการรันที่สร้างภาพยนตร์ด้านบน, อ้างอิงโดยปุ่ม Run และตรวจสอบเมื่อ 2026-08-12 H3 คิดราคาต่อวินาทีของเอาต์พุตและอัตราเป็นลำดับตามความละเอียด: งาน 2K ราคา $1.12 สำหรับ 8 วินาที, ซึ่งคือ $0.14 ต่อวินาที, และอัตราเริ่มต้น $0.10 ของแค็ตตาล็อกคือระดับ 768P ทั้งสาม endpoint H3 อยู่ในราคาเต็มตอนนี้, ไม่มีส่วนลด

ขั้นตอนโมเดลการตั้งค่าค่าใช้จ่าย
เฟรมแรกGPT Image 2 text-to-imagequality high, 2048x1152$0.1745
ช็อต AH3 image-to-video2K, 8s$1.12
ช็อต BH3 text-to-video2K, 16:9, 6s$0.84
ภาพยนตร์ที่ส่งมอบ14.6s, สองช็อต, 2560x1440, เสียงสเตอริโอ$2.13
การรันภาพหน้าจอสำหรับบทความนี้H3 i2v + t2v2K, 8s ต่ออัน$2.24

น่าสังเกตว่าสองช็อตเดียวกันที่ร่างที่ 768P จะมีราคา $0.80 และ $0.60 แทนที่จะเป็น $1.12 และ $0.84, ประมาณ 29% น้อยกว่า, สำหรับฟุตเทจที่คุณสามารถตัดสิน take ได้อย่างแน่นอน

รายละเอียดการเรียกเก็บเงินสองอย่างที่ง่ายต่อการเรียนรู้ด้วยวิธีแพง คำขอที่ถูกปฏิเสธตอนส่งไม่มีค่าใช้จ่าย, ดังนั้น 400 สำหรับ ratio ที่หายไปนั้นฟรี คำขอที่เรนเดอร์สิ่งที่ไร้ประโยชน์ไม่ฟรี: หากงานถึง succeeded, คุณถูกเรียกเก็บเงิน, แม้ว่าเอาต์พุตจะไม่ใช่สิ่งที่คุณต้องการ นั่นคือข้อโต้แย้งที่แท้จริงสำหรับการร่างที่ 768P

อัตราต่อวินาที, การเปรียบเทียบ 768P และ 2K, และค่าใช้จ่ายทำงานอย่างไรตามระยะเวลา, ถูกแยกย่อยอย่างเหมาะสมใน MiniMax H3 API pricing คู่หูของบทความนี้ อันนี้คือโค้ด, อันนั้นคือบิล

การระบุแหล่งที่มาและอาณาเขตก่อนที่คุณจะส่งออก

สองสิ่งที่ต้องตรวจสอบก่อนที่สิ่งนี้จะไปที่ใดก็ตามในที่สาธารณะ ข้อกำหนด API ของ MiniMax รวมถึงภาระผูกพันในการป้องกันแบบมีเงื่อนไขที่ครอบคลุมการเรียกร้องสิทธิบัตรและลิขสิทธิ์ต่อเอาต์พุต API และภาระผูกพันนั้นไม่ครอบคลุมถึงเครื่องหมายการค้าหรือความคล้ายคลึง, ดังนั้นโลโก้ที่รู้จักหรือบุคคลจริงใน prompt ของคุณยังคงเป็นปัญหาของคุณ แยกกัน, ใบอนุญาต open-weights สำหรับ H3 มีข้อกำหนด Excluded Territories, และข้อกำหนดนั้นควบคุมน้ำหนักที่ดาวน์โหลดและเอาต์พุตของพวกมัน, ไม่ใช่ API ที่โฮสต์, ซึ่งข้อกำหนดของมันระบุภูมิภาคบริการของสหรัฐฯ ที่คุณสามารถเลือกได้ อ่านสัญญาที่คุณเซ็นจริงๆ และติดป้ายกำกับเอาต์พุต H3 เป็นเอาต์พุต H3 ใน UI ของคุณ

คำถามที่พบบ่อยเกี่ยวกับบทช่วยสอน MiniMax H3

สถานะงาน MiniMax H3 คืออะไร, และมีสถานะ expired หรือไม่?

ห้า: queued, running, succeeded, failed, cancelled ไม่มีสถานะ expired สองสิ่งอื่นหมดอายุและถูกสับสนเป็นหนึ่ง: URL ดาวน์โหลดใน content.url มีเวลาจำกัด, และบันทึกงานนั้น query ได้เฉพาะ 7 วันสุดท้าย

ฉันต้องใช้ callback หรือ polling ก็ใช้ได้สำหรับ MiniMax H3?

Polling ใช้ได้ดีและมีโค้ดน้อยกว่า ใช้ callback เมื่อคุณมีงานพร้อมกันมากพอที่ poller ต่องานจะดูไม่สมเหตุสมผล หากคุณใช้, endpoint ต้องสะท้อนฟิลด์ challenge กลับมาเหมือนเดิมภายใน 3 วินาที, แบบซิงโครนัส, ก่อน middleware auth ใดๆ การจับมือที่ล้มเหลวจะไม่สร้างข้อความแสดงข้อผิดพลาดเลย, แค่เงียบถาวร

ทำไมคำขอ MiniMax H3 text-to-video ของฉันถึง 400 ด้วย "ratio is required and cannot be adaptive"?

เพราะคุณอยู่ในโหมดข้อความเท่านั้น, ซึ่งไม่มีเฟรมแรกให้อนุมานเฟรมได้ ส่งค่าที่ชัดเจน: 21:9, 16:9, 4:3, 1:1, 3:4 หรือ 9:16 กฎเดียวกันคือสาเหตุที่ ratio ดูเหมือนไม่ทำอะไรใน image-to-video, ซึ่งเฟรมแรกเป็นตัวตัดสินและ ratio ใดๆ ที่คุณส่งจะถูกเพิกเฉย

ฉันสามารถรันงาน MiniMax H3 ได้กี่งานพร้อมกัน?

ขีดจำกัดที่บันทึกไว้เป็นแบบตามการเชื่อมต่อ: 2 งานพร้อมกันฟรี, 15 จ่าย เกินขีดจำกัดคุณจะได้รับ 429 ทันทีแทนที่จะเป็นสล็อตในคิว, ดังนั้นจำกัดจำนวนใน-flight ของคุณเอง Routing gateways บางครั้งดูดซับได้มากกว่า, และผมเคยมี 20 งานพร้อมกันที่เสร็จทั้งหมด, แต่ผมก็เคยถูก 429 ในการตั้งค่าเดียวกันในวันอื่น อย่าสร้างตัวกำหนดตารางเวลาที่ถือว่าจำนวนที่สูงกว่า

URL วิดีโอ MiniMax H3 ของฉัน 404s ในวันถัดไป render หายไปหรือไม่?

ไม่ URL หมดอายุ, render ไม่ได้หายไป Query task_id เดิมอีกครั้งและการตอบสนองจะมี URL ใหม่, เมื่อใดก็ได้ภายในหน้าต่าง query 7 วัน หลังจาก 7 วันบันทึกงานนั้นไม่สามารถ query ได้อีก, ซึ่งเป็นเหตุผลที่ขั้นตอนที่ 2 เก็บ task_id ไว้ก่อนทำอย่างอื่น

ฉันค้นหา "hailuo ai video generator how to use" และมาที่บทช่วยสอน MiniMax H3 ฉันมาถูกที่หรือไม่?

ใช่ Hailuo คือแอปสำหรับผู้บริโภคและ H3 คือชื่อโมเดลที่ API ใช้ เครื่องยนต์เดียวกัน หากคุณต้องการคลิปเดียว, ใช้เส้นทาง playground ในส่วนขั้นตอนการทำงานด้านบน, ไม่ต้องใช้โค้ด หากคุณต้องการสิบรูปแบบหรือเฟรมแรกที่ป้อนจากโมเดลอื่น, เจ็ดขั้นตอนนั้นสำหรับคุณ

โมเดลล่าสุด

API เดียวสำหรับ AI สื่อทุกประเภท

สำรวจโมเดลทั้งหมด