Нейросети для DnD: почему ход ИИ-мастера оказался в 13 раз дороже, чем показывал счётчик
Внутренний счётчик AI-Мастера показывал лишь треть реального расхода на нейросеть: две трети ходов были невидимы, потому что один шаг пайплайна писал в стоимость ноль. Когда я стал брать цену прямо из ответа API, оказалось, что настоящий ход дороже расчётного в 13 раз, а 92% этой цены съедает шаг-рассказчик.
Ребят, тут такая история. Я неделю с лишним честно логировал каждый вызов нейросети в нашем ИИ-Мастере - и выяснил, что счётчик внутри бота всё это время показывал мне только треть правды. Реальный ход у нейросети для DnD стоит заметно дороже, чем я думал, и большая часть расхода просто не попадала в учёт. Ниже - как я это нашёл, почему так вышло и что это значит для тебя за столом.
Сразу дисклеймер: продукт в бете, это активная стройка. Такие находки - норма, когда строишь на ходу. Мне не стыдно, мне интересно )
Сколько на самом деле стоит один ход ИИ-мастера?
Один ход ИИ-мастера - это не один запрос к нейросети, а целая пачка. За 11 дней честного логирования оказалось, что во внутренний счётчик попадала только треть (33%) реального расхода на вызовы модели. Две трети затрат были невидимы - бот их делал, платил за них, но в стоимость хода не записывал.
Давай разберём, почему ход вообще что-то стоит. Каждый твой шаг в приключении мастер прокручивает через языковую модель несколько раз: понять, что ты вообще задумал, решить, нужен ли бросок кубика, описать сцену, обновить состояние мира. Провайдер (мы гоняем вызовы через OpenRouter) берёт плату за токены - это кусочки текста на входе и на выходе. Причём выходные токены обычно в 2-6 раз дороже входных (OpenRouter, 2026). Чем больше мастер пишет - тем дороже ход.
И вот тут я долго жил в иллюзии, что знаю эту цену. А знал я её плохо.
Почему биллинг нейросети врал: шаг, который писал ноль
Главный виновник нашёлся быстро. Один из шагов пайплайна - тот, что понимает твоё намерение (intent) - за период сделал 9175 вызовов и сжевал 17 миллионов токенов, но в стоимость хода писал ровно cost_usd=0.00. Ноль. При том что соседний шаг на той же самой модели цену честно логировал. Просто в этом месте кто-то (я, конечно, кто ж ещё) забыл протянуть учёт.
Представь трактир, где повар готовит, официант носит, а один эльф в углу молча ест за счёт заведения - и его порции никто не вписывает в счёт. Формально всё сходится. По факту касса в минусе. Вот intent был таким эльфом. Плюс несколько хвостовых шагов пайплайна вообще не привязывались к стоимости конкретного хода - ещё кусок расхода утекал мимо чаши.
Манифест, который я записал себе после этого: счётчик не имеет права угадывать цену - он обязан её знать.
Как считать расход токенов честно
Честный учёт расхода токенов - это когда цену берёшь из фактического ответа API, а не из заранее зашитой константы. OpenRouter (и большинство провайдеров) возвращает в каждом ответе, сколько токенов ушло на вход, сколько на выход и сколько это стоило. Надо просто это читать, а не считать по своей табличке “примерно вот столько”.
Что было: цена хода собиралась из констант - “модель X стоит вот столько, значит ход стоит вот столько”. Красиво, предсказуемо и неправильно, потому что реальные вызовы гуляют: разная длина ответа, кэш, ретраи.
Что стало: кост берётся из usage-поля ответа модели по факту каждого вызова. Константы я не выкинул - они остались фолбэком на случай, если провайдер вдруг не вернёт цену. Курс доллара к рублю вынес в переменную окружения, чтобы не хардкодить. Обложил всё это 13 новыми тестами; общий прогон - 4649 тестов, зелёный.
Дальше - момент истины. Я взял три первых живых хода уже с новым учётом и вручную сложил стоимость всех вызовов внутри каждого. Два хода сошлись с суммой вызовов копейка в копейку. Третий разошёлся на −1,3% - и это не баг, а известное ограничение: пара хвостовых шагов иногда дописывается уже после того, как ход закрыт и списан. Гонка на финише. Знаю про неё, живу с ней пока.
Из чего складывается себестоимость AI-бота
Когда учёт стал честным, вылезла главная цифра. Pro-ход, который старый биллинг считал по константе, реально стоит в 13 раз дороже, чем показывала эта константа. В тринадцать. Не на проценты - в разы.
Куда уходят деньги? Львиную долю ест рассказчик - шаг, который пишет тебе художественное описание сцены. На него приходится около 92% стоимости хода. Логично: понять намерение и кинуть кубик - это пара коротких запросов, а вот расписать, как ты входишь в затопленную крипту и что там шевелится в темноте, - это длинный, дорогой текст. И если рассказчик спотыкается и уходит в повтор (ретрай), цена хода честно удваивается - мы просто платим за описание дважды.
Себестоимость AI-бота - это не “модель стоит N за миллион токенов”. Это сумма всех шагов пайплайна на каждый ход, где один шаг может весить как все остальные вместе. Пока не начнёшь мерить по факту - не увидишь, кто у тебя обжора.
Грабли по дороге: время в базе, которого не было
Отдельная комедия случилась с анализом. Я чуть не поднял панику на ровном месте: инструмент показал, что после деплоя нового учёта вылезло аж 61 “фолбэчный” ход - то есть такой, где цена взялась из старых констант, а не из ответа API. Выглядело как “фикс не сработал”.
А потом выяснилось, что колонка времени в базе хранит UTC без пометки о зоне (naive datetime), а мой инструмент показывал время со сдвигом на −3 часа. Из-за этого он смотрел не в то окно и “находил” ходы, которых в реальности после деплоя не было. Сдвинул окно правильно - 61 призрак растворился. Мораль простая: прежде чем чинить систему, проверь, не врут ли тебе твои же часы.
Что это значит для тебя за столом
Практически - ничего страшного, и это хорошая новость. Мана, которую ты тратишь на ход, и раньше, и сейчас списывается за реальную игру. Просто теперь я внутри вижу настоящую картину: где дорого, где можно ужать, где рассказчик разошёлся и его стоит придержать. Это прямой путь к тому, чтобы ходы стали дешевле для меня - а значит, стабильнее и щедрее для тебя.
И это к вопросу доверия. Нейросеть у нас не имеет права молча менять числа - ни в бою, ни в кассе. Если уж я требую от бота честности в кубиках, то и счётчик расхода обязан быть честным. Теперь он такой.
А я пойду смотреть, как заставить рассказчика говорить так же вкусно, но короче. Следите за новостями ) Спасибо тестерам, которые крутят бота каждый день - без ваших ходов эти 11 дней данных было бы неоткуда взять.
Частые вопросы
Почему нейросеть для DnD вообще что-то стоит на каждый ход?
Каждый ход мастера - это пачка запросов к языковой модели: понять намерение, кинуть кубик, описать сцену, обновить мир. Провайдер берёт плату за токены (кусочки текста) на входе и выходе, причём выходные обычно в 2-6 раз дороже входных.
Можно ли доверять счётчику расхода внутри AI-бота?
Только если он берёт цифры из фактического ответа API, а не из зашитых констант. У меня константа расходилась с реальностью в разы; как только счётчик стал читать usage прямо из ответа модели, счёт сошёлся с точностью до копеек.
Влияет ли длина приключения на стоимость запроса к нейросети?
Да. У языковой модели нет памяти между запросами, поэтому историю приходится слать заново каждый ход. Чем длиннее приключение, тем больше контекста едет в каждый запрос - и тем дороже выходит ход.
Как готовился материал: черновик собирает мой ИИ-конвейер по темам из практики таверны, факты сверяются с первоисточниками и правилами, финальную версию я читаю и правлю руками перед публикацией. Обложку тоже рисует нейросеть. Про кухню — на странице о проекте.