use crate::{config::LLMConfig, llm::client::types::TokenUsage};
pub fn evaluate_befitting_model(
llm_config: &LLMConfig,
system_prompt: &str,
user_prompt: &str,
) -> (String, Option<String>) {
if system_prompt.len() + user_prompt.len() <= 32 * 1024 {
return (
llm_config.model_efficient.clone(),
Some(llm_config.model_powerful.clone()),
);
}
return (llm_config.model_powerful.clone(), None);
}
pub fn estimate_token_usage(input_text: &str, output_text: &str) -> TokenUsage {
let input_tokens = estimate_text_tokens(input_text);
let output_tokens = estimate_text_tokens(output_text);
TokenUsage::new(input_tokens, output_tokens)
}
pub fn estimate_text_tokens(text: &str) -> u64 {
let chinese_chars = text
.chars()
.filter(|c| {
let code = *c as u32;
(0x4E00..=0x9FFF).contains(&code)
|| (0x3400..=0x4DBF).contains(&code)
|| (0x20000..=0x2A6DF).contains(&code)
})
.count();
let total_chars = text.chars().count();
let english_chars = total_chars - chinese_chars;
let estimated_tokens = (chinese_chars as f64 * 1.5) + (english_chars as f64 / 4.0);
estimated_tokens.ceil() as u64
}