## Summary
Thinking mode currently only works on the KServe `:predict` endpoint via the `reasoning` flag. The OpenAI chat completions endpoint always disables it, and when enabled the `<think>` trace comes back inline in the text instead of a separate field.
## Technical notes
`apply_chat_template()` in the model server hardcodes `enable_thinking=False` — we could support vLLM's `chat_template_kwargs` to toggle it per request. The engine already sets `reasoning_parser="qwen3"` but that only applies in vLLM's own OpenAI serving layer, so we need to split the `<think>` block ourselves when building the response.
We should also expose vLLM's per-request `thinking_token_budget` ([see docs](https://docs.vllm.ai/en/stable/features/reasoning_outputs/#thinking-budget-control)), promised to the PSI team in T433470#12202348.
## Acceptance criteria
- [x] Thinking mode can be toggled per request on the OpenAI chat completions endpoint
- [x] The thinking trace is returned as a separate field (`reasoning`) instead of inline text
- [ ] `thinking_token_budget` can be set per request