Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
c852187
feat(mm): normalized model storage
psychedelicious Sep 18, 2025
974074b
feat(mm): add migration to flat model storage
psychedelicious Sep 18, 2025
5e6b52d
fix(mm): normalized multi-file/diffusers model installation no worky
psychedelicious Sep 19, 2025
d61279e
refactor: port MM probes to new api
psychedelicious Sep 23, 2025
559a609
feat(mm): port TIs to new API
psychedelicious Sep 23, 2025
78e3851
tidy(mm): remove unused probes
psychedelicious Sep 23, 2025
ced391b
feat(mm): port spandrel to new API
psychedelicious Sep 23, 2025
be3f8bb
fix(mm): parsing for spandrel
psychedelicious Sep 23, 2025
e682979
fix(mm): loader for clip embed
psychedelicious Sep 23, 2025
c98842e
fix(mm): tis use existing weight_files method
psychedelicious Sep 23, 2025
c866636
feat(mm): port vae to new API
psychedelicious Sep 23, 2025
029f029
fix(mm): vae class inheritance and config_path
psychedelicious Sep 23, 2025
d367f16
tidy(mm): patcher types and import paths
psychedelicious Sep 23, 2025
2c201a8
feat(mm): better errors when invalid model config found in db
psychedelicious Sep 23, 2025
2b6d0b6
feat(mm): port t5 to new API
psychedelicious Sep 23, 2025
432f36a
feat(mm): make config_path optional
psychedelicious Sep 23, 2025
cd9ef2e
refactor(mm): simplify model classification process
psychedelicious Sep 24, 2025
9824fc7
refactor(mm): remove unused methods in config.py
psychedelicious Sep 24, 2025
c15a081
refactor(mm): add model config parsing utils
psychedelicious Sep 24, 2025
79083d8
fix(mm): abstractmethod bork
psychedelicious Sep 24, 2025
9de8e21
tidy(mm): clarify that model id utils are private
psychedelicious Sep 24, 2025
f5ec7b4
fix(mm): fall back to UnknownModelConfig correctly
psychedelicious Sep 24, 2025
92f6b85
feat(mm): port CLIPVisionDiffusersConfig to new api
psychedelicious Sep 24, 2025
edd415d
feat(mm): port SigLIPDiffusersConfig to new api
psychedelicious Sep 24, 2025
fa48a15
feat(mm): make match helpers more succint
psychedelicious Sep 24, 2025
c661a0c
feat(mm): port flux redux to new api
psychedelicious Sep 24, 2025
6d9140b
feat(mm): port ip adapter to new api
psychedelicious Sep 24, 2025
6269728
tidy(mm): skip optimistic override handling for now
psychedelicious Sep 24, 2025
6d5e0ee
refactor(mm): continue iterating on config
psychedelicious Sep 25, 2025
a8f6a9e
feat(mm): port flux "control lora" and t2i adapter to new api
psychedelicious Sep 25, 2025
ebfc1ba
tidy(ui): use Extract to get model config types
psychedelicious Sep 25, 2025
30cab12
fix(mm): t2i base determination
psychedelicious Sep 25, 2025
db5766d
feat(mm): port cnet to new api
psychedelicious Sep 25, 2025
8ad92c9
refactor(mm): add config validation utils, make it all consistent and…
psychedelicious Sep 25, 2025
6ce76ab
feat(mm): wip port of main models to new api
psychedelicious Sep 25, 2025
618e944
feat(mm): wip port of main models to new api
psychedelicious Sep 25, 2025
34fd154
feat(mm): wip port of main models to new api
psychedelicious Sep 25, 2025
f700d67
docs(mm): add todos
psychedelicious Sep 26, 2025
ba49027
tidy(mm): removed unused model merge class
psychedelicious Sep 29, 2025
f7deb48
feat(mm): wip port main models to new api
psychedelicious Sep 29, 2025
b6d5b4f
tidy(mm): clean up model heuristic utils
psychedelicious Oct 1, 2025
5aaa201
tidy(mm): clean up ModelOnDisk caching
psychedelicious Oct 1, 2025
f17b955
tidy(mm): flux lora format util
psychedelicious Oct 1, 2025
666d15d
refactor(mm): make config classes narrow
psychedelicious Oct 1, 2025
05ab8c0
refactor(mm): diffusers loras
psychedelicious Oct 1, 2025
4c8e93f
feat(mm): consistent naming for all model config classes
psychedelicious Oct 1, 2025
936b5f5
fix(mm): tag generation & scattered probe fixes
psychedelicious Oct 1, 2025
eca3438
tidy(mm): consistent class names
psychedelicious Oct 2, 2025
b385274
refactor(mm): split configs into separate files
psychedelicious Oct 3, 2025
59967e3
docs(mm): add comments for identification utils
psychedelicious Oct 6, 2025
f7e9271
chore(ui): typegen
psychedelicious Oct 6, 2025
900bb5c
refactor(mm): remove legacy probe, new configs dir structure, update …
psychedelicious Oct 7, 2025
e393d34
fix(mm): inverted condition
psychedelicious Oct 7, 2025
2156acf
docs(mm): update docsstrings in factory.py
psychedelicious Oct 7, 2025
5fc0741
docs(mm): document flux variant attr
psychedelicious Oct 7, 2025
9eb167e
feat(mm): add helper method for legacy configs
psychedelicious Oct 7, 2025
37e1cbd
feat(mm): satisfy type checker in flux denoise
psychedelicious Oct 7, 2025
68e8499
docs(mm): remove extraneous comment
psychedelicious Oct 7, 2025
5097b68
fix(mm): ensure unknown model configs get unknown attrs
psychedelicious Oct 7, 2025
6bd9414
fix(mm): t5 identification
psychedelicious Oct 7, 2025
15bbd8e
fix(mm): sdxl ip adapter identification
psychedelicious Oct 7, 2025
f5afaf5
feat(mm): more flexible config matching utils
psychedelicious Oct 7, 2025
9a43683
fix(mm): clip vision identification
psychedelicious Oct 7, 2025
7f22264
feat(mm): add sanity checks before probing paths
psychedelicious Oct 7, 2025
b5ac8a4
docs(mm): add reminder for self for field migrations
psychedelicious Oct 7, 2025
dcbe59b
feat(mm): clearer naming for main config class hierarchy
psychedelicious Oct 8, 2025
c731f4d
feat(mm): fix clip vision starter model bases, add ref to actual models
psychedelicious Oct 8, 2025
811fc5e
feat(mm): add model config schema migration logic
psychedelicious Oct 8, 2025
f65133c
fix(mm): duplicate import
psychedelicious Oct 8, 2025
4f74866
refactor(mm): split big migration into 3
psychedelicious Oct 8, 2025
86b052f
fix(mm): pop base/type/format when creating unknown model config
psychedelicious Oct 8, 2025
cf0e832
fix(db): migration 22 insert only real cols
psychedelicious Oct 8, 2025
566bc91
fix(db): migration 23 fall back to unknown model when config change f…
psychedelicious Oct 8, 2025
df84881
feat(db): run migrations 23 and 24
psychedelicious Oct 8, 2025
4e2bfaf
wip
psychedelicious Oct 8, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions invokeai/app/api/dependencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import asyncio
from logging import Logger
from pathlib import Path

