Карточка симптома

thinking stream starts immediately — it is just not addressed to the user

Первый токен в стриме — reasoning-блок модели, а не ответ: time-to-first-token выглядит мгновенным, а ответ начинается поздно или никогда. Засекайте время до первого токена ответа на клиенте, считайте пустые ответы отказами, выключайте reasoning там, где ворклоад позволяет.

Платформа:
Любой локальный стек
Рантайм:
llama.cpp server (Vulkan)
Опубликовано:
02.09.2026

Что видно

Думающая модель за стриминговым chat-эндпоинтом. Первый токен приходит сразу, только стримится не ответ, а reasoning-блок. Ответ начинается сильно позже; при маленьком бюджете токенов он часто не начинается вовсе, и запрос завершается успешным статусом с пустым полем ответа. Два отчёта укладывают симптом в три фразы:

thinking stream starts immediately — it is just not addressed to the user
The user watches tokens stream for that entire time — they are the model thinking out loud, not the reply.
the caller gets HTTP 200 and an empty string

Где мы это поймали

Причина

Модель пишет reasoning-блок раньше ответа, и стрим начинается с него, так что первый токен, чем бы он ни был, приходит в один и тот же момент, ответит коробка сразу или не ответит вовсе. Первый токен ответа появляется только после закрытия блока. Если бюджета меньше, чем нужно проходу размышлений, размышления съедают его целиком ещё до начала ответа, эндпоинт возвращает успех с пустым ответом, а проверка по коду статуса засчитывает это как успех. Серверный замер прячет всё это.

Лечение

Засекайте на клиенте время до первого токена ответа. Время до первого токена, каким бы он ни был, для думающей модели — непригодная цифра.

Считайте пустые ответы отказами: и в доле ошибок, и в знаменателе любой статистики по задержкам. От бюджета токенов зависит корректность ответа; если reasoning остаётся включённым, закладывайте в бюджет проход размышлений.

Выключайте reasoning там, где ворклоад позволяет. На нашей коробке его отключили через chat template; страницы-источники называют настройку, а не флаг. Проверяйте по работающему серверу, а не по документации: спросите у него, какой шаблон и какие настройки он фактически применил, затем отправьте один запрос и посмотрите, появляется ли reasoning-блок. С выключенным reasoning ответ начинался вместе со стримом и по-прежнему проходил гейты языка и повторов; гейт бюджета слов он проваливал в каждом режиме, с reasoning и без, и отчёт относит это к многословности модели, а не к переключателю. На повседневном чате и strict-JSON-автоматизации reasoning не принёс ничего, что смогли бы обнаружить наши гейты; по-настоящему сложные многошаговые задачи в наши корпуса не входят — мы их не проверяли.

Открыто ли апстрим?

Мы не отслеживаем. Страницы-источники не называют upstream-issue; дефект в метрике, а не в рантайме.

Доказательства

Источники

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

← Все карточки симптомов