Дата публикации
business

Как LLMStart построила свой биллинг для ИИ-агента: микрокредиты, ОГРН и пять LLM за один запрос

Что произошло

LLMStart.ru вместе с интегратором Айтон запустили в продакшн собственного ИИ-консультанта по 1С:УНФ на базе LangChain. Агент работает в Telegram и обслуживает два типа пользователей:

  • консультантов Айтона во внутренних чатах — как «умная шпаргалка» по 1С;
  • клиентов Айтона в групповых чатах — там, где раньше отвечали живые консультанты.

Каждый ответ нейросети стоит денег: провайдер LLM (через OpenRouter) тарифицирует запросы по токенам. Чтобы не сжечь бюджет и честно выставлять счета по каждой компании-клиенту, команда спроектировала собственную биллинговую систему.

Ключевые решения:

  • вся архитектура крутится вокруг сущности «Организация»;
  • идентификатор организации — ОГРН, а не абстрактный UUID;
  • единый баланс на организацию, а не отдельные кошельки на каждый чат;
  • собственная единица учёта — «микрокредит» (0,000001 доллара);
  • расчёт расходов по usage_metadata моделей и сверка с биллингом OpenRouter «копейка в копейку»;
  • отказ от стандартных callback handler’ов LangChain в пользу связки ContextVar + Mixin, чтобы протащить ID организации через до пяти LLM-вызовов в одном запросе, включая те, что идут мимо LangChain.

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

Почему всё завязали на «Организацию»

ИИ-консультант — multi-tenant система: на одной инфраструктуре живут десятки клиентов Айтона. Для каждого нужно обеспечить:

  • изоляцию данных (вопросы, ответы, логи);
  • отдельный финансовый контур (пополнения, расходы, лимиты);
  • прозрачный отчёт по затратам.

Команда сделала «Организацию» ядром всей архитектуры. Вокруг неё строятся пользователи, чаты, журналы операций и роли. Это упрощает и безопасность, и биллинг.

ОГРН вместо внутренних идентификаторов

Вместо того чтобы придумывать собственные ID, LLMStart использует ОГРН компании как ключ организации. Это даёт несколько прямых выгод:

  • база сразу связана с реальными юридическими лицами;
  • не нужен дополнительный слой маппингов между внутренними ID и внешними реестрами;
  • меньше риска запутаться при интеграциях с учётными системами и CRM.

Роли завязаны на организацию, а не на пользователя вообще

Роли всего три:

  • администратор;
  • консультант;
  • клиент.

При этом роль зависит от того, в какой организации находится пользователь:

  • попал в головную организацию Айтон — работаешь как консультант и видишь все клиентские организации;
  • попал в клиентскую организацию — работаешь как клиент и видишь только свою «песочницу».

Логика прав живёт в одном месте, а не размазана по чатам и пользователям. Это снижает количество ошибок и упрощает поддержку.

Почему отказались от кошельков на каждый чат

Заказчик изначально хотел считать деньги по чатам: раз токены тратит чат, значит, у каждого чата должен быть свой «кошелёк».

На практике это быстро приводит к проблемам:

  • у одной компании может быть несколько чатов (например, по отделам);
  • нужно решать, как пополнять каждый из них и как делить общий бюджет;
  • возникает путаница с остатками и лимитами.

LLMStart выбрала другой путь: один общий баланс на организацию. Пользователь пишет в любой чат → система определяет, к какой организации он относится → списывает деньги из общего баланса этой организации.

Сам баланс не хранится как один столбец в базе. Это результат простой формулы:

  • суммируем все пополнения из журнала поступлений;
  • вычитаем все расходы из журнала списаний.

Так проще отлаживать и аудировать систему: любой баланс можно разложить по операциям.

Что меняет для рынка

Микрокредиты вместо «абстрактных токенов»

Главный вызов — выбрать, в чём считать расходы. У команды было три варианта.

  1. Наивные токены. Считать все токены по одной цене.

    • Проблема: разные модели стоят по-разному. Например, Gemini Pro — $2.00 за миллион токенов, а Gemini Flash — $0.50 за миллион.
    • Если считать «просто токены», запросы к более дорогим моделям незаметно сжигают бюджет в 4 раза быстрее.
  2. Взвешенные токены. Вводим коэффициенты: 1 токен Gemini Pro = 4 токена Gemini Flash.

    • Проблема: как только провайдер меняет цены, все коэффициенты устаревают.
    • Придётся пересчитывать старые балансы клиентов задним числом — это больно и рискованно.
  3. Микрокредиты. Выбор LLMStart.

    • Вводится собственная единица учёта — микрокредит, равный 0.000001 доллара.
    • Все операции хранятся в базе как целые числа. Это убирает проблемы с округлением и накоплением ошибок.