import torch
from torchvision.datasets.clevr import json

from invokeai.app.services.board_image_records.board_image_records_sqlite import SqliteBoardImageRecordStorage
from invokeai.app.services.board_images.board_images_default import BoardImagesService
Expand Down Expand Up @@ -187,6 +189,17 @@ def initialize(
)

ApiDependencies.invoker = Invoker(services)
all_models = ApiDependencies.invoker.services.model_manager.store.search_by_attr()
for m in all_models:
path = Path(m.path)
if path.is_absolute():
continue

metadata_path = config.models_path / m.key / "__metadata__.json"
print(f"Writing metadata for model {m.name} to {metadata_path}")
content = {"source": m.source, "expected_config_attrs": m.model_dump(), "notes": ""}
content_json = json.dumps(content, indent=2)
metadata_path.write_text(content_json)
db.clean()

@staticmethod
Expand Down
30 changes: 20 additions & 10 deletions invokeai/app/api/routers/model_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,12 @@
UnknownModelException,
)
from invokeai.app.util.suppress_output import SuppressOutput
from invokeai.backend.model_manager import BaseModelType, ModelFormat, ModelType
from invokeai.backend.model_manager.config import (
AnyModelConfig,
MainCheckpointConfig,
from invokeai.backend.model_manager.configs.factory import AnyModelConfig
from invokeai.backend.model_manager.configs.main import (
Main_Checkpoint_SD1_Config,
Main_Checkpoint_SD2_Config,
Main_Checkpoint_SDXL_Config,
Main_Checkpoint_SDXLRefiner_Config,
)
from invokeai.backend.model_manager.load.model_cache.cache_stats import CacheStats
from invokeai.backend.model_manager.metadata.fetch.huggingface import HuggingFaceMetadataFetch
Expand All @@ -44,6 +46,7 @@
StarterModelBundle,
StarterModelWithoutDependencies,
)
from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelFormat, ModelType

