Подключение моделей к своему домену
Настройте, чтобы бесплатные модели AIIN работали только со вашего сайта, и добавьте альтернативные модели на случай, если основная временно недоступна.
Зачем это нужно
Если вы хотите встроить бесплатные LLM в свой сайт или веб-приложение, нужно быть уверенным, что ими не пользуются посторонние. AIIN проверяет Origin / Referer каждого запроса и требует короткий одноразовый токен — free ticket.
Если выбранная модель временно «упала», система автоматически переключится на запасную (fallback) модель из вашего списка — пользователь этого не заметит.
Шаг 1. Разрешённые домены
В админке откройте раздел Free domains и добавьте адреса, с которых разрешены бесплатные запросы. Достаточно указать только scheme + host, без путей и слэшей.
Пример:
https://www.aiin.byhttps://aiin.byhttps://app.aiin.by
Этот список применяется ко всем бесплатным моделям, у которых нет собственного поля allowed_origins. Если у модели своё поле задано — проверяется оно, а глобальный список игнорируется.
Шаг 2. Настройка модели
В админке откройте вкладку Models, выберите бесплатную модель и убедитесь, что:
prompt_usd_1m= 0completion_usd_1m= 0- Для изображений/видео/аудио поля
price_unitиunit_price_usdпустые или равны нулю
Если модель должна быть доступна только с конкретных сайтов, заполните allowed_origins. Оставьте пустым, чтобы использовать глобальный список из раздела Free domains.
Пример JSON модели:
{
"alias": "openrouter/llama-free",
"display_name": "Llama Free",
"upstream": "openrouter",
"route": "/v1/chat/completions",
"prompt_usd_1m": 0,
"completion_usd_1m": 0,
"allowed_origins": ["https://www.aiin.by"]
}
Шаг 3. Fallback (автороутинг)
В поле fallback_aliases укажите запасные модели в порядке приоритета. Если основная модель вернёт ошибку upstream или пустой ответ, AIIN попробует первую запасную, затем вторую и так далее.
Пример fallback:
"fallback_aliases": [
"openrouter/llama-free-v2",
"openrouter/gemma-free",
"openrouter/qwen-free"
]
Free ticket проверяется один раз перед выбором финальной модели: если основная недоступна, fallback использует тот же тикет, но уже отмечается как использованный только для успешной модели.
Как это работает в браузере
- Пользователь заходит на
https://www.aiin.byи выбирает бесплатную модель. - Клиент запрашивает у auth service короткий JWT:
GET https://auth.aiin.by/api/auth/free-ticket. - При вызове чата клиент добавляет заголовок
X-AIIN-Free-Ticket: <jwt>. - Billing service проверяет подпись, пользователя, origin и разрешённый домен.
- Если всё верно — запрос уходит к upstream. Тикет помечается использованным, повторно применить его нельзя.
Для владельцев сторонних сайтов (OAuth)
Если у вас есть свой сайт и вы хотите, чтобы пользователи заходили через AIIN и использовали модели с него, зарегистрируйте OAuth-клиент в админке (раздел Partner OAuth).
Скоупы
api— доступ к платным моделям. Списания идут с баланса пользователя AIIN.free_models— доступ к бесплатным моделям. Работает только если origin запроса совпадает с доменом/redirect URI клиента.
Пошаговый флоу
- Админ создаёт клиент в админке, копирует
client_idиclient_secret(секрет показывается один раз). - На вашем сайте перенаправьте пользователя на авторизацию AIIN:
https://auth.aiin.by/api/oauth/authorize?response_type=code&client_id=<id>&redirect_uri=https://your-site.com/callback&scope=api+free_models&state=<state> - Пользователь входит в AIIN и возвращается на
https://your-site.com/callback?code=...&state=.... - Ваш бэкенд меняет код на токены:
POST https://auth.aiin.by/api/oauth/token
Content-Type: application/json
{
"grant_type": "authorization_code",
"client_id": "your-client-id",
"client_secret": "your-client-secret",
"code": "code-from-callback",
"redirect_uri": "https://your-site.com/callback"
}
В ответе придут access_token, refresh_token и expires_in. Используйте access_token в заголовке Authorization: Bearer <token> для запросов к https://api.aiin.by/v1/....
Обновление токена
POST https://auth.aiin.by/api/oauth/token
Content-Type: application/json
{
"grant_type": "refresh_token",
"client_id": "your-client-id",
"client_secret": "your-client-secret",
"refresh_token": "refresh-token-from-step-4"
}
Управление через API
Все операции доступны с admin JWT.
Глобальные домены
PUT https://api.aiin.by/v1/admin/free-domains
Authorization: Bearer <admin JWT>
Content-Type: application/json
{
"domains": [
"https://www.aiin.by",
"https://aiin.by"
]
}
Модель
POST https://api.aiin.by/v1/admin/models
Authorization: Bearer <admin JWT>
Content-Type: application/json
{
"alias": "openrouter/llama-free",
"display_name": "Llama Free",
"upstream": "openrouter",
"route": "/v1/chat/completions",
"prompt_usd_1m": 0,
"completion_usd_1m": 0,
"allowed_origins": ["https://www.aiin.by"],
"fallback_aliases": [
"openrouter/llama-free-v2",
"openrouter/gemma-free"
]
}
Частые вопросы
Можно ли разрешить сразу все поддомены?
Да. Укажите каждый поддомен отдельно, например https://app.aiin.by и https://www.aiin.by. Wildcards не поддерживаются — это защита от случайной передачи трафика чужим сайтам.
Что будет, если домен не в списке?
Запрос вернёт HTTP 403 с текстом «origin not allowed». Пользователь увидит ошибку в интерфейсе, списания не произойдёт.
Платные модели тоже проверяются по доменам?
Нет. Доменная проверка работает только для моделей с нулевой ценой (free). Платные модели доступны с любого origin, если запрос авторизован обычным токеном или API-ключом.
Как долго живёт free ticket?
По умолчанию 10 минут. Время задаётся переменной FREE_TICKET_TTL_MINUTES в окружении auth service.
Можно ли встроить AIIN на другой сайт?
Да — через Partner OAuth. Владелец сайта регистрирует OAuth-клиент в админке AIIN, получает client_id/client_secret и перенаправляет пользователей на авторизацию AIIN. После успешного входа сайт получает access_token и может звонить в API от имени пользователя.
Остались вопросы? Напишите на support@aiin.by или в Telegram-канал @aiin_by.
← Назад к документации API