{"record":{"id":"d86338be1a2745d4","repo":"unslothai/unsloth","slug":"stt-model-model-is-not-a-curated-gguf-dictatio","errorCode":null,"errorMessage":"STT model '{model}' is not a curated GGUF dictation model. Choose one of: {', '.join(GGML_STT_MODELS)}.","messagePattern":"STT model '(.+?)' is not a curated GGUF dictation model\\. Choose one of: (.+?)\\.","errorType":"exception","errorClass":"SttModelIdError","httpStatus":422,"severity":"warning","filePath":"studio/backend/core/inference/stt_ggml_sidecar.py","lineNumber":111,"sourceCode":"}\nDEFAULT_GGML_STT_MODEL = \"small\"\n\n_SERVER_START_TIMEOUT_SECONDS = 120.0\n_TRANSCRIBE_TIMEOUT_SECONDS = 600.0\n\n\nclass SttEngineUnavailableError(SttUnavailableError):\n    \"\"\"whisper-server is not installed; the GGUF dictation engine is off.\"\"\"\n\n\ndef resolve_ggml_model_id(model: Optional[str]) -> str:\n    \"\"\"Validate a curated GGML model id. Custom repos are not supported here.\"\"\"\n    if model is None or not str(model).strip():\n        return DEFAULT_GGML_STT_MODEL\n    normalized = str(model).strip()\n    if normalized in GGML_STT_MODELS:\n        return normalized\n    raise SttModelIdError(\n        f\"STT model '{model}' is not a curated GGUF dictation model. \"\n        f\"Choose one of: {', '.join(GGML_STT_MODELS)}.\"\n    )\n\n\ndef _managed_whisper_cpp_dir() -> Path:\n    \"\"\"`<STUDIO_HOME>/whisper.cpp` in custom mode, else `~/.unsloth/whisper.cpp`.\n\n    Mirrors `managed_node_dir` / `_find_llama_server_binary` so managed runtimes\n    share one parent directory.\n    \"\"\"\n    legacy = Path.home() / \".unsloth\" / \"whisper.cpp\"\n    try:\n        from utils.paths.storage_roots import studio_root\n\n        resolved = studio_root()\n        legacy_studio = Path.home() / \".unsloth\" / \"studio\"\n        try:","sourceCodeStart":93,"sourceCodeEnd":129,"githubUrl":"https://github.com/unslothai/unsloth/blob/203007d19051dcd2ae33876786d117c99f6b0368/studio/backend/core/inference/stt_ggml_sidecar.py#L93-L129","documentation":"resolve_ggml_model_id only accepts curated GGUF dictation model ids (the GGML_STT_MODELS allowlist); anything non-empty that is not in that list raises SttModelIdError with the valid choices listed in the message. Custom Hugging Face repos are deliberately unsupported for the GGML dictation engine. An empty/None model falls back to the default instead of raising.","triggerScenarios":"Passing a model id like 'openai/whisper-large-v3' or a custom repo id to ensure_model()/resolve_ggml_model_id instead of one of the curated GGUF ids.","commonSituations":"Porting code from a diffusers/whisper pipeline that used HF repo ids; typos in curated ids; assuming arbitrary GGUF repos are allowed.","solutions":["Use one of the ids listed in the error message (GGML_STT_MODELS).","Pass None or '' to accept the curated default model.","Need a custom model? Use a different engine path — this one intentionally does not support custom repos."],"exampleFix":"# before\nserver.ensure_model(\"openai/whisper-large-v3\")\n# after\nfrom studio.backend.core.inference.stt_ggml_sidecar import GGML_STT_MODELS\nmodel = next(iter(GGML_STT_MODELS))\nserver.ensure_model(model)","handlingStrategy":"validation","validationCode":"from studio.backend.core.inference.stt_ggml_sidecar import GGML_STT_MODELS\nif model_id is not None and model_id.strip() and model_id.strip() not in GGML_STT_MODELS:\n    raise ValueError(f\"pick one of: {sorted(GGML_STT_MODELS)}\")","typeGuard":"def is_curated_ggml_model(model_id: str | None) -> bool:\n    return model_id is None or not model_id.strip() or model_id.strip() in GGML_STT_MODELS","tryCatchPattern":"try:\n    resolve_ggml_model_id(model_id)\nexcept SttModelIdError as e:\n    show_model_picker(list(GGML_STT_MODELS))\n    raise","preventionTips":["Source model choices from GGML_STT_MODELS in UIs — never free-text input.","Pass None/'' for the default instead of guessing ids.","Remember custom HF repos are unsupported by design on this engine."],"tags":["stt","whisper","ggml","validation","model-id"],"backgroundTag":null,"analyzedSha":"203007d19051dcd2ae33876786d117c99f6b0368","analyzedAt":"2026-08-15T02:48:39.846Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}