> ## 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.

# Bắt đầu với Midjourney API

> Hướng dẫn nhanh cho Midjourney API trên CometAPI: gửi /mj/submit/imagine, thăm dò /mj/task/{id}/fetch, sau đó dùng /mj/submit/action và các nút modal.

## Hiểu khái niệm cốt lõi

MidJourney API **mô phỏng các thao tác tương tác nút trên Discord**. Không giống các REST API thông thường, nó hoạt động như một **state machine** trong đó mỗi thao tác trả về các nút mới cho bước tiếp theo.

### 4 API cốt lõi

| API                                                                                      | Mục đích                                 | Khi nào sử dụng                               |
| ---------------------------------------------------------------------------------------- | ---------------------------------------- | --------------------------------------------- |
| [`POST /mj/submit/imagine`](/api/image/midjourney/imagine)                               | Tạo ảnh từ văn bản                       | Điểm bắt đầu cho mọi quy trình                |
| [`GET /mj/task/\{id\}/fetch`](/api/image/midjourney/task-fetching-api/fetch-single-task) | Truy vấn trạng thái task và lấy các nút  | Sau mỗi lần submit (thăm dò cho đến khi xong) |
| [`POST /mj/submit/action`](/api/image/midjourney/action)                                 | Nhấn một nút (upscale, vary, zoom, v.v.) | Khi bạn muốn thao tác trên một ảnh            |
| [`POST /mj/submit/modal`](/api/image/midjourney/modal)                                   | Gửi thêm dữ liệu đầu vào                 | Chỉ khi status là `MODAL`                     |

***

## Sơ đồ quy trình hoàn chỉnh

```
┌─────────────────────────────────────────────────────────────────────────────┐
│                         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       │
           └──────────────────┘
```

***

## Khái niệm quan trọng: Buttons và customId

Mỗi task thành công sẽ trả về một mảng `buttons`. Mỗi nút có một `customId` mà bạn dùng để kích hoạt hành động tiếp theo.

**Ví dụ phản hồi từ `/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` không phải là giá trị cố định. Nó thay đổi với mỗi task. Luôn lấy nó từ mảng `buttons`.
</Warning>

***

## Tham chiếu nút theo từng giai đoạn

### Sau IMAGINE (ảnh lưới 4 ô)

Các nút này được trả về khi quá trình tạo ảnh ban đầu của bạn hoàn tất:

| Button | customId Pattern                | Action               | Result                   |
| ------ | ------------------------------- | -------------------- | ------------------------ |
| U1-U4  | `MJ::JOB::upsample::1::xxx`     | Phóng to một ảnh đơn | Ảnh đơn độ phân giải cao |
| V1-V4  | `MJ::JOB::variation::1::xxx`    | Tạo biến thể         | Lưới 4 ô mới             |
| 🔄     | `MJ::JOB::reroll::0::xxx::SOLO` | Tạo lại tất cả       | Lưới 4 ô mới             |

### Sau UPSCALE (ảnh đơn)

Sau khi upscaling, bạn sẽ có quyền truy cập vào các công cụ chỉnh sửa:

| Label                             | Needs Modal?  |
| --------------------------------- | ------------- |
| Upscale (Subtle) / Upscale (2x)   | ❌ Không       |
| Upscale (Creative) / Upscale (4x) | ❌ Không       |
| Vary (Subtle) 🪄                  | ❌ Không       |
| Vary (Strong) 🪄                  | ❌ Không       |
| Vary (Region) 🖌️                 | ✅ Có (mask)   |
| Zoom Out 2x / 1.5x 🔍             | ❌ Không       |
| Custom Zoom 🔍                    | ✅ Có (prompt) |
| ⬅️➡️⬆️⬇️ Pan                      | ❌ Không       |
| Animate 🎞️                       | ❌ Không       |
| 🔄 Reroll                         | ❌ Không       |

