use std::collections::HashMap;
use std::sync::Arc;
use std::sync::atomic::AtomicU64;
use parking_lot::Mutex;
use crate::any::AnyProvider;
use crate::provider::LlmProvider;
#[derive(Debug, Clone)]
pub struct RouterState {
pub providers: Arc<[AnyProvider]>,
pub provider_models: Arc<HashMap<String, String>>,
pub provider_order: Arc<Mutex<Vec<usize>>>,
pub last_active_provider: Arc<Mutex<Option<String>>>,
pub last_memory_confidence: Arc<Mutex<Option<f32>>>,
pub turn_counter: Arc<AtomicU64>,
pub asi_last_turn: Arc<AtomicU64>,
pub embed_semaphore: Option<Arc<tokio::sync::Semaphore>>,
pub embed_call_count: Arc<AtomicU64>,
pub embed_cache_hits: Arc<AtomicU64>,
}
impl RouterState {
pub fn new(providers: Arc<[AnyProvider]>) -> Self {
let n = providers.len();
let provider_models: HashMap<String, String> = providers
.iter()
.map(|p| (p.name().to_owned(), p.model_identifier().to_owned()))
.collect();
Self {
providers,
provider_models: Arc::new(provider_models),
provider_order: Arc::new(Mutex::new((0..n).collect())),
last_active_provider: Arc::new(Mutex::new(None)),
last_memory_confidence: Arc::new(Mutex::new(None)),
turn_counter: Arc::new(AtomicU64::new(0)),
asi_last_turn: Arc::new(AtomicU64::new(u64::MAX)),
embed_semaphore: None,
embed_call_count: Arc::new(AtomicU64::new(0)),
embed_cache_hits: Arc::new(AtomicU64::new(0)),
}
}
}