diff --git a/invokeai/app/api/routers/app_info.py b/invokeai/app/api/routers/app_info.py index 1d68bcc3b8..ef1932c22c 100644 --- a/invokeai/app/api/routers/app_info.py +++ b/invokeai/app/api/routers/app_info.py @@ -12,12 +12,12 @@ from pydantic import BaseModel, Field from invokeai.app.api.dependencies import ApiDependencies from invokeai.app.services.config.config_default import ( - DefaultInvokeAIAppConfig, EXTERNAL_PROVIDER_CONFIG_FIELDS, + DefaultInvokeAIAppConfig, InvokeAIAppConfig, get_config, - load_external_api_keys, load_and_migrate_config, + load_external_api_keys, ) from invokeai.app.services.external_generation.external_generation_common import ExternalProviderStatus from invokeai.app.services.invocation_cache.invocation_cache_common import InvocationCacheStatus diff --git a/invokeai/app/services/external_generation/__init__.py b/invokeai/app/services/external_generation/__init__.py index 692da64643..b933811d29 100644 --- a/invokeai/app/services/external_generation/__init__.py +++ b/invokeai/app/services/external_generation/__init__.py @@ -3,9 +3,9 @@ from invokeai.app.services.external_generation.external_generation_base import ( ExternalProvider, ) from invokeai.app.services.external_generation.external_generation_common import ( + ExternalGeneratedImage, ExternalGenerationRequest, ExternalGenerationResult, - ExternalGeneratedImage, ExternalProviderStatus, ExternalReferenceImage, ) diff --git a/invokeai/app/services/external_generation/providers/gemini.py b/invokeai/app/services/external_generation/providers/gemini.py index 7f289cced7..70cf6a0965 100644 --- a/invokeai/app/services/external_generation/providers/gemini.py +++ b/invokeai/app/services/external_generation/providers/gemini.py @@ -6,7 +6,10 @@ import uuid import requests from PIL.Image import Image as PILImageType -from invokeai.app.services.external_generation.errors import ExternalProviderRateLimitError, ExternalProviderRequestError +from invokeai.app.services.external_generation.errors import ( + ExternalProviderRateLimitError, + ExternalProviderRequestError, +) from invokeai.app.services.external_generation.external_generation_base import ExternalProvider from invokeai.app.services.external_generation.external_generation_common import ( ExternalGeneratedImage, diff --git a/invokeai/app/services/external_generation/providers/openai.py b/invokeai/app/services/external_generation/providers/openai.py index 5051cf9cf1..033f6cd4a6 100644 --- a/invokeai/app/services/external_generation/providers/openai.py +++ b/invokeai/app/services/external_generation/providers/openai.py @@ -5,7 +5,10 @@ import io import requests from PIL.Image import Image as PILImageType -from invokeai.app.services.external_generation.errors import ExternalProviderRateLimitError, ExternalProviderRequestError +from invokeai.app.services.external_generation.errors import ( + ExternalProviderRateLimitError, + ExternalProviderRequestError, +) from invokeai.app.services.external_generation.external_generation_base import ExternalProvider from invokeai.app.services.external_generation.external_generation_common import ( ExternalGeneratedImage, diff --git a/invokeai/backend/image_util/controlnet_processor.py b/invokeai/backend/image_util/controlnet_processor.py index 87739f69e1..81eed42097 100644 --- a/invokeai/backend/image_util/controlnet_processor.py +++ b/invokeai/backend/image_util/controlnet_processor.py @@ -14,43 +14,61 @@ def _get_processor_invocation_class(processor_type: str): """Get the invocation class for a processor type.""" # Import processor invocation classes on demand processor_class_map = { - "canny_image_processor": lambda: __import__( - "invokeai.app.invocations.canny", fromlist=["CannyEdgeDetectionInvocation"] - ).CannyEdgeDetectionInvocation, - "hed_image_processor": lambda: __import__( - "invokeai.app.invocations.hed", fromlist=["HEDEdgeDetectionInvocation"] - ).HEDEdgeDetectionInvocation, - "mlsd_image_processor": lambda: __import__( - "invokeai.app.invocations.mlsd", fromlist=["MLSDDetectionInvocation"] - ).MLSDDetectionInvocation, - "depth_anything_image_processor": lambda: __import__( - "invokeai.app.invocations.depth_anything", fromlist=["DepthAnythingDepthEstimationInvocation"] - ).DepthAnythingDepthEstimationInvocation, - "normalbae_image_processor": lambda: __import__( - "invokeai.app.invocations.normal_bae", fromlist=["NormalMapInvocation"] - ).NormalMapInvocation, - "pidi_image_processor": lambda: __import__( - "invokeai.app.invocations.pidi", fromlist=["PiDiNetEdgeDetectionInvocation"] - ).PiDiNetEdgeDetectionInvocation, - "lineart_image_processor": lambda: __import__( - "invokeai.app.invocations.lineart", fromlist=["LineartEdgeDetectionInvocation"] - ).LineartEdgeDetectionInvocation, - "lineart_anime_image_processor": lambda: __import__( - "invokeai.app.invocations.lineart_anime", fromlist=["LineartAnimeEdgeDetectionInvocation"] - ).LineartAnimeEdgeDetectionInvocation, - "content_shuffle_image_processor": lambda: __import__( - "invokeai.app.invocations.content_shuffle", fromlist=["ContentShuffleInvocation"] - ).ContentShuffleInvocation, - "dw_openpose_image_processor": lambda: __import__( - "invokeai.app.invocations.dw_openpose", fromlist=["DWOpenposeDetectionInvocation"] - ).DWOpenposeDetectionInvocation, - "mediapipe_face_processor": lambda: __import__( - "invokeai.app.invocations.mediapipe_face", fromlist=["MediaPipeFaceDetectionInvocation"] - ).MediaPipeFaceDetectionInvocation, + "canny_image_processor": lambda: ( + __import__( + "invokeai.app.invocations.canny", fromlist=["CannyEdgeDetectionInvocation"] + ).CannyEdgeDetectionInvocation + ), + "hed_image_processor": lambda: ( + __import__( + "invokeai.app.invocations.hed", fromlist=["HEDEdgeDetectionInvocation"] + ).HEDEdgeDetectionInvocation + ), + "mlsd_image_processor": lambda: ( + __import__("invokeai.app.invocations.mlsd", fromlist=["MLSDDetectionInvocation"]).MLSDDetectionInvocation + ), + "depth_anything_image_processor": lambda: ( + __import__( + "invokeai.app.invocations.depth_anything", fromlist=["DepthAnythingDepthEstimationInvocation"] + ).DepthAnythingDepthEstimationInvocation + ), + "normalbae_image_processor": lambda: ( + __import__("invokeai.app.invocations.normal_bae", fromlist=["NormalMapInvocation"]).NormalMapInvocation + ), + "pidi_image_processor": lambda: ( + __import__( + "invokeai.app.invocations.pidi", fromlist=["PiDiNetEdgeDetectionInvocation"] + ).PiDiNetEdgeDetectionInvocation + ), + "lineart_image_processor": lambda: ( + __import__( + "invokeai.app.invocations.lineart", fromlist=["LineartEdgeDetectionInvocation"] + ).LineartEdgeDetectionInvocation + ), + "lineart_anime_image_processor": lambda: ( + __import__( + "invokeai.app.invocations.lineart_anime", fromlist=["LineartAnimeEdgeDetectionInvocation"] + ).LineartAnimeEdgeDetectionInvocation + ), + "content_shuffle_image_processor": lambda: ( + __import__( + "invokeai.app.invocations.content_shuffle", fromlist=["ContentShuffleInvocation"] + ).ContentShuffleInvocation + ), + "dw_openpose_image_processor": lambda: ( + __import__( + "invokeai.app.invocations.dw_openpose", fromlist=["DWOpenposeDetectionInvocation"] + ).DWOpenposeDetectionInvocation + ), + "mediapipe_face_processor": lambda: ( + __import__( + "invokeai.app.invocations.mediapipe_face", fromlist=["MediaPipeFaceDetectionInvocation"] + ).MediaPipeFaceDetectionInvocation + ), # Note: zoe_depth_image_processor doesn't have a processor invocation implementation - "color_map_image_processor": lambda: __import__( - "invokeai.app.invocations.color_map", fromlist=["ColorMapInvocation"] - ).ColorMapInvocation, + "color_map_image_processor": lambda: ( + __import__("invokeai.app.invocations.color_map", fromlist=["ColorMapInvocation"]).ColorMapInvocation + ), } if processor_type in processor_class_map: diff --git a/invokeai/backend/model_manager/starter_models.py b/invokeai/backend/model_manager/starter_models.py index f047dc48e8..7fe50d91fc 100644 --- a/invokeai/backend/model_manager/starter_models.py +++ b/invokeai/backend/model_manager/starter_models.py @@ -939,9 +939,7 @@ gemini_flash_image = StarterModel( format=ModelFormat.ExternalApi, capabilities=ExternalModelCapabilities( modes=["txt2img", "img2img", "inpaint"], - supports_seed=True, - supports_reference_images=True, max_images_per_request=1, allowed_aspect_ratios=[ @@ -981,9 +979,7 @@ gemini_pro_image_preview = StarterModel( format=ModelFormat.ExternalApi, capabilities=ExternalModelCapabilities( modes=["txt2img", "img2img", "inpaint"], - supports_seed=True, - supports_reference_images=True, max_reference_images=14, max_images_per_request=1, @@ -1003,9 +999,7 @@ gemini_3_1_flash_image_preview = StarterModel( format=ModelFormat.ExternalApi, capabilities=ExternalModelCapabilities( modes=["txt2img", "img2img", "inpaint"], - supports_seed=True, - supports_reference_images=True, max_reference_images=14, max_images_per_request=1, diff --git a/tests/app/services/external_generation/test_external_generation_service.py b/tests/app/services/external_generation/test_external_generation_service.py index 927f60b6ee..89c1a6db31 100644 --- a/tests/app/services/external_generation/test_external_generation_service.py +++ b/tests/app/services/external_generation/test_external_generation_service.py @@ -3,19 +3,19 @@ import logging import pytest from PIL import Image +from invokeai.app.services.config.config_default import InvokeAIAppConfig from invokeai.app.services.external_generation.errors import ( ExternalProviderCapabilityError, ExternalProviderNotConfiguredError, ExternalProviderNotFoundError, ) +from invokeai.app.services.external_generation.external_generation_base import ExternalProvider from invokeai.app.services.external_generation.external_generation_common import ( ExternalGeneratedImage, ExternalGenerationRequest, ExternalGenerationResult, ExternalReferenceImage, ) -from invokeai.app.services.config.config_default import InvokeAIAppConfig -from invokeai.app.services.external_generation.external_generation_base import ExternalProvider from invokeai.app.services.external_generation.external_generation_default import ExternalGenerationService from invokeai.backend.model_manager.configs.external_api import ( ExternalApiModelConfig, @@ -215,9 +215,7 @@ def test_generate_validates_allowed_aspect_ratios_with_bucket_sizes() -> None: def test_generate_happy_path() -> None: - model = _build_model( - ExternalModelCapabilities(modes=["txt2img"], supports_seed=True) - ) + model = _build_model(ExternalModelCapabilities(modes=["txt2img"], supports_seed=True)) request = _build_request(model=model, seed=42) result = ExternalGenerationResult(images=[ExternalGeneratedImage(image=_make_image(), seed=42)]) provider = DummyProvider("openai", configured=True, result=result) diff --git a/tests/conftest.py b/tests/conftest.py index bfd9f070df..92f42375ed 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -16,8 +16,8 @@ from invokeai.app.services.boards.boards_default import BoardService from invokeai.app.services.bulk_download.bulk_download_default import BulkDownloadService from invokeai.app.services.client_state_persistence.client_state_persistence_sqlite import ClientStatePersistenceSqlite from invokeai.app.services.config.config_default import InvokeAIAppConfig -from invokeai.app.services.image_records.image_records_sqlite import SqliteImageRecordStorage from invokeai.app.services.external_generation.external_generation_default import ExternalGenerationService +from invokeai.app.services.image_records.image_records_sqlite import SqliteImageRecordStorage from invokeai.app.services.images.images_default import ImageService from invokeai.app.services.invocation_cache.invocation_cache_memory import MemoryInvocationCache from invokeai.app.services.invocation_services import InvocationServices