عادت أول عملية POST بعد عشر ثوانٍ ومعها task_id. بدا الأمر وكأنه نجاح.
ثم لم يحدث شيء لمدة ست دقائق. كنت قد نسخت while status != "Success" من بعض الدروس، وظلت الحلقة تدور بلا توقف، لأن نقطة النهاية هذه لم تعد تُرجع كلمة Success. لذا تحولت إلى webhook. لم يصل أي إشعار قط، ولم يُخبرك أي شيء بسبب ذلك. وفي الصباح التالي عدت للبحث عن رندر الأمس فوجدت الرابط يعطي 404.
هذه الأشياء الأربعة تبدو غير مترابطة. ولا واحد منها خطأ النموذج. الأربعة جميعها ناتجة عن العقد غير المتزامن (async contract) الذي لا يكتبه أحد تقريبًا. إليك العقد كاملًا، بالإضافة إلى فيلم قصير حقيقي من لقطتين نتج عن الطرف الآخر.
الخلاصات الأساسية
- ثلاث نقاط نهاية، وحلقة واحدة: create يُرجع
task_idويغلق الاتصال، ثم تستعلم، ثم تنزّل. كل الصعب يقع بعد استدعاء create. - الحالات الخمس الحقيقية هي
queuedوrunningوsucceededوfailedوcancelled. لا توجد حالةexpired، مهما قال منشور في مدونة. - أمران ينتهي صلاحيتهما، وليس أي منهما حالة: رابط التنزيل محدود بالوقت، وسجل المهمة نفسه قابل للاستعلام فقط لمدة 7 أيام.
- إذا استخدمت callback، ترسل 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 وهو ما يرفضه وضع النص فقط | مرر ratio صريحًا مثل 16:9 |
يتم تجاهل ratio بصمت | إطار الإخراج ليس ما طلبته | التحويل من صورة إلى فيديو يستمد الإطار من الصورة الأولى، لذا يكون ratio بلا تأثير هناك | اقتطع الإطار الأول أو ولّده بالأبعاد التي تريدها |
| الـ webhook لا يعمل ولا يوجد خطأ | لا إشعارات، سجلات نظيفة، لا شكوى من الـ API | مصافحة التحقق فشلت. أرسلت MiniMax تحديًا ولم يعده endpoint الخاص بك كما هو خلال 3 ثوانٍ | أجب على التحدي بشكل متزامن، قبل أي وسيط مصادقة أو طابور |
| رابط الأمس يعطي 404 | رابط التنزيل ميت، والرندر يبدو وكأنه اختفى | رابط التنزيل محدود بالوقت. الرندر سليم | استعلم عن نفس task_id مرة أخرى للحصول على رابط جديد، خلال نافذة الـ 7 أيام |
| 429 عشوائية تحت الحمل | بعض الإرسالات مرفوضة، ولا يوجد طابور | التوافقية محدودة بسقف صارم، وليست خط انتظار | حدد عدد طلباتك قيد التنفيذ وأعد محاولة الإرسال، وليس الرندر |
الصف الأول هو الذي يلتهم أمسيات كاملة، ويستحق أن نكون دقيقين بشأنه. كان إصدار MiniMax الأقدم من واجهة توليد الفيديو يُبلغ عن التقدم بكلمات بأحرف كبيرة من فئة Preparing / Queueing / Processing / Success / Fail. أما نقطة نهاية الاستعلام في الإصدار v2 المستخدمة بواسطة H3 فتُرجع queued وrunning وsucceeded وfailed وcancelled (مرجع MiniMax API، أغسطس 2026). لا تزال الكثير من وثائق البائعين الخارجيين تطبع المجموعة القديمة، أو تخلط بين المجموعتين في صفحة واحدة. إذا ورثت حلقة من أحد هذه المصادر، فلن تنتهي أبدًا، لأن السلسلة التي تنتظرها لا تُرسل أبدًا.
سير عمل درس MiniMax H3: ثلاث نقاط نهاية، خمس حالات، حلقة واحدة
أُطلق H3 في 2026-07-31 كنموذج فيديو شامل الوسائط: النص والصورة والفيديو والصوت كلها تعيش في نفس نافذة السياق، والمخرج يصل إلى 15 ثانية بدقة 2K مع صوت استريو أصلي (MarkTechPost، أغسطس 2026). بالنسبة للـ API، هذا يعني نقطة نهاية create واحدة تحتوي مصفوفة content، وما تضعه في المصفوفة يحدد الوضع الذي أنت فيه.
| الوضع | ما يدخل في content | الدور على عنصر الصورة | ماذا يفعل ratio | استخدمه من أجل |
|---|---|---|---|---|
| نص إلى فيديو | عنصر نص واحد | لا شيء | مطلوب، وadaptive مرفوض | لقطات بلا صورة مصدر، تحكم كامل في الإطار |
| صورة إلى فيديو | عنصر نص + عنصر صورة | first_frame (اختياريًا أيضًا last_frame) | يُتجاهل، الإطار الأول يحدد | تحريك صورة ثابتة قمت بتوجيه إخراجها مسبقًا |
| مرجع إلى فيديو | عنصر نص + عنصر مرجع | reference_image (أيضًا reference_video وreference_audio) | مطلوب، مثل النص فقط | الحفاظ على شخصية واحدة أو صوت واحد عبر اللقطات |
وهذا الجزء الذي يجب أن يتعامل معه كودك بالفعل. خمس حالات، وخمسة فروع مختلفة.
| الحالة | ماذا تعني | ماذا يفعل كودك |
|---|---|---|
| queued | تم القبول، بانتظار فتحة | استمر في الاستعلام، مع إبطاء |
| running | جارٍ التصيير | استمر في الاستعلام، مع إبطاء |
| succeeded | اكتمل، content.url ممتلئ | نزّل فورًا، في هذه التكرارية |
| failed | فشل الرندر | اقرأ جسم الخطأ، سجله، ولا تُعد المحاولة بنفس الحمولة بشكل أعمى |
| cancelled | تم إلغاء المهمة | اخرج من الحلقة، وعاملها كحالة نهائية |
| أي شيء آخر | ليس ضمن التعداد | ارفع خطأ. حالة جديدة تعاملها بصمت على أنها "استمر بالانتظار" هي الخطأ المذكور في الجدول أعلاه |
لا توجد حالة expired. هذه الكلمة تُلصق بهذا الـ API كثيرًا وهي تعود لأمرين آخرين: رابط التنزيل، وهو محدود بالوقت ويمكن تحديثه، وسجل المهمة، وهو قابل للاستعلام فقط لآخر 7 أيام. كلاهما مغطى في الخطوة 4.
رقم آخر قبل الكود. التوافقية لتوليد الفيديو على H3 محدودة بعدد الاتصالات، وليس بالطلبات في الدقيقة: مهمتان متزامنتان في الخطة المجانية، و15 بعد الدفع (حدود معدل MiniMax، أغسطس 2026). بعد تجاوز السقف تحصل على 429 فورًا. لا شيء يُنتظر في طابور بالنيابة عنك. وقد دفعت أيضًا 20 مهمة H3 متزامنة عبر بوابة توجيه ووصلت العشرون جميعًا، وفي يوم آخر حصلت على 429 على نفس الإعداد، لذا تعامل مع أي رقم فوق السقف الموثق كطقس وليس كثابت.
مباشرة أو عبر بوابة
الخطوات الثلاث هي نفسها في الحالتين، لكن النصوص تختلف، وهذا مهم عندما تبحث عن الخطأ في الواحدة صباحًا.
| 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 عند الفشل |
| إشعارات الدفع | رابط callback مع مصافحة التحدي خلال 3 ثوانٍ | استعلم عن prediction id |
| التوافقية | 2 مجانًا، 15 مدفوعًا، 429 صارم | غير منشورة كسقف لكل نموذج، وتُقاس على نطاق أوسع عمليًا |
| نموذج صور الإطار الأول على نفس المفتاح | لا، حساب منفصل | نعم، GPT Image 2 وH3 خلف مفتاح واحد |
| سعر H3 | منشور حسب فئة الدقة | لكل ثانية إخراج، متدرج حسب الدقة، ويُعرض لك السعر على زر Run قبل الإرسال |
السبب في تشغيل سلسلة هذا الدرس على بوابة هو الصف الثاني قبل الأخير فقط: الإطار الأول يأتي من نموذج صور من OpenAI واللقطتان من MiniMax، ولم أرد مزودين ومفتاحين وصفحتي فوترة لفيلم واحد مدته 14 ثانية. إذا كنت داخل منصة MiniMax بالفعل، فابق هناك، فالحلقة أدناه تعمل دون تغيير باستثناء المسارات وكلمات الحالة.
مولد فيديو Hailuo AI: كيف تستخدمه قبل كتابة أي كود
إذا وصلت إلى هنا وأنت تبحث عن طريقة استخدام مولد فيديو Hailuo AI، فأنت في المكان الصحيح ولا تحتاج إلى أي كود بعد. Hailuo هو التطبيق الموجّه للمستخدمين من MiniMax وH3 هو اسم النموذج الذي يستخدمه الـ API. نفس المحرك، باب مختلف.
ثلاث دقائق، دون طرفية:
- افتح صفحة نموذج، مثل MiniMax H3 من صورة إلى فيديو. الملعب التفاعلي هو اللوحة اليمنى من الصفحة.
- أسقط صورة إطار أول، أو انتقل إلى صفحة نص إلى فيديو واكتب prompt فقط. اضبط الدقة والمدة. قل بصوت مسموع ما تريد سماعه، وليس فقط ما تريد رؤيته: H3 يولّد الصوت في نفس المرور، لذا "مطر يتساقط على الزجاج، نقرات مؤازر صغيرة" هي تعليمات حقيقية وليست زخرفة.
- اضغط Run. يعرض الزر السعر الدقيق للإعدادات التي اخترتها قبل الالتزام بها. انتظر، نزّل.
هذا هو المسار الكامل بدون كود، وبالنسبة للقطات المنفردة فهو الخيار الأسرع فعلًا. في اللحظة التي تريد فيها عشر نسخ، أو إطارًا أول يولده نموذج آخر ويُغذّى مباشرة، عُد إلى الكود. هذا ما تدور حوله بقية المقالة.
درس 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.
text1A cluttered clockmaker's workshop at dusk, warm tungsten lamp over a scarred oak 2bench. An old repairman in a leather apron leans close to a small brass mechanical 3bird resting in his cupped hands, its wing plates half-open, tiny gears visible. 4Rain streaks the mullioned window behind him; a coal stove glows amber at frame 5left. Shallow depth of field, 35mm, volumetric dust in the lamp beam, deep amber 6and teal palette, photoreal, no text. 7

