fn reasoning_templates() -> Vec<InferenceProfile>Expand description
One template per rung of the ReasoningEffort ladder.
§Why each rung sets both controls
reasoning_effort is a string a chat template may read at render time —
and may equally ignore, in perfect silence (ADR 0007 finding 3). A profile
that carried only the effort level would therefore do nothing at all on
such a model, while reading in gglib config profile show as though it
had. Pairing it with reasoning_budget_tokens — which llama.cpp itself
enforces, whatever the template does — means the rung degrades to a
narrower promise rather than to no promise: on a template that reads the
variable the user gets both, and on one that does not they still get a
thinking cap they chose.
§The budget ladder, and why these numbers
| profile | effort | budget | what the budget is for |
|---|---|---|---|
minimal | minimal | 256 | a sentence or two of scratch work — an answer, not a deliberation |
low | low | 1024 | one short chain; enough to check an assumption |
medium | medium | 4096 | the middle rung, and roughly what an untouched gpt-oss turn spends |
high | high | 16384 | multi-step work where the thinking is the point |
xhigh | xhigh | 32768 | long deliberation, still bounded so a loop terminates |
max | max | -1 | defer to the launch-time --reasoning-budget |
Roughly a quadrupling per rung to 16384 and a doubling after, because the
levels are not linear either: nothing in llama.cpp compares them and a
template is free to treat two of them identically, so the ladder is spaced
widely enough that adjacent rungs are distinguishable in practice rather
than finely enough to imply a precision that does not exist. Nothing is
measured here — these are starting points a user edits, and the one
number that is not a guess is max’s -1, which declines to invent a
ceiling and leaves the operator’s own launch default in charge.
§Only three are listed
Six listed variants per model would swamp the very model picker
InferenceProfile::list_in_models exists to protect, so low, high
and max — the ends and a usable middle — are the visible ones. The other
three stay fully usable by name as <model>:minimal and friends.