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

Parakeet model {} is not downloaded

Error message

Parakeet model {} is not downloaded

What it means

Returned by load_model when the model's tracked status is ModelStatus::Missing. discover_models computes this status from the filesystem: the directory models_dir/<name> must exist and contain the required files for the quantization type, otherwise the entry is Missing. It means the name is a known catalog model (parakeet-tdt-0.6b-v3-int8 or parakeet-tdt-0.6b-v2-int8) but no complete local copy exists.

Source

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

                // Load model based on quantization type
                let quantized = model_info.quantization == QuantizationType::Int8;
                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 {

View on GitHub (pinned to 0281737d87)

Solutions

  1. Call parakeet_download_model (engine.download_model) for the model and wait for the download-complete event before loading
  2. Verify with parakeet_get_available_models that status is now "Available", then retry parakeet_load_model
  3. If status is stuck at Missing although files exist on disk, restart the app so discover_models re-scans the models directory

Example fix

// before
await invoke('parakeet_load_model', { modelName: 'parakeet-tdt-0.6b-v3-int8' });

// after
const models = await invoke<any[]>('parakeet_get_available_models');
const m = models.find(x => x.name === 'parakeet-tdt-0.6b-v3-int8');
if (m?.status !== 'Available') {
  await invoke('parakeet_download_model', { modelName: m.name });
  // wait for the parakeet download-complete event before continuing
}
await invoke('parakeet_load_model', { modelName: m.name });
Defensive patterns

Strategy: validation

Validate before calling

// Only attempt load when discovery reports the model on disk
let infos = engine.discover_models().await?;
match infos.iter().find(|m| m.name == name) {
    Some(m) if matches!(m.status, ModelStatus::Available) => engine.load_model(name).await?,
    Some(_) => { /* trigger download flow first */ }
    None => { /* unknown model name */ }
}

Type guard

// TS side: ModelStatus unit variants serialize as plain strings
function isModelAvailable(info: { status: unknown }): boolean {
  return info.status === 'Available';
}

Try / catch

try {
  await invoke('parakeet_load_model', { modelName });
} catch (e) {
  if (String(e).includes('is not downloaded')) {
    // start download flow, then retry load on completion event
  } else {
    throw e;
  }
}

Prevention

When it happens

Trigger: Invoking parakeet_load_model / engine.load_model on a fresh install before parakeet_download_model completes; after delete_model succeeded (status reset to Missing); after a download timeout or stream error reset the status to Missing; after the models directory was removed manually while the app or a stale in-memory map still lists the model.

Common situations: First-run UI flow lets the user pick a model that was never downloaded; user cleared Application Support to free space; a previous download failed mid-stream (the error paths in download_model_detailed set status back to Missing) and the UI did not re-trigger the download.

Related errors


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