Symptom card

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

The first streamed token is the model's reasoning block, not the reply, so time-to-first-token looks instant while the answer starts late or never; clock time to first answer token client-side, count empty answers as failures, switch reasoning off where the workload allows.

Platform:
Any local stack
Runtime:
llama.cpp server (Vulkan)
Published:
9/2/2026

What you see

A reasoning model behind a streaming chat endpoint. The first token arrives at once, but what streams is the reasoning block. The reply begins much later; on a small token budget it often never begins, and the request ends with a success status and an empty answer field. The two reports put the observable in three sentences:

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

Where we saw it

Cause

The model writes a reasoning block before the answer and the stream starts with it, so the first token of anything lands at the same moment whether the box answers at once or never. The answer’s first token comes only after the block ends. Below the budget the reasoning pass needs, it eats the whole budget before the answer begins and the endpoint returns success with an empty answer, which a status-code check records as a success. Server-side timing hides all of it.

Fix

Clock time to first answer token, client-side. Time to first token of anything is not a usable number for a reasoning model.

Count empty answers as failures, in the error rate and in the denominator of every latency statistic. The token budget is a correctness setting; if reasoning stays on, budget for the pass.

Switch reasoning off where the workload allows. On our box it was disabled via the chat template; the source pages name the setting, not the flag. Verify against the running server, not the docs: ask it what template and settings it resolved, then send one request and check whether a reasoning block appears. Off, the answer started with the stream and still passed the language and repetition gates; the word-budget gate failed in every setting, on or off, which the report attributes to the model’s verbosity, not the toggle. On everyday chat and strict-JSON automation reasoning bought nothing our gates could detect; hard multi-step problems are outside our corpora, untested by us.

Still open upstream?

Not tracked by us. The source pages name no upstream issue; the fault is in the metric, not the runtime.

Evidence

Sources

This card documents one failure observed on the lab’s own hardware; any numbers live on the linked source page, not here.

← All symptom cards