Нейросети в MAX за рубли: что решить до первого платежа

—

от автора

Я сделал в MAX бота «Спроси ИИ»: в нём можно задать вопрос ChatGPT или Gemini и нарисовать картинку в Nano Banana. Платить можно российской картой или по СБП, ничего дополнительно ставить не нужно.

Код оказался самой простой частью. Сложнее было с деньгами, чеками и законами — о них и расскажу. Текст пригодится всем, кто думает сделать платного бота в MAX.

Почему MAX

MAX предустановлен на смартфонах, которые продаются в России, а ИИ-ботов в нём пока мало — ниша не перегрета, как в Telegram. Для самозанятого вход тоже стал простым.

С июня 2026 года в MAX открыта партнёрская платформа для самозанятых. Регистрация — на business.max.ru, тип «Самозанятый», подтверждение через Госуслуги. Самозанятому дают до двух ботов, карточку бота модерируют до 48 часов.

Заводить ботов могут только резиденты РФ: самозанятые, ИП и юрлица. Это стоит проверить до того, как писать код.

Что полезно знать о Bot API заранее:

  • Встроенных платежей вроде Telegram Stars нет. Деньги принимаем по ссылке на внешнюю платёжную систему.

  • Сертификат API выпущен на корневом сертификате Минцифры. Его нужно добавить в доверенные на сервере, иначе HTTPS-запросы не пройдут.

  • Токен передаётся в заголовке Authorization без префикса Bearer.

  • Вебхук принимает только HTTPS на 443-м порту. Ответить 200 нужно за 30 секунд, поэтому запрос к нейросети уходит в фоновую очередь.

  • Если вебхук 8 часов подряд не отвечает успешно, MAX отписывает бота сам. Без мониторинга можно проснуться с мёртвым ботом.

  • Лимит — около 30 запросов в секунду.

  • Проверяйте секрет в заголовке X-Max-Bot-Api-Secret, чтобы чужие запросы на вебхук отсекались.

Какие модели выбрал

В боте два семейства моделей для текста и одна для картинок. У каждого семейства три уровня — от дешёвого до самого умного.

Нейросети в MAX за рубли: что решить до первого платежа

Нейросети в MAX за рубли: что решить до первого платежа

Три уровня нужны не для красоты. Старшая модель OpenAI в боте дороже младшей в 20 раз — и на входе, и на выходе. Если дать всем только флагман, простое «переведи абзац» будет стоить как разбор договора.

Для картинок взял Nano Banana 2.1. Она вышла в октябре и при том же разрешении дешевле Nano Banana 2 примерно на четверть. Вторая версия осталась запасной — на случай, если новая начнёт сбоить.

Модели подключены через общий слой провайдеров. Добавить новое семейство или заменить модель — это новый адаптер и строка в каталоге, бизнес-логика не меняется.

Биллинг: как не уйти в минус

Это была главная инженерная задача. Цена запроса к нейросети заранее неизвестна: сколько токенов модель напишет в ответ, не знает никто.

Наивная схема «проверил баланс → отправил запрос → списал» ломается сразу. Пользователь с балансом 100 кредитов отправляет два тяжёлых запроса — с телефона и с ноутбука. Оба проходят проверку, оба выполняются, баланс уходит в минус. Платить за этот минус будет владелец бота.

Поэтому каждый запрос проходит четыре шага.

1. Оценка сверху. Входные токены считаем через API самих вендоров: у OpenAI есть эндпоинт подсчёта токенов, у Gemini — countTokens. Выход ограничиваем параметром max_output_tokens. Рассуждения модели входят в этот же лимит, поэтому потратить больше модель физически не может.

Цена = входные токены × цена входа + лимит выхода × цена выхода. Это верхняя граница, а не прогноз. Её пользователь видит до отправки запроса.

С картинками проще: фиксированная цена за изображение по разрешению плюс входные токены промпта.

2. Резерв (холд). Сумму резервируем одной транзакцией в PostgreSQL. Условие проверки баланса стоит прямо в UPDATE, поэтому два параллельных запроса не могут одновременно пройти проверку.

