Поддержка протокола сервера языка (LSP)
Qwen Code предоставляет встроенную поддержку протокола сервера языка (LSP), что обеспечивает расширенные функции интеллектуальной работы с кодом: переход к определению, поиск ссылок, диагностика и действия с кодом. Эта интеграция позволяет ИИ-агенту глубже понимать ваш код и предоставлять более точную помощь.
Обзор
Поддержка LSP в Qwen Code реализована через подключение к серверам языков, которые понимают ваш код. При работе с TypeScript, Python, Go или другими поддерживаемыми языками Qwen Code может автоматически запускать соответствующий сервер языка и использовать его для:
- Перехода к определениям символов
- Поиска всех ссылок на символ
- Отображения всплывающей информации (документация, информация о типах)
- Просмотра диагностических сообщений (ошибки, предупреждения)
- Доступа к действиям с кодом (быстрые исправления, рефакторинги)
- Анализа иерархии вызовов
Быстрый старт
LSP — это экспериментальная функция в Qwen Code. Чтобы включить её, используйте флаг командной строки --experimental-lsp:
qwen --experimental-lspДля большинства распространённых языков программирования Qwen Code автоматически обнаружит и запустит соответствующий сервер языка, если он установлен в вашей системе.
Предварительные требования
Вам необходимо установить сервер языка для вашего языка программирования:
| Язык | Сервер языка | Команда установки |
|---|---|---|
| TypeScript/JavaScript | typescript-language-server | npm install -g typescript-language-server typescript |
| Python | pylsp | pip install python-lsp-server |
| Go | gopls | go install golang.org/x/tools/gopls@latest |
| Rust | rust-analyzer | Руководство по установке |
Конфигурация
Файл .lsp.json
Вы можете настроить серверы языков с помощью файла .lsp.json в корне проекта. Используется формат с ключами-языками, описанный в справочнике по конфигурации LSP для плагина Claude Code .
Базовый формат:
{
"typescript": {
"command": "typescript-language-server",
"args": ["--stdio"],
"extensionToLanguage": {
".ts": "typescript",
".tsx": "typescriptreact",
".js": "javascript",
".jsx": "javascriptreact"
}
}
}Параметры конфигурации
Обязательные поля
| Параметр | Тип | Описание |
|---|---|---|
command | строка | Команда для запуска сервера LSP (должна быть в переменной PATH) |
extensionToLanguage | объект | Сопоставление расширений файлов идентификаторам языков |
Необязательные поля
| Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
args | string[] | [] | Аргументы командной строки |
transport | string | "stdio" | Тип транспорта: stdio или socket |
env | object | — | Переменные окружения |
initializationOptions | object | — | Параметры инициализации LSP |
settings | object | — | Параметры сервера через workspace/didChangeConfiguration |
workspaceFolder | string | — | Переопределение рабочей папки |
startupTimeout | number | 10000 | Таймаут запуска в миллисекундах |
shutdownTimeout | number | 5000 | Таймаут завершения работы в миллисекундах |
restartOnCrash | boolean | false | Автоматический перезапуск при сбое |
maxRestarts | number | 3 | Максимальное количество попыток перезапуска |
trustRequired | boolean | true | Требуется доверенная рабочая область |
Транспорт TCP/сокет
Для серверов, использующих транспорт TCP или Unix-сокет:
{
"remote-lsp": {
"transport": "tcp",
"socket": {
"host": "127.0.0.1",
"port": 9999
},
"extensionToLanguage": {
".custom": "custom"
}
}
}Доступные операции LSP
Qwen Code предоставляет функциональность LSP через унифицированный инструмент lsp. Ниже перечислены доступные операции:
Навигация по коду
Перейти к определению
Найти место, где определён символ.
Операция: goToDefinition
Параметры:
- filePath: путь к файлу
- line: номер строки (нумерация с 1)
- character: номер столбца (нумерация с 1)Найти ссылки
Найти все ссылки на символ.
Операция: findReferences
Параметры:
- filePath: путь к файлу
- line: номер строки (нумерация с 1)
- character: номер столбца (нумерация с 1)
- includeDeclaration: включить само объявление (необязательно)Перейти к реализации
Найти реализации интерфейса или абстрактного метода.
Операция: goToImplementation
Параметры:
- filePath: Путь к файлу
- line: Номер строки (нумерация с 1)
- character: Номер столбца (нумерация с 1)Информация о символах
Всплывающая подсказка
Получить документацию и информацию о типе для символа.
Операция: hover
Параметры:
- filePath: Путь к файлу
- line: Номер строки (нумерация с 1)
- character: Номер столбца (нумерация с 1)Символы документа
Получить все символы в документе.
Операция: documentSymbol
Параметры:
- filePath: Путь к файлуПоиск символов в рабочем пространстве
Выполнить поиск символов по всему рабочему пространству.
Операция: workspaceSymbol
Параметры:
- query: Строка поискового запроса
- limit: Максимальное количество результатов (необязательно)Иерархия вызовов
Подготовка иерархии вызовов
Получить элемент иерархии вызовов по позиции.
Операция: prepareCallHierarchy
Параметры:
- filePath: Путь к файлу
- line: Номер строки (нумерация с 1)
- character: Номер столбца (нумерация с 1)Входящие вызовы
Найти все функции, которые вызывают указанную функцию.
Операция: incomingCalls
Параметры:
- callHierarchyItem: Элемент из prepareCallHierarchyИсходящие вызовы
Найти все функции, вызываемые указанной функцией.
Операция: outgoingCalls
Параметры:
- callHierarchyItem: Элемент из prepareCallHierarchyДиагностика
Диагностика файла
Получить диагностические сообщения (ошибки, предупреждения) для файла.
Операция: diagnostics
Параметры:
- filePath: Путь к файлуДиагностика рабочей области
Получить все диагностические сообщения по всей рабочей области.
Операция: workspaceDiagnostics
Параметры:
- limit: Максимальное количество результатов (необязательно)Действия с кодом
Получение действий с кодом
Получает доступные действия с кодом (быстрые исправления, рефакторинги) в указанной позиции.
Операция: codeActions
Параметры:
- filePath: Путь к файлу
- line: Номер начальной строки (нумерация с 1)
- character: Номер начального столбца (нумерация с 1)
- endLine: Номер конечной строки (необязательно, по умолчанию совпадает с line)
- endCharacter: Номер конечного столбца (необязательно, по умолчанию совпадает с character)
- diagnostics: Диагностики, для которых нужно получить действия (необязательно)
- codeActionKinds: Фильтрация по типу действия (необязательно)Типы действий с кодом:
quickfix— Быстрые исправления ошибок и предупрежденийrefactor— Операции рефакторингаrefactor.extract— Извлечение в функцию или переменнуюrefactor.inline— Встраивание функции или переменнойsource— Действия с исходным кодомsource.organizeImports— Упорядочивание импортовsource.fixAll— Исправление всех проблем, которые можно автоматически устранить
Безопасность
Серверы LSP по умолчанию запускаются только в доверенных рабочих областях. Это связано с тем, что серверы языков выполняются с правами вашего пользователя и могут выполнять произвольный код.
Управление доверием
- Доверенное рабочее пространство: серверы LSP запускаются автоматически.
- Недоверенное рабочее пространство: серверы LSP не запускаются, если в их конфигурации не задано
trustRequired: false.
Чтобы пометить рабочее пространство как доверенное, используйте команду /trust или настройте список доверенных папок в параметрах.
Переопределение требований доверия для отдельных серверов
Требования доверия можно переопределить для конкретных серверов в их конфигурации:
{
"safe-server": {
"command": "safe-language-server",
"args": ["--stdio"],
"trustRequired": false,
"extensionToLanguage": {
".safe": "safe"
}
}
}Устранение неполадок
Сервер не запускается
- Проверьте, установлен ли сервер: Выполните команду вручную для проверки
- Проверьте переменную PATH: Убедитесь, что исполняемый файл сервера находится в системной переменной
PATH - Проверьте доверие рабочей области: Рабочая область должна быть помечена как доверенная для работы LSP
- Проверьте журналы: Ищите сообщения об ошибках в выводе консоли
- Убедитесь в использовании флага
--experimental-lsp: Убедитесь, что этот флаг указан при запуске Qwen Code
Медленная работа
- Крупные проекты: Рассмотрите возможность исключения каталогов
node_modulesи других крупных директорий - Таймаут сервера: Увеличьте значение параметра
startupTimeoutв конфигурации сервера для медленно запускающихся серверов
Отсутствие результатов
- Сервер ещё не готов: Сервер может находиться в процессе индексации
- Файл не сохранён: Сохраните файл, чтобы сервер обнаружил изменения
- Неподходящий язык: Убедитесь, что для вашего языка запущен соответствующий сервер
Отладка
Включите отладочное логирование, чтобы увидеть взаимодействие по протоколу LSP:
DEBUG=lsp* qwen --experimental-lspИли ознакомьтесь с руководством по отладке LSP в файле packages/cli/LSP_DEBUGGING_GUIDE.md.
Совместимость с Claude Code
Qwen Code поддерживает конфигурационные файлы .lsp.json в стиле Claude Code, использующие формат с ключами-языками, определённый в справочнике плагинов Claude Code . Если вы переносите конфигурацию из Claude Code, используйте в своём файле настройки формат с языком в качестве ключа.
Формат конфигурации
Рекомендуемый формат соответствует спецификации Claude Code:
{
"go": {
"command": "gopls",
"args": ["serve"],
"extensionToLanguage": {
".go": "go"
}
}
}Плагины LSP для Claude Code также могут предоставлять параметр lspServers в файле plugin.json (или в ссылочном файле .lsp.json). Qwen Code загружает такие конфигурации при включении расширения; они также должны использовать формат с ключами-языками.
Рекомендации
- Устанавливайте серверы языков глобально: Это гарантирует их доступность во всех проектах.
- Используйте настройки, специфичные для проекта: При необходимости настройте параметры сервера для каждого проекта через файл
.lsp.json. - Регулярно обновляйте серверы: Обновляйте серверы языков регулярно для достижения наилучших результатов.
- Доверяйте осмотрительно: Доверяйте рабочим областям только из проверенных источников.
Часто задаваемые вопросы
В: Как включить LSP?
Используйте флаг --experimental-lsp при запуске Qwen Code:
qwen --experimental-lspВ: Как узнать, какие серверы языков запущены?
Используйте команду /lsp status, чтобы отобразить все настроенные и работающие серверы языков.
В: Можно ли использовать несколько серверов языков для одного типа файлов?
Да, однако для каждой операции будет использоваться только один сервер. Побеждает тот сервер, который первым вернёт результаты.
В: Поддерживает ли LSP режим песочницы?
Серверы LSP работают вне песочницы, чтобы получить доступ к вашему коду. Они подчиняются механизмам управления доверием рабочих областей.