use anyhow::Result;
use tracing::debug;
use super::{
cache::ResponseCache,
token_budget::TokenBudget,
types::{LLMRequest, LLMResponse},
};
pub async fn cache_get(cache: &ResponseCache, request: &LLMRequest) -> Option<LLMResponse> {
let cached = cache.get(request).await;
if cached.is_some() {
debug!("Cache hit for request");
}
cached
}
pub async fn cache_put(
cache: &ResponseCache,
request: &LLMRequest,
response: LLMResponse,
provider_name: String,
) {
cache.put(request, response, provider_name).await;
}
pub async fn check_budget(
token_budget: &TokenBudget,
user_id: &str,
estimated_tokens: u64,
) -> Result<()> {
let user_id_owned = user_id.to_string();
token_budget
.check_budget(&user_id_owned, estimated_tokens)
.await
}
pub async fn record_usage(
token_budget: &TokenBudget,
user_id: &str,
actual_tokens: u64,
) -> Result<()> {
let user_id_owned = user_id.to_string();
token_budget
.record_usage(&user_id_owned, actual_tokens)
.await
}
pub fn estimate_input_tokens(request: &LLMRequest) -> usize {
let total_content: String = request
.messages
.iter()
.map(|m| m.content.as_str())
.chain(request.system_prompt.as_deref())
.collect::<Vec<_>>()
.join(" ");
total_content.len() / 4
}