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();

        unloaded

View on GitHub (pinned to 0281737d87)

Solutions

  1. Read the embedded inner error message to identify the root cause before acting
  2. Run download_model again for the same name — it overwrites the bad file from scratch
  3. If re-download keeps failing, delete the ggml-<name>.bin file manually from the models dir, then download again
  4. 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

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


AI-assisted analysis of Zackriya-Solutions/meetily@0281737d87 (2026-08-16). Data as JSON: /api/errors/b5d147218635b94c. Report an issue: GitHub.