Розробка AI-асистента у мобільному додатку на базі Gemini (Google)
Gemini — єдина з топових моделей з нативним Android SDK від Google. google-ai-android (Generative AI SDK) інтегрується через Gradle без серверного проксі, що спрощує старт. Але для продакшену прямий доступ з мобільного клієнта — помилка: API-ключ витяжемо з APK. Це протиріччя між зручністю та безпекою потрібно вирішити на старті проекту.
Google AI SDK: Android та iOS
На Android офіційний шлях:
// build.gradle.kts
implementation("com.google.ai.client.generativeai:generativeai:0.9.0")
val model = GenerativeModel(
modelName = "gemini-1.5-pro",
apiKey = BuildConfig.GEMINI_API_KEY,
generationConfig = generationConfig {
temperature = 0.7f
maxOutputTokens = 2048
topK = 40
topP = 0.95f
},
safetySettings = listOf(
SafetySetting(HarmCategory.HARASSMENT, BlockThreshold.MEDIUM_AND_ABOVE)
)
)
На iOS — GoogleGenerativeAI через Swift Package Manager. API ідентичний, різниця тільки у синтаксисі.
Для Flutter — пакет google_generative_ai покриває обидві платформи.
Мультимодальність: нативна перевага Gemini
Gemini 1.5 Pro обробляє текст, зображення, аудіо, відео та PDF в одному запиті з контекстом до 1 мільйона токенів. Для мобільного асистента це відкриває сценарії, недоступні іншим моделям: передати 30-хвилинне відео та попросити резюме, або завантажити аудіозапис зустрічі для транскрипції з резюме.
Передача зображення через Android SDK:
val image = BitmapFactory.decodeResource(resources, R.drawable.photo)
val content = content {
image(image)
text("Опиши, що відбувається на цьому фото")
}
val response = model.generateContent(content)
Файли більше 20 МБ потрібно завантажувати через File API (POST https://generativelanguage.googleapis.com/upload/v1beta/files), а не передавати inline base64. File API зберігає файл 48 годин, повертає file_uri, який використовується у подальших запитах.
Потокова передача та нативні Kotlin coroutines
Gemini Android SDK повертає Flow<GenerateContentResponse> для стриму — нативна інтеграція з Kotlin coroutines:
viewModelScope.launch {
model.generateContentStream(prompt).collect { chunk ->
val text = chunk.text ?: return@collect
_uiState.update { it + text }
}
}
Це чистіше, ніж ручний розбір SSE-потоку. На iOS аналогічний AsyncThrowingStream<GenerateContentResponse, Error>.
Gemini vs Vertex AI: вибір для продакшену
Google пропонує два шляхи:
- Google AI (Gemini API) — прямий доступ, простий старт, для MVP та малих додатків
- Vertex AI — enterprise-варіант з додатковими можливостями: fine-tuning, корпоративний SLA, дані не використовуються для навчання, інтеграція з Google Cloud IAM
Для мобільного додатка з користувацькими даними — Vertex AI з серверним проксі. Для прототипу або B2B-інструменту без чутливих даних — Gemini API достатньо.
Vertex AI SDK на Android: com.google.cloud:google-cloud-aiplatform, але вимагає аутентифікації через сервісний аккаунт, що передбачає серверний шар.
Safety Settings та цензура
Gemini має вбудовану систему блокувань за категоріями: HARASSMENT, HATE_SPEECH, SEXUALLY_EXPLICIT, DANGEROUS_CONTENT. За замовчуванням поріг BLOCK_MEDIUM_AND_ABOVE — досить агресивний. Для медичних або юридичних додатків, де потрібно обговорювати чутливі теми, поріг знижується до BLOCK_ONLY_HIGH або BLOCK_NONE для конкретних категорій.
Відповідь із заблокованим контентом повертає finishReason: SAFETY, а не помилку HTTP — потрібно явно перевіряти це поле, інакше користувач отримає пусту відповідь без пояснень.
Часові орієнтири
Текстовий асистент з нативним SDK — 1 тиждень. Мультимодальний асистент з File API, потоковою передачею та серверним проксі — 3–4 тижні.







