В проекте появляется задача: дать пользователям возможность генерировать изображения по текстовому описанию. Вы пробуете Midjourney — он быстро выдают качественные результаты, но официального API нет. Все сторонние обёртки нарушают условия использования Discord. Без чёткой архитектуры интеграция превращается в зоопарк костылей. Мы сталкивались с этим не раз и выработали подход: не использовать неофициальные решения в продакшене или, если клиент настаивает, делать это с чёткими оговорками.
Какой API выбрать для продакшена?
Рассмотрим три основных варианта. Качество генерации у всех высокое, но стабильность и юридическая чистота различаются кардинально.
| Параметр | Midjourney Proxy (useapi.net) | Flux Pro (FAL.ai) | Ideogram v2 |
|---|---|---|---|
| Качество | Высокое (MJ v6) | Высокое (на уровне MJ v6) | Высокое (художественные стили, отличный текст) |
| Стабильность | Низкая (нарушает ToS, риск бана) | Высокая (официальный API, SLA) | Высокая (официальный API) |
| Время генерации | 60–180 сек | 5–15 сек | 10–20 сек |
| Юридическая чистота | Рискованно | Чисто | Чисто |
Почему Flux Pro в 12 раз быстрее Midjourney прокси?
Для продакшена Flux Pro — best in class. Он генерирует изображение за 5–15 секунд, а Midjourney через прокси требует до трёх минут. Разница в 12 раз, и это без учёта простоев из-за блокировок аккаунтов. Кроме того, Flux Pro позволяет настраивать шаги инференса, guidance scale и ratio — гибкость, которой Midjourney не даёт. Официальная документация FAL.ai подтверждает поддержку синхронного и асинхронного режимов.
Как интегрировать Flux Pro на Swift?
Пример интеграции Flux Pro через 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)!
}
}
Midjourney прокси: код на Kotlin (если клиент настаивает)
Если клиент настаивает именно на Midjourney, используем прокси-сервисы типа useapi.net. Пример на Kotlin:
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")
}
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).
Что входит в работу
Мы предоставляем интеграцию «под ключ»:
- Выбор оптимального AI-сервиса под ваши задачи
- Реализация API-клиента с обработкой ошибок и retry
- UI для ввода промпта, отображения результата (с анимацией загрузки)
- Поддержка upscale, вариаций, сохранения в галерею
- Документация по использованию и настройке
- Тестирование на реальных устройствах
- Поддержка в течение месяца после сдачи
Сроки и стоимость
Интеграция прокси-API (useapi.net) с polling и базовым UI — 4–6 дней. Flux/Ideogram с нативным API, upscale/variations, галерея — 10–14 дней. Стоимость рассчитывается индивидуально в зависимости от сложности и стека. Оценим проект за 1–2 дня.
Как организовать очередь запросов и кэширование?
Генерация изображений — ресурсоёмкая операция. Чтобы приложение оставалось отзывчивым, задачи ставятся в очередь. На стороне сервера используем Redis + Bull (Node.js) или Laravel Queues (PHP): каждый запрос получает jobId, статус которого клиент опрашивает через polling каждые 2–3 секунды. При успехе URL изображения кэшируется в CDN (Cloudflare R2 или S3), чтобы повторные запросы одного промпта отдавались мгновенно без платного API-вызова. На мобильном клиенте показываем анимацию shimmer-загрузки — пользователь видит, что процесс идёт. Тайм-аут 5 минут с автоматическим retry 3 раза гарантирует устойчивость к временным сбоям AI-сервиса. Такой подход снижает нагрузку на API и экономит до 40% бюджета при активной пользовательской базе. Дополнительно, мы реализуем хранилище истории генераций — пользователь может вернуться к предыдущим промптам и повторно использовать удачные варианты без повторного вызова API. История хранится локально в CoreData (iOS) или Room (Android), синхронизируется с сервером через background sync, что обеспечивает доступ к генерациям без подключения к интернету.
Наш опыт и компетенции
Мы более 5 лет занимаемся мобильной разработкой, реализовали 50+ проектов с интеграцией AI-сервисов. В портфолио — приложения с генерацией изображений, обработкой естественного языка и компьютерным зрением. Глубокое понимание как клиентской, так и серверной части гарантирует надёжное решение.
Если вам нужна AI-генерация в мобильном приложении — получите консультацию или отправьте техническое задание на оценку. Свяжитесь с нами — оценим проект за 1–2 дня.







