{"record":{"id":"40f1b4e085436582","repo":"invoke-ai/InvokeAI","slug":"unexpected-submodel-requested-for-spandrel-model","errorCode":null,"errorMessage":"Unexpected submodel requested for Spandrel model.","messagePattern":"Unexpected submodel requested for Spandrel model\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"invokeai/backend/model_manager/load/model_loaders/spandrel_image_to_image.py","lineNumber":25,"sourceCode":"from invokeai.backend.model_manager.load.load_default import ModelLoader\nfrom invokeai.backend.model_manager.load.model_loader_registry import ModelLoaderRegistry\nfrom invokeai.backend.model_manager.taxonomy import AnyModel, BaseModelType, ModelFormat, ModelType, SubModelType\nfrom invokeai.backend.spandrel_image_to_image_model import SpandrelImageToImageModel\n\n\n@ModelLoaderRegistry.register(\n    base=BaseModelType.Any, type=ModelType.SpandrelImageToImage, format=ModelFormat.Checkpoint\n)\nclass SpandrelImageToImageModelLoader(ModelLoader):\n    \"\"\"Class for loading Spandrel Image-to-Image models (i.e. models wrapped by spandrel.ImageModelDescriptor).\"\"\"\n\n    def _load_model(\n        self,\n        config: AnyModelConfig,\n        submodel_type: Optional[SubModelType] = None,\n    ) -> AnyModel:\n        if submodel_type is not None:\n            raise ValueError(\"Unexpected submodel requested for Spandrel model.\")\n\n        model_path = Path(config.path)\n        model = SpandrelImageToImageModel.load_from_file(model_path)\n\n        torch_dtype = self._torch_dtype\n        if not model.supports_dtype(torch_dtype):\n            self._logger.warning(\n                f\"The configured dtype ('{self._torch_dtype}') is not supported by the {model.get_model_type_name()} \"\n                \"model. Falling back to 'float32'.\"\n            )\n            torch_dtype = torch.float32\n        model.to(dtype=torch_dtype)\n\n        return model\n","sourceCodeStart":7,"sourceCodeEnd":40,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/backend/model_manager/load/model_loaders/spandrel_image_to_image.py#L7-L40","documentation":"Spandrel image-to-image models are single-file upscalers/restoration networks with no submodels. The loader raises this ValueError if any submodel_type is supplied. It is a contract guard, similar to the SigLIP and TI loaders.","triggerScenarios":"Calling load_model on a Spandrel model config with submodel_type set (e.g. SubModelType.Transformer or VAE) instead of None.","commonSituations":"Generic loading code that always passes a submodel_type because it was written for main diffusion pipelines; misconfigured pipeline code routing an upscale request through submodel logic.","solutions":["Pass submodel_type=None when loading Spandrel models.","Route diffusion-submodel requests to the appropriate main-model loader instead.","Guard the call site by checking the model type before supplying a submodel_type."],"exampleFix":"// before\nmodel = loader.load_model(config, submodel_type=SubModelType.VAE)\n// after\nmodel = loader.load_model(config, submodel_type=None)","handlingStrategy":"validation","validationCode":"if model_type is ModelType.Spandrel and submodel_type is not None:\n    submodel_type = None  # Spandrel models are loaded whole","typeGuard":"def is_whole_model_type(model_type: ModelType) -> bool:\n    return model_type in {ModelType.Spandrel, ModelType.SigLIP, ModelType.TextualInversion, ModelType.TextLLM}","tryCatchPattern":"try:\n    model = loader.load_model(config, submodel_type=None)\nexcept ValueError as e:\n    logger.error(\"Spandrel load failed: %s\", e)\n    raise","preventionTips":["Never attach submodel requests to upscaler/restoration models.","Normalize submodel_type to None in dispatchers for non-pipeline model types.","Add unit tests covering loader dispatch per model type."],"tags":["valueerror","submodel","spandrel","upscaling"],"backgroundTag":"unsupported-submodel-type","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}