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.
Files changed (386) hide show
  1. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/InvokeAI.egg-info/PKG-INFO +1 -1
  2. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/InvokeAI.egg-info/SOURCES.txt +8 -6
  3. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/PKG-INFO +1 -1
  4. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/routers/app_info.py +2 -2
  5. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/routers/model_manager.py +2 -17
  6. InvokeAI-4.0.3/invokeai/app/invocations/infill.py +167 -0
  7. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/ip_adapter.py +45 -25
  8. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/latent.py +3 -12
  9. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/metadata.py +3 -10
  10. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/config/config_default.py +4 -4
  11. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_install/model_install_default.py +4 -2
  12. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_manager/model_manager_default.py +1 -0
  13. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/__init__.py +1 -1
  14. {InvokeAI-4.0.1/invokeai/backend/image_util → InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods}/lama.py +9 -0
  15. InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods/mosaic.py +60 -0
  16. InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods/patchmatch.py +67 -0
  17. InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods/tile.py +122 -0
  18. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/ip_adapter.py +72 -34
  19. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/resampler.py +24 -16
  20. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/config.py +18 -4
  21. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_cache/model_cache_default.py +16 -5
  22. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/ip_adapter.py +3 -9
  23. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/probe.py +22 -4
  24. InvokeAI-4.0.3/invokeai/frontend/web/dist/assets/App-BLcNMYZP.js +128 -0
  25. InvokeAI-4.0.3/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-DKJ1LbAm.js +1 -0
  26. 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
  27. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/index.html +1 -1
  28. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/de.json +18 -5
  29. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/en.json +9 -0
  30. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/it.json +5 -3
  31. InvokeAI-4.0.3/invokeai/version/invokeai_version.py +1 -0
  32. InvokeAI-4.0.1/invokeai/app/invocations/infill.py +0 -248
  33. InvokeAI-4.0.1/invokeai/backend/image_util/patchmatch.py +0 -49
  34. InvokeAI-4.0.1/invokeai/frontend/web/dist/assets/App-De5unnxA.js +0 -128
  35. InvokeAI-4.0.1/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-CX41dakW.js +0 -1
  36. InvokeAI-4.0.1/invokeai/version/invokeai_version.py +0 -1
  37. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/InvokeAI.egg-info/dependency_links.txt +0 -0
  38. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/InvokeAI.egg-info/entry_points.txt +0 -0
  39. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/InvokeAI.egg-info/requires.txt +0 -0
  40. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/InvokeAI.egg-info/top_level.txt +0 -0
  41. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/LICENSE +0 -0
  42. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/LICENSE-SD1+SD2.txt +0 -0
  43. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/LICENSE-SDXL.txt +0 -0
  44. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/README.md +0 -0
  45. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/__init__.py +0 -0
  46. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/dependencies.py +0 -0
  47. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/events.py +0 -0
  48. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/no_cache_staticfiles.py +0 -0
  49. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/routers/board_images.py +0 -0
  50. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/routers/boards.py +0 -0
  51. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/routers/download_queue.py +0 -0
  52. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/routers/images.py +0 -0
  53. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/routers/session_queue.py +0 -0
  54. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/routers/utilities.py +0 -0
  55. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/routers/workflows.py +0 -0
  56. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api/sockets.py +0 -0
  57. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/api_app.py +0 -0
  58. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/assets/images/caution.png +0 -0
  59. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/__init__.py +0 -0
  60. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/baseinvocation.py +0 -0
  61. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/collections.py +0 -0
  62. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/compel.py +0 -0
  63. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/constants.py +0 -0
  64. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/controlnet_image_processors.py +0 -0
  65. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/custom_nodes/README.md +0 -0
  66. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/custom_nodes/init.py +0 -0
  67. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/cv.py +0 -0
  68. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/facetools.py +0 -0
  69. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/fields.py +0 -0
  70. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/image.py +0 -0
  71. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/math.py +0 -0
  72. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/model.py +0 -0
  73. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/noise.py +0 -0
  74. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/param_easing.py +0 -0
  75. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/primitives.py +0 -0
  76. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/prompt.py +0 -0
  77. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/sdxl.py +0 -0
  78. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/strings.py +0 -0
  79. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/t2i_adapter.py +0 -0
  80. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/tiles.py +0 -0
  81. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/upscale.py +0 -0
  82. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/invocations/util.py +0 -0
  83. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/run_app.py +0 -0
  84. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/__init__.py +0 -0
  85. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_image_records/__init__.py +0 -0
  86. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_image_records/board_image_records_base.py +0 -0
  87. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_image_records/board_image_records_sqlite.py +0 -0
  88. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_images/__init__.py +0 -0
  89. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_images/board_images_base.py +0 -0
  90. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_images/board_images_common.py +0 -0
  91. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_images/board_images_default.py +0 -0
  92. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_records/board_records_base.py +0 -0
  93. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_records/board_records_common.py +0 -0
  94. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/board_records/board_records_sqlite.py +0 -0
  95. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/boards/__init__.py +0 -0
  96. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/boards/boards_base.py +0 -0
  97. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/boards/boards_common.py +0 -0
  98. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/boards/boards_default.py +0 -0
  99. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/bulk_download/__init__.py +0 -0
  100. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/bulk_download/bulk_download_base.py +0 -0
  101. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/bulk_download/bulk_download_common.py +0 -0
  102. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/bulk_download/bulk_download_default.py +0 -0
  103. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/config/__init__.py +0 -0
  104. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/config/config_common.py +0 -0
  105. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/download/__init__.py +0 -0
  106. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/download/download_base.py +0 -0
  107. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/download/download_default.py +0 -0
  108. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/events/__init__.py +0 -0
  109. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/events/events_base.py +0 -0
  110. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/image_files/__init__.py +0 -0
  111. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/image_files/image_files_base.py +0 -0
  112. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/image_files/image_files_common.py +0 -0
  113. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/image_files/image_files_disk.py +0 -0
  114. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/image_records/__init__.py +0 -0
  115. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/image_records/image_records_base.py +0 -0
  116. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/image_records/image_records_common.py +0 -0
  117. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/image_records/image_records_sqlite.py +0 -0
  118. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/images/__init__.py +0 -0
  119. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/images/images_base.py +0 -0
  120. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/images/images_common.py +0 -0
  121. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/images/images_default.py +0 -0
  122. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invocation_cache/__init__.py +0 -0
  123. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invocation_cache/invocation_cache_base.py +0 -0
  124. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invocation_cache/invocation_cache_common.py +0 -0
  125. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invocation_cache/invocation_cache_memory.py +0 -0
  126. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invocation_services.py +0 -0
  127. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invocation_stats/__init__.py +0 -0
  128. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invocation_stats/invocation_stats_base.py +0 -0
  129. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invocation_stats/invocation_stats_common.py +0 -0
  130. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invocation_stats/invocation_stats_default.py +0 -0
  131. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/invoker.py +0 -0
  132. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/item_storage/__init__.py +0 -0
  133. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/item_storage/item_storage_base.py +0 -0
  134. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/item_storage/item_storage_common.py +0 -0
  135. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/item_storage/item_storage_memory.py +0 -0
  136. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_images/model_images_base.py +0 -0
  137. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_images/model_images_common.py +0 -0
  138. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_images/model_images_default.py +0 -0
  139. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_install/__init__.py +0 -0
  140. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_install/model_install_base.py +0 -0
  141. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_load/__init__.py +0 -0
  142. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_load/model_load_base.py +0 -0
  143. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_load/model_load_default.py +0 -0
  144. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_manager/__init__.py +0 -0
  145. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_manager/model_manager_base.py +0 -0
  146. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_manager/model_manager_common.py +0 -0
  147. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_records/__init__.py +0 -0
  148. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_records/model_records_base.py +0 -0
  149. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/model_records/model_records_sql.py +0 -0
  150. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/names/__init__.py +0 -0
  151. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/names/names_base.py +0 -0
  152. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/names/names_common.py +0 -0
  153. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/names/names_default.py +0 -0
  154. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/object_serializer/object_serializer_base.py +0 -0
  155. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/object_serializer/object_serializer_common.py +0 -0
  156. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/object_serializer/object_serializer_disk.py +0 -0
  157. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/object_serializer/object_serializer_forward_cache.py +0 -0
  158. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/session_processor/__init__.py +0 -0
  159. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/session_processor/session_processor_base.py +0 -0
  160. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/session_processor/session_processor_common.py +0 -0
  161. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/session_processor/session_processor_default.py +0 -0
  162. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/session_queue/__init__.py +0 -0
  163. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/session_queue/session_queue_base.py +0 -0
  164. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/session_queue/session_queue_common.py +0 -0
  165. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/session_queue/session_queue_sqlite.py +0 -0
  166. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/__init__.py +0 -0
  167. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/graph.py +0 -0
  168. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/invocation_context.py +0 -0
  169. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/pagination.py +0 -0
  170. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite/__init__.py +0 -0
  171. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite/sqlite_common.py +0 -0
  172. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite/sqlite_database.py +0 -0
  173. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite/sqlite_util.py +0 -0
  174. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/__init__.py +0 -0
  175. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/__init__.py +0 -0
  176. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_1.py +0 -0
  177. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_2.py +0 -0
  178. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_3.py +0 -0
  179. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_4.py +0 -0
  180. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_5.py +0 -0
  181. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_6.py +0 -0
  182. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_7.py +0 -0
  183. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_8.py +0 -0
  184. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_9.py +0 -0
  185. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_common.py +0 -0
  186. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_impl.py +0 -0
  187. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/urls/__init__.py +0 -0
  188. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/urls/urls_base.py +0 -0
  189. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/urls/urls_default.py +0 -0
  190. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/__init__.py +0 -0
  191. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/ESRGAN Upscaling with Canny ControlNet.json +0 -0
  192. {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
  193. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Multi ControlNet (Canny & Depth).json +0 -0
  194. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Prompt from File.json +0 -0
  195. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Text to Image - SD1.5.json +0 -0
  196. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Text to Image - SDXL.json +0 -0
  197. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Text to Image with LoRA.json +0 -0
  198. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Tiled Upscaling (Beta).json +0 -0
  199. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/workflow_records_base.py +0 -0
  200. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/workflow_records_common.py +0 -0
  201. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/workflow_records_sqlite.py +0 -0
  202. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/shared/__init__.py +0 -0
  203. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/shared/models.py +0 -0
  204. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/__init__.py +0 -0
  205. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/controlnet_utils.py +0 -0
  206. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/download_with_progress.py +0 -0
  207. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/metaenum.py +0 -0
  208. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/misc.py +0 -0
  209. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/model_exclude_null.py +0 -0
  210. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/profiler.py +0 -0
  211. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/step_callback.py +0 -0
  212. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/suppress_output.py +0 -0
  213. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/thumbnails.py +0 -0
  214. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/app/util/ti_utils.py +0 -0
  215. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/assets/fonts/inter/Inter-Regular.ttf +0 -0
  216. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/__init__.py +0 -0
  217. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/basicsr/__init__.py +0 -0
  218. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/basicsr/arch_util.py +0 -0
  219. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/basicsr/rrdbnet_arch.py +0 -0
  220. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/canny.py +0 -0
  221. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/depth_anything/__init__.py +0 -0
  222. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/depth_anything/model/blocks.py +0 -0
  223. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/depth_anything/model/dpt.py +0 -0
  224. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/depth_anything/utilities/util.py +0 -0
  225. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/__init__.py +0 -0
  226. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/onnxdet.py +0 -0
  227. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/onnxpose.py +0 -0
  228. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/utils.py +0 -0
  229. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/wholebody.py +0 -0
  230. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/hed.py +0 -0
  231. {InvokeAI-4.0.1/invokeai/backend/image_util → InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods}/cv2_inpaint.py +0 -0
  232. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/invisible_watermark.py +0 -0
  233. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/lineart.py +0 -0
  234. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/lineart_anime.py +0 -0
  235. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/pngwriter.py +0 -0
  236. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/realesrgan/__init__.py +0 -0
  237. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/realesrgan/realesrgan.py +0 -0
  238. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/safety_checker.py +0 -0
  239. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/seamless.py +0 -0
  240. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/image_util/util.py +0 -0
  241. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/__init__.py +0 -0
  242. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/attention_processor.py +0 -0
  243. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/ip_attention_weights.py +0 -0
  244. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/unet_patcher.py +0 -0
  245. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/lora.py +0 -0
  246. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_hash/model_hash.py +0 -0
  247. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/__init__.py +0 -0
  248. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/convert_ckpt_to_diffusers.py +0 -0
  249. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/libc_util.py +0 -0
  250. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/__init__.py +0 -0
  251. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/convert_cache/__init__.py +0 -0
  252. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/convert_cache/convert_cache_base.py +0 -0
  253. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/convert_cache/convert_cache_default.py +0 -0
  254. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/load_base.py +0 -0
  255. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/load_default.py +0 -0
  256. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/memory_snapshot.py +0 -0
  257. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_cache/__init__.py +0 -0
  258. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_cache/model_cache_base.py +0 -0
  259. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_cache/model_locker.py +1 -1
  260. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loader_registry.py +0 -0
  261. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/__init__.py +0 -0
  262. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/controlnet.py +0 -0
  263. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/generic_diffusers.py +0 -0
  264. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/lora.py +0 -0
  265. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/onnx.py +0 -0
  266. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/stable_diffusion.py +0 -0
  267. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/textual_inversion.py +0 -0
  268. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/vae.py +0 -0
  269. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_util.py +0 -0
  270. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/optimizations.py +0 -0
  271. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/merge.py +0 -0
  272. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/__init__.py +0 -0
  273. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/fetch/__init__.py +0 -0
  274. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/fetch/fetch_base.py +0 -0
  275. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/fetch/huggingface.py +0 -0
  276. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/metadata_base.py +0 -0
  277. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/search.py +0 -0
  278. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/starter_models.py +0 -0
  279. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/util/libc_util.py +0 -0
  280. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/util/model_util.py +0 -0
  281. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_manager/util/select_hf_files.py +0 -0
  282. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/model_patcher.py +0 -0
  283. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/onnx/onnx_runtime.py +0 -0
  284. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/raw_model.py +0 -0
  285. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/__init__.py +0 -0
  286. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusers_pipeline.py +0 -0
  287. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusion/__init__.py +0 -0
  288. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusion/conditioning_data.py +0 -0
  289. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusion/cross_attention_control.py +0 -0
  290. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py +0 -0
  291. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/schedulers/__init__.py +0 -0
  292. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/schedulers/schedulers.py +0 -0
  293. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/seamless.py +0 -0
  294. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/textual_inversion.py +0 -0
  295. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/tiles/__init__.py +0 -0
  296. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/tiles/tiles.py +0 -0
  297. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/tiles/utils.py +0 -0
  298. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/__init__.py +0 -0
  299. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/attention.py +0 -0
  300. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/db_maintenance.py +0 -0
  301. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/devices.py +0 -0
  302. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/hotfixes.py +0 -0
  303. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/logging.py +0 -0
  304. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/mps_fixes.py +0 -0
  305. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/silence_warnings.py +0 -0
  306. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/test_utils.py +0 -0
  307. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/backend/util/util.py +0 -0
  308. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/controlnet/cldm_v15.yaml +0 -0
  309. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/controlnet/cldm_v21.yaml +0 -0
  310. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/sd_xl_base.yaml +0 -0
  311. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/sd_xl_refiner.yaml +0 -0
  312. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-finetune.yaml +0 -0
  313. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-finetune_style.yaml +0 -0
  314. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-inference-v.yaml +0 -0
  315. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-inference.yaml +0 -0
  316. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-inpainting-inference.yaml +0 -0
  317. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-m1-finetune.yaml +0 -0
  318. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-inference-v.yaml +0 -0
  319. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-inference.yaml +0 -0
  320. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-inpainting-inference-v.yaml +0 -0
  321. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-inpainting-inference.yaml +0 -0
  322. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-midas-inference.yaml +0 -0
  323. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/__init__.py +0 -0
  324. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/cli/__init__.py +0 -0
  325. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/cli/arg_parser.py +0 -0
  326. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/install/__init__.py +0 -0
  327. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/install/import_images.py +0 -0
  328. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/__init__.py +0 -0
  329. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/App-DI6oCUg0.css +0 -0
  330. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-Bsx7ESc2.css +0 -0
  331. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-avatar-circle.svg +0 -0
  332. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-avatar-square.svg +0 -0
  333. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-favicon.png +0 -0
  334. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-favicon.svg +0 -0
  335. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-key-char-lrg.svg +0 -0
  336. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-key-char-sml.svg +0 -0
  337. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-key-wht-lrg.svg +0 -0
  338. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-key-wht-sml.svg +0 -0
  339. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-char-lrg.svg +0 -0
  340. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-char-sml.svg +0 -0
  341. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-wht-lrg.svg +0 -0
  342. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-wht-sml.svg +0 -0
  343. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-ylw-lrg.svg +0 -0
  344. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-tag-char-lrg.svg +0 -0
  345. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-tag-char-sml.svg +0 -0
  346. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-tag-lrg.svg +0 -0
  347. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-tag-sml.svg +0 -0
  348. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-wordmark-charcoal.svg +0 -0
  349. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-wordmark-white.svg +0 -0
  350. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/mask.svg +0 -0
  351. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-cyrillic-ext-wght-normal-DIEz8p5i.woff2 +0 -0
  352. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-cyrillic-wght-normal-BmJJXa8e.woff2 +0 -0
  353. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-greek-ext-wght-normal-D5AYLNiq.woff2 +0 -0
  354. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-greek-wght-normal-DyIDNIyN.woff2 +0 -0
  355. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-latin-ext-wght-normal-CN1pIXkb.woff2 +0 -0
  356. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-latin-wght-normal-BgVq2Tq4.woff2 +0 -0
  357. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-vietnamese-wght-normal-_GQuwPVU.woff2 +0 -0
  358. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ar.json +0 -0
  359. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/az.json +0 -0
  360. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/bg.json +0 -0
  361. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/es.json +0 -0
  362. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/fi.json +0 -0
  363. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/fr.json +0 -0
  364. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/he.json +0 -0
  365. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/hu.json +0 -0
  366. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ja.json +0 -0
  367. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ko.json +0 -0
  368. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/mn.json +0 -0
  369. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/nl.json +0 -0
  370. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/pl.json +0 -0
  371. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/pt.json +0 -0
  372. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/pt_BR.json +0 -0
  373. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ro.json +0 -0
  374. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ru.json +0 -0
  375. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/sv.json +0 -0
  376. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/tr.json +0 -0
  377. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/uk.json +0 -0
  378. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/vi.json +0 -0
  379. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/zh_CN.json +0 -0
  380. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/zh_Hant.json +0 -0
  381. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/scripts/clean_translations.py +0 -0
  382. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/frontend/web/static/docs/invoke-favicon-docs.svg +0 -0
  383. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/invocation_api/__init__.py +0 -0
  384. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/invokeai/version/__init__.py +0 -0
  385. {InvokeAI-4.0.1 → InvokeAI-4.0.3}/pyproject.toml +0 -0
  386. {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.1
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-CX41dakW.js
319
- invokeai/frontend/web/dist/assets/index-DN8M6F76.js
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.1
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 the resolved paths, appending to the scan result.
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 = path in resolved_installed_model_paths or path in installed_model_sources
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 AnyModelConfig, BaseModelType, IPAdapterConfig, ModelType
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, IPAdapterConfig)
90
- image_encoder_model_id = ip_adapter_info.image_encoder_model_id
91
- image_encoder_model_name = image_encoder_model_id.split("/")[-1].strip()
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
- found = False
106
- while not found:
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
- found = len(image_encoder_models) > 0
111
- if not found:
112
- context.logger.warning(
113
- f"The image encoder required by this IP Adapter ({image_encoder_model_name}) is not installed."
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(**self.unet.unet.model_dump())
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
- BaseInvocation,
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 any((venv.parent / x).exists() for x in [INIT_FILE, LEGACY_INIT_FILE]):
324
- root = (venv.parent).resolve()
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)
@@ -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
- legacy_models_yaml = yaml.safe_load(legacy_models_yaml_path.read_text())
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 = (models_dir / model.base.value / model.type.value / model.name).with_suffix(old_path.suffix)
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
@@ -80,6 +80,7 @@ class ModelManagerService(ModelManagerServiceBase):
80
80
  ram_cache = ModelCache(
81
81
  max_cache_size=app_config.ram,
82
82
  max_vram_cache_size=app_config.vram,
83
+ lazy_offloading=app_config.lazy_offload,
83
84
  logger=logger,
84
85
  execution_device=execution_device,
85
86
  )
@@ -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