model_manager_router = APIRouter(prefix="/v2/models", tags=["model_manager"])

Expand Down Expand Up @@ -297,10 +300,8 @@ async def update_model_record(
"""Update a model's config."""
logger = ApiDependencies.invoker.services.logger
record_store = ApiDependencies.invoker.services.model_manager.store
installer = ApiDependencies.invoker.services.model_manager.install
try:
record_store.update_model(key, changes=changes)
config = installer.sync_model_path(key)
config = record_store.update_model(key, changes=changes)
config = add_cover_image_to_model_config(config, ApiDependencies)
logger.info(f"Updated model: {key}")
except UnknownModelException as e:
Expand Down Expand Up @@ -743,9 +744,18 @@ async def convert_model(
logger.error(str(e))
raise HTTPException(status_code=424, detail=str(e))

if not isinstance(model_config, MainCheckpointConfig):
logger.error(f"The model with key {key} is not a main checkpoint model.")
raise HTTPException(400, f"The model with key {key} is not a main checkpoint model.")
if not isinstance(
model_config,
(
Main_Checkpoint_SD1_Config,
Main_Checkpoint_SD2_Config,
Main_Checkpoint_SDXL_Config,
Main_Checkpoint_SDXLRefiner_Config,
),
):
msg = f"The model with key {key} is not a main SD 1/2/XL checkpoint model."
logger.error(msg)
raise HTTPException(400, msg)

with TemporaryDirectory(dir=ApiDependencies.invoker.services.configuration.models_path) as tmpdir:
convert_path = pathlib.Path(tmpdir) / pathlib.Path(model_config.path).stem
Expand Down
2 changes: 1 addition & 1 deletion invokeai/app/invocations/cogview4_denoise.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
from invokeai.app.invocations.primitives import LatentsOutput
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.backend.flux.sampling_utils import clip_timestep_schedule_fractional
from invokeai.backend.model_manager.config import BaseModelType
from invokeai.backend.model_manager.taxonomy import BaseModelType
from invokeai.backend.rectified_flow.rectified_flow_inpaint_extension import RectifiedFlowInpaintExtension
from invokeai.backend.stable_diffusion.diffusers_pipeline import PipelineIntermediateState
from invokeai.backend.stable_diffusion.diffusion.conditioning_data import CogView4ConditioningInfo
Expand Down
3 changes: 1 addition & 2 deletions invokeai/app/invocations/cogview4_model_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@
VAEField,
)
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.backend.model_manager.config import SubModelType
from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType
from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType, SubModelType


@invocation_output("cogview4_model_loader_output")
Expand Down
11 changes: 5 additions & 6 deletions invokeai/app/invocations/create_gradient_mask.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,7 @@
from invokeai.app.invocations.image_to_latents import ImageToLatentsInvocation
from invokeai.app.invocations.model import UNetField, VAEField
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.backend.model_manager import LoadedModel
from invokeai.backend.model_manager.config import MainConfigBase
from invokeai.backend.model_manager.taxonomy import ModelVariantType
from invokeai.backend.model_manager.taxonomy import FluxVariantType, ModelType, ModelVariantType
from invokeai.backend.stable_diffusion.diffusers_pipeline import image_resized_to_grid_as_tensor


Expand Down Expand Up @@ -182,10 +180,11 @@ def invoke(self, context: InvocationContext) -> GradientMaskOutput:
if self.unet is not None and self.vae is not None and self.image is not None:
# all three fields must be present at the same time
main_model_config = context.models.get_config(self.unet.unet.key)
assert isinstance(main_model_config, MainConfigBase)
if main_model_config.variant is ModelVariantType.Inpaint:
assert main_model_config.type is ModelType.Main
variant = getattr(main_model_config, "variant", None)
if variant is ModelVariantType.Inpaint or variant is FluxVariantType.DevFill:
mask = dilated_mask_tensor
vae_info: LoadedModel = context.models.load(self.vae.vae)
vae_info = context.models.load(self.vae.vae)
image = context.images.get_pil(self.image.image_name)
image_tensor = image_resized_to_grid_as_tensor(image.convert("RGB"))
if image_tensor.dim() == 3:
Expand Down
2 changes: 1 addition & 1 deletion invokeai/app/invocations/denoise_latents.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.app.util.controlnet_utils import prepare_control_image
from invokeai.backend.ip_adapter.ip_adapter import IPAdapter
from invokeai.backend.model_manager.config import AnyModelConfig
from invokeai.backend.model_manager.configs.factory import AnyModelConfig
from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelVariantType
from invokeai.backend.model_patcher import ModelPatcher
from invokeai.backend.patches.layer_patcher import LayerPatcher
Expand Down
7 changes: 4 additions & 3 deletions invokeai/app/invocations/flux_denoise.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
unpack,
)
from invokeai.backend.flux.text_conditioning import FluxReduxConditioning, FluxTextConditioning
from invokeai.backend.model_manager.taxonomy import ModelFormat, ModelVariantType
from invokeai.backend.model_manager.taxonomy import BaseModelType, FluxVariantType, ModelFormat, ModelType
from invokeai.backend.patches.layer_patcher import LayerPatcher
from invokeai.backend.patches.lora_conversions.flux_lora_constants import FLUX_LORA_TRANSFORMER_PREFIX
from invokeai.backend.patches.model_patch_raw import ModelPatchRaw
Expand Down Expand Up @@ -232,7 +232,8 @@ def _run_diffusion(
)

