status: "failed". لا تُحتسب رسوم على المهام الفاشلة والملغاة، فأنت تدفع مقابل المهام المكتملة فقط. في تطبيق العُقد (node app)، لا تُحتسب أبدًا رسوم على مهمة التطبيق نفسها. تُحتسب رسوم كل عقدة توليد أو عقدة LLM عند اكتمال مهمتها الخاصة. لا يؤدي الفشل إلى إلغاء العُقد المتوازية أو الفروع الأخرى، لذا تُحتسب أيضًا رسوم العقدة التي تكتمل بعد فشل التطبيق، ولا تُسترد تلك الرسوم. لا تُحتسب رسوم على العقدة التي تفشل أو تُلغى أو لا تبدأ أبدًا. راجع مفاتيح API والفوترة.
أخطاء وقت الطلب والمهام الفاشلة
أخطاء وقت الطلب تُرجع حالة4xx أو 5xx. لا تُنشأ أي مهمة. اقرأ نص الاستجابة كما هو موضح أدناه.
المهام الفاشلة تُرجع حالة نجاح عند الإرسال. استعلم عبر GET /jobs/{id} أو انتظر الويب هوك. عند انتهاء المهمة، تكون قيمة status هي "failed" ويكون الفشل في كائن error في المستوى الأعلى. لا تقرأ result في مهمة فاشلة: فهو محذوف (أو null). ولا يحتوي على المخرجات إلا عندما تكون status هي "completed". أما المهمة cancelled فلا تحتوي على result ولا على error.
اعتمد في التفرّع على error.code. قد يُحذف message، وفي حالتي provider_error وinternal يكون نصًا حرًا صادرًا عن المزوّد. لا تحلّل message.
نصوص الاستجابات
في نقاط نهاية generate وjobs وassets وstyles وnode apps، اقرأmessage ?? error عندما يكون النص بصيغة JSON. يحمل أحد هذين الحقلين الملخص. بعض نصوص 5xx ليست بصيغة JSON، ومنها 502 يكون نصها نصًا عاديًا هو error code: 502. حلّل الاستجابة بحذر: إذا لم يكن النص بصيغة JSON، فاعتمد في التفرّع على حالة HTTP.
تستخدم معظم حالات الفشل الشكل { "message": "..." }، أحيانًا مع حقول إضافية (limit وjobType وmodelAccessDenial). أما JSON غير الصالح وبعض المعالجات المذكورة أدناه فتستخدم { "error": "..." } بدلًا من ذلك.
تُرجع نقاط نهاية MCP مثل /mcp أخطاء JSON-RPC بالشكل { "jsonrpc", "id", "error": { "code", "message" } }، وليس نصوص HTTP الواردة في هذه الصفحة.
أرسل Accept: application/json
أخطاء { "message" }، بما فيها 401 و404، تكون بصيغة JSON عندما تكون قيمة Accept هي application/json أو */*. عندما تكون Accept مفقودة أو قيمتها text/html، تكون هذه الحالات صفحة HTML (Content-Type: text/html) وسيفشل محلّل JSON.
يهمّ هذا العملاء الذين لا يرسلون ترويسة Accept، ومنهم urllib في Python. يرسل curl افتراضيًا Accept: */*، وكذلك fetch في Node، لذا يتلقى كلاهما JSON ما لم تغيّر Accept.
تُرجع الطلبات غير المصادَق عليها إلى POST /generate/... وGET /jobs/{id} وGET /styles وGET /assets الحالة 401 مع {"message":"Unauthorized"} عند */* وapplication/json، وصفحة HTML عند غياب Accept أو عند text/html. ويحدث الأمر نفسه مع الحالة في طلب GET /jobs/{id} مصادَق عليه لمعرّف غير معروف: 404 بصيغة JSON مع {"message":"Job not found or unauthorized"} عندما تطلب Accept صيغة JSON، و404 بصيغة text/html عندما تكون Accept مفقودة.
يستخدم JSON غير الصالح (400) والتحقق (422) الشكل { "error" } ويبقيان بصيغة JSON حتى عند غياب Accept. وينطبق الأمر نفسه على 422 الخاص بالحقول المُزالة، و410 الخاص بالنماذج الموقوفة، و402 الخاص بـ Zero Data Retention، واستجابات { "error" } في تطبيقات العُقد، وأخطاء Agent operation API المُعيَّنة. كما أن 402 و429 الناتجتين عن قبول مهمة POST /generate/... تكونان بصيغة JSON أيضًا، حتى مع Accept الخاصة بالمتصفح.
تستخدم 413 و500 الشكل { "message" } وتتبعان Accept، مثل 401 و404.
التحقق (422)
details كل المشكلات. field هو المسار مربوطًا بـ . ("image_style_references.0.url"). تستخدم الأخطاء على مستوى الكائن سلسلة فارغة، كما في المفتاح غير المعروف أعلاه. تُنتج عدة مفاتيح غير معروفة Unrecognized keys: ... مع field الفارغ نفسه. لا يُضاف expected إلا عندما تكون code هي "invalid_type".
تستخدم ترويسة X-Webhook-URL غير الصالحة استجابة 422 نفسها.
يُرجع GET /jobs مع معلمات استعلام غير صالحة استجابة 422 هذه أيضًا، وليس 400.
يُرجع فحص مدخلات Zero Data Retention الذي يفشل داخل الأداة 422 مع الشرح في message (بشكل { "message" }، لذا تهمّ Accept). راجع Zero Data Retention.
الحقول المُزالة والموقوفة (422)
يستخدم الحقل المُزال batchSize / batch_size استجابة 422 مختلفة، من دون مصفوفة details:
batch_size بالطريقة نفسها. وتكون قيمة field هي الاسم الذي أرسلته.
يستخدم الاسم البديل الموقوف لحقلٍ ما قيمة reason إما "deprecated_field" أو "conflicting_fields"، بالإضافة إلى replacement وsunset_date وmigration_url عند انطباقها. اعتمد في التفرّع على error وreason. أما الجملة التي تُعرض على الشخص فهي message.
النماذج الموقوفة نهائيًا (410)
يُرجع النموذج الذي تجاوز تاريخ إيقافه النهائي 410 مع Deprecation: true وترويسة Sunset (تاريخ بصيغة RFC 1123):
error ثابتة وهي "model_unavailable". يُحذف replacement وmigration_url عندما لا يوجد بديل موصى به. ستستمر إعادة المحاولة بالنموذج نفسه في إرجاع 410. انتقل إلى replacement عند تعيينه، وراجع إيقاف الدعم.
يرسل النموذج الموقوف الذي لا يزال يعمل الترويستين Deprecation وSunset في كل استجابة، بما فيها الأخطاء. واستخدام اسم بديل موقوف لحقلٍ ما يفعل الشيء نفسه، بما في ذلك في استجابة 422 الخاصة به. وعند وجود دليل ترحيل، تُرسل أيضًا ترويسة Link: <migration_url>; rel="deprecation".
رموز الحالة
400
يكون JSON غير الصالح في generate دائمًا بصيغة JSON، من دون الحاجة إلى ترويسة Accept:
{ "error" } لعنوان URL لمدخل لا يمكنه استخدامه: Invalid URL for input "<key>"، أو Failed to download URL for <key>: …. تغطي رسالة التنزيل حالات الفشل المؤقتة أيضًا، لذا على عكس generate (راجع تنزيل المدخلات) يكون فشل التنزيل في تطبيق العُقد دائمًا 400. أعد المحاولة مرة واحدة إذا كان عنوان URL صالحًا.
JSON غير الصالح في POST /node-apps/{id}/execute ليس استجابة 400 الخاصة بـ generate أعلاه. بل يصبح 500 مع { "message": "Internal Error" }، من دون نص الاستثناء، ويتبع Accept.
استجابات 400 الأخرى في الأصول وتطبيقات العُقد تكون { "message": "..." } مع شرح قصير، مثل No file provided في الرفع عبر رابط موقَّع مسبقًا أو Invalid pagination parameters في إصدارات تطبيق العُقد. يمرّر الرفع الفاشل للأصل حالة خدمة الرفع كما هي (400 أو 401 أو 404 أو 500) وقد يضع نص استجابتها في message. وأحيانًا يكون هذا النص سلسلة JSON. معلمات الاستعلام غير الصالحة في GET /jobs تُرجع 422، وليس 400.
401
في generate وjobs وassets وstyles وnode apps:
{ "message": "Presigned upload URL expired" } أو { "message": "Invalid presigned upload URL" }.
الدفع مطلوب (402)
بالنسبة لعميل يُحاسَب عبر API (مفتاح API، أو MCP باستخدام مفتاح API) لا يغطي رصيد API لديه المهمة:
message الأخرى لـ 402 في واجهة API العامة:
يُرجع طلب generate مع Zero Data Retention على مساحة عمل لم تُفعَّل فيها الميزة هذا النص، بصيغة JSON دائمًا:
402 خاصة بها. وهي تعتمد على رصيد الحوسبة في مساحة العمل، وليس على رصيد API.
403
404
كل استجابة 404 تكون { "message" }، مثل معرّف مهمة غير معروف:
Accept هذه الاستجابات بصيغة HTML، باستثناء Endpoint not found لنموذج لا يمكن لمفتاحك أو خطتك استخدامه، فهي بصيغة JSON دائمًا. طلب GET /jobs/{id} مصادَق عليه لمعرّف غير معروف بدون Accept يُرجع 404 بصيغة text/html.
العملية غير المعروفة في Agent تُرجع أيضًا
404 مع { "message": "Endpoint not found" }، وليس شكل Agent { "error", "code" }.
405
النص نص عادي بدون ترويسة Content-Type، وليس JSON، حتى عندما تكون Accept هي application/json. النص هو الطريقة متبوعة بـ method not allowed، مثل GET method not allowed. تسرد ترويسة Allow الطرق التي يقبلها المسار.
الحمولة كبيرة جدًا (413)
يُرفض نص الطلب الكبير جدًا بالحالة 413. عند صدورها من واجهة API نفسها، يتبع النص Accept:
413 بصيغة HTML. لا ترسل الملفات ضمن الطلب مباشرة. ارفع الملف باستخدام POST /assets ومرّر عنوان URL المُرجَع في طلب generate.
تنزيل المدخلات
المضيف الذي يُرجع404 أو 410 يؤدي إلى 422 دائمة. النص بصيغة JSON، وAccept مهمة:
410 من المضيف الجملة نفسها مع 410. تستخدم حالات الرفض الدائمة الأخرى Input file rejected: ….
فشل التنزيل القابل لإعادة المحاولة يكون 502 أو 504. اعتمد في التفرّع على رمز الحالة، وليس على النص، وأعد المحاولة.
تكرار
502 لعنوان URL نفسه يعني على الأرجح أن عنوان URL محظور أو معطّل. غيّر عنوان URL.
حالات فشل التحويل عند تصدير النماذج ثلاثية الأبعاد تكون 502 أيضًا. لم يُختبر هذا المسار مباشرة، لذا قد يصل النص أيضًا على هيئة نص Cloudflare عادي error code: 502. اعتمد في التفرّع على رمز الحالة وأعد المحاولة. تكرار 502 لعنوان URL النموذج نفسه يعني على الأرجح أن عنوان URL محظور أو معطّل.
التزامن 429
عندما لا يمكن إضافة المهمة إلى التراكم، قد يُرفض الطلب الذي يتجاوز حد التزامن بالحالة 429 مع Content-Type: application/json:
limit هو حد التزامن لديك لهذا النوع من المهام. يُحتسب لكل مستخدم، وليس لكل مساحة عمل. وهو تقريبي: فقد تُقبل دفعة قصيرة فوقه، لذا لا تفترض أن الطلب رقم limit + 1 هو الذي سيفشل. jobType فئة مهام داخلية، وليس مسار النموذج العام. لا تعتمد عليه في التفرّع.
قد يُرجع Krea 2 أيضًا { "message": "CONCURRENCY_LIMIT_REACHED" } فقط، بدون limit أو jobType، عندما تمتلئ قائمة انتظاره المشتركة. هذا ليس الحد الخاص بك. تراجع وأعد المحاولة.
لا يكون التراكم مفعّلًا إلا عندما تتضمنه الخطة (Pro وما فوقها)، ويدعمه النموذج، ولا يكون الطلب من نوع Zero Data Retention. لا تُضاف طلبات Krea 2 إلى التراكم في أي خطة حاليًا، لذا تُرجع 429 عند تجاوز الحد. عندما يكون التراكم مفعّلًا، تُقبل المهمة الإضافية بالحالة status: "backlogged" وتبدأ بمجرد توفر مكان شاغر. لا يوجد حد منفصل للتراكم. راجع حدود المعدل.
لا ترسل واجهة API الترويسة Retry-After ولا X-RateLimit-*. لكن الاستجابة تتضمن cf-ray. عند 429، أعد المحاولة مع التراجع الأسّي بعد انتهاء المهام الجارية (استعلم عبر GET /jobs/{id}، أو استخدم الويب هوك).
إذا استنفد اكتمال لاحق الرصيد، تفشل المهام التي لا تزال في التراكم مع error.code بقيمة "insufficient_balance". هذه مهمة فاشلة، وليست HTTP 402. لا ترسل تلك المهام ويب هوك، لذا استعلم عبر GET /jobs/{id} عن المهام المتراكمة.
Agent operation API
يُرجعPOST /agent/{operation} وGET /agent/session/{sessionId} الشكل { "error", "code"?, "allowedModels"? }. الحقل error وحده مطلوب. allowedModels بصيغة camelCase. الدورة التي تفشل بعد قبولها تظهر بالحالة status: "failed" في الجلسة، وليس كأحد أخطاء HTTP هذه. راجع Agent.
رمز خطأ Agent غير المعروف يبقى
422 مع { "error", "code" }. أما 404 الخاصة بالعملية غير المعروفة و500 غير المعالَجة فتستخدمان { "message" } وتتبعان Accept.
error.code للمهام الفاشلة
يعيّن GET /jobs وGET /jobs/{id} الحقل error فقط عندما تكون status هي "failed". ولا يوجد result قابل للاستخدام:
تستخدم عمليات تسليم الويب هوك لمهمة فاشلة كائن المهمة نفسه، بما في ذلك
error. ولا يحتوي تسليم المهمة الملغاة على error. لا تُرسل الحمولة التي يتجاوز حجمها 256 KiB، ولا تُجرى أي عمليات تسليم أخرى لتلك المهمة، لذا استعلم عبر GET /jobs/{id} بدلًا من ذلك. تحقّق من التوقيع قبل أن تثق بالنص. راجع الويب هوك.
تصحيح الأخطاء
لا توجد ترويسة لمعرّف الطلب خاصة بـ Krea. لكن كل استجابة تتضمن ترويسةcf-ray من Cloudflare. لا تُرسل أي ترويسة Retry-After أو X-RateLimit-*.
عند مراسلة support@krea.ai، أرفق ما يلي:
job_id، عندما يكون الطلب قد أنشأ مهمة أو استهدفها- الوقت ونقطة النهاية
- قيمة
cf-ray، في حالة خطأ وقت الطلب
Access-Control-Allow-Origin هي *. في generate وjobs وassets وstyles وnode apps، لا تُعيَّن Access-Control-Expose-Headers، لذا لا يستطيع fetch في المتصفح قراءة cf-ray أو Deprecation أو Sunset. انسخ cf-ray من سجل الشبكة، أو من عميل على جانب الخادم.
في أي استجابة، تحقّق من Deprecation وSunset قبل أن يتوقف النموذج عن قبول الطلبات. راجع إيقاف الدعم.
الخطوات التالية
دورة حياة المهمة
استعلم عن الحالة حتى تكتمل المهمة أو تفشل أو تُلغى
الويب هوك
تحقّق من التوقيع في تسليم مهمة فاشلة
حدود المعدل
متى تُضاف المهام الإضافية إلى التراكم ومتى تُرجع 429
مفاتيح API والفوترة
اشحن رصيد API بعد استجابة 402