BEGIN; -- ключ идемпотентности = ID апдейта от MAX: -- повторная доставка вебхука не создаст второй холд INSERT INTO holds (idem_key, user_id, amount) VALUES (:update_id, :user_id, :hold);  UPDATE wallets       SET held = held + :hold,       active_holds = active_holds + 1   WHERE user_id = :user_id       AND balance - held >= :hold       AND active_holds < 2;  -- 0 строк обновлено → ROLLBACK -- и сообщение «не хватает кредитов» COMMIT;

PostgreSQL блокирует строку кошелька на время UPDATE. Второй запрос ждёт и перепроверяет условие уже с учётом первого холда. Заодно ограничил число одновременных запросов двумя — так один пользователь не забьёт очередь.

3. Списание по факту. Когда модель ответила, берём реальный расход из usage и списываем min(факт, холд). Остаток холда возвращается на баланс. Обычно факт заметно меньше верхней оценки, так что пользователь переплачивает только временно.

4. Уборка. Если процесс упал посреди запроса, холд зависнет. Его освобождает фоновая задача по TTL. Важно, чтобы таймаут запроса к вендору был короче TTL холда — иначе холд снимется, пока модель ещё отвечает.

Все движения денег пишутся в append-only журнал. Баланс всегда можно пересобрать из журнала и найти, куда ушёл каждый кредит.

Гонки я проверял на настоящем PostgreSQL, а не на моках: тесты запускают параллельные холды на один кошелёк и проверяют, что баланс не уходит ниже нуля.

Нейросети в MAX за рубли: что решить до первого платежа

Нейросети в MAX за рубли: что решить до первого платежа

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

Как самозанятому принимать оплату в 2026 году

Я работаю как самозанятый, и здесь меня ждал сюрприз. Привычный путь через ЮKassa больше не подходит: с 29 декабря 2025 года она перестала отправлять чеки самозанятых в «Мой налог».

Вручную пробивать чеки тоже не вариант. При оплате картой или по СБП чек нужно сформировать в момент расчёта — так требует закон о НПД (ч. 3 ст. 14 422-ФЗ). При потоке мелких пополнений руками за этим не успеть.

В итоге выбрал Robokassa с сервисом «Робочеки СМЗ». Что важно для бота:

  • чеки сами уходят в «Мой налог», бесплатно;

  • оплата по ссылке — как раз то, что нужно в MAX без встроенных платежей;

  • есть серверное уведомление об оплате (ResultURL);

  • комиссия на тарифе «Стартовый» по их калькулятору — 3,9% за карту и 2,7% за СБП.

Пополнение выглядит так. Пользователь жмёт «Пополнить» и выбирает пакет. Бот присылает ссылку на оплату. После оплаты Robokassa дёргает ResultURL: проверяем подпись, зачисляем кредиты и пишем пользователю в чат.

Обработчик ResultURL обязан быть идемпотентным по номеру счёта. Платёжки повторяют уведомления, и без этого один платёж зачислится дважды.

Возврат неизрасходованного остатка тоже автоматизирован: через API возврата Robokassa с аннулированием чека. Зачем он нужен — в следующем разделе.

Какие законы касаются такого бота

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

Нейросети в MAX за рубли: что решить до первого платежа

Нейросети в MAX за рубли: что решить до первого платежа

Отдельно про уведомление в Роскомнадзор. Его часто пропускают, а с 30 мая 2025 года гражданину за это грозит штраф 5–10 тысяч рублей. Подаётся онлайн на сайте Роскомнадзора, так что дешевле сделать сразу.

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

Что в итоге

На сам бот — диалог, выбор модели, генерацию картинок — ушла меньшая часть времени. Большая ушла на то, чтобы деньги считались честно: никто не уходит в минус, чеки уходят в налоговую, остаток можно вернуть.

Если делаете своего платного бота в MAX, начните с трёх вещей:

  1. Проверьте, что можете зарегистрироваться на платформе для партнёров.

  2. Выберите платёжку, которая сама отправляет чеки в «Мой налог».

  3. Спроектируйте резерв средств до первого запроса к модели, а не после первого минуса.

Посмотреть, как это работает со стороны пользователя, можно в самом боте — «Спроси ИИ» в MAX. Там видно оценку стоимости до запроса и то, как возвращается остаток резерва.

Вопросы про биллинг, MAX Bot API или чеки самозанятого — задавайте в комментариях, отвечу.

ссылка на оригинал статьи https://habr.com/ru/articles/1104888/