Opt-In Software Blog

Software, dvelopment, and practical insights

Использование OpenRouter в VS Code Agent без GitHub Copilot

Читать на другом языке: English | Русский

Проверено на VS Code 1.140 (Stable) и VS Code Insiders 1.141, октябрь 2026.

Я хотел использовать модели OpenRouter в VS Code Agent без входа в GitHub Copilot. VS Code умеет это с помощью пользовательских провайдеров языковых моделей, но на моём компьютере всё заработало только в VS Code Insiders. В этом посте описана настройка VS Code, а также способ понять, нужен ли вам Insiders, и nginx в роли обратного прокси для сетей, где OpenRouter недоступен.

Кратко

  1. Сначала попробуйте обычный VS Code. Если увидите описанные ниже симптомы, переходите на VS Code Insiders.
  2. Создайте chatLanguageModels.json с провайдером OpenRouter (vendor: "customendpoint") и своими моделями. Используйте точный ID модели с openrouter.ai.
  3. Задайте API-ключ через Manage Models → Update API Key. Не оставляйте ключ в JSON в открытом виде: у меня это не сработало.
  4. Выберите модель в Models и переключитесь на Agent.
  5. Если OpenRouter заблокирован в вашей стране, см. раздел про прокси ниже.

Что понадобится

  • Аккаунт OpenRouter с API-ключом и некоторой суммой на балансе. Бесплатные модели приходят и уходят (см. Troubleshooting).
  • Модель с поддержкой tool calling. Для режима Agent это необходимо.
  • VS Code Insiders, если обычный VS Code у вас не работает (см. следующий раздел).

Нужен ли вам VS Code Insiders?

Возможно, нет, поэтому сначала попробуйте обычный VS Code. На моём компьютере (Stable 1.140) он не заработал:

  • С пустым chatLanguageModels.json не было ни кнопки Manage Models, ни команды Chat: Manage Language Models.
  • Когда я вручную добавил провайдера в файл и перезапустил VS Code, кнопка и команда появились, но в диалоге Language Models были только модели самого Copilot. Моих моделей OpenRouter там не было, и выбрать их в чате было нельзя.
  • Add Models → OpenRouter принимал API-ключ и записывал группу в chatLanguageModels.json, но эта группа не появлялась ни в диалоге, ни в списке моделей, даже после перезапуска.

Почему так, я разбираться не стал. Официальная документация сейчас помечает провайдер Custom endpoint как функцию Insiders, и в Insiders всё описанное ниже работало. Если вы видите те же симптомы, установите VS Code Insiders. Он ставится рядом с обычным VS Code и хранит собственные настройки.

Где находится chatLanguageModels.json

Файл лежит в папке пользовательских данных VS Code Insiders, которая отделена от обычного VS Code (Code - Insiders, а не Code):

  • Windows: нажмите Win + R, введите %APPDATA%\Code - Insiders\User и нажмите Enter.
  • macOS: в Finder нажмите Cmd + Shift + G и перейдите в ~/Library/Application Support/Code - Insiders/User.
  • Linux: перейдите в ~/.config/Code - Insiders/User.

Примечание: в обычном VS Code в этих путях вместо Code - Insiders используется Code. Файл там можно редактировать, но если обычный VS Code не показывает ваши модели, правка не поможет. Редактируйте копию из Insiders.

Создаём провайдера в chatLanguageModels.json

Я не добавлял провайдера через диалог Manage Models. Я написал его в chatLanguageModels.json вручную, и VS Code его подхватил. Вот файл, который я использую:

[
	{
		"name": "OpenRouter",
		"vendor": "customendpoint",
		"apiKey": "${input:chat.lm.secret.-32b9a01a}",
		"apiType": "chat-completions",
		"models": [
			{
				"id": "qwen/qwen3.8-27b",
				"name": "Qwen3.8 27B",
				"url": "https://openrouter.ai/api/",
				"toolCalling": true,
				"vision": true,
				"maxInputTokens": 262000,
				"maxOutputTokens": 16000
			},
			{
				"id": "deepseek/deepseek-r1",
				"name": "DeepSeek R1",
				"url": "https://openrouter.ai/api/",
				"toolCalling": true,
				"vision": false,
				"maxInputTokens": 64000,
				"maxOutputTokens": 16000
			}
		]
	}
]

Значение apiKey VS Code запишет сам после следующего шага. До тех пор о нём можно не беспокоиться.

Что означают поля:

  • vendor: "customendpoint" помечает провайдера как пользовательского.
  • apiType: "chat-completions" заставляет VS Code использовать Chat Completions API.
  • id это ID модели на OpenRouter. Копируйте его со страницы модели.
  • url это базовый URL. VS Code строит из него запрос Chat Completions (запрос в итоге уходит на /v1/chat/completions), поэтому здесь .../api/, а не полный адрес эндпоинта.
  • toolCalling включает вызов инструментов. Без него Agent работать не может.
  • vision указывает, принимает ли модель изображения.
  • maxInputTokens и maxOutputTokens это лимиты, которые использует VS Code.

Как выбрать значения для модели

toolCalling и vision берите со страницы модели на OpenRouter. Например, Qwen3.8 27B это vision-language модель с поддержкой инструментов, а DeepSeek R1 только текстовая, поэтому у неё vision равен false.

С лимитами всё менее однозначно. Размер контекста может отличаться у разных провайдеров и источников: для R1 я видел 64K на странице модели и 131K-164K в других местах, для Qwen3.8 27B 262K и 1M. Я беру меньшее значение, оно безопасно с любым провайдером. Не занижайте maxOutputTokens для reasoning-моделей, потому что токены рассуждений тоже считаются выходными. 4096 слишком мало: ответы будут обрезаться.

