{% extends "admin/base.html" %} {% from "partials/_macros.html" import pill, empty_state, notice %} {% block page %}
Edits write to the runtime overlay and reload settings immediately. Each section saves independently — there's no global save bar to commit to.
Configure each upstream first — base URL, API key, timeouts. Connection badges below reflect whether each provider has enough config to attempt a request (no network probe). Use Test connection on each card for a live check. Secret values use ${ENV:NAME} references — the raw value is never stored in YAML.
The classifier always runs (so traces stay intact). When the router is on, the requested model is overridden with the tier chosen for that classification. When off, the request's model field is honoured verbatim against the default tier's provider — useful for A/B comparison and for clients that need a specific model.
Each tier (cheap, default, strong, deep) maps to one configured provider + model. Routes below point at a tier by name. Pick the provider first; the model dropdown then shows what that provider exposes, with per-1M-token prices inline so you can see the trade-off before you save. Pick Custom model id… at the bottom of the dropdown to type an unlisted model id.
Maps a logical route (e.g. brain.plan, brain.execute) to a tier defined above. Unknown tier names are rejected on save.
Process-wide throttles applied per API key. 0 disables.
Fallback for debugging or scripting changes the structured editors don't cover. Saves to the same overlay file via the legacy form endpoint.
{{ overlay_json }}