use schemars::JsonSchema;
use serde::Serialize;
const MODEL_WINDOWS_AS_OF: &str = "2026-07";
const MODEL_WINDOWS: &[(&str, u64)] = &[
("claude-opus-4-5", 200_000),
("claude-sonnet-4-5", 200_000),
("claude-haiku-4-5", 200_000),
("claude-sonnet-4", 200_000),
("claude-3-7-sonnet", 200_000),
("gpt-5", 400_000),
("gpt-5-mini", 400_000),
("gpt-4.1", 1_000_000),
("gpt-4o", 128_000),
("o3", 200_000),
("gemini-2.5-pro", 1_000_000),
("gemini-2.0-flash", 1_000_000),
];
#[must_use]
pub fn model_window(model: &str) -> Option<u64> {
MODEL_WINDOWS
.iter()
.find(|(name, _)| name.eq_ignore_ascii_case(model))
.map(|(_, window)| *window)
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
pub struct SuggestedBudget {
pub window: Option<u64>,
pub suggested_budget: Option<u64>,
pub source: String,
}
#[must_use]
pub fn suggest_token_budget(target_model: &str, reserve_tokens: u64) -> SuggestedBudget {
let window = model_window(target_model);
SuggestedBudget {
window,
suggested_budget: window.map(|w| w.saturating_sub(reserve_tokens)),
source: format!("static table as of {MODEL_WINDOWS_AS_OF}"),
}
}
#[cfg(test)]
#[path = "model_windows_tests.rs"]
mod tests;