Reasoning efforts this model accepts
{% for value in efforts %}
{{ value }}
{% endfor %}
{% if detected %}
{{ icon('sparkle' if detected == 'success' else 'warning', 'alert__icon') }}
{{ detected_message }}
{% endif %}
{#
Reading the answer rather than asking somebody to know it. llama-server
publishes the loaded model's Jinja chat template on `/props`, and that
template is the thing that rejects an effort it does not recognise --
so the accepted set is written down in the one authoritative place.
Endpoints without that route (OpenAI, vLLM) say so rather than
pretending the model accepts nothing.
Its own form, because this page's main form is a PUT of everything and
a detect must not carry half-edited fields with it — and that form is
declared before the main one rather than here, with this button reaching
it by id.
🚨 It was written inline here, nested inside the main form, which HTML
does not allow. Nothing complains: the parser *drops* the inner `form`
start tag and then lets the matching end tag close the outer one — so
from this point down the page was in no form at all. "Save changes"
submitted nothing; the description, the system prompt, every capability
and the whole availability card could not be saved. And this button
submitted the main form's surviving half to the *save* route, where every
field it did not carry took its default: description cleared, system
prompt cleared, and the model disabled with all of its tools off.
Shipped in 1.3.0 and found in 1.3.2 by asking a browser which form each
control belonged to, which is the only thing that finds it — the markup
reads correctly, and a test posting to the route bypasses the parser
entirely. `tests/test_form_structure.py` is the guard.
#}
{{ icon('search', 'icon--sm') }} Detect from the endpoint
The vocabulary is not the same for every model , and
sending one a model does not know is not ignored — it is rendered into
the model's chat template, which raises and fails the whole reply.
gpt-oss takes low/medium/high ; Bonsai takes
low/medium/xhigh and refuses
high ; OpenAI has added
minimal , xhigh and
max at various points.
Tick none and the common three are offered, which is right for almost
everything. If an endpoint ever refuses one anyway, that reply is
retried without it and this list corrects itself — so this is worth
setting by hand only to save that one round trip.
Default reasoning effort
None — send nothing
{% for value in model_efforts %}
{{ value }}
{% endfor %}
A seed , not a per-request setting: it is copied onto a chat when
the chat is created and when somebody switches to this model, and from
then on the chat's own value is what is sent. Changing it here therefore
does nothing to chats that already exist. The composer's picker shows
whichever level is actually in force, so what somebody sees there is
what goes out. Anyone can change it per chat with
/effort , and the control only appears on a
model marked Reasoning above.
Sent two ways at once, because there is no one field that works: OpenAI
and vLLM read reasoning_effort , while
llama.cpp drops it silently and reads only
chat_template_kwargs — which is the route by
which it reaches gpt-oss. Both go out, and only on a chat that has an
effort set, so an endpoint strict about unknown parameters is untouched
until somebody chooses one.