ملعب GPT Image 2 على Atlas Cloud مع prompt الإطار الأول من هذا الدرس وورشة صانع الساعات المعروضة في لوحة المخرجات
GPT Image 2 على Atlas Cloud، بجودة high عند 2048x1152. يعرض زر Run السعر الدقيق للإعدادات التي اخترتها، 0.1745 دولار لهذه الصورة، قبل الالتزام بها.
احتفظ بالرابط المُعاد. الخطوة 2 تغذيه مباشرة إلى H3، دون الحاجة إلى رحلة تنزيل.
الخطوة 2: إنشاء مهمة MiniMax H3 والاحتفاظ بـ task_id
استدعاء create يقوم بأمرين ثم يتوقف عن الاهتمام بك: يتحقق من صحة الحمولة ويُرجع task_id. حدوث 400 هنا يعني مشكلة في حمولتك، وليس إخفاقًا عابرًا، لذا لا تضعه خلف حلقة إعادة محاولة. كل فئة أخرى من المشاكل تظهر لاحقًا، أثناء الاستعلام.
العادة الوحيدة التي توفر أموالًا حقيقية: احفظ task_id قبل فعل أي شيء آخر. المهام قابلة للاستعلام فقط لمدة 7 أيام، وإذا ماتت عمليتك والمعرّف في الذاكرة، تكون قد دفعت ثمن رندر لم يعد بإمكانك الوصول إليه.
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 # your payload is wrong. retrying it will just be wrong again. 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: # persist BEFORE anything else 18 f.write(json.dumps({"task_id": task_id, "at": int(time.time()), 19 "payload": payload}) + "\n") 20 return task_id 21 22SHOT_A_PROMPT = ( 23 "The old repairman's hands steady the brass bird. Its glass eyes flicker alight, " 24 "wing plates click open one by one. He leans in and whispers, close to the mic, " 25 ""Let's see if you still remember the sky." Slow 50mm push-in, lamp light raking " 26 "across the brass, rain ticking on the window, coal stove crackling, tiny servo " 27 "clicks under his voice. Warm amber key, teal window fill. No on-screen text." 28) 29 30shot_a = create_task({ 31 "model": "MiniMax-H3", 32 "resolution": "2K", 33 "duration": 8, 34 # no "ratio" here on purpose: image-to-video takes the frame from the first frame 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
هذا هو نفس ذلك الـ prompt والإطار الأول يعملان كمهمة، حتى ترى كيف يبدو الإرسال السليم من الجانب الآخر:

