Определите, какая из трёх ошибок у вас
403 с unsupported_country — регион. Connection error и timeout — сеть. 429 сразу — общий адрес. От этого зависит, что менять.
VPN пускает вас на сайт, но API живёт по другим правилам: 403 по IP, обрывы соединения и чужие лимиты. Разбираем, как задать прокси в SDK и когда проще обойтись без него.
Коротко: OpenAI API через VPN ломается по трём причинам. Первая — регион: если хотя бы часть запросов уходит с российского IP, приходит 403 с кодом unsupported_country_region_territory, и OpenAI может ограничить аккаунт. Вторая — соединение: туннель рвётся или меняет маршрут, и SDK отдаёт APIConnectionError или APITimeoutError, хотя ключ и запрос в порядке. Третья — общие адреса: на популярном VPN-сервере сидят сотни клиентов, и 429 вы получаете за чужой трафик.
Прокси удобнее системного VPN тем, что его можно задать точечно — для одного клиента, а не для всей машины. В Python SDK прокси берётся из переменных HTTP_PROXY и HTTPS_PROXY или передаётся через свой httpx-клиент. В Node.js — через параметр агента при создании клиента.
И честный вопрос: нужен ли VPN вообще. Он нужен, только если вы ходите напрямую на api.openai.com с ключом OpenAI. Если запросы идут через сервис, который принимает их с российских IP и сам стоит за границей, ни VPN, ни прокси в коде не нужны — меняется только base_url.
Запросы к нашему адресу идут из России напрямую, VPN и прокси не нужны. Ключ OpenAI тоже не нужен — используется наш.
https://api.kosareva.cloud/v1, ключ из кабинетаfrom openai import OpenAI client = OpenAI( api_key="ВАШ_API_КЛЮЧ", base_url="https://api.kosareva.cloud/v1", ) response = client.chat.completions.create( model="gpt-5-6", messages=[{"role": "user", "content": "Привет!"}], stream=True, )
import OpenAI from "openai"; const client = new OpenAI({ apiKey: "ВАШ_API_КЛЮЧ", baseURL: "https://api.kosareva.cloud/v1", }); const response = await client.chat.completions.create({ model: "gpt-5-6", messages: [{ role: "user", content: "Привет!" }], stream: true, });
curl https://api.kosareva.cloud/v1/chat/completions \ -H "Authorization: Bearer ВАШ_API_КЛЮЧ" \ -H "Content-Type: application/json" \ -d '{"model":"gpt-5-6","messages":[{"role":"user","content":"Привет!"}],"stream":true}'
Часть запросов ушла мимо туннеля (split tunneling, отвал VPN) с российского адреса. OpenAI видит регион и отвечает unsupported_country_region_territory.
Туннель пересобрался посреди запроса, DNS внутри VPN не резолвит api.openai.com или соединение режет провайдер. Ключ ни при чём.
С одного IP-адреса VPN-сервера работают десятки аккаунтов. Лимиты по IP срабатывают раньше ваших.
VPN добавляет задержку и рвёт долгие соединения; без стриминга ответ на 2–3 минуты не доживает до конца.
Если 403 приходит и через прокси с иностранным IP, аккаунт уже ограничен, сетевые настройки не помогут.
| Текст ошибки | Причина | Что делать |
|---|---|---|
| 403 unsupported_country_region_territory | Запрос ушёл с российского IP | Проверить, что весь трафик клиента идёт через прокси; если повторяется — аккаунт ограничен |
| APIConnectionError: Connection error | Туннель оборвался, DNS не резолвит, прокси не отвечает | Проверить прокси через curl, задать timeout и max_retries |
| APITimeoutError: Request timed out | Длинный ответ не уложился в таймаут через медленный туннель | Включить стриминг, поднять timeout |
| 429 rate_limit_exceeded на первом запросе | Общий IP VPN-сервера с чужими аккаунтами | Свой прокси вместо общего VPN или сервис без VPN |
Тело ответа OpenAI приходит без изменений через любой прокси, поэтому первым делом читайте code и type.
403 с unsupported_country — регион. Connection error и timeout — сеть. 429 сразу — общий адрес. От этого зависит, что менять.
SDK OpenAI и httpx читают HTTPS_PROXY сами. Это работает для всего процесса, включая другие библиотеки.
Свой httpx-клиент с прокси, таймаутом и повторами. Остальной код процесса ходит в сеть напрямую.
Если curl через прокси возвращает список моделей, сеть в порядке и проблема в коде или аккаунте.
Сервис, принимающий запросы с российских IP, снимает все три проблемы разом: прокси в коде не нужен, аккаунт OpenAI не нужен, лимиты свои.
Прокси задаётся в настройках редактора (http.proxy), расширения его наследуют. Системный VPN при этом можно выключить.
Читают HTTPS_PROXY из окружения терминала. Задайте переменную в той же сессии, где запускаете команду.
Переменные HTTP_PROXY и HTTPS_PROXY передаются в контейнер через environment; VPN на хосте внутрь контейнера не попадает.
Python — переменные окружения или httpx-клиент, Node.js — параметр агента при создании клиента. В обоих задайте timeout и max_retries.
OpenAI оказывает услуги по списку стран, России в нём нет. Работа через VPN — обход этого ограничения, аккаунт могут ограничить без предупреждения.
Да, httpx умеет socks5 после установки дополнения httpx[socks]; адрес пишется как socks5://host:port. В переменных окружения тот же формат.
Общий IP VPN-сервера: лимит срабатывает по адресу, а не по вашему ключу. Свой прокси или сервис без VPN снимают это.
Скорее всего, VPN включён только в браузере: расширение не трогает терминал, редактор и скрипты, и они по-прежнему ходят в сеть с российского адреса. Нужен VPN для всей системы или прокси, заданный в переменных окружения либо прямо в клиенте.
Каждое соединение идёт через лишний участок сети, и далёкий или перегруженный прокси добавляет задержку ещё до начала ответа. Создавайте клиент OpenAI один раз и переиспользуйте его: так соединение с прокси не устанавливается заново на каждый запрос. А стриминг покажет первые слова сразу, не дожидаясь конца генерации.
OpenAI-совместимый адрес, оплата в рублях, ключ сразу после регистрации. Пополнение картой от 50 ₽.