Реалізація AI-генерації зображень (Kandinsky) у мобільному додатку
Ми в команді мобільної розробки регулярно вирішуємо завдання інтеграції AI-генерації зображень. Для україномовного ринку оптимальним інструментом стала модель Kandinsky від Sber AI (версія 3.1). Її перевага — нативне розуміння українських промптів без перекладу. З нею «захід сонця над березовим лісом» працює так само, як на західних моделях англійський запит, без втрати якості. Правильна інтеграція такого сервісу займає від 3 до 12 днів, але результат — унікальна фіча для користувачів. Якщо ви замислюєтеся про додавання AI-генерації, Wikipedia: Kandinsky AI допоможе розібратися в основах, а ми покажемо, як реалізувати її технічно.
Чому варто обрати Kandinsky для мобільного додатку?
Основні причини: повна підтримка української мови, безкоштовний тариф на старті (100 запитів на добу), висока якість генерації для художніх та природних сюжетів. На відміну від багатьох західних аналогів, Kandinsky не потребує VPN і працює через офіційний Fusionbrain API. Для мобільного розробника це означає простоту інтеграції без додаткових проксі-серверів.
Доступні способи інтеграції
Порівняємо три основні підходи:
| Метод | API | Безкоштовний рівень | Стабільність | Рекомендація |
|---|---|---|---|---|
| Fusionbrain API | REST | 100 запитів/добу | Висока | Продакшен |
| Replicate | REST | Немає (плата за модель) | Середня | Прототипи |
| HuggingFace Inference API | REST | Обмежено | Низька | Експерименти |
Для продакшену обираємо Fusionbrain API з власним бекендом-проксі. Це гарантує керованість та безпеку.
Як ми інтегруємо Fusionbrain API: покроковий приклад
Розглянемо процес на Kotlin (Android), хоча на Swift він практично ідентичний. Основна складність — двоетапна модель: створення завдання та polling результату.
class KandinskyService(private val apiKey: String, private val secretKey: String) {
// Шаг 1: получить ID модели
suspend fun getModelId(): String {
val response = httpClient.get("https://api-key.fusionbrain.ai/key/api/v1/models") {
header("X-Key", "Key $apiKey")
header("X-Secret", "Secret $secretKey")
}
val models = response.body<List<FusionBrainModel>>()
return models.first { it.name == "Kandinsky" }.id.toString()
}
// Шаг 2: создать задачу генерации
suspend fun createTask(modelId: String, prompt: String, width: Int = 1024, height: Int = 1024): String {
val params = JSONObject().apply {
put("type", "GENERATE")
put("numImages", 1)
put("width", width)
put("height", height)
put("generateParams", JSONObject().apply {
put("query", prompt)
})
}
// Multipart запрос
val requestBody = MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("model_id", modelId)
.addFormDataPart(
"params",
"params.json",
params.toString().toRequestBody("application/json".toMediaType())
)
.build()
val response = OkHttpClient().newCall(
Request.Builder()
.url("https://api-key.fusionbrain.ai/key/api/v1/text2image/run")
.header("X-Key", "Key $apiKey")
.header("X-Secret", "Secret $secretKey")
.post(requestBody)
.build()
).execute()
return JSONObject(response.body!!.string()).getString("uuid")
}
// Шаг 3: polling
suspend fun pollResult(taskUuid: String): Bitmap? {
repeat(30) {
delay(3000)
val response = OkHttpClient().newCall(
Request.Builder()
.url("https://api-key.fusionbrain.ai/key/api/v1/text2image/status/$taskUuid")
.header("X-Key", "Key $apiKey")
.header("X-Secret", "Secret $secretKey")
.get()
.build()
).execute()
val json = JSONObject(response.body!!.string())
if (json.getString("status") == "DONE") {
val images = json.getJSONArray("images")
val base64 = images.getString(0)
val bytes = Base64.decode(base64, Base64.DEFAULT)
return BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
}
}
return null
}
}
Код вище демонструє типову реалізацію. Зверніть увагу: відповідь приходить як base64-рядок, а не URL. Декодувати потрібно у фоновому потоці, щоб не блокувати UI.
Параметри генерації: блоки, стилі та негативний промпт
Kandinsky підтримує гнучке налаштування. Ось оптимальні параметри для мобільного додатку:
| Параметр | Діапазон | Рекомендація |
|---|---|---|
| width/height | 256–1024, кратне 64 | 768×768 або 1024×1024 |
| style | DEFAULT, ANIME, PORTRAIT, NATURE, REALISTIC | Залежить від контенту |
| negativePromptDecoder | рядок | Вказувати завжди |
val params = JSONObject().apply {
put("type", "GENERATE")
put("numImages", 1)
put("width", 768)
put("height", 1024)
put("style", "PORTRAIT")
put("generateParams", JSONObject().apply {
put("query", "портрет молодої жінки в українському традиційному костюмі, деталізований, реалізм")
})
put("negativePromptDecoder", "розмитість, артефакти, деформація, текст, водяний знак")
}
Що таке negative prompt і як він покращує результат?
Негативний промпт — це опис того, чого модель повинна уникати. У прикладі вище ми вказали «розмитість, артефакти, деформація, текст, водяний знак». Це знижує ймовірність появи небажаних елементів. Для портретів та фотореалістичних сцен negative prompt обов'язковий: без нього модель може додати випадкові артефакти. Експериментуйте з формулюваннями: чим точніше опишете, що потрібно виключити, тим чистішою буде генерація.
Український промпт vs англійський: практичні рекомендації
Kandinsky розуміє українську без деградації якості. Однак для технічних описів (архітектура, механізми) англійський промпт дає точніший результат — модель навчена на змішаному корпусі, і технічні терміни краще представлені в англійській. Для художніх, пейзажних, портретних сценаріїв українська працює відмінно. Для максимальної якості пишіть промпт обома мовами (якщо UI дозволяє), Kandinsky обробить обидва.
Як уникнути типових помилок при інтеграції?
- Статус FAIL від Fusionbrain без пояснень — зазвичай промпт порушує content policy або занадто короткий (менше 3 слів). Мінімальний промпт для стабільної роботи — 5–10 слів.
- Декодування base64 на main thread — блокування UI. Завжди використовуйте фоновий потік:
DispatchQueue.global().async(iOS) абоDispatchers.Default(Android). - Перевищення ліміту безкоштовного тарифу — моніторте кількість запитів за допомогою лічильника.
Повний чек-лист для інтеграції:
- Отримано API-ключі Fusionbrain
- Реалізовано polling з таймаутом (30 спроб по 3 секунди)
- Обробка помилок 4xx та 5xx
- Декодування base64 у фоні
- Кешування результатів
- UI з індикатором завантаження
Що входить у нашу роботу
При замовленні інтеграції Kandinsky у ваш мобільний додаток ми надаємо:
- Backend-проксі для безпечного зберігання API-ключів.
- Модуль генерації для iOS (Swift) або Android (Kotlin) з обробкою помилок.
- UI-компонент для введення промпту, вибору стилю та відображення результату.
- Інтеграцію з галереєю для збереження зображень.
- Документацію з використання API та приклади запитів.
У нас за плечима більше десяти проєктів з інтеграції Kandinsky та більше п'яти років досвіду в mobile AI. Ми гарантуємо стабільну роботу навіть при пікових навантаженнях. Якщо ви хочете впровадити AI-генерацію у свій додаток, зв'яжіться з нами для попереднього аналізу.
Скільки часу займає інтеграція та яка її вартість?
Базова інтеграція Fusionbrain API з UI займає від 3 до 4 днів. Додавання стилів, історії генерацій, збереження в галереї та обробки помилок content policy — від 8 до 12 днів. Вартість розраховується індивідуально. Зверніть увагу: Fusionbrain API безкоштовний до 100 генерацій на день, що суттєво економить бюджет на невеликому проєкті. Для більш серйозних обсягів можна придбати платний тариф.
Отримайте консультацію з інтеграції AI-генерації у ваш додаток. Напишіть нам, і ми підберемо оптимальне рішення.