ملعب MiniMax H3 من صورة إلى فيديو على Atlas Cloud مع إطار أول للورشة محمّل والclip المكتمل في لوحة المخرجات
MiniMax H3 من صورة إلى فيديو: الإطار الأول محمّل على اليسار، وclip بدقة 2K مكتمل في OUTPUT على اليمين. لاحظ حقل Aspect Ratio مثبتًا على adaptive، والسعر 1.12 دولار لـ 2K بمدة 8 ثوانٍ.
الخطوة 3: استعلم عنه، وتعامل مع حالات 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 is live NOW 16 if status in TERMINAL_BAD: 17 raise RuntimeError(f"{status}: {json.dumps(r.json())[:400]}") 18 if status not in IN_FLIGHT: 19 # a status the enum does not have. do NOT fall through to "keep waiting". 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) # 3s -> 15s ceiling 25 raise TimeoutError(f"{task_id} still not terminal after {timeout_s}s") 26
ثلاثة أشياء في هذا الكود مقصودة:
status not in IN_FLIGHT يرفع خطأ بدلًا من المتابعة. إذا أضافت MiniMax حالة سادسة في الربع القادم، تريد انهيارًا صاخبًا، لا حلقة تنتظر كلمة لا تأتي أبدًا. هذا السطر وحده هو الفرق بين الدرس المعطوب وهذا الدرس.
failed لا يعيد المحاولة. الرندر الفاشل يعني عادة أن الـ prompt اصطدم بعامل تصفية أو أن الحمولة تحتوي توليفة سيئة، وإعادة إرسال نفس الحمولة تشتري لك نفس الفشل بالسعر الكامل. سجل الجسم، انظر إليه، ثم قرر.
الإبطاء يبدأ من 3 ثوانٍ وينتهي عند 15. H3 بدقة 2K يستغرق دقائق، لا ثوانٍ. الاستعلام مرة كل ثانية يحرق حد المعدل الخاص بك على نقطة نهاية الاستعلام.
الخطوة 4: نزّل قبل انتهاء صلاحية الرابط
في اللحظة التي تصل فيها succeeded، قم ببث الملف إلى القرص. الرابط في content.url هو رابط محدود بالوقت صراحة: "نزّله أو خزّنه فورًا؛ استعلم مرة أخرى للحصول على رابط جديد بعد انتهاء صلاحيته" (مرجع MiniMax API، أغسطس 2026). إنه ليس مسار CDN يمكنك وضعه في قاعدة بياناتك وتنساه.
النصف الثاني هو الخبر الجيد، وهو الإجابة عن رابط 404 الذي رأيته في الصباح التالي. الرندر لم يختفِ. استعلم عن نفس task_id مرة أخرى وستحصل على رابط جديد، حتى 7 أيام بعد الإنشاء.
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 """Dead link? The render is fine. Ask again, inside the 7-day window.""" 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، بجانب الصورة الثابتة التي بدأت منها:

