Ad
Искусственный интеллект

KotlinLLM дописывает Kotlin-код во время запуска приложения

Маша Даровская
By Маша Даровская , IT-редактор и автор
KotlinLLM дописывает Kotlin-код во время запуска приложения
Обложка © Anonhaven

JetBrains Research открыла исходный код KotlinLLM — исследовательского плагина для IntelliJ IDEA, который создаёт реализации функций по данным из работающего Kotlin/JVM-приложения. Плагин генерирует исходный код на Kotlin, компилирует его и заменяет соответствующий класс в запущенной JVM без полного перезапуска программы.

Созданные реализации сохраняются в каталоге проекта как обычные Kotlin-файлы. Разработчик может проверить их, покрыть тестами и добавить в репозиторий. При повторной обработке уже известного сценария приложение исполняет готовый код без нового запроса к языковой модели.

Ключевое ограничение: проект пока представляет собой исследовательский прототип. Его механизм развития кода работает при специальном запуске из IntelliJ IDEA, а не как автономная система внутри готового приложения.

Как устроены «умные макросы»

KotlinLLM вводит понятие Smart macros — «умных макросов». Это название внутренней концепции проекта, а не новая конструкция языка Kotlin и не макрос компилятора. Для разработчика они выглядят как обычные вызовы функций.

Открытый интерфейс содержит два макроса:

asLlm<F, T>(from, hint)

mockLlm<T>()

asLlm<F, T>(from, hint) преобразует значение типа F в значение типа T. Результатом может быть примитив, перечисление, список или класс данных. Аргумент hint содержит описание требуемого преобразования.

val apiUrl: String = asLlm(

    "JetBrains/kotlin",

    hint = "Return a GitHub issues API URL"

)

mockLlm<T>() создаёт реализацию интерфейса T. Она может хранить состояние и развивать поведение после новых вызовов. Авторы предлагают использовать такой макрос для испытательных двойников — объектов, заменяющих настоящие сервисы в тестах.

val service: GithubService = mockLlm()

Запись asLlm<F, T>() без аргументов в исходном сообщении неполна. Функция принимает исходное значение from и необязательную текстовую подсказку hint.

Где появляется сгенерированный код

Модель не вставляет тело непосредственно в место вызова asLlm. Плагин создаёт отдельную служебную инфраструктуру: поставщиков реализаций, преобразователи типов, классы для испытательных двойников и загрузчик этих компонентов.

По умолчанию файлы размещаются в пакетах внутри com.jetbrains.kotlinllm.generated. Разработчик сам выбирает корневой каталог создаваемых исходников в настройках проекта.

Эти файлы принадлежат целевому проекту и могут храниться в системе управления версиями. Плагин не отправляет изменения в репозиторий автоматически: решение о добавлении кода принимает разработчик.

Модель также не получает право произвольно менять все файлы приложения. Агент обновляет подготовленные участки реализаций, созданные инфраструктурой KotlinLLM.

Как код меняется во время запуска

Проект сначала нужно открыть в специальной среде IntelliJ IDEA и запустить через команду Run with KotlinLLM. Обычный запуск не включает генерацию и горячую замену классов.

Перед стартом плагин ищет вызовы asLlm и mockLlm, подготавливает необходимые файлы и запускает исходную конфигурацию под управлением JDI — отладочного интерфейса платформы Java.

Если готовая реализация не может обработать очередной вход, выполнение останавливается в специальной точке повторной генерации. Плагин извлекает значения переменных и сведения о типах из текущего кадра стека. Агент получает ограниченные инструменты для изучения входных данных, поиска фрагментов и проверки целевых типов.

После этого система проходит несколько этапов:

неподдержанный вход

→ остановка приложения

→ передача значений и типов модели

→ создание узкого обновления

→ запись Kotlin-файла

→ компиляция изменённого класса

→ замена класса через JDI

→ повтор исходного вызова

Архитектура подробно описана в репозитории KotlinLLM. Плагин обращается к модели при отсутствии подходящей реализации. Уже поддерживаемые случаи выполняются локальным кодом.

Какие данные отправляются модели

