Hotspot Mode: как я нашел 10 миллионов токенов, которые исчезали в сессии

Однажды я заметил, что одна из моих сессий съела 10.2M input-токенов за 48 промптов. Не было ни одного заметного запроса, никакой очевидной причины - просто дорогая сессия. Я решил понять, где именно уходят токены.


Проблема, которую никто не видит

На r/ClaudeAI каждую неделю появляется примерно один и тот же тред: “мой счёт за Claude Code оказался $50 за один день”. Люди удивлены. Не потому что они сделали что-то принципиально неправильное - а потому что узнали об этом из счёта, а не из инструмента.

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

Про мою сессию excalidecks - я не заметил момента, когда что-то пошло не так. 48 промптов, рабочая сессия по построению презентаций. Но 10.2M input-токенов. Вопрос “где именно?” - без инструмента на него не ответить.

Дополнительная проблема: контекстное окно работает против тебя не только по стоимости. Когда оно заполнено на 60% и больше - качество ответов начинает деградировать. То есть длинные сессии одновременно и дорогие, и менее полезные. Оптимум - до 40-50% заполнения, после этого лучше открыть новую.

Но чтобы это отследить - нужна видимость. Без неё ты просто гадаешь.


Там, где проблему уже решили

В production LLM-мониторинге эта задача решена давно. Langfuse, Helicone, Braintrust - все они показывают per-request разбивку: сколько токенов на каждый запрос, цветом обозначают интенсивность. Зелёный - дёшево, жёлтый - смотри внимательно, красный - разбирайся почему.

Логика простая: нельзя оптимизировать то, что не видишь.

В dev-инструментах этого не было. cc-viewer умеет real-time мониторинг и визуализацию по промптам. claude-spend считает суммарный расход по сессиям. ccusage даёт агрегированную статистику. Но per-prompt hotspot - подсветку дорогих мест прямо внутри сессии - никто не делал.

Разрыв между production best practices и повседневным dev-workflow оказался больше, чем хотелось бы.


Я сделал себе такой инструмент

Я добавил hotspot mode в cc-viewer. Принцип тот же, что у Langfuse: цветовая кодировка по стоимости промпта прямо в логе. Видишь список промптов - и сразу видишь, где красно.

Процесс оказался интереснее самого результата. Начал с брейнсторма через superpowers, потом - дизайн режима, выбор порогов для цветов, решение как показывать кэш-информацию рядом с каждым промптом. Когда начал думать о визуализации серьёзно - понял, что того же не хватает в нескольких других местах, например в statusline.

Вся техника - цветовая кодировка прямо в логе промптов. Ничего экзотического. Но без этого ты смотришь в поток текста и не видишь структуры расходов.


Что я увидел

Сразу стало понятно, где деньги. В типичной coding-сессии большая часть input-токенов - это результаты tool calls. Файлы больше 100KB, outputs длиннее 5000 символов. Claude читает файл целиком ради трёх строк - и результат добавляется в полном объёме.

Второй источник - повторное чтение одних и тех же файлов. Если один тяжёлый файл читается 3-4 раза за сессию, он каждый раз занимает место.

Третий - compaction summaries. Когда Claude Code делает компакцию - она пересоздаёт кэш. Это пик стоимости.

Отдельная история - cache miss как скрытый мультипликатор. TTL кэша 5 минут. Отвлёкся - взял кофе, ответил на звонок, ушёл на обед - и вернулся через 10-15 минут: кэш протух. Весь накопленный контекст читается заново как fresh input. Стоимость: полная, без скидок.

Если такое случается 2-3 раза за сессию - расход умножается. Каждый cache miss на большой контекст стоит как новая сессия. Hotspot mode показывает эти пики прямо в логе - видно где именно произошёл скачок.

Для справки: cache reads стоят 0.1x от fresh input - то есть в 10 раз дешевле. Cache creation - 1.25x. Разница между сессией с хорошим кэшем и сессией с несколькими cache miss может быть кратной.


Как ты это используешь

Несколько техник, которые работают на практике.

Следи за заполнением контекста. До 40-50% - всё нормально. После этого открывай новую сессию. Качество вырастет, расход упадёт.

Минимизируй размер tool call results. Не надо возвращать весь файл ради нескольких строк. Если можно вернуть только нужный кусок - верни кусок.

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

Переходи в новую сессию до автоматической компакции. Компакция пересоздаёт кэш - это пик. Если чувствуешь, что сессия разрослась - сам заверши раньше.

Не уходи из сессии в середине больших задач. Или завершай задачу, или явно обновляй сессию после перерыва. Cache miss на большой контекст - дорогой.

По моим замерам: минимизация tool call results даёт ~50% экономии, управление cache miss - около 70%, все техники вместе на длинных сессиях - до 90%. Цифры из моего опыта, не бенчмарки. Но порядок сходится.


Итог

Visibility - первый шаг. Пока не видишь, где деньги, - оптимизировать нечего. Hotspot mode в cc-viewer - это попытка перенести в dev workflow то, что в production давно стандарт.

Если хочешь посмотреть на реализацию - вот репо: weiesky/cc-viewer. Если сделаешь что-то похожее под свой стек - интересно было бы посмотреть на подход.