Розробка AI-асистента у мобільному додатку на базі GPT-4/GPT-4o
GPT-4o — мультимодальна модель: приймає текст, зображення та аудіо в одному API-виклику. Змінює архітектуру асистента порівняно з GPT-4-turbo: замість окремих пайплайнів для OCR + текст + голос — один ендпоінт gpt-4o з content типу array. Мобільний додаток, який не використовує цю можливість, втрачає половину цінності моделі.
Інтеграція OpenAI API: що дійсно важливо
Базовий виклик — через POST /v1/chat/completions. На iOS найзручніше використовувати офіційний пакет openai-swift або написати тонкий wrapper на URLSession — залежність від важких HTTP-клієнтів тут непотрібна.
Ключові параметри для мобільного асистента:
let request = ChatCompletionRequest(
model: "gpt-4o",
messages: conversationHistory,
stream: true, // потокова передача — обов'язково для UX
maxTokens: 1024,
temperature: 0.7
)
Потокова передача — не опція, а вимога. Користувач, який чекає 5–8 секунд тиші перед появою відповіді, закриває додаток. З stream: true перший токен приходить через 300–500 мс, та текст появляється посимвольно. Реалізація на iOS через URLSession + AsyncBytes або через EventSource для SSE.
Мультимодальність GPT-4o. Передача зображення:
let message = ChatMessage(role: .user, content: [
.text("Що зображено на цьому скриншоті?"),
.imageURL(base64Image: imageBase64, detail: .auto)
])
detail: .auto — модель сама вибирає між low (85 токенів) та high (до 1700 токенів) залежно від завдання. Для аналізу документів краще high, для швидких відповідей — low.
Управління контекстом та токенами
GPT-4o має контекстне вікно 128K токенів. Але слати всю історію діалогу в кожному запиті — помилка, яка б'єм по вартості та затримці. Правильна стратегія: ковзне вікно з суммаризацією.
Коли історія перевищує поріг (наприклад, 4000 токенів), останні N повідомлень зберігаються повністю, більш ранні — замінюються summary, згенерованим через окремий виклик з gpt-4o-mini (у 20 разів дешевше). Summary зберігається як system повідомлення на початку історії.
Токени рахуємо через tiktoken на сервері або використовуємо евристику: ~4 символи ≈ 1 токен для англійської, ~2–3 символи ≈ 1 токен для кирилиці.
Обробка помилок та rate limits
OpenAI API повертає 429 Too Many Requests при перевищенні rate limit. На мобільному клієнті потрібен exponential backoff з jitter:
func retryWithBackoff<T>(maxAttempts: Int = 3, operation: () async throws -> T) async throws -> T {
var attempt = 0
while attempt < maxAttempts {
do {
return try await operation()
} catch APIError.rateLimitExceeded {
let delay = Double.random(in: 1.0...2.0) * pow(2.0, Double(attempt))
try await Task.sleep(nanoseconds: UInt64(delay * 1_000_000_000))
attempt += 1
}
}
throw APIError.maxRetriesExceeded
}
Таймаут на потоковий запит потрібно ставити на рівні читання (timeout per chunk), а не на весь запит — інакше довгі відповіді абрупто обриваються.
Безпека API-ключа
API-ключ OpenAI неможливо хардкодити у мобільному додатку — його можна витягти з бінарника за хвилини. Правильна схема: мобільний клієнт аутентифікується на власному бекенді, бекенд проксирує запити до OpenAI з ключем з змінних оточення. Додатково — rate limiting на рівні користувача.
Процес впровадження
Аудит вимог: які модальності потрібні (тільки текст, зображення, голос), потрібен ліле серверний проксі, вимоги до історії діалогу (скільки зберігати, синхронізувати ліле між пристроями).
Розробка: API-клієнт → потоковий UI → управління історією → мультимодальність → обробка помилок → серверний проксі.
Часові орієнтири
Текстовий асистент з потоковою передачею та історією — 1–2 тижні. З зображеннями, голосом, серверним проксі та управлінням контекстом — 3–5 тижнів.







