Atlorium

Пять подписок на нейросети в одной компании: как свести их к одному счёту и списку разрешённых моделей

Подписка списывается каждый месяц независимо от того, пользовались вы моделью или нет. Разбираем, во что обходится зоопарк подписок и как выглядит переход на оплату за запрос.

10 минут чтения технический директор · финансовый директор · тимлид · продакт-менеджер

Закрытие квартала. Бухгалтер приносит список платежей, которые не удалось разнести по статьям: пять списаний в валюте, четыре разных получателя, суммы от 20 до 240 долларов, периодичность — раз в месяц. Спрашивает, что это.

Выясняется за два дня. Маркетинг завёл подписку на ИИ-ассистента ещё в марте — платит руководитель отдела со своей карты и раз в квартал приносит скриншоты. Поддержка подключила другой сервис для черновиков ответов, там три места. Разработка держит доступ к API какой-то модели, оплата с корпоративной карты финдиректора, потому что другую привязать не получилось. Юристы попросили доступ у поддержки и работают под чужой учёткой. Никто ничего не нарушал: каждому нужен был инструмент, и каждый решил задачу тем способом, который был доступен за пятнадцать минут.

Проблема не в том, что это дорого. Проблема в том, что за это платят люди, а не компания, закрывающих документов нет ни на один платёж, и на вопрос «какие модели у нас используются и что в них отправляют» ответа тоже нет. Ниже — во что такой набор обходится и как выглядит переход на один счёт и один список разрешённых моделей.

Где именно течёт

Разберём по частям. Каждая из трёх ситуаций возникает независимо от других, и вылезает обычно тоже по отдельности: одна — на закрытии квартала, вторая — при увольнении, третья — когда приходит вопрос от службы безопасности.

Оплачено одиннадцать мест, работают четыре

Что происходит
В подписке одиннадцать пользователей. По логам за прошлый месяц заходили одиннадцать, но 96% обращений сделали четверо.
Во что обходится
Семь мест куплены ради нескольких десятков вопросов за месяц. Место стоит одинаково и у того, кто пишет в модель по пятнадцать раз в день, и у того, кто открывает её раз в неделю.
Чем закрывается
Оплата за запрос: сотрудник, который обратился восемь раз, стоит ровно восьми запросов. Отменять и заново заводить места при этом не нужно — их вообще нет.

Платит сотрудник, а не компания

Что происходит
Списание уходит с личной карты руководителя отдела. Раз в квартал он приносит скриншоты и просит компенсировать через авансовый отчёт.
Во что обходится
Ни счёта, ни акта — значит, и НДС к вычету не принять. Плюс сама зависимость: карту перевыпустили, и доступ у отдела пропал в середине спринта.
Чем закрывается
Один договор и один счёт на все сервисы Atlorium, включая ИИ-чат. Закрывающие документы приходят на компанию, а не на карту сотрудника.

Никто не знает, какие модели используются

Что происходит
На вопрос «какие ИИ-инструменты подключены» отдел безопасности получает четыре разных ответа, и один из них — «а ещё Петя что-то тестировал».
Во что обходится
Разобраться можно только опросом. Отключить одним движением нельзя: у каждого отдела свой личный кабинет, свой пароль и своя карта.
Чем закрывается
Единая точка доступа: список моделей задан на сервере, а поле model принимает только идентификаторы из GET /api/aichat/models. Что не в списке — 400, ещё до списания денег.

Сколько это стоит и когда переход окупается

Сравнивать «подписка против оплаты по факту» имеет смысл только в пересчёте на одно обращение. Иначе спор упирается в то, что месячная сумма подписки выглядит небольшой, и на этом заканчивается.

Допущения для примера ниже я называю вслух, потому что подставлять их вы будете свои. Одиннадцать оплаченных мест, средняя цена места — около 20 долларов в месяц (типовой порядок для ИИ-ассистентов на момент написания; у конкретных сервисов свои тарифы). Двадцать один рабочий день. Четверо активных пользователей делают по пятнадцать обращений в день, остальные семеро — по восемь обращений за весь месяц.

