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

Parakeet model {} is currently downloading

Error message

Parakeet model {} is currently downloading

What it means

Returned by load_model when the model's status is ModelStatus::Downloading. The status map marks a model Downloading while download_model_detailed is streaming files, and discover_models also forces Downloading for names present in active_downloads, so the engine refuses to load a half-written model directory.

Source

Thrown at frontend/src-tauri/src/parakeet_engine/parakeet_engine.rs:418

                let model = ParakeetModel::new(&model_info.path, quantized)
                    .map_err(|e| anyhow!("Failed to load Parakeet model {}: {}", model_name, e))?;

                // Update current model and model name
                *self.current_model.write().await = Some(model);
                *self.current_model_name.write().await = Some(model_name.to_string());

                log::info!(
                    "Successfully loaded Parakeet model: {} ({})",
                    model_name,
                    if quantized { "Int8 quantized" } else { "FP32" }
                );
                Ok(())
            }
            ModelStatus::Missing => {
                Err(anyhow!("Parakeet model {} is not downloaded", model_name))
            }
            ModelStatus::Downloading { .. } => {
                Err(anyhow!("Parakeet model {} is currently downloading", model_name))
            }
            ModelStatus::Error(ref err) => {
                Err(anyhow!("Parakeet model {} has error: {}", model_name, err))
            }
            ModelStatus::Corrupted { .. } => {
                Err(anyhow!("Parakeet model {} is corrupted and cannot be loaded", model_name))
            }
        }
    }

    /// Unload the current model
    pub async fn unload_model(&self) -> bool {
        let mut model_guard = self.current_model.write().await;
        let unloaded = model_guard.take().is_some();
        if unloaded {
            log::info!("Parakeet model unloaded");
        }

View on GitHub (pinned to 0281737d87)

Solutions

  1. Wait for the download completion event emitted by parakeet_download_model, then retry the load
  2. Poll parakeet_get_available_models until status is "Available" with a timeout before giving up
  3. Disable the load/select button in the UI while a download is in progress

Example fix

// before
await invoke('parakeet_load_model', { modelName });

// after - only load when not downloading
const info = (await invoke<any[]>('parakeet_get_available_models')).find(m => m.name === modelName);
if (info && typeof info.status === 'object' && 'Downloading' in info.status) {
  await new Promise(res => { /* resolve on download-complete event */ });
}
await invoke('parakeet_load_model', { modelName });
Defensive patterns

Strategy: validation

Validate before calling

// Refuse to load while a download is active for this model
let infos = engine.discover_models().await?;
if let Some(m) = infos.iter().find(|m| m.name == name) {
    if matches!(m.status, ModelStatus::Downloading { .. }) {
        anyhow::bail!("download in flight; wait for completion");
    }
}

Type guard

fn is_downloading(info: &ModelInfo) -> bool {
    matches!(info.status, ModelStatus::Downloading { .. })
}

// TS side: struct variants arrive externally tagged, e.g. { Downloading: { progress: 42 } }
function isDownloading(status: unknown): boolean {
  return typeof status === 'object' && status !== null && 'Downloading' in status;
}

Try / catch

try {
  await invoke('parakeet_load_model', { modelName });
} catch (e) {
  if (String(e).includes('currently downloading')) {
    // benign: attach to the running download's progress events and retry on completion
  } else {
    throw e;
  }
}

Prevention

When it happens

Trigger: Calling parakeet_load_model while a download for the same model is active (download started from the settings UI, a retry, or a second window); calling load right after triggering download without waiting for the completion event; a download task that is slow on large files (encoder ~652 MB) so the overlap window is minutes long.

Common situations: UI lets the user click "Use model" while the progress bar is still moving; double-invocation of the download command where one instance is still active; slow connection (v3 downloads come from meetily.towardsgeneralintelligence.com, v2 from huggingface.co) making users think the download finished.

Related errors


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