{"record":{"id":"cd3521330ae9c5ce","repo":"unslothai/unsloth","slug":"another-dictation-model-self-model-id-is-st","errorCode":null,"errorMessage":"Another dictation model ('{self._model_id}') is still downloading; wait for it to finish.","messagePattern":"Another dictation model \\('(.+?)'\\) is still downloading; wait for it to finish\\.","errorType":"http","errorClass":"SttModelIdError","httpStatus":422,"severity":"warning","filePath":"studio/backend/core/inference/stt_mtmd_sidecar.py","lineNumber":407,"sourceCode":"            return None\n\n    def start(\n        self,\n        model_id: str,\n        hf_token: Optional[str] = None,\n    ) -> None:\n        model_id = resolve_mtmd_model_id(model_id)\n        hub_cache = _capture_stt_hub_cache()\n        with self._lock:\n            if self._thread is not None and self._thread.is_alive():\n                if self._model_id == model_id:\n                    # Joining a cancelling run would silently download nothing.\n                    if not self._cancelled:\n                        return\n                    raise SttModelIdError(\n                        f\"'{model_id}' is still cancelling; try again in a moment.\"\n                    )\n                raise SttModelIdError(\n                    f\"Another dictation model ('{self._model_id}') is still \"\n                    \"downloading; wait for it to finish.\"\n                )\n            self._model_id = model_id\n            self._error = None\n            self._total_bytes = None\n            self._selected_files = ()\n            self._revision = None\n            self._hub_cache = hub_cache\n            self._cancelled = False\n            self._process = None\n            thread = threading.Thread(\n                target = self._run,\n                args = (model_id, hf_token),\n                daemon = True,\n            )\n            self._thread = thread\n            thread.start()","sourceCodeStart":389,"sourceCodeEnd":425,"githubUrl":"https://github.com/unslothai/unsloth/blob/203007d19051dcd2ae33876786d117c99f6b0368/studio/backend/core/inference/stt_mtmd_sidecar.py#L389-L425","documentation":"SttModelIdError raised in the mtmd downloader: a download thread is alive for a DIFFERENT model_id, so the new request cannot proceed. The sidecar supports exactly one concurrent download; requesting another curated model while one is active names the conflicting model in the message.","triggerScenarios":"Calling download('B') while self._thread is alive and self._model_id == 'A' — e.g. clicking Download on a second model card in Settings before the first finishes.","commonSituations":"User queues multiple model downloads from a list UI; a previous download hangs (slow network) and the user tries another model; stale thread from a download that never terminated.","solutions":["Wait for the in-flight download of the named model to finish (or cancel it), then retry.","Cancel the active download first if switching priority: cancel, wait for the thread to die, then start the new one.","In the UI, show per-model progress and disable Download on other models while one is active."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"with downloader._lock:  # prefer a public status accessor if exposed\n    if downloader._thread is not None and downloader._thread.is_alive():\n        show_active_download(downloader._model_id)\n        return\ndownloader.download(model_id)","typeGuard":null,"tryCatchPattern":"try:\n    downloader.download(model_id)\nexcept SttModelIdError as exc:\n    if \"still downloading\" in str(exc):\n        surface_wait_message(exc)  # or offer cancel of the active download","preventionTips":["Design the UI for one download at a time; disable other Download buttons while active.","Offer cancel-then-switch as an explicit flow instead of a second start call.","Show per-model progress so users see why a second download is refused."],"tags":["stt","mtmd","download","concurrency","one-at-a-time"],"backgroundTag":null,"analyzedSha":"203007d19051dcd2ae33876786d117c99f6b0368","analyzedAt":"2026-08-15T02:48:39.846Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}