use crate::filesystem::Filesystem;
const MODEL_FILE: &str = ".lh_model";
pub(crate) const DEFAULT_MODEL: &str = "gemini-3.5-flash";
pub(crate) const MODELS: &[(&str, &str)] = &[
("gemini-3.5-flash", "Gemini"),
("claude-haiku-4-5-20251001", "Claude Haiku"),
("claude-sonnet-4-6", "Claude Sonnet"),
("claude-opus-4-8", "Claude Opus"),
("gemma-3-270m", "Local (Gemma)"),
];
pub(crate) fn is_anthropic(model: &str) -> bool {
model.starts_with("claude-")
}
pub(crate) fn is_local(model: &str) -> bool {
model.starts_with("gemma-")
}
pub(crate) async fn load() -> String {
let fs = super::shared_opfs();
let chosen = fs
.read(MODEL_FILE)
.await
.ok()
.and_then(|bytes| String::from_utf8(bytes).ok())
.map(|s| s.trim().to_string())
.unwrap_or_default();
if MODELS.iter().any(|(id, _)| *id == chosen) {
chosen
} else {
DEFAULT_MODEL.to_string()
}
}
pub(crate) async fn save(model: &str) {
if !MODELS.iter().any(|(id, _)| *id == model) {
return;
}
let fs = super::shared_opfs();
if let Err(err) = fs.write_atomic(MODEL_FILE, model.as_bytes()).await {
web_sys::console::warn_1(&wasm_bindgen::JsValue::from_str(&format!(
"model save: {err}"
)));
}
}