{"record":{"id":"ffcca8c23d4fe1a8","repo":"unslothai/unsloth","slug":"stt-model-model-id-gguf-is-not-downloaded-d","errorCode":null,"errorMessage":"STT model '{model_id}' (GGUF) is not downloaded. Download it in Settings, then Voice, before loading it.","messagePattern":"STT model '(.+?)' \\(GGUF\\) is not downloaded\\. Download it in Settings, then Voice, before loading it\\.","errorType":"exception","errorClass":"SttModelNotDownloadedError","httpStatus":409,"severity":"error","filePath":"studio/backend/core/inference/stt_ggml_sidecar.py","lineNumber":940,"sourceCode":"            pass\n\n    @staticmethod\n    def _reserve_free_port() -> tuple[socket.socket, int]:\n        \"\"\"Bind an ephemeral port and keep the socket held.\n\n        The caller closes the reservation immediately before spawning\n        whisper-server, shrinking the window in which another local process\n        could bind the port. SO_REUSEADDR lets the child rebind right after.\n        \"\"\"\n        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)\n        s.bind((\"127.0.0.1\", 0))\n        return s, s.getsockname()[1]\n\n    def _ensure_model_downloaded(self, model_id: str) -> str:\n        path = _cached_model_path(model_id)\n        if path is None:\n            raise SttModelNotDownloadedError(\n                f\"STT model '{model_id}' (GGUF) is not downloaded. \"\n                \"Download it in Settings, then Voice, before loading it.\"\n            )\n        return path\n\n    def load(\n        self,\n        model: Optional[str] = None,\n        request_cancel_event: Optional[threading.Event] = None,\n    ) -> None:\n        \"\"\"Start (or switch) whisper-server for the requested curated model.\"\"\"\n        if request_cancel_event is not None and request_cancel_event.is_set():\n            raise SttTranscriptionCancelledError(\"Transcription cancelled.\")\n        self._raise_if_update_in_progress()\n        model_id = resolve_ggml_model_id(model)\n        with self._lock:\n            if request_cancel_event is not None and request_cancel_event.is_set():\n                raise SttTranscriptionCancelledError(\"Transcription cancelled.\")","sourceCodeStart":922,"sourceCodeEnd":958,"githubUrl":"https://github.com/unslothai/unsloth/blob/203007d19051dcd2ae33876786d117c99f6b0368/studio/backend/core/inference/stt_ggml_sidecar.py#L922-L958","documentation":"Raised by GgmlSttSidecar._ensure_model_downloaded when _cached_model_path(model_id) returns None, i.e. the requested curated GGUF model is not present in the local cache. The GGML sidecar never downloads models on demand; the user must fetch them via the Settings > Voice UI first.","triggerScenarios":"Calling load(model) or transcribe() (which preflights via _ensure_model_downloaded before decoding audio) with a curated model id whose GGUF file is missing from the cache directory.","commonSituations":"Fresh install where no dictation model was downloaded yet; the models cache directory was cleared or moved; the model id resolves to a curated id the user never selected; a failed/interrupted earlier download left no complete file.","solutions":["Download the model in Settings > Voice in the Studio UI, then retry.","Verify the model id is one of the curated GGUF ids so it maps to a cacheable path.","Check the models cache directory is writable and was not wiped by a cleanup tool."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"from core.inference.stt_ggml_sidecar import _cached_model_path\nif _cached_model_path(resolve_ggml_model_id(model)) is None:\n    prompt_user_to_download(model)  # Settings > Voice\n    return","typeGuard":"def model_is_cached(model: str) -> bool:\n    return _cached_model_path(resolve_ggml_model_id(model)) is not None","tryCatchPattern":"try:\n    sidecar.load(model_id)\nexcept SttModelNotDownloadedError:\n    open_settings_voice_tab(model_id)","preventionTips":["Check model presence before enabling dictation for that model.","Pre-download the curated model during onboarding via Settings > Voice.","Keep the models cache on stable storage that cleanup tools will not purge."],"tags":["stt","ggml","model-download","configuration"],"backgroundTag":null,"analyzedSha":"203007d19051dcd2ae33876786d117c99f6b0368","analyzedAt":"2026-08-15T02:48:39.846Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}