Как подключить ChatGPT API к проекту на Kotlin: пошаговый гайд

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Почему стоит интегрировать 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 =                

Блоги

Рекомендаций по книгам