Я полгода делаю приложение для D&D руками нейросети. Вот на что ушли 5,75 миллиарда токенов

Дисклеймер, чтобы не было сюрпризов: приложение почти целиком написано Claude Code, я держу архитектуру и ревью. Текст этой статьи модель тоже вычитала. Всё, что ниже, — про то, как я перестал сливать лимит подписки к обеду.

Завязка

Полгода назад мне надоели бумажные листы персонажей, и я сел делать свой — веб-приложение для D&D 5e: характеристики, бой, заклинания, инвентарь, трёхмерные кубики. Сейчас там 44 модуля, около 70 000 строк, 597 коммитов и версия 3.91.0. Пишет всё это нейросеть, я говорю что делать.

И вот в какой-то момент я заметил неприятное: лимит подписки аканчивался к середине дня. Причём в дни, когда я не делал ничего героического — так, поправить отступ, поменять цвет, добавить заклинание.

Сначала я думал, что просто много прошу. Оказалось — прошу неправильно.

Я решил посчитать, а не гадать

Claude Code складывает все диалоги в обычные файлы на диске, и в каждом ответе модели записан реальный расход. Тридцать строк на Node — и вместо ощущений получаются цифры:

  • 169 сессий, 28 649 запросов к модели;
  • 5,75 млрд токенов прочитано на вход, из них 3,64 млрд (63%) — на само приложение, остальное другие проекты;
  • 0,03 млрд токенов написано моделью в ответ;
  • средний размер одного запроса — 201 000 токенов;
  • 22 сессии длиннее 300 запросов дали 67% всего расхода;
  • рекорд — одна сессия на 886 запросов.

Строчка про ответы модели — главный сюрприз. В токенах это полпроцента расхода. В деньгах разрыв меньше: чтение из кеша дешёвое, а выход дорогой, так что по тарифам API ответы дали бы около 15% счёта — но 85% всё равно приходится на вход. Всё, что я мог сэкономить, прося «пиши покороче», лежит в этих процентах.

Деньги были в другом.

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

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

А диалог только растёт. То есть двухсотый шаг в сессии стоит в разы дороже первого, хотя работы делает столько же. Математика получается злая: сессия на 800 шагов стоит вчетверо дороже, чем четыре сессии по 200 шагов с той же выполненной работой.

Каждая полоса — одна сессия. Слева два десятка марафонов, которые съели две трети расхода.
Каждая полоса — одна сессия. Слева два десятка марафонов, которые съели две трети расхода.

Мои 22 сессии-марафона, где я «ну ещё одну мелочь поправлю», съели две трети всего расхода за полгода.

На что конкретно уходило

Я разложил расход по источникам, и там нашлись два очень стыдных пункта.

Один и тот же файл читался снова и снова. Треть всего объёма чтения — это повторы. Мой файл стилей (16 тысяч строк) был прочитан 266 раз за историю проекта. Модель читает файл, что-то правит, через двадцать шагов «на всякий случай» открывает его заново — хотя первое чтение никуда не делось, оно лежит в диалоге и оплачивается на каждом следующем шаге. То есть за второе чтение я плачу дважды.

459 скриншотов, примерно 130 миллионов токенов. Я проверял вёрстку прямо в основном чате: «покажи, как выглядит». Каждая картинка потом ехала со мной до конца сессии.

Что я поменял

Ввёл жёсткий лимит сессии — 150 шагов, и режем, даже посреди задачи. Держать это в голове невозможно, поэтому я повесил скрипт, который считает шаги и в конце каждого хода пишет: «Сессия разрослась: 150 запросов, контекст 200k. Закрывай». Раньше я не замечал, что сижу в 600-шаговой сессии. Теперь узнаю на 120-й.

Сделал ритуал закрытия. Перед выходом модель пишет пять строк: что сделано, в каком состоянии файлы, следующий шаг, открытые вопросы. Новая сессия стартует с этих пяти строк вместо ста тысяч токенов истории. Одна задача — одна сессия.

Сгенерировал карту кода. Отдельный файл на 259 строк: какие секции стилей в каких строках лежат, где какая функция, где какая константа. Раньше на просьбу «поправь шапку» модель делала три поиска и читала лишние восемьсот строк. Теперь смотрит в карту и читает сорок нужных.

Запретил перечитывать файлы. Прямым текстом, в инструкции проекта: прочитанное всё ещё в диалоге, прокрути назад. Без явного запрета модель перечитывает — ей так спокойнее, а платит за это спокойствие мой аккаунт.

Убрал браузер из основного чата. Вся проверка вёрстки ушла в отдельного помощника: у него свой диалог, он там кликает, смотрит консоль, делает скриншоты — а мне возвращает пять строк вердикта. Картинки остаются у него.

Отдал рутину моделям попроще. Релиз (тесты, версия, коммит, пуш) делает Sonnet, текст анонса пишет Haiku. Умная модель нужна там, где надо думать, а не там, где надо выполнить написанную инструкцию.

Стал складывать действия в один ход. Пять независимых чтений в одном сообщении — это один запрос вместо пяти. Экономия ровно в пять раз, потому что платишь за количество шагов, а не за количество слов в них.

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

Что не сработало

  • Отдельный помощник ради одной команды. Он стартует с нуля, заново читает инструкции проекта и ищет файлы. На короткой задаче это дороже, чем сделать самому.
  • Локальные модели. У меня видеокарта на 8 ГБ, туда влезает только что-то маленькое и не очень пригодное для реального кода.
  • «Отвечай покороче». Полпроцента расхода в токенах. Это как экономить на спичках, когда горит проводка.

Короткий вывод

Работа с кодовым агентом — это не про «попросил и получил». Это про управление одной-единственной величиной: сколько всего модель тащит с собой на каждом шагу. Всё остальное — следствия.

Честно скажу: цифр «после» у меня пока нет — правила введены недавно, мерить результат имеет смысл недели через две, иначе намеряешь шум. Перезамерю тем же скриптом и, если будет что показать, напишу вторую часть.

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

Приложение, ради которого всё это: github.com/D1MANYCH/dnd-app

3
2