Skip to content

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.

Normalized classGoose JSON key
Uncached inputinput_tokens
Cached input(not reported → null)
Outputoutput_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.