Величина Расчёт Результат
Платёж за месяц 11 мест × 20 $ 220 $
Обращения активных 4 чел. × 15 × 21 день 1 260
Обращения остальных 7 чел. × 8 56
Цена обращения у активного 80 $ ÷ 1 260 ≈ 0,06 $
Цена обращения у остальных 140 $ ÷ 56 ≈ 2,50 $

Разница в сорок раз внутри одной компании — и она не про качество работы людей. Юристу модель нужна восемь раз в месяц, и это нормальная частота для его задач. Ненормально то, что он при этом платит как человек, который не вылезает из чата.

Один счёт и список разрешённых моделей

ИИ-чат Atlorium — это не «ещё одна подписка на нейросеть». Это доступ к моделям тем же ключом и на том же балансе, что и остальные шестнадцать сервисов. Один заголовок Authorization: Bearer — и один счёт в конце месяца на всё сразу. Абонентской платы нет, минимального платежа за месяц нет.

Цена запроса складывается из двух частей, и это стоит понимать до того, как считать бюджет. Первая — фиксированная плата за сам запрос: она одинакова для всех моделей. Вторая — стоимость токенов выбранной модели: она зависит от модели и от того, насколько длинный у вас диалог. У моделей с бесплатными токенами вторая часть равна нулю, и вы платите только за запрос. Конкретные цифры живут на странице тарифов и в ответе GET /api/aichat/models, а не в статье: они меняются.

Теперь про вторую половину заголовка — про список разрешённых моделей.

Модели заданы на стороне сервиса и видны под алиасами: basic, advanced и так далее — вместо имени конкретной модели конкретного вендора. В поле model запроса принимается только идентификатор из ответа GET /api/aichat/models. Любое другое имя — 400, и, что важно для денег, отбивается оно до всякого резервирования средств: за некорректный запрос вы не платите.

У каждой модели в этом ответе есть флаг isAvailable. Модель с false видна в списке, но запрос по ней получает 503 — «пока недоступна». Это обычный рубильник на нашей стороне: провайдер снял модель или идёт замена. Списания при таком отказе тоже нет — резерв средств до этого места просто не доходит.

Алиасы решают ещё одну задачу, менее очевидную. Когда в вашем коде записано "model": "basic", а не имя конкретной модели, смена модели на нашей стороне не ломает вашу интеграцию. Вы не переписываете сервис из-за того, что вендор переименовал версию или снял её с обслуживания.

Пять подписок по отделам Один ключ
Кто платит Личные и корпоративные карты сотрудников Компания, один счёт
Закрывающие документы Скриншоты и авансовые отчёты Приходят на организацию
За что списывается За место, независимо от использования За фактические запросы и токены
Какие модели доступны Что выбрал каждый отдел Аллоулист, чужое имя — 400
Сотрудник уволился Пять личных кабинетов, пять паролей Правка на вашей стороне: ключ ваш
Сбой на стороне модели Оплаченный месяц идёт 503, деньги не списываются

Код: два запроса, которые нужны для внедрения

Все примеры работают с публичным демо-ключом ak_sandbox_demo_mockdata_v1 — копируйте и запускайте, регистрация не нужна. На демо-ключе API отдаёт моки: правдоподобные сгенерированные ответы, реальная модель не вызывается и токены не тратятся. Формат ответа при этом настоящий, поэтому на песочнице спокойно пишется и тестируется вся интеграция. Живые ответы модели приходят только с личным ключом.

Шаг первый: узнать, какие модели разрешены

curl -H "Authorization: Bearer ak_sandbox_demo_mockdata_v1" \
     "https://atlorium.com/api/aichat/models"
        

import requests

BASE = "https://atlorium.com"
HEADERS = {"Authorization": "Bearer ak_sandbox_demo_mockdata_v1"}

models = requests.get(f"{BASE}/api/aichat/models", headers=HEADERS, timeout=10).json()

# Список читаем на старте приложения, а не держим константой в коде:
# состав моделей и их доступность меняются на стороне сервиса.
allowed = [m["id"] for m in models if m["isAvailable"]]
print(allowed)

