Определите, какая из трёх ошибок у вас
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.
| Текст ошибки | Причина | Что делать |
|---|---|---|
| 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 сами. Это работает для всего процесса, включая другие библиотеки.
export HTTPS_PROXY=http://user:pass@proxy.example:3128 export HTTP_PROXY=http://user:pass@proxy.example:3128 python app.py
Свой httpx-клиент с прокси, таймаутом и повторами. Остальной код процесса ходит в сеть напрямую.
import httpx
from openai import OpenAI
client = OpenAI(
http_client=httpx.Client(proxy="http://user:pass@proxy.example:3128"),
timeout=60,
max_retries=3,
)Если curl через прокси возвращает список моделей, сеть в порядке и проблема в коде или аккаунте.
curl -x http://user:pass@proxy.example:3128 \ https://api.openai.com/v1/models \ -H "Authorization: Bearer $OPENAI_API_KEY"
Сервис, принимающий запросы с российских IP, снимает все три проблемы разом: прокси в коде не нужен, аккаунт OpenAI не нужен, лимиты свои.
client = OpenAI(
api_key="ваш ключ",
base_url="https://api.kosareva.cloud/v1",
)OpenAI оказывает услуги по списку стран, России в нём нет. Работа через VPN — обход этого ограничения, аккаунт могут ограничить без предупреждения.
Да, httpx умеет socks5 после установки дополнения httpx[socks]; адрес пишется как socks5://host:port. В переменных окружения тот же формат.
Общий IP VPN-сервера: лимит срабатывает по адресу, а не по вашему ключу. Свой прокси или сервис без VPN снимают это.
Наш шлюз принимает запросы с российских IP, VPN и прокси для него не нужны: base_url https://api.kosareva.cloud/v1 для OpenAI-формата, ANTHROPIC_BASE_URL=https://api.kosareva.cloud для Claude Code. Ключ OpenAI при этом не требуется, используется наш, оплата в рублях. Если VPN включён системно, запросы к нам через него тоже пройдут, но пользы от этого никакой.
OpenAI-совместимый адрес, оплата в рублях, ключ сразу после регистрации. Пополнение картой от 50 ₽.