diff --git a/invokeai/app/api/dependencies.py b/invokeai/app/api/dependencies.py index fc232b8cdb..f81b7122f5 100644 --- a/invokeai/app/api/dependencies.py +++ b/invokeai/app/api/dependencies.py @@ -31,7 +31,7 @@ from invokeai.app.services.session_processor.session_processor_default import ( ) from invokeai.app.services.session_queue.session_queue_sqlite import SqliteSessionQueue from invokeai.app.services.shared.sqlite.sqlite_util import init_db -from invokeai.app.services.style_preset_images.style_preset_images_default import StylePresetImageFileStorageDisk +from invokeai.app.services.style_preset_images.style_preset_images_disk import StylePresetImageFileStorageDisk from invokeai.app.services.style_preset_records.style_preset_records_sqlite import SqliteStylePresetRecordsStorage from invokeai.app.services.urls.urls_default import LocalUrlService from invokeai.app.services.workflow_records.workflow_records_sqlite import SqliteWorkflowRecordsStorage @@ -113,9 +113,7 @@ class ApiDependencies: urls = LocalUrlService() workflow_records = SqliteWorkflowRecordsStorage(db=db) style_preset_records = SqliteStylePresetRecordsStorage(db=db) - style_preset_images_service = StylePresetImageFileStorageDisk( - style_preset_images_folder / "style_preset_images" - ) + style_preset_image_files = StylePresetImageFileStorageDisk(style_preset_images_folder / "style_preset_images") services = InvocationServices( board_image_records=board_image_records, @@ -142,7 +140,7 @@ class ApiDependencies: tensors=tensors, conditioning=conditioning, style_preset_records=style_preset_records, - style_preset_images_service=style_preset_images_service, + style_preset_image_files=style_preset_image_files, ) ApiDependencies.invoker = Invoker(services) diff --git a/invokeai/app/api/routers/style_presets.py b/invokeai/app/api/routers/style_presets.py index b3b399f4e9..8f377d72a3 100644 --- a/invokeai/app/api/routers/style_presets.py +++ b/invokeai/app/api/routers/style_presets.py @@ -32,7 +32,7 @@ async def get_style_preset( ) -> StylePresetRecordWithImage: """Gets a style preset""" try: - image = ApiDependencies.invoker.services.style_preset_images_service.get_url(style_preset_id) + image = ApiDependencies.invoker.services.style_preset_image_files.get_url(style_preset_id) style_preset = ApiDependencies.invoker.services.style_preset_records.get(style_preset_id) return StylePresetRecordWithImage(image=image, **style_preset.model_dump()) except StylePresetNotFoundError: @@ -67,20 +67,22 @@ async def update_style_preset( raise HTTPException(status_code=415, detail="Failed to read image") try: - ApiDependencies.invoker.services.style_preset_images_service.save(pil_image, style_preset_id) + ApiDependencies.invoker.services.style_preset_image_files.save(style_preset_id, pil_image) except ValueError as e: raise HTTPException(status_code=409, detail=str(e)) else: try: - ApiDependencies.invoker.services.style_preset_images_service.delete(style_preset_id) + ApiDependencies.invoker.services.style_preset_image_files.delete(style_preset_id) except StylePresetImageFileNotFoundException: pass preset_data = PresetData(positive_prompt=positive_prompt, negative_prompt=negative_prompt) changes = StylePresetChanges(name=name, preset_data=preset_data) - style_preset_image = ApiDependencies.invoker.services.style_preset_images_service.get_url(style_preset_id) - style_preset = ApiDependencies.invoker.services.style_preset_records.update(id=style_preset_id, changes=changes) + style_preset_image = ApiDependencies.invoker.services.style_preset_image_files.get_url(style_preset_id) + style_preset = ApiDependencies.invoker.services.style_preset_records.update( + style_preset_id=style_preset_id, changes=changes + ) return StylePresetRecordWithImage(image=style_preset_image, **style_preset.model_dump()) @@ -93,7 +95,7 @@ async def delete_style_preset( ) -> None: """Deletes a style preset""" try: - ApiDependencies.invoker.services.style_preset_images_service.delete(style_preset_id) + ApiDependencies.invoker.services.style_preset_image_files.delete(style_preset_id) except StylePresetImageFileNotFoundException: pass @@ -131,11 +133,11 @@ async def create_style_preset( raise HTTPException(status_code=415, detail="Failed to read image") try: - ApiDependencies.invoker.services.style_preset_images_service.save(pil_image, new_style_preset.id) + ApiDependencies.invoker.services.style_preset_image_files.save(new_style_preset.id, pil_image) except ValueError as e: raise HTTPException(status_code=409, detail=str(e)) - preset_image = ApiDependencies.invoker.services.style_preset_images_service.get_url(new_style_preset.id) + preset_image = ApiDependencies.invoker.services.style_preset_image_files.get_url(new_style_preset.id) return StylePresetRecordWithImage(image=preset_image, **new_style_preset.model_dump()) @@ -151,7 +153,7 @@ async def list_style_presets() -> list[StylePresetRecordWithImage]: style_presets_with_image: list[StylePresetRecordWithImage] = [] style_presets = ApiDependencies.invoker.services.style_preset_records.get_many() for preset in style_presets: - image = ApiDependencies.invoker.services.style_preset_images_service.get_url(preset.id) + image = ApiDependencies.invoker.services.style_preset_image_files.get_url(preset.id) style_preset_with_image = StylePresetRecordWithImage(image=image, **preset.model_dump()) style_presets_with_image.append(style_preset_with_image) @@ -176,7 +178,7 @@ async def get_style_preset_image( """Gets an image file that previews the model""" try: - path = ApiDependencies.invoker.services.style_preset_images_service.get_path(style_preset_id) + path = ApiDependencies.invoker.services.style_preset_image_files.get_path(style_preset_id) response = FileResponse( path, diff --git a/invokeai/app/services/invocation_services.py b/invokeai/app/services/invocation_services.py index 3686b1d9e1..db693dc837 100644 --- a/invokeai/app/services/invocation_services.py +++ b/invokeai/app/services/invocation_services.py @@ -64,7 +64,7 @@ class InvocationServices: tensors: "ObjectSerializerBase[torch.Tensor]", conditioning: "ObjectSerializerBase[ConditioningFieldData]", style_preset_records: "StylePresetRecordsStorageBase", - style_preset_images_service: "StylePresetImageFileStorageBase", + style_preset_image_files: "StylePresetImageFileStorageBase", ): self.board_images = board_images self.board_image_records = board_image_records @@ -90,4 +90,4 @@ class InvocationServices: self.tensors = tensors self.conditioning = conditioning self.style_preset_records = style_preset_records - self.style_preset_images_service = style_preset_images_service + self.style_preset_image_files = style_preset_image_files diff --git a/invokeai/app/services/shared/sqlite_migrator/migrations/migration_14.py b/invokeai/app/services/shared/sqlite_migrator/migrations/migration_14.py index e7e77651dd..399f5a71d2 100644 --- a/invokeai/app/services/shared/sqlite_migrator/migrations/migration_14.py +++ b/invokeai/app/services/shared/sqlite_migrator/migrations/migration_14.py @@ -8,14 +8,14 @@ class Migration14Callback: self._create_style_presets(cursor) def _create_style_presets(self, cursor: sqlite3.Cursor) -> None: - """Create the table used to store model metadata downloaded from remote sources.""" + """Create the table used to store style presets.""" tables = [ """--sql CREATE TABLE IF NOT EXISTS style_presets ( id TEXT NOT NULL PRIMARY KEY, name TEXT NOT NULL, preset_data TEXT NOT NULL, - is_default BOOLEAN DEFAULT FALSE, + type TEXT NOT NULL DEFAULT "user", created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), -- Updated via trigger updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')) @@ -47,10 +47,10 @@ class Migration14Callback: def build_migration_14() -> Migration: """ - Build the migration from database version 12 to 14.. + Build the migration from database version 13 to 14.. This migration does the following: - - Adds `archived` columns to the board table. + - Create the table used to store style presets. """ migration_14 = Migration( from_version=13, diff --git a/invokeai/app/services/style_preset_images/style_preset_images_base.py b/invokeai/app/services/style_preset_images/style_preset_images_base.py index cc5cf3edae..d8158ad2ae 100644 --- a/invokeai/app/services/style_preset_images/style_preset_images_base.py +++ b/invokeai/app/services/style_preset_images/style_preset_images_base.py @@ -23,7 +23,7 @@ class StylePresetImageFileStorageBase(ABC): pass @abstractmethod - def save(self, image: PILImageType, style_preset_id: str) -> None: + def save(self, style_preset_id: str, image: PILImageType) -> None: """Saves a style preset image.""" pass diff --git a/invokeai/app/services/style_preset_images/style_preset_images_common.py b/invokeai/app/services/style_preset_images/style_preset_images_common.py index fe7d204b00..054a12b82b 100644 --- a/invokeai/app/services/style_preset_images/style_preset_images_common.py +++ b/invokeai/app/services/style_preset_images/style_preset_images_common.py @@ -1,19 +1,19 @@ class StylePresetImageFileNotFoundException(Exception): """Raised when an image file is not found in storage.""" - def __init__(self, message="Style preset image file not found"): + def __init__(self, message: str = "Style preset image file not found"): super().__init__(message) class StylePresetImageFileSaveException(Exception): """Raised when an image cannot be saved.""" - def __init__(self, message="Style preset image file not saved"): + def __init__(self, message: str = "Style preset image file not saved"): super().__init__(message) class StylePresetImageFileDeleteException(Exception): """Raised when an image cannot be deleted.""" - def __init__(self, message="Style preset image file not deleted"): + def __init__(self, message: str = "Style preset image file not deleted"): super().__init__(message) diff --git a/invokeai/app/services/style_preset_images/style_preset_images_default.py b/invokeai/app/services/style_preset_images/style_preset_images_disk.py similarity index 94% rename from invokeai/app/services/style_preset_images/style_preset_images_default.py rename to invokeai/app/services/style_preset_images/style_preset_images_disk.py index 4cffd183cd..e5450830f4 100644 --- a/invokeai/app/services/style_preset_images/style_preset_images_default.py +++ b/invokeai/app/services/style_preset_images/style_preset_images_disk.py @@ -28,14 +28,11 @@ class StylePresetImageFileStorageDisk(StylePresetImageFileStorageBase): try: path = self.get_path(style_preset_id) - if not self._validate_path(path): - raise StylePresetImageFileNotFoundException - return Image.open(path) except FileNotFoundError as e: raise StylePresetImageFileNotFoundException from e - def save(self, image: PILImageType, style_preset_id: str) -> None: + def save(self, style_preset_id: str, image: PILImageType) -> None: try: self._validate_storage_folders() image_path = self._style_preset_images_folder / (style_preset_id + ".webp") diff --git a/invokeai/app/services/style_preset_records/style_preset_records_base.py b/invokeai/app/services/style_preset_records/style_preset_records_base.py index 2a408419f3..9e3a504e06 100644 --- a/invokeai/app/services/style_preset_records/style_preset_records_base.py +++ b/invokeai/app/services/style_preset_records/style_preset_records_base.py @@ -11,7 +11,7 @@ class StylePresetRecordsStorageBase(ABC): """Base class for style preset storage services.""" @abstractmethod - def get(self, id: str) -> StylePresetRecordDTO: + def get(self, style_preset_id: str) -> StylePresetRecordDTO: """Get style preset by id.""" pass @@ -21,12 +21,12 @@ class StylePresetRecordsStorageBase(ABC): pass @abstractmethod - def update(self, id: str, changes: StylePresetChanges) -> StylePresetRecordDTO: + def update(self, style_preset_id: str, changes: StylePresetChanges) -> StylePresetRecordDTO: """Updates a style preset.""" pass @abstractmethod - def delete(self, id: str) -> None: + def delete(self, style_preset_id: str) -> None: """Deletes a style preset.""" pass diff --git a/invokeai/app/services/style_preset_records/style_preset_records_common.py b/invokeai/app/services/style_preset_records/style_preset_records_common.py index bed54c3b4b..0eb8b138c9 100644 --- a/invokeai/app/services/style_preset_records/style_preset_records_common.py +++ b/invokeai/app/services/style_preset_records/style_preset_records_common.py @@ -1,7 +1,10 @@ +from enum import Enum from typing import Any, Optional from pydantic import BaseModel, Field, TypeAdapter +from invokeai.app.util.metaenum import MetaEnum + class StylePresetNotFoundError(Exception): """Raised when a style preset is not found""" @@ -15,6 +18,12 @@ class PresetData(BaseModel, extra="forbid"): PresetDataValidator = TypeAdapter(PresetData) +class PresetType(str, Enum, metaclass=MetaEnum): + User = "user" + Default = "default" + Project = "project" + + class StylePresetChanges(BaseModel, extra="forbid"): name: Optional[str] = Field(default=None, description="The style preset's new name.") preset_data: Optional[PresetData] = Field(default=None, description="The updated data for style preset.") @@ -23,7 +32,7 @@ class StylePresetChanges(BaseModel, extra="forbid"): class StylePresetWithoutId(BaseModel): name: str = Field(description="The name of the style preset.") preset_data: PresetData = Field(description="The preset data") - is_default: Optional[bool] = Field(description="Whether or not the style preset is default", default=False) + type: PresetType = Field(description="The type of style preset", default=PresetType.User) class StylePresetRecordDTO(StylePresetWithoutId): diff --git a/invokeai/app/services/style_preset_records/style_preset_records_sqlite.py b/invokeai/app/services/style_preset_records/style_preset_records_sqlite.py index 96ff7050ba..6519d7bd30 100644 --- a/invokeai/app/services/style_preset_records/style_preset_records_sqlite.py +++ b/invokeai/app/services/style_preset_records/style_preset_records_sqlite.py @@ -5,6 +5,7 @@ from invokeai.app.services.invoker import Invoker from invokeai.app.services.shared.sqlite.sqlite_database import SqliteDatabase from invokeai.app.services.style_preset_records.style_preset_records_base import StylePresetRecordsStorageBase from invokeai.app.services.style_preset_records.style_preset_records_common import ( + PresetType, StylePresetChanges, StylePresetNotFoundError, StylePresetRecordDTO, @@ -24,7 +25,7 @@ class SqliteStylePresetRecordsStorage(StylePresetRecordsStorageBase): self._invoker = invoker self._sync_default_style_presets() - def get(self, id: str) -> StylePresetRecordDTO: + def get(self, style_preset_id: str) -> StylePresetRecordDTO: """Gets a style preset by ID.""" try: self._lock.acquire() @@ -34,11 +35,11 @@ class SqliteStylePresetRecordsStorage(StylePresetRecordsStorageBase): FROM style_presets WHERE id = ?; """, - (id,), + (style_preset_id,), ) row = self._cursor.fetchone() if row is None: - raise StylePresetNotFoundError(f"Style preset with id {id} not found") + raise StylePresetNotFoundError(f"Style preset with id {style_preset_id} not found") return StylePresetRecordDTO.from_dict(dict(row)) except Exception: self._conn.rollback() @@ -47,7 +48,7 @@ class SqliteStylePresetRecordsStorage(StylePresetRecordsStorageBase): self._lock.release() def create(self, style_preset: StylePresetWithoutId) -> StylePresetRecordDTO: - id = uuid_string() + style_preset_id = uuid_string() try: self._lock.acquire() self._cursor.execute( @@ -56,11 +57,16 @@ class SqliteStylePresetRecordsStorage(StylePresetRecordsStorageBase): id, name, preset_data, - is_default + type ) VALUES (?, ?, ?, ?); """, - (id, style_preset.name, style_preset.preset_data.model_dump_json(), style_preset.is_default), + ( + style_preset_id, + style_preset.name, + style_preset.preset_data.model_dump_json(), + style_preset.type, + ), ) self._conn.commit() except Exception: @@ -68,9 +74,9 @@ class SqliteStylePresetRecordsStorage(StylePresetRecordsStorageBase): raise finally: self._lock.release() - return self.get(id) + return self.get(style_preset_id) - def update(self, id: str, changes: StylePresetChanges) -> StylePresetRecordDTO: + def update(self, style_preset_id: str, changes: StylePresetChanges) -> StylePresetRecordDTO: try: self._lock.acquire() # Change the name of a style preset @@ -81,7 +87,7 @@ class SqliteStylePresetRecordsStorage(StylePresetRecordsStorageBase): SET name = ? WHERE id = ?; """, - (changes.name, id), + (changes.name, style_preset_id), ) # Change the preset data for a style preset @@ -92,7 +98,7 @@ class SqliteStylePresetRecordsStorage(StylePresetRecordsStorageBase): SET preset_data = ? WHERE id = ?; """, - (changes.preset_data.model_dump_json(), id), + (changes.preset_data.model_dump_json(), style_preset_id), ) self._conn.commit() @@ -101,17 +107,17 @@ class SqliteStylePresetRecordsStorage(StylePresetRecordsStorageBase): raise finally: self._lock.release() - return self.get(id) + return self.get(style_preset_id) - def delete(self, id: str) -> None: + def delete(self, style_preset_id: str) -> None: try: self._lock.acquire() self._cursor.execute( """--sql DELETE from style_presets - WHERE id = ? ; + WHERE id = ?; """, - (id,), + (style_preset_id,), ) self._conn.commit() except Exception: @@ -147,26 +153,25 @@ class SqliteStylePresetRecordsStorage(StylePresetRecordsStorageBase): def _sync_default_style_presets(self) -> None: """Syncs default style presets to the database. Internal use only.""" + # First delete all existing default style presets try: self._lock.acquire() self._cursor.execute( """--sql DELETE FROM style_presets - WHERE is_default = True; + WHERE type = "default"; """ ) - try: - with open(Path(__file__).parent / Path("default_style_presets.json"), "r") as file: - presets: list[StylePresetWithoutId] = json.load(file) - for preset in presets: - style_preset = StylePresetWithoutId(is_default=True, **preset) - self.create(style_preset) - except Exception: - raise Exception() - self._conn.commit() except Exception: self._conn.rollback() raise finally: self._lock.release() + # Next, parse and create the default style presets + with self._lock, open(Path(__file__).parent / Path("default_style_presets.json"), "r") as file: + presets = json.load(file) + for preset in presets: + style_preset = StylePresetWithoutId.model_validate(preset) + style_preset.type = PresetType.Default + self.create(style_preset) diff --git a/invokeai/frontend/web/src/features/stylePresets/components/StylePresetListItem.tsx b/invokeai/frontend/web/src/features/stylePresets/components/StylePresetListItem.tsx index 8d9aa42c17..be14dd0e7d 100644 --- a/invokeai/frontend/web/src/features/stylePresets/components/StylePresetListItem.tsx +++ b/invokeai/frontend/web/src/features/stylePresets/components/StylePresetListItem.tsx @@ -32,8 +32,8 @@ export const StylePresetListItem = ({ preset }: { preset: StylePresetRecordWithI dispatch( prefilledFormDataChanged({ name, - positivePrompt: positive_prompt, - negativePrompt: negative_prompt, + positivePrompt: positive_prompt || '', + negativePrompt: negative_prompt || '', imageUrl: preset.image, }) ); @@ -105,7 +105,7 @@ export const StylePresetListItem = ({ preset }: { preset: StylePresetRecordWithI )} - {!preset.is_default && ( + {preset.type !== 'default' && ( { const groupedData = filteredData.reduce( (acc: { defaultPresets: StylePresetRecordWithImage[]; presets: StylePresetRecordWithImage[] }, preset) => { - if (preset.is_default) { + if (preset.type === 'default') { acc.defaultPresets.push(preset); } else { acc.presets.push(preset); diff --git a/invokeai/frontend/web/src/services/api/schema.ts b/invokeai/frontend/web/src/services/api/schema.ts index 8293c4ffe7..ad2eb31b49 100644 --- a/invokeai/frontend/web/src/services/api/schema.ts +++ b/invokeai/frontend/web/src/services/api/schema.ts @@ -7561,151 +7561,151 @@ export type components = { project_id: string | null; }; InvocationOutputMap: { - float_to_int: components["schemas"]["IntegerOutput"]; - collect: components["schemas"]["CollectInvocationOutput"]; - create_denoise_mask: components["schemas"]["DenoiseMaskOutput"]; - mul: components["schemas"]["IntegerOutput"]; - compel: components["schemas"]["ConditioningOutput"]; - segment_anything_processor: components["schemas"]["ImageOutput"]; - blank_image: components["schemas"]["ImageOutput"]; - cv_inpaint: components["schemas"]["ImageOutput"]; - sdxl_model_loader: components["schemas"]["SDXLModelLoaderOutput"]; - grounding_dino: components["schemas"]["BoundingBoxCollectionOutput"]; - range: components["schemas"]["IntegerCollectionOutput"]; - boolean_collection: components["schemas"]["BooleanCollectionOutput"]; - color: components["schemas"]["ColorOutput"]; - vae_loader: components["schemas"]["VAEOutput"]; - lblend: components["schemas"]["LatentsOutput"]; - mlsd_image_processor: components["schemas"]["ImageOutput"]; - pair_tile_image: components["schemas"]["PairTileImageOutput"]; - calculate_image_tiles_min_overlap: components["schemas"]["CalculateImageTilesOutput"]; - save_image: components["schemas"]["ImageOutput"]; - integer: components["schemas"]["IntegerOutput"]; - scheduler: components["schemas"]["SchedulerOutput"]; - metadata: components["schemas"]["MetadataOutput"]; - midas_depth_image_processor: components["schemas"]["ImageOutput"]; - prompt_from_file: components["schemas"]["StringCollectionOutput"]; - add: components["schemas"]["IntegerOutput"]; - sdxl_lora_loader: components["schemas"]["SDXLLoRALoaderOutput"]; - img_chan: components["schemas"]["ImageOutput"]; - img_lerp: components["schemas"]["ImageOutput"]; - sdxl_refiner_compel_prompt: components["schemas"]["ConditioningOutput"]; - freeu: components["schemas"]["UNetOutput"]; - tiled_multi_diffusion_denoise_latents: components["schemas"]["LatentsOutput"]; - div: components["schemas"]["IntegerOutput"]; - float_math: components["schemas"]["FloatOutput"]; - random_range: components["schemas"]["IntegerCollectionOutput"]; - normalbae_image_processor: components["schemas"]["ImageOutput"]; - lresize: components["schemas"]["LatentsOutput"]; - t2i_adapter: components["schemas"]["T2IAdapterOutput"]; - bounding_box: components["schemas"]["BoundingBoxOutput"]; - lineart_anime_image_processor: components["schemas"]["ImageOutput"]; - string_replace: components["schemas"]["StringOutput"]; - spandrel_image_to_image_autoscale: components["schemas"]["ImageOutput"]; - image: components["schemas"]["ImageOutput"]; - dynamic_prompt: components["schemas"]["StringCollectionOutput"]; - seamless: components["schemas"]["SeamlessModeOutput"]; - lscale: components["schemas"]["LatentsOutput"]; - tensor_mask_to_image: components["schemas"]["ImageOutput"]; - merge_tiles_to_image: components["schemas"]["ImageOutput"]; - latents: components["schemas"]["LatentsOutput"]; - create_gradient_mask: components["schemas"]["GradientMaskOutput"]; - lora_selector: components["schemas"]["LoRASelectorOutput"]; - lora_collection_loader: components["schemas"]["LoRALoaderOutput"]; - integer_collection: components["schemas"]["IntegerCollectionOutput"]; - round_float: components["schemas"]["FloatOutput"]; - mediapipe_face_processor: components["schemas"]["ImageOutput"]; - dw_openpose_image_processor: components["schemas"]["ImageOutput"]; - lineart_image_processor: components["schemas"]["ImageOutput"]; - infill_lama: components["schemas"]["ImageOutput"]; - rand_float: components["schemas"]["FloatOutput"]; - rand_int: components["schemas"]["IntegerOutput"]; - mask_combine: components["schemas"]["ImageOutput"]; - calculate_image_tiles: components["schemas"]["CalculateImageTilesOutput"]; - img_blur: components["schemas"]["ImageOutput"]; - float: components["schemas"]["FloatOutput"]; tile_to_properties: components["schemas"]["TileToPropertiesOutput"]; - img_scale: components["schemas"]["ImageOutput"]; - img_channel_offset: components["schemas"]["ImageOutput"]; - crop_latents: components["schemas"]["LatentsOutput"]; - face_off: components["schemas"]["FaceOffOutput"]; - denoise_latents: components["schemas"]["LatentsOutput"]; - controlnet: components["schemas"]["ControlOutput"]; - img_mul: components["schemas"]["ImageOutput"]; - float_collection: components["schemas"]["FloatCollectionOutput"]; - zoe_depth_image_processor: components["schemas"]["ImageOutput"]; - pidi_image_processor: components["schemas"]["ImageOutput"]; - spandrel_image_to_image: components["schemas"]["ImageOutput"]; - i2l: components["schemas"]["LatentsOutput"]; - integer_math: components["schemas"]["IntegerOutput"]; - depth_anything_image_processor: components["schemas"]["ImageOutput"]; - content_shuffle_image_processor: components["schemas"]["ImageOutput"]; - metadata_item: components["schemas"]["MetadataItemOutput"]; - img_nsfw: components["schemas"]["ImageOutput"]; - mask_edge: components["schemas"]["ImageOutput"]; - img_hue_adjust: components["schemas"]["ImageOutput"]; - infill_rgba: components["schemas"]["ImageOutput"]; - esrgan: components["schemas"]["ImageOutput"]; - alpha_mask_to_tensor: components["schemas"]["MaskOutput"]; - img_pad_crop: components["schemas"]["ImageOutput"]; - sub: components["schemas"]["IntegerOutput"]; - clip_skip: components["schemas"]["CLIPSkipInvocationOutput"]; + color: components["schemas"]["ColorOutput"]; boolean: components["schemas"]["BooleanOutput"]; - conditioning_collection: components["schemas"]["ConditioningCollectionOutput"]; - calculate_image_tiles_even_split: components["schemas"]["CalculateImageTilesOutput"]; + mediapipe_face_processor: components["schemas"]["ImageOutput"]; + face_mask_detection: components["schemas"]["FaceMaskOutput"]; + sdxl_refiner_compel_prompt: components["schemas"]["ConditioningOutput"]; + img_channel_offset: components["schemas"]["ImageOutput"]; + segment_anything: components["schemas"]["MaskOutput"]; + boolean_collection: components["schemas"]["BooleanCollectionOutput"]; + denoise_latents: components["schemas"]["LatentsOutput"]; + img_paste: components["schemas"]["ImageOutput"]; + face_identifier: components["schemas"]["ImageOutput"]; + img_hue_adjust: components["schemas"]["ImageOutput"]; + controlnet: components["schemas"]["ControlOutput"]; + lineart_anime_image_processor: components["schemas"]["ImageOutput"]; + img_ilerp: components["schemas"]["ImageOutput"]; + float_range: components["schemas"]["FloatCollectionOutput"]; + img_scale: components["schemas"]["ImageOutput"]; + lora_selector: components["schemas"]["LoRASelectorOutput"]; + float_to_int: components["schemas"]["IntegerOutput"]; + mask_edge: components["schemas"]["ImageOutput"]; + face_off: components["schemas"]["FaceOffOutput"]; + canvas_paste_back: components["schemas"]["ImageOutput"]; + image: components["schemas"]["ImageOutput"]; + mask_combine: components["schemas"]["ImageOutput"]; + integer_collection: components["schemas"]["IntegerCollectionOutput"]; + compel: components["schemas"]["ConditioningOutput"]; + normalbae_image_processor: components["schemas"]["ImageOutput"]; + img_watermark: components["schemas"]["ImageOutput"]; + tiled_multi_diffusion_denoise_latents: components["schemas"]["LatentsOutput"]; + integer: components["schemas"]["IntegerOutput"]; + spandrel_image_to_image: components["schemas"]["ImageOutput"]; color_correct: components["schemas"]["ImageOutput"]; latents_collection: components["schemas"]["LatentsCollectionOutput"]; - infill_patchmatch: components["schemas"]["ImageOutput"]; - range_of_size: components["schemas"]["IntegerCollectionOutput"]; - string_join_three: components["schemas"]["StringOutput"]; - tile_image_processor: components["schemas"]["ImageOutput"]; - img_resize: components["schemas"]["ImageOutput"]; - string_join: components["schemas"]["StringOutput"]; - sdxl_lora_collection_loader: components["schemas"]["SDXLLoRALoaderOutput"]; - canny_image_processor: components["schemas"]["ImageOutput"]; + img_lerp: components["schemas"]["ImageOutput"]; string: components["schemas"]["StringOutput"]; - string_collection: components["schemas"]["StringCollectionOutput"]; - ip_adapter: components["schemas"]["IPAdapterOutput"]; - canvas_paste_back: components["schemas"]["ImageOutput"]; - rectangle_mask: components["schemas"]["MaskOutput"]; - sdxl_compel_prompt: components["schemas"]["ConditioningOutput"]; - show_image: components["schemas"]["ImageOutput"]; - img_conv: components["schemas"]["ImageOutput"]; - img_paste: components["schemas"]["ImageOutput"]; - heuristic_resize: components["schemas"]["ImageOutput"]; - infill_cv2: components["schemas"]["ImageOutput"]; - leres_image_processor: components["schemas"]["ImageOutput"]; - l2i: components["schemas"]["ImageOutput"]; - hed_image_processor: components["schemas"]["ImageOutput"]; - main_model_loader: components["schemas"]["ModelLoaderOutput"]; - string_split_neg: components["schemas"]["StringPosNegOutput"]; - step_param_easing: components["schemas"]["FloatCollectionOutput"]; - iterate: components["schemas"]["IterateInvocationOutput"]; - string_split: components["schemas"]["String2Output"]; - merge_metadata: components["schemas"]["MetadataOutput"]; - face_mask_detection: components["schemas"]["FaceMaskOutput"]; - img_watermark: components["schemas"]["ImageOutput"]; - lora_loader: components["schemas"]["LoRALoaderOutput"]; - float_range: components["schemas"]["FloatCollectionOutput"]; - sdxl_refiner_model_loader: components["schemas"]["SDXLRefinerModelLoaderOutput"]; - mask_from_id: components["schemas"]["ImageOutput"]; - core_metadata: components["schemas"]["MetadataOutput"]; - segment_anything: components["schemas"]["MaskOutput"]; - invert_tensor_mask: components["schemas"]["MaskOutput"]; - infill_tile: components["schemas"]["ImageOutput"]; - model_identifier: components["schemas"]["ModelIdentifierOutput"]; - noise: components["schemas"]["NoiseOutput"]; - img_crop: components["schemas"]["ImageOutput"]; - img_ilerp: components["schemas"]["ImageOutput"]; - conditioning: components["schemas"]["ConditioningOutput"]; - tomask: components["schemas"]["ImageOutput"]; - face_identifier: components["schemas"]["ImageOutput"]; - color_map_image_processor: components["schemas"]["ImageOutput"]; - image_collection: components["schemas"]["ImageCollectionOutput"]; - img_channel_multiply: components["schemas"]["ImageOutput"]; - image_mask_to_tensor: components["schemas"]["MaskOutput"]; + sub: components["schemas"]["IntegerOutput"]; unsharp_mask: components["schemas"]["ImageOutput"]; + mask_from_id: components["schemas"]["ImageOutput"]; + dw_openpose_image_processor: components["schemas"]["ImageOutput"]; + string_split_neg: components["schemas"]["StringPosNegOutput"]; + pidi_image_processor: components["schemas"]["ImageOutput"]; + lresize: components["schemas"]["LatentsOutput"]; + round_float: components["schemas"]["FloatOutput"]; + float: components["schemas"]["FloatOutput"]; + string_collection: components["schemas"]["StringCollectionOutput"]; + freeu: components["schemas"]["UNetOutput"]; + metadata_item: components["schemas"]["MetadataItemOutput"]; + merge_metadata: components["schemas"]["MetadataOutput"]; + calculate_image_tiles_min_overlap: components["schemas"]["CalculateImageTilesOutput"]; + merge_tiles_to_image: components["schemas"]["ImageOutput"]; + iterate: components["schemas"]["IterateInvocationOutput"]; + float_collection: components["schemas"]["FloatCollectionOutput"]; + lblend: components["schemas"]["LatentsOutput"]; ideal_size: components["schemas"]["IdealSizeOutput"]; + tomask: components["schemas"]["ImageOutput"]; + string_split: components["schemas"]["String2Output"]; + mul: components["schemas"]["IntegerOutput"]; + string_replace: components["schemas"]["StringOutput"]; + seamless: components["schemas"]["SeamlessModeOutput"]; + tile_image_processor: components["schemas"]["ImageOutput"]; + image_mask_to_tensor: components["schemas"]["MaskOutput"]; + rand_int: components["schemas"]["IntegerOutput"]; + bounding_box: components["schemas"]["BoundingBoxOutput"]; + main_model_loader: components["schemas"]["ModelLoaderOutput"]; + img_channel_multiply: components["schemas"]["ImageOutput"]; + random_range: components["schemas"]["IntegerCollectionOutput"]; + noise: components["schemas"]["NoiseOutput"]; + sdxl_refiner_model_loader: components["schemas"]["SDXLRefinerModelLoaderOutput"]; + rectangle_mask: components["schemas"]["MaskOutput"]; + invert_tensor_mask: components["schemas"]["MaskOutput"]; + core_metadata: components["schemas"]["MetadataOutput"]; + img_chan: components["schemas"]["ImageOutput"]; + depth_anything_image_processor: components["schemas"]["ImageOutput"]; + step_param_easing: components["schemas"]["FloatCollectionOutput"]; + infill_lama: components["schemas"]["ImageOutput"]; + calculate_image_tiles: components["schemas"]["CalculateImageTilesOutput"]; + float_math: components["schemas"]["FloatOutput"]; + lora_loader: components["schemas"]["LoRALoaderOutput"]; + dynamic_prompt: components["schemas"]["StringCollectionOutput"]; + lscale: components["schemas"]["LatentsOutput"]; + sdxl_lora_collection_loader: components["schemas"]["SDXLLoRALoaderOutput"]; + leres_image_processor: components["schemas"]["ImageOutput"]; + i2l: components["schemas"]["LatentsOutput"]; + sdxl_model_loader: components["schemas"]["SDXLModelLoaderOutput"]; + infill_rgba: components["schemas"]["ImageOutput"]; + range_of_size: components["schemas"]["IntegerCollectionOutput"]; + lora_collection_loader: components["schemas"]["LoRALoaderOutput"]; + rand_float: components["schemas"]["FloatOutput"]; + spandrel_image_to_image_autoscale: components["schemas"]["ImageOutput"]; + heuristic_resize: components["schemas"]["ImageOutput"]; + div: components["schemas"]["IntegerOutput"]; + save_image: components["schemas"]["ImageOutput"]; + midas_depth_image_processor: components["schemas"]["ImageOutput"]; + integer_math: components["schemas"]["IntegerOutput"]; + collect: components["schemas"]["CollectInvocationOutput"]; + alpha_mask_to_tensor: components["schemas"]["MaskOutput"]; + blank_image: components["schemas"]["ImageOutput"]; + string_join: components["schemas"]["StringOutput"]; + pair_tile_image: components["schemas"]["PairTileImageOutput"]; + hed_image_processor: components["schemas"]["ImageOutput"]; + img_nsfw: components["schemas"]["ImageOutput"]; + conditioning_collection: components["schemas"]["ConditioningCollectionOutput"]; + img_blur: components["schemas"]["ImageOutput"]; + model_identifier: components["schemas"]["ModelIdentifierOutput"]; + clip_skip: components["schemas"]["CLIPSkipInvocationOutput"]; + sdxl_compel_prompt: components["schemas"]["ConditioningOutput"]; + infill_patchmatch: components["schemas"]["ImageOutput"]; + metadata: components["schemas"]["MetadataOutput"]; + img_crop: components["schemas"]["ImageOutput"]; + tensor_mask_to_image: components["schemas"]["ImageOutput"]; + show_image: components["schemas"]["ImageOutput"]; + canny_image_processor: components["schemas"]["ImageOutput"]; + esrgan: components["schemas"]["ImageOutput"]; + prompt_from_file: components["schemas"]["StringCollectionOutput"]; + image_collection: components["schemas"]["ImageCollectionOutput"]; + calculate_image_tiles_even_split: components["schemas"]["CalculateImageTilesOutput"]; + img_pad_crop: components["schemas"]["ImageOutput"]; + l2i: components["schemas"]["ImageOutput"]; + sdxl_lora_loader: components["schemas"]["SDXLLoRALoaderOutput"]; + range: components["schemas"]["IntegerCollectionOutput"]; + scheduler: components["schemas"]["SchedulerOutput"]; + lineart_image_processor: components["schemas"]["ImageOutput"]; + content_shuffle_image_processor: components["schemas"]["ImageOutput"]; + create_gradient_mask: components["schemas"]["GradientMaskOutput"]; + ip_adapter: components["schemas"]["IPAdapterOutput"]; + color_map_image_processor: components["schemas"]["ImageOutput"]; + string_join_three: components["schemas"]["StringOutput"]; + infill_cv2: components["schemas"]["ImageOutput"]; + mlsd_image_processor: components["schemas"]["ImageOutput"]; + segment_anything_processor: components["schemas"]["ImageOutput"]; + img_mul: components["schemas"]["ImageOutput"]; + conditioning: components["schemas"]["ConditioningOutput"]; + cv_inpaint: components["schemas"]["ImageOutput"]; + t2i_adapter: components["schemas"]["T2IAdapterOutput"]; + add: components["schemas"]["IntegerOutput"]; + crop_latents: components["schemas"]["LatentsOutput"]; + infill_tile: components["schemas"]["ImageOutput"]; + latents: components["schemas"]["LatentsOutput"]; + img_resize: components["schemas"]["ImageOutput"]; + create_denoise_mask: components["schemas"]["DenoiseMaskOutput"]; + img_conv: components["schemas"]["ImageOutput"]; + grounding_dino: components["schemas"]["BoundingBoxCollectionOutput"]; + zoe_depth_image_processor: components["schemas"]["ImageOutput"]; + vae_loader: components["schemas"]["VAEOutput"]; }; /** * InvocationStartedEvent @@ -10569,6 +10569,11 @@ export type components = { */ negative_prompt: string; }; + /** + * PresetType + * @enum {string} + */ + PresetType: "user" | "default" | "project"; /** * ProgressImage * @description The progress image sent intermittently during processing @@ -12977,16 +12982,16 @@ export type components = { name: string; /** @description The preset data */ preset_data: components["schemas"]["PresetData"]; + /** + * @description The type of style preset + * @default user + */ + type?: components["schemas"]["PresetType"]; /** * Id * @description The style preset ID. */ id: string; - /** - * Is Default - * @description Whether or not the style preset is default - */ - is_default: boolean; /** * Image * @description The path for image