#![allow(dead_code)]
pub const DEFAULT_COMPACTION_TRIGGER_PERCENT: f64 = 75.0;
pub const CRITICAL_PRESSURE_PERCENT: f64 = 90.0;
pub const HIGH_PRESSURE_PERCENT: f64 = DEFAULT_COMPACTION_TRIGGER_PERCENT;
pub const MEDIUM_PRESSURE_PERCENT: f64 = 40.0;
pub const CONTEXT_HEADROOM_TOKENS: u64 = 1_024;
pub const MIN_INPUT_BUDGET_TOKENS: u64 = 1_024;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum PressureLevel {
Low,
Medium,
High,
Critical,
}
impl PressureLevel {
#[must_use]
pub fn from_usage_percent(percent: f64) -> Self {
let percent = percent.clamp(0.0, 100.0);
if percent >= CRITICAL_PRESSURE_PERCENT {
PressureLevel::Critical
} else if percent >= HIGH_PRESSURE_PERCENT {
PressureLevel::High
} else if percent >= MEDIUM_PRESSURE_PERCENT {
PressureLevel::Medium
} else {
PressureLevel::Low
}
}
#[must_use]
pub const fn label(self) -> &'static str {
match self {
PressureLevel::Low => "low",
PressureLevel::Medium => "moderate",
PressureLevel::High => "high",
PressureLevel::Critical => "critical",
}
}
#[must_use]
pub const fn suggests_compaction(self) -> bool {
matches!(self, PressureLevel::High | PressureLevel::Critical)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ContextBudget {
pub window_tokens: u64,
pub input_tokens: u64,
pub output_cap_tokens: u64,
pub available_input_tokens: u64,
pub compaction_trigger_tokens: u64,
pub pressure: PressureLevel,
}
impl ContextBudget {
#[must_use]
pub fn new(window_tokens: u64, input_tokens: u64, configured_output_cap: u64) -> Self {
let output_cap_tokens = clamp_output_cap(window_tokens, configured_output_cap);
let reserved = output_cap_tokens.saturating_add(CONTEXT_HEADROOM_TOKENS);
let input_budget_ceiling = window_tokens.saturating_sub(reserved);
let available_input_tokens = input_budget_ceiling.saturating_sub(input_tokens);
let compaction_trigger_tokens =
percent_of(window_tokens, DEFAULT_COMPACTION_TRIGGER_PERCENT);
let pressure =
PressureLevel::from_usage_percent(usage_percent(window_tokens, input_tokens));
ContextBudget {
window_tokens,
input_tokens,
output_cap_tokens,
available_input_tokens,
compaction_trigger_tokens,
pressure,
}
}
#[must_use]
pub fn usage_percent(&self) -> f64 {
usage_percent(self.window_tokens, self.input_tokens)
}
#[must_use]
pub fn should_compact(&self) -> bool {
self.window_tokens > 0 && self.input_tokens >= self.compaction_trigger_tokens
}
#[must_use]
pub fn fits_additional(&self, additional_input_tokens: u64) -> bool {
additional_input_tokens <= self.available_input_tokens
}
}
fn clamp_output_cap(window_tokens: u64, configured_output_cap: u64) -> u64 {
let reserved_floor = MIN_INPUT_BUDGET_TOKENS.saturating_add(CONTEXT_HEADROOM_TOKENS);
let max_output = window_tokens.saturating_sub(reserved_floor);
configured_output_cap.min(max_output)
}
fn usage_percent(window_tokens: u64, input_tokens: u64) -> f64 {
if window_tokens == 0 {
return 0.0;
}
((input_tokens as f64 / window_tokens as f64) * 100.0).clamp(0.0, 100.0)
}
fn percent_of(window_tokens: u64, percent: f64) -> u64 {
let percent = percent.clamp(0.0, 100.0);
let value = (window_tokens as f64) * (percent / 100.0);
(value + 0.5) as u64
}
#[cfg(test)]
mod tests {
use super::*;
const WINDOWS: &[u64] = &[8_192, 32_768, 131_072, 262_144, 1_048_576];
#[test]
fn pressure_level_boundaries_are_inclusive_lower_bounds() {
assert_eq!(PressureLevel::from_usage_percent(0.0), PressureLevel::Low);
assert_eq!(PressureLevel::from_usage_percent(39.9), PressureLevel::Low);
assert_eq!(
PressureLevel::from_usage_percent(40.0),
PressureLevel::Medium
);
assert_eq!(
PressureLevel::from_usage_percent(74.9),
PressureLevel::Medium
);
assert_eq!(PressureLevel::from_usage_percent(75.0), PressureLevel::High);
assert_eq!(PressureLevel::from_usage_percent(89.9), PressureLevel::High);
assert_eq!(
PressureLevel::from_usage_percent(90.0),
PressureLevel::Critical
);
assert_eq!(
PressureLevel::from_usage_percent(100.0),
PressureLevel::Critical
);
}
#[test]
fn pressure_level_clamps_out_of_range_inputs() {
assert_eq!(PressureLevel::from_usage_percent(-10.0), PressureLevel::Low);
assert_eq!(
PressureLevel::from_usage_percent(150.0),
PressureLevel::Critical
);
assert_eq!(
PressureLevel::from_usage_percent(f64::INFINITY),
PressureLevel::Critical
);
}
#[test]
fn pressure_level_ordering_and_helpers() {
assert!(PressureLevel::Low < PressureLevel::Medium);
assert!(PressureLevel::Medium < PressureLevel::High);
assert!(PressureLevel::High < PressureLevel::Critical);
assert!(!PressureLevel::Low.suggests_compaction());
assert!(!PressureLevel::Medium.suggests_compaction());
assert!(PressureLevel::High.suggests_compaction());
assert!(PressureLevel::Critical.suggests_compaction());
assert_eq!(PressureLevel::Low.label(), "low");
assert_eq!(PressureLevel::Medium.label(), "moderate");
assert_eq!(PressureLevel::High.label(), "high");
assert_eq!(PressureLevel::Critical.label(), "critical");
}
#[test]
fn compaction_trigger_is_three_quarters_of_window() {
for &window in WINDOWS {
let budget = ContextBudget::new(window, 0, 64_000);
let expected = percent_of(window, DEFAULT_COMPACTION_TRIGGER_PERCENT);
assert_eq!(
budget.compaction_trigger_tokens, expected,
"window {window}: trigger should be 75% of window"
);
assert!(budget.compaction_trigger_tokens < window);
}
}
#[test]
fn should_compact_flips_at_the_trigger() {
let window = 1_048_576;
let cap = 262_144;
let trigger = percent_of(window, DEFAULT_COMPACTION_TRIGGER_PERCENT);
let below = ContextBudget::new(window, trigger - 1, cap);
assert!(!below.should_compact());
assert!(!below.pressure.suggests_compaction());
let at = ContextBudget::new(window, trigger, cap);
assert!(at.should_compact());
assert!(at.pressure.suggests_compaction());
let above = ContextBudget::new(window, trigger + 1, cap);
assert!(above.should_compact());
}
#[test]
fn zero_window_never_suggests_compaction() {
let budget = ContextBudget::new(0, 0, 64_000);
assert_eq!(budget.compaction_trigger_tokens, 0);
assert!(!budget.should_compact());
assert_eq!(budget.pressure, PressureLevel::Low);
assert_eq!(budget.available_input_tokens, 0);
assert_eq!(budget.usage_percent(), 0.0);
}
#[test]
fn output_cap_is_preserved_when_window_is_roomy() {
let budget = ContextBudget::new(1_048_576, 0, 64_000);
assert_eq!(budget.output_cap_tokens, 64_000);
let expected = 1_048_576 - 64_000 - CONTEXT_HEADROOM_TOKENS;
assert_eq!(budget.available_input_tokens, expected);
}
#[test]
fn output_cap_is_clamped_to_protect_input_floor_on_small_window() {
let window = 8_192u64;
let budget = ContextBudget::new(window, 0, 262_144);
let reserved_floor = MIN_INPUT_BUDGET_TOKENS + CONTEXT_HEADROOM_TOKENS;
let expected_cap = window - reserved_floor;
assert_eq!(budget.output_cap_tokens, expected_cap);
assert!(budget.available_input_tokens >= MIN_INPUT_BUDGET_TOKENS);
assert_eq!(
budget.available_input_tokens,
window - budget.output_cap_tokens - CONTEXT_HEADROOM_TOKENS
);
}
#[test]
fn tiny_window_below_floor_saturates_without_panic() {
let window = 512u64; let budget = ContextBudget::new(window, 100, 262_144);
assert_eq!(budget.output_cap_tokens, 0);
assert_eq!(budget.available_input_tokens, 0);
assert!((budget.usage_percent() - (100.0 / 512.0 * 100.0)).abs() < 1e-9);
}
#[test]
fn available_budget_saturates_when_input_exceeds_ceiling() {
let window = 131_072u64;
let cap = 32_000u64;
let budget = ContextBudget::new(window, window * 2, cap);
assert_eq!(budget.available_input_tokens, 0);
assert!(!budget.fits_additional(1));
assert!(budget.fits_additional(0));
assert_eq!(budget.usage_percent(), 100.0);
assert_eq!(budget.pressure, PressureLevel::Critical);
}
#[test]
fn fits_additional_respects_the_reserved_boundary() {
let window = 262_144u64;
let cap = 64_000u64;
let budget = ContextBudget::new(window, 100_000, cap);
let room = budget.available_input_tokens;
assert!(budget.fits_additional(room));
assert!(!budget.fits_additional(room + 1));
}
#[test]
fn usage_percent_is_proportional_across_window_sizes() {
for &window in WINDOWS {
let half = window / 2;
let budget = ContextBudget::new(window, half, 64_000);
let pct = budget.usage_percent();
assert!(
(pct - 50.0).abs() < 0.5,
"window {window}: half-full should be ~50%, got {pct}"
);
assert_eq!(budget.pressure, PressureLevel::Medium);
}
}
#[test]
fn pressure_tracks_input_growth_on_a_1m_window() {
let window = 1_048_576u64;
let cap = 262_144u64;
let low = ContextBudget::new(window, percent_of(window, 10.0), cap);
assert_eq!(low.pressure, PressureLevel::Low);
let medium = ContextBudget::new(window, percent_of(window, 50.0), cap);
assert_eq!(medium.pressure, PressureLevel::Medium);
let high = ContextBudget::new(window, percent_of(window, 80.0), cap);
assert_eq!(high.pressure, PressureLevel::High);
assert!(high.should_compact());
let critical = ContextBudget::new(window, percent_of(window, 95.0), cap);
assert_eq!(critical.pressure, PressureLevel::Critical);
}
#[test]
fn snapshot_fields_are_internally_consistent() {
for &window in WINDOWS {
for &input in &[0u64, window / 4, window / 2, window] {
let budget = ContextBudget::new(window, input, 64_000);
assert_eq!(budget.window_tokens, window);
assert_eq!(budget.input_tokens, input);
let ceiling = window
.saturating_sub(budget.output_cap_tokens)
.saturating_sub(CONTEXT_HEADROOM_TOKENS);
assert!(budget.available_input_tokens <= ceiling);
assert_eq!(
budget.pressure,
PressureLevel::from_usage_percent(budget.usage_percent())
);
}
}
}
#[test]
fn percent_of_rounds_to_nearest_token() {
assert_eq!(percent_of(0, 75.0), 0);
assert_eq!(percent_of(100, 0.0), 0);
assert_eq!(percent_of(100, 100.0), 100);
assert_eq!(percent_of(100, 75.0), 75);
assert_eq!(percent_of(3, 75.0), 2);
assert_eq!(percent_of(2, 75.0), 2);
}
#[test]
fn budget_is_copy_and_comparable() {
let a = ContextBudget::new(131_072, 1_000, 32_000);
let b = a; assert_eq!(a, b);
assert_eq!(a.window_tokens, b.window_tokens);
}
}