При локальной разработке AI-сервисов — будь то Telegram-бот с поддержкой GPT-4o, корпоративный RAG-ассистент на Claude или сервис генерации контента на Google Gemini — российские разработчики сталкиваются с дилеммой в коде.
Прямой запрос к https://api.openai.com/v1/chat/completions, https://api.anthropic.com/v1/messages или https://generativelanguage.googleapis.com с российского IP-адреса завершается ошибкой 403 Forbidden (unsupported_country_region_territory).
Обычно эту проблему пытаются решить двумя способами, каждый из которых вредит архитектуре проекта:
- Хардкод прокси внутри кода приложения (
httpx/undici/https-proxy-agent): приходится протаскиватьPROXY_URLво все конструкторы клиентов, ловить падения при использовании высокоуровневых фреймворков (LangChain, LlamaIndex, Vercel AI SDK, Mastra), где внутренние HTTP-клиенты скрыты глубоко под капотом, и рисковать случайным коммитом прокси-учёток в Git. - Включение глобального VPN на рабочей машине: как только вы включаете системный VPN, чтобы заработал
OpenAI(), у вашего бэкенда тут же отваливаются интеграции с российским контуром — перестают проходить запросы к эквайрингу Т-Банка, ЮKassa, CloudPayments, API СДЭК, DaData, МойСклад или 1С-Битрикс.
Разберём, как избавиться от прокси-обёрток в коде и тестировать гибридные приложения (Российские API + Зарубежные LLM) одновременно с помощью RunGate AI DNS.
Как работает прозрачная маршрутизация для SDK
Когда на вашем компьютере (macOS, Windows или Linux) или домашнем роутере активирован RunGate AI DNS, разделение трафика происходит на сетевом уровне операционной системы до того, как Python или Node.js откроет сокет:
Ваш локальный бэкенд (FastAPI / Next.js / NestJS)
│
┌───────────────────────────┴───────────────────────────┐
│ │
▼ Вызов OpenAI / Anthropic / Gemini ▼ Вызов Т-Банк / ЮKassa / DaData
┌─────────────────────────────┐ ┌─────────────────────────────┐
│ Резолв через AI DNS (DoH) │ │ Стандартный резолв │
│ -> Маршрут через SNI-прокси │ │ -> Прямой IP провайдера РФ │
└─────────────────────────────┘ └─────────────────────────────┘
Ваш код остаётся 100% чистым и переносимым между локальной машиной и продакшен-сервером.
Быстрое сравнение: код «До» и «После»
❌ Как приходилось писать раньше (костыли с прокси в коде):
# Антипаттерн: жёсткая привязка кода к SOCKS/HTTP прокси
import httpx
from openai import AsyncOpenAI
from anthropic import AsyncAnthropic
http_client = httpx.AsyncClient(proxy="http://user:pass@1.2.3.4:8080", timeout=60.0)
openai_client = AsyncOpenAI(api_key="sk-...", http_client=http_client)
anthropic_client = AsyncAnthropic(api_key="sk-ant-...", http_client=http_client)
Если в том же проекте используется библиотека, которая сама создаёт сессию aiohttp или fetch без проброса кастомного клиента, она просто падает с 403 Forbidden.
✅ Как выглядит код с системным AI DNS:
1. Python (openai, anthropic, google-genai)
import asyncio
from openai import AsyncOpenAI
from anthropic import AsyncAnthropic
from google import genai
# Никаких прокси-клиентов, кастомных сертификатов или подмены base_url
openai = AsyncOpenAI()
anthropic = AsyncAnthropic()
gemini = genai.Client()
async def main():
# 1. Запрос к OpenAI (api.openai.com)
gpt_res = await openai.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Сгенерируй JSON-схему чека 54-ФЗ"}]
)
print("OpenAI:", gpt_res.choices[0].message.content[:60])
# 2. Запрос к Anthropic Claude (api.anthropic.com)
claude_res = await anthropic.messages.create(
model="claude-3-7-sonnet-latest",
max_tokens=256,
messages=[{"role": "user", "content": "Проверь SQL-миграцию на блокировки"}]
)
print("Claude:", claude_res.content[0].text[:60])
# 3. Запрос к Google Gemini (generativelanguage.googleapis.com)
gemini_res = gemini.models.generate_content(
model="gemini-2.5-flash",
contents="Кратко опиши преимущества RFC 8484 DoH"
)
print("Gemini:", gemini_res.text[:60])
asyncio.run(main())
2. Node.js / TypeScript (Next.js App Router & Vercel AI SDK)
В современной фронтенд- и fullstack-разработке стандартом стал Vercel AI SDK (ai). Внедрить прокси внутрь серверных экшенов Next.js без переопределения глобального globalThis.fetch крайне неудобно. С AI DNS всё работает штатно:
import { generateText } from 'ai';
import { openai } from '@ai-sdk/openai';
import { anthropic } from '@ai-sdk/anthropic';
import { google } from '@ai-sdk/google';
export async function analyzeOrderWithAI(orderData: string) {
// Стандартный вызов из Next.js Server Action или Route Handler на localhost:3000
const { text } = await generateText({
model: anthropic('claude-3-7-sonnet-20250219'),
prompt: `Проанализируй заказ клиента: ${orderData}`,
});
return text;
}
Реальный кейс: локальная отладка Telegram-бота с оплатой в Т-Банке и генерацией через OpenAI
Представьте классическую задачу: вы разрабатываете бота в Telegram, который:
- Принимает вебхук от Telegram Bot API (
/webhook/telegram). - Инициирует платёж по СБП через API Т-Банка (
https://securepay.tinkoff.ru/v2/Init) и ждёт входящий вебхук об успешной оплате (/webhook/tbank). - После оплаты вызывает
api.openai.comилиapi.anthropic.comи отправляет пользователю готовый результат.
Как запустить весь этот стенд на localhost за 2 шага:
- Включите профиль AI DNS из личного кабинета app.rungate.ru/dns — теперь ваш локальный сервер может одновременно стучаться в
securepay.tinkoff.ru(напрямую с российского IP) и вapi.openai.com(через защищённый SNI-маршрут). - Откройте входящий SSH-туннель для приёма вебхуков от Telegram и банка:
ssh -p 2222 -R my-bot:80:localhost:8000 rungate.ru
Все входящие POST-запросы от банка и мессенджера приходят на https://my-bot.rungate.ru, а исходящие запросы к нейросетям улетают без единой ошибки 403 Region not supported.
Полный список поддерживаемых API-эндпоинтов для разработчиков
Встроенный матчер доменов ai-doh-server автоматически обрабатывает не только флагманские модели, но и популярные быстрые инференс-платформы:
| Провайдер | Поддерживаемые API-домены |
|---|---|
| OpenAI | api.openai.com, *.openai.com, *.oaiusercontent.com |
| Anthropic | api.anthropic.com, *.anthropic.com, *.claude.com |
| Google Gemini & Vertex | generativelanguage.googleapis.com, aiplatform.googleapis.com |
| OpenRouter | openrouter.ai, *.openrouter.ai |
| Groq (LPU Inference) | api.groq.com |
| DeepSeek & Mistral | api.deepseek.com, api.mistral.ai |
| Perplexity Sonar API | api.perplexity.ai, *.perplexity.ai |
Как проверить работу прямо из терминала
После установки профиля AI DNS выполните проверочный curl к эндпоинту моделей OpenAI или Anthropic без каких-либо флагов -x (прокси):
curl -s https://api.openai.com/v1/models \
-H "Authorization: Bearer $OPENAI_API_KEY" | head -n 20
Если вместо региональной заглушки Cloudflare вы видите JSON-список моделей ("object": "list") — ваше локальное окружение полностью готово к разработке AI-продуктов.
Активировать бесплатный 24-часовой доступ к AI DNS можно в разделе app.rungate.ru/dns.