Если нужна модель Claude, подойдёт тот же блок со slug со страницы модели на OpenRouter (для Sonnet 5 это anthropic/claude-sonnet-5, с vision: true и toolCalling: true).

Задаём API-ключ (этот шаг обязателен)

Кажется естественным записать ключ OpenRouter прямо в apiKey:

"apiKey": "sk-or-v1-..."

Так я и сделал сначала, и это не сработало. OpenRouter отклонял каждый запрос с ошибкой 403. В логе nginx я увидел, что заголовок Authorization содержит только Bearer, без токена после него.

Исправило это следующее: в Manage Models я выбрал провайдера OpenRouter, нажал Update API Key и ввёл ключ там. VS Code заменил значение в файле на ссылку на секрет, который хранит сам:

"apiKey": "${input:chat.lm.secret.-32b9a01a}"

После этого заголовок стал передаваться правильно, и запросы заработали. Бонусом ключ больше не лежит в файле, который может попасть в синхронизацию настроек или в git. Ссылка работает только на том компьютере, где вы выполнили Update API Key, поэтому не копируйте её на другой компьютер. Выполните Update API Key и там.

VS Code сам заменил сырой ключ в файле этой ссылкой, так что ничего дополнительно чистить не нужно.

Используем модель

Вернитесь в Chat view, нажмите Models, выберите модель OpenRouter и переключитесь на Agent. VS Code остаётся интерфейсом и агентом, а OpenRouter поставляет модель, так что модель можно менять правкой одной записи в JSON.

Если OpenRouter недоступен из вашей страны

Если OpenRouter у вас работает, пропустите этот раздел. Иначе запросы можно направлять через обратный прокси nginx на VPS, откуда OpenRouter доступен:

VS Code → https://example.com/openrouter/api/ → nginx → https://openrouter.ai/api/v1/chat/completions

В конфигурации модели замените URL:

"url": "https://example.com/openrouter/api/"

Конфигурация nginx

Вот конфигурация, которая работает у меня (предполагается, что TLS для example.com уже настроен):

location /openrouter/api/v1/chat/completions {
    proxy_pass https://openrouter.ai/api/v1/chat/completions;
    proxy_ssl_server_name on;
    proxy_ssl_name openrouter.ai;
    proxy_ssl_protocols TLSv1.2 TLSv1.3;
    proxy_ssl_session_reuse on;
    proxy_set_header Host openrouter.ai;
    proxy_set_header Authorization $http_authorization;
    proxy_buffering off;
    proxy_cache off;
    chunked_transfer_encoding on;
    proxy_read_timeout 300s;
    proxy_connect_timeout 75s;
    proxy_send_timeout 300s;
    proxy_buffer_size 32k;
    proxy_buffers 8 32k;
    proxy_busy_buffers_size 64k;
}

Ваш ключ OpenRouter передаётся из заголовка Authorization, который присылает VS Code, поэтому на сервере он не хранится. Location покрывает только путь Chat Completions, поэтому другие эндпоинты, например /v1/models, не проксируются. Здесь это нормально, потому что модели перечислены вручную в JSON.

Замечания по безопасности

  • Прокси видит ваш API-ключ и каждый промпт, включая код вашего проекта. Запускайте его только на сервере, который вы контролируете.
  • Публичным прокси может воспользоваться любой, кто его найдёт. Ограничьте доступ, например через allow/deny для ваших IP-адресов и limit_req для ограничения частоты запросов. Basic auth здесь не подойдёт, потому что использует тот же заголовок Authorization, в котором передаётся ваш ключ OpenRouter.
  • Прежде чем обходить сетевые блокировки, ознакомьтесь с условиями использования OpenRouter и региональными ограничениями, которые к вам относятся.

Troubleshooting

Модель не появляется в списке. Сначала убедитесь, что вы в VS Code Insiders, а не в обычном VS Code, и что правили файл в папке Code - Insiders. Затем проверьте, что JSON корректен и у провайдера задан API-ключ.

403, а заголовок Authorization содержит только Bearer. У меня так было, когда я записал сырой ключ в apiKey. Выполните Update API Key (см. выше), чтобы VS Code сохранил ключ как секрет. Если вы используете прокси nginx, посмотреть, что реально приходит, можно, временно добавив $http_authorization в формат лога. Потом уберите его: он записывает ваш ключ в лог.

404 — This model is unavailable for free. Это я получил, когда попробовал :free-модель:

{"message":"This model is unavailable for free. The paid version is available now - use this slug instead: deepseek/deepseek-r1","code":404}

Бесплатные варианты моделей убирают. В сообщении указан платный slug, подставьте его в id. Эта ошибка также показывает, что запрос дошёл до OpenRouter и ключ принят, так что конфигурация и прокси в порядке.

401. API-ключ отсутствует или неверен. Выполните Update API Key ещё раз.

Agent игнорирует инструменты или падает. Модель или конкретный провайдер, на который OpenRouter направляет запрос, могут не поддерживать tool calling. Проверьте страницу модели и попробуйте другую.

Ответы зависают или приходят сразу целиком (при использовании прокси). Обычно это буферизация. Убедитесь, что задано proxy_buffering off;.

О приватности

В режиме Agent части вашего проекта отправляются провайдеру модели в виде промптов. OpenRouter пересылает их провайдеру, который обслуживает модель, поэтому изучите политику обработки данных у моделей, которые используете, особенно у бесплатных.

Search