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

Unsupported model: {}

Error message

Unsupported model: {}

What it means

download_model maps a fixed set of model names to official ggerganov/whisper.cpp HuggingFace URLs via a match; any other string hits the default arm and is rejected before any network I/O. Supported keys: tiny, base, small, medium, large-v3-turbo, large-v3, tiny-q5_1, base-q5_1, small-q5_1, medium-q5_0, large-v3-turbo-q5_0, large-v3-q5_0. Matching is exact and case-sensitive.

Source

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

            // Standard f16 models
            "tiny" => "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-tiny.bin",
            "base" => "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.bin",
            "small" => "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.bin",
            "medium" => "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-medium.bin",
            "large-v3-turbo" => "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-large-v3-turbo.bin",
            "large-v3" => "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-large-v3.bin",

            // Q5_1 quantized models
            "tiny-q5_1" => "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-tiny-q5_1.bin",
            "base-q5_1" => "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base-q5_1.bin",
            "small-q5_1" => "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small-q5_1.bin",

            // Q5_0 quantized models
            "medium-q5_0" => "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-medium-q5_0.bin",
            "large-v3-turbo-q5_0" => "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-large-v3-turbo-q5_0.bin",
            "large-v3-q5_0" => "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-large-v3-q5_0.bin",

            _ => return Err(anyhow!("Unsupported model: {}", model_name))
        };
        
        log::info!("Model URL for {}: {}", model_name, model_url);
        
        // Generate correct filename - all models follow ggml-{model_name}.bin pattern
        let filename = format!("ggml-{}.bin", model_name);
        let file_path = self.models_dir.join(&filename);
        
        log::info!("Downloading to file path: {}", file_path.display());
        
        // Create models directory if it doesn't exist
        if !self.models_dir.exists() {
            fs::create_dir_all(&self.models_dir).await
                .map_err(|e| anyhow!("Failed to create models directory: {}", e))?;
        }
        
        // Update model status to downloading
        {

View on GitHub (pinned to 0281737d87)

Solutions

  1. Use one of the exact supported keys listed above, byte-for-byte
  2. Fetch the model list from the engine (get_whisper_models) and only offer those ids in the UI
  3. To add a new model, extend both this match arm with its URL and the frontend catalog, keeping the ggml-<key>.bin naming convention

Example fix

// before
await invoke('download_model', { modelName: 'medium-q5_1' }); // unsupported

// after
await invoke('download_model', { modelName: 'medium-q5_0' }); // real key
Defensive patterns

Strategy: validation

Validate before calling

const SUPPORTED = ['tiny','base','small','medium','large-v3-turbo','large-v3',
  'tiny-q5_1','base-q5_1','small-q5_1','medium-q5_0','large-v3-turbo-q5_0','large-v3-q5_0'];
if (!SUPPORTED.includes(modelName)) {
  throw new Error(`Unsupported model '${modelName}'. Supported: ${SUPPORTED.join(', ')}`);
}
await invoke('download_model', { modelName });

Type guard

const isSupportedModel = (name: string): name is typeof SUPPORTED[number] =>
  SUPPORTED.includes(name as any);

Try / catch

try {
  await invoke('download_model', { modelName });
} catch (e) {
  if (String(e).includes('Unsupported model')) { showSupportedModelList(); } else { throw e; }
}

Prevention

When it happens

Trigger: Passing 'large' or 'turbo' (not real keys); casing mistakes like 'Base'; wrong quantization suffix ('medium-q5_1' does not exist — only medium-q5_0); passing an arbitrary HuggingFace repo id.

Common situations: Frontend model list out of sync with the Rust catalog after a version update; user typing a custom model name; scripts hardcoding names from older releases (e.g. 'large-v2' was never added here).

Related errors


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