KotlinLLM извлекает значения из работающей программы. Это может быть строка, ответ программного интерфейса, структура данных или содержимое объекта. Агент также получает информацию о целевых типах и инструменты для просмотра крупных входов.

Текущая реализация использует Koog и OpenAI. Для генерации нужен ключ OpenAI API, который указывается в файле .kotlinllm.

Такая архитектура требует осторожности при работе с корпоративными данными. Значения из памяти приложения могут содержать персональные сведения, внутренние документы, токены или коммерческую информацию. Перед использованием плагина потребуется определить допустимый набор данных и исключить секреты из отправляемого содержимого.

Файл .kotlinllm с рабочим ключом API также нельзя добавлять в репозиторий.

Радар задач обработал более 30 тысяч записей

Исследователи адаптировали Spring Petclinic на Kotlin и добавили в проект 18 вызовов asLlm. После развития созданных реализаций приложение прошло 24 из 24 подготовленных сценариев.

Горячая замена классов сработала во всех зафиксированных случаях. Компиляция и переопределение классов заняли около 1% общего времени работы тестового приложения.

Второй пример получил название GitHub Beginner Issue Radar. Программа строила адреса API, разбирала ответы GitHub и определяла задачи, подходящие начинающим разработчикам.

Испытание охватило более 30 тысяч задач из 20 репозиториев. Полнота обнаружения задач с контрольными метками составила около 0,89.

Полнота показывает, какую долю нужных записей нашла система. Она не отражает количество ошибочно выбранных задач. Поэтому результат нельзя описывать как «89% точности».

Пример вместе с созданными реализациями находится в открытом репозитории. Его можно собрать как обычный Kotlin/JVM-проект и отдельно изучить результат работы модели.

Что нужно для запуска KotlinLLM

Плагин рассчитан на IntelliJ IDEA 2025.2.x и JDK 21. Поддерживается только Kotlin/JVM, поскольку замена классов основана на JDI.

Kotlin/Native, Kotlin/JS, Android и Kotlin Multiplatform в опубликованной документации как поддерживаемые платформы не указаны.

Разработчику потребуется собрать плагин и запустить изолированную среду IntelliJ IDEA через задачу Gradle runIde. Готового стабильного выпуска в разделе релизов на момент проверки нет.

В целевой проект нужно добавить файл открытого интерфейса KotlinLLM.kt, выбрать каталог создаваемых исходников, указать каталог сборки и сохранить ключ API в настройках. Обычная конфигурация запуска затем выполняется через отдельный исполнитель KotlinLLM.

Исходный код опубликован по лицензии Apache 2.0. Репозиторий содержит плагин, интерфейс макросов, примеры, созданные моделью файлы и теоретическое описание архитектуры.

Вопросы и ответы

KotlinLLM обращается к модели при каждом вызове?

Нет. Запрос выполняется, если сохранённая реализация ещё не поддерживает встретившийся сценарий.

Плагин меняет произвольные файлы проекта?

Нет. Агент обновляет подготовленные классы в выделенном каталоге создаваемого кода.

Созданный код автоматически попадает в репозиторий?

Нет. Файлы сохраняются в проекте, но решение об их добавлении принимает разработчик.

Можно ли запустить приложение без плагина?

Да, если нужные реализации уже созданы и включены в сборку. Для неизвестных сценариев документация не обещает корректного результата без нового цикла генерации.

Требуется ли OpenAI API в рабочем приложении?

Зафиксированный код работает без нового запроса. OpenAI API нужен текущему прототипу для создания и обновления реализаций.

Действительно ли накладные расходы составляют 1%?

Только в узком смысле. Примерно 1% заняли компиляция и замена классов в эксперименте с Petclinic. Это не универсальная оценка всех расходов KotlinLLM.

Можно ли использовать KotlinLLM с Android?

Поддержка Android не заявлена. Текущий прототип предназначен для Kotlin/JVM и IntelliJ IDEA.

Есть новость? Станьте автором.

Мы сотрудничаем с независимыми исследователями и специалистами по кибербезопасности. Отправьте нам новость или предложите статью на рассмотрение редакции.