use crate::models::ModelInfo;
use axum::body::Body;
use hyper_util::client::legacy::Client;
use std::collections::VecDeque;
use std::sync::Arc;
use tokio::sync::Mutex;
#[derive(Clone, Debug)]
pub struct ProxyServer {
pub model_name: String,
pub addr: String,
pub metrics: ServerMetrics,
}
#[derive(Clone, Debug)]
pub struct ServerMetrics {
pub avg_response_time_ms: f64,
pub total_requests: u64,
pub recent_failures: u64,
pub last_request_time: Option<std::time::SystemTime>,
pub recent_rewards: VecDeque<f64>,
pub window_size: usize,
}
impl Default for ServerMetrics {
fn default() -> Self {
Self {
avg_response_time_ms: 100.0,
total_requests: 0,
recent_failures: 0,
last_request_time: None,
recent_rewards: VecDeque::new(),
window_size: 1000, }
}
}
#[derive(Clone, Debug)]
pub struct EndpointModelsCache {
pub endpoint: String,
pub models: Vec<ModelInfo>,
pub discovered_at: std::time::SystemTime,
}
#[derive(Clone)]
pub struct AppState {
pub servers: Arc<Mutex<Vec<ProxyServer>>>,
pub http_client: Client<hyper_util::client::legacy::connect::HttpConnector, Body>,
pub models_cache: Arc<Mutex<Vec<EndpointModelsCache>>>,
}
impl AppState {
pub fn new(
http_client: Client<hyper_util::client::legacy::connect::HttpConnector, Body>,
) -> Self {
Self {
servers: Arc::new(Mutex::new(vec![])),
http_client,
models_cache: Arc::new(Mutex::new(vec![])),
}
}
}