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.
Status · the doctrine and the data rail ship today — the model catalog carries sourced energy facts (schema @1.3, absence over guess). On released 0.120.1, nika check already prints an ENERGY line (usually unpriced when no sourced Wh figure exists — never 0 Wh). The --max-energy-wh block-before-spend gate is specified by NEP-0018 (Draft) and is not a flag on this binary yet.

The vocabulary

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

A fact, not a vibe

An energy figure enters the catalog as a five-field fact or not at all:
That row is real — the first sourced figure in the catalog (groq / qwen/qwen3-32b). Open-weight models are the measurable frontier: a third party can put them on a bench. 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.
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 have never seen an energy number in a Nika surface, that is the feature: no number was provable, so no number was shown.

What NEP-0018 still adds

The ENERGY reading beside COST already renders on 0.120.1 (unpriced when no sourced figure exists). Still specified, not yet a CLI flag:
  • bounded ≤ N Wh totals with the scope axis named, every uncapped task named with its reason, mixed scopes never silently summed;
  • energy aggregation in nika:inspect under the same markers;
  • --max-energy-wh — a block-before-spend gate symmetric to --max-cost-usd: refusal, not remorse.

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 needs YOUR grid factor as an explicit input, and may arrive later as exactly that. First the honest unit.