> ## Documentation Index
> Fetch the complete documentation index at: https://apidoc.cometapi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ابدأ باستخدام Midjourney API

> بدء سريع لـ Midjourney API على CometAPI: أرسل /mj/submit/imagine، واستطلع /mj/task/{id}/fetch، ثم استخدم /mj/submit/action وأزرار modal.

## فهم المفهوم الأساسي

تقوم MidJourney API **بمحاكاة تفاعلات أزرار Discord**. وعلى عكس REST APIs التقليدية، فهي تعمل كـ **آلة حالات** حيث تُرجع كل عملية أزرارًا جديدة للخطوة التالية.

### واجهات API الأساسية الأربع

| API                                                                                      | الغرض                                        | متى تُستخدم                            |
| ---------------------------------------------------------------------------------------- | -------------------------------------------- | -------------------------------------- |
| [`POST /mj/submit/imagine`](/api/image/midjourney/imagine)                               | إنشاء صورة من نص                             | نقطة البداية لجميع سير العمل           |
| [`GET /mj/task/\{id\}/fetch`](/api/image/midjourney/task-fetching-api/fetch-single-task) | الاستعلام عن حالة المهمة والحصول على الأزرار | بعد كل عملية submit (استطلع حتى تكتمل) |
| [`POST /mj/submit/action`](/api/image/midjourney/action)                                 | النقر على زر (upscale، vary، zoom، إلخ)      | عندما تريد إجراء عملية على صورة        |
| [`POST /mj/submit/modal`](/api/image/midjourney/modal)                                   | إرسال مدخلات إضافية                          | فقط عندما تكون الحالة `MODAL`          |

***

## مخطط سير العمل الكامل

```
┌─────────────────────────────────────────────────────────────────────────────┐
│                         MIDJOURNEY API WORKFLOW                             │
└─────────────────────────────────────────────────────────────────────────────┘

  ┌──────────────────┐
  │  POST /submit/   │  ← Step 1: Submit prompt, get task_id
  │     imagine      │
  └────────┬─────────┘
           │ Returns: { "result": "task_id_1" }
           ▼
  ┌──────────────────┐
  │ GET /task/{id}/  │  ← Step 2: Poll until status = "SUCCESS"
  │      fetch       │
  └────────┬─────────┘
           │ Returns: imageUrl + buttons[] (U1,U2,U3,U4,V1,V2,V3,V4,🔄)
           ▼
  ┌──────────────────┐
  │  POST /submit/   │  ← Step 3: Click a button using customId
  │     action       │
  └────────┬─────────┘
           │ Returns: { "result": "task_id_2" }
           ▼
  ┌──────────────────┐
  │ GET /task/{id}/  │  ← Step 4: Poll the new task
  │      fetch       │
  └────────┬─────────┘
           │
           ├─── status = "SUCCESS" → Done! Get imageUrl
           │
           └─── status = "MODAL" → Need additional input (see Step 5)
                      │
                      ▼
           ┌──────────────────┐
           │  POST /submit/   │  ← Step 5: Submit mask/prompt for special operations
           │      modal       │
           └────────┬─────────┘
                    │ Returns: { "result": "task_id_3" }
                    ▼
           ┌──────────────────┐
           │ GET /task/{id}/  │  ← Step 6: Poll until SUCCESS
           │      fetch       │
           └──────────────────┘
```

***

## المفهوم الأساسي: الأزرار و `customId`

تعيد كل مهمة ناجحة مصفوفة `buttons`. ويحتوي كل زر على `customId` تستخدمه لتشغيل الإجراء التالي.

**مثال على استجابة من `/mj/task/\{id\}/fetch`:**

```json theme={null}
{
  "status": "SUCCESS",
  "imageUrl": "https://api.cometapi.com/mj/image/xxx",
  "buttons": [
    { "customId": "MJ::JOB::upsample::1::abc123", "label": "U1" },
    { "customId": "MJ::JOB::upsample::2::abc123", "label": "U2" },
    { "customId": "MJ::JOB::variation::1::abc123", "label": "V1" },
    { "customId": "MJ::JOB::reroll::0::abc123", "emoji": "🔄" }
  ]
}
```

