use crate::providers::LlmInstance;
use crate::{LlmResponse, LlmResult};
use std::time::{Duration, Instant};
use std::sync::Arc;
pub struct InstanceTracker {
pub instance: Arc<dyn LlmInstance + Send + Sync>,
pub last_used: Instant,
pub response_times: Vec<Duration>,
pub request_count: usize,
pub error_count: usize,
}
impl InstanceTracker {
pub fn new(instance: Arc<dyn LlmInstance + Send + Sync>) -> Self {
Self {
instance: instance,
last_used: Instant::now(),
response_times: Vec::new(),
request_count: 0,
error_count: 0,
}
}
pub fn record_result(&mut self, duration: Duration, result: &LlmResult<LlmResponse>) {
self.last_used = Instant::now();
self.request_count += 1;
match result {
Ok(_) => {
self.response_times.push(duration);
if self.response_times.len() > 10 {
self.response_times.remove(0);
} }
Err(e) => {
self.error_count += 1;
}
}
}
pub fn avg_response_time(&self) -> Duration {
if self.response_times.is_empty() {
return Duration::from_millis(0);
}
let total: Duration = self.response_times.iter().sum();
total / self.response_times.len().max(1) as u32 }
pub fn get_error_rate(&self) -> f64 {
if self.request_count > 0 {
(self.error_count as f64 / self.request_count as f64) * 100.0
} else {
0.0
}
}
pub fn is_enabled(&self) -> bool {
self.instance.is_enabled()
}
pub fn supports_task(&self, task_name: &str) -> bool {
self.instance.get_supported_tasks().contains_key(task_name)
}
}