OMP token usage audit

Почему одна сессия съела так много токенов

Сессия проекта TasK / codexcli, модель glm-5.2. Период активности: 2026-08-12 19:582026-08-13 21:45 (Asia/Novosibirsk). Отчёт построен по одному зафиксированному JSONL-снимку; сырые промпты, код, локальные пути и результаты production-запросов намеренно не встраиваются.

Главный вывод: длинный живущий контекст, а не output, стал основным источником расхода.

Raw total
104.57M
input + cacheRead + output по usage
Стоимость OMP
$30.41
встроенная оценка usage; не фактический счёт подписки
Ответы модели
404
399 с ненулевым usage
Tool calls
444
bash / read / edit / grep и другие

Состав расхода

cacheRead 97.9% · 102.39Mfresh input 1.9% · 1.95Moutput 0.2% · 241.2K

Длина контекста

Средний raw расход на ответ вырос с 57.9K в первых 25 ответах до 396.4K в последних 104 — в 6.8×.

Медиана ответа: 258.2K; p90: 415.7K; максимум: 438.5K.

Время и паузы

Календарная длительность — 25.8 ч, суммарное время ответа модели — 1.69 ч.

Это не означает непрерывную работу: сессия возобновлялась после длительных пауз, а ожидание пользователя в active time не включено.

Наблюдение: что именно раздувало расход

97.9% raw tokens — это cacheRead. Кэш снижает цену единицы входного контекста, но не отменяет того, что на каждом следующем вызове модели повторно учитывается уже накопленная история. При 404 ответах контекст дошёл примерно до 438.5K токенов на вызов.

Рост расхода по окнам

ОкноОтветовRawСреднееCacheFresh + out
Первые 25 ответов251.45M57.9K1.35M94.5K
26–100759.91M132.1K9.77M135.2K
101–20010022.23M222.3K22.09M143.3K
201–30010029.77M297.7K29.25M519.9K
Последние 10410441.22M396.4K39.93M1.30M

Сегменты пользовательской работы

Границы — пользовательские продолжения. Названия фаз — аналитическая классификация; тексты запросов не публикуются.

Запуск работы по epic и первичная реализация2026-08-12 19:58
21.08M raw · 149 ответов · 197 tool calls20.2%
Подготовка PR по задаче2026-08-12 20:57
15.40M raw · 62 ответов · 64 tool calls14.7%
Сбор production-доказательств2026-08-12 21:16
6.97M raw · 26 ответов · 25 tool calls6.7%
Уточнение топологии окружения2026-08-12 21:22
3.23M raw · 12 ответов · 11 tool calls3.1%
Продолжение после уточнения2026-08-12 22:12
3.67M raw · 12 ответов · 11 tool calls3.5%
Проверка глобальной конфигурации и БД2026-08-12 22:39
1.25M raw · 4 ответов · 3 tool calls1.2%
Пояснение продуктовых гейтов U1–U42026-08-12 23:10
954.0K raw · 3 ответов · 2 tool calls0.9%
Продолжение и проверка выводов2026-08-12 23:27
6.12M raw · 19 ответов · 18 tool calls5.9%
Проверка системной конфигурации2026-08-13 00:00
1.78M raw · 5 ответов · 4 tool calls1.7%
Обсуждение безопасного изменения и релиза2026-08-13 10:20
2.90M raw · 8 ответов · 7 tool calls2.8%
Сведение PR по epic2026-08-13 16:12
739.0K raw · 3 ответов · 2 tool calls0.7%
Спор о границе одного PR2026-08-13 16:23
12.26M raw · 32 ответов · 31 tool calls11.7%
Рефакторинг шаблона маршрута и тесты2026-08-13 18:25
19.94M raw · 49 ответов · 51 tool calls19.1%
Финальная проверка тестов2026-08-13 21:17
8.24M raw · 19 ответов · 18 tool calls7.9%
Фаза 152026-08-13 21:45
44.1K raw · 1 ответов · 0 tool calls0.0%

Инструменты и объём возвращаемых данных

В журнале зафиксировано 444 вызовов инструментов. Таблица показывает размер текста tool result в символах, а не токенах; это независимый индикатор того, какие операции наполняли контекст.