transformer_config = context.models.get_config(self.transformer.transformer)
is_schnell = "schnell" in getattr(transformer_config, "config_path", "")
assert transformer_config.base is BaseModelType.Flux and transformer_config.type is ModelType.Main
is_schnell = transformer_config.variant is FluxVariantType.Schnell

# Calculate the timestep schedule.
timesteps = get_schedule(
Expand Down Expand Up @@ -277,7 +278,7 @@ def _run_diffusion(

# Prepare the extra image conditioning tensor (img_cond) for either FLUX structural control or FLUX Fill.
img_cond: torch.Tensor | None = None
is_flux_fill = transformer_config.variant == ModelVariantType.Inpaint # type: ignore
is_flux_fill = transformer_config.variant is FluxVariantType.DevFill
if is_flux_fill:
img_cond = self._prep_flux_fill_img_cond(
context, device=TorchDevice.choose_torch_device(), dtype=inference_dtype
Expand Down
7 changes: 2 additions & 5 deletions invokeai/app/invocations/flux_ip_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,7 @@
from invokeai.app.invocations.primitives import ImageField
from invokeai.app.invocations.util import validate_begin_end_step, validate_weights
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.backend.model_manager.config import (
IPAdapterCheckpointConfig,
IPAdapterInvokeAIConfig,
)
from invokeai.backend.model_manager.configs.ip_adapter import IPAdapter_Checkpoint_FLUX_Config
from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType


Expand Down Expand Up @@ -68,7 +65,7 @@ def validate_begin_end_step_percent(self) -> Self:
def invoke(self, context: InvocationContext) -> IPAdapterOutput:
# Lookup the CLIP Vision encoder that is intended to be used with the IP-Adapter model.
ip_adapter_info = context.models.get_config(self.ip_adapter_model.key)
assert isinstance(ip_adapter_info, (IPAdapterInvokeAIConfig, IPAdapterCheckpointConfig))
assert isinstance(ip_adapter_info, IPAdapter_Checkpoint_FLUX_Config)

# Note: There is a IPAdapterInvokeAIConfig.image_encoder_model_id field, but it isn't trustworthy.
image_encoder_starter_model = CLIP_VISION_MODEL_MAP[self.clip_vision_model]
Expand Down
10 changes: 4 additions & 6 deletions invokeai/app/invocations/flux_model_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,8 @@
preprocess_t5_encoder_model_identifier,
preprocess_t5_tokenizer_model_identifier,
)
from invokeai.backend.flux.util import max_seq_lengths
from invokeai.backend.model_manager.config import (
CheckpointConfigBase,
)
from invokeai.backend.flux.util import get_flux_max_seq_length
from invokeai.backend.model_manager.configs.base import Checkpoint_Config_Base
from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType, SubModelType


Expand Down Expand Up @@ -87,12 +85,12 @@ def invoke(self, context: InvocationContext) -> FluxModelLoaderOutput:
t5_encoder = preprocess_t5_encoder_model_identifier(self.t5_encoder_model)

transformer_config = context.models.get_config(transformer)
assert isinstance(transformer_config, CheckpointConfigBase)
assert isinstance(transformer_config, Checkpoint_Config_Base)

return FluxModelLoaderOutput(
transformer=TransformerField(transformer=transformer, loras=[]),
clip=CLIPField(tokenizer=tokenizer, text_encoder=clip_encoder, loras=[], skipped_layers=0),
t5_encoder=T5EncoderField(tokenizer=tokenizer2, text_encoder=t5_encoder, loras=[]),
vae=VAEField(vae=vae),
max_seq_len=max_seq_lengths[transformer_config.config_path],
max_seq_len=get_flux_max_seq_length(transformer_config.variant),
)
4 changes: 2 additions & 2 deletions invokeai/app/invocations/flux_redux.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@
from invokeai.app.services.model_records.model_records_base import ModelRecordChanges
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.backend.flux.redux.flux_redux_model import FluxReduxModel
from invokeai.backend.model_manager import BaseModelType, ModelType
from invokeai.backend.model_manager.config import AnyModelConfig
from invokeai.backend.model_manager.configs.factory import AnyModelConfig
from invokeai.backend.model_manager.starter_models import siglip
from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType
from invokeai.backend.sig_lip.sig_lip_pipeline import SigLipPipeline
from invokeai.backend.util.devices import TorchDevice

Expand Down
2 changes: 1 addition & 1 deletion invokeai/app/invocations/flux_text_encoder.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
from invokeai.app.invocations.primitives import FluxConditioningOutput
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.backend.flux.modules.conditioner import HFEncoder
from invokeai.backend.model_manager import ModelFormat
from invokeai.backend.model_manager.taxonomy import ModelFormat
from invokeai.backend.patches.layer_patcher import LayerPatcher
from invokeai.backend.patches.lora_conversions.flux_lora_constants import FLUX_LORA_CLIP_PREFIX, FLUX_LORA_T5_PREFIX
from invokeai.backend.patches.model_patch_raw import ModelPatchRaw
Expand Down
2 changes: 1 addition & 1 deletion invokeai/app/invocations/flux_vae_encode.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from invokeai.app.invocations.primitives import LatentsOutput
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.backend.flux.modules.autoencoder import AutoEncoder
from invokeai.backend.model_manager import LoadedModel
from invokeai.backend.model_manager.load.load_base import LoadedModel
from invokeai.backend.stable_diffusion.diffusers_pipeline import image_resized_to_grid_as_tensor
from invokeai.backend.util.devices import TorchDevice
from invokeai.backend.util.vae_working_memory import estimate_vae_working_memory_flux
Expand Down
2 changes: 1 addition & 1 deletion invokeai/app/invocations/image_to_latents.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
from invokeai.app.invocations.model import VAEField
from invokeai.app.invocations.primitives import LatentsOutput
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.backend.model_manager import LoadedModel
from invokeai.backend.model_manager.load.load_base import LoadedModel
from invokeai.backend.stable_diffusion.diffusers_pipeline import image_resized_to_grid_as_tensor
from invokeai.backend.stable_diffusion.vae_tiling import patch_vae_tiling_params
from invokeai.backend.util.devices import TorchDevice
Expand Down
12 changes: 6 additions & 6 deletions invokeai/app/invocations/ip_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@
from invokeai.app.invocations.util import validate_begin_end_step, validate_weights
from invokeai.app.services.model_records.model_records_base import ModelRecordChanges
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.backend.model_manager.config import (
AnyModelConfig,
IPAdapterCheckpointConfig,
IPAdapterInvokeAIConfig,
from invokeai.backend.model_manager.configs.factory import AnyModelConfig
from invokeai.backend.model_manager.configs.ip_adapter import (
IPAdapter_Checkpoint_Config_Base,
IPAdapter_InvokeAI_Config_Base,
)
from invokeai.backend.model_manager.starter_models import (
StarterModel,
Expand Down Expand Up @@ -123,9 +123,9 @@ def validate_begin_end_step_percent(self) -> Self:
def invoke(self, context: InvocationContext) -> IPAdapterOutput:
# Lookup the CLIP Vision encoder that is intended to be used with the IP-Adapter model.
ip_adapter_info = context.models.get_config(self.ip_adapter_model.key)
assert isinstance(ip_adapter_info, (IPAdapterInvokeAIConfig, IPAdapterCheckpointConfig))
assert isinstance(ip_adapter_info, (IPAdapter_InvokeAI_Config_Base, IPAdapter_Checkpoint_Config_Base))

if isinstance(ip_adapter_info, IPAdapterInvokeAIConfig):
if isinstance(ip_adapter_info, IPAdapter_InvokeAI_Config_Base):
image_encoder_model_id = ip_adapter_info.image_encoder_model_id
image_encoder_model_name = image_encoder_model_id.split("/")[-1].strip()
else:
Expand Down
9 changes: 4 additions & 5 deletions invokeai/app/invocations/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,7 @@
from invokeai.app.invocations.fields import FieldDescriptions, ImageField, Input, InputField, OutputField
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.app.shared.models import FreeUConfig
from invokeai.backend.model_manager.config import (
AnyModelConfig,
)
from invokeai.backend.model_manager.configs.factory import AnyModelConfig
from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType, SubModelType


Expand All @@ -24,8 +22,9 @@ class ModelIdentifierField(BaseModel):
name: str = Field(description="The model's name")
base: BaseModelType = Field(description="The model's base model type")
type: ModelType = Field(description="The model's type")
submodel_type: Optional[SubModelType] = Field(
description="The submodel to load, if this is a main model", default=None
submodel_type: SubModelType | None = Field(
description="The submodel to load, if this is a main model",
default=None,
)

@classmethod
Expand Down
2 changes: 1 addition & 1 deletion invokeai/app/invocations/sd3_denoise.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
from invokeai.app.invocations.sd3_text_encoder import SD3_T5_MAX_SEQ_LEN
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.backend.flux.sampling_utils import clip_timestep_schedule_fractional
from invokeai.backend.model_manager import BaseModelType
from invokeai.backend.model_manager.taxonomy import BaseModelType
from invokeai.backend.rectified_flow.rectified_flow_inpaint_extension import RectifiedFlowInpaintExtension
from invokeai.backend.stable_diffusion.diffusers_pipeline import PipelineIntermediateState
from invokeai.backend.stable_diffusion.diffusion.conditioning_data import SD3ConditioningInfo
Expand Down
4 changes: 2 additions & 2 deletions invokeai/app/services/events/events_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@
SessionQueueItem,
SessionQueueStatus,
)
from invokeai.backend.model_manager import SubModelType
from invokeai.backend.model_manager.config import AnyModelConfig
from invokeai.backend.model_manager.configs.factory import AnyModelConfig
from invokeai.backend.model_manager.taxonomy import SubModelType


class EventServiceBase:
Expand Down
4 changes: 2 additions & 2 deletions invokeai/app/services/events/events_common.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
)
from invokeai.app.services.shared.graph import AnyInvocation, AnyInvocationOutput
from invokeai.app.util.misc import get_timestamp
from invokeai.backend.model_manager import SubModelType
from invokeai.backend.model_manager.config import AnyModelConfig
from invokeai.backend.model_manager.configs.factory import AnyModelConfig
from invokeai.backend.model_manager.taxonomy import SubModelType

if TYPE_CHECKING:
from invokeai.app.services.download.download_base import DownloadJob
Expand Down
14 changes: 0 additions & 14 deletions invokeai/app/services/model_install/model_install_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
from invokeai.app.services.invoker import Invoker
from invokeai.app.services.model_install.model_install_common import ModelInstallJob, ModelSource
from invokeai.app.services.model_records import ModelRecordChanges, ModelRecordServiceBase
from invokeai.backend.model_manager import AnyModelConfig

if TYPE_CHECKING:
from invokeai.app.services.events.events_base import EventServiceBase
Expand Down Expand Up @@ -231,19 +230,6 @@ def wait_for_installs(self, timeout: int = 0) -> List[ModelInstallJob]:
will block indefinitely until the installs complete.
"""

@abstractmethod
def sync_model_path(self, key: str) -> AnyModelConfig:
"""
Move model into the location indicated by its basetype, type and name.

Call this after updating a model's attributes in order to move
the model's path into the location indicated by its basetype, type and
name. Applies only to models whose paths are within the root `models_dir`
directory.

May raise an UnknownModelException.
"""

@abstractmethod
def download_and_cache_model(self, source: str | AnyHttpUrl) -> Path:
"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

from invokeai.app.services.download import DownloadJob, MultiFileDownloadJob
from invokeai.app.services.model_records import ModelRecordChanges
from invokeai.backend.model_manager.config import AnyModelConfig
from invokeai.backend.model_manager.configs.factory import AnyModelConfig
from invokeai.backend.model_manager.metadata import AnyModelRepoMetadata
from invokeai.backend.model_manager.taxonomy import ModelRepoVariant, ModelSourceType

Expand Down
Loading
Loading