Интеграция ChatGPT API в мобильное приложение
Интеграция ChatGPT API в мобильное приложение — это не просто URLSession.dataTask с JSON-телом. Это управление потоковым выводом, контекстом диалога, безопасностью ключей и расходами. Каждый из этих аспектов имеет свои нюансы на мобиле.
API-ключ: никогда не в клиентском коде
Первый и главный принцип: OpenAI API-ключ не должен попасть в бандл приложения, исходный код или даже в зашифрованные настройки на устройстве. Если ключ в клиенте — он скомпрометирован.
Правильная архитектура: мобильное приложение → ваш backend-proxy → OpenAI API. Backend авторизует пользователя, применяет rate limiting, логирует расходы, подставляет ключ. Дополнительно: backend может кэшировать типовые ответы, снижая стоимость.
На backend: если нет желания писать proxy с нуля, openai-node или openai-python SDK за nginx. Или serverless через Cloudflare Workers — холодный старт ~5 ms, дешевле, чем EC2 при низкой нагрузке.
Потоковый вывод (streaming)
Без streaming пользователь ждёт полного ответа — 3–8 секунд для длинных текстов. С streaming — первый токен появляется через 200–400 ms, текст растёт по мере генерации.
OpenAI Chat Completions API с stream: true возвращает Server-Sent Events (SSE). На мобиле парсить SSE нужно вручную — URLSession не поддерживает SSE из коробки.
На iOS — URLSessionDataDelegate с urlSession(_:dataTask:didReceive:):
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
let lines = String(data: data, encoding: .utf8)?.components(separatedBy: "\n") ?? []
for line in lines where line.hasPrefix("data: ") {
let jsonString = String(line.dropFirst(6))
guard jsonString != "[DONE]" else { return }
// парсим delta.content из JSON
}
}
На Android — OkHttp с EventSourceListener из okhttp-sse:
val eventSource = EventSources.createFactory(client)
.newEventSource(request, object : EventSourceListener() {
override fun onEvent(source: EventSource, id: String?, type: String?, data: String) {
if (data == "[DONE]") return
// парсим delta.content
}
})
Обновление UI при каждом токене: @Published var streamingText: String (iOS) или StateFlow<String> (Android). Не вызывать recompose / setState слишком часто — буферизировать токены и обновлять UI раз в 50–100 ms.
Управление контекстом
ChatGPT API stateless — каждый запрос независим. Контекст диалога строите вы: передаёте массив messages с историей.
Ограничение: gpt-4o-mini — 128k токенов контекста. На практике длинный контекст = высокая стоимость. Стратегии:
- Sliding window — последние N сообщений, остальное отбрасываем.
-
Summarization — при превышении порога (например, 8000 токенов) сжимаем старую историю через отдельный запрос с
"Summarize this conversation in 3 sentences". - Selective memory — сохраняем только сообщения с высокой важностью (пользователь явно указал факт о себе).
Подсчёт расходов
Каждый запрос — деньги. На мобиле важно:
- Не отправлять запрос при каждом нажатии клавиши (debounce 500 ms)
- Ограничивать
max_tokensв ответе под задачу — не 4096 там, где достаточно 256 - Логировать
usage.total_tokensиз каждого ответа в аналитику (Firebase или собственный backend) - Установить лимиты через OpenAI Usage Limits dashboard (жёсткий cap на месяц)
Кейс: приложение для изучения языков с AI-репетитором. gpt-4o-mini, streaming. Контекст — последние 10 сообщений + system prompt с правилами урока (~300 токенов). Средний запрос: 450 input + 180 output токенов. При 500 DAU и 15 сообщениях в сессию — ~3.4M токенов в день. При ценах 2025 года — приемлемо. Кэширование system prompt через OpenAI Prompt Caching снизило input-стоимость на 35%.
Обработка ошибок
429 Too Many Requests — экспоненциальный backoff: 1s, 2s, 4s, 8s. Максимум 3 retry. 503 Service Unavailable — аналогично. 400 Bad Request — обычно проблема с форматом messages (пустой content, неверная роль). Все ошибки — в Crashlytics / Sentry с полным контекстом запроса (без токена).
Сроки
Интеграция с потоковым выводом, управлением контекстом и backend-proxy — 3–5 рабочих дней. Стоимость рассчитывается индивидуально.







