Программирование

Как настроить прокси только для GitHub Copilot в VS Code

Настройка прокси только для GitHub Copilot в VS Code через локальный форвардер (Node/mitmproxy). Используйте github.copilot.advanced.debug.overrideProxyUrl.

Как настроить прокси только для GitHub Copilot в Visual Studio Code, не затрагивая остальной сетевой трафик?

Я использую VS Code и хочу настроить прокси исключительно для расширения GitHub Copilot, при этом оставив остальную сетевую активность без изменений. Классический вариант настройки прокси для всего VS Code работает, но нежелательно направлять через прокси весь трафик редактора:

json
// settings.json
{
 ...
 "http.proxy": "http://usr:pwd@host:port"
}

Я обнаружил возможное решение в документации Copilot:

json
// settings.json
{
 ...
 "github.copilot.advanced": {
 "debug.overrideProxyUrl": "http://usr:pwd@host:port"
 }
}

Однако эта конфигурация не работает: Copilot отказывается функционировать, а в логах прокси-сервера (Squid) не видно запросов от расширения. Описание настройки «Override GitHub authentication proxy full URL» не проясняет ситуацию — возможно, требуется реализация дополнительных механизмов для аутентификации.

Как правильно настроить проксирование только для GitHub Copilot в VS Code с использованием обычного HTTP/HTTPS прокси?

Чтобы настроить прокси только для GitHub Copilot в VS Code (github copilot proxy), запустите локальный форвардер (mitmproxy или лёгкий Node-прокси) и укажите его URL в настройке github.copilot.advanced.debug.overrideProxyUrl — это позволит проксировать исключительно трафик расширения, не трогая global http.proxy. При этом форвардер должен правильно пробрасывать заголовки аутентификации и/или использовать режим туннелирования (CONNECT) — иначе Copilot будет отказываться работать и вы не увидите запросов в Squid; при необходимости переключите debug fetcher-флаги для диагностики.


Содержание


Как работает github copilot proxy и почему overrideProxyUrl может не работать

GitHub Copilot в VS Code общается с удалённым API (в обсуждениях чаще фигурирует домен вроде api.githubcopilot.com) и дополнительно выполняет обмен токенами/аутентификацию. Настройка github.copilot.advanced.debug.overrideProxyUrl должна перенаправлять именно эти запросы на указанный прокси, но на практике есть несколько причин, почему Squid или другой прокси ничего не видит:

  • Расширение использует разные сетевые “fetcher” реализации (Electron/Node/node-fetch). Некоторые из них могут игнорировать один или другой путь проксирования; в issue проекта есть примеры debug-флагов, которые меняют поведение fetcher’ов: https://github.com/microsoft/vscode-copilot-release/issues/5343.
  • Copilot делает дополнительные запросы для обмена токенов (например, внутренняя точка /copilot_internal/v2/token) — если форвардер не пропускает или не корректно пробрасывает эти запросы/заголовки, расширение не получит авторизацию и прекратит работу (в логах появится net::ERR_HTTP2_PROTOCOL_ERROR или похожие ошибки). С пояснениями по overrideProxyUrl и требованиям к аутентификации можно ознакомиться в обзоре угроз и описаниях проксирования: https://www.darkreading.com/vulnerabilities-threats/new-jailbreaks-manipulate-github-copilot.
  • Если вы направляете напрямую в корпоративный Squid, но форвардер не использует CONNECT/tls‑передачу или не передаёт заголовки авторизации — Squid увидит только исходящий трафик форвардера, а не действительные запросы к api.githubcopilot.com (или вообще ничего, если Copilot не использовал overrideProxyUrl).

Коротко: overrideProxyUrl — рабочий инструмент, но его нужно сочетать с корректным локальным форвардером (или правильно настроенным upstream proxy) и, иногда, с переключением debug fetcher-флагов.


Короткое решение (что сделать сразу)

  1. Запустите локальный форвардер на localhost (например, на 127.0.0.1:8080). Можно взять готовый проект (см. ниже) или написать короткий Node-прокси.
  2. В settings.json пропишите только для Copilot:
