Summary
stealth/ox-alpha returns observable reasoning content through the raw Chat
Completions API, but reports completion_tokens_details.reasoning_tokens: 0.
The same zero appears in generation metadata as native_tokens_reasoning: 0.
This is reproducible with direct HTTP in both streaming and non-streaming mode;
no SDK or framework translation is involved.
Reproduction
curl https://openrouter.ai/api/v1/chat/completions \
-H "Authorization: Bearer $OPENROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "stealth/ox-alpha",
"messages": [{"role": "user", "content": "What is 17 * 23? Reply with only the number."}],
"stream": false
}'
Inspect both the assistant reasoning fields and:
usage.completion_tokens_details.reasoning_tokens
For streaming, use "stream": true and
"stream_options": {"include_usage": true}. Reasoning deltas arrive before
the final usage chunk, whose reasoning counter is still zero.
Observed
On 2026-08-22, a streaming request returned:
- 128 non-empty reasoning deltas
- 134 prompt tokens
- 688 completion tokens
- 822 total tokens
completion_tokens_details.reasoning_tokens: 0
- upstream provider
Stealth
An independent non-streaming control also returned non-empty reasoning and a
reasoning.text detail while reporting 0 reasoning tokens. Generation metadata
for tested responses likewise reported native_tokens_reasoning: 0 despite the
reasoning output.
The response's total and completion token counts appear internally consistent;
the problem is specifically the reasoning breakdown being represented as an
exact zero even though reasoning was emitted.
Expected
If the upstream route can supply the breakdown,
completion_tokens_details.reasoning_tokens and
native_tokens_reasoning should contain the actual nonzero count.
If the route cannot supply it, the API should expose that the breakdown is
unavailable (for example, omit it, return null, or provide an explicit
availability flag) rather than return an indistinguishable exact zero. The
documented caveat that some models/providers do not return reasoning-token
counts would be much easier for clients to handle with a machine-readable
signal.
Impact
Clients cannot distinguish "no reasoning occurred" from "reasoning occurred but
the provider supplied no count." This makes reasoning-aware usage accounting,
cost attribution, and visible-output throughput measurements unreliable for
this model/route. Agent runtimes must observe reasoning content separately and
treat the reported zero as only a lower bound.
Summary
stealth/ox-alphareturns observable reasoning content through the raw ChatCompletions API, but reports
completion_tokens_details.reasoning_tokens: 0.The same zero appears in generation metadata as
native_tokens_reasoning: 0.This is reproducible with direct HTTP in both streaming and non-streaming mode;
no SDK or framework translation is involved.
Reproduction
Inspect both the assistant reasoning fields and:
For streaming, use
"stream": trueand"stream_options": {"include_usage": true}. Reasoning deltas arrive beforethe final usage chunk, whose reasoning counter is still zero.
Observed
On 2026-08-22, a streaming request returned:
completion_tokens_details.reasoning_tokens: 0StealthAn independent non-streaming control also returned non-empty reasoning and a
reasoning.textdetail while reporting 0 reasoning tokens. Generation metadatafor tested responses likewise reported
native_tokens_reasoning: 0despite thereasoning output.
The response's total and completion token counts appear internally consistent;
the problem is specifically the reasoning breakdown being represented as an
exact zero even though reasoning was emitted.
Expected
If the upstream route can supply the breakdown,
completion_tokens_details.reasoning_tokensandnative_tokens_reasoningshould contain the actual nonzero count.If the route cannot supply it, the API should expose that the breakdown is
unavailable (for example, omit it, return
null, or provide an explicitavailability flag) rather than return an indistinguishable exact zero. The
documented caveat that some models/providers do not return reasoning-token
counts would be much easier for clients to handle with a machine-readable
signal.
Impact
Clients cannot distinguish "no reasoning occurred" from "reasoning occurred but
the provider supplied no count." This makes reasoning-aware usage accounting,
cost attribution, and visible-output throughput measurements unreliable for
this model/route. Agent runtimes must observe reasoning content separately and
treat the reported zero as only a lower bound.