<Warning>
  `customId` ليست قيمة ثابتة. فهي تتغير مع كل مهمة. احصل عليها دائمًا من مصفوفة `buttons`.
</Warning>

***

## مرجع الأزرار حسب المرحلة

### بعد IMAGINE (صورة شبكية 4-grid)

تُعاد هذه الأزرار عند اكتمال إنشاء الصورة الأولية:

| Button | customId Pattern                | Action                | Result                 |
| ------ | ------------------------------- | --------------------- | ---------------------- |
| U1-U4  | `MJ::JOB::upsample::1::xxx`     | ترقية دقة صورة واحدة  | صورة واحدة عالية الدقة |
| V1-V4  | `MJ::JOB::variation::1::xxx`    | إنشاء تنويعات         | شبكة 4-grid جديدة      |
| 🔄     | `MJ::JOB::reroll::0::xxx::SOLO` | إعادة الإنشاء بالكامل | شبكة 4-grid جديدة      |

### بعد UPSCALE (صورة واحدة)

بعد ترقية الدقة، ستحصل على إمكانية الوصول إلى أدوات التحرير:

| Label                             | Needs Modal?   |
| --------------------------------- | -------------- |
| Upscale (Subtle) / Upscale (2x)   | ❌ لا           |
| Upscale (Creative) / Upscale (4x) | ❌ لا           |
| Vary (Subtle) 🪄                  | ❌ لا           |
| Vary (Strong) 🪄                  | ❌ لا           |
| Vary (Region) 🖌️                 | ✅ نعم (قناع)   |
| Zoom Out 2x / 1.5x 🔍             | ❌ لا           |
| Custom Zoom 🔍                    | ✅ نعم (prompt) |
| ⬅️➡️⬆️⬇️ Pan                      | ❌ لا           |
| Animate 🎞️                       | ❌ لا           |
| 🔄 Reroll                         | ❌ لا           |

> **ملاحظة:** قد تختلف تسميات الأزرار وتنسيقات `customId` حسب إصدار MJ المحدد في prompt الخاص بك (على سبيل المثال، `--v 6.1` مقابل `--v 5.2`). اقرأ الأزرار دائمًا من استجابة API.

<Warning>
  زر Inpaint (Vary Region) لا يظهر إلا بعد Upscale.
</Warning>

***

## مثال كامل: الإنشاء ثم ترقية الدقة

### الخطوة 1: إرسال طلب imagine

```bash theme={null}
curl -X POST 'https://api.cometapi.com/mj/submit/imagine' \
  -H "Authorization: Bearer $COMETAPI_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "botType": "MID_JOURNEY",
    "prompt": "a cute cat --v 6.1",
    "accountFilter": { "modes": ["FAST"] }
  }'
```

**الاستجابة:**

```json theme={null}
{ "code": 1, "result": "1768464763141701" }
```

### الخطوة 2: الاستعلام الدوري عن حالة المهمة

```bash theme={null}
curl -X GET 'https://api.cometapi.com/mj/task/1768464763141701/fetch' \
  -H "Authorization: Bearer $COMETAPI_KEY"
```

**الاستجابة (عند الاكتمال):**

```json theme={null}
{
  "status": "SUCCESS",
  "imageUrl": "https://api.cometapi.com/mj/image/1768464763141701",
  "buttons": [
    { "customId": "MJ::JOB::upsample::1::5f20922e-xxx", "label": "U1" },
    { "customId": "MJ::JOB::upsample::2::5f20922e-xxx", "label": "U2" },
    ...
  ]
}
```

### الخطوة 3: النقر على U1 لترقية الدقة

```bash theme={null}
curl -X POST 'https://api.cometapi.com/mj/submit/action' \
  -H "Authorization: Bearer $COMETAPI_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "taskId": "1768464763141701",
    "customId": "MJ::JOB::upsample::1::5f20922e-xxx"
  }'
```

**الاستجابة:**

```json theme={null}
{ "code": 1, "result": "1768464800000000" }
```

### الخطوة 4: الاستعلام الدوري عن المهمة الجديدة والحصول على النتيجة

