Skip to main content
The doctrine in one line: unknown stays unknown. An energy figure Nika cannot prove is never rendered as 0 Wh, a local model is unpriced — your hardware, your watts — never « free », and every figure carries WHO measured it and WHAT it covers, so two honest numbers stay comparable.
What 0.124.1 does. nika check prints an ENERGY line beside COST. When the catalog holds a sourced figure for a task’s model and the task declares max_tokens, the line is a bounded worst-case ceiling in watt-hours; otherwise the task is named as unpriced or uncapped, never 0 Wh. Energy is a reading, not a gate: there is no --max-energy-wh flag, and --max-cost-usd is the only spend gate. The normative rules are the spend-honesty law of spec 07 · conformance.

The vocabulary

Energy speaks the same four words as cost, with the same semantics:

What the check prints

A task on a model with a sourced figure, capped at 1,000 output tokens:
The same task without max_tokens has no ceiling to prove, so the line names it instead of guessing:
A model with no sourced figure reads unpriced — no sourced Wh figure for any task model · never 0 Wh, and a local model adds that it draws your watts. The same reading rides nika check --json (the energy object, with a subtotal per scope class) and the one-line header of nika inspect.

A fact, not a vibe

An energy figure enters the catalog as a five-field fact or not at all. This row is the one behind the reading above, as nika 0.124.1 ships it:
Open-weight models are the measurable frontier: a third party can put them on a bench, and every sourced figure in the 0.124.1 catalog is one of them. Closed APIs stay unpriced until a vendor discloses or an independent methodology covers them — that asymmetry is honest, and the catalog keeps it. Two axes make two honest numbers comparable:
  • provenance — who produced the number: measured-local (a probe on your machine) · independent-measured (a third-party benchmark) · vendor-claim · independent-estimate (modelling, labelled as such — an estimate may enter explicitly, never as a silent default).
  • scope — what it covers: gpu (accelerator only) · device (whole host) · fleet (host + idle + datacenter PUE). A GPU-only figure is roughly half a fleet figure for the same model: without this axis, two truthful numbers are silently incomparable, so the check sums each scope class separately and never adds them together.
And the unit is per million output tokens (wh_per_mtok_out) because decode dominates measured inference energy (≥96% in the ML.energy v3.0 methodology) — a per-total figure would dilute the number with nearly-free prefill and reward long prompts.

Why never 0 Wh

0 Wh would claim free inference. Nothing is: a local model draws from your wall, an unmeasured cloud call draws from someone’s datacenter. The catalog refuses a zero at build time — the null is the absent fact, and an absent fact renders unpriced, exactly as an unpriced model renders on the cost side. If you see no energy number for a task, that is the feature: no number was provable, so no number was shown.

Why watt-hours, not CO₂e

Carbon intensity varies by grid, hour and region — a gCO₂e constant hides a location assumption inside a number. Watt-hours are the measurable; a carbon projection would need your grid factor as an explicit input, and Nika does not take one. The honest unit comes first.