Skip to content

Commit cd6e239

Browse files
committed
fix(stats): ignore usage-only session files
1 parent 7954d02 commit cd6e239

1 file changed

Lines changed: 33 additions & 1 deletion

File tree

src/cortex-cli/src/stats_cmd.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,9 @@ fn parse_session_file(path: &PathBuf) -> Result<SessionData> {
531531

532532
// Also check for aggregate usage at session level
533533
// Prefer session-level aggregate if available as it's more accurate
534-
if let Some(usage) = json.get("usage") {
534+
if data.message_count > 0
535+
&& let Some(usage) = json.get("usage")
536+
{
535537
let session_input = usage
536538
.get("input_tokens")
537539
.or_else(|| usage.get("prompt_tokens"))
@@ -735,6 +737,36 @@ mod tests {
735737
assert!((cost - 12.5).abs() < 0.001);
736738
}
737739

740+
#[test]
741+
fn test_parse_session_file_ignores_usage_without_messages() -> Result<()> {
742+
let path = std::env::temp_dir().join(format!(
743+
"cortex-stats-usage-only-{}-{}.json",
744+
std::process::id(),
745+
chrono::Utc::now().timestamp_nanos_opt().unwrap_or_default()
746+
));
747+
748+
std::fs::write(
749+
&path,
750+
r#"{
751+
"created_at": "2026-05-17T00:00:00Z",
752+
"model": "gpt-4o",
753+
"usage": {
754+
"input_tokens": 1234,
755+
"output_tokens": 5678
756+
}
757+
}"#,
758+
)?;
759+
760+
let session_data = parse_session_file(&path)?;
761+
let _ = std::fs::remove_file(&path);
762+
763+
assert_eq!(session_data.message_count, 0);
764+
assert_eq!(session_data.input_tokens, 0);
765+
assert_eq!(session_data.output_tokens, 0);
766+
767+
Ok(())
768+
}
769+
738770
#[test]
739771
fn test_validate_days_range() {
740772
// Valid values

0 commit comments

Comments
 (0)