Впровадження генерування зображень з штучним інтелектом (Midjourney API) в мобільному додатку
Midjourney не має офіційного публічного API — це перше, що потрібно зрозуміти. Всі «Midjourney API» на ринку — це або неофіційні обгортки над Discord-ботом (MidJourney API proxy), або альтернативні постачальники з порівнянною якістю (Ideogram, Leonardo.ai). Вибір підходу залежить від вимог до стабільності та юридичної чистоти.
Варіанти інтеграції
Неофіційні проксі
Сервіси типу useapi.net, midjourney-api.thenextleg.io, imaginesoftware.io надають REST API поверх своїх Discord-акаунтів з Midjourney. Технічно працює, але:
- Порушує ToS Midjourney (ризик бану акаунту)
- Нестабільність при оновленнях Discord/Midjourney
- Немає SLA
- Результати залежать від версії бота постачальника
Для прототипів і внутрішніх інструментів — прийнято. Для продакшену — ризиковано.
Альтернативи з порівнянною якістю
Ideogram v2 — якість, порівнянна з Midjourney для художніх стилів, плюс чудовий текст всередину зображень (слабке місце MJ). Офіційний API.
Leonardo.ai — багата бібліотека стилів, ControlNet, motion (відео). Офіційний API.
Flux (FAL.ai) — Flux Pro/Ultra від Black Forest Labs, якість на рівні MJ v6, офіційний API через FAL.
Для більшості продукту завдань Flux Pro на FAL — найкращий вибір: стабільний API, висока якість, прийнятні ціни.
Інтеграція через прокси API (useapi.net)
Якщо клієнт наполягає саме на Midjourney:
class MidjourneyProxyService(private val apiKey: String) {
private val client = OkHttpClient.Builder()
.readTimeout(300, TimeUnit.SECONDS) // MJ генерує до 3–4 хвилин
.build()
suspend fun imagine(prompt: String): String = withContext(Dispatchers.IO) {
val body = JSONObject().apply {
put("prompt", prompt)
}.toString().toRequestBody("application/json".toMediaType())
val request = Request.Builder()
.url("https://api.useapi.net/v2/jobs/imagine")
.header("Authorization", "Bearer $apiKey")
.post(body)
.build()
val response = client.newCall(request).execute()
val json = JSONObject(response.body!!.string())
json.getString("jobid") // Отримуємо jobid для polling
}
suspend fun getResult(jobId: String): MidjourneyResult? = withContext(Dispatchers.IO) {
val request = Request.Builder()
.url("https://api.useapi.net/v2/jobs/?jobid=$jobId")
.header("Authorization", "Bearer $apiKey")
.get()
.build()
val response = client.newCall(request).execute()
val json = JSONObject(response.body!!.string())
when (json.optString("status")) {
"completed" -> {
val attachments = json.getJSONArray("attachments")
MidjourneyResult.Success(attachments.getJSONObject(0).getString("url"))
}
"failed" -> MidjourneyResult.Failed(json.optString("error"))
else -> null // ще у процесі
}
}
}
Midjourney генерує сітку 2x2 зображень. Після отримання результату користувач може вибрати один варіант (upscale) або запросити варіації. Додаткові API-виклики (/v2/jobs/button з action U1–U4 або V1–V4).
Інтеграція Flux через FAL.ai (рекомендований підхід)
struct FalFluxService {
private let baseURL = "https://fal.run/fal-ai/flux-pro"
func generate(prompt: String) async throws -> URL {
var request = URLRequest(url: URL(string: baseURL)!)
request.httpMethod = "POST"
request.setValue("Key \(apiKey)", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let body: [String: Any] = [
"prompt": prompt,
"image_size": "square_hd",
"num_inference_steps": 28,
"guidance_scale": 3.5,
"num_images": 1,
"enable_safety_checker": true
]
request.httpBody = try JSONSerialization.data(withJSONObject: body)
let (data, _) = try await URLSession.shared.data(for: request)
let response = try JSONDecoder().decode(FalResponse.self, from: data)
return URL(string: response.images[0].url)!
}
}
FAL повертає результати синхронно (або через чергу при навантаженні). Затримка Flux Pro — 5–10 секунд для square_hd.
Параметри промпту Midjourney
Якщо працюєш з MJ через прокси, промпти мають специфічний синтаксис:
portrait photo of astronaut in forest --ar 3:4 --v 6 --style raw --stylize 100
--ar — aspect ratio (16:9, 3:4, 1:1)
--v 6 — версія моделі
--style raw — менш стилізований результат
--stylize 0–1000 — ступінь стилізації (250 за замовчуванням)
--no text, watermark — негативний промпт
--seed 12345 — відтворюваність
З звичайними API (Ideogram, FAL) ці параметри передаються як нативні поля запиту.
UX при тривалому генеруванні
Midjourney через прокси: 60–180 секунд. Flux: 5–15 секунд.
Для тривалого очікування — polling кожні 5 секунд з анімованим індикатором. Не частіше: постачальники можуть обмежувати при частих запитах. Показуй витрачений час («Генеруємо... 45 сек»), це зменшує тривогу користувача.
Терміни
Інтеграція прокси API (useapi.net або аналог) з polling і базовим UI — 4–6 днів. Flux/Ideogram з нативним API, upscale/variations, галерея — 10–14 днів.







