InvokeAI 4.0.1__tar.gz → 4.0.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/InvokeAI.egg-info/PKG-INFO +1 -1
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/InvokeAI.egg-info/SOURCES.txt +8 -6
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/PKG-INFO +1 -1
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/routers/app_info.py +2 -2
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/routers/model_manager.py +2 -17
- InvokeAI-4.0.3/invokeai/app/invocations/infill.py +167 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/ip_adapter.py +45 -25
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/latent.py +3 -12
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/metadata.py +3 -10
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/config/config_default.py +4 -4
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_install/model_install_default.py +4 -2
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_manager/model_manager_default.py +1 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/__init__.py +1 -1
- {InvokeAI-4.0.1/invokeai/backend/image_util → InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods}/lama.py +9 -0
- InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods/mosaic.py +60 -0
- InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods/patchmatch.py +67 -0
- InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods/tile.py +122 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/ip_adapter.py +72 -34
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/resampler.py +24 -16
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/config.py +18 -4
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_cache/model_cache_default.py +16 -5
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/ip_adapter.py +3 -9
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/probe.py +22 -4
- InvokeAI-4.0.3/invokeai/frontend/web/dist/assets/App-BLcNMYZP.js +128 -0
- InvokeAI-4.0.3/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-DKJ1LbAm.js +1 -0
- InvokeAI-4.0.1/invokeai/frontend/web/dist/assets/index-DN8M6F76.js → InvokeAI-4.0.3/invokeai/frontend/web/dist/assets/index-MDF-DOT9.js +63 -63
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/index.html +1 -1
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/de.json +18 -5
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/en.json +9 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/it.json +5 -3
- InvokeAI-4.0.3/invokeai/version/invokeai_version.py +1 -0
- InvokeAI-4.0.1/invokeai/app/invocations/infill.py +0 -248
- InvokeAI-4.0.1/invokeai/backend/image_util/patchmatch.py +0 -49
- InvokeAI-4.0.1/invokeai/frontend/web/dist/assets/App-De5unnxA.js +0 -128
- InvokeAI-4.0.1/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-CX41dakW.js +0 -1
- InvokeAI-4.0.1/invokeai/version/invokeai_version.py +0 -1
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/InvokeAI.egg-info/dependency_links.txt +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/InvokeAI.egg-info/entry_points.txt +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/InvokeAI.egg-info/requires.txt +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/InvokeAI.egg-info/top_level.txt +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/LICENSE +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/LICENSE-SD1+SD2.txt +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/LICENSE-SDXL.txt +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/README.md +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/dependencies.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/events.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/no_cache_staticfiles.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/routers/board_images.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/routers/boards.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/routers/download_queue.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/routers/images.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/routers/session_queue.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/routers/utilities.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/routers/workflows.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/sockets.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api_app.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/assets/images/caution.png +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/baseinvocation.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/collections.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/compel.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/constants.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/controlnet_image_processors.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/custom_nodes/README.md +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/custom_nodes/init.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/cv.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/facetools.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/fields.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/image.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/math.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/model.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/noise.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/param_easing.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/primitives.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/prompt.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/sdxl.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/strings.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/t2i_adapter.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/tiles.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/upscale.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/util.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/run_app.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_image_records/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_image_records/board_image_records_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_image_records/board_image_records_sqlite.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_images/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_images/board_images_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_images/board_images_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_images/board_images_default.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_records/board_records_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_records/board_records_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_records/board_records_sqlite.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/boards/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/boards/boards_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/boards/boards_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/boards/boards_default.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/bulk_download/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/bulk_download/bulk_download_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/bulk_download/bulk_download_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/bulk_download/bulk_download_default.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/config/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/config/config_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/download/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/download/download_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/download/download_default.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/events/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/events/events_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/image_files/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/image_files/image_files_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/image_files/image_files_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/image_files/image_files_disk.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/image_records/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/image_records/image_records_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/image_records/image_records_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/image_records/image_records_sqlite.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/images/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/images/images_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/images/images_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/images/images_default.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invocation_cache/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invocation_cache/invocation_cache_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invocation_cache/invocation_cache_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invocation_cache/invocation_cache_memory.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invocation_services.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invocation_stats/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invocation_stats/invocation_stats_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invocation_stats/invocation_stats_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invocation_stats/invocation_stats_default.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invoker.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/item_storage/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/item_storage/item_storage_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/item_storage/item_storage_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/item_storage/item_storage_memory.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_images/model_images_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_images/model_images_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_images/model_images_default.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_install/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_install/model_install_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_load/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_load/model_load_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_load/model_load_default.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_manager/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_manager/model_manager_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_manager/model_manager_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_records/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_records/model_records_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_records/model_records_sql.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/names/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/names/names_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/names/names_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/names/names_default.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/object_serializer/object_serializer_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/object_serializer/object_serializer_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/object_serializer/object_serializer_disk.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/object_serializer/object_serializer_forward_cache.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/session_processor/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/session_processor/session_processor_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/session_processor/session_processor_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/session_processor/session_processor_default.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/session_queue/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/session_queue/session_queue_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/session_queue/session_queue_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/session_queue/session_queue_sqlite.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/graph.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/invocation_context.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/pagination.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite/sqlite_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite/sqlite_database.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite/sqlite_util.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_1.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_2.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_3.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_4.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_5.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_6.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_7.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_8.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_9.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_impl.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/urls/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/urls/urls_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/urls/urls_default.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/ESRGAN Upscaling with Canny ControlNet.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Face Detailer with IP-Adapter & Canny (See Note in Details).json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Multi ControlNet (Canny & Depth).json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Prompt from File.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Text to Image - SD1.5.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Text to Image - SDXL.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Text to Image with LoRA.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Tiled Upscaling (Beta).json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/workflow_records_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/workflow_records_common.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/workflow_records_sqlite.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/shared/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/shared/models.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/controlnet_utils.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/download_with_progress.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/metaenum.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/misc.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/model_exclude_null.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/profiler.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/step_callback.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/suppress_output.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/thumbnails.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/ti_utils.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/assets/fonts/inter/Inter-Regular.ttf +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/basicsr/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/basicsr/arch_util.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/basicsr/rrdbnet_arch.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/canny.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/depth_anything/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/depth_anything/model/blocks.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/depth_anything/model/dpt.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/depth_anything/utilities/util.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/onnxdet.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/onnxpose.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/utils.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/wholebody.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/hed.py +0 -0
- {InvokeAI-4.0.1/invokeai/backend/image_util → InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods}/cv2_inpaint.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/invisible_watermark.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/lineart.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/lineart_anime.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/pngwriter.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/realesrgan/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/realesrgan/realesrgan.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/safety_checker.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/seamless.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/util.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/attention_processor.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/ip_attention_weights.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/unet_patcher.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/lora.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_hash/model_hash.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/convert_ckpt_to_diffusers.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/libc_util.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/convert_cache/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/convert_cache/convert_cache_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/convert_cache/convert_cache_default.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/load_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/load_default.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/memory_snapshot.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_cache/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_cache/model_cache_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_cache/model_locker.py +1 -1
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loader_registry.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/controlnet.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/generic_diffusers.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/lora.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/onnx.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/stable_diffusion.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/textual_inversion.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/vae.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_util.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/optimizations.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/merge.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/fetch/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/fetch/fetch_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/fetch/huggingface.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/metadata_base.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/search.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/starter_models.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/util/libc_util.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/util/model_util.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/util/select_hf_files.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_patcher.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/onnx/onnx_runtime.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/raw_model.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusers_pipeline.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusion/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusion/conditioning_data.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusion/cross_attention_control.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/schedulers/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/schedulers/schedulers.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/seamless.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/textual_inversion.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/tiles/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/tiles/tiles.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/tiles/utils.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/attention.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/db_maintenance.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/devices.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/hotfixes.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/logging.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/mps_fixes.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/silence_warnings.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/test_utils.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/util.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/controlnet/cldm_v15.yaml +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/controlnet/cldm_v21.yaml +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/sd_xl_base.yaml +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/sd_xl_refiner.yaml +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-finetune.yaml +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-finetune_style.yaml +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-inference-v.yaml +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-inference.yaml +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-inpainting-inference.yaml +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-m1-finetune.yaml +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-inference-v.yaml +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-inference.yaml +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-inpainting-inference-v.yaml +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-inpainting-inference.yaml +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-midas-inference.yaml +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/cli/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/cli/arg_parser.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/install/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/install/import_images.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/App-DI6oCUg0.css +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-Bsx7ESc2.css +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-avatar-circle.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-avatar-square.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-favicon.png +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-favicon.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-key-char-lrg.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-key-char-sml.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-key-wht-lrg.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-key-wht-sml.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-char-lrg.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-char-sml.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-wht-lrg.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-wht-sml.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-ylw-lrg.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-tag-char-lrg.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-tag-char-sml.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-tag-lrg.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-tag-sml.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-wordmark-charcoal.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-wordmark-white.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/mask.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-cyrillic-ext-wght-normal-DIEz8p5i.woff2 +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-cyrillic-wght-normal-BmJJXa8e.woff2 +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-greek-ext-wght-normal-D5AYLNiq.woff2 +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-greek-wght-normal-DyIDNIyN.woff2 +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-latin-ext-wght-normal-CN1pIXkb.woff2 +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-latin-wght-normal-BgVq2Tq4.woff2 +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-vietnamese-wght-normal-_GQuwPVU.woff2 +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ar.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/az.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/bg.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/es.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/fi.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/fr.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/he.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/hu.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ja.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ko.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/mn.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/nl.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/pl.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/pt.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/pt_BR.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ro.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ru.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/sv.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/tr.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/uk.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/vi.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/zh_CN.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/zh_Hant.json +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/scripts/clean_translations.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/static/docs/invoke-favicon-docs.svg +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/invocation_api/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/version/__init__.py +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/pyproject.toml +0 -0
- {InvokeAI-4.0.1 → InvokeAI-4.0.3}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: InvokeAI
|
|
3
|
-
Version: 4.0.
|
|
3
|
+
Version: 4.0.3
|
|
4
4
|
Summary: An implementation of Stable Diffusion which provides various new features and options to aid the image generation process
|
|
5
5
|
Author-email: The InvokeAI Project <lincoln.stein@gmail.com>
|
|
6
6
|
License: Apache License
|
|
@@ -196,13 +196,10 @@ invokeai/backend/raw_model.py
|
|
|
196
196
|
invokeai/backend/textual_inversion.py
|
|
197
197
|
invokeai/backend/image_util/__init__.py
|
|
198
198
|
invokeai/backend/image_util/canny.py
|
|
199
|
-
invokeai/backend/image_util/cv2_inpaint.py
|
|
200
199
|
invokeai/backend/image_util/hed.py
|
|
201
200
|
invokeai/backend/image_util/invisible_watermark.py
|
|
202
|
-
invokeai/backend/image_util/lama.py
|
|
203
201
|
invokeai/backend/image_util/lineart.py
|
|
204
202
|
invokeai/backend/image_util/lineart_anime.py
|
|
205
|
-
invokeai/backend/image_util/patchmatch.py
|
|
206
203
|
invokeai/backend/image_util/pngwriter.py
|
|
207
204
|
invokeai/backend/image_util/safety_checker.py
|
|
208
205
|
invokeai/backend/image_util/seamless.py
|
|
@@ -219,6 +216,11 @@ invokeai/backend/image_util/dw_openpose/onnxdet.py
|
|
|
219
216
|
invokeai/backend/image_util/dw_openpose/onnxpose.py
|
|
220
217
|
invokeai/backend/image_util/dw_openpose/utils.py
|
|
221
218
|
invokeai/backend/image_util/dw_openpose/wholebody.py
|
|
219
|
+
invokeai/backend/image_util/infill_methods/cv2_inpaint.py
|
|
220
|
+
invokeai/backend/image_util/infill_methods/lama.py
|
|
221
|
+
invokeai/backend/image_util/infill_methods/mosaic.py
|
|
222
|
+
invokeai/backend/image_util/infill_methods/patchmatch.py
|
|
223
|
+
invokeai/backend/image_util/infill_methods/tile.py
|
|
222
224
|
invokeai/backend/image_util/realesrgan/__init__.py
|
|
223
225
|
invokeai/backend/image_util/realesrgan/realesrgan.py
|
|
224
226
|
invokeai/backend/ip_adapter/__init__.py
|
|
@@ -312,11 +314,11 @@ invokeai/frontend/install/__init__.py
|
|
|
312
314
|
invokeai/frontend/install/import_images.py
|
|
313
315
|
invokeai/frontend/web/__init__.py
|
|
314
316
|
invokeai/frontend/web/dist/index.html
|
|
317
|
+
invokeai/frontend/web/dist/assets/App-BLcNMYZP.js
|
|
315
318
|
invokeai/frontend/web/dist/assets/App-DI6oCUg0.css
|
|
316
|
-
invokeai/frontend/web/dist/assets/App-De5unnxA.js
|
|
317
319
|
invokeai/frontend/web/dist/assets/ThemeLocaleProvider-Bsx7ESc2.css
|
|
318
|
-
invokeai/frontend/web/dist/assets/ThemeLocaleProvider-
|
|
319
|
-
invokeai/frontend/web/dist/assets/index-
|
|
320
|
+
invokeai/frontend/web/dist/assets/ThemeLocaleProvider-DKJ1LbAm.js
|
|
321
|
+
invokeai/frontend/web/dist/assets/index-MDF-DOT9.js
|
|
320
322
|
invokeai/frontend/web/dist/assets/inter-cyrillic-ext-wght-normal-DIEz8p5i.woff2
|
|
321
323
|
invokeai/frontend/web/dist/assets/inter-cyrillic-wght-normal-BmJJXa8e.woff2
|
|
322
324
|
invokeai/frontend/web/dist/assets/inter-greek-ext-wght-normal-D5AYLNiq.woff2
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: InvokeAI
|
|
3
|
-
Version: 4.0.
|
|
3
|
+
Version: 4.0.3
|
|
4
4
|
Summary: An implementation of Stable Diffusion which provides various new features and options to aid the image generation process
|
|
5
5
|
Author-email: The InvokeAI Project <lincoln.stein@gmail.com>
|
|
6
6
|
License: Apache License
|
|
@@ -12,7 +12,7 @@ from pydantic import BaseModel, Field
|
|
|
12
12
|
|
|
13
13
|
from invokeai.app.invocations.upscale import ESRGAN_MODELS
|
|
14
14
|
from invokeai.app.services.invocation_cache.invocation_cache_common import InvocationCacheStatus
|
|
15
|
-
from invokeai.backend.image_util.patchmatch import PatchMatch
|
|
15
|
+
from invokeai.backend.image_util.infill_methods.patchmatch import PatchMatch
|
|
16
16
|
from invokeai.backend.image_util.safety_checker import SafetyChecker
|
|
17
17
|
from invokeai.backend.util.logging import logging
|
|
18
18
|
from invokeai.version import __version__
|
|
@@ -100,7 +100,7 @@ async def get_app_deps() -> AppDependencyVersions:
|
|
|
100
100
|
|
|
101
101
|
@app_router.get("/config", operation_id="get_config", status_code=200, response_model=AppConfig)
|
|
102
102
|
async def get_config() -> AppConfig:
|
|
103
|
-
infill_methods = ["tile", "lama", "cv2"]
|
|
103
|
+
infill_methods = ["tile", "lama", "cv2", "color"] # TODO: add mosaic back
|
|
104
104
|
if PatchMatch.patchmatch_available():
|
|
105
105
|
infill_methods.append("patchmatch")
|
|
106
106
|
|
|
@@ -219,28 +219,13 @@ async def scan_for_models(
|
|
|
219
219
|
non_core_model_paths = [p for p in found_model_paths if not p.is_relative_to(core_models_path)]
|
|
220
220
|
|
|
221
221
|
installed_models = ApiDependencies.invoker.services.model_manager.store.search_by_attr()
|
|
222
|
-
resolved_installed_model_paths: list[str] = []
|
|
223
|
-
installed_model_sources: list[str] = []
|
|
224
|
-
|
|
225
|
-
# This call lists all installed models.
|
|
226
|
-
for model in installed_models:
|
|
227
|
-
path = pathlib.Path(model.path)
|
|
228
|
-
# If the model has a source, we need to add it to the list of installed sources.
|
|
229
|
-
if model.source:
|
|
230
|
-
installed_model_sources.append(model.source)
|
|
231
|
-
# If the path is not absolute, that means it is in the app models directory, and we need to join it with
|
|
232
|
-
# the models path before resolving.
|
|
233
|
-
if not path.is_absolute():
|
|
234
|
-
resolved_installed_model_paths.append(str(pathlib.Path(models_path, path).resolve()))
|
|
235
|
-
continue
|
|
236
|
-
resolved_installed_model_paths.append(str(path.resolve()))
|
|
237
222
|
|
|
238
223
|
scan_results: list[FoundModel] = []
|
|
239
224
|
|
|
240
|
-
# Check if the model is installed by comparing
|
|
225
|
+
# Check if the model is installed by comparing paths, appending to the scan result.
|
|
241
226
|
for p in non_core_model_paths:
|
|
242
227
|
path = str(p)
|
|
243
|
-
is_installed =
|
|
228
|
+
is_installed = any(str(models_path / m.path) == path for m in installed_models)
|
|
244
229
|
found_model = FoundModel(path=path, is_installed=is_installed)
|
|
245
230
|
scan_results.append(found_model)
|
|
246
231
|
except Exception as e:
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
from abc import abstractmethod
|
|
2
|
+
from typing import Literal, get_args
|
|
3
|
+
|
|
4
|
+
from PIL import Image
|
|
5
|
+
|
|
6
|
+
from invokeai.app.invocations.fields import ColorField, ImageField
|
|
7
|
+
from invokeai.app.invocations.primitives import ImageOutput
|
|
8
|
+
from invokeai.app.services.shared.invocation_context import InvocationContext
|
|
9
|
+
from invokeai.app.util.misc import SEED_MAX
|
|
10
|
+
from invokeai.backend.image_util.infill_methods.cv2_inpaint import cv2_inpaint
|
|
11
|
+
from invokeai.backend.image_util.infill_methods.lama import LaMA
|
|
12
|
+
from invokeai.backend.image_util.infill_methods.mosaic import infill_mosaic
|
|
13
|
+
from invokeai.backend.image_util.infill_methods.patchmatch import PatchMatch, infill_patchmatch
|
|
14
|
+
from invokeai.backend.image_util.infill_methods.tile import infill_tile
|
|
15
|
+
from invokeai.backend.util.logging import InvokeAILogger
|
|
16
|
+
|
|
17
|
+
from .baseinvocation import BaseInvocation, invocation
|
|
18
|
+
from .fields import InputField, WithBoard, WithMetadata
|
|
19
|
+
from .image import PIL_RESAMPLING_MAP, PIL_RESAMPLING_MODES
|
|
20
|
+
|
|
21
|
+
logger = InvokeAILogger.get_logger()
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def get_infill_methods():
|
|
25
|
+
methods = Literal["tile", "color", "lama", "cv2"] # TODO: add mosaic back
|
|
26
|
+
if PatchMatch.patchmatch_available():
|
|
27
|
+
methods = Literal["patchmatch", "tile", "color", "lama", "cv2"] # TODO: add mosaic back
|
|
28
|
+
return methods
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
INFILL_METHODS = get_infill_methods()
|
|
32
|
+
DEFAULT_INFILL_METHOD = "patchmatch" if "patchmatch" in get_args(INFILL_METHODS) else "tile"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class InfillImageProcessorInvocation(BaseInvocation, WithMetadata, WithBoard):
|
|
36
|
+
"""Base class for invocations that preprocess images for Infilling"""
|
|
37
|
+
|
|
38
|
+
image: ImageField = InputField(description="The image to process")
|
|
39
|
+
|
|
40
|
+
@abstractmethod
|
|
41
|
+
def infill(self, image: Image.Image) -> Image.Image:
|
|
42
|
+
"""Infill the image with the specified method"""
|
|
43
|
+
pass
|
|
44
|
+
|
|
45
|
+
def load_image(self, context: InvocationContext) -> tuple[Image.Image, bool]:
|
|
46
|
+
"""Process the image to have an alpha channel before being infilled"""
|
|
47
|
+
image = context.images.get_pil(self.image.image_name)
|
|
48
|
+
has_alpha = True if image.mode == "RGBA" else False
|
|
49
|
+
return image, has_alpha
|
|
50
|
+
|
|
51
|
+
def invoke(self, context: InvocationContext) -> ImageOutput:
|
|
52
|
+
# Retrieve and process image to be infilled
|
|
53
|
+
input_image, has_alpha = self.load_image(context)
|
|
54
|
+
|
|
55
|
+
# If the input image has no alpha channel, return it
|
|
56
|
+
if has_alpha is False:
|
|
57
|
+
return ImageOutput.build(context.images.get_dto(self.image.image_name))
|
|
58
|
+
|
|
59
|
+
# Perform Infill action
|
|
60
|
+
infilled_image = self.infill(input_image)
|
|
61
|
+
|
|
62
|
+
# Create ImageDTO for Infilled Image
|
|
63
|
+
infilled_image_dto = context.images.save(image=infilled_image)
|
|
64
|
+
|
|
65
|
+
# Return Infilled Image
|
|
66
|
+
return ImageOutput.build(infilled_image_dto)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@invocation("infill_rgba", title="Solid Color Infill", tags=["image", "inpaint"], category="inpaint", version="1.2.2")
|
|
70
|
+
class InfillColorInvocation(InfillImageProcessorInvocation):
|
|
71
|
+
"""Infills transparent areas of an image with a solid color"""
|
|
72
|
+
|
|
73
|
+
color: ColorField = InputField(
|
|
74
|
+
default=ColorField(r=127, g=127, b=127, a=255),
|
|
75
|
+
description="The color to use to infill",
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
def infill(self, image: Image.Image):
|
|
79
|
+
solid_bg = Image.new("RGBA", image.size, self.color.tuple())
|
|
80
|
+
infilled = Image.alpha_composite(solid_bg, image.convert("RGBA"))
|
|
81
|
+
infilled.paste(image, (0, 0), image.split()[-1])
|
|
82
|
+
return infilled
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
@invocation("infill_tile", title="Tile Infill", tags=["image", "inpaint"], category="inpaint", version="1.2.3")
|
|
86
|
+
class InfillTileInvocation(InfillImageProcessorInvocation):
|
|
87
|
+
"""Infills transparent areas of an image with tiles of the image"""
|
|
88
|
+
|
|
89
|
+
tile_size: int = InputField(default=32, ge=1, description="The tile size (px)")
|
|
90
|
+
seed: int = InputField(
|
|
91
|
+
default=0,
|
|
92
|
+
ge=0,
|
|
93
|
+
le=SEED_MAX,
|
|
94
|
+
description="The seed to use for tile generation (omit for random)",
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
def infill(self, image: Image.Image):
|
|
98
|
+
output = infill_tile(image, seed=self.seed, tile_size=self.tile_size)
|
|
99
|
+
return output.infilled
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
@invocation(
|
|
103
|
+
"infill_patchmatch", title="PatchMatch Infill", tags=["image", "inpaint"], category="inpaint", version="1.2.2"
|
|
104
|
+
)
|
|
105
|
+
class InfillPatchMatchInvocation(InfillImageProcessorInvocation):
|
|
106
|
+
"""Infills transparent areas of an image using the PatchMatch algorithm"""
|
|
107
|
+
|
|
108
|
+
downscale: float = InputField(default=2.0, gt=0, description="Run patchmatch on downscaled image to speedup infill")
|
|
109
|
+
resample_mode: PIL_RESAMPLING_MODES = InputField(default="bicubic", description="The resampling mode")
|
|
110
|
+
|
|
111
|
+
def infill(self, image: Image.Image):
|
|
112
|
+
resample_mode = PIL_RESAMPLING_MAP[self.resample_mode]
|
|
113
|
+
|
|
114
|
+
width = int(image.width / self.downscale)
|
|
115
|
+
height = int(image.height / self.downscale)
|
|
116
|
+
|
|
117
|
+
infilled = image.resize(
|
|
118
|
+
(width, height),
|
|
119
|
+
resample=resample_mode,
|
|
120
|
+
)
|
|
121
|
+
infilled = infill_patchmatch(image)
|
|
122
|
+
infilled = infilled.resize(
|
|
123
|
+
(image.width, image.height),
|
|
124
|
+
resample=resample_mode,
|
|
125
|
+
)
|
|
126
|
+
infilled.paste(image, (0, 0), mask=image.split()[-1])
|
|
127
|
+
|
|
128
|
+
return infilled
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
@invocation("infill_lama", title="LaMa Infill", tags=["image", "inpaint"], category="inpaint", version="1.2.2")
|
|
132
|
+
class LaMaInfillInvocation(InfillImageProcessorInvocation):
|
|
133
|
+
"""Infills transparent areas of an image using the LaMa model"""
|
|
134
|
+
|
|
135
|
+
def infill(self, image: Image.Image):
|
|
136
|
+
lama = LaMA()
|
|
137
|
+
return lama(image)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
@invocation("infill_cv2", title="CV2 Infill", tags=["image", "inpaint"], category="inpaint", version="1.2.2")
|
|
141
|
+
class CV2InfillInvocation(InfillImageProcessorInvocation):
|
|
142
|
+
"""Infills transparent areas of an image using OpenCV Inpainting"""
|
|
143
|
+
|
|
144
|
+
def infill(self, image: Image.Image):
|
|
145
|
+
return cv2_inpaint(image)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
# @invocation(
|
|
149
|
+
# "infill_mosaic", title="Mosaic Infill", tags=["image", "inpaint", "outpaint"], category="inpaint", version="1.0.0"
|
|
150
|
+
# )
|
|
151
|
+
class MosaicInfillInvocation(InfillImageProcessorInvocation):
|
|
152
|
+
"""Infills transparent areas of an image with a mosaic pattern drawing colors from the rest of the image"""
|
|
153
|
+
|
|
154
|
+
image: ImageField = InputField(description="The image to infill")
|
|
155
|
+
tile_width: int = InputField(default=64, description="Width of the tile")
|
|
156
|
+
tile_height: int = InputField(default=64, description="Height of the tile")
|
|
157
|
+
min_color: ColorField = InputField(
|
|
158
|
+
default=ColorField(r=0, g=0, b=0, a=255),
|
|
159
|
+
description="The min threshold for color",
|
|
160
|
+
)
|
|
161
|
+
max_color: ColorField = InputField(
|
|
162
|
+
default=ColorField(r=255, g=255, b=255, a=255),
|
|
163
|
+
description="The max threshold for color",
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
def infill(self, image: Image.Image):
|
|
167
|
+
return infill_mosaic(image, (self.tile_width, self.tile_height), self.min_color.tuple(), self.max_color.tuple())
|
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
from builtins import float
|
|
2
|
-
from typing import List, Union
|
|
2
|
+
from typing import List, Literal, Union
|
|
3
3
|
|
|
4
4
|
from pydantic import BaseModel, Field, field_validator, model_validator
|
|
5
5
|
from typing_extensions import Self
|
|
6
6
|
|
|
7
|
-
from invokeai.app.invocations.baseinvocation import
|
|
8
|
-
BaseInvocation,
|
|
9
|
-
BaseInvocationOutput,
|
|
10
|
-
invocation,
|
|
11
|
-
invocation_output,
|
|
12
|
-
)
|
|
7
|
+
from invokeai.app.invocations.baseinvocation import BaseInvocation, BaseInvocationOutput, invocation, invocation_output
|
|
13
8
|
from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField, UIType
|
|
14
9
|
from invokeai.app.invocations.model import ModelIdentifierField
|
|
15
10
|
from invokeai.app.invocations.primitives import ImageField
|
|
16
11
|
from invokeai.app.invocations.util import validate_begin_end_step, validate_weights
|
|
17
12
|
from invokeai.app.services.shared.invocation_context import InvocationContext
|
|
18
|
-
from invokeai.backend.model_manager.config import
|
|
13
|
+
from invokeai.backend.model_manager.config import (
|
|
14
|
+
AnyModelConfig,
|
|
15
|
+
BaseModelType,
|
|
16
|
+
IPAdapterCheckpointConfig,
|
|
17
|
+
IPAdapterInvokeAIConfig,
|
|
18
|
+
ModelType,
|
|
19
|
+
)
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
class IPAdapterField(BaseModel):
|
|
@@ -48,12 +49,15 @@ class IPAdapterOutput(BaseInvocationOutput):
|
|
|
48
49
|
ip_adapter: IPAdapterField = OutputField(description=FieldDescriptions.ip_adapter, title="IP-Adapter")
|
|
49
50
|
|
|
50
51
|
|
|
52
|
+
CLIP_VISION_MODEL_MAP = {"ViT-H": "ip_adapter_sd_image_encoder", "ViT-G": "ip_adapter_sdxl_image_encoder"}
|
|
53
|
+
|
|
54
|
+
|
|
51
55
|
@invocation("ip_adapter", title="IP-Adapter", tags=["ip_adapter", "control"], category="ip_adapter", version="1.2.2")
|
|
52
56
|
class IPAdapterInvocation(BaseInvocation):
|
|
53
57
|
"""Collects IP-Adapter info to pass to other nodes."""
|
|
54
58
|
|
|
55
59
|
# Inputs
|
|
56
|
-
image: Union[ImageField, List[ImageField]] = InputField(description="The IP-Adapter image prompt(s).")
|
|
60
|
+
image: Union[ImageField, List[ImageField]] = InputField(description="The IP-Adapter image prompt(s).", ui_order=1)
|
|
57
61
|
ip_adapter_model: ModelIdentifierField = InputField(
|
|
58
62
|
description="The IP-Adapter model.",
|
|
59
63
|
title="IP-Adapter Model",
|
|
@@ -61,7 +65,11 @@ class IPAdapterInvocation(BaseInvocation):
|
|
|
61
65
|
ui_order=-1,
|
|
62
66
|
ui_type=UIType.IPAdapterModel,
|
|
63
67
|
)
|
|
64
|
-
|
|
68
|
+
clip_vision_model: Literal["ViT-H", "ViT-G"] = InputField(
|
|
69
|
+
description="CLIP Vision model to use. Overrides model settings. Mandatory for checkpoint models.",
|
|
70
|
+
default="auto",
|
|
71
|
+
ui_order=2,
|
|
72
|
+
)
|
|
65
73
|
weight: Union[float, List[float]] = InputField(
|
|
66
74
|
default=1, description="The weight given to the IP-Adapter", title="Weight"
|
|
67
75
|
)
|
|
@@ -86,10 +94,16 @@ class IPAdapterInvocation(BaseInvocation):
|
|
|
86
94
|
def invoke(self, context: InvocationContext) -> IPAdapterOutput:
|
|
87
95
|
# Lookup the CLIP Vision encoder that is intended to be used with the IP-Adapter model.
|
|
88
96
|
ip_adapter_info = context.models.get_config(self.ip_adapter_model.key)
|
|
89
|
-
assert isinstance(ip_adapter_info,
|
|
90
|
-
|
|
91
|
-
|
|
97
|
+
assert isinstance(ip_adapter_info, (IPAdapterInvokeAIConfig, IPAdapterCheckpointConfig))
|
|
98
|
+
|
|
99
|
+
if isinstance(ip_adapter_info, IPAdapterInvokeAIConfig):
|
|
100
|
+
image_encoder_model_id = ip_adapter_info.image_encoder_model_id
|
|
101
|
+
image_encoder_model_name = image_encoder_model_id.split("/")[-1].strip()
|
|
102
|
+
else:
|
|
103
|
+
image_encoder_model_name = CLIP_VISION_MODEL_MAP[self.clip_vision_model]
|
|
104
|
+
|
|
92
105
|
image_encoder_model = self._get_image_encoder(context, image_encoder_model_name)
|
|
106
|
+
|
|
93
107
|
return IPAdapterOutput(
|
|
94
108
|
ip_adapter=IPAdapterField(
|
|
95
109
|
image=self.image,
|
|
@@ -102,19 +116,25 @@ class IPAdapterInvocation(BaseInvocation):
|
|
|
102
116
|
)
|
|
103
117
|
|
|
104
118
|
def _get_image_encoder(self, context: InvocationContext, image_encoder_model_name: str) -> AnyModelConfig:
|
|
105
|
-
|
|
106
|
-
|
|
119
|
+
image_encoder_models = context.models.search_by_attrs(
|
|
120
|
+
name=image_encoder_model_name, base=BaseModelType.Any, type=ModelType.CLIPVision
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
if not len(image_encoder_models) > 0:
|
|
124
|
+
context.logger.warning(
|
|
125
|
+
f"The image encoder required by this IP Adapter ({image_encoder_model_name}) is not installed. \
|
|
126
|
+
Downloading and installing now. This may take a while."
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
installer = context._services.model_manager.install
|
|
130
|
+
job = installer.heuristic_import(f"InvokeAI/{image_encoder_model_name}")
|
|
131
|
+
installer.wait_for_job(job, timeout=600) # Wait for up to 10 minutes
|
|
107
132
|
image_encoder_models = context.models.search_by_attrs(
|
|
108
133
|
name=image_encoder_model_name, base=BaseModelType.Any, type=ModelType.CLIPVision
|
|
109
134
|
)
|
|
110
|
-
|
|
111
|
-
if
|
|
112
|
-
context.logger.
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
context.logger.warning("Downloading and installing now. This may take a while.")
|
|
116
|
-
installer = context._services.model_manager.install
|
|
117
|
-
job = installer.heuristic_import(f"InvokeAI/{image_encoder_model_name}")
|
|
118
|
-
installer.wait_for_job(job, timeout=600) # wait up to 10 minutes - then raise a TimeoutException
|
|
119
|
-
assert len(image_encoder_models) == 1
|
|
135
|
+
|
|
136
|
+
if len(image_encoder_models) == 0:
|
|
137
|
+
context.logger.error("Error while fetching CLIP Vision Image Encoder")
|
|
138
|
+
assert len(image_encoder_models) == 1
|
|
139
|
+
|
|
120
140
|
return image_encoder_models[0]
|
|
@@ -43,11 +43,7 @@ from invokeai.app.invocations.fields import (
|
|
|
43
43
|
WithMetadata,
|
|
44
44
|
)
|
|
45
45
|
from invokeai.app.invocations.ip_adapter import IPAdapterField
|
|
46
|
-
from invokeai.app.invocations.primitives import
|
|
47
|
-
DenoiseMaskOutput,
|
|
48
|
-
ImageOutput,
|
|
49
|
-
LatentsOutput,
|
|
50
|
-
)
|
|
46
|
+
from invokeai.app.invocations.primitives import DenoiseMaskOutput, ImageOutput, LatentsOutput
|
|
51
47
|
from invokeai.app.invocations.t2i_adapter import T2IAdapterField
|
|
52
48
|
from invokeai.app.services.shared.invocation_context import InvocationContext
|
|
53
49
|
from invokeai.app.util.controlnet_utils import prepare_control_image
|
|
@@ -68,12 +64,7 @@ from ...backend.stable_diffusion.diffusers_pipeline import (
|
|
|
68
64
|
)
|
|
69
65
|
from ...backend.stable_diffusion.schedulers import SCHEDULER_MAP
|
|
70
66
|
from ...backend.util.devices import choose_precision, choose_torch_device
|
|
71
|
-
from .baseinvocation import
|
|
72
|
-
BaseInvocation,
|
|
73
|
-
BaseInvocationOutput,
|
|
74
|
-
invocation,
|
|
75
|
-
invocation_output,
|
|
76
|
-
)
|
|
67
|
+
from .baseinvocation import BaseInvocation, BaseInvocationOutput, invocation, invocation_output
|
|
77
68
|
from .controlnet_image_processors import ControlField
|
|
78
69
|
from .model import ModelIdentifierField, UNetField, VAEField
|
|
79
70
|
|
|
@@ -1263,7 +1254,7 @@ class IdealSizeInvocation(BaseInvocation):
|
|
|
1263
1254
|
return tuple((x - x % multiple_of) for x in args)
|
|
1264
1255
|
|
|
1265
1256
|
def invoke(self, context: InvocationContext) -> IdealSizeOutput:
|
|
1266
|
-
unet_config = context.models.get_config(
|
|
1257
|
+
unet_config = context.models.get_config(self.unet.unet.key)
|
|
1267
1258
|
aspect = self.width / self.height
|
|
1268
1259
|
dimension: float = 512
|
|
1269
1260
|
if unet_config.base == BaseModelType.StableDiffusion2:
|
|
@@ -2,16 +2,8 @@ from typing import Any, Literal, Optional, Union
|
|
|
2
2
|
|
|
3
3
|
from pydantic import BaseModel, ConfigDict, Field
|
|
4
4
|
|
|
5
|
-
from invokeai.app.invocations.baseinvocation import
|
|
6
|
-
|
|
7
|
-
BaseInvocationOutput,
|
|
8
|
-
invocation,
|
|
9
|
-
invocation_output,
|
|
10
|
-
)
|
|
11
|
-
from invokeai.app.invocations.controlnet_image_processors import (
|
|
12
|
-
CONTROLNET_MODE_VALUES,
|
|
13
|
-
CONTROLNET_RESIZE_VALUES,
|
|
14
|
-
)
|
|
5
|
+
from invokeai.app.invocations.baseinvocation import BaseInvocation, BaseInvocationOutput, invocation, invocation_output
|
|
6
|
+
from invokeai.app.invocations.controlnet_image_processors import CONTROLNET_MODE_VALUES, CONTROLNET_RESIZE_VALUES
|
|
15
7
|
from invokeai.app.invocations.fields import (
|
|
16
8
|
FieldDescriptions,
|
|
17
9
|
ImageField,
|
|
@@ -43,6 +35,7 @@ class IPAdapterMetadataField(BaseModel):
|
|
|
43
35
|
|
|
44
36
|
image: ImageField = Field(description="The IP-Adapter image prompt.")
|
|
45
37
|
ip_adapter_model: ModelIdentifierField = Field(description="The IP-Adapter model.")
|
|
38
|
+
clip_vision_model: Literal["ViT-H", "ViT-G"] = Field(description="The CLIP Vision model")
|
|
46
39
|
weight: Union[float, list[float]] = Field(description="The weight given to the IP-Adapter")
|
|
47
40
|
begin_step_percent: float = Field(description="When the IP-Adapter is first applied (% of total steps)")
|
|
48
41
|
end_step_percent: float = Field(description="When the IP-Adapter is last applied (% of total steps)")
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
|
|
6
|
+
import locale
|
|
6
7
|
import os
|
|
7
8
|
import re
|
|
8
9
|
import shutil
|
|
@@ -317,11 +318,10 @@ class InvokeAIAppConfig(BaseSettings):
|
|
|
317
318
|
@staticmethod
|
|
318
319
|
def find_root() -> Path:
|
|
319
320
|
"""Choose the runtime root directory when not specified on command line or init file."""
|
|
320
|
-
venv = Path(os.environ.get("VIRTUAL_ENV") or ".")
|
|
321
321
|
if os.environ.get("INVOKEAI_ROOT"):
|
|
322
322
|
root = Path(os.environ["INVOKEAI_ROOT"])
|
|
323
|
-
elif
|
|
324
|
-
root = (venv.parent
|
|
323
|
+
elif venv := os.environ.get("VIRTUAL_ENV", None):
|
|
324
|
+
root = Path(venv).parent.resolve()
|
|
325
325
|
else:
|
|
326
326
|
root = Path("~/invokeai").expanduser().resolve()
|
|
327
327
|
return root
|
|
@@ -402,7 +402,7 @@ def load_and_migrate_config(config_path: Path) -> InvokeAIAppConfig:
|
|
|
402
402
|
An instance of `InvokeAIAppConfig` with the loaded and migrated settings.
|
|
403
403
|
"""
|
|
404
404
|
assert config_path.suffix == ".yaml"
|
|
405
|
-
with open(config_path) as file:
|
|
405
|
+
with open(config_path, "rt", encoding=locale.getpreferredencoding()) as file:
|
|
406
406
|
loaded_config_dict = yaml.safe_load(file)
|
|
407
407
|
|
|
408
408
|
assert isinstance(loaded_config_dict, dict)
|
{InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_install/model_install_default.py
RENAMED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Model installation class."""
|
|
2
2
|
|
|
3
|
+
import locale
|
|
3
4
|
import os
|
|
4
5
|
import re
|
|
5
6
|
import signal
|
|
@@ -323,7 +324,8 @@ class ModelInstallService(ModelInstallServiceBase):
|
|
|
323
324
|
legacy_models_yaml_path = Path(self._app_config.root_path, legacy_models_yaml_path)
|
|
324
325
|
|
|
325
326
|
if legacy_models_yaml_path.exists():
|
|
326
|
-
|
|
327
|
+
with open(legacy_models_yaml_path, "rt", encoding=locale.getpreferredencoding()) as file:
|
|
328
|
+
legacy_models_yaml = yaml.safe_load(file)
|
|
327
329
|
|
|
328
330
|
yaml_metadata = legacy_models_yaml.pop("__metadata__")
|
|
329
331
|
yaml_version = yaml_metadata.get("version")
|
|
@@ -564,7 +566,7 @@ class ModelInstallService(ModelInstallServiceBase):
|
|
|
564
566
|
# The model is not in the models directory - we don't need to move it.
|
|
565
567
|
return model
|
|
566
568
|
|
|
567
|
-
new_path =
|
|
569
|
+
new_path = models_dir / model.base.value / model.type.value / old_path.name
|
|
568
570
|
|
|
569
571
|
if old_path == new_path or new_path.exists() and old_path == new_path.resolve():
|
|
570
572
|
return model
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Initialization file for invokeai.backend.image_util methods.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
-
from .patchmatch import PatchMatch # noqa: F401
|
|
5
|
+
from .infill_methods.patchmatch import PatchMatch # noqa: F401
|
|
6
6
|
from .pngwriter import PngWriter, PromptFormatter, retrieve_metadata, write_metadata # noqa: F401
|
|
7
7
|
from .seamless import configure_model_padding # noqa: F401
|
|
8
8
|
from .util import InitImageResizer, make_grid # noqa: F401
|
|
@@ -7,6 +7,7 @@ from PIL import Image
|
|
|
7
7
|
|
|
8
8
|
import invokeai.backend.util.logging as logger
|
|
9
9
|
from invokeai.app.services.config.config_default import get_config
|
|
10
|
+
from invokeai.app.util.download_with_progress import download_with_progress_bar
|
|
10
11
|
from invokeai.backend.util.devices import choose_torch_device
|
|
11
12
|
|
|
12
13
|
|
|
@@ -30,6 +31,14 @@ class LaMA:
|
|
|
30
31
|
def __call__(self, input_image: Image.Image, *args: Any, **kwds: Any) -> Any:
|
|
31
32
|
device = choose_torch_device()
|
|
32
33
|
model_location = get_config().models_path / "core/misc/lama/lama.pt"
|
|
34
|
+
|
|
35
|
+
if not model_location.exists():
|
|
36
|
+
download_with_progress_bar(
|
|
37
|
+
name="LaMa Inpainting Model",
|
|
38
|
+
url="https://github.com/Sanster/models/releases/download/add_big_lama/big-lama.pt",
|
|
39
|
+
dest_path=model_location,
|
|
40
|
+
)
|
|
41
|
+
|
|
33
42
|
model = load_jit_model(model_location, device)
|
|
34
43
|
|
|
35
44
|
image = np.asarray(input_image.convert("RGB"))
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
from typing import Tuple
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from PIL import Image
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def infill_mosaic(
|
|
8
|
+
image: Image.Image,
|
|
9
|
+
tile_shape: Tuple[int, int] = (64, 64),
|
|
10
|
+
min_color: Tuple[int, int, int, int] = (0, 0, 0, 0),
|
|
11
|
+
max_color: Tuple[int, int, int, int] = (255, 255, 255, 0),
|
|
12
|
+
) -> Image.Image:
|
|
13
|
+
"""
|
|
14
|
+
image:PIL - A PIL Image
|
|
15
|
+
tile_shape: Tuple[int,int] - Tile width & Tile Height
|
|
16
|
+
min_color: Tuple[int,int,int] - RGB values for the lowest color to clip to (0-255)
|
|
17
|
+
max_color: Tuple[int,int,int] - RGB values for the highest color to clip to (0-255)
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
np_image = np.array(image) # Convert image to np array
|
|
21
|
+
alpha = np_image[:, :, 3] # Get the mask from the alpha channel of the image
|
|
22
|
+
non_transparent_pixels = np_image[alpha != 0, :3] # List of non-transparent pixels
|
|
23
|
+
|
|
24
|
+
# Create color tiles to paste in the empty areas of the image
|
|
25
|
+
tile_width, tile_height = tile_shape
|
|
26
|
+
|
|
27
|
+
# Clip the range of colors in the image to a particular spectrum only
|
|
28
|
+
r_min, g_min, b_min, _ = min_color
|
|
29
|
+
r_max, g_max, b_max, _ = max_color
|
|
30
|
+
non_transparent_pixels[:, 0] = np.clip(non_transparent_pixels[:, 0], r_min, r_max)
|
|
31
|
+
non_transparent_pixels[:, 1] = np.clip(non_transparent_pixels[:, 1], g_min, g_max)
|
|
32
|
+
non_transparent_pixels[:, 2] = np.clip(non_transparent_pixels[:, 2], b_min, b_max)
|
|
33
|
+
|
|
34
|
+
tiles = []
|
|
35
|
+
for _ in range(256):
|
|
36
|
+
color = non_transparent_pixels[np.random.randint(len(non_transparent_pixels))]
|
|
37
|
+
tile = np.zeros((tile_height, tile_width, 3), dtype=np.uint8)
|
|
38
|
+
tile[:, :] = color
|
|
39
|
+
tiles.append(tile)
|
|
40
|
+
|
|
41
|
+
# Fill the transparent area with tiles
|
|
42
|
+
filled_image = np.zeros((image.height, image.width, 3), dtype=np.uint8)
|
|
43
|
+
|
|
44
|
+
for x in range(image.width):
|
|
45
|
+
for y in range(image.height):
|
|
46
|
+
tile = tiles[np.random.randint(len(tiles))]
|
|
47
|
+
try:
|
|
48
|
+
filled_image[
|
|
49
|
+
y - (y % tile_height) : y - (y % tile_height) + tile_height,
|
|
50
|
+
x - (x % tile_width) : x - (x % tile_width) + tile_width,
|
|
51
|
+
] = tile
|
|
52
|
+
except ValueError:
|
|
53
|
+
# Need to handle edge cases - literally
|
|
54
|
+
pass
|
|
55
|
+
|
|
56
|
+
filled_image = Image.fromarray(filled_image) # Convert the filled tiles image to PIL
|
|
57
|
+
image = Image.composite(
|
|
58
|
+
image, filled_image, image.split()[-1]
|
|
59
|
+
) # Composite the original image on top of the filled tiles
|
|
60
|
+
return image
|