[bug][ai-chat] Счётчик токенов в шапке не тикает в реальном времени между шагами агента (регрессия #151) #163
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Симптом
Счётчик токенов в шапке окна AI-чата (бейдж «Tokens generated this turn», напр.
571) не тикает в реальном времени во время многошагового ответа агента. Он замирает и прыгает скачками, а не растёт плавно. Та же проблема замораживает нижнюю строкуThinking… · N tokens, как только у хода появилась авторитетная статистика usage.Регрессия/недоделка фичи #151 (реалтайм-счётчик токенов).
Воспроизведение
Ожидается: счётчик плавно растёт по мере генерации (как
Thinking… · N tokensв Claude Code).По факту: счётчик «висит» на значении границы предыдущего шага и подскакивает скачком только на границе следующего шага.
Причина
Вся арифметика — в
apps/client/src/features/ai-chat/utils/count-stream-tokens.ts, функцияliveTurnTokens():Сервер шлёт точные
usageне на каждый токен, а только на границах шагов агента —messageMetadataнаfinish-step/finish(apps/server/src/core/ai-chat/ai-chat.service.ts, ~539-547). КлиентскийuseChatмёржит метаданные заменой.Поэтому в многошаговом ходе:
usageещё нет → работает ветка оценки → счётчик тикает.finish-stepшага 1 →message.metadata.usageзаполнено → функция уходит в авторитетную ветку и возвращает значение как есть.usageвсё ещё равно значению после шага 1, новыйfinish-stepбудет только в конце шага → функция возвращает замороженное число, оценку живого незавершённого шага не прибавляет.Итог: счётчик прыгает скачками на границах шагов и «висит» между ними.
При этом намерение в комментариях кода правильно�� — «estimate while streaming, authoritative once a step reports usage, accumulate across steps» — но авторитетное и оценочное так и не объединены.
Предлагаемое решение
Объединить оба источника покомпонентно через
max: авторитетная сумма по завершённым шагам подпирается оценкой текущего шага, берётся бо́льшее.Свойства решения:
reasoning-компонент тикает через оценку,outputдержится на авторитетной базе → сумма в бейдже плавно растёт между шагами; строкаThinking…снова тикает.max+ сервер шлёт накопительное значение → счётчик никогда не прыгает вниз (это явная цель в комментарии сервера).finish-stepавторитетное подскакивает к настоящему; наfinishход заканчивается, бейдж штатно возвращается кcontextTokens.reasoningTokens, авторитетное число по-прежнему показывается (max(authoritative, 0)).count-stream-tokens.test.ts,tail-thinking-tokens.test.ts) оценка меньше авторитетного значения, поэтомуmaxвозвращает то же самое — они продолжат проходить. Нужно добавить новые тесты на кейс «оценка текущего шага превышает авторитетную базу → значение растёт».Затронутые файлы
apps/client/src/features/ai-chat/utils/count-stream-tokens.ts— правкаliveTurnTokens()(+ комментарии).apps/client/src/features/ai-chat/utils/count-stream-tokens.test.ts— новые тесты на комбинацию авторитетного и оценки.Файлы
chat-thread.tsx,ai-chat-window.tsx,message-list.tsxменять не нужно — они уже используютliveTurnTokensкорректно.Ghost referenced this issue2026-06-25 11:11:27 +03:00
Ghost referenced this issue2026-06-25 11:38:57 +03:00
Ghost referenced this issue2026-06-25 12:08:58 +03:00
Ghost referenced this issue2026-06-25 22:15:01 +03:00