mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
ip_adapter_sd15 & its encoder will now be installed by default during headless install
This commit is contained in:
parent
297f96c16b
commit
593fb95213
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user