LSP против всего стека JetBrains: что теряет AI-агент без доступа к IDE

Представьте: вы даете AI-агенту задачу написать микросервис на Kotlin. Он открывает файл, видит синтаксис, но не понимает, что suspend fun — это корутина, а @Autowired — это DI. Всё, что у него есть — это текст. Без контекста проекта, без типов, без истории рефакторинга. Именно это происходит, когда AI-агент работает только через LSP (Language Server Protocol), а не через полный стек JetBrains IDE.

Недавно на Хабре вышла статья, которая вскрыла эту проблему Источник. Автор наглядно показал: LSP даёт базовый синтаксис, но JetBrains IDE даёт AI-агенту семантику. И разница — это не «чуть лучше», а «работает vs не работает» для сложных проектов. Давайте разберёмся, что именно теряет AI-агент без доступа к платформе IDE и почему это критично для современной разработки.

Что такое LSP и почему все на нём помешались

LSP (Language Server Protocol) — это стандарт, который позволяет редакторам кода (VS Code, Neovim, Sublime Text) получать базовые функции: автодополнение, переход к определению, подсветку ошибок. Он универсален — один сервер работает для любого редактора. Для AI-агентов LSP — это быстрый способ понять структуру файла: где начинается функция, какие параметры, где ошибка.

Но LSP — это как смотреть на чертёж дома через замочную скважину. Вы видите, что есть стена, но не знаете, из какого она материала и выдержит ли нагрузку. JetBrains IDE, напротив, даёт полный BIM-проект: все связи, типы, зависимости, историю изменений.

Что даёт JetBrains IDE AI-агенту

1. Полная семантическая модель

JetBrains IDE строит не просто AST (Abstract Syntax Tree), а PSI (Program Structure Interface) — это AST + семантика. Для Java это означает, что AI видит не только List<String> list, но и понимает, что это именно java.util.List, а не android.widget.List. Для Kotlin — различает inline fun и suspend fun. Для Python — видит, что def foo(bar: str) — это не просто функция, а функция с аннотацией типа.

Пример из новости: AI-агент через LSP не может определить, является ли метод findUser частью репозитория или сервиса. JetBrains IDE видит всю цепочку наследования и аннотации @Repository или @Service. Результат: LSP-агент генерирует код, который не компилируется, а JetBrains-агент — рабочий.

2. Индексация всего проекта

LSP индексирует только открытые файлы. JetBrains IDE — весь проект. Это значит, что AI-агент может ответить на вопрос «Где используется этот метод?» или «Какие классы реализуют интерфейс UserRepository?». Для рефакторинга это критично: LSP-агент часто предлагает переименовать символ только в одном файле, ломая сборку. JetBrains-агент переименовывает везде, включая тесты и конфиги.

3. Понимание фреймворков

Spring, Micronaut, Quarkus, Hibernate — JetBrains IDE знает их на уровне плагинов. LSP — нет. AI-агент через LSP не понимает, что @Transactional — это не просто аннотация, а указание на управление транзакциями. Он может предложить вставить её в метод, где она не нужна, или, наоборот, пропустить там, где она обязательна.

Пример: в новости описан кейс с миграциями базы данных. AI-агент через LSP сгенерировал SQL-запрос, который работал, но нарушал консистентность данных, потому что не знал о существовании внешних ключей. JetBrains-агент, благодаря индексации схемы, предложил корректное решение.

4. История рефакторинга и локальные изменения

JetBrains IDE хранит историю изменений на уровне файловой системы. AI-агент может понять, почему был изменён конкретный метод, и предложить решение, которое не ломает существующую логику. LSP этого не даёт — агент работает только с текущим состоянием.

Что теряет AI-агент без доступа к IDE

Давайте сведём это в таблицу для наглядности:

Возможность LSP JetBrains IDE
Синтаксический анализ файла ✅ Да ✅ Да
Типизация (Java/Kotlin) ❌ Нет ✅ Да
Индексация всего проекта ❌ Только открытые файлы ✅ Весь проект
Понимание фреймворков (Spring, Hibernate) ❌ Нет ✅ Через плагины
Рефакторинг с учётом связей ❌ Только в одном файле ✅ Глобальный
Понимание DI (Dependency Injection) ❌ Нет ✅ Да
История изменений ❌ Нет ✅ Да
Поддержка сложных языков (Kotlin, Scala) ❌ Ограниченная ✅ Полная

Как видите, LSP — это базовый уровень. Для простых скриптов на Python или JavaScript его хватает. Но для enterprise-проектов на Java/Kotlin — нет.

Практический пример: рефакторинг микросервиса

Представьте, что AI-агент должен переименовать метод getUserData в fetchUserProfile. Через LSP он:
1. Находит все вхождения в открытых файлах.
2. Заменяет их.
3. Не видит, что метод вызывается в конфигурационном файле application.yml (который не открыт).
4. Не видит, что метод определён в интерфейсе, который реализуют два класса.
5. Результат: сборка падает, приложение не стартует.

Через JetBrains IDE:
1. Индексация находит все вхождения во всём проекте, включая YAML, XML, тесты.
2. Понимает, что метод — часть интерфейса, и предлагает переименовать его во всех реализациях.
3. Учитывает аннотации @Override и @Deprecated.
4. Результат: рефакторинг проходит без ошибок.

Почему это важно для AI-агентов будущего

AI-агенты, которые работают с кодом, всё чаще используются для автоматизации рутинных задач: написание тестов, рефакторинг, code review. Если агент не понимает контекст проекта, его предложения будут не просто бесполезны, а опасны — они могут сломать продакшен.

Именно поэтому крупные компании (включая JetBrains) активно инвестируют в интеграцию AI с IDE. Полный доступ к платформе даёт агенту не просто «умный автокомплит», а реальное понимание кодовой базы.

Что делать разработчику

Если вы используете AI-агента для написания кода, убедитесь, что он имеет доступ к полному стеку IDE. Не полагайтесь на LSP-агентов для сложных проектов. Лучшие практики:
- Используйте AI-плагины, которые работают с JetBrains IDE (например, JetBrains AI Assistant, GitHub Copilot в режиме IDE).
- Если агент работает через LSP, давайте ему не один файл, а весь проект (через контекстное окно или API).
- Проверяйте предложения агента на тестовой среде, особенно если речь идёт о рефакторинге.

Заключение

LSP — это отличный протокол, но он создавался для автодополнения, а не для AI-агентов. Полный стек JetBrains IDE даёт агенту то, что нужно для реальной работы: семантику, контекст и историю. Без этого AI — это просто дорогой генератор текста, который не понимает, что пишет.

Инвестиции в интеграцию AI с IDE — это не роскошь, а необходимость для тех, кто хочет автоматизировать разработку без потери качества. И новость, на которую мы ссылались, — ещё одно тому подтверждение.

Статья написана на основе материала Источник.

← Все статьи

Комментарии