unslothai/unsloth · error · SttModelIdError

STT model '{model}' is not a curated llama.cpp dictation mod

Error message

STT model '{model}' is not a curated llama.cpp dictation model. Choose one of: {', '.join(MTMD_STT_MODELS)}.

What it means

SttModelIdError raised by resolve_mtmd_model_id: the supplied model string (after strip, with empty falling through to rejection since '' is not in MTMD_STT_MODELS) is not one of the curated llama.cpp multimodal-dictation (MTMD) model ids. The mtmd sidecar deliberately supports only curated models — custom HF repos are rejected here.

Source

Thrown at studio/backend/core/inference/stt_mtmd_sidecar.py:125

def _transcript_token_budget(audio_seconds: Optional[float]) -> int:
    """Output cap for a clip. A fixed one silently truncated long audio."""
    if not audio_seconds or audio_seconds <= 0:
        return _MIN_TRANSCRIPT_TOKENS
    scaled = int(audio_seconds * _TRANSCRIPT_TOKENS_PER_SECOND)
    return max(_MIN_TRANSCRIPT_TOKENS, min(scaled, _MAX_TRANSCRIPT_TOKENS))


_SERVER_START_TIMEOUT_SECONDS = 180.0
_TRANSCRIBE_TIMEOUT_SECONDS = 600.0


def resolve_mtmd_model_id(model: Optional[str]) -> str:
    """Validate a curated mtmd model id. Custom repos are not supported here."""
    normalized = (model or "").strip()
    if normalized in MTMD_STT_MODELS:
        return normalized
    raise SttModelIdError(
        f"STT model '{model}' is not a curated llama.cpp dictation model. "
        f"Choose one of: {', '.join(MTMD_STT_MODELS)}."
    )


def is_mtmd_model(model: Optional[str]) -> bool:
    return (model or "").strip() in MTMD_STT_MODELS


def find_llama_server_binary() -> Optional[str]:
    from core.inference.llama_cpp import LlamaCppBackend
    return LlamaCppBackend._find_llama_server_binary()


def is_available() -> bool:
    """True when llama-server is installed and audio can be decoded."""
    if find_llama_server_binary() is None:
        return False

View on GitHub (pinned to 203007d190)

Solutions

  1. Use one of the curated ids listed in the error message (', '.join(MTMD_STT_MODELS)).
  2. Gate the UI dropdown to MTMD_STT_MODELS so invalid ids cannot be submitted.
  3. Use is_mtmd_model(model) before dispatch to route to the correct sidecar.

Example fix

// before
if model.startswith("mtmd"):
    sidecar.load(model)  # raises for near-miss ids

// after
from core.inference.stt_mtmd_sidecar import is_mtmd_model
assert is_mtmd_model(model), f"{model} is not curated"
sidecar.load(model)
Defensive patterns

Strategy: validation

Validate before calling

from core.inference.stt_mtmd_sidecar import is_mtmd_model, resolve_mtmd_model_id
if not is_mtmd_model(model):
    reject_or_route_elsewhere(model)  # e.g. to the GGML whisper sidecar
else:
    resolved = resolve_mtmd_model_id(model)

Type guard

from core.inference.stt_mtmd_sidecar import is_mtmd_model

def is_curated_mtmd_model(model: str | None) -> bool:
    """Type guard: True only for curated llama.cpp dictation model ids."""
    return is_mtmd_model(model)

Try / catch

try:
    sidecar.load(model)
except SttModelIdError as exc:
    show_curated_model_list(exc)  # message already enumerates MTMD_STT_MODELS

Prevention

When it happens

Trigger: Passing any model id not in the MTMD_STT_MODELS set to the mtmd sidecar's API (download start, load, transcribe) — including None/empty, a GGUF whisper model id, or an arbitrary HF repo name.

Common situations: Routing logic sends a whisper model id to the mtmd sidecar or vice versa; user pastes a custom repo into the Voice settings; empty string from a UI default leaks through.

Related errors


AI-assisted analysis of unslothai/unsloth@203007d190 (2026-08-15). Data as JSON: /api/errors/2cb9d7c23f87633c. Report an issue: GitHub.