GC
7 min read·Updated 2026-04-13

Model Routing

Pick a model per tier — four named (balanced, smart, coding, deep) plus five custom slots — and let the bot route each turn to the right one, with overrides for skills, commands, and webhooks.

What model routing does

Requires at least one model in Model Catalog

The Model Router only lets you point tiers at models that already exist in Settings → Model Catalog. If a tier dropdown is empty, add the model there first (see Quickstart for the provider → catalog → router flow).

GolemCore Bot does not pin one model to the whole runtime. Instead it picks a model for each turn from a small set of named tiers. The tiers describe what kind of work the bot is doing — quick chat, careful reasoning, code, deep analysis — and you decide which real model to point each tier at.

The win: when you want to try a new model, you change one setting in Settings → Model Router and every skill, every command, and every chat turn that asks for that tier picks it up. You never have to hunt through code or skill files.

If you followed Quickstart, you already pointed the balanced tier at one model. This page is the full picture: what the other tiers are for, how the bot chooses between them, and when to fill them in.

The four named tiers

Four named tiers cover the space of work the bot does. Most turns land on balanced; the others kick in when a skill, a command, or the bot itself asks for them.

balanced

General chat and ordinary tasks. The fallback when nothing else is requested. Cheap and fast — target a mid-sized general model. Most turns land here.

Default

smart

Multi-step reasoning, planning, cross-file thinking. Costs more per turn — target a reasoning-tuned model. Used when balanced would not be enough.

Reasoning

coding

Code generation, refactoring, debugging. Point at a code-specialized model when one is available; otherwise reuse your balanced model.

Code

deep

Long, careful analysis. Research-style problems and tasks that benefit from extended thinking. The most expensive tier — leave blank until you have a concrete use case.

Analysis

Special slots (special1–special5)

On top of the four named tiers, the router exposes five extra slots: special1, special2, special3, special4, special5. They behave exactly like the named tiers — you set them in Settings → Model Router, skills can reference them, and the /tier command accepts them — but they carry no semantic meaning, so the bot never auto-picks a special slot. It uses one only when something explicitly asks for it.

Their purpose is to hold specialized models that you want to reserve for specific flows — skills, webhooks, scheduled automations, and other special cases. That is the canonical use. Typical examples:

  • A skill that needs a specific model regardless of your global setup — declare model_tier: special1 in its frontmatter and pin special1 to that model.
  • A webhook mapping that must run on a specific model for cost or compliance reasons.
  • A second provider running in parallel with your primary one, for A/B comparison or fallback during an outage.

Nothing stops you from using a special slot in an ordinary chat session — type /tier special1 and the rest of your conversation will run on whatever model you pinned to that slot. But that is the exception; the canonical use is binding specialized models to specific flows.

Unset special slots fall through to balanced, same as unset named tiers.

How the bot picks a tier

Several things can ask for a tier on the same turn. The bot resolves them in this priority order — the first one that has an opinion wins:

  1. Inbound webhook override. If the turn came from a webhook whose mapping sets a tier, that wins. Relevant only if you configured a webhook; see Webhooks.
  2. Forced tier (user lock). If you ran /tier coding force or toggled Tier force in Settings, the tier is locked. Skills, the classifier, and the set_tier tool all defer to the lock until you release it.
  3. Active skill request. An active skill whose frontmatter declares model_tier: <name> gets its requested tier for as long as the skill is active.
  4. Soft preference. The /tier coding command without the force keyword is a suggestion. It loses to an active skill that asks for a different tier, but wins over the default.
  5. Default. The bot falls back to balanced.

Initial resolution happens once, on the first iteration of the turn. On subsequent iterations a separate step called dynamic upgrade can promote the turn to the coding tier if it detects code activity — filesystem operations on code files, shell commands like python/npm/mvn/cargo, or stack traces in tool output. It is a lightweight pattern match over tool calls and results (no extra model call), it only ever upgrades to coding (never smartor deep), it never downgrades, and it is skipped entirely when the tier is forced. You can turn it off in Settings → Model Router.

Dynamic upgrade requires coding to be configured

If dynamic upgrade switches the turn to coding but that tier has no model bound, the next LLM call fails with “Tier ‘coding’ is not configured”. Either bind a model to coding or turn dynamic upgrade off.

Seeing what the bot picked

Use /status in chat to see the current tier and the concrete model behind it. The Sessions page records the tier and model for every turn, so you can audit decisions after the fact.

Setting up the tiers

Open Settings → Model Router. You see one row per tier — four named plus five special slots — with a model picker on each row. The dropdowns show the models you added in Settings → Model Catalog; if a dropdown is empty, add the model there first.

Below the tier rows you will find two more controls:

  • Dynamic upgrade — the toggle for the mid-turn classifier described above. On by default.
  • Global temperature — a slider that applies to every tier. Leave at the default unless you have a specific reason to nudge the bot toward more deterministic (lower) or more varied (higher) output. Skills that need a different temperature should set it in their own configuration.

Blank named tiers do not fall back

There is no chain between the four named tiers. If something explicitly requests smart, coding, or deepand that tier has no model bound, the turn fails with “Tier is not configured”. The only implicit fallback is for turns that ask for no tier at all — those resolve to balanced. For a safe first run, bind a model to all four named tiers (the same model is fine). The five special1special5 slots can stay empty because nothing picks them implicitly — they only resolve when explicitly named.

What to do next