Metrics
Goose reports token usage on its terminal complete event. The harness layer
reads the token fields from that event and normalizes them into the standard
token classes. Usage uses the Last
aggregation: the values are cumulative session totals, so the last event that
carries them wins.
Token classes
Section titled “Token classes”| Normalized class | Goose JSON key |
|---|---|
| Uncached input | input_tokens |
| Cached input | (not reported → null) |
| Output | output_tokens |
| Reasoning | (not reported → null) |
This is the whole of what Goose reports: its complete event carries only
input_tokens, output_tokens, and total_tokens (where total is exactly
input + output). There is no cache or reasoning breakdown anywhere in the
stream — not on complete, and not on the per-message records — so cached input
and reasoning are recorded as null (not determinable) rather than 0. This is a
limitation of Goose’s reporting, not a parsing gap: even when Goose drives a
cache-backed model and emits extensive reasoning (its thinking blocks, surfaced
as reasoning events in the
event stream), those reads and reasoning tokens are folded into the
flat input_tokens/output_tokens totals and cannot be separated out. Because
they are folded into the reported input and output, a Goose run’s
token total still reflects them and the run
participates in token comparisons — only the cache and reasoning breakdowns are
unavailable. Input is not treated as cache-inclusive
(input_includes_cache = false), so nothing is subtracted from it.
Goose reports no self-reported cost field, so its comparable cost is derived from the OpenRouter prices for the model used, applied to the normalized token classes. The model ID is an OpenRouter slug passed through unchanged for that lookup.
See Metrics for the cost and token-class contract.