Почему стоит интегрировать ChatGPT в Kotlin-приложение?
Представьте: вы пишете приложение на Kotlin, и вдруг понимаете, что ему не хватает «мозга». Пользователь задаёт вопрос, а программа тупит. Знакомо? Интеграция ChatGPT API на Kotlin превращает обычное приложение в умного ассистента. Это не модный тренд, а рабочий инструмент: чат-боты, генераторы контента, переводчики, помощники по коду — всё это можно сделать своими руками.
В этой статье мы не будем переливать из пустого в порожнее. Я покажу, как буквально за 15 минут подключить ChatGPT к вашему проекту, используя современные Kotlin-инструменты: Retrofit, OkHttp, Coroutines и Gson. Даже если вы новичок, просто повторяйте шаги — код рабочий и проверенный.
Что нам понадобится? Инструменты и подготовка
Для работы с OpenAI API Kotlin нам нужен минимальный набор. Запаситесь:
- API-ключ OpenAI — регистрируетесь на platform.openai.com, создаёте ключ в разделе API keys. Держите его в секрете!
- Среда разработки — IntelliJ IDEA (Community хватит) или Android Studio, если пишете под мобилки.
- Gradle или Maven — для подключения зависимостей.
Мы будем использовать Retrofit Kotlin как HTTP-клиент и Gson Kotlin для работы с JSON. Почему именно они? Retrofit даёт чистый, декларативный код, а Gson умеет превращать ответы API в data-классы без лишних телодвижений.
Шаг 1. Создаём проект и подключаем зависимости
Создайте новый Gradle-проект (Kotlin/JVM). В файл build.gradle.kts добавьте:
dependencies {
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
implementation("com.squareup.okhttp3:okhttp:4.12.0")
implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")
implementation("com.google.code.gson:gson:2.10.1")
}
Важно: logging-interceptor необязателен, но он спасёт вас при отладке — вы увидите, что реально уходит на сервер и приходит обратно. Если пишете для Android, добавьте ещё implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0").
Шаг 2. Модели данных: как ChatGPT «видит» ваш запрос
API OpenAI принимает и отдаёт строгий JSON. Чтобы не мучиться с ручным парсингом, создадим data-классы. Это основа любого примера кода Kotlin ChatGPT.
// Модель запроса к ChatGPT
data class ChatRequest(
val model: String = "gpt-4o-mini", // самая дешёвая и быстрая модель
val messages: List<Message>,
val temperature: Double = 0.7
)
data class Message(
val role: String, // "user", "assistant", "system"
val content: String
)
// Модель ответа от ChatGPT
data class ChatResponse(
val choices: List<Choice>?
)
data class Choice(
val message: Message?,
val finish_reason: String?
)
Обратите внимание: model мы ставим gpt-4o-mini — это современная модель от OpenAI, которая стоит копейки, но выдаёт достойный результат. Для тестов идеально.
Шаг 3. Retrofit: настраиваем клиент для общения с OpenAI
Теперь создаём интерфейс, который опишет наш единственный endpoint. Это классический подход Retrofit Kotlin.
interface OpenAiApi {
@POST("v1/chat/completions")
@Headers("Content-Type: application/json")
suspend fun chatCompletion(
@Header("Authorization") auth: String,
@Body request: ChatRequest
): ChatResponse
}
Ключевой момент: suspend — это корутина. Без неё запрос повесит поток, а с ней мы можем писать асинхронный код без коллбэков.
Теперь собираем сам клиент:
object ApiClient {
private const val BASE_URL = "https://api.openai.com/"
private const val API_KEY = "ВАШ_СЕКРЕТНЫЙ_КЛЮЧ" // никогда не хардкодьте в продакшене!
private val okHttpClient = OkHttpClient.Builder()
.addInterceptor(HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY
})
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build()
val api: OpenAiApi = Retrofit.Builder()
.baseUrl(BASE_URL)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(OpenAiApi::class.java)
suspend fun askChatGPT(prompt: String): String {
val request = ChatRequest(
messages = listOf(
Message(role = "system", content = "Ты — полезный ассистент."),
Message(role = "user", content = prompt)
)
)
return try {
val response = api.chatCompletion(
auth = "Bearer $API_KEY",
request = request
)
response.choices?.firstOrNull()?.message?.content
?: "Ошибка: пустой ответ от API"
} catch (e: Exception) {
"Ошибка соединения: ${e.localizedMessage}"
}
}
}
Здесь мы создали синглтон ApiClient с методом askChatGPT. Вы просто передаёте текст запроса, а на выходе получаете строку с ответом. Удобно, правда?
Шаг 4. Пишем main-функцию: первый живой разговор
Время проверить нашу интеграцию. Создаём точку входа:
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
println("Задай вопрос ChatGPT:")
val userInput = readlnOrNull() ?: "Расскажи шутку про программистов"
val answer = ApiClient.askChatGPT(userInput)
println("ChatGPT: $answer")
}
Запускаем, вводим вопрос — и видим ответ. Если всё настроено правильно, вы получите осмысленный текст. Если нет — смотрите в логи (спасибо logging-interceptor).
Шаг 5. Улучшаем: добавляем историю диалога
Просто «вопрос-ответ» — скучно. Давайте сделаем настоящий диалог, где ChatGPT помнит контекст. Для этого нужно хранить список сообщений.
class ChatSession {
private val messages = mutableListOf(
Message(role = "system", content = "Ты — дружелюбный помощник. Отвечай кратко.")
)
suspend fun sendMessage(userText: String): String {
messages.add(Message(role =