use crate::recipe::Recipe;
#[derive(Debug, PartialEq, Eq)]
pub(crate) enum Decision {
ServeCurrent,
SwapTo(String),
}
pub(crate) fn enabled(args: &crate::cli::ServeArgs) -> bool {
args.auto_swap
}
pub(crate) fn decide(requested: &str, live_model: &str, catalogue: &[Recipe]) -> Decision {
let requested = requested.trim();
if requested.is_empty() || requested == live_model {
return Decision::ServeCurrent;
}
match catalogue
.iter()
.filter(|r| r.is_metrale())
.find(|r| r.model == requested)
{
Some(recipe) => Decision::SwapTo(recipe.id.clone()),
None => Decision::ServeCurrent,
}
}
pub(crate) fn ensure_loaded(
host: &std::sync::Arc<super::model_host::ModelHost>,
recipe_id: &str,
requested_model: &str,
catalogue: &[Recipe],
) -> anyhow::Result<()> {
if host.live_model().as_deref() == Some(requested_model) {
return Ok(());
}
let recipe = catalogue
.iter()
.find(|r| r.id == recipe_id)
.ok_or_else(|| anyhow::anyhow!("recipe {recipe_id} vanished between decide and load"))?;
let args = recipe.serve_args(&std::collections::BTreeMap::new())?;
super::model_swap::swap(host, args)?;
Ok(())
}
#[cfg(test)]
#[path = "auto_swap_tests.rs"]
mod tests;