Zackriya-Solutions/meetily · warning · anyhow::Error

Model is currently downloading

Error message

Model {} is currently downloading

What it means

Thrown by WhisperModelManager::load_model when the requested model's ModelStatus is Downloading. A download task is still streaming the ggml file to disk, so load is refused to prevent whisper.cpp from memory-mapping a partial file. The error clears once the download finishes and status becomes Available.

Solutions

  1. Wait for the download progress event to report 100 and the status to become Available, then retry load_model
  2. If the status is stuck at Downloading after a crash/restart, call get_models (which rescans the registry/disk) or delete_model then download_model again
  3. Disable the Load button in the UI while the model status is Downloading

Example fix

// before (frontend)
await invoke('load_whisper_model', { modelName }); // fails with 'currently downloading'

// after
const models = await invoke<ModelInfo[]>('get_whisper_models');
const m = models.find(m => m.name === modelName);
if (m?.status === 'Downloading') {
  showToast('Model still downloading — wait for 100%');
} else {
  await invoke('load_whisper_model', { modelName });
}
Defensive patterns

Strategy: validation

Validate before calling

// Before load_model: check status via the model list command
const models = await invoke<Array<{ name: string; status: string }>>('get_whisper_models');
const m = models.find(x => x.name === modelName);
if (!m || m.status !== 'Available') {
  throw new Error(`Model not loadable yet (status: ${m?.status ?? 'unknown'})`);
}
await invoke('load_whisper_model', { modelName });

Type guard

const isLoadable = (m: { status: string } | undefined): m is { status: 'Available' } =>
  m?.status === 'Available';

Try / catch

try {
  await invoke('load_whisper_model', { modelName });
} catch (e) {
  if (String(e).includes('currently downloading')) {
    // subscribe to download progress; retry on 100%
  } else { throw e; }
}

Prevention

When it happens

Trigger: Calling load_model (Tauri command load_whisper_model) for a model whose download_model call is still in progress; clicking Load in the UI while the progress callback reports < 100; retrying load immediately after starting a download.

Common situations: UI lets the user press Load while a download badge shows partial progress; app crashed or was killed mid-download leaving a stale Downloading status in the registry; automated test starts transcription before the model fetch completes.

Related errors


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

Appendix: source

Thrown at frontend/src-tauri/src/whisper_engine/whisper_engine.rs:369

                };

                // Update current context and model
                *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;

View on GitHub (pinned to a2cb62e827)