use crate::lens::Lens;
#[derive(Debug, Clone)]
pub struct ContextBudget {
pub max_tokens: u32,
pub max_experiences: usize,
pub max_insights: usize,
}
impl ContextBudget {
pub fn from_lens(lens: &Lens) -> Self {
Self {
max_tokens: 4096,
max_experiences: lens.attention_budget,
max_insights: 10,
}
}
}
impl Default for ContextBudget {
fn default() -> Self {
Self {
max_tokens: 4096,
max_experiences: 50,
max_insights: 10,
}
}
}
pub fn estimate_tokens(text: &str) -> u32 {
(text.len() as u32) / 4 + 20
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_context_budget_default() {
let budget = ContextBudget::default();
assert_eq!(budget.max_tokens, 4096);
assert_eq!(budget.max_experiences, 50);
assert_eq!(budget.max_insights, 10);
}
#[test]
fn test_context_budget_from_lens() {
let lens = Lens {
attention_budget: 25,
..Lens::default()
};
let budget = ContextBudget::from_lens(&lens);
assert_eq!(budget.max_experiences, 25);
}
#[test]
fn test_estimate_tokens() {
assert_eq!(estimate_tokens(""), 20); assert_eq!(estimate_tokens("Hello world"), 22); let long_text = "a".repeat(400);
assert_eq!(estimate_tokens(&long_text), 120);
}
}