> **Lưu ý:** Nhãn nút và định dạng `customId` có thể khác nhau tùy theo phiên bản MJ được chỉ định trong prompt của bạn (ví dụ: `--v 6.1` so với `--v 5.2`). Luôn đọc các nút từ phản hồi API.

<Warning>
  Nút Inpaint (Vary Region) chỉ xuất hiện sau Upscale.
</Warning>

***

## Ví dụ đầy đủ: Tạo và upscale

### Bước 1: Gửi yêu cầu 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"] }
  }'
```

**Phản hồi:**

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

### Bước 2: Poll trạng thái tác vụ

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

**Phản hồi (khi hoàn tất):**

```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" },
    ...
  ]
}
```

### Bước 3: Nhấp U1 để upscale

```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"
  }'
```

**Phản hồi:**

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

### Bước 4: Poll tác vụ mới và lấy kết quả

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

***

## Khi nào cần Modal?

Khi bạn gọi [`/mj/submit/action`](/api/image/midjourney/action) và trạng thái tác vụ trở thành `MODAL` thay vì `SUCCESS`, bạn phải gọi [`/mj/submit/modal`](/api/image/midjourney/modal) để cung cấp đầu vào bổ sung.

### Các thao tác Modal đã được xác nhận

| Operation   | Button         | What to Submit                           |
| ----------- | -------------- | ---------------------------------------- |
| Inpaint     | Vary (Region)  | `maskBase64` (PNG mask) + `prompt`       |
| Custom Zoom | 🔍 Custom Zoom | `prompt` (ví dụ: "your prompt --zoom 2") |

**Ví dụ: Luồng 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,..."
  }'
```

***

## Chọn chế độ tốc độ

Thêm tiền tố tốc độ vào đường dẫn:

| Chế độ | Tiền tố đường dẫn | Ví dụ                         |
| ------ | ----------------- | ----------------------------- |
| Fast   | `/mj-fast`        | `/mj-fast/mj/submit/imagine`  |
| Turbo  | `/mj-turbo`       | `/mj-turbo/mj/submit/imagine` |
| Relax  | (mặc định)        | `/mj/submit/imagine`          |

***

## Các điểm vào khác

Các API này là **những điểm vào độc lập** không đi theo luồng imagine → action:

| API                                                            | Mục đích                |
| -------------------------------------------------------------- | ----------------------- |
| [`POST /mj/submit/blend`](/api/image/midjourney/blend)         | Trộn 2-5 ảnh thành một  |
| [`POST /mj/submit/describe`](/api/image/midjourney/describe)   | Tạo prompt từ ảnh       |
| [`POST /mj/submit/video`](/api/image/midjourney/submit-video)  | Chuyển ảnh thành video  |
| [`POST /mj/submit/edits`](/api/image/midjourney/submit-editor) | Chỉnh sửa ảnh bằng mask |

***

## Mẹo khắc phục sự cố

Dựa trên thiết kế API và quy trình làm việc, đây là những vấn đề phổ biến bạn có thể gặp phải:

| Vấn đề                           | Nguyên nhân có thể                       | Giải pháp                                                                                                                |
| -------------------------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| Không tìm thấy nút Vary (Region) | Đang xem ảnh lưới 4 ô                    | Trước tiên hãy upscale (nhấn U1-U4), sau đó kiểm tra các nút                                                             |
| Trạng thái task bị kẹt ở `MODAL` | Thao tác yêu cầu thêm đầu vào            | Gọi [`/mj/submit/modal`](/api/image/midjourney/modal) với dữ liệu bắt buộc                                               |
| `customId` không hoạt động       | Đang dùng giá trị lỗi thời hoặc hardcode | Luôn lấy `customId` mới từ phản hồi [`/mj/task/\{id\}/fetch`](/api/image/midjourney/task-fetching-api/fetch-single-task) |
| Mảng `buttons` rỗng              | Task vẫn đang xử lý                      | Đợi `status: "SUCCESS"` trước khi truy cập buttons                                                                       |
