File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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
You can’t perform that action at this time.
0 commit comments