use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct ResourceBudget {
#[serde(default)]
pub max_tokens: Option<usize>,
#[serde(default)]
pub max_parallel_tools: Option<usize>,
#[serde(default)]
pub latency_ms_target: Option<u64>,
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct ComplexityModelMap {
#[serde(default)]
pub simple: String,
#[serde(default)]
pub standard: String,
#[serde(default)]
pub complex: String,
#[serde(default)]
pub codegen_heavy: String,
#[serde(default)]
pub retrieval_heavy: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct RouterConfig {
#[serde(default = "default_enabled")]
pub enabled: bool,
#[serde(default = "default_true")]
pub heuristic_classification: bool,
#[serde(default)]
pub llm_router_model: String,
#[serde(default)]
pub models: ComplexityModelMap,
#[serde(default)]
pub budgets: std::collections::HashMap<String, ResourceBudget>,
}
impl Default for RouterConfig {
fn default() -> Self {
use crate::config::constants::models;
Self {
enabled: true,
heuristic_classification: true,
llm_router_model: String::new(),
models: ComplexityModelMap {
simple: models::google::GEMINI_2_5_FLASH_PREVIEW.to_string(),
standard: models::google::GEMINI_2_5_FLASH_PREVIEW.to_string(),
complex: models::google::GEMINI_2_5_PRO.to_string(),
codegen_heavy: models::google::GEMINI_2_5_PRO.to_string(),
retrieval_heavy: models::google::GEMINI_2_5_PRO.to_string(),
},
budgets: Default::default(),
}
}
}
fn default_true() -> bool {
true
}
fn default_enabled() -> bool {
true
}