From b63ed718ddff6fc58b35710320dd4f9e5ffc7a2d Mon Sep 17 00:00:00 2001 From: DustyShoe <38873282+DustyShoe@users.noreply.github.com> Date: Mon, 27 Oct 2025 22:59:50 +0200 Subject: [PATCH 1/4] Fix ControlNet repo variant detection for fp16 weights --- .../model_manager/configs/controlnet.py | 4 ++- .../test_controlnet_diffusers_config.py | 28 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 tests/backend/model_manager/test_controlnet_diffusers_config.py diff --git a/invokeai/backend/model_manager/configs/controlnet.py b/invokeai/backend/model_manager/configs/controlnet.py index 630e81fd243..a9d05b70e46 100644 --- a/invokeai/backend/model_manager/configs/controlnet.py +++ b/invokeai/backend/model_manager/configs/controlnet.py @@ -88,7 +88,9 @@ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) - cls._validate_base(mod) - return cls(**override_fields) + repo_variant = override_fields.get("repo_variant") or cls._get_repo_variant_or_raise(mod) + + return cls(**override_fields, repo_variant=repo_variant) @classmethod def _validate_base(cls, mod: ModelOnDisk) -> None: diff --git a/tests/backend/model_manager/test_controlnet_diffusers_config.py b/tests/backend/model_manager/test_controlnet_diffusers_config.py new file mode 100644 index 00000000000..75597011ad9 --- /dev/null +++ b/tests/backend/model_manager/test_controlnet_diffusers_config.py @@ -0,0 +1,28 @@ +import json +from pathlib import Path + +from invokeai.backend.model_manager.configs.controlnet import ControlNet_Diffusers_SDXL_Config +from invokeai.backend.model_manager.model_on_disk import ModelOnDisk +from invokeai.backend.model_manager.taxonomy import ModelRepoVariant + + +def test_controlnet_diffusers_fp16_repo_variant(tmp_path: Path) -> None: + model_dir = tmp_path / "model" + model_dir.mkdir() + + config_path = model_dir / "config.json" + config_path.write_text( + json.dumps( + { + "_class_name": "ControlNetModel", + "cross_attention_dim": 2048, + } + ) + ) + + (model_dir / "diffusion_pytorch_model.fp16.safetensors").touch() + + mod = ModelOnDisk(model_dir) + config = ControlNet_Diffusers_SDXL_Config.from_model_on_disk(mod, {}) + + assert config.repo_variant is ModelRepoVariant.FP16 From d0a647fb2e4c4f8fbf183c22c39d12432b964b48 Mon Sep 17 00:00:00 2001 From: DustyShoe <38873282+DustyShoe@users.noreply.github.com> Date: Mon, 27 Oct 2025 23:05:23 +0200 Subject: [PATCH 2/4] Remove ControlNet diffusers fp16 regression test --- .../test_controlnet_diffusers_config.py | 28 ------------------- 1 file changed, 28 deletions(-) delete mode 100644 tests/backend/model_manager/test_controlnet_diffusers_config.py diff --git a/tests/backend/model_manager/test_controlnet_diffusers_config.py b/tests/backend/model_manager/test_controlnet_diffusers_config.py deleted file mode 100644 index 75597011ad9..00000000000 --- a/tests/backend/model_manager/test_controlnet_diffusers_config.py +++ /dev/null @@ -1,28 +0,0 @@ -import json -from pathlib import Path - -from invokeai.backend.model_manager.configs.controlnet import ControlNet_Diffusers_SDXL_Config -from invokeai.backend.model_manager.model_on_disk import ModelOnDisk -from invokeai.backend.model_manager.taxonomy import ModelRepoVariant - - -def test_controlnet_diffusers_fp16_repo_variant(tmp_path: Path) -> None: - model_dir = tmp_path / "model" - model_dir.mkdir() - - config_path = model_dir / "config.json" - config_path.write_text( - json.dumps( - { - "_class_name": "ControlNetModel", - "cross_attention_dim": 2048, - } - ) - ) - - (model_dir / "diffusion_pytorch_model.fp16.safetensors").touch() - - mod = ModelOnDisk(model_dir) - config = ControlNet_Diffusers_SDXL_Config.from_model_on_disk(mod, {}) - - assert config.repo_variant is ModelRepoVariant.FP16 From 60963d65cc5714babd29ca1975dcd673fb0b9cb0 Mon Sep 17 00:00:00 2001 From: DustyShoe <38873282+DustyShoe@users.noreply.github.com> Date: Sun, 2 Nov 2025 23:19:06 +0200 Subject: [PATCH 3/4] Update invokeai/backend/model_manager/configs/controlnet.py Co-authored-by: Lincoln Stein --- invokeai/backend/model_manager/configs/controlnet.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/invokeai/backend/model_manager/configs/controlnet.py b/invokeai/backend/model_manager/configs/controlnet.py index a9d05b70e46..de18d30bb18 100644 --- a/invokeai/backend/model_manager/configs/controlnet.py +++ b/invokeai/backend/model_manager/configs/controlnet.py @@ -88,9 +88,9 @@ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) - cls._validate_base(mod) - repo_variant = override_fields.get("repo_variant") or cls._get_repo_variant_or_raise(mod) - - return cls(**override_fields, repo_variant=repo_variant) + repo_variant = {'repo_variant': override_fields.get("repo_variant", cls._get_repo_variant_or_raise(mod))} + args = override_fields | repo_variant + return cls(**args) @classmethod def _validate_base(cls, mod: ModelOnDisk) -> None: From 8ba42f9904cf4e6ed4cbae288fa34869a606ee65 Mon Sep 17 00:00:00 2001 From: DustyShoe Date: Mon, 3 Nov 2025 02:22:44 +0200 Subject: [PATCH 4/4] style: ruff format controlnet.py --- invokeai/backend/model_manager/configs/controlnet.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/invokeai/backend/model_manager/configs/controlnet.py b/invokeai/backend/model_manager/configs/controlnet.py index de18d30bb18..b3b84cabba4 100644 --- a/invokeai/backend/model_manager/configs/controlnet.py +++ b/invokeai/backend/model_manager/configs/controlnet.py @@ -88,7 +88,7 @@ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) - cls._validate_base(mod) - repo_variant = {'repo_variant': override_fields.get("repo_variant", cls._get_repo_variant_or_raise(mod))} + repo_variant = {"repo_variant": override_fields.get("repo_variant", cls._get_repo_variant_or_raise(mod))} args = override_fields | repo_variant return cls(**args)