Пять подписок на нейросети в одной компании: как свести их к одному счёту и списку разрешённых моделей
Подписка списывается каждый месяц независимо от того, пользовались вы моделью или нет. Разбираем, во что обходится зоопарк подписок и как выглядит переход на оплату за запрос.
Закрытие квартала. Бухгалтер приносит список платежей, которые не удалось разнести по статьям: пять списаний в валюте, четыре разных получателя, суммы от 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 отдаёт моки: формат ответа настоящий, но реальная модель не вызывается и токены не тратятся. Этого достаточно, чтобы написать и протестировать интеграцию целиком, а живые ответы модели приходят с личным ключом.
Сервисы из этой статьи
Попробовать прямо сейчас — без регистрации
Демо-ключ ak_sandbox_demo_mockdata_v1 — публичный и общий для всех.
С ним API отвечает моками: данные правдоподобные, но сгенерированные,
и они не меняются от запроса к запросу — на них удобно писать тесты.
Настоящие данные приходят с личным ключом.
curl -H "Authorization: Bearer ak_sandbox_demo_mockdata_v1" \
https://atlorium.com/openapi/aichat_ru.json