В проекте появляется задача: дать пользователям возможность генерировать изображения по текстовому описанию. Вы пробуете 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 дня.







