(block: &SessionBlock)
| 552 | } |
| 553 | |
| 554 | fn project_block_usage(block: &SessionBlock) -> Option<Projection> { |
| 555 | if !block.is_active || block.is_gap { |
| 556 | return None; |
| 557 | } |
| 558 | let burn = calculate_burn_rate(block)?; |
| 559 | let remaining_minutes = |
| 560 | (block.end_time.duration_since(utc_now()) as f64 / MILLIS_PER_MINUTE as f64).round(); |
| 561 | let total_tokens = |
| 562 | block.token_counts.total() as f64 + burn.tokens_per_minute * remaining_minutes; |
| 563 | let total_cost = block.cost_usd + (burn.cost_per_hour / 60.0) * remaining_minutes; |
| 564 | Some(Projection { |
| 565 | total_tokens: total_tokens.round() as u64, |
| 566 | total_cost: (total_cost * 100.0).round() / 100.0, |
| 567 | remaining_minutes: remaining_minutes as u64, |
| 568 | }) |
| 569 | } |
| 570 | |
| 571 | fn parse_token_limit(value: Option<&str>, max_tokens: u64) -> Option<u64> { |
| 572 | match value { |
no test coverage detected