mudler/LocalAI · error · ValueError

attention_backend must be one of

Error message

attention_backend must be one of: {choices}

What it means

Raised by attention_overrides() in longcat-video when the requested attention_backend key is absent from the ATTENTION_OVERRIDES dict. The error message enumerates the valid choices so the user can correct the name. The original KeyError is chained.

Solutions

  1. Use one of the choices listed in the error message verbatim
  2. Strip/normalize whitespace and check underscore vs hyphen spelling
  3. Check the ATTENTION_OVERRIDES dict in longcat_utils.py for the exact keys this version supports

Example fix

# before
attention_overrides('flash-attn2')  # ValueError: must be one of: ...

# after
attention_overrides('flash_attn2')  # exact key from ATTENTION_OVERRIDES
Defensive patterns

Strategy: type-guard

Validate before calling

from longcat_utils import ATTENTION_OVERRIDES
backend = (request.attention_backend or '').strip()
if backend not in ATTENTION_OVERRIDES:
    raise ValueError(f'unsupported attention_backend {backend!r}; choose from {sorted(ATTENTION_OVERRIDES)}')
overrides = attention_overrides(backend)

Type guard

def is_valid_attention_backend(name: str) -> bool:
    return name in ATTENTION_OVERRIDES

Try / catch

try:
    ov = attention_overrides(name)
except ValueError as err:
    # message already lists valid choices; surface it to the user
    return error_response(str(err))

Prevention

When it happens

Trigger: Calling attention_overrides(name) with a backend string that is not a key in ATTENTION_OVERRIDES — typo like 'sdpa ' (trailing space), 'flash-attn' vs 'flash_attn' underscore/hyphen mismatch, or a backend name from a newer/older version.

Common situations: Copy-pasted config from another project using different naming (flashattn vs flash_attn2), version drift where a backend key was renamed, or case sensitivity ('SDPA' vs 'sdpa').

Related errors


AI-assisted analysis of mudler/LocalAI@44413a9d06 (2026-08-15). Data as JSON: /api/errors/22ea80d3ba083224. Report an issue: GitHub.

Appendix: source

Thrown at backend/python/longcat-video/longcat_utils.py:122

def require_float(value, name, minimum=None, maximum=None):
    try:
        parsed = float(value)
    except (TypeError, ValueError) as err:
        raise ValueError(f"{name} must be a number") from err
    if minimum is not None and parsed < minimum:
        raise ValueError(f"{name} must be at least {minimum}")
    if maximum is not None and parsed > maximum:
        raise ValueError(f"{name} must be at most {maximum}")
    return parsed


def attention_overrides(name):
    try:
        return dict(ATTENTION_OVERRIDES[name])
    except KeyError as err:
        choices = ", ".join(ATTENTION_OVERRIDES)
        raise ValueError(f"attention_backend must be one of: {choices}") from err


def _model_name_from_directory(path):
    for filename in ("model_index.json", "config.json"):
        config_path = os.path.join(path, filename)
        try:
            with open(config_path, "r", encoding="utf-8") as config_file:
                model_name = json.load(config_file).get("model_name", "")
        except (FileNotFoundError, OSError, ValueError, TypeError):
            continue
        if model_name:
            return model_name
    return ""


def normalize_model_source(model):
    value = model.rstrip("/")
    for prefix in ("huggingface://", "hf://"):

View on GitHub (pinned to 44413a9d06)