Zackriya-Solutions/meetily · error · anyhow::Error
Model {} has error: {}
Error message
Model {} has error: {} What it means
load_model matched ModelStatus::Error(err): a previous download attempt or file scan recorded a failure for this model (partial write, IO error, unreadable file) and stored the inner error string. Load is refused because the on-disk ggml artifact is known-bad. The embedded err text carries the root cause.
Source
Thrown at frontend/src-tauri/src/whisper_engine/whisper_engine.rs:337
*self.current_context.write().await = Some(ctx);
*self.current_model.write().await = Some(model_name.to_string());
// Enhanced acceleration status reporting
let acceleration_status = acceleration.status_label();
log::info!("Successfully loaded model: {} with {} (Performance Tier: {:?}, Beam Size: {}, Threads: {:?})",
model_name, acceleration_status, hardware_profile.performance_tier,
adaptive_config.beam_size, adaptive_config.max_threads);
Ok(())
},
ModelStatus::Missing => {
Err(anyhow!("Model {} is not downloaded", model_name))
},
ModelStatus::Downloading { .. } => {
Err(anyhow!("Model {} is currently downloading", model_name))
},
ModelStatus::Error(ref err) => {
Err(anyhow!("Model {} has error: {}", model_name, err))
},
ModelStatus::Corrupted { .. } => {
Err(anyhow!("Model {} is corrupted and cannot be loaded", model_name))
}
}
}
pub async fn unload_model(&self) -> bool {
let mut ctx_guard = self.current_context.write().await;
let unloaded = ctx_guard.take().is_some();
if unloaded {
log::info!("📉Whisper model unloaded");
}
let mut model_name_guard = self.current_model.write().await;
model_name_guard.take();
unloadedView on GitHub (pinned to 0281737d87)
Solutions
- Read the embedded inner error message to identify the root cause before acting
- Run download_model again for the same name — it overwrites the bad file from scratch
- If re-download keeps failing, delete the ggml-<name>.bin file manually from the models dir, then download again
- Check disk space and antivirus exclusions for the models directory
Defensive patterns
Strategy: fallback
Validate before calling
const models = await invoke<ModelInfo[]>('get_whisper_models');
const m = models.find(x => x.name === modelName);
if (m?.status === 'Error') {
// recover: overwrite the bad file
await invoke('download_model', { modelName });
}
await invoke('load_whisper_model', { modelName }); Type guard
const isInErrorState = (m: ModelInfo | undefined): boolean => m?.status === 'Error';
Try / catch
try {
await invoke('load_whisper_model', { modelName });
} catch (e) {
const msg = String(e);
if (msg.includes('has error')) {
log.warn(msg); // inner error names the root cause
await invoke('download_model', { modelName }); // fallback: re-download
await invoke('load_whisper_model', { modelName });
} else { throw e; }
} Prevention
- Surface the embedded inner error string in the UI so users see the real cause (disk, network, AV)
- Add antivirus exclusions for the models directory on Windows
- After any failed download, immediately clean up or re-download before attempting a load
When it happens
Trigger: A prior download_model failed mid-stream and set Error status; disk scan found the ggml file unreadable or the wrong size; antivirus quarantined the file after download; then load_model is called for that name.
Common situations: Interrupted downloads on unstable networks; disk-full during a large-v3 (~3GB) fetch; security software locking or removing .bin files; moving a models directory between machines with truncation.
Related errors
- Model {} is currently downloading
- Model '{}' not found
- Whisper engine not initialized
- Model {} is corrupted and cannot be loaded
- No model loaded. Please load a model first.
AI-assisted analysis of Zackriya-Solutions/meetily@0281737d87 (2026-08-16).
Data as JSON: /api/errors/b5d147218635b94c.
Report an issue: GitHub.