fix(cli): emit cumulative token usage in stream-json/json complete event (#8870)

all done
This commit is contained in:
Naman Vats
2026-05-13 00:19:44 +05:30
committed by GitHub
parent fe8f0cdec1
commit 8905482318
+28 -5
View File
@@ -65,6 +65,10 @@ struct JsonOutput {
#[derive(Serialize, Deserialize, Debug)]
struct JsonMetadata {
total_tokens: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
input_tokens: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
output_tokens: Option<i32>,
status: String,
}
@@ -84,6 +88,10 @@ enum StreamEvent {
},
Complete {
total_tokens: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
input_tokens: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
output_tokens: Option<i32>,
},
}
@@ -1289,11 +1297,15 @@ impl CliSession {
.await
{
Ok(session) => JsonMetadata {
total_tokens: session.total_tokens,
total_tokens: session.accumulated_total_tokens.or(session.total_tokens),
input_tokens: session.accumulated_input_tokens.or(session.input_tokens),
output_tokens: session.accumulated_output_tokens.or(session.output_tokens),
status: "completed".to_string(),
},
Err(_) => JsonMetadata {
total_tokens: None,
input_tokens: None,
output_tokens: None,
status: "completed".to_string(),
},
};
@@ -1303,15 +1315,26 @@ impl CliSession {
};
println!("{}", serde_json::to_string_pretty(&json_output)?);
} else if is_stream_json_mode {
let total_tokens = self
let session = self
.agent
.config
.session_manager
.get_session(&self.session_id, false)
.await
.ok()
.and_then(|s| s.total_tokens);
emit_stream_event(&StreamEvent::Complete { total_tokens });
.ok();
let (total_tokens, input_tokens, output_tokens) = match session {
Some(s) => (
s.accumulated_total_tokens.or(s.total_tokens),
s.accumulated_input_tokens.or(s.input_tokens),
s.accumulated_output_tokens.or(s.output_tokens),
),
None => (None, None, None),
};
emit_stream_event(&StreamEvent::Complete {
total_tokens,
input_tokens,
output_tokens,
});
} else {
println!();
}