{"record":{"id":"0e98f10706483ace","repo":"Zackriya-Solutions/meetily","slug":"unknown-model-0e98f1","errorCode":null,"errorMessage":"Unknown model: {}","messagePattern":"Unknown model: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"frontend/src-tauri/src/summary/summary_engine/model_manager.rs","lineNumber":369,"sourceCode":"    pub async fn download_model_detailed(\n        &self,\n        model_name: &str,\n        progress_callback: Option<Box<dyn Fn(DownloadProgress) + Send>>,\n    ) -> Result<()> {\n        log::info!(\"Starting download for model: {}\", model_name);\n\n        // Check if already downloading\n        {\n            let active = self.active_downloads.read().await;\n            if active.contains(model_name) {\n                log::warn!(\"Download already in progress for model: {}\", model_name);\n                return Err(anyhow!(\"Download already in progress\"));\n            }\n        }\n\n        // Get model definition\n        let model_def = get_model_by_name(model_name)\n            .ok_or_else(|| anyhow!(\"Unknown model: {}\", model_name))?;\n\n        // Add to active downloads\n        {\n            let mut active = self.active_downloads.write().await;\n            active.insert(model_name.to_string());\n        }\n\n        // Clear cancellation flag\n        {\n            let mut cancel_flag = self.cancel_download_flag.write().await;\n            *cancel_flag = None;\n        }\n\n        // Update status to downloading\n        {\n            let mut models = self.available_models.write().await;\n            if let Some(model_info) = models.get_mut(model_name) {\n                model_info.status = ModelStatus::Downloading { progress: 0 };","sourceCodeStart":351,"sourceCodeEnd":387,"githubUrl":"https://github.com/Zackriya-Solutions/meetily/blob/0281737d87d26352fb0adc78c8c0975f691b23d1/frontend/src-tauri/src/summary/summary_engine/model_manager.rs#L351-L387","documentation":"get_model_by_name returned None when download_model_detailed tried to resolve the model definition, so the download aborts before any network activity. Registry names are exact-match ids ('qwen3.5:2b', 'qwen3.5:4b', 'gemma3:4b', 'gemma3:1b'); display names are not accepted.","triggerScenarios":"Passing a display name like 'Qwen 3.5 2B (Balanced)' instead of the id; passing a bare name without the ':size' tag; a persisted model id from an older registry version; passing another engine's model id (e.g. a parakeet model) to the summary model manager.","commonSituations":"Settings migration keeps an old model key after the registry changes; dropdown bound to display_name instead of name; hand-written model strings in tests.","solutions":["Pass an exact registry id including the size suffix, e.g. 'qwen3.5:4b'","Build the download UI from get_available_models() so ids are always in sync","Validate persisted model ids at startup and reset to the default model when unknown","Trim and validate the id before invoking the download command"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"let id = requested.trim();\nif crate::summary::summary_engine::models::get_model_by_name(id).is_none() {\n    return Err(anyhow!(\"Unknown model '{}' — pick from get_available_models()\", id));\n}\nmanager.download_model_detailed(id, cb).await","typeGuard":"fn is_registry_model(id: &str) -> bool {\n    models::get_model_by_name(id.trim()).is_some()\n}","tryCatchPattern":null,"preventionTips":["Bind download UI values to ModelDef.name, never display_name","Validate ids at the Tauri command boundary before touching the manager","Reset stale persisted ids to get_default_model().name at startup"],"tags":["model","validation","download","rust"],"backgroundTag":"unknown-model-name","analyzedSha":"0281737d87d26352fb0adc78c8c0975f691b23d1","analyzedAt":"2026-08-16T20:57:52.567Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}