ip_adapter_sd15 & its encoder will now be installed by default during headless install

This commit is contained in:
Lincoln Stein 2023-09-24 19:00:21 -04:00
parent 297f96c16b
commit 593fb95213
3 changed files with 61 additions and 38 deletions

View File

@ -69,14 +69,6 @@ LEGACY_CONFIGS = {
} }
@dataclass
class ModelInstallList:
"""Class for listing models to be installed/removed"""
install_models: List[str] = field(default_factory=list)
remove_models: List[str] = field(default_factory=list)
@dataclass @dataclass
class InstallSelections: class InstallSelections:
install_models: List[str] = field(default_factory=list) install_models: List[str] = field(default_factory=list)
@ -94,7 +86,7 @@ class ModelLoadInfo:
installed: bool = False installed: bool = False
recommended: bool = False recommended: bool = False
default: bool = False default: bool = False
requires: Optional[List[str]] = field(default_factory=list)
class ModelInstall(object): class ModelInstall(object):
def __init__( def __init__(
@ -131,8 +123,6 @@ class ModelInstall(object):
# supplement with entries in models.yaml # supplement with entries in models.yaml
installed_models = [x for x in self.mgr.list_models()] installed_models = [x for x in self.mgr.list_models()]
# suppresses autoloaded models
# installed_models = [x for x in self.mgr.list_models() if not self._is_autoloaded(x)]
for md in installed_models: for md in installed_models:
base = md["base_model"] base = md["base_model"]
@ -164,9 +154,12 @@ class ModelInstall(object):
def list_models(self, model_type): def list_models(self, model_type):
installed = self.mgr.list_models(model_type=model_type) installed = self.mgr.list_models(model_type=model_type)
print()
print(f"Installed models of type `{model_type}`:") print(f"Installed models of type `{model_type}`:")
print(f"{'Model Key':50} Model Path")
for i in installed: for i in installed:
print(f"{i['model_name']}\t{i['base_model']}\t{i['path']}") print(f"{'/'.join([i['base_model'],i['model_type'],i['model_name']]):50} {i['path']}")
print()
# logic here a little reversed to maintain backward compatibility # logic here a little reversed to maintain backward compatibility
def starter_models(self, all_models: bool = False) -> Set[str]: def starter_models(self, all_models: bool = False) -> Set[str]:
@ -204,6 +197,8 @@ class ModelInstall(object):
job += 1 job += 1
# add requested models # add requested models
self._remove_installed(selections.install_models)
self._add_required_models(selections.install_models)
for path in selections.install_models: for path in selections.install_models:
logger.info(f"Installing {path} [{job}/{jobs}]") logger.info(f"Installing {path} [{job}/{jobs}]")
try: try:
@ -263,6 +258,26 @@ class ModelInstall(object):
return models_installed return models_installed
def _remove_installed(self, model_list: List[str]):
all_models = self.all_models()
for path in model_list:
key = self.reverse_paths.get(path)
if key and all_models[key].installed:
logger.warning(f"{path} already installed. Skipping.")
model_list.remove(path)
def _add_required_models(self, model_list: List[str]):
additional_models = []
all_models = self.all_models()
for path in model_list:
if not(key := self.reverse_paths.get(path)):
continue
for requirement in all_models[key].requires:
requirement_key = self.reverse_paths.get(requirement)
if not all_models[requirement_key].installed:
additional_models.append(requirement)
model_list.extend(additional_models)
# install a model from a local path. The optional info parameter is there to prevent # install a model from a local path. The optional info parameter is there to prevent
# the model from being probed twice in the event that it has already been probed. # the model from being probed twice in the event that it has already been probed.
def _install_path(self, path: Path, info: ModelProbeInfo = None) -> AddModelResult: def _install_path(self, path: Path, info: ModelProbeInfo = None) -> AddModelResult:

View File

@ -103,28 +103,35 @@ sd-1/lora/LowRA:
recommended: True recommended: True
sd-1/lora/Ink scenery: sd-1/lora/Ink scenery:
path: https://civitai.com/api/download/models/83390 path: https://civitai.com/api/download/models/83390
# any/clip_vision/ip_adapter_sd_image_encoder:
# repo_id: InvokeAI/ip_adapter_sd_image_encoder
# recommended: True
# description: Required model for using IP-Adapters with SD-1/2 models
# any/clip_vision/ip_adapter_sdxl_image_encoder:
# repo_id: InvokeAI/ip_adapter_sdxl_image_encoder
# recommended: True
# description: Required model for using IP-Adapters with SDXL models
sd-1/ip_adapter/ip_adapter_sd15: sd-1/ip_adapter/ip_adapter_sd15:
repo_id: InvokeAI/ip_adapter_sd15 repo_id: InvokeAI/ip_adapter_sd15
recommended: True recommended: True
requires:
- InvokeAI/ip_adapter_sd_image_encoder
description: IP-Adapter for SD 1.5 models description: IP-Adapter for SD 1.5 models
sd-1/ip_adapter/ip_adapter_plus_sd15: sd-1/ip_adapter/ip_adapter_plus_sd15:
repo_id: InvokeAI/ip_adapter_plus_sd15 repo_id: InvokeAI/ip_adapter_plus_sd15
recommended: False recommended: False
requires:
- InvokeAI/ip_adapter_sd_image_encoder
description: Refined IP-Adapter for SD 1.5 models description: Refined IP-Adapter for SD 1.5 models
sd-1/ip_adapter/ip_adapter_plus_face_sd15: sd-1/ip_adapter/ip_adapter_plus_face_sd15:
repo_id: InvokeAI/ip_adapter_plus_face_sd15 repo_id: InvokeAI/ip_adapter_plus_face_sd15
recommended: False recommended: False
requires:
- InvokeAI/ip_adapter_sd_image_encoder
description: Refined IP-Adapter for SD 1.5 models, adapted for faces description: Refined IP-Adapter for SD 1.5 models, adapted for faces
sdxl/ip_adapter/ip_adapter_sdxl: sdxl/ip_adapter/ip_adapter_sdxl:
repo_id: InvokeAI/ip_adapter_sdxl repo_id: InvokeAI/ip_adapter_sdxl
recommended: False recommended: False
requires:
- InvokeAI/ip_adapter_sdxl_image_encoder
description: IP-Adapter for SDXL models description: IP-Adapter for SDXL models
any/clip_vision/ip_adapter_sd_image_encoder:
repo_id: InvokeAI/ip_adapter_sd_image_encoder
recommended: False
description: Required model for using IP-Adapters with SD-1/2 models
any/clip_vision/ip_adapter_sdxl_image_encoder:
repo_id: InvokeAI/ip_adapter_sdxl_image_encoder
recommended: False
description: Required model for using IP-Adapters with SDXL models

View File

@ -563,23 +563,24 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage):
if downloads := section.get("download_ids"): if downloads := section.get("download_ids"):
selections.install_models.extend(downloads.value.split()) selections.install_models.extend(downloads.value.split())
# special case for the ipadapter_models. If any of the adapters are # NOT NEEDED - DONE IN BACKEND NOW
# chosen, then we add the corresponding encoder(s) to the install list. # # special case for the ipadapter_models. If any of the adapters are
section = self.ipadapter_models # # chosen, then we add the corresponding encoder(s) to the install list.
if section.get("models_selected"): # section = self.ipadapter_models
selected_adapters = [ # if section.get("models_selected"):
self.all_models[section["models"][x]].name for x in section.get("models_selected").value # selected_adapters = [
] # self.all_models[section["models"][x]].name for x in section.get("models_selected").value
encoders = [] # ]
if any(["sdxl" in x for x in selected_adapters]): # encoders = []
encoders.append("ip_adapter_sdxl_image_encoder") # if any(["sdxl" in x for x in selected_adapters]):
if any(["sd15" in x for x in selected_adapters]): # encoders.append("ip_adapter_sdxl_image_encoder")
encoders.append("ip_adapter_sd_image_encoder") # if any(["sd15" in x for x in selected_adapters]):
for encoder in encoders: # encoders.append("ip_adapter_sd_image_encoder")
key = f"any/clip_vision/{encoder}" # for encoder in encoders:
repo_id = f"InvokeAI/{encoder}" # key = f"any/clip_vision/{encoder}"
if key not in self.all_models: # repo_id = f"InvokeAI/{encoder}"
selections.install_models.append(repo_id) # if key not in self.all_models:
# selections.install_models.append(repo_id)
class AddModelApplication(npyscreen.NPSAppManaged): class AddModelApplication(npyscreen.NPSAppManaged):