```bash theme={null}
curl -X GET 'https://api.cometapi.com/mj/task/1768464800000000/fetch' \
  -H "Authorization: Bearer $COMETAPI_KEY"
```

***

## متى يكون Modal مطلوبًا؟

عندما تستدعي [`/mj/submit/action`](/api/image/midjourney/action) وتصبح حالة المهمة `MODAL` بدلًا من `SUCCESS`، يجب عليك استدعاء [`/mj/submit/modal`](/api/image/midjourney/modal) لتقديم إدخال إضافي.

### عمليات Modal المؤكدة

| Operation   | Button         | What to Submit                         |
| ----------- | -------------- | -------------------------------------- |
| Inpaint     | Vary (Region)  | `maskBase64` (قناع PNG) + `prompt`     |
| Custom Zoom | 🔍 Custom Zoom | `prompt` (مثل: "your prompt --zoom 2") |

**مثال: تدفق Inpaint**

```bash theme={null}
# 1. Click Vary (Region) button via Action API
curl -X POST 'https://api.cometapi.com/mj/submit/action' \
  -H "Authorization: Bearer $COMETAPI_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"taskId": "xxx", "customId": "MJ::Inpaint::xxx", "enableRemix": true}'

# 2. Poll and see status = "MODAL"
curl -X GET 'https://api.cometapi.com/mj/task/new_task_id/fetch'
# Response: { "status": "MODAL" }

# 3. Submit mask and prompt via Modal API
curl -X POST 'https://api.cometapi.com/mj/submit/modal' \
  -H "Authorization: Bearer $COMETAPI_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "taskId": "new_task_id",
    "prompt": "replace with golden crown",
    "maskBase64": "data:image/png;base64,..."
  }'
```

***

## اختيار وضع السرعة

أضف بادئة السرعة إلى المسار:

| الوضع | بادئة المسار | مثال                          |
| ----- | ------------ | ----------------------------- |
| Fast  | `/mj-fast`   | `/mj-fast/mj/submit/imagine`  |
| Turbo | `/mj-turbo`  | `/mj-turbo/mj/submit/imagine` |
| Relax | (افتراضي)    | `/mj/submit/imagine`          |

***

## نقاط دخول أخرى

واجهات API هذه هي **نقاط دخول مستقلة** ولا تتبع تدفق imagine ← action:

| API                                                            | الغرض                     |
| -------------------------------------------------------------- | ------------------------- |
| [`POST /mj/submit/blend`](/api/image/midjourney/blend)         | مزج 2-5 صور في صورة واحدة |
| [`POST /mj/submit/describe`](/api/image/midjourney/describe)   | إنشاء prompt من صورة      |
| [`POST /mj/submit/video`](/api/image/midjourney/submit-video)  | تحويل صورة إلى فيديو      |
| [`POST /mj/submit/edits`](/api/image/midjourney/submit-editor) | تعديل صورة باستخدام mask  |

***

## نصائح لاستكشاف الأخطاء وإصلاحها

استنادًا إلى تصميم API وسير العمل، إليك المشكلات الشائعة التي قد تواجهها:

| المشكلة                             | السبب المحتمل                   | الحل                                                                                                                            |
| ----------------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| لا يمكن العثور على زر Vary (Region) | تنظر إلى صورة شبكية 4-grid      | قم بعمل Upscale أولًا (انقر U1-U4)، ثم تحقق من الأزرار                                                                          |
| حالة المهمة عالقة عند `MODAL`       | تتطلب العملية إدخالًا إضافيًا   | استدعِ [`/mj/submit/modal`](/api/image/midjourney/modal) بالبيانات المطلوبة                                                     |
| `customId` لا يعمل                  | استخدام قيمة قديمة أو hardcoded | احصل دائمًا على `customId` جديد من استجابة [`/mj/task/\{id\}/fetch`](/api/image/midjourney/task-fetching-api/fetch-single-task) |
| مصفوفة `buttons` فارغة              | المهمة لا تزال قيد التنفيذ      | انتظر `status: "SUCCESS"` قبل الوصول إلى الأزرار                                                                                |
