invoke-ai/InvokeAI · error · ValueError

File extension is not a recognized model format. Expected…

Error message

File extension {path.suffix} is not a recognized model format. Expected one of: {extensions}

What it means

_validate_path_looks_like_model pre-checks the path before probing. For a single file, the extension must be in _MODEL_EXTENSIONS (known weights formats). An unrecognized suffix (e.g. .json alone, .txt, .pth2, no extension) raises this ValueError so generic application directories aren't misinterpreted as models.

Solutions

  1. Point at the actual weights file (.safetensors, .ckpt, .bin, etc.) instead of the config/README
  2. Rename the file with a recognized model extension if it truly is weights saved with a wrong suffix
  3. Check for incomplete downloads (e.g. .part/.tmp) and re-download fully
  4. For diffusers-style models, pass the parent directory containing the config plus weights, not the config file alone

Example fix

// before
install_model("/models/my-model/config.json")
// after
install_model("/models/my-model/diffusion_pytorch_model.safetensors")
# or the directory:
install_model("/models/my-model")
Defensive patterns

Strategy: validation

Validate before calling

import pathlib

_MODEL_EXTENSIONS = {".safetensors", ".ckpt", ".pt", ".bin", ".pth", ".gguf"}

def validate_model_file(path: str) -> pathlib.Path:
    p = pathlib.Path(path)
    if p.is_file() and p.suffix.lower() not in _MODEL_EXTENSIONS:
        raise ValueError(f"{p.suffix} is not a model extension; pass a weights file or model directory")
    return p

Type guard

def is_model_file(path: str) -> bool:
    from invokeai.backend.model_manager.configs.factory import _MODEL_EXTENSIONS
    p = pathlib.Path(path)
    return p.is_file() and p.suffix.lower() in _MODEL_EXTENSIONS

Try / catch

try:
    install_model(path)
except ValueError as e:
    if "not a recognized model format" in str(e):
        logger.error("Point at a weights file (.safetensors/.ckpt/...) or its directory")
    else:
        raise

Prevention

When it happens

Trigger: Calling model install/probe APIs (from_model_on_disk path) with a file whose suffix is not a recognized model extension — e.g. pointing at a README, a config .json file, a .partial download, or an extensionless binary.

Common situations: Passing a transformers config.json directly instead of the weights file; incomplete downloads left with temp extensions; choosing the wrong file inside a model repo folder; typo'd extension after manual rename.

Related errors


AI-assisted analysis of invoke-ai/InvokeAI@0b6a024f2f (2026-08-29). Data as JSON: /api/errors/d9e9b5347adad801. Report an issue: GitHub.

Appendix: source

Thrown at invokeai/backend/model_manager/configs/factory.py:564

    @staticmethod
    def _validate_path_looks_like_model(path: Path) -> None:
        """Perform basic sanity checks to ensure a path looks like a model.

        This prevents wasting time trying to identify obviously non-model paths like
        home directories or downloads folders. Raises RuntimeError if the path doesn't
        pass basic checks.

        Args:
            path: The path to validate

        Raises:
            ValueError: If the path doesn't look like a model
        """
        if path.is_file():
            # For files, just check the extension
            if path.suffix.lower() not in _MODEL_EXTENSIONS:
                raise ValueError(
                    f"File extension {path.suffix} is not a recognized model format. "
                    f"Expected one of: {', '.join(sorted(_MODEL_EXTENSIONS))}"
                )
        else:
            # Recognized Diffusers/Transformers configs are safe model markers. A generic config.json
            # is not sufficient because many large application directories contain one.
            recognized_root_config = False
            for config_name in _CONFIG_FILES:
                config_path = path / config_name
                if not config_path.exists():
                    continue
                try:
                    # Model config.json files are UTF-8; read explicitly so a non-ASCII value does not
                    # raise UnicodeDecodeError under a cp1252 (Windows) locale and get mis-treated as
                    # "unrecognized", which would wrongly reject a valid model directory.
                    config = json.loads(config_path.read_text(encoding="utf-8"))
                except (OSError, ValueError):
                    continue

View on GitHub (pinned to 0b6a024f2f)