Админка

Подключение моделей к своему домену

Настройте, чтобы бесплатные модели AIIN работали только со вашего сайта, и добавьте альтернативные модели на случай, если основная временно недоступна.

Зачем это нужно

Если вы хотите встроить бесплатные LLM в свой сайт или веб-приложение, нужно быть уверенным, что ими не пользуются посторонние. AIIN проверяет Origin / Referer каждого запроса и требует короткий одноразовый токен — free ticket.

Если выбранная модель временно «упала», система автоматически переключится на запасную (fallback) модель из вашего списка — пользователь этого не заметит.

Шаг 1. Разрешённые домены

В админке откройте раздел Free domains и добавьте адреса, с которых разрешены бесплатные запросы. Достаточно указать только scheme + host, без путей и слэшей.

Пример:

Этот список применяется ко всем бесплатным моделям, у которых нет собственного поля allowed_origins. Если у модели своё поле задано — проверяется оно, а глобальный список игнорируется.

Шаг 2. Настройка модели

В админке откройте вкладку Models, выберите бесплатную модель и убедитесь, что:

Если модель должна быть доступна только с конкретных сайтов, заполните 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 использует тот же тикет, но уже отмечается как использованный только для успешной модели.

Как это работает в браузере

  1. Пользователь заходит на https://www.aiin.by и выбирает бесплатную модель.
  2. Клиент запрашивает у auth service короткий JWT: GET https://auth.aiin.by/api/auth/free-ticket.
  3. При вызове чата клиент добавляет заголовок X-AIIN-Free-Ticket: <jwt>.
  4. Billing service проверяет подпись, пользователя, origin и разрешённый домен.
  5. Если всё верно — запрос уходит к upstream. Тикет помечается использованным, повторно применить его нельзя.

Для владельцев сторонних сайтов (OAuth)

Если у вас есть свой сайт и вы хотите, чтобы пользователи заходили через AIIN и использовали модели с него, зарегистрируйте OAuth-клиент в админке (раздел Partner OAuth).

Скоупы

Пошаговый флоу

  1. Админ создаёт клиент в админке, копирует client_id и client_secret (секрет показывается один раз).
  2. На вашем сайте перенаправьте пользователя на авторизацию 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>
  3. Пользователь входит в AIIN и возвращается на https://your-site.com/callback?code=...&state=....
  4. Ваш бэкенд меняет код на токены:
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