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
- Use one of the exact supported keys listed above, byte-for-byte
- Fetch the model list from the engine (get_whisper_models) and only offer those ids in the UI
- 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
- Render the model picker exclusively from get_whisper_models output so the UI can never send an unknown key
- When adding models, update the Rust match and every hardcoded frontend list in the same change
- Reject free-text model names at the input layer; offer a dropdown instead
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
- Model '{}' not found
- Model {} is currently downloading
- Model {} has error: {}
- Model {} is corrupted and cannot be loaded
- Can only delete corrupted or available models. Model '{}' ha
AI-assisted analysis of Zackriya-Solutions/meetily@0281737d87 (2026-08-16).
Data as JSON: /api/errors/2e0ddbaccc31fc44.
Report an issue: GitHub.