استدعاء أداة
استدعِ أي أداة في Direct API بصيغة طلب واحدة، واقرأ نتيجتها وفوترتها، وأعد محاولة الاستدعاءات المدفوعة بأمان باستخدام Idempotency-Key.
كل قدرة هي أداة واحدة تُستدعى بالطريقة نفسها: POST /v1/direct/tools/{tool_name}. ويسردها كتالوج الأدوات كلها.
الطلب
| الترويسة | إلزامية | القيمة |
|---|---|---|
Authorization | نعم | Bearer <key> |
Content-Type | نعم | application/json |
Idempotency-Key | موصى بها في الاستدعاءات المدفوعة | راجع التكرار الآمن |
{
"input": { },
"webhook_id": "01929a10-0c3d-7f44-8a21-0b1c2d3e4f50",
"metadata": { "order_id": "4411", "customer": "acme" }
}| الحقل | النوع | إلزامي | المعنى |
|---|---|---|---|
input | object | نعم | وسائط الأداة، ويُتحقق منها مقابل input_schema الخاص بها. أرسل {} للأداة التي لا تأخذ وسائط. كل أداة تنشئ شيئًا (عملية توليد أو استيرادًا أو رفعًا أو خطًا زمنيًا) تتطلب project_id من list_projects. |
webhook_id | string أو null | لا | نقطة نهاية ويبهوك مسجلة يُرسَل إليها إشعار عندما تبلغ كل عملية توليد يبدأها هذا الاستدعاء حالة نهائية. له معنى فقط في الأدوات التي تحمل returns_generation: true؛ ويُرفض في غيرها. |
metadata | object أو null | لا | حتى 20 مفتاحًا نصيًا (40 حرفًا أو أقل) بقيم نصية (500 حرف أو أقل). يُخزَّن على كل عملية توليد يبدأها الاستدعاء ويُعاد في كل قراءة وكل ويبهوك. لا تفسّره Morphic أبدًا. |
استدعاء كامل مع مفتاح تكرار آمن:
curl -s https://mcp.morphic.com/v1/direct/tools/generate_image \
-H "Authorization: Bearer $MORPHIC_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-4411-hero-image" \
-d '{"input": {"prompt": "A red vintage bicycle against a pastel wall", "project_id": "01928f4e-5b7c-7d2a-9e11-3c4b5a6d7e8f"}, "metadata": {"order_id": "4411"}}'الأدوات التي تعرض الفيديو على خوادم Morphic (video_compose وتحويلات video_* وburn_subtitles) لا تقبل webhook_id ولا metadata بعد. وتُجيب بـ 422 tool_refused عند تعيين أي منهما؛ استطلع عمليات التوليد الخاصة بها بدلًا من ذلك.
الاستجابة
لكل استجابة ناجحة الغلاف نفسه. وتقع مخرجات الأداة نفسها في result، كما يصفها output_schema الخاص بها.
{
"request_id": "0192a7b3-91d0-7c55-b1aa-6e5f4c3b2a10",
"tool": "generate_image",
"result": {
"generation_id": "0192a7b3-a1c4-7e02-8f9d-1a2b3c4d5e6f",
"generation_ids": ["0192a7b3-a1c4-7e02-8f9d-1a2b3c4d5e6f"],
"status": "queued",
"project_id": "01928f4e-5b7c-7d2a-9e11-3c4b5a6d7e8f",
"project_name": "Spring campaign",
"file_id": "01928f4e-6c8d-7a10-b2c3-d4e5f6a7b8c9",
"model_id": "mdl_3hv8tq1nzc6e",
"estimated_credits": 8,
"credits_settle_on_output_duration": false
},
"billing": {
"credits_charged": 8,
"credits_are_final": false,
"credits_settle_on_output_duration": false,
"generation_ids": ["0192a7b3-a1c4-7e02-8f9d-1a2b3c4d5e6f"]
}
}| الحالة | متى |
|---|---|
202 Accepted | بدأت الأداة عملية توليد واحدة أو أكثر (returns_generation: true)؛ تابعها عبر الاستطلاع أو الويبهوك |
200 OK | أنهت الأداة عملها ضمن الاستدعاء (القوائم، الكتالوج، عروض الأسعار، التحليل)، أو إعادة تشغيل آمنة لطلب سابق |
كتلة الفوترة
تظهر billing في كل استجابة ناجحة، بما في ذلك الاستدعاءات المجانية.
| نوع الاستدعاء | billing.credits_charged | credits_are_final |
|---|---|---|
| الاستدعاءات المجانية: القوائم، الكتالوج، عروض الأسعار، قراءات الحالة | 0 | true |
استدعاء يبدأ عمليات توليد (202) | مجموع ما خُصم عند البدء لكل عملية توليد بدأت | false |
استدعاء مدفوع ينتهي ضمن الطلب (analyze_video، analyze_audio، filmlab_edit) | ما خصمه | true |
استدعاء مرفوض (4xx) | لا توجد كتلة billing؛ لم يُخصم شيء |
تُبلغ الكتلة بما خصمه الاستدعاء عند عودته. أما الاستردادات والتسوية فتحدث لاحقًا وتظهر على عملية التوليد، ولا تظهر أبدًا على الاستجابة الأصلية. وتحمل الاستجابات أيضًا Morphic-Credits-Charged: <integer> للتسجيل في البوابة لديك. وتشرح صفحة الأرصدة والاستخدام كيف تُخصم عملية التوليد وتُسوّى وتُسترد.
رفض الأداة
عندما يكون الإدخال سليم الصيغة لكن لا يمكن تشغيله (نموذج لا تشمله خطتك، أو نسبة عرض إلى ارتفاع لا يوفرها النموذج، أو أصل من نوع خاطئ)، يُجيب الاستدعاء بـ 422 tool_refused. وتذكر الرسالة الحقل والقيمة والقيم التي كانت ستنجح. لم يبدأ شيء ولم يُخصم شيء.
{
"description": "aspect_ratio: \"21:9\" is not offered by model mdl_3hv8tq1nzc6e. Offered: 1:1, 4:3, 3:4, 16:9, 9:16. Models offering 21:9 for text_to_image: mdl_9wd4mf2kqs7b.",
"code": "tool_refused",
"data": { "request_id": "0192a7b3-…", "tool": "generate_image" },
"error": { "error_code": "TOOL_REFUSED", "message": "aspect_ratio: \"21:9\" is not offered by model mdl_3hv8tq1nzc6e. …" }
}البدء الجزئي
الاستدعاء الذي تزيد فيه variations على 1 يبدأ عملية توليد لكل تنويع. فإذا رُفض تنويع لاحق بعد أن بدأت تنويعات سابقة:
- تظل الاستجابة
202، ويوضحresult.partial_failureما حدث. - لا يسرد
result.generation_idsإلا ما بدأ، ولا يحتسبbillingإلا ما بدأ. - أعد محاولة التنويعات الناقصة فقط.
التكرار الآمن
قد يقع عطل في الشبكة بعد إرسال الطلب وقبل وصول إجابته. لإعادة محاولة استدعاء مدفوع بأمان، أرسل الترويسة Idempotency-Key. استخدم معرّف المهمة أو الطلب الخاص بك.
Idempotency-Key: order-4411-hero-image- يُنفَّذ أول طلب يحمل المفتاح بشكل طبيعي.
- لا تُنفَّذ إعادة المحاولة بالمفتاح والأداة والجسم نفسها خلال 24 ساعة مرة أخرى. بل تُجيب بـ
200مع جسم الاستجابة الأصلي، بما في ذلكgeneration_idsوbillingالأصليتان، ولا تخصم شيئًا إضافيًا. وتكون ترويسةMorphic-Credits-Chargedالخاصة بها0. - المفتاح نفسه مع أداة أو جسم مختلف يُجاب بـ
409 idempotency_conflict. - إعادة المحاولة بينما لا يزال الطلب الأصلي قيد التنفيذ تُجاب بـ
409 idempotency_in_progress. - إعادة محاولة استدعاء مدفوع فشل طلبه الأصلي (
5xx) أو لم يُجب قط بعد أن ربما نُفِّذ تُجاب بـ409 idempotency_outcome_unknown. ولا يُنفَّذ مرة أخرى أبدًا بالمفتاح نفسه: تحقق من نتيجته، ثم استخدم مفتاحًا جديدًا. - نطاق المفاتيح هو مفتاح API الذي أرسلها، وطولها حتى 200 حرف.
تقبل الاستدعاءات المجانية الترويسة أيضًا، لكنها نادرًا ما تحتاجها.
إعادة محاولة استدعاء مدفوع بعد 5xx
الاستدعاء المدفوع الذي يُجيب بـ 500 أو 503 أو 504 ربما بدأ العمل وخصم مقابله قبل أن يفشل.
- تحقق مما فعله الاستدعاء عبر
list_generations، أو عبرGET /v1/direct/usageمع التصفية حسب الوقت. - أرسل
Idempotency-Keyجديدًا فقط للعمل الذي لم يبدأ.
عندما لا تصل أي إجابة على الإطلاق (اتصال منقطع)، أعد المحاولة بالمفتاح نفسه: ستحصل على الإجابة المخزنة، أو على 409 idempotency_in_progress ما دام لا يزال قيد التنفيذ.
إذا واجهت أي مشكلة أو كانت لديك أي أسئلة، فلا تتردد في التواصل معنا. يسعدنا مساعدتك. اكتب لنا على support@morphic.com.