{"record":{"id":"9feb32df30b58419","repo":"Zackriya-Solutions/meetily","slug":"error-9feb32","errorCode":null,"errorMessage":"{}: {}","messagePattern":"\\{\\}: \\{\\}","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"frontend/src-tauri/src/summary/summary_engine/model_manager.rs","lineNumber":644,"sourceCode":"                            let error_msg = if e.is_timeout() {\n                                \"Connection timeout - Check your internet\"\n                            } else if e.is_connect() {\n                                \"Connection failed - Check your internet\"\n                            } else if e.is_body() {\n                                \"Stream interrupted - Network unstable\"\n                            } else {\n                                \"Download error\"\n                            };\n\n                            // Set model status to Error (NOT NotDownloaded) so UI can show retry button\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::Error(error_msg.to_string());\n                                }\n                            }\n\n                            return Err(anyhow!(\"{}: {}\", error_msg, e));\n                        }\n                    }\n                }\n            };\n            let chunk_len = chunk.len() as u64;\n            writer\n                .write_all(&chunk)\n                .await\n                .map_err(|e| anyhow!(\"Error writing to file: {}\", e))?;\n\n            downloaded += chunk_len;\n            bytes_since_last_report += chunk_len;\n\n            // Calculate progress\n            let progress_percent = if total_size > 0 {\n                let exact_percent = (downloaded as f64 / total_size as f64) * 100.0;\n                exact_percent.min(100.0) as u8\n            } else {","sourceCodeStart":626,"sourceCodeEnd":662,"githubUrl":"https://github.com/Zackriya-Solutions/meetily/blob/0281737d87d26352fb0adc78c8c0975f691b23d1/frontend/src-tauri/src/summary/summary_engine/model_manager.rs#L626-L662","documentation":"Thrown from the chunk loop of ModelManager::download_model when the reqwest byte stream itself yields an error mid-transfer. The manager classifies the reqwest error into a user-facing prefix ('Connection timeout - Check your internet', 'Connection failed - Check your internet', 'Stream interrupted - Network unstable', or generic 'Download error'), sets the model status to ModelStatus::Error so the UI shows a retry button, and returns the prefix concatenated with the underlying error.","triggerScenarios":"Calling download_model for a summary (GGUF) model and the HTTP connection to the model host fails mid-body: reqwest error where is_timeout() (connect/read timeout), is_connect() (DNS/TCP/TLS failure), or is_body() (connection reset during transfer) is true. The separate 30-second per-chunk stall timeout has its own message, so this fires only on an actual stream error, not mere slowness.","commonSituations":"Unstable Wi-Fi or VPN dropping during a multi-GB model download, corporate proxies/firewalls resetting long-lived connections to the model host (e.g. huggingface.co), DNS failure at connect time, laptop sleep/resume interrupting an in-flight download.","solutions":["Check connectivity and retry from the UI - status is ModelStatus::Error, so the retry button is shown and the partial file is kept for resume","If behind a proxy/VPN/TLS-intercepting firewall, exclude the model host or bypass it for the download","Verify the model URL is reachable: curl -sIL <model url> should return 200 and a large content-length","If it keeps failing at the same offset, delete the partial file and restart the download from scratch"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// Rust caller: pre-flight the model URL before download_model\nlet resp = client.head(&model_def.url).send().await?;\nif !resp.status().is_success() {\n    // fix network/URL before starting a multi-GB download\n    return Err(anyhow!(\"model host returned {}\", resp.status()));\n}","typeGuard":null,"tryCatchPattern":"// TypeScript (Tauri invoke)\ntry {\n  await invoke('download_summary_model', { modelName });\n} catch (e) {\n  const msg = String(e);\n  if (msg.startsWith('CANCELLED:')) return;            // user cancel, not a failure\n  if (/Connection|Stream interrupted|Download error/.test(msg)) {\n    scheduleRetryWithBackoff(modelName);               // partial file resumes\n  } else throw e;\n}","preventionTips":["Run downloads on a stable network; avoid VPN switching or sleep/resume mid-download","Keep the partial file on failure so retry resumes instead of restarting","Show the categorized prefix ('Connection timeout - Check your internet', etc.) to users instead of the raw reqwest error"],"tags":["network","download","model-manager","reqwest","gguf"],"backgroundTag":"network-download-interrupted","analyzedSha":"0281737d87d26352fb0adc78c8c0975f691b23d1","analyzedAt":"2026-08-16T20:57:52.567Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}