{"record":{"id":"8de784704ea8123f","repo":"Zackriya-Solutions/meetily","slug":"failed-to-load-parakeet-model-8de784","errorCode":null,"errorMessage":"Failed to load Parakeet model {}: {}","messagePattern":"Failed to load Parakeet model (.+?): (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"frontend/src-tauri/src/parakeet_engine/parakeet_engine.rs","lineNumber":401,"sourceCode":"            ModelStatus::Available => {\n                // Check if this model is already loaded\n                if let Some(current_model) = self.current_model_name.read().await.as_ref() {\n                    if current_model == model_name {\n                        log::info!(\"Parakeet model {} is already loaded, skipping reload\", model_name);\n                        return Ok(());\n                    }\n\n                    // Unload current model before loading new one\n                    log::info!(\"Unloading current Parakeet model '{}' before loading '{}'\", current_model, model_name);\n                    self.unload_model().await;\n                }\n\n                log::info!(\"Loading Parakeet model: {}\", model_name);\n\n                // Load model based on quantization type\n                let quantized = model_info.quantization == QuantizationType::Int8;\n                let model = ParakeetModel::new(&model_info.path, quantized)\n                    .map_err(|e| anyhow!(\"Failed to load Parakeet model {}: {}\", model_name, e))?;\n\n                // Update current model and model name\n                *self.current_model.write().await = Some(model);\n                *self.current_model_name.write().await = Some(model_name.to_string());\n\n                log::info!(\n                    \"Successfully loaded Parakeet model: {} ({})\",\n                    model_name,\n                    if quantized { \"Int8 quantized\" } else { \"FP32\" }\n                );\n                Ok(())\n            }\n            ModelStatus::Missing => {\n                Err(anyhow!(\"Parakeet model {} is not downloaded\", model_name))\n            }\n            ModelStatus::Downloading { .. } => {\n                Err(anyhow!(\"Parakeet model {} is currently downloading\", model_name))\n            }","sourceCodeStart":383,"sourceCodeEnd":419,"githubUrl":"https://github.com/Zackriya-Solutions/meetily/blob/0281737d87d26352fb0adc78c8c0975f691b23d1/frontend/src-tauri/src/parakeet_engine/parakeet_engine.rs#L383-L419","documentation":"Thrown by ParakeetEngine::load_model when ParakeetModel::new fails to construct the model from the model directory. ParakeetModel::new builds three ONNX Runtime sessions (encoder-model[.int8].onnx, decoder_joint-model[.int8].onnx, nemo128.onnx) and parses vocab.txt, so the wrapped error can be file I/O, a truncated/invalid ONNX file, an ort Session builder failure (GraphOptimizationLevel::Level3 / CPUExecutionProvider registration), or a malformed vocabulary (missing <blk> token). The first {} is the model name; the second {} is the underlying ParakeetError.","triggerScenarios":"Calling load_model(\"parakeet-tdt-0.6b-v3-int8\") when the model directory exists and status is Available, but one of the required files (encoder-model.int8.onnx, decoder_joint-model.int8.onnx, nemo128.onnx, vocab.txt) is truncated from an interrupted download that escaped clean_incomplete_model_directory, was deleted externally, or is unreadable; also when vocab.txt is malformed (no <blk> line parses) or the ort session builder rejects the graph.","commonSituations":"Disk filled up mid-download leaving a short .onnx file; user or a cleanup tool deleted files inside ~/Library/Application Support/Meetily/models/<model> (macOS) or %APPDATA%\\Meetily\\models\\<model> (Windows); models folder copied between machines partially; ONNX Runtime version change makes an old downloaded graph unloadable.","solutions":["Inspect models_dir/<model-name> and confirm all four required files exist with plausible sizes (v3 int8 encoder ~652 MB; v2 int8 ~652 MB; decoder ~9 MB)","If any file is missing or suspiciously small, call delete_model(model_name) then download_model(model_name, ...) and retry the load","Check disk space and read permissions on the models directory","Run with RUST_LOG=app_lib::parakeet_engine=debug to see which session (encoder/decoder_joint/nemo128) or the vocab failed, then verify vocab.txt integrity"],"exampleFix":"// before\nengine.load_model(\"parakeet-tdt-0.6b-v3-int8\").await?;\n\n// after - recover by removing the bad copy and re-downloading\nlet name = \"parakeet-tdt-0.6b-v3-int8\";\nif let Err(e) = engine.load_model(name).await {\n    log::warn!(\"Parakeet load failed ({e}); re-downloading {name}\");\n    let _ = engine.delete_model(name).await;\n    engine.download_model(name, None).await?;\n    engine.load_model(name).await?;\n}","handlingStrategy":"fallback","validationCode":"// Before load: confirm status is Available and all required files exist\nlet infos = engine.discover_models().await?;\nlet info = infos.iter().find(|m| m.name == model_name)\n    .ok_or_else(|| anyhow!(\"unknown model\"))?;\nif !matches!(info.status, ModelStatus::Available) {\n    anyhow::bail!(\"model not loadable yet: {:?}\", info.status);\n}\nfor f in [\"encoder-model.int8.onnx\", \"decoder_joint-model.int8.onnx\", \"nemo128.onnx\", \"vocab.txt\"] {\n    let p = &info.path.join(f);\n    if !p.is_file() {\n        anyhow::bail!(\"missing {} under {}\", f, info.path.display());\n    }\n}","typeGuard":"fn is_loadable(info: &ModelInfo) -> bool {\n    matches!(info.status, ModelStatus::Available)\n}","tryCatchPattern":"// On failure, recover by deleting the bad copy and re-downloading once\nmatch engine.load_model(name).await {\n    Ok(()) => {}\n    Err(e) if e.to_string().contains(\"Failed to load Parakeet model\") => {\n        log::warn!(\"load failed ({e}); rebuilding {name}\");\n        let _ = engine.delete_model(name).await;\n        engine.download_model(name, None).await?;\n        engine.load_model(name).await?;\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Never kill the app during a Parakeet download - partial files can pass the size check but fail ONNX load","Keep at least 1 GB free disk before downloading a model","Do not hand-edit or partially copy the models directory","Surface load errors in the UI with a 'delete and re-download' action instead of a raw error toast"],"tags":["parakeet","onnx-runtime","model-loading","rust","tauri"],"backgroundTag":"onnx-model-load-failed","analyzedSha":"0281737d87d26352fb0adc78c8c0975f691b23d1","analyzedAt":"2026-08-16T20:57:52.567Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}