pub mod counter;
pub mod tiktoken;
pub mod tracker;
pub use counter::{CharRatioCounter, TokenCounter, TrackerTokenUsage};
pub use tiktoken::TiktokenCounter;
pub use tracker::{ModelPricing, TokenTrackingLLM};
use std::sync::LazyLock;
use tiktoken_rs::CoreBPE;
static GLOBAL_ENCODER: LazyLock<Result<CoreBPE, String>> = LazyLock::new(|| {
tiktoken_rs::cl100k_base()
.map_err(|e| format!("Failed to load tiktoken cl100k_base encoder: {e}"))
});
pub fn count_tokens(text: &str) -> Result<usize, String> {
let encoder = GLOBAL_ENCODER.as_ref().map_err(|e| e.clone())?;
Ok(encoder.encode_with_special_tokens(text).len())
}