1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3
4pub const UNKNOWN: &str = "Unknown";
5
6#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
7pub struct TokenUsage {
8 pub input_tokens: u64,
9 pub cached_input_tokens: u64,
10 pub output_tokens: u64,
11 pub reasoning_output_tokens: u64,
12 pub total_tokens: u64,
13}
14
15#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
16pub struct UsageEvent {
17 pub timestamp: DateTime<Utc>,
18 pub session_id: String,
19 pub thread: String,
20 pub project: String,
21 pub model: String,
22 pub effort: String,
23 pub context_window: Option<u64>,
24 pub usage: TokenUsage,
25 pub cumulative_total_tokens: Option<u64>,
26 pub source_file: String,
27}
28
29#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
30pub struct UsageWarning {
31 pub file: String,
32 pub line: Option<usize>,
33 pub message: String,
34}
35
36#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
37pub struct UsageLoad {
38 pub events: Vec<UsageEvent>,
39 pub warnings: Vec<UsageWarning>,
40 pub session_count: usize,
41}
42
43#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
44pub struct Totals {
45 pub all_time_tokens: u64,
46 pub today_tokens: u64,
47 pub last_7_days_tokens: u64,
48 pub event_count: usize,
49 pub session_count: usize,
50 pub input_tokens: u64,
51 pub cached_input_tokens: u64,
52 pub output_tokens: u64,
53 pub reasoning_output_tokens: u64,
54}
55
56#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
57pub struct DistributionPoint {
58 pub label: String,
59 pub total_tokens: u64,
60 pub event_count: usize,
61}
62
63#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
64pub struct TimelinePoint {
65 pub bucket: String,
66 pub total_tokens: u64,
67 pub event_count: usize,
68}
69
70#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
71pub struct DimensionDistributions {
72 pub projects: Vec<DistributionPoint>,
73 pub models: Vec<DistributionPoint>,
74 pub threads: Vec<DistributionPoint>,
75 pub efforts: Vec<DistributionPoint>,
76 pub context_windows: Vec<DistributionPoint>,
77}
78
79#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
80pub struct UsageSummary {
81 pub generated_at: DateTime<Utc>,
82 pub totals: Totals,
83 pub timeline: Vec<TimelinePoint>,
84 pub distributions: DimensionDistributions,
85 pub events: Vec<UsageEvent>,
86 pub warnings: Vec<UsageWarning>,
87}