# Токены бесплатной модели ничего не стоят — платите только за сам запрос.
free_by_tokens = [
    m["id"] for m in models
    if m["inputPricePer1kTokens"] == 0 and m["outputPricePer1kTokens"] == 0
]
        

[
  {
    "id": "basic",
    "name": "Базовая",
    "description": "Быстрая базовая модель для повседневных задач",
    "contextWindowTokens": 1000000,
    "maxInputTokens": 4000,
    "maxOutputTokens": 2048,
    "maxTokens": 1000000,
    "inputPricePer1kTokens": 0,
    "outputPricePer1kTokens": 0,
    "freeQuotaEligible": true,
    "isAvailable": true,
    "isLocal": false
  },
  {
    "id": "advanced",
    "name": "Продвинутая",
    "description": "Сильнее в логике и сложных задачах",
    "contextWindowTokens": 128000,
    "maxInputTokens": 6000,
    "maxOutputTokens": 4096,
    "inputPricePer1kTokens": 0.05,
    "outputPricePer1kTokens": 0.2,
    "freeQuotaEligible": false,
    "isAvailable": true,
    "isLocal": false
  },
  {
    "id": "local",
    "name": "Приватная",
    "description": "Работает на нашем сервере — переписка остаётся внутри Atlorium",
    "contextWindowTokens": 32768,
    "maxInputTokens": 6000,
    "maxOutputTokens": 2048,
    "inputPricePer1kTokens": 0,
    "outputPricePer1kTokens": 0,
    "freeQuotaEligible": true,
    "isAvailable": false,
    "isLocal": true
  }
]
        

