use serde::{Deserialize, Serialize};
use super::provider::LlmProvider;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ModelRouting {
pub code: Option<String>,
pub orchestrate: Option<String>,
pub execute: Option<String>,
}
impl ModelRouting {
pub fn route(&self, query: &str) -> Option<&str> {
let q = query.to_lowercase();
if self.code.is_some() {
let code_signals = [
"implement",
"write",
"create",
"refactor",
"fix",
"add test",
"add function",
"struct",
"enum",
"trait",
"algorithm",
"data structure",
];
if code_signals.iter().any(|s| q.contains(s)) {
return self.code.as_deref();
}
}
if self.orchestrate.is_some() {
let orch_signals = [
"search", "find", "analyze", "review", "explain", "compare", "list", "check",
"verify", "diagnose", "audit",
];
if orch_signals.iter().any(|s| q.contains(s)) {
return self.orchestrate.as_deref();
}
}
if self.execute.is_some() {
let exec_signals = [
"run", "execute", "bash", "cargo", "test", "build", "deploy", "install", "commit",
];
if exec_signals.iter().any(|s| q.contains(s)) {
return self.execute.as_deref();
}
}
None
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CloudConfig {
pub provider: LlmProvider,
pub model: String,
#[serde(default)]
pub fallback_models: Vec<String>,
}