Карточка симптома
HTTP 200, empty answer
Проход размышлений съел весь бюджет генерации до первого токена ответа, и сервер отрапортовал успех, не отдав ничего; поднимите бюджет или выключите reasoning и считайте токены ответа, а не коды статуса.
- Платформа:
- Любой локальный стек
- Рантайм:
- llama.cpp server (Vulkan)
- Опубликовано:
- 02.09.2026
Что видно
Запрос завершается. Сервер стримит токены и возвращает успешный статус. Клиент не получает ни символа ответа. Отчёт выносит симптом в заголовок:
HTTP 200, empty answer
В поштучных записях качества каждый такой запрос выглядит одинаково:
nonzero reasoning characters and zero answer characters
Все привычные метрики сервинга в этот момент выглядят здоровыми. Статус
200. Время до первого токена отличное, потому что первый токен —
рассуждение. Сгенерированных токенов много, потому что модель и правда
работала. Ловит это единственный счётчик — токены ответа, те, что идут после
закрытия reasoning-блока, и почти никто его не собирает. Поле usage, где
оба счётчика сложены в одно число, прячет отказ.
Где мы это поймали
Strix Halo, llama.cpp Vulkan, запиненный digest’ом, один поток запросов, замороженные корпуса. Симптом воспроизвёлся на двух семействах моделей: Qwen3.6-35B-A3B с включённым reasoning при бюджете генерации 1024 токена и Gemma-4-26B в дефолтном режиме, на chat template, где переключателя reasoning вообще не предусмотрено. Отчёт опубликован 2026-08-14. Точная сборка рантайма и digest модели — на страницах клеймов по ссылкам ниже.
Причина
Проход размышлений и бюджет токенов делят одно окно генерации. Когда модель выдаёт reasoning-блок, она пишет его раньше ответа. Если бюджет кончается до того, как блок закрылся, генерация останавливается, и ни один токен ответа так и не появляется. Транспорт отработал, поэтому сервер рапортует успех. Отчёт называет долю отказов кривой бюджетного голодания, а не дефектом модели: доля — свойство ячейки модель × бюджет × корпус.
Лечение
Отчёт даёт две настройки и одну проверку; готовой командной строки тут нет:
- Закладывайте бюджет на рассуждения, а не только на ответ. «Окно в 1024 токена, вмещающее любой ответ нашего корпуса, почти не вмещает пару „рассуждения + ответ“». Выставляйте бюджет генерации под пару целиком.
- Или выключайте reasoning для повседневного трафика. На коробке со Strix Halo отключение reasoning-блока срезало ожидание первого ответа с десятков секунд до значения на странице клейма, а доля успешных задач на этих ворклоадах не изменилась. Парные ячейки — в сравнении цены reasoning.
- Мониторьте токены ответа. Считайте токены после закрытия reasoning-блока, а пустой ответ засчитывайте как отказ, даже когда транспорт отработал успешно. Поэтому наш харнесс считает TTFA отдельно от TTFT и оставляет answerless-запросы в знаменателе.
Открыто ли апстрим?
Мы не отслеживаем. Ни один из источников не называет upstream-issue; отчёт относит долю отказов к бюджетному голоданию, а не к дефекту рантайма или модели.
Доказательства
- Отчёт: HTTP 200 и пустой ответ: режим отказа, которого не видит ваш мониторинг
- Глоссарий: запрос без ответа (answerless)
- Страницы клеймов: доля answerless у Qwen3.6 на протестированном бюджете, доля answerless у Gemma-4 в дефолтном режиме
- Поштучные записи качества: botAGI/agmind-lab
- Связанная конфигурация: Strix Halo × llama.cpp Vulkan × Qwen3.6-35B-A3B
- Связанный симптом: поток размышлений стартует сразу, ответ приходит поздно или никогда
Источники
- HTTP 200 и пустой ответ: режим отказа, которого не видит ваш мониторинг · /reports/answerless-http-200/
- /glossary/#answerless-request
Эта карточка описывает один сбой, пойманный на собственном железе лаборатории; цифры, если они есть, живут на странице-источнике по ссылке, а не здесь.