Przejdź do głównej treści

🎯 Zrozum podstawową koncepcję

MidJourney API symuluje interakcje z przyciskami Discorda. W przeciwieństwie do typowych REST API działa jak maszyna stanów, w której każda operacja zwraca nowe przyciski do kolejnego kroku.

4 podstawowe API

APICelKiedy używać
POST /mj/submit/imagineGenerowanie obrazu z tekstuPunkt startowy dla wszystkich workflow
GET /mj/task/\{id\}/fetchSprawdzanie statusu zadania i pobieranie przyciskówPo każdym submit (odpytyj aż do zakończenia)
POST /mj/submit/actionKliknięcie przycisku (upscale, vary, zoom itd.)Gdy chcesz wykonać operację na obrazie
POST /mj/submit/modalPrzesłanie dodatkowych danych wejściowychTylko gdy status to MODAL

📊 Pełny diagram workflow

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

🔑 Kluczowa koncepcja: przyciski i customId

Każde pomyślnie zakończone zadanie zwraca tablicę buttons. Każdy przycisk ma customId, którego używasz do wywołania kolejnej akcji. Przykładowa odpowiedź z /mj/task/\{id\}/fetch:
{
  "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": "🔄" }
  ]
}
⚠️ Ważne: customId NIE jest stałą wartością. Zmienia się dla każdego zadania. Zawsze pobieraj je z tablicy buttons.

📋 Referencja przycisków według etapu

Po IMAGINE (obraz 4-grid)

Te przyciski są zwracane, gdy początkowe generowanie obrazu zostanie zakończone:
ButtoncustomId PatternActionResult
U1-U4MJ::JOB::upsample::1::xxxPowiększenie pojedynczego obrazuPojedynczy obraz w wysokiej rozdzielczości
V1-V4MJ::JOB::variation::1::xxxWygenerowanie wariantówNowy 4-grid
🔄MJ::JOB::reroll::0::xxx::SOLOWygenerowanie wszystkiego ponownieNowy 4-grid

Po UPSCALE (pojedynczy obraz)

Po wykonaniu upscalingu uzyskujesz dostęp do narzędzi edycji:
LabelNeeds Modal?
Upscale (Subtle) / Upscale (2x)❌ Nie
Upscale (Creative) / Upscale (4x)❌ Nie
Vary (Subtle) 🪄❌ Nie
Vary (Strong) 🪄❌ Nie
Vary (Region) 🖌️✅ Tak (maska)
Zoom Out 2x / 1.5x 🔍❌ Nie
Custom Zoom 🔍✅ Tak (prompt)
⬅️➡️⬆️⬇️ Pan❌ Nie
Animate 🎞️❌ Nie
🔄 Reroll❌ Nie
Uwaga: Etykiety przycisków i formaty customId mogą się różnić w zależności od wersji MJ określonej w prompt (np. --v 6.1 vs --v 5.2). Zawsze odczytuj przyciski z odpowiedzi API.
⚠️ Przycisk Inpaint (Vary Region) pojawia się dopiero po Upscale!

⚡ Kompletny przykład: Generate & Upscale

Krok 1: Wyślij żądanie Imagine

curl -X POST 'https://api.cometapi.com/mj/submit/imagine' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "botType": "MID_JOURNEY",
    "prompt": "a cute cat --v 6.1",
    "accountFilter": { "modes": ["FAST"] }
  }'
Odpowiedź:
{ "code": 1, "result": "1768464763141701" }

Krok 2: Odpytuj status zadania

curl -X GET 'https://api.cometapi.com/mj/task/1768464763141701/fetch' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>'
Odpowiedź (po zakończeniu):
{
  "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" },
    ...
  ]
}

Krok 3: Kliknij U1, aby wykonać Upscale

curl -X POST 'https://api.cometapi.com/mj/submit/action' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "taskId": "1768464763141701",
    "customId": "MJ::JOB::upsample::1::5f20922e-xxx"
  }'
Odpowiedź:
{ "code": 1, "result": "1768464800000000" }

Krok 4: Odpytaj nowe zadanie i pobierz wynik

curl -X GET 'https://api.cometapi.com/mj/task/1768464800000000/fetch' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>'

⚠️ Kiedy wymagany jest Modal?

Gdy wywołasz /mj/submit/action, a status zadania zmieni się na MODAL zamiast SUCCESS, musisz wywołać /mj/submit/modal, aby przekazać dodatkowe dane wejściowe.

Potwierdzone operacje Modal

OperationButtonWhat to Submit
InpaintVary (Region)maskBase64 (maska PNG) + prompt
Custom Zoom🔍 Custom Zoomprompt (np. “your prompt —zoom 2”)
Przykład: przepływ Inpaint
# 1. Click Vary (Region) button via Action API
curl -X POST 'https://api.cometapi.com/mj/submit/action' \
  -H 'Authorization: Bearer <YOUR_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 <YOUR_COMETAPI_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "taskId": "new_task_id",
    "prompt": "replace with golden crown",
    "maskBase64": "data:image/png;base64,..."
  }'

🚀 Wybór trybu szybkości

Dodaj prefiks szybkości do ścieżki:
TrybPrefiks ścieżkiPrzykład
Fast/mj-fast/mj-fast/mj/submit/imagine
Turbo/mj-turbo/mj-turbo/mj/submit/imagine
Relax(domyślnie)/mj/submit/imagine

🔗 Inne punkty wejścia

Te API to niezależne punkty wejścia, które nie działają zgodnie z przepływem imagine → action:
APICel
POST /mj/submit/blendPołącz 2–5 obrazów w jeden
POST /mj/submit/describeWygeneruj prompt na podstawie obrazu
POST /mj/submit/videoPrzekształć obraz w wideo
POST /mj/submit/editsEdytuj obraz za pomocą maski

❓ Wskazówki dotyczące rozwiązywania problemów

Na podstawie projektu API i przepływu pracy, oto typowe problemy, które możesz napotkać:
ProblemPrawdopodobna przyczynaRozwiązanie
Nie można znaleźć przycisku Vary (Region)Patrzysz na obraz w siatce 4Najpierw wykonaj upscale (kliknij U1-U4), a następnie sprawdź przyciski
Status zadania utknął na MODALOperacja wymaga dodatkowych danych wejściowychWywołaj /mj/submit/modal z wymaganymi danymi
customId nie działaUżywasz nieaktualnej lub zakodowanej na stałe wartościZawsze pobieraj aktualny customId z odpowiedzi /mj/task/\{id\}/fetch
Pusta tablica buttonsZadanie jest nadal w tokuPoczekaj na status: "SUCCESS" przed uzyskaniem dostępu do przycisków