Как это работает:

  • из ответа нейросети берут usage_metadata с количеством токенов на вход и выход;
  • умножают на актуальные цены модели из конфигурации (например, pricing.yaml);
  • переводят сумму в микрокредиты и записывают в журнал расходов.

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

Фиксация цен на момент запроса

Чтобы сохранить прозрачность и историю, в журнале расходов хранят не только сумму списания, но и тарифы модели в момент запроса:

  • название модели;
  • цена за миллион входных токенов;
  • цена за миллион выходных токенов.

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

Для бизнеса это критично: можно обосновать любой счёт клиенту и провести аудит за любой период.

Зачем отказались от стандартных callback handler’ов LangChain

В архитектуре агента один пользовательский запрос может запустить до пяти LLM-вызовов:

  • главный агент, который ведёт диалог;
  • классификатор, который определяет тип вопроса;
  • проверка на prompt-инъекции и нежелательный контент;
  • суммаризатор, если диалог стал слишком длинным;
  • эксперт-агент, если вопрос сложный и требует отдельной проработки.

Часть этих вызовов идёт через LangChain, часть — напрямую к OpenRouter или другим обвязкам. Задача биллинга — при любом сценарии знать, к какой организации относится запрос, и корректно списать деньги.

Стандартные callback handler’ы LangChain хорошо работают, пока все запросы проходят через него. Но как только появляются обходные пути, привязка к одному фреймворку становится ограничением.

LLMStart ушла в сторону связки ContextVar + Mixin:

  • ContextVar хранит ID организации в контексте выполнения запроса;
  • Mixin добавляют к классам общий функционал работы с этим контекстом и биллингом.

В итоге ID организации «протаскивается» через все вызовы, даже если часть из них не знает о LangChain. Это делает биллинг независимым от конкретной библиотеки и устойчивым к изменениям архитектуры агента.

Multi-tenant LLM как продукт, а не прототип

Для рынка это важный сдвиг: многие ИИ-агенты остаются на стадии прототипа — один бот, одна компания, ручной контроль расходов. Здесь же:

  • полноценная multi-tenant архитектура с изоляцией по организациям;
  • связка прав доступа и финансового контура на уровне ОГРН;
  • точный биллинг с собственной валютой и логированием тарифов.

Такой подход ближе к SaaS-продукту, чем к эксперименту с нейросетью внутри одного чата.

Что это значит для вас

Для интеграторов и разработчиков ИИ-ботов

Если вы строите ИИ-агентов для бизнеса, особенно в формате «одна платформа — много клиентов», из этого кейса можно забрать несколько практических идей:

  • Думать с уровня организации. Привязывайте всё — пользователей, чаты, балансы, роли — к юридическому лицу или эквиваленту.
  • Использовать естественные ключи, когда это возможно. ОГРН, ИНН или другой внешний идентификатор упрощают интеграции и отчётность.
  • Считать в деньгах, а не в токенах. Разные модели стоят по-разному, а цены меняются. Микрокредиты или другая дискретная валюта снимают много проблем.
  • Хранить историю тарифов. Не только сумму, но и цену модели в момент запроса. Это спасёт при спорах с клиентами.
  • Не завязываться жёстко на один фреймворк. Связка ContextVar + Mixin позволяет протащить контекст (ID организации, лимиты, трейсинг) через любые вызовы, а не только через LangChain.

Для владельцев продуктов и руководителей

Если вы планируете запускать ИИ-ассистента для клиентов:

  • готовьтесь к тому, что биллинг — это не «добавить калькулятор токенов», а отдельный продуктовый слой;
  • закладывайте время и ресурсы на проектирование финансовой модели: единица учёта, лимиты, отчётность, аудит;
  • не дробите бюджет по чатам, если у клиента несколько точек входа. Единый баланс на организацию проще для понимания и контроля.

Этот подход особенно полезен для компаний, которые продают ИИ-агентов по подписке или по usage-модели и хотят масштабировать сервис на десятки организаций.

Кому это не подойдёт

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

Во всех остальных случаях ранний переход к деньгам, а не токенам, и к организации как основной сущности сильно экономит время на следующем этапе роста.


Читайте также