ИнструментВызововТекст результатаМакс. одинMeta/details
read99294 85926 132377 518
grep19125 59417 346161 352
bash201122 9394 13811 712
edit6633 1971 410613 546
glob1723 4909 77940 639
todo1819 6671 85519 721
ask72 2021 6133 706
write121 6572431 048
eval57033206 487
87.0% текста tool results дали read, grep и bash. В том числе встречались большие результаты поиска/чтения по широким деревьям и vendor/source-map материалам. Это не доказывает причинность каждого вызова, но указывает на первую точку оптимизации: ограничивать scope и размер вывода до передачи его модели.

Инвентарь OMP tools

Зафиксированы фактические tool calls ассистента. Всего: 444.

ToolВызовов
bash201
read99
edit66
grep19
todo18
glob17
write12
ask7
eval5

CLI-утилиты

Команды в позициях запуска внутри вызовов bash. Счётчик консервативный: вложенные удалённые команды и текст grep не считаются.

УтилитаЗапусков
tail117
head111
git86
grep78
make52
ssh43
docker17
php17
sed10
gh10
ls9
phpunit7
find7
scp5
sleep3
node2
wc2
cat2
getent2
podman1
date1
readlink1
which1
bun1
nslookup1
cut1
phpcbf1
awk1

Файлы и фрагменты, попавшие в контекст

Что показано: только содержательные файловые targets из 99 вызовов read. Найдено 104 targets из результатов чтения.

Таблица перечисляет полные относительные пути, число наблюдений, примерный диапазон строк и объём отображённого текста в символах. Число targets может быть больше числа read-вызовов, если один вызов вернул несколько файлов. Это не точная токенизация контекста: пропуски и обрезка обозначены явно.

