{"record":{"id":"23bfa136fc9c87b4","repo":"Zackriya-Solutions/meetily","slug":"parakeet-model-not-found","errorCode":null,"errorMessage":"Parakeet model '{}' not found","messagePattern":"Parakeet model '(.+?)' not found","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"frontend/src-tauri/src/parakeet_engine/parakeet_engine.rs","lineNumber":492,"sourceCode":"        Ok(result.text)\n    }\n\n    /// Get the models directory path\n    pub async fn get_models_directory(&self) -> PathBuf {\n        self.models_dir.clone()\n    }\n\n    /// Delete a corrupted model\n    pub async fn delete_model(&self, model_name: &str) -> Result<String> {\n        log::info!(\"Attempting to delete Parakeet model: {}\", model_name);\n\n        // Get model info to find the directory path\n        let model_info = {\n            let models = self.available_models.read().await;\n            models.get(model_name).cloned()\n        };\n\n        let model_info = model_info.ok_or_else(|| anyhow!(\"Parakeet model '{}' not found\", model_name))?;\n\n        log::info!(\"Parakeet model '{}' has status: {:?}\", model_name, model_info.status);\n\n        // Allow deletion of corrupted or available models\n        match &model_info.status {\n            ModelStatus::Corrupted { .. } | ModelStatus::Available => {\n                // Delete the entire model directory\n                if model_info.path.exists() {\n                    fs::remove_dir_all(&model_info.path).await\n                        .map_err(|e| anyhow!(\"Failed to delete directory '{}': {}\", model_info.path.display(), e))?;\n                    log::info!(\"Successfully deleted Parakeet model directory: {}\", model_info.path.display());\n                } else {\n                    log::warn!(\"Directory '{}' does not exist, nothing to delete\", model_info.path.display());\n                }\n\n                // Update model status to Missing\n                {\n                    let mut models = self.available_models.write().await;","sourceCodeStart":474,"sourceCodeEnd":510,"githubUrl":"https://github.com/Zackriya-Solutions/meetily/blob/0281737d87d26352fb0adc78c8c0975f691b23d1/frontend/src-tauri/src/parakeet_engine/parakeet_engine.rs#L474-L510","documentation":"Returned by delete_model when the name is not a key in the available_models map. The catalog is built by discover_models from a fixed config list (parakeet-tdt-0.6b-v3-int8, parakeet-tdt-0.6b-v2-int8), so any other string - including FP32 names, v1 names, or typos - is unknown even if a similarly named directory exists on disk.","triggerScenarios":"Calling parakeet_delete_corrupted_model / engine.delete_model with a mistyped name or an unsupported variant (e.g. \"parakeet-tdt-0.6b-v3\" without the int8 suffix, or \"parakeet-tdt-0.6b-v2-fp32\"); passing a Whisper model name to the Parakeet API; a stale frontend hardcoding an old model identifier after a catalog change.","commonSituations":"Frontend model list out of sync with the Rust catalog after an app update; copy-paste of model ids from HuggingFace repo names instead of the app's catalog ids; mixing up whisper and parakeet command surfaces.","solutions":["List valid names first with parakeet_get_available_models (or engine.discover_models) and pass exactly one of those name strings","Update hardcoded model ids in the frontend to the current catalog (parakeet-tdt-0.6b-v3-int8 / parakeet-tdt-0.6b-v2-int8)","If a directory with a rogue name exists under the models dir, remove it manually via open_parakeet_models_folder - delete_model will never see it"],"exampleFix":"// before\nengine.delete_model(\"parakeet-tdt-0.6b-v3\").await?;\n\n// after - resolve the exact catalog name before deleting\nlet models = engine.discover_models().await?;\nlet target = models.iter().find(|m| m.name == requested)\n    .ok_or_else(|| anyhow!(\"unknown model {requested}; valid: {:?}\",\n        models.iter().map(|m| m.name.clone()).collect::<Vec<_>>()))?;\nengine.delete_model(&target.name).await?;","handlingStrategy":"validation","validationCode":"// Resolve against the live catalog before deleting\nlet names: Vec<String> = engine.discover_models().await?\n    .into_iter().map(|m| m.name).collect();\nif !names.contains(&name) {\n    anyhow::bail!(\"'{name}' is not a Parakeet catalog model; valid: {names:?}\");\n}","typeGuard":"function isKnownParakeetModel(name: string, catalog: { name: string }[]): boolean {\n  return catalog.some(m => m.name === name);\n}","tryCatchPattern":"try {\n  await invoke('parakeet_delete_corrupted_model', { modelName });\n} catch (e) {\n  if (String(e).includes('not found')) {\n    // refresh the model list; the id is stale or mistyped - never retry unchanged\n  } else {\n    throw e;\n  }\n}","preventionTips":["Never hardcode model ids in the UI; source them from parakeet_get_available_models","After app updates, re-fetch the catalog - ids like parakeet-tdt-0.6b-v3-int8 can change between versions","Keep Whisper model ids and Parakeet ids in separate constants to avoid cross-API calls"],"tags":["parakeet","model-management","validation","tauri"],"backgroundTag":"model-not-found","analyzedSha":"0281737d87d26352fb0adc78c8c0975f691b23d1","analyzedAt":"2026-08-16T20:57:52.567Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}