Тот же вызов на шести языках (Python, TypeScript, Go, Java, C#, PHP) — в репозитории ai-chat-api-client. Примеры запускаются сразу: ключ в них уже стоит демонстрационный.

Про поля этого ответа стоит сказать отдельно, потому что путаются в них регулярно. contextWindowTokens — справочная величина, полное окно модели. Реально ограничивает вас maxInputTokens: это потолок на одно сообщение, и он заметно меньше окна, потому что в контекст кроме вашего текста уходят история диалога и системный промт. maxOutputTokens — потолок длины ответа. Поле maxTokens оставлено ради старых клиентов и дублирует contextWindowTokens; в новом коде его лучше не читать.

Ещё два флага полезны для бюджета. freeQuotaEligible означает, что на эту модель распространяется бесплатная дневная квота — она гасит плату за запрос, поэтому имеет смысл только там, где токены и так бесплатны. isLocal помечает модель, которая обслуживается на нашем сервере: переписка с ней не уходит внешнему провайдеру. Нули в ценах у модели означают ровно одно — её токены нам ничего не стоят, и вы платите только за сам запрос. У платных моделей там будут ненулевые значения, и это единственное место, где их стоит смотреть: состав списка и цены настраиваются, а статья остаётся. Порядок цифр — на странице тарифов.

Шаг второй: отправить сообщение и продолжить диалог

# Первый запрос: sessionId не передаём — сессия создастся сама
curl -X POST "https://atlorium.com/api/aichat/send" \
     -H "Authorization: Bearer ak_sandbox_demo_mockdata_v1" \
     -H "Content-Type: application/json" \
     -d '{"message":"Сформулируй ответ клиенту на жалобу о задержке доставки","model":"basic"}'

# Второй запрос: подставляем sessionId из ответа — модель помнит контекст
curl -X POST "https://atlorium.com/api/aichat/send" \
     -H "Authorization: Bearer ak_sandbox_demo_mockdata_v1" \
     -H "Content-Type: application/json" \
     -d '{"message":"Сделай короче и без извинений","sessionId":"3f2a...","model":"basic"}'
        

def ask(message: str, session_id: str | None = None, model: str = "basic") -> dict:
    payload = {"message": message, "model": model}
    if session_id:
        payload["sessionId"] = session_id

    resp = requests.post(f"{BASE}/api/aichat/send", json=payload, headers=HEADERS, timeout=60)

    # 400 — пустое сообщение, превышен лимит токенов или модель вне списка.
    # 402 — не хватает баланса на удержание. 503 — модель временно не обслуживается.
    resp.raise_for_status()
    return resp.json()


first = ask("Сформулируй ответ клиенту на жалобу о задержке доставки")
second = ask("Сделай короче и без извинений", session_id=first["sessionId"])

# Расход пишем в свой лог: promptTokens растёт вместе с длиной диалога.
print(second["model"], second["promptTokens"], second["completionTokens"], second["totalTokens"])
        

using System.Net.Http.Json;
using System.Text.Json;

var http = new HttpClient { BaseAddress = new Uri("https://atlorium.com") };
http.DefaultRequestHeaders.Add("Authorization", "Bearer ak_sandbox_demo_mockdata_v1");

// sessionId храним у себя: он же ключ к истории диалога на нашей стороне.
var body = new { message = "Сформулируй ответ клиенту", model = "basic", sessionId = (string?)null };

var resp = await http.PostAsJsonAsync("/api/aichat/send", body);

// 503 — модель не обслуживается; резерв средств в этом случае даже не создаётся.
if ((int)resp.StatusCode == 503)
    throw new InvalidOperationException("Модель временно недоступна, возьмите другую из /api/aichat/models");

resp.EnsureSuccessStatusCode();
var answer = await resp.Content.ReadFromJsonAsync<JsonElement>();

var sessionId = answer.GetProperty("sessionId").GetString();
var reply = answer.GetProperty("reply").GetString();
var total = answer.GetProperty("totalTokens").GetInt32();
        

{
  "sessionId": "7c1e4b9a0d5f4a2e8b3c6d1f0a9e7b42",
  "reply": "Это ответ песочницы (mock): реальная ИИ-модель не вызывалась и токены не тратились. Ваше сообщение получено: «Сформулируй ответ клиенту на жалобу о задержке доставки». Активируйте аккаунт и используйте боевой ключ, чтобы получать реальные ответы модели.",
  "model": "basic",
  "promptTokens": 34,
  "completionTokens": 88,
  "totalTokens": 122,
  "createdAt": "2026-07-20T08:41:12.6183Z"
}
        

Тот же вызов на шести языках (Python, TypeScript, Go, Java, C#, PHP) — в репозитории ai-chat-api-client. Примеры запускаются сразу: ключ в них уже стоит демонстрационный.

Три поля из ответа стоит складывать в свой лог с первого дня: model, promptTokens и completionTokens. Именно по двум последним считается вторая составляющая цены, и именно они объясняют, почему длинный диалог дороже короткого: в контекст каждого следующего сообщения уходит история, и она оплачивается как входные токены заново. Разбить расход по отделам — вопрос одного поля в вашей таблице рядом с этими тремя.

Сессией управляют ещё два маршрута. GET /api/aichat/session/{sessionId} отдаёт метаданные — messageCount, createdAt, lastActivityAt — без самих сообщений. DELETE по тому же адресу удаляет сессию вместе с историей безвозвратно; если у вас есть кнопка «очистить переписку», она должна дёргать именно его.

Чего это не умеет

Раздел, ради которого стоит дочитывать статьи вендоров. Ниже то, что переход на один ключ не решает, и никакими настройками решено не будет.

Это не система управления доступом сотрудников. У ИИ-чата нет ролей, отделов и квот на человека: есть ваш ключ и ваш баланс. Кто из сотрудников сколько потратил, знает ваш сервис, потому что именно он ходит в API от их имени. Если между людьми и моделью у вас ничего нет, а ключ раздан в мессенджере, вы получите тот же зоопарк, только с одним счётом.

Сессия живёт час неактивности и удаляется вместе с историей. В одной сессии — не больше пятидесяти сообщений пользователя, а в контекст модели уходят последние двадцать сообщений, а не весь диалог. Это не архив переписки и не база знаний. Нужна долгая память — храните историю у себя и передавайте нужное в тексте сообщения.

Мы не обещаем конкретную модель конкретного вендора. Алиас — это уровень качества и цены, а что под ним работает сегодня, определяется конфигурацией сервиса. Для большинства прикладных задач это плюс: интеграция переживает смену модели. Но если вам принципиально нужна именно одна названная модель именно этой версии — такой гарантии здесь нет, и лучше узнать об этом сейчас, а не после внедрения.

Модель ошибается. Она уверенно выдумывает номера статей закона и банковские реквизиты, и никакой аллоулист от этого не спасает: он про то, какая модель отвечает, а не про то, насколько ответ верен. Всё, что уходит клиенту или в документ, проверяет человек.

И про приватность честно. Запрос к облачной модели уходит внешнему провайдеру — это верно и для подписки, и для нашего API. Единственное исключение — модели с флагом isLocal: они работают на нашем сервере, и переписка не покидает Atlorium. Смотреть надо на этот флаг в GET /api/aichat/models, а не на общие слова о безопасности.

Частые вопросы

Частые вопросы

Можно ли пользоваться нейросетью без месячной подписки?

Да. У ИИ-чата Atlorium нет абонентской платы и минимального платежа за месяц: списывается плата за фактические запросы. Цена одного запроса складывается из фиксированной ставки за обращение и стоимости токенов выбранной модели, у моделей с бесплатными токенами вторая часть равна нулю. Актуальные цифры — на странице тарифов.

Как ограничить, какими ИИ-моделями пользуются в компании?

Список разрешённых моделей задан на стороне сервиса и выдаётся запросом GET /api/aichat/models. Поле model в запросе принимает только идентификаторы из этого списка: любое другое имя возвращает 400, и деньги при этом не списываются. Модель с флагом isAvailable=false видна в списке, но запрос по ней получает 503.

Что будет, если передать имя модели, которого нет в списке?

Придёт 400 с текстом ошибки. Проверка модели выполняется до резервирования средств, поэтому за некорректный запрос вы не платите. То же касается пустого сообщения и превышения лимита maxInputTokens выбранной модели.

Почему с баланса удерживается больше, чем в итоге списывается?

Перед вызовом модели удерживается максимально возможная стоимость запроса: весь допустимый ввод плюс самый длинный ответ. После ответа списывается фактический расход по токенам, остаток удержания возвращается сразу. Поэтому для запроса к дорогой модели на балансе должен быть этот максимум, иначе придёт 402.

Как долго хранится история диалога?

Сессия удаляется через час неактивности вместе со всеми сообщениями, и восстановить её нельзя. В одной сессии допускается до пятидесяти сообщений пользователя, а в контекст модели уходят последние двадцать сообщений. Удалить сессию досрочно можно запросом DELETE /api/aichat/session/{sessionId}.

Можно ли попробовать API до регистрации?

Да, публичным демо-ключом ak_sandbox_demo_mockdata_v1. На нём API отдаёт моки: формат ответа настоящий, но реальная модель не вызывается и токены не тратятся. Этого достаточно, чтобы написать и протестировать интеграцию целиком, а живые ответы модели приходят с личным ключом.

Сервисы из этой статьи

ИИ-чат

Ответы ИИ-модели через OpenRouter

Попробовать прямо сейчас — без регистрации

Демо-ключ ak_sandbox_demo_mockdata_v1 — публичный и общий для всех. С ним API отвечает моками: данные правдоподобные, но сгенерированные, и они не меняются от запроса к запросу — на них удобно писать тесты. Настоящие данные приходят с личным ключом.

curl -H "Authorization: Bearer ak_sandbox_demo_mockdata_v1" \
     https://atlorium.com/openapi/aichat_ru.json
Полезно? Перешлите коллеге: Telegram VK

Восстанавливаем соединение…

Похоже, связь с сервером ненадолго прервалась. Переподключаемся автоматически — пожалуйста, подождите несколько секунд.

Не удалось переподключиться

Проверьте интернет-соединение. Можно повторить попытку или обновить страницу.

Сессия устарела

Соединение восстановлено, но сессию нужно перезагрузить. Обновите страницу, чтобы продолжить.