ФайлTargetsФрагменты / строкиСимволов
src/Module/Chat/Application/UseCase/Command/ChatMessage/Send/SendCommandHandler.php74–551 (несколько окон); с пропусками/обрезкой30 590
tests/Unit/Module/Chat/Application/UseCase/Command/ChatMessage/Send/SendCommandHandlerTest.php61–813 (несколько окон); с пропусками/обрезкой24 160
todo/EPIC-chat-quality-reliability.todo.md51–128 (несколько окон); с пропусками/обрезкой19 633
apps/web/src/Module/Chat/Controller/ChatMessage/CreateController.php474–104 (несколько окон); с пропусками/обрезкой3 068
apps/web/assets/controllers/chat/_messageSender.js312–207 (несколько окон); с пропусками/обрезкой10 768
apps/web/tests/E2E/Module/Chat/ChatSendErrorStateTest.php321–204 (несколько окон); с пропусками/обрезкой7 191
src/Module/Chat/Domain/Entity/ChatMessageModel.php325–200 (несколько окон); с пропусками/обрезкой7 155
todo/TASK-chat-citation-document-markdown-html.todo.md31–113; с пропусками/обрезкой7 131
tests/Integration/Module/Chat/Application/UseCase/Command/ChatMessage/Create/CreateCommandHandlerTest.php338–382 (несколько окон); с пропусками/обрезкой6 022
apps/web/src/Module/Chat/Resource/templates/chat-message/_message_user.html.twig31–62 (несколько окон)5 585
apps/web/src/Module/Chat/Controller/ChatMessage/ShowController.php31–81 (несколько окон); с пропусками/обрезкой4 453
apps/web/src/Module/Chat/Controller/ChatMessage/EditController.php320–117 (несколько окон); с пропусками/обрезкой1 970
todo/TASK-chat-message-processing-error-state.todo.md21–118; с пропусками/обрезкой8 208
todo/TASK-chat-response-prompt-contract.todo.md21–120 (несколько окон); с пропусками/обрезкой7 830
apps/web/assets/controllers/chat_message/send_controller.js218–124; с пропусками/обрезкой4 406
devops/make/tests.mk225–53; с пропусками/обрезкой4 320
apps/web/src/Module/Chat/Controller/ChatMessage/Presenter/ChatErrorPayloadBuilder.php235–154; с пропусками/обрезкой4 179
src/Module/Chat/Application/Mapper/ChatMessageDtoMapper.php21–52 (несколько окон); с пропусками/обрезкой3 553
apps/web/src/Module/Chat/Controller/ChatMessage/Presenter/StreamedPresenter.php233–83; с пропусками/обрезкой3 508
apps/web/src/Module/Chat/Controller/ChatMessage/ViewController.php21–55 (несколько окон)3 135
src/Module/Chat/Application/Dto/ChatMessageDto.php21–42 (несколько окон); с пропусками/обрезкой1 748
docs/architecture/infrastructure-containers.md11–19311 359
apps/web/src/Module/Chat/Resource/templates/chat-message/citation/document_context.html.twig11–1168 277
devops/make/compose.mk11–1624 725
apps/web/src/Module/Chat/Controller/ChatMessage/Citation/DocumentContextController.php11–823 226
docs/agents/roles/team/team_lead_aragorn.ru.md11–493 073
apps/web/src/Module/Billing/Route/TBusinessPaymentRoute.php11–732 988
tests/Unit/Module/Chat/Application/Mapper/ChatMessageDtoMapperTest.php11–662 757
apps/web/src/Module/Chat/Controller/ChatMessage/SendController.php11–612 237
apps/web/src/Module/Chat/Controller/ChatMessage/Citation/Presenter/DocumentContextPresenter.php1метаданные/сводка; с пропусками/обрезкой2 185
src/Module/Chat/Infrastructure/Service/ChatRender/ChatRendererAsHtmlService.php11–602 158
tests/Unit/Module/Chat/Domain/Entity/ChatMessageModelTest.php11–621 998
src/Component/Test/IntegrationTestCase.php11–641 988
apps/web/assets/controllers/chat/_showChatError.js1метаданные/сводка; с пропусками/обрезкой1 982
devops/make/e2e.mk182–1181 740
src/Module/Chat/Application/Factory/ChatPreconditionExceptionFactory.php11–521 723
apps/web/tests/Support/Trait/ChatMessageModelTrait.php11–611 698
migrations/2026/08/Version20260802035943.php11–401 585
apps/web/tests/Support/Stub/Module/Chat/Controller/ChatMessage/Presenter/StreamedPresenterStub.php11–471 570
apps/web/tests/Integration/Module/Chat/Controller/ChatMessage/SendControllerTest.php1метаданные/сводка; с пропусками/обрезкой1 448
удалённый prompt-файл (путь скрыт)11–231 330
todo/TASK-chat-agent-run-lifecycle.todo.md178–107; с пропусками/обрезкой1 249
src/Module/Chat/Application/UseCase/Query/ChatMessage/GetById/GetByIdQueryHandler.php11–361 214
Makefile1179–1991 186
src/Module/Chat/Application/Exception/ChatPreconditionException.php11–481 043
apps/web/src/Module/Chat/Controller/ChatMessage/AskController.php128–179; с пропусками/обрезкой1 033
src/Infrastructure/Component/CommandBus/CommandBusComponent.php11–341 000
apps/web/tests/Integration/Module/Chat/Controller/ChatMessage/ShowControllerTest.php119–52; с пропусками/обрезкой983
src/Component/Test/KernelTestCase.php11–31923
tests/Integration/Module/Chat/Application/UseCase/Command/ChatMessage/Send/SendCommandHandlerTest.php113–25753
apps/web/src/Module/Chat/Controller/ChatMessage/Presenter/StreamedPresenterInterface.php11–18489
.env1430–438418
src/Module/Chat/Application/Exception/UserFacingChatExceptionInterface.php11–19369
apps/web/src/Module/Chat/Resource/templates/chat-message/_turbo_frame_messages.html.twig11–9330
apps/web/src/Module/Chat/Resource/templates/chat-message/_messages.html.twig11–7268
reports/chat-quality-evidence/README.md1метаданные/сводка0
reports/chat-quality-evidence/U1-C1.md1метаданные/сводка0
reports/chat-quality-evidence/U2-C1.md1метаданные/сводка0
reports/chat-quality-evidence/U3-C2.md1метаданные/сводка0
reports/chat-quality-evidence/U4-C1.md1метаданные/сводка0
src/Module/Chat/Application/UseCase/Query/ChatMessage/GetById1метаданные/сводка0

Методика: результаты grep и glob намеренно не включены в эту таблицу: они отражали поиск/перечень путей, а не прочитанные файловые фрагменты. Тексты кода, промптов и конфигурации в отчёт не копируются; содержимое .env и удалённого prompt-файла исключено.

Ошибки, тупики и лишний контекст

Да, в сессии были неверные ходы, которые раздували контекст. Зафиксировано 9 явных ошибок toolResult с isError=true; кроме них были неудачные тестовые и инфраструктурные команды, часть которых скрывала ненулевой exit code из-за shell-пайплайнов.
Тело tool results
624 308
символов, без meta/details
read + grep + bash
87.0%
доля тела результатов
Edit meta/details
613 546
служебный объём протокола

