use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
pub struct LlmRouterConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default)]
pub mode: RouterMode,
#[serde(default)]
pub proxy_url: Option<String>,
#[serde(default)]
pub taxonomy_path: Option<String>,
#[serde(default)]
pub cost_optimization_enabled: bool,
#[serde(default)]
pub performance_optimization_enabled: bool,
#[serde(default)]
pub strategy: RouterStrategy,
}
impl Default for LlmRouterConfig {
fn default() -> Self {
Self {
enabled: true,
mode: RouterMode::Library,
proxy_url: None,
taxonomy_path: None,
cost_optimization_enabled: false,
performance_optimization_enabled: false,
strategy: RouterStrategy::Balanced,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default, JsonSchema)]
pub enum RouterMode {
#[serde(rename = "library")]
#[default]
Library,
#[serde(rename = "service")]
Service,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default, JsonSchema)]
pub enum RouterStrategy {
#[serde(rename = "cost_first")]
CostFirst,
#[serde(rename = "quality_first")]
QualityFirst,
#[serde(rename = "balanced")]
#[default]
Balanced,
#[serde(rename = "static")]
Static,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_llm_router_config_default() {
let config = LlmRouterConfig::default();
assert!(config.enabled);
assert!(matches!(config.mode, RouterMode::Library));
assert_eq!(config.strategy, RouterStrategy::Balanced);
assert!(config.proxy_url.is_none());
assert_eq!(config.taxonomy_path, None);
}
#[test]
fn test_router_mode_serialization() {
let modes = vec![RouterMode::Library, RouterMode::Service];
for mode in modes {
let serialized = serde_json::to_string(&mode).unwrap();
let deserialized: RouterMode = serde_json::from_str(&serialized).unwrap();
assert_eq!(mode, deserialized);
}
}
#[test]
fn test_router_strategy_serialization() {
let strategies = vec![
RouterStrategy::CostFirst,
RouterStrategy::QualityFirst,
RouterStrategy::Balanced,
RouterStrategy::Static,
];
for strategy in strategies {
let serialized = serde_json::to_string(&strategy).unwrap();
let deserialized: RouterStrategy = serde_json::from_str(&serialized).unwrap();
assert_eq!(strategy, deserialized);
}
}
}