(
start: TimestampMs,
entries: Vec<LoadedEntry>,
now: TimestampMs,
duration: i64,
)
| 71 | } |
| 72 | |
| 73 | fn create_block( |
| 74 | start: TimestampMs, |
| 75 | entries: Vec<LoadedEntry>, |
| 76 | now: TimestampMs, |
| 77 | duration: i64, |
| 78 | ) -> SessionBlock { |
| 79 | let end = start.checked_add_millis(duration).unwrap_or(start); |
| 80 | let actual_end = entries.last().map(|entry| entry.timestamp); |
| 81 | let is_active = actual_end.is_some_and(|last| now.duration_since(last) < duration && now < end); |
| 82 | let mut token_counts = TokenCounts::default(); |
| 83 | let mut cost = 0.0; |
| 84 | let mut models = Vec::new(); |
| 85 | let mut seen_models = FxHashSet::default(); |
| 86 | let mut usage_limit_reset_time = None; |
| 87 | for entry in &entries { |
| 88 | token_counts.add_usage(entry.data.message.usage); |
| 89 | cost += entry.cost; |
| 90 | if let Some(model) = &entry.model { |
| 91 | let model = crate::model_aliases::resolve_model_name(model).into_owned(); |
| 92 | if seen_models.insert(model.clone()) { |
| 93 | models.push(model); |
| 94 | } |
| 95 | } |
| 96 | usage_limit_reset_time = usage_limit_reset_time.or(entry.usage_limit_reset_time); |
| 97 | } |
| 98 | SessionBlock { |
| 99 | id: format_rfc3339_millis(start), |
| 100 | start_time: start, |
| 101 | end_time: end, |
| 102 | actual_end_time: actual_end, |
| 103 | is_active, |
| 104 | is_gap: false, |
| 105 | entries, |
| 106 | token_counts, |
| 107 | cost_usd: cost, |
| 108 | models, |
| 109 | usage_limit_reset_time, |
| 110 | } |
| 111 | } |
| 112 | |
| 113 | fn create_gap_block(last: TimestampMs, next: TimestampMs, duration: i64) -> SessionBlock { |
| 114 | let start = last.checked_add_millis(duration).unwrap_or(last); |
no test coverage detected