json
{
 "github.copilot.advanced.debug.overrideProxyUrl": "http://127.0.0.1:8080",
 "github.copilot.advanced.debug.useNodeFetchFetcher": true
}
  1. Настройте форвардер так, чтобы он:
  • пробрасывал все заголовки, включая Authorization и Cookie, или инжектировал требуемый токен;
  • при необходимости использовал upstream Squid (через https-proxy-agent) — чтобы увидеть логи в Squid;
  • не делал TLS-терминацию, а выполнял туннелирование CONNECT (лучше) или корректно ставил CA и не ломал HTTP/2.
  1. Перезапустите VS Code и смотрите логи расширения / DevTools. Если не подключается — переключайте fetcher-флаги и проверьте forwarder. Примеры и подробности ниже.

(Если нужен быстрый готовый пример — посмотрите статью про локальный copilot-proxy: https://dev.to/hankchiutw/copilot-proxy-your-free-llm-api-for-local-development-3c07 и русскую версию serverless-подхода: https://habr.com/ru/articles/799215/.)


Пошаговая инструкция: настроить прокси Copilot в VS Code без изменения http.proxy

Шаг 1 — выбрать модель форвардера

Шаг 2 — минимальный Node-прокси (пример)

js
// proxy.js — пример на node (для теста)
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
const HttpsProxyAgent = require('https-proxy-agent');

const app = express();
const upstream = process.env.UPSTREAM_PROXY; // e.g. "http://user:pass@squid:3128"
const agent = upstream ? new HttpsProxyAgent(upstream) : undefined;

app.use('/', createProxyMiddleware({
 target: 'https://api.githubcopilot.com',
 changeOrigin: true,
 secure: true,
 agent,
 onProxyReq: (proxyReq, req, res) => {
 // При необходимости добавляем или пробрасываем заголовок авторизации:
 const t = process.env.COPILOT_TOKEN;
 if (t) proxyReq.setHeader('authorization', `Bearer ${t}`);
 },
 logLevel: 'debug'
}));

app.listen(8080, () => console.log('Copilot proxy on http://127.0.0.1:8080'));
  • Запускаете: COPILOT_TOKEN=... UPSTREAM_PROXY="http://usr:pwd@your-squid:3128" node proxy.js
  • Преимущество: форвардер видит/логирует запросы и сам подключается к Squid (если указан UPSTREAM_PROXY), поэтому Squid увидит соединения и логи.

Шаг 3 — прописать overrideProxyUrl в settings.json (только для Copilot)

json
{
 "github.copilot.advanced.debug.overrideProxyUrl": "http://127.0.0.1:8080"
}
  • Не трогайте “http.proxy” — оставьте его пустым или как есть (если нужно глобальное подключение для других задач, но вы хотите изолировать Copilot, то оставьте глобальный прокси выключенным).

Шаг 4 — убедиться в auth/tokens

  • Copilot делает запросы авторизации/refresh. Форвардер должен либо пробрасывать оригинальные заголовки, либо инжектировать токен (безопасно — лучше хранить токен в переменной окружения форвардера).
  • Если вы просто ставите Squid как upstream и ожидаете, что Copilot сам попадёт в Squid — это сработает только если Copilot действительно использует overrideProxyUrl и если Squid поддерживает режим туннелирования CONNECT (для TLS) и не ломает HTTP/2.

Шаг 5 — перезапуск и проверка

  • Перезапустите VS Code. Откройте “Help → Toggle Developer Tools” и смотрите консоль и вкладку Network; также проверьте Output → GitHub Copilot (или Log (Extension Host)).
  • Параллельно смотрите логи Squid: tail -f /var/log/squid/access.log — должны появиться записи от локального форвардера (если вы указали UPSTREAM_PROXY).

Шаг 6 — если не видите запросов в Squid

  • Проверьте, что форвардер действительно использует UPSTREAM_PROXY (environment var).
  • Убедитесь, что форвардер не делает TLS-терминацию локально и не шлёт уже завершённые HTTPS-запросы напрямую (тогда Squid никакого CONNECT не увидит).
  • Попробуйте сделать curl через форвардер:
  • curl -v -x http://127.0.0.1:8080 https://api.githubcopilot.com/ — смотрите ответ и логи форвардера/Squid.

Примеры локального форвардера и команды curl для проверки

mitmproxy (быстрый тест, reverse mode)

curl тесты

  • Тест прямого проксирования через локальный форвардер:
  • curl -v -x http://127.0.0.1:8080 https://api.githubcopilot.com/
  • Тест прокси с логином (в Squid):
  • curl -v -x http://usr:pwd@your-squid:3128 https://api.githubcopilot.com/

Готовые проекты и статьи


Отладка: логи, fetcher‑флаги, HTTP/2 и Squid — типичные ошибки и как их решать

Что смотреть в первую очередь?

  • Логи расширения и DevTools в VS Code (Console + Network).
  • Логи форвардера (stdout / файл).
  • Логи Squid: /var/log/squid/access.log и cache.log.

Типичные симптомы и решения

  • “Copilot не отвечает, в Squid нет записей” — вероятно, Copilot не использует overrideProxyUrl (fetcher игнорирует настройки). Попробуйте переключить debug-флаги, которые тестировались в issue: https://github.com/microsoft/vscode-copilot-release/issues/5343 (например, менять useNodeFetchFetcher / useElectronFetcher) и перезапускать VS Code.
  • “ERR_HTTP2_PROTOCOL_ERROR” в DevTools — значит, прокси вмешивается в HTTP/2/TLS. Решение: использовать туннелирование CONNECT (не MITM) или настроить Squid/форвардер на корректную обработку HTTP/2. Иногда проще настроить форвардер так, чтобы он выполнял CONNECT к upstream‑прокси и не менял TLS.
  • “Аутентификация падала” — проверьте, что эндпоинты для token-exchange (/copilot_internal/…) пробрасываются и что Authorization/Set-Cookie не затираются. Если форвардер инжектирует свой токен, убедитесь, что он поддерживает refresh flow.

Полезные команды

  • DNS: nslookup api.githubcopilot.com
  • Трассировка трафика: tcpdump -nni any host api.githubcopilot.com and port 443
  • Проверка заголовков: curl -v -x http://127.0.0.1:8080 https://api.githubcopilot.com/v1/some/path (замените путь на рабочий эндпоинт для проверки соединения)

Ссылки для чтения и иллюстрации схожих проблем


Особенности для remote / WSL / контейнеров

Где фактически выполняется расширение?

  • В локальной установке VS Code расширение запускается локально — локальный форвардер на localhost доступен по 127.0.0.1.
  • В Remote - Containers / WSL / SSH расширение может работать в удалённой среде. Тогда overrideProxyUrl должен быть доступен из той среды (запустите форвардер внутри контейнера/WSL или пробросьте порт). См. обсуждение remote-container: https://github.com/microsoft/vscode-copilot-release/issues/12557.

Практические подсказки

  • Docker Desktop: используйте host.docker.internal вместо 127.0.0.1 при обращении к форвардеру, запущенному на хосте.
  • Для контейнера можно запустить форвардер как sidecar и указать overrideProxyUrl с адресом внутри сети контейнера.
  • Проверьте, где живут переменные окружения: иногда http_proxy/HTTPS_PROXY наследуются в контейнере и влияют на поведение — но overrideProxyUrl действует поверх этого, если корректно работает fetcher.


Источники

  1. https://github.com/microsoft/vscode-copilot-release/issues/5343
  2. https://www.reddit.com/r/vscode/comments/1llv6wv/github_copilot_in_vs_code_keeps_overriding_proxy/
  3. https://www.darkreading.com/vulnerabilities-threats/new-jailbreaks-manipulate-github-copilot
  4. https://medium.com/@svdoever/unveiling-the-secrets-what-vscode-github-copilot-share-with-the-llm-23be5c6955b4
  5. https://github.com/microsoft/vscode-copilot-release/issues/12557
  6. https://dev.to/hankchiutw/copilot-proxy-your-free-llm-api-for-local-development-3c07
  7. https://habr.com/ru/articles/799215/
  8. https://www.rapidseedbox.com/visual-studio-code-proxy

Заключение

Если коротко — рабочая схема для того, чтобы направлять только GitHub Copilot через прокси, не трогая остальной трафик VS Code: запустить локальный форвардер (mitmproxy или лёгкий Node-прокси), указать его URL в github.copilot.advanced.debug.overrideProxyUrl и убедиться, что форвардер корректно пробрасывает аутентификационные заголовки и/или использует туннелирование CONNECT (чтобы не ломать HTTP/2). Если Copilot по-прежнему не использует overrideProxyUrl, попробуйте переключить debug fetcher-флаги и проверьте, где именно выполняется расширение (локально или в контейнере). Это даёт изоляцию трафика Copilot и позволяет видеть запросы в Squid без изменения глобальных настроек VS Code.

Авторы
Проверено модерацией
Модерация