Skip to content

fix(cli): report cumulative total_tokens in stream-json/json output - #8910

Merged
DOsinga merged 3 commits into
aaif-goose:mainfrom
bzqzheng:fix/cumulative-token-reporting
May 13, 2026
Merged

fix(cli): report cumulative total_tokens in stream-json/json output#8910
DOsinga merged 3 commits into
aaif-goose:mainfrom
bzqzheng:fix/cumulative-token-reporting

Conversation

@bzqzheng

Copy link
Copy Markdown
Contributor

Problem

The CLI's "--json" and "--stream-json" output modes were reading session.total_tokens, which stores only the last turn's token usage. This caused complete.total_tokens to reset to the current turn's count on every chunk, rather than reporting the running session total (fixes #8871).

Root Cause

  • update_session_metrics in crates/goose/src/agents/reply_parts.rs correctly computes accumulated_total_tokens by adding usage across turns.
  • However, total_tokens is set to the current turn's usage.
  • The CLI output code in crates/goose-cli/src/session/mod.rs reads session.total_tokens instead of session.accumulated_total_tokens.

Fix

Read session.accumulated_total_tokens in:

  • JsonMetadata construction (--json mode)
  • StreamEvent::Complete emission (--stream-json mode)
  • get_total_token_usage() for consistency

Test

Added test_accumulated_total_tokens_across_multiple_turns which:

  1. Creates a mock provider reporting 15 tokens per turn
  2. Runs 3 reply turns
  3. Asserts accumulated_total_tokens == 45 (cumulative)
  4. Asserts total_tokens == 15 (last turn only)

Verification

cargo test --package goose test_accumulated_total_tokens_across_multiple_turns
cargo test --package goose-cli

The CLI's --json and --stream-json output modes were reading
session.total_tokens, which stores only the last turn's token usage.
This caused total_tokens to reset to the current turn's count on every
chunk, rather than reporting the running session total.

Fix by reading session.accumulated_total_tokens, which is already
correctly maintained by update_session_metrics across all turns.

Also update get_total_token_usage() to return the accumulated value
for consistency.

Test: add test_accumulated_total_tokens_across_multiple_turns asserting
that accumulated_total_tokens grows cumulatively across turns while
total_tokens remains per-turn.

Fixes aaif-goose#8871
Signed-off-by: Trinity <trinity@multica.ai>
Signed-off-by: Bright Zheng <bzqzheng@gmail.com>
Bojun-Vvibe added a commit to Bojun-Vvibe/oss-contributions that referenced this pull request Apr 29, 2026
- aaif-goose/goose#8910 (merge-after-nits): cumulative-tokens display fix
- aaif-goose/goose#8906 (merge-as-is): case-insensitive provider lookup
- INDEX: append drip-179 section, table, and verdict-mix paragraph
Douwe Osinga added 2 commits May 13, 2026 12:03
…reporting

Signed-off-by: Douwe Osinga <douwe@squareup.com>

# Conflicts:
#	crates/goose-cli/src/session/mod.rs
#	crates/goose/tests/agent.rs
…e test to two turns

- Remove comment that restates function name on get_total_token_usage
- Remove unused ProviderDef impl and call_count from FixedUsageProvider
- Extract run_turn helper to reduce test boilerplate
- Reduce from 3 turns to 2 (sufficient to prove accumulation)
- Remove redundant assert messages that restate the assertion

Signed-off-by: Douwe Osinga <douwe@squareup.com>
@DOsinga
DOsinga marked this pull request as ready for review May 13, 2026 16:04

@DOsinga DOsinga left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Merged main, resolved conflicts, cleaned up and approved.

Changes made during cleanup:

  • Removed unused ProviderDef impl and call_count field from the mock provider
  • Extracted run_turn helper to reduce test boilerplate
  • Reduced test from 3 turns to 2 (sufficient to prove accumulation)
  • Removed assert messages that just restate the assertion
  • Removed #[cfg(test)] on inner module (already inside a test module)
  • Stripped comment on get_total_token_usage that restated the function name

Note: main already fixed the json/stream-json output paths (using .or() fallback). The remaining unique fix here is get_total_token_usage using accumulated_total_tokens. That function is currently unused but the fix is correct.

@DOsinga
DOsinga added this pull request to the merge queue May 13, 2026
Merged via the queue into aaif-goose:main with commit 9ca29a1 May 13, 2026
22 checks passed
lifeizhou-ap added a commit that referenced this pull request May 14, 2026
* main: (66 commits)
  Switch GH pages deploy to actions/artifact workflow (#9025)
  fix(summon): re-apply canonical limits when delegate overrides model (#9183)
  Split code signing from build (#8587)
  refactor(logging): consolidate logging setup into shared helper in goose crate (#8817)
  fix(cli): report cumulative total_tokens in stream-json/json output (#8910)
  plugins: add open plugins (just skills for now) (#9063)
  fix(providers): refresh GCP metadata server token on expiration (#8929)
  chore(deps): bump the cargo-minor-and-patch group across 1 directory with 14 updates (#9178)
  chore(deps): bump bzip2 from 0.5.2 to 0.6.1 (#8964)
  chore(deps): bump tauri from 2.10.3 to 2.11.1 in /ui/goose2/src-tauri (#9066)
  chore(deps): bump hono from 4.12.14 to 4.12.18 in /evals/open-model-gym/mcp-harness (#9073)
  localize hardcoded strings in provider settings UI (#8931)
  chore(deps): bump @babel/plugin-transform-modules-systemjs from 7.28.5 to 7.29.4 in /documentation (#9122)
  move settings into app shell (#9047)
  Add Location column to CLI skills table (#8785)
  (feat): add routstr as a declarative provider (#9175)
  Add FuturMix provider (#8840)
  fix: convert quoted numeric config values to numbers if needed (#8844)
  fix(ui): keep SSE reconnect loop alive on long disconnects (#8717) (#8846)
  fix(openai): apply request_params to outgoing API payload (#9151)
  ...
shafqatevo pushed a commit to shafqatevo/goose that referenced this pull request Aug 7, 2026
…aif-goose#8910)

Signed-off-by: Trinity <trinity@multica.ai>
Signed-off-by: Bright Zheng <bzqzheng@gmail.com>
Signed-off-by: Douwe Osinga <douwe@squareup.com>
Co-authored-by: Douwe Osinga <douwe@squareup.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

# stream-json/json complete.total_tokens reports last-turn context, not cumulative session usage

2 participants