mod_inference applies when it picks a pod for a request.
The screen uses two read procedures, runtime.health and runtime.routing, and
one write, runtime.setRouting. Nothing on the screen reaches into the cluster
directly.
Afterburner serves only clutch-layers models, on model servers that
FirstByte runs. The Runtime screen has no other engine lane.
What the runtime publishes and where it is stored
The runtime does not answer console queries. It publishes a blob, and the console reads it.
Three results follow from this design:
- A field shown as
—was absent from the published blob. It is not a zero. The console does not substitute a default. - Freshness is the property of the publisher. The console shows what is in Redis when it runs the query.
- Today the engine does not write the runtime blob. When the blob is absent,
runtime.healthreports that nothing is published. The console then hides the host banner, the gauges, the self-tests, and the serving config. A note tells you that the engine publishes no runtime stats. The Routing card stays on the screen, because it reads a different source.
Host banner fields
The banner at the top of the screen shows only when the engine has published a runtime blob. The console reads it straight from that blob.
The banner has no Listener field. The console does not show a listener address
or port, because the engine does not publish one.
Reading the resource gauges
Three cards show host resources. The donut in each card is a percentage. The bars beside it are meters. The cards show only when the engine has published a runtime blob. GPU — device name, compute utilization (donut), then VRAM used against VRAM total, temperature, and power draw against the reported power cap. TheCUDA
tag shows only when the blob names a GPU device.
CPU — model and core count, load (donut), then 1-minute loadavg, the
tensor-parallel width, and the maximum context length in thousands of tokens.
System memory — host RAM total, used as a share of total (donut), then the
number of memory-mapped models, page cache, and swap.
Two rules apply when you read a number off this screen:
- The memory donut needs a total. If the blob has no memory total, the
ratio is undefined. The donut shows
0%and the sub-label readsnot reported. It does not showNaN%. - Some bars are relative. They are not capacity limits. Some rows have no natural maximum: tensor-parallel width, maximum context, models mapped, page cache, swap, and loadavg. For these rows, the full scale of the bar is the larger of the reported value and a fixed display floor. The bar shows movement. Read the number in the right-hand label, not the fill fraction.
vramTotal, a fixed
temperature scale, and powerCap). Their fill fractions are meaningful.
Serving config and what each field means
The Serving config card lists the values that the engine reports for the model server. Every row comes from the runtime blob. The console fills in no row itself. The console hides a row when the blob has no value for it. When the blob has none of these values, the card says that the engine did not report serving config.
The card has no fixed rows. It shows no bind address and no port, and it shows
no tool-choice flag.
Self-tests and how to read them
Each entry in the self-test list is a boot diagnostic that the runtime published. Each entry has four fields:
The console does not fix the set of tests. The screen shows the tests that
are in the blob, in the order published. If a check you expect is missing, the
runtime did not report it. This is a gap on the publisher side. It is not a
pass. When the blob has a runtime but no tests, the card says that no
self-tests were reported. The console does not show a “systems nominal” pill
without tests.
Use
ms as a signal. A check that passes but takes much longer than the other
checks usually means that the resource it used was slow to respond. This
often shows later as latency, not as a failure.
What Refresh does
The Refresh button callsrefetch() on runtime.health. It re-reads the
runtime blob. It does not tell the runtime to run its boot diagnostics
again. It shows no fake progress.
- If the runtime has published a new blob since your last look, you see new results.
- If it has not, you see the same results again.
Routing strategies and the metrics they require
runtime.routing returns the strategy list for the org; the console renders one
button per strategy and does not hardcode names. Selecting a button only sets a
local draft — nothing is published until you press Apply strategy.
The important field alongside the list is requires: a per-strategy list of the
scraped metrics that strategy needs in order to score at all. The console
shows it inline under the strategy picker:
- If the selected strategy requires metrics, the hint names them and warns that without them the router falls back to a random ready pod. Remember this failure mode: a KV-aware or load-aware strategy whose metrics are not scraped does not give an error. It silently changes to random selection. Your latency then becomes the latency of no routing at all.
- If the strategy requires no scraped metrics, the hint says so — that strategy routes from prompt affinity and live in-flight load, both of which the module observes itself.
Weighted multi-scorer routing
Themulti (weighted) option composes several scorers instead of picking one.
Its strategy string is multi: followed by comma-separated name:weight pairs.
Each scorer is normalized to [0,1] and the normalized scores are combined by
weight. The console seeds a starting spec of:
runtime.routing returns multiScorers — the set of scorer names that can be
weighted. This set is narrower than the full strategy list: not every strategy
is weightable.
The spec you type goes to the live router verbatim, so the console parses it
before publishing and shows the first problem instead of publishing a broken
spec:
Parsing splits each pair at its last colon, so the name is everything before
it and the weight everything after. Validation errors surface when you press
Apply strategy; the input turns invalid and the message appears rather than
the mutation firing.
Metric profile
The Metric profile (static routes) control selects which engine’s/metrics names the scraper parses for pods in the static route table. Pods
that the router discovers dynamically use their own engine label instead. This
setting governs only statically-routed pods.
The control has one option: clutch-layers. The Routing card shows the profile
in force next to the strategy. When no profile is reported, the card shows
not reported. If the engine reports a profile that is not clutch-layers,
the card names it, and the console can set only clutch-layers.
For clutch-layers, the scraper reads these metrics from the model server:
The scraper does not read the prefix-cache counters, prefill and decode
histograms, throughput gauges, or a busy-time ratio. A strategy that needs one
of these metrics stays cold. This is on purpose: a wrong value is worse than no
value.
Set the engine on every model. A model with no engine set is scraped with
the built-in default profile of the module. That profile does not read the
clutch-layers metric names, so the metrics-based strategies fall back to a
random ready pod for that model. Set
engine to clutch-layers in the
model registry.
The console publishes routesEngine only when you pick a profile. The
displayed value is the effective profile, with the desired profile as fallback.
If the console sent that displayed value again, it would rewrite a field that
you did not touch. When you do not touch the control, setRouting carries the
strategy only.
Desired state, effective state, and the poll cycle
The routing card keeps two facts apart and never conflates them:
The effective record is a TTL’d beacon: the module republishes it on every
poll.
engineReporting is true only while that beacon is present. The status
pill reflects the combination:
When there is no beacon, the card explains that no live
mod_inference is
publishing routing state at <key>.effective, and that a strategy published
here is stored as desired state and adopted when a module starts polling.
FirstByte deliberately does not show a green confirmed strategy in that
situation, because a strategy no engine has acknowledged may be steering nothing.
Switching strategies takes effect on the module’s next poll (~5 s). There is
no restart, and no request in flight is re-routed.
Two details of the control’s behaviour follow from this model:
- The strategy picker initialises from what is actually running (
effective), falling back to what was requested. It shows reality first, intent second. - Apply strategy is enabled only when your draft differs from the applied strategy, or when you have explicitly picked a metric profile. Otherwise there is nothing to publish. Reset discards the draft and returns the picker to the applied state.
Read-only deployments and operator-only actions
Two restrictions apply on this screen. They have different causes. Routing writes can be disabled per deployment, or for your account.runtime.routing returns
writable. When it is false, every strategy button, the weights input, the
metric-profile selector, and Apply strategy are disabled, the card shows
Read-only on this deployment, and the apply button’s tooltip names the gate:
INFERENCE_DEPLOY_ENABLED. Reads continue to work. You can still see what is
in force, what was requested, and which metrics each strategy needs.
A second gate applies per account. runtime.routing also returns canWrite.
It is false when your account is not an inference operator
(INFERENCE_ADMIN_EMAILS). In that case the controls are disabled and the card
shows Read-only for your account.
The console has no worker restart. A worker restart is a rollout that a
cluster operator does. It is not an action in the tenant console, so the screen
has no Restart button.
Routed upstreams
Below the controls, the Routed upstreams table lists each model in the static route table with its endpoint. For each endpoint it shows whether the address answers, how many turns it answered, how many it did not, and the time of its last answer. The verdict comes from real turns. It is not a probe. An endpoint that nobody has called readsuntried. An endpoint that has never answered shows never
in the last-answer column. If the engine reports routing but not upstream
health, every endpoint reads untried. Routing still works in that case. The
table lists only the static route table. A model that k8s discovery serves does
not appear in it.