Самые затратные по объёму участки — начальная реализация и поздний рефакторинг маршрута: вместе они дали около 72.9% всего tool-result body + details. Это не точная токенизация, а оценка объёма транскрипта; tool-output символы не равны usage tokens.

ЭпизодНаблюдениеВлияние на расход / ход работы
Широкий поискВ нескольких местах использовались широкие glob/grep-scope по дереву приложения, включая vendor, source maps и большие каталоги.В модель попадали большие списки кандидатов и повторяющиеся совпадения; полезный scope сужался поздно.
Неверная гипотезаДля задачи подсветки сначала разбиралась сложная схема offsets → DOM; позже выяснилось, что нужная сегментная логика уже была в коде.Лишние чтения и обсуждение; отдельная задача была отменена без изменения кода.
Разведка окруженияСначала проверялись внешние хосты, IP и порты; после уточнения использовались локальные aserv/nserv.Порядка 25 bash-проверок и их выводов оказались нерелевантными для локального сценария.
Цепочка редактированияАвтоматические последовательные правки временно повредили контроллеры: терялись queryBus/messages/import, появлялся дублирующий маршрут.Интеграционные тесты проходили через 8 → 5 → 2 ошибки; потребовались повторные чтения и восстановление.
Проверки shellЧасть команд завершалась диагностикой внутри tail/grep-пайплайнов, скрывавших исходный exit code.Ошибка обнаруживалась позднее и требовала повторного запуска с явной проверкой статуса.
Ошибки инструментовВ snapshot зафиксировано 9 toolResult с isError=true: неверные пути, stale hash/conflict, невалидный ask, неудачные edit/write и один неоткрывшийся PHP-файл.Повторные read/edit/ask и дополнительные циклы диагностики.
Неуспешные проверкиПомимо isError были несовместимый конструктор в unit-тесте, отсутствующая DB-колонка/fixture, ошибки E2E, DI/Twig/import и удалённый доступ; в конце проверки были исправлены.Раздувание поздней фазы: не только исправление, но и повторная проверка после каждого промежуточного регресса.

Вывод: основной резерв — начинать с узкого scope, не проверять удалённую инфраструктуру до подтверждения топологии, читать файл перед edit/write и отделять исправление от независимой проверки. Таблица файлов выше по-прежнему содержит только targets из read; grep/glob здесь упоминаются как источники лишнего tool output, но не считаются прочитанными файлами.

Сабагенты и skills

Сабагенты: не запускались.
В tool payload не найдено вызовов subagent, spawn или delegate. Количество: 0.
Skills: не вызывались.
Загрузок SKILL.md или tool calls навыков не найдено. Упоминания слова «skill» внутри прочитанных файлов не считаются вызовом.

Технические сигналы

  • Модель/provider: glm-5.2 / zai во всех ответах с usage.
  • Распределение остановок: toolUse 387stop 12aborted 2error 3.
  • В 15 пользовательских продолжениях — в среднем 26.9 ответа модели на одно продолжение.
  • Наблюдался отдельный ответ после долгой паузы с 415.8K свежего input; точную внутреннюю причину реконструкции контекста по журналу утверждать нельзя.

Что не следует заключать

  • 97.9% cacheRead не означает 97.9% бесполезного расхода: кэш — механизм переиспользования и обычно дешевле свежего input.
  • Raw total нельзя напрямую трактовать как фактическую сумму по подписке; $30.41 — значение cost из OMP usage.
  • Количество tool calls само по себе не измеряет результативность. Для эффективности нужны принятые изменения, тесты и качество результата.
  • Причину одного конкретного запроса нельзя доказать только агрегированными счётчиками; выводы выше — наблюдения и операционные гипотезы.

Рекомендации для следующего запуска

1. Разделять по логическим задачам

Один epic, PR-консолидация, production-evidence и последующий рефакторинг — отдельные сессии с коротким handoff. В этой сессии на первые и последние крупные фазы пришлось 39.2% raw расхода.

2. Перезапускать сессию при росте контекста

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

3. Ограничивать чтение и поиск

Для read/grep задавать узкий путь, лимит строк и исключения для vendor, map, cache и generated файлов. Сначала получать структуру/символы, затем читать только нужные фрагменты.

4. Собирать production-факты отдельно

Сходить за данными, вернуть компактную таблицу с периодом и запросом, затем продолжить в свежем контексте. Не таскать полные ответы инфраструктурных команд через весь epic.

Методика и воспроизводимость