use std::sync::Arc;
use super::cascade::ClassifierMode;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[non_exhaustive]
pub enum RouterStrategy {
#[default]
Ema,
Thompson,
Cascade,
Bandit,
}
#[derive(Debug, Clone)]
#[allow(clippy::doc_markdown)] pub struct BanditRouterConfig {
pub alpha: f32,
pub dim: usize,
pub cost_weight: f32,
pub decay_factor: f32,
pub warmup_queries: u64,
pub embedding_timeout_ms: u64,
pub cache_size: usize,
pub memory_confidence_threshold: f32,
}
impl Default for BanditRouterConfig {
fn default() -> Self {
Self {
alpha: 1.0,
dim: 32,
cost_weight: 0.1,
decay_factor: 1.0,
warmup_queries: 0, embedding_timeout_ms: 50,
cache_size: 512,
memory_confidence_threshold: 0.9,
}
}
}
#[derive(Debug, Clone)]
pub struct AsiRouterConfig {
pub window: usize,
pub coherence_threshold: f32,
pub penalty_weight: f32,
}
impl Default for AsiRouterConfig {
fn default() -> Self {
Self {
window: 5,
coherence_threshold: 0.7,
penalty_weight: 0.3,
}
}
}
#[derive(Debug, Clone)]
pub struct CascadeRouterConfig {
pub quality_threshold: f64,
pub max_escalations: u8,
pub classifier_mode: ClassifierMode,
pub window_size: usize,
pub max_cascade_tokens: Option<u32>,
pub summary_provider: Option<Arc<dyn crate::provider_dyn::LlmProviderDyn>>,
pub cost_tiers: Option<Vec<String>>,
pub judge_timeout_ms: u64,
}
impl Default for CascadeRouterConfig {
fn default() -> Self {
Self {
quality_threshold: 0.5,
max_escalations: 2,
classifier_mode: ClassifierMode::Heuristic,
window_size: 50,
max_cascade_tokens: None,
summary_provider: None,
cost_tiers: None,
judge_timeout_ms: 5_000,
}
}
}