74cda485e53eed32e9df2d30f41434816debfa11
A `thinking` param on the llama driver: "auto", "off", or a level, applied as a chat-template argument on the next request -- `reasoning_effort`, or `enable_thinking: false` for off -- so unlike the server flags it costs no reload. It lands in the session settings dialog beside the other model settings, which is what declaring it in `DriverKind::params` buys. Which levels exist is the model's answer rather than a constant, because the vocabularies disagree: the 27B here takes low, medium and xhigh and **raises** on high and max, so a fixed list is a turn that fails on send. The driver asks the loaded server (`thinking_options`) -- `chat_template_caps. supports_reasoning_effort` for whether levels mean anything at all, which is the gate that stops the control silently doing nothing on a template that ignores the argument, then `/apply-template` per level, one cheap render each at load time. Off is a separate argument and a separate question: honoured when turning it off renders a different prompt, and both renders have to have worked, since a template that refuses it also renders differently. A level the loaded model cannot take is dropped from the request and said in the transcript, naming what it does take. What is *not* said is anything about a model nobody has asked yet: the answer is `Option<Vec<String>>`, where None is "no server has been up" and an empty list is the model that genuinely takes none. Verified against the 27B on the GPU: "low" thought for 697ms and 79 characters, "off" produced no thinking block at all, and "high" answered `this model does not take "high" -- it takes off, low, medium, xhigh.` The picker wraps to two rows in the settings dialog and shows the session's current value. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Languages
Rust
53%
Kotlin
44.4%
Shell
2.6%