جنبًا إلى جنب: الإطار الأول المولّد على اليسار، وإطار من clip MiniMax H3 المكتمل على اليمين، يظهر ألواح جناح الطائر مفتوحة والعينين مضيئتين
يسار: الصورة الثابتة من GPT Image 2 في الخطوة 1، كما أُرسلت تمامًا. يمين: إطار مسحوب من clip بدقة 2K الذي أعاده H3. نفس المجموعة، نفس الإضاءة، ألواح الجناح والعينان هما ما تحرك.
الخطوة 5: اللقطة B باستخدام MiniMax H3 نص إلى فيديو، حيث يكون ratio إلزاميًا
لا يوجد إطار مصدر للسماء، لذا اللقطة B نص فقط. وهذا يقلب قاعدة ratio من "متجاهَل" إلى "مطلوب": بالنسبة لـ prompt نصي فقط، ratio مطلوب ولا يمكن أن يكون adaptive (مرجع MiniMax API، أغسطس 2026). احذفه أو أرسل adaptive وستحصل على 400 فوري، قبل بدء أي رندر.
النموذج: minimax/h3/text-to-video. الإعدادات: 2K، المدة 6، ratio 16:9.
text1The brass bird bursts through a half-open workshop skylight into a rain-washed 2evening sky, wings beating in a whir of gears, droplets spraying off the metal 3feathers as it climbs past wet slate rooftops toward a break of gold cloud. 4Camera cranes up behind it, 24mm, backlit rim from the low sun. Sound: wing 5servos whirring, wind rising, distant church bell, rain fading out. No text. 6
python1shot_b = create_task({ 2 "model": "MiniMax-H3", 3 "resolution": "2K", 4 "duration": 6, 5 "ratio": "16:9", # required here. omit it or pass "adaptive" -> 400 6 "content": [{"type": "text", "text": SHOT_B_PROMPT}], 7}) 8download(poll(shot_b)["content"]["url"], "shot-b.mp4") 9

ملعب MiniMax H3 نص إلى فيديو على Atlas Cloud مع prompt طيران الطائر وclip المكتمل في لوحة المخرجات
MiniMax H3 نص إلى فيديو مع prompt اللقطة B وحقل Aspect Ratio مضبوطًا صراحة على 16:9. استخدمت هذه التشغيلة المدة الافتراضية للصفحة وهي 8 ثوانٍ بدلًا من 6 في الحمولة أعلاه.
الخطوة 6: تجاوز الاستعلام باستخدام callback، وأعد التحدي خلال 3 ثوانٍ
إذا كنت تفضل أن يُخبرك النظام بدلًا من أن تسأل، مرر callback_url في استدعاء create. هناك شرط واحد بالضبط، وهو موثق في قوس واحد في مرجع الـ API، وهو السبب الأكثر شيوعًا لفشل الـ callback الذاتي الاستضافة.
قبل أن ترسل MiniMax أي شيء إليك، ترسل طلب تحقق يحتوي حقل challenge، و"يجب عليك إرجاع challenge دون تغيير خلال 3 ثوانٍ لإكمال التحقق" (مرجع MiniMax API، أغسطس 2026). إن فاتك ذلك، فلن يظهر خطأ في أي مكان. استدعاءات create تستمر بالنجاح، والرندرات تستمر بالاكتمال، وأنت ببساطة لا تستقبل أي إشعار أبدًا. لا شيء في أي سجل يقول لماذا.
اثنا عشر سطرًا من FastAPI، والترتيب داخلها هو بيت القصيد:
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: # verification handshake, answer it FIRST 9 return {"challenge": body["challenge"]} # unchanged, synchronous, no auth gate 10 task_id = body.get("task_id") 11 status = body.get("status") 12 enqueue(task_id, status) # real notification: hand off, return fast 13 return {"ok": True} 14
الأخطاء التي تقتله، بترتيب تكرار ما رأيت:
- طلب التحدي يمر عبر وسيط المصادقة الخاص بك ويحصل على 401 أو إعادة توجيه. التحقق غير مصادق عليه بحكم تعريفه. أضف المسار إلى القائمة البيضاء.
- المعالج يدفع التحدي إلى طابور ويجيب بشكل غير متزامن. الأوان فات. يجب أن يكون الرد في جسم استجابة ذلك الطلب نفسه.
- القيمة يُعاد تسلسلها أو تُقتطع أو تُغلّف. أعدها حرفًا بحرف.
- تختبر عبر نفق ضد خادم تطوير serverless، ووقت البدء البارد وحده يتجاوز 3 ثوانٍ. سخّنه أولًا، أو تحقق عبر عملية تعمل بالفعل.
الاستعلام الدوري جيد تمامًا، بالمناسبة. إذا كان لديك حفنة من المهام في الساعة، فحلقة الخطوة 3 أقل كودًا وأقل عرضة للكسر. الـ callback يستحق العناء عندما يكون لديك مهام كثيرة ولا تريد مستعلمًا لكل مهمة.
الخطوة 7: دمج اللقطتين في فيلم واحد
عادت كلتا اللقطتين بترميز h264 بدقة 2560x1440 بمعدل 24 إطارًا في الثانية مع صوت استريو AAC بتردد 32kHz. نفس الحاوية، نفس كل شيء، لذا هذا نسخ دفق بدلًا من إعادة ترميز. لا خسارة في الجودة، لا انتظار.
مفاجأة صغيرة تستحق توقعها: طلب 6 ثوانٍ أعطاني ملفًا بطول 6.58 ثانية. المدد تعود قريبة مما طلبته، وليست مضبوطة على الإطار، لذا تبلغ مجموع اللقطتين 14.62 ثانية بدلًا من 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
هذا المخرج هو الفيديو في أعلى المقالة. إذا اشتكى -c copy، فمعناه أن لقطتيك بدقتين أو معدلي إطارات مختلفين، وهذا على H3 يعني أنك غيّرت resolution بين الاستدعاءين. طابقهما، أو احذف -c copy واقبل إعادة ترميز واحدة.
تنويعات درس MiniMax H3 تستحق الاقتباس
خمسة أشياء تستحق التجربة بمجرد أن تعمل الحلقة أعلاه، بترتيب تقريبي حسب مقدار المال الذي توفره.
مسودة بدقة 768P ثم اللمسة النهائية بدقة 2K. كلتا الفئتين هما نفس النموذج، و768P تكلف حوالي 29% أقل لكل ثانية. صيّر مرشحيك قصيرًا ورخيصًا، شاهدهم، ثم أعد تشغيل الفائز فقط بدقة 2K مع نفس الـ prompt. هذا هو المكان الذي تعيش فيه معظم المدخرات في قائمة اللقطات. أي فئة تحتاجها فعلًا للتسليم هو نقاش آخر، وقد خضته في 768P مقابل 2K.
المدة هي أي عدد صحيح من 4 إلى 15. ليست مجموعة قوالب جاهزة. إذا كان الحركة تستقر عند 7 ثوانٍ، اطلب 7 وتوقف عن الدفع مقابل 8.
إطار أول بالإضافة إلى إطار أخير. أرسل عنصر صورة ثانيًا بدور last_frame وسيبني H3 الانتقال بينهما. مفيد للمناولات بين لقطات وجهت إخراجها مسبقًا.
مرجع إلى فيديو للاستمرارية. دور reference_image يحافظ على شخصية عبر اللقطات بدلًا من إعادة تشكيل وجهها في كل توليدة. وهناك دور reference_audio مماثل بنافذة من 2 إلى 15 ثانية لمقطع المرجع، وهذه هي طريقة إبقاء الصوت متناسقًا. انظر مرجع إلى فيديو.
رأس متكلم عمودي. ratio: "9:16" مع سطر حوار في الـ prompt هو الاستخدام الأعلى حجمًا لهذا النموذج حاليًا، لأن الصوت يخرج من نفس المرور وتتطابق الشفاه دون خطوة مزامنة شفاه منفصلة.
حرفية الـ prompt مهارة منفصلة عن أنابيب عدم التزامن، وإذا كانت لقطاتك نظيفة تقنيًا لكنها مسطحة بصريًا، فالمشكلة أعلى من هذه المقالة. ابدأ بـ دليل prompts لـ H3.
كم كلف تشغيل درس MiniMax H3 هذا
بنود حقيقية من التشغيل الذي أنتج الفيلم في الأعلى، مسعّرة بواسطة زر Run وتحققت منها في 2026-08-12. H3 يُفوتر لكل ثانية إخراج والسعر متدرج حسب الدقة: مهام 2K سُعّرت بـ 1.12 دولار مقابل 8 ثوانٍ، أي 0.14 دولار في الثانية، وسعر الكتالوج الافتتاحي 0.10 دولار هو فئة 768P. جميع نقاط نهاية H3 الثلاث بالسعر الكامل الآن، دون أي خصم مطبق.
| الخطوة | النموذج | الإعدادات | التكلفة |
|---|---|---|---|
| الإطار الأول | GPT Image 2 text-to-image | جودة high، 2048x1152 | $0.1745 |
| اللقطة A | H3 image-to-video | 2K، 8 ثوانٍ | $1.12 |
| اللقطة B | H3 text-to-video | 2K، 16:9، 6 ثوانٍ | $0.84 |
| الفيلم النهائي | 14.6 ثانية، لقطتان، 2560x1440، صوت استريو | $2.13 | |
| تشغيلات لقطات الشاشة لهذه المقالة | H3 i2v + t2v | 2K، 8 ثوانٍ لكل منهما | $2.24 |
جدير بالذكر أن نفس اللقطتين بمسودة 768P كانتا ستكلفان 0.80 دولار و0.60 دولار بدلًا من 1.12 دولار و0.84 دولار، أي خصم حوالي 29%، مقابل لقطات يمكنك الحكم عليها بثقة.
تفصيلان في الفوترة يسهل تعلمهما بالطريقة المكلفة. الطلب المرفوض عند الإرسال لا يكلف شيئًا، لذا 400 بسبب ratio ناقص مجاني. الطلب الذي يُصيّر شيئًا عديم الفائدة ليس مجانيًا: إذا وصلت المهمة إلى succeeded، فأنت مدفوع، حتى لو لم يكن الإخراج ما أردت. هذه هي الحجة الحقيقية للعمل بمسودة 768P.
الأسعار لكل ثانية، ومقارنة 768P و2K، وكيف يتصرف السعر عبر المدد، كلها مشروحة بالتفصيل في تسعير API لنموذج MiniMax H3 المصاحب لهذه المقالة. هذه المقالة عن الكود، وتلك عن الفاتورة.
الإسناد والنطاق قبل الإطلاق
أمران يجب فحصهما قبل أن يذهب هذا إلى أي مكان عام. تتضمن شروط استخدام MiniMax التزام دفاع مشروط يغطي دعاوى براءات الاختراع والعلامات التجارية ضد مخرجات الـ API، وهذا الالتزام لا يمتد إلى العلامات التجارية أو الصورة الشخصية، لذا فإن الشعار المعروف أو الشخص الحقيقي في الـ prompt لا يزال مشكلتك أنت. بشكل منفصل، يحمل ترخيص الأوزان المفتوحة لـ H3 بند "أقاليم مستبعدة"، وهذا البند يحكم الأوزان المُنزّلة ومخرجاتها، وليس الـ API المستضاف، الذي تنص شروطه على منطقة خدمة أمريكية يمكنك تحديدها. اقرأ العقد الذي وقعته فعلًا. وسمّ مخرجات H3 كمخرجات H3 في واجهتك.
الأسئلة الشائعة عن درس MiniMax H3
ما هي حالات مهام MiniMax H3، وهل توجد حالة expired؟
خمس حالات: queued وrunning وsucceeded وfailed وcancelled. لا توجد حالة expired. أمران آخران ينتهي صلاحيتهما ويُخلط بينهما وبين حالة: رابط التنزيل في content.url محدود بالوقت، وسجل المهمة نفسه قابل للاستعلام فقط لآخر 7 أيام.
هل يجب أن أستخدم callback، أم أن الاستعلام الدوري يكفي لـ MiniMax H3؟
الاستعلام الدوري كافٍ وأقل كودًا. استخدم callback عندما يكون لديك عدد كافٍ من المهام المتزامنة بحيث يصبح مستعلم لكل مهمة أمرًا غير عملي. إذا فعلت، يجب على الـ endpoint إعادة حقل challenge دون تغيير خلال 3 ثوانٍ، بشكل متزامن، قبل أي وسيط مصادقة. المصافحة الفاشلة لا تُنتج أي رسالة خطأ، فقط صمتًا دائمًا.
لماذا يرفض طلب MiniMax H3 نص إلى فيديو برمز 400 مع رسالة "ratio is required and cannot be adaptive"؟
لأنك في وضع النص فقط، حيث لا يوجد إطار أول يُستدل منه على الإطار. مرر قيمة صريحة: 21:9 أو 16:9 أو 4:3 أو 1:1 أو 3:4 أو 9:16. نفس القاعدة هي سبب ظهور ratio وكأنه لا يفعل شيئًا في التحويل من صورة إلى فيديو، حيث يحدد الإطار الأول الإطار ويُتجاهل أي ratio ترسله.
كم عدد مهام MiniMax H3 التي يمكنني تشغيلها بالتوازي؟
السقف الموثق قائم على الاتصال: مهمتان متزامنتان مجانًا، و15 مدفوعًا. فوق السقف تحصل على 429 فوري بدلًا من خانة انتظار، لذا حدد عدد طلباتك قيد التنفيذ. بوابات التوجيه أحيانًا تمتص أكثر من ذلك، وقد أكملت 20 مهمة متزامنة جميعها، لكنني تلقيت أيضًا 429 على نفس الإعداد في يوم آخر. لا تبنِ جدولة تفترض الرقم الأعلى.
رابط فيديو MiniMax H3 يعطيني 404 بعد يوم. هل الرندر اختفى؟
لا. الرابط انتهت صلاحيته، الرندر لم يختفِ. استعلم عن نفس task_id مرة أخرى وسيحمل الرد رابطًا جديدًا، في أي وقت خلال نافذة الاستعلام البالغة 7 أيام. بعد 7 أيام لم يعد سجل المهمة نفسه قابلًا للاستعلام، ولهذا تحفظ الخطوة 2 task_id قبل فعل أي شيء آخر.
بحثت عن "طريقة استخدام مولد فيديو hailuo ai" ووصلت إلى درس MiniMax H3. هل أنا في المكان الصحيح؟
نعم. Hailuo هو تطبيق المستهلك وH3 هو اسم النموذج المستخدم في الـ API. نفس المحرك. إذا أردت لقطة واحدة، استخدم مسار الملعب التفاعلي في قسم سير العمل أعلاه، دون حاجة لكود. إذا أردت عشر نسخ أو إطارًا أول يُضخ من نموذج آخر، فالخطوات السبع مخصصة لك.






