AI Proxy: отдельный сервис, который принимает запросы бэкенда и проксирует их к AI-провайдерам. Все AI-запросы выходят из одной точки, авторизация между бэкендом и прокси идёт по общему секрету.
#Когда это нужно
- Единый egress для всех AI-запросов.
- Централизованная защита по заголовку
x-proxy-secret. - Стабильная маршрутизация к разным провайдерам из одной конфигурации бэкенда.
Если AI_PROXY_URL не задан, бэкенд отправляет запросы напрямую провайдерам.
#Маршруты
| Префикс | Провайдер | Целевой API |
|---|
/openai | OpenAI | https://api.openai.com |
/anthropic | Anthropic | https://api.anthropic.com |
/gemini | Google Gemini | https://generativelanguage.googleapis.com |
/mistral | Mistral | https://api.mistral.ai |
/deepseek | DeepSeek | https://api.deepseek.com |
Перед отправкой во внешний API прокси удаляет внутренний заголовок x-proxy-secret.
#Переменные окружения
#apps/ai-proxy
| Переменная | Назначение |
|---|
PORT | Порт сервиса, по умолчанию 3100 |
PROXY_SECRET | Общий секрет для авторизации запросов от бэкенда |
#apps/backend
| Переменная | Назначение |
|---|
AI_PROXY_URL | Базовый URL прокси, например https://your-ai-proxy.up.railway.app |
AI_PROXY_SECRET | Тот же секрет, что и PROXY_SECRET |
#Проверить, что работает
- Откройте health-эндпоинт прокси:
GET /health должен ответить успешно. - Сверьте
AI_PROXY_SECRET бэкенда и PROXY_SECRET прокси: значения совпадают. - Выполните тестовый AI-запрос через ассистента: в логах нет
403 Forbidden от прокси.
#Частые проблемы
| Симптом | Причина | Решение |
|---|
| 403 от прокси | Не совпадают AI_PROXY_SECRET и PROXY_SECRET | Синхронизируйте секреты в бэкенде и ai-proxy |
| Запросы идут мимо прокси | Не задан AI_PROXY_URL | Укажите URL в env бэкенда |
| Нет ответа провайдера | Ошибка API-ключа у выбранного провайдера | Проверьте ключ в провайдерах AI |