InvokeAI 4.2.1__tar.gz → 4.2.2__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 (390) hide show
  1. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/InvokeAI.egg-info/PKG-INFO +1 -1
  2. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/InvokeAI.egg-info/SOURCES.txt +3 -3
  3. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/PKG-INFO +1 -1
  4. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/api/routers/images.py +40 -23
  5. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/api_app.py +8 -0
  6. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/controlnet_image_processors.py +2 -3
  7. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/ip_adapter.py +2 -3
  8. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/model.py +173 -10
  9. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/sdxl.py +5 -5
  10. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/t2i_adapter.py +2 -3
  11. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/events/events_base.py +4 -0
  12. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/image_files/image_files_base.py +9 -6
  13. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/image_files/image_files_disk.py +20 -13
  14. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/image_records/image_records_base.py +1 -1
  15. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/image_records/image_records_sqlite.py +2 -3
  16. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/images/images_base.py +9 -4
  17. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/images/images_default.py +16 -6
  18. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/session_processor/session_processor_default.py +2 -0
  19. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/invocation_context.py +13 -4
  20. InvokeAI-4.2.2/invokeai/frontend/web/dist/assets/App-CAjHcDCp.js +137 -0
  21. InvokeAI-4.2.1/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-DyRqmsy8.js → InvokeAI-4.2.2/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-WgP1oSC3.js +1 -1
  22. InvokeAI-4.2.2/invokeai/frontend/web/dist/assets/index-MqcuyfH_.js +510 -0
  23. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/index.html +1 -1
  24. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/en.json +9 -3
  25. InvokeAI-4.2.2/invokeai/version/invokeai_version.py +1 -0
  26. InvokeAI-4.2.1/invokeai/frontend/web/dist/assets/App-DB-UBib9.js +0 -137
  27. InvokeAI-4.2.1/invokeai/frontend/web/dist/assets/index-BhjE-_0E.js +0 -510
  28. InvokeAI-4.2.1/invokeai/version/invokeai_version.py +0 -1
  29. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/InvokeAI.egg-info/dependency_links.txt +0 -0
  30. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/InvokeAI.egg-info/entry_points.txt +0 -0
  31. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/InvokeAI.egg-info/requires.txt +0 -0
  32. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/InvokeAI.egg-info/top_level.txt +0 -0
  33. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/LICENSE +0 -0
  34. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/LICENSE-SD1+SD2.txt +0 -0
  35. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/LICENSE-SDXL.txt +0 -0
  36. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/README.md +0 -0
  37. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/__init__.py +0 -0
  38. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/api/dependencies.py +0 -0
  39. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/api/events.py +0 -0
  40. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/api/no_cache_staticfiles.py +0 -0
  41. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/api/routers/app_info.py +0 -0
  42. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/api/routers/board_images.py +0 -0
  43. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/api/routers/boards.py +0 -0
  44. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/api/routers/download_queue.py +0 -0
  45. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/api/routers/model_manager.py +0 -0
  46. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/api/routers/session_queue.py +0 -0
  47. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/api/routers/utilities.py +0 -0
  48. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/api/routers/workflows.py +0 -0
  49. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/api/sockets.py +0 -0
  50. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/assets/images/caution.png +0 -0
  51. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/__init__.py +0 -0
  52. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/baseinvocation.py +0 -0
  53. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/collections.py +0 -0
  54. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/compel.py +0 -0
  55. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/constants.py +0 -0
  56. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/custom_nodes/README.md +0 -0
  57. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/custom_nodes/init.py +0 -0
  58. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/cv.py +0 -0
  59. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/facetools.py +0 -0
  60. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/fields.py +0 -0
  61. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/image.py +0 -0
  62. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/infill.py +0 -0
  63. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/latent.py +0 -0
  64. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/mask.py +0 -0
  65. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/math.py +0 -0
  66. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/metadata.py +0 -0
  67. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/noise.py +0 -0
  68. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/param_easing.py +0 -0
  69. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/primitives.py +0 -0
  70. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/prompt.py +0 -0
  71. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/strings.py +0 -0
  72. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/tiles.py +0 -0
  73. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/upscale.py +0 -0
  74. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/invocations/util.py +0 -0
  75. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/run_app.py +0 -0
  76. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/__init__.py +0 -0
  77. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/board_image_records/__init__.py +0 -0
  78. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/board_image_records/board_image_records_base.py +0 -0
  79. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/board_image_records/board_image_records_sqlite.py +0 -0
  80. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/board_images/__init__.py +0 -0
  81. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/board_images/board_images_base.py +0 -0
  82. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/board_images/board_images_common.py +0 -0
  83. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/board_images/board_images_default.py +0 -0
  84. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/board_records/board_records_base.py +0 -0
  85. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/board_records/board_records_common.py +0 -0
  86. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/board_records/board_records_sqlite.py +0 -0
  87. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/boards/__init__.py +0 -0
  88. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/boards/boards_base.py +0 -0
  89. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/boards/boards_common.py +0 -0
  90. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/boards/boards_default.py +0 -0
  91. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/bulk_download/__init__.py +0 -0
  92. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/bulk_download/bulk_download_base.py +0 -0
  93. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/bulk_download/bulk_download_common.py +0 -0
  94. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/bulk_download/bulk_download_default.py +0 -0
  95. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/config/__init__.py +0 -0
  96. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/config/config_common.py +0 -0
  97. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/config/config_default.py +0 -0
  98. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/download/__init__.py +0 -0
  99. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/download/download_base.py +0 -0
  100. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/download/download_default.py +0 -0
  101. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/events/__init__.py +0 -0
  102. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/image_files/__init__.py +0 -0
  103. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/image_files/image_files_common.py +0 -0
  104. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/image_records/__init__.py +0 -0
  105. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/image_records/image_records_common.py +0 -0
  106. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/images/__init__.py +0 -0
  107. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/images/images_common.py +0 -0
  108. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/invocation_cache/__init__.py +0 -0
  109. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/invocation_cache/invocation_cache_base.py +0 -0
  110. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/invocation_cache/invocation_cache_common.py +0 -0
  111. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/invocation_cache/invocation_cache_memory.py +0 -0
  112. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/invocation_services.py +0 -0
  113. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/invocation_stats/__init__.py +0 -0
  114. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/invocation_stats/invocation_stats_base.py +0 -0
  115. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/invocation_stats/invocation_stats_common.py +0 -0
  116. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/invocation_stats/invocation_stats_default.py +0 -0
  117. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/invoker.py +0 -0
  118. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/item_storage/__init__.py +0 -0
  119. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/item_storage/item_storage_base.py +0 -0
  120. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/item_storage/item_storage_common.py +0 -0
  121. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/item_storage/item_storage_memory.py +0 -0
  122. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/model_images/model_images_base.py +0 -0
  123. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/model_images/model_images_common.py +0 -0
  124. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/model_images/model_images_default.py +0 -0
  125. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/model_install/__init__.py +0 -0
  126. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/model_install/model_install_base.py +0 -0
  127. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/model_install/model_install_default.py +0 -0
  128. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/model_load/__init__.py +0 -0
  129. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/model_load/model_load_base.py +0 -0
  130. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/model_load/model_load_default.py +0 -0
  131. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/model_manager/__init__.py +0 -0
  132. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/model_manager/model_manager_base.py +0 -0
  133. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/model_manager/model_manager_common.py +0 -0
  134. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/model_manager/model_manager_default.py +0 -0
  135. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/model_records/__init__.py +0 -0
  136. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/model_records/model_records_base.py +0 -0
  137. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/model_records/model_records_sql.py +0 -0
  138. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/names/__init__.py +0 -0
  139. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/names/names_base.py +0 -0
  140. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/names/names_common.py +0 -0
  141. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/names/names_default.py +0 -0
  142. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/object_serializer/object_serializer_base.py +0 -0
  143. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/object_serializer/object_serializer_common.py +0 -0
  144. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/object_serializer/object_serializer_disk.py +0 -0
  145. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/object_serializer/object_serializer_forward_cache.py +0 -0
  146. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/session_processor/__init__.py +0 -0
  147. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/session_processor/session_processor_base.py +0 -0
  148. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/session_processor/session_processor_common.py +0 -0
  149. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/session_queue/__init__.py +0 -0
  150. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/session_queue/session_queue_base.py +0 -0
  151. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/session_queue/session_queue_common.py +0 -0
  152. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/session_queue/session_queue_sqlite.py +0 -0
  153. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/__init__.py +0 -0
  154. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/graph.py +0 -0
  155. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/pagination.py +0 -0
  156. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/sqlite/__init__.py +0 -0
  157. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/sqlite/sqlite_common.py +0 -0
  158. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/sqlite/sqlite_database.py +0 -0
  159. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/sqlite/sqlite_util.py +0 -0
  160. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/sqlite_migrator/__init__.py +0 -0
  161. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/sqlite_migrator/migrations/__init__.py +0 -0
  162. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_1.py +0 -0
  163. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_2.py +0 -0
  164. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_3.py +0 -0
  165. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_4.py +0 -0
  166. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_5.py +0 -0
  167. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_6.py +0 -0
  168. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_7.py +0 -0
  169. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_8.py +0 -0
  170. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_9.py +0 -0
  171. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_common.py +0 -0
  172. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_impl.py +0 -0
  173. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/urls/__init__.py +0 -0
  174. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/urls/urls_base.py +0 -0
  175. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/urls/urls_default.py +0 -0
  176. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/workflow_records/__init__.py +0 -0
  177. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/workflow_records/default_workflows/ESRGAN Upscaling with Canny ControlNet.json +0 -0
  178. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/workflow_records/default_workflows/Face Detailer with IP-Adapter & Canny (See Note in Details).json +0 -0
  179. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/workflow_records/default_workflows/Multi ControlNet (Canny & Depth).json +0 -0
  180. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/workflow_records/default_workflows/Prompt from File.json +0 -0
  181. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/workflow_records/default_workflows/Text to Image - SD1.5.json +0 -0
  182. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/workflow_records/default_workflows/Text to Image - SDXL.json +0 -0
  183. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/workflow_records/default_workflows/Text to Image with LoRA.json +0 -0
  184. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/workflow_records/default_workflows/Tiled Upscaling (Beta).json +0 -0
  185. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/workflow_records/workflow_records_base.py +0 -0
  186. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/workflow_records/workflow_records_common.py +0 -0
  187. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/services/workflow_records/workflow_records_sqlite.py +0 -0
  188. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/shared/__init__.py +0 -0
  189. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/shared/models.py +0 -0
  190. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/util/__init__.py +0 -0
  191. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/util/controlnet_utils.py +0 -0
  192. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/util/download_with_progress.py +0 -0
  193. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/util/metaenum.py +0 -0
  194. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/util/misc.py +0 -0
  195. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/util/model_exclude_null.py +0 -0
  196. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/util/profiler.py +0 -0
  197. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/util/step_callback.py +0 -0
  198. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/util/suppress_output.py +0 -0
  199. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/util/thumbnails.py +0 -0
  200. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/app/util/ti_utils.py +0 -0
  201. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/assets/fonts/inter/Inter-Regular.ttf +0 -0
  202. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/__init__.py +0 -0
  203. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/__init__.py +0 -0
  204. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/basicsr/__init__.py +0 -0
  205. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/basicsr/arch_util.py +0 -0
  206. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/basicsr/rrdbnet_arch.py +0 -0
  207. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/canny.py +0 -0
  208. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/depth_anything/__init__.py +0 -0
  209. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/depth_anything/model/blocks.py +0 -0
  210. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/depth_anything/model/dpt.py +0 -0
  211. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/depth_anything/utilities/util.py +0 -0
  212. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/dw_openpose/__init__.py +0 -0
  213. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/dw_openpose/onnxdet.py +0 -0
  214. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/dw_openpose/onnxpose.py +0 -0
  215. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/dw_openpose/utils.py +0 -0
  216. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/dw_openpose/wholebody.py +0 -0
  217. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/hed.py +0 -0
  218. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/infill_methods/cv2_inpaint.py +0 -0
  219. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/infill_methods/lama.py +0 -0
  220. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/infill_methods/mosaic.py +0 -0
  221. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/infill_methods/patchmatch.py +0 -0
  222. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/infill_methods/tile.py +0 -0
  223. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/invisible_watermark.py +0 -0
  224. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/lineart.py +0 -0
  225. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/lineart_anime.py +0 -0
  226. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/pngwriter.py +0 -0
  227. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/realesrgan/__init__.py +0 -0
  228. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/realesrgan/realesrgan.py +0 -0
  229. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/safety_checker.py +0 -0
  230. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/image_util/util.py +0 -0
  231. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/ip_adapter/__init__.py +0 -0
  232. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/ip_adapter/ip_adapter.py +0 -0
  233. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/ip_adapter/ip_attention_weights.py +0 -0
  234. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/ip_adapter/resampler.py +0 -0
  235. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/lora.py +0 -0
  236. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_hash/model_hash.py +0 -0
  237. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/__init__.py +0 -0
  238. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/config.py +0 -0
  239. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/convert_ckpt_to_diffusers.py +0 -0
  240. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/libc_util.py +0 -0
  241. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/__init__.py +0 -0
  242. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/convert_cache/__init__.py +0 -0
  243. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/convert_cache/convert_cache_base.py +0 -0
  244. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/convert_cache/convert_cache_default.py +0 -0
  245. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/load_base.py +0 -0
  246. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/load_default.py +0 -0
  247. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/memory_snapshot.py +0 -0
  248. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/model_cache/__init__.py +0 -0
  249. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/model_cache/model_cache_base.py +0 -0
  250. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/model_cache/model_cache_default.py +0 -0
  251. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/model_cache/model_locker.py +0 -0
  252. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/model_loader_registry.py +0 -0
  253. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/model_loaders/__init__.py +0 -0
  254. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/model_loaders/controlnet.py +0 -0
  255. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/model_loaders/generic_diffusers.py +0 -0
  256. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/model_loaders/ip_adapter.py +0 -0
  257. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/model_loaders/lora.py +0 -0
  258. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/model_loaders/onnx.py +0 -0
  259. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/model_loaders/stable_diffusion.py +0 -0
  260. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/model_loaders/textual_inversion.py +0 -0
  261. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/model_loaders/vae.py +0 -0
  262. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/model_util.py +0 -0
  263. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/load/optimizations.py +0 -0
  264. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/merge.py +0 -0
  265. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/metadata/__init__.py +0 -0
  266. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/metadata/fetch/__init__.py +0 -0
  267. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/metadata/fetch/fetch_base.py +0 -0
  268. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/metadata/fetch/huggingface.py +0 -0
  269. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/metadata/metadata_base.py +0 -0
  270. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/probe.py +0 -0
  271. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/search.py +0 -0
  272. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/starter_models.py +0 -0
  273. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/util/libc_util.py +0 -0
  274. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/util/model_util.py +0 -0
  275. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_manager/util/select_hf_files.py +0 -0
  276. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/model_patcher.py +0 -0
  277. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/onnx/onnx_runtime.py +0 -0
  278. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/raw_model.py +0 -0
  279. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/stable_diffusion/__init__.py +0 -0
  280. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/stable_diffusion/diffusers_pipeline.py +0 -0
  281. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/stable_diffusion/diffusion/__init__.py +0 -0
  282. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/stable_diffusion/diffusion/conditioning_data.py +0 -0
  283. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/stable_diffusion/diffusion/custom_atttention.py +0 -0
  284. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/stable_diffusion/diffusion/regional_ip_data.py +0 -0
  285. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/stable_diffusion/diffusion/regional_prompt_data.py +0 -0
  286. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py +0 -0
  287. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/stable_diffusion/diffusion/unet_attention_patcher.py +0 -0
  288. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/stable_diffusion/schedulers/__init__.py +0 -0
  289. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/stable_diffusion/schedulers/schedulers.py +0 -0
  290. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/stable_diffusion/seamless.py +0 -0
  291. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/textual_inversion.py +0 -0
  292. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/tiles/__init__.py +0 -0
  293. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/tiles/tiles.py +0 -0
  294. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/tiles/utils.py +0 -0
  295. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/util/__init__.py +0 -0
  296. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/util/attention.py +0 -0
  297. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/util/catch_sigint.py +0 -0
  298. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/util/db_maintenance.py +0 -0
  299. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/util/devices.py +0 -0
  300. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/util/hotfixes.py +0 -0
  301. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/util/logging.py +0 -0
  302. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/util/mask.py +0 -0
  303. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/util/mps_fixes.py +0 -0
  304. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/util/silence_warnings.py +0 -0
  305. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/util/test_utils.py +0 -0
  306. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/backend/util/util.py +0 -0
  307. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/configs/controlnet/cldm_v15.yaml +0 -0
  308. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/configs/controlnet/cldm_v21.yaml +0 -0
  309. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/configs/stable-diffusion/sd_xl_base.yaml +0 -0
  310. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/configs/stable-diffusion/sd_xl_inpaint.yaml +0 -0
  311. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/configs/stable-diffusion/sd_xl_refiner.yaml +0 -0
  312. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/configs/stable-diffusion/v1-finetune.yaml +0 -0
  313. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/configs/stable-diffusion/v1-finetune_style.yaml +0 -0
  314. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/configs/stable-diffusion/v1-inference-v.yaml +0 -0
  315. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/configs/stable-diffusion/v1-inference.yaml +0 -0
  316. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/configs/stable-diffusion/v1-inpainting-inference.yaml +0 -0
  317. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/configs/stable-diffusion/v1-m1-finetune.yaml +0 -0
  318. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/configs/stable-diffusion/v2-inference-v.yaml +0 -0
  319. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/configs/stable-diffusion/v2-inference.yaml +0 -0
  320. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/configs/stable-diffusion/v2-inpainting-inference-v.yaml +0 -0
  321. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/configs/stable-diffusion/v2-inpainting-inference.yaml +0 -0
  322. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/configs/stable-diffusion/v2-midas-inference.yaml +0 -0
  323. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/__init__.py +0 -0
  324. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/cli/__init__.py +0 -0
  325. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/cli/arg_parser.py +0 -0
  326. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/install/__init__.py +0 -0
  327. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/install/import_images.py +0 -0
  328. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/__init__.py +0 -0
  329. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/App-DEu4J2pT.css +0 -0
  330. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-DzjsLZSc.css +0 -0
  331. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-alert-favicon.svg +0 -0
  332. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-avatar-circle.svg +0 -0
  333. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-avatar-square.svg +0 -0
  334. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-favicon.png +0 -0
  335. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-favicon.svg +0 -0
  336. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-key-char-lrg.svg +0 -0
  337. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-key-char-sml.svg +0 -0
  338. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-key-wht-lrg.svg +0 -0
  339. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-key-wht-sml.svg +0 -0
  340. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-symbol-char-lrg.svg +0 -0
  341. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-symbol-char-sml.svg +0 -0
  342. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-symbol-wht-lrg.svg +0 -0
  343. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-symbol-wht-sml.svg +0 -0
  344. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-symbol-ylw-lrg.svg +0 -0
  345. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-tag-char-lrg.svg +0 -0
  346. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-tag-char-sml.svg +0 -0
  347. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-tag-lrg.svg +0 -0
  348. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-tag-sml.svg +0 -0
  349. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-wordmark-charcoal.svg +0 -0
  350. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/invoke-wordmark-white.svg +0 -0
  351. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/mask.svg +0 -0
  352. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/images/transparent_bg.png +0 -0
  353. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/inter-cyrillic-ext-wght-normal-DIEz8p5i.woff2 +0 -0
  354. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/inter-cyrillic-wght-normal-BmJJXa8e.woff2 +0 -0
  355. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/inter-greek-ext-wght-normal-D5AYLNiq.woff2 +0 -0
  356. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/inter-greek-wght-normal-DyIDNIyN.woff2 +0 -0
  357. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/inter-latin-ext-wght-normal-CN1pIXkb.woff2 +0 -0
  358. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/inter-latin-wght-normal-BgVq2Tq4.woff2 +0 -0
  359. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/assets/inter-vietnamese-wght-normal-_GQuwPVU.woff2 +0 -0
  360. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/ar.json +0 -0
  361. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/az.json +0 -0
  362. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/bg.json +0 -0
  363. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/de.json +0 -0
  364. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/es.json +0 -0
  365. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/fi.json +0 -0
  366. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/fr.json +0 -0
  367. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/he.json +0 -0
  368. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/hu.json +0 -0
  369. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/it.json +0 -0
  370. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/ja.json +0 -0
  371. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/ko.json +0 -0
  372. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/mn.json +0 -0
  373. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/nl.json +0 -0
  374. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/pl.json +0 -0
  375. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/pt.json +0 -0
  376. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/pt_BR.json +0 -0
  377. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/ro.json +0 -0
  378. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/ru.json +0 -0
  379. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/sv.json +0 -0
  380. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/tr.json +0 -0
  381. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/uk.json +0 -0
  382. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/vi.json +0 -0
  383. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/zh_CN.json +0 -0
  384. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/dist/locales/zh_Hant.json +0 -0
  385. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/scripts/clean_translations.py +0 -0
  386. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/frontend/web/static/docs/invoke-favicon-docs.svg +0 -0
  387. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/invocation_api/__init__.py +0 -0
  388. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/invokeai/version/__init__.py +0 -0
  389. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/pyproject.toml +0 -0
  390. {InvokeAI-4.2.1 → InvokeAI-4.2.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: InvokeAI
3
- Version: 4.2.1
3
+ Version: 4.2.2
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
@@ -318,11 +318,11 @@ invokeai/frontend/install/__init__.py
318
318
  invokeai/frontend/install/import_images.py
319
319
  invokeai/frontend/web/__init__.py
320
320
  invokeai/frontend/web/dist/index.html
321
- invokeai/frontend/web/dist/assets/App-DB-UBib9.js
321
+ invokeai/frontend/web/dist/assets/App-CAjHcDCp.js
322
322
  invokeai/frontend/web/dist/assets/App-DEu4J2pT.css
323
- invokeai/frontend/web/dist/assets/ThemeLocaleProvider-DyRqmsy8.js
324
323
  invokeai/frontend/web/dist/assets/ThemeLocaleProvider-DzjsLZSc.css
325
- invokeai/frontend/web/dist/assets/index-BhjE-_0E.js
324
+ invokeai/frontend/web/dist/assets/ThemeLocaleProvider-WgP1oSC3.js
325
+ invokeai/frontend/web/dist/assets/index-MqcuyfH_.js
326
326
  invokeai/frontend/web/dist/assets/inter-cyrillic-ext-wght-normal-DIEz8p5i.woff2
327
327
  invokeai/frontend/web/dist/assets/inter-cyrillic-wght-normal-BmJJXa8e.woff2
328
328
  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.2.1
3
+ Version: 4.2.2
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
@@ -6,13 +6,12 @@ from fastapi import BackgroundTasks, Body, HTTPException, Path, Query, Request,
6
6
  from fastapi.responses import FileResponse
7
7
  from fastapi.routing import APIRouter
8
8
  from PIL import Image
9
- from pydantic import BaseModel, Field, ValidationError
9
+ from pydantic import BaseModel, Field, JsonValue
10
10
 
11
- from invokeai.app.invocations.fields import MetadataField, MetadataFieldValidator
11
+ from invokeai.app.invocations.fields import MetadataField
12
12
  from invokeai.app.services.image_records.image_records_common import ImageCategory, ImageRecordChanges, ResourceOrigin
13
13
  from invokeai.app.services.images.images_common import ImageDTO, ImageUrlsDTO
14
14
  from invokeai.app.services.shared.pagination import OffsetPaginatedResults
15
- from invokeai.app.services.workflow_records.workflow_records_common import WorkflowWithoutID, WorkflowWithoutIDValidator
16
15
 
17
16
  from ..dependencies import ApiDependencies
18
17
 
@@ -42,13 +41,17 @@ async def upload_image(
42
41
  board_id: Optional[str] = Query(default=None, description="The board to add this image to, if any"),
43
42
  session_id: Optional[str] = Query(default=None, description="The session ID associated with this upload, if any"),
44
43
  crop_visible: Optional[bool] = Query(default=False, description="Whether to crop the image"),
44
+ metadata: Optional[JsonValue] = Body(
45
+ default=None, description="The metadata to associate with the image", embed=True
46
+ ),
45
47
  ) -> ImageDTO:
46
48
  """Uploads an image"""
47
49
  if not file.content_type or not file.content_type.startswith("image"):
48
50
  raise HTTPException(status_code=415, detail="Not an image")
49
51
 
50
- metadata = None
51
- workflow = None
52
+ _metadata = None
53
+ _workflow = None
54
+ _graph = None
52
55
 
53
56
  contents = await file.read()
54
57
  try:
@@ -62,22 +65,28 @@ async def upload_image(
62
65
 
63
66
  # TODO: retain non-invokeai metadata on upload?
64
67
  # attempt to parse metadata from image
65
- metadata_raw = pil_image.info.get("invokeai_metadata", None)
66
- if metadata_raw:
67
- try:
68
- metadata = MetadataFieldValidator.validate_json(metadata_raw)
69
- except ValidationError:
70
- ApiDependencies.invoker.services.logger.warn("Failed to parse metadata for uploaded image")
71
- pass
68
+ metadata_raw = metadata if isinstance(metadata, str) else pil_image.info.get("invokeai_metadata", None)
69
+ if isinstance(metadata_raw, str):
70
+ _metadata = metadata_raw
71
+ else:
72
+ ApiDependencies.invoker.services.logger.warn("Failed to parse metadata for uploaded image")
73
+ pass
72
74
 
73
75
  # attempt to parse workflow from image
74
76
  workflow_raw = pil_image.info.get("invokeai_workflow", None)
75
- if workflow_raw is not None:
76
- try:
77
- workflow = WorkflowWithoutIDValidator.validate_json(workflow_raw)
78
- except ValidationError:
79
- ApiDependencies.invoker.services.logger.warn("Failed to parse metadata for uploaded image")
80
- pass
77
+ if isinstance(workflow_raw, str):
78
+ _workflow = workflow_raw
79
+ else:
80
+ ApiDependencies.invoker.services.logger.warn("Failed to parse workflow for uploaded image")
81
+ pass
82
+
83
+ # attempt to extract graph from image
84
+ graph_raw = pil_image.info.get("invokeai_graph", None)
85
+ if isinstance(graph_raw, str):
86
+ _graph = graph_raw
87
+ else:
88
+ ApiDependencies.invoker.services.logger.warn("Failed to parse graph for uploaded image")
89
+ pass
81
90
 
82
91
  try:
83
92
  image_dto = ApiDependencies.invoker.services.images.create(
@@ -86,8 +95,9 @@ async def upload_image(
86
95
  image_category=image_category,
87
96
  session_id=session_id,
88
97
  board_id=board_id,
89
- metadata=metadata,
90
- workflow=workflow,
98
+ metadata=_metadata,
99
+ workflow=_workflow,
100
+ graph=_graph,
91
101
  is_intermediate=is_intermediate,
92
102
  )
93
103
 
@@ -185,14 +195,21 @@ async def get_image_metadata(
185
195
  raise HTTPException(status_code=404)
186
196
 
187
197
 
198
+ class WorkflowAndGraphResponse(BaseModel):
199
+ workflow: Optional[str] = Field(description="The workflow used to generate the image, as stringified JSON")
200
+ graph: Optional[str] = Field(description="The graph used to generate the image, as stringified JSON")
201
+
202
+
188
203
  @images_router.get(
189
- "/i/{image_name}/workflow", operation_id="get_image_workflow", response_model=Optional[WorkflowWithoutID]
204
+ "/i/{image_name}/workflow", operation_id="get_image_workflow", response_model=WorkflowAndGraphResponse
190
205
  )
191
206
  async def get_image_workflow(
192
207
  image_name: str = Path(description="The name of image whose workflow to get"),
193
- ) -> Optional[WorkflowWithoutID]:
208
+ ) -> WorkflowAndGraphResponse:
194
209
  try:
195
- return ApiDependencies.invoker.services.images.get_workflow(image_name)
210
+ workflow = ApiDependencies.invoker.services.images.get_workflow(image_name)
211
+ graph = ApiDependencies.invoker.services.images.get_graph(image_name)
212
+ return WorkflowAndGraphResponse(workflow=workflow, graph=graph)
196
213
  except Exception:
197
214
  raise HTTPException(status_code=404)
198
215
 
@@ -164,6 +164,12 @@ def custom_openapi() -> dict[str, Any]:
164
164
  for schema_key, schema_json in additional_schemas[1]["$defs"].items():
165
165
  openapi_schema["components"]["schemas"][schema_key] = schema_json
166
166
 
167
+ openapi_schema["components"]["schemas"]["InvocationOutputMap"] = {
168
+ "type": "object",
169
+ "properties": {},
170
+ "required": [],
171
+ }
172
+
167
173
  # Add a reference to the output type to additionalProperties of the invoker schema
168
174
  for invoker in all_invocations:
169
175
  invoker_name = invoker.__name__ # type: ignore [attr-defined] # this is a valid attribute
@@ -172,6 +178,8 @@ def custom_openapi() -> dict[str, Any]:
172
178
  invoker_schema = openapi_schema["components"]["schemas"][f"{invoker_name}"]
173
179
  outputs_ref = {"$ref": f"#/components/schemas/{output_type_title}"}
174
180
  invoker_schema["output"] = outputs_ref
181
+ openapi_schema["components"]["schemas"]["InvocationOutputMap"]["properties"][invoker.get_type()] = outputs_ref
182
+ openapi_schema["components"]["schemas"]["InvocationOutputMap"]["required"].append(invoker.get_type())
175
183
  invoker_schema["class"] = "invocation"
176
184
 
177
185
  # This code no longer seems to be necessary?
@@ -24,7 +24,6 @@ from pydantic import BaseModel, Field, field_validator, model_validator
24
24
  from invokeai.app.invocations.fields import (
25
25
  FieldDescriptions,
26
26
  ImageField,
27
- Input,
28
27
  InputField,
29
28
  OutputField,
30
29
  UIType,
@@ -80,13 +79,13 @@ class ControlOutput(BaseInvocationOutput):
80
79
  control: ControlField = OutputField(description=FieldDescriptions.control)
81
80
 
82
81
 
83
- @invocation("controlnet", title="ControlNet", tags=["controlnet"], category="controlnet", version="1.1.1")
82
+ @invocation("controlnet", title="ControlNet", tags=["controlnet"], category="controlnet", version="1.1.2")
84
83
  class ControlNetInvocation(BaseInvocation):
85
84
  """Collects ControlNet info to pass to other nodes"""
86
85
 
87
86
  image: ImageField = InputField(description="The control image")
88
87
  control_model: ModelIdentifierField = InputField(
89
- description=FieldDescriptions.controlnet_model, input=Input.Direct, ui_type=UIType.ControlNetModel
88
+ description=FieldDescriptions.controlnet_model, ui_type=UIType.ControlNetModel
90
89
  )
91
90
  control_weight: Union[float, List[float]] = InputField(
92
91
  default=1.0, ge=-1, le=2, description="The weight given to the ControlNet"
@@ -5,7 +5,7 @@ from pydantic import BaseModel, Field, field_validator, model_validator
5
5
  from typing_extensions import Self
6
6
 
7
7
  from invokeai.app.invocations.baseinvocation import BaseInvocation, BaseInvocationOutput, invocation, invocation_output
8
- from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField, TensorField, UIType
8
+ from invokeai.app.invocations.fields import FieldDescriptions, InputField, OutputField, TensorField, UIType
9
9
  from invokeai.app.invocations.model import ModelIdentifierField
10
10
  from invokeai.app.invocations.primitives import ImageField
11
11
  from invokeai.app.invocations.util import validate_begin_end_step, validate_weights
@@ -58,7 +58,7 @@ class IPAdapterOutput(BaseInvocationOutput):
58
58
  CLIP_VISION_MODEL_MAP = {"ViT-H": "ip_adapter_sd_image_encoder", "ViT-G": "ip_adapter_sdxl_image_encoder"}
59
59
 
60
60
 
61
- @invocation("ip_adapter", title="IP-Adapter", tags=["ip_adapter", "control"], category="ip_adapter", version="1.4.0")
61
+ @invocation("ip_adapter", title="IP-Adapter", tags=["ip_adapter", "control"], category="ip_adapter", version="1.4.1")
62
62
  class IPAdapterInvocation(BaseInvocation):
63
63
  """Collects IP-Adapter info to pass to other nodes."""
64
64
 
@@ -67,7 +67,6 @@ class IPAdapterInvocation(BaseInvocation):
67
67
  ip_adapter_model: ModelIdentifierField = InputField(
68
68
  description="The IP-Adapter model.",
69
69
  title="IP-Adapter Model",
70
- input=Input.Direct,
71
70
  ui_order=-1,
72
71
  ui_type=UIType.IPAdapterModel,
73
72
  )
@@ -11,6 +11,7 @@ from invokeai.backend.model_manager.config import AnyModelConfig, BaseModelType,
11
11
  from .baseinvocation import (
12
12
  BaseInvocation,
13
13
  BaseInvocationOutput,
14
+ Classification,
14
15
  invocation,
15
16
  invocation_output,
16
17
  )
@@ -93,19 +94,46 @@ class ModelLoaderOutput(UNetOutput, CLIPOutput, VAEOutput):
93
94
  pass
94
95
 
95
96
 
97
+ @invocation_output("model_identifier_output")
98
+ class ModelIdentifierOutput(BaseInvocationOutput):
99
+ """Model identifier output"""
100
+
101
+ model: ModelIdentifierField = OutputField(description="Model identifier", title="Model")
102
+
103
+
104
+ @invocation(
105
+ "model_identifier",
106
+ title="Model identifier",
107
+ tags=["model"],
108
+ category="model",
109
+ version="1.0.0",
110
+ classification=Classification.Prototype,
111
+ )
112
+ class ModelIdentifierInvocation(BaseInvocation):
113
+ """Selects any model, outputting it its identifier. Be careful with this one! The identifier will be accepted as
114
+ input for any model, even if the model types don't match. If you connect this to a mismatched input, you'll get an
115
+ error."""
116
+
117
+ model: ModelIdentifierField = InputField(description="The model to select", title="Model")
118
+
119
+ def invoke(self, context: InvocationContext) -> ModelIdentifierOutput:
120
+ if not context.models.exists(self.model.key):
121
+ raise Exception(f"Unknown model {self.model.key}")
122
+
123
+ return ModelIdentifierOutput(model=self.model)
124
+
125
+
96
126
  @invocation(
97
127
  "main_model_loader",
98
128
  title="Main Model",
99
129
  tags=["model"],
100
130
  category="model",
101
- version="1.0.2",
131
+ version="1.0.3",
102
132
  )
103
133
  class MainModelLoaderInvocation(BaseInvocation):
104
134
  """Loads a main model, outputting its submodels."""
105
135
 
106
- model: ModelIdentifierField = InputField(
107
- description=FieldDescriptions.main_model, input=Input.Direct, ui_type=UIType.MainModel
108
- )
136
+ model: ModelIdentifierField = InputField(description=FieldDescriptions.main_model, ui_type=UIType.MainModel)
109
137
  # TODO: precision?
110
138
 
111
139
  def invoke(self, context: InvocationContext) -> ModelLoaderOutput:
@@ -134,12 +162,12 @@ class LoRALoaderOutput(BaseInvocationOutput):
134
162
  clip: Optional[CLIPField] = OutputField(default=None, description=FieldDescriptions.clip, title="CLIP")
135
163
 
136
164
 
137
- @invocation("lora_loader", title="LoRA", tags=["model"], category="model", version="1.0.2")
165
+ @invocation("lora_loader", title="LoRA", tags=["model"], category="model", version="1.0.3")
138
166
  class LoRALoaderInvocation(BaseInvocation):
139
167
  """Apply selected lora to unet and text_encoder."""
140
168
 
141
169
  lora: ModelIdentifierField = InputField(
142
- description=FieldDescriptions.lora_model, input=Input.Direct, title="LoRA", ui_type=UIType.LoRAModel
170
+ description=FieldDescriptions.lora_model, title="LoRA", ui_type=UIType.LoRAModel
143
171
  )
144
172
  weight: float = InputField(default=0.75, description=FieldDescriptions.lora_weight)
145
173
  unet: Optional[UNetField] = InputField(
@@ -190,6 +218,75 @@ class LoRALoaderInvocation(BaseInvocation):
190
218
  return output
191
219
 
192
220
 
221
+ @invocation_output("lora_selector_output")
222
+ class LoRASelectorOutput(BaseInvocationOutput):
223
+ """Model loader output"""
224
+
225
+ lora: LoRAField = OutputField(description="LoRA model and weight", title="LoRA")
226
+
227
+
228
+ @invocation("lora_selector", title="LoRA Selector", tags=["model"], category="model", version="1.0.1")
229
+ class LoRASelectorInvocation(BaseInvocation):
230
+ """Selects a LoRA model and weight."""
231
+
232
+ lora: ModelIdentifierField = InputField(
233
+ description=FieldDescriptions.lora_model, title="LoRA", ui_type=UIType.LoRAModel
234
+ )
235
+ weight: float = InputField(default=0.75, description=FieldDescriptions.lora_weight)
236
+
237
+ def invoke(self, context: InvocationContext) -> LoRASelectorOutput:
238
+ return LoRASelectorOutput(lora=LoRAField(lora=self.lora, weight=self.weight))
239
+
240
+
241
+ @invocation("lora_collection_loader", title="LoRA Collection Loader", tags=["model"], category="model", version="1.0.0")
242
+ class LoRACollectionLoader(BaseInvocation):
243
+ """Applies a collection of LoRAs to the provided UNet and CLIP models."""
244
+
245
+ loras: LoRAField | list[LoRAField] = InputField(
246
+ description="LoRA models and weights. May be a single LoRA or collection.", title="LoRAs"
247
+ )
248
+ unet: Optional[UNetField] = InputField(
249
+ default=None,
250
+ description=FieldDescriptions.unet,
251
+ input=Input.Connection,
252
+ title="UNet",
253
+ )
254
+ clip: Optional[CLIPField] = InputField(
255
+ default=None,
256
+ description=FieldDescriptions.clip,
257
+ input=Input.Connection,
258
+ title="CLIP",
259
+ )
260
+
261
+ def invoke(self, context: InvocationContext) -> LoRALoaderOutput:
262
+ output = LoRALoaderOutput()
263
+ loras = self.loras if isinstance(self.loras, list) else [self.loras]
264
+ added_loras: list[str] = []
265
+
266
+ for lora in loras:
267
+ if lora.lora.key in added_loras:
268
+ continue
269
+
270
+ if not context.models.exists(lora.lora.key):
271
+ raise Exception(f"Unknown lora: {lora.lora.key}!")
272
+
273
+ assert lora.lora.base in (BaseModelType.StableDiffusion1, BaseModelType.StableDiffusion2)
274
+
275
+ added_loras.append(lora.lora.key)
276
+
277
+ if self.unet is not None:
278
+ if output.unet is None:
279
+ output.unet = self.unet.model_copy(deep=True)
280
+ output.unet.loras.append(lora)
281
+
282
+ if self.clip is not None:
283
+ if output.clip is None:
284
+ output.clip = self.clip.model_copy(deep=True)
285
+ output.clip.loras.append(lora)
286
+
287
+ return output
288
+
289
+
193
290
  @invocation_output("sdxl_lora_loader_output")
194
291
  class SDXLLoRALoaderOutput(BaseInvocationOutput):
195
292
  """SDXL LoRA Loader Output"""
@@ -204,13 +301,13 @@ class SDXLLoRALoaderOutput(BaseInvocationOutput):
204
301
  title="SDXL LoRA",
205
302
  tags=["lora", "model"],
206
303
  category="model",
207
- version="1.0.2",
304
+ version="1.0.3",
208
305
  )
209
306
  class SDXLLoRALoaderInvocation(BaseInvocation):
210
307
  """Apply selected lora to unet and text_encoder."""
211
308
 
212
309
  lora: ModelIdentifierField = InputField(
213
- description=FieldDescriptions.lora_model, input=Input.Direct, title="LoRA", ui_type=UIType.LoRAModel
310
+ description=FieldDescriptions.lora_model, title="LoRA", ui_type=UIType.LoRAModel
214
311
  )
215
312
  weight: float = InputField(default=0.75, description=FieldDescriptions.lora_weight)
216
313
  unet: Optional[UNetField] = InputField(
@@ -279,12 +376,78 @@ class SDXLLoRALoaderInvocation(BaseInvocation):
279
376
  return output
280
377
 
281
378
 
282
- @invocation("vae_loader", title="VAE", tags=["vae", "model"], category="model", version="1.0.2")
379
+ @invocation(
380
+ "sdxl_lora_collection_loader",
381
+ title="SDXL LoRA Collection Loader",
382
+ tags=["model"],
383
+ category="model",
384
+ version="1.0.0",
385
+ )
386
+ class SDXLLoRACollectionLoader(BaseInvocation):
387
+ """Applies a collection of SDXL LoRAs to the provided UNet and CLIP models."""
388
+
389
+ loras: LoRAField | list[LoRAField] = InputField(
390
+ description="LoRA models and weights. May be a single LoRA or collection.", title="LoRAs"
391
+ )
392
+ unet: Optional[UNetField] = InputField(
393
+ default=None,
394
+ description=FieldDescriptions.unet,
395
+ input=Input.Connection,
396
+ title="UNet",
397
+ )
398
+ clip: Optional[CLIPField] = InputField(
399
+ default=None,
400
+ description=FieldDescriptions.clip,
401
+ input=Input.Connection,
402
+ title="CLIP",
403
+ )
404
+ clip2: Optional[CLIPField] = InputField(
405
+ default=None,
406
+ description=FieldDescriptions.clip,
407
+ input=Input.Connection,
408
+ title="CLIP 2",
409
+ )
410
+
411
+ def invoke(self, context: InvocationContext) -> SDXLLoRALoaderOutput:
412
+ output = SDXLLoRALoaderOutput()
413
+ loras = self.loras if isinstance(self.loras, list) else [self.loras]
414
+ added_loras: list[str] = []
415
+
416
+ for lora in loras:
417
+ if lora.lora.key in added_loras:
418
+ continue
419
+
420
+ if not context.models.exists(lora.lora.key):
421
+ raise Exception(f"Unknown lora: {lora.lora.key}!")
422
+
423
+ assert lora.lora.base is BaseModelType.StableDiffusionXL
424
+
425
+ added_loras.append(lora.lora.key)
426
+
427
+ if self.unet is not None:
428
+ if output.unet is None:
429
+ output.unet = self.unet.model_copy(deep=True)
430
+ output.unet.loras.append(lora)
431
+
432
+ if self.clip is not None:
433
+ if output.clip is None:
434
+ output.clip = self.clip.model_copy(deep=True)
435
+ output.clip.loras.append(lora)
436
+
437
+ if self.clip2 is not None:
438
+ if output.clip2 is None:
439
+ output.clip2 = self.clip2.model_copy(deep=True)
440
+ output.clip2.loras.append(lora)
441
+
442
+ return output
443
+
444
+
445
+ @invocation("vae_loader", title="VAE", tags=["vae", "model"], category="model", version="1.0.3")
283
446
  class VAELoaderInvocation(BaseInvocation):
284
447
  """Loads a VAE model, outputting a VaeLoaderOutput"""
285
448
 
286
449
  vae_model: ModelIdentifierField = InputField(
287
- description=FieldDescriptions.vae_model, input=Input.Direct, title="VAE", ui_type=UIType.VAEModel
450
+ description=FieldDescriptions.vae_model, title="VAE", ui_type=UIType.VAEModel
288
451
  )
289
452
 
290
453
  def invoke(self, context: InvocationContext) -> VAEOutput:
@@ -1,4 +1,4 @@
1
- from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField, UIType
1
+ from invokeai.app.invocations.fields import FieldDescriptions, InputField, OutputField, UIType
2
2
  from invokeai.app.services.shared.invocation_context import InvocationContext
3
3
  from invokeai.backend.model_manager import SubModelType
4
4
 
@@ -30,12 +30,12 @@ class SDXLRefinerModelLoaderOutput(BaseInvocationOutput):
30
30
  vae: VAEField = OutputField(description=FieldDescriptions.vae, title="VAE")
31
31
 
32
32
 
33
- @invocation("sdxl_model_loader", title="SDXL Main Model", tags=["model", "sdxl"], category="model", version="1.0.2")
33
+ @invocation("sdxl_model_loader", title="SDXL Main Model", tags=["model", "sdxl"], category="model", version="1.0.3")
34
34
  class SDXLModelLoaderInvocation(BaseInvocation):
35
35
  """Loads an sdxl base model, outputting its submodels."""
36
36
 
37
37
  model: ModelIdentifierField = InputField(
38
- description=FieldDescriptions.sdxl_main_model, input=Input.Direct, ui_type=UIType.SDXLMainModel
38
+ description=FieldDescriptions.sdxl_main_model, ui_type=UIType.SDXLMainModel
39
39
  )
40
40
  # TODO: precision?
41
41
 
@@ -67,13 +67,13 @@ class SDXLModelLoaderInvocation(BaseInvocation):
67
67
  title="SDXL Refiner Model",
68
68
  tags=["model", "sdxl", "refiner"],
69
69
  category="model",
70
- version="1.0.2",
70
+ version="1.0.3",
71
71
  )
72
72
  class SDXLRefinerModelLoaderInvocation(BaseInvocation):
73
73
  """Loads an sdxl refiner model, outputting its submodels."""
74
74
 
75
75
  model: ModelIdentifierField = InputField(
76
- description=FieldDescriptions.sdxl_refiner_model, input=Input.Direct, ui_type=UIType.SDXLRefinerModel
76
+ description=FieldDescriptions.sdxl_refiner_model, ui_type=UIType.SDXLRefinerModel
77
77
  )
78
78
  # TODO: precision?
79
79
 
@@ -8,7 +8,7 @@ from invokeai.app.invocations.baseinvocation import (
8
8
  invocation,
9
9
  invocation_output,
10
10
  )
11
- from invokeai.app.invocations.fields import FieldDescriptions, ImageField, Input, InputField, OutputField, UIType
11
+ from invokeai.app.invocations.fields import FieldDescriptions, ImageField, InputField, OutputField, UIType
12
12
  from invokeai.app.invocations.model import ModelIdentifierField
13
13
  from invokeai.app.invocations.util import validate_begin_end_step, validate_weights
14
14
  from invokeai.app.services.shared.invocation_context import InvocationContext
@@ -45,7 +45,7 @@ class T2IAdapterOutput(BaseInvocationOutput):
45
45
 
46
46
 
47
47
  @invocation(
48
- "t2i_adapter", title="T2I-Adapter", tags=["t2i_adapter", "control"], category="t2i_adapter", version="1.0.2"
48
+ "t2i_adapter", title="T2I-Adapter", tags=["t2i_adapter", "control"], category="t2i_adapter", version="1.0.3"
49
49
  )
50
50
  class T2IAdapterInvocation(BaseInvocation):
51
51
  """Collects T2I-Adapter info to pass to other nodes."""
@@ -55,7 +55,6 @@ class T2IAdapterInvocation(BaseInvocation):
55
55
  t2i_adapter_model: ModelIdentifierField = InputField(
56
56
  description="The T2I-Adapter model.",
57
57
  title="T2I-Adapter Model",
58
- input=Input.Direct,
59
58
  ui_order=-1,
60
59
  ui_type=UIType.T2IAdapterModel,
61
60
  )
@@ -122,6 +122,8 @@ class EventServiceBase:
122
122
  source_node_id: str,
123
123
  error_type: str,
124
124
  error: str,
125
+ user_id: str | None,
126
+ project_id: str | None,
125
127
  ) -> None:
126
128
  """Emitted when an invocation has completed"""
127
129
  self.__emit_queue_event(
@@ -135,6 +137,8 @@ class EventServiceBase:
135
137
  "source_node_id": source_node_id,
136
138
  "error_type": error_type,
137
139
  "error": error,
140
+ "user_id": user_id,
141
+ "project_id": project_id,
138
142
  },
139
143
  )
140
144
 
@@ -4,9 +4,6 @@ from typing import Optional
4
4
 
5
5
  from PIL.Image import Image as PILImageType
6
6
 
7
- from invokeai.app.invocations.fields import MetadataField
8
- from invokeai.app.services.workflow_records.workflow_records_common import WorkflowWithoutID
9
-
10
7
 
11
8
  class ImageFileStorageBase(ABC):
12
9
  """Low-level service responsible for storing and retrieving image files."""
@@ -33,8 +30,9 @@ class ImageFileStorageBase(ABC):
33
30
  self,
34
31
  image: PILImageType,
35
32
  image_name: str,
36
- metadata: Optional[MetadataField] = None,
37
- workflow: Optional[WorkflowWithoutID] = None,
33
+ metadata: Optional[str] = None,
34
+ workflow: Optional[str] = None,
35
+ graph: Optional[str] = None,
38
36
  thumbnail_size: int = 256,
39
37
  ) -> None:
40
38
  """Saves an image and a 256x256 WEBP thumbnail. Returns a tuple of the image name, thumbnail name, and created timestamp."""
@@ -46,6 +44,11 @@ class ImageFileStorageBase(ABC):
46
44
  pass
47
45
 
48
46
  @abstractmethod
49
- def get_workflow(self, image_name: str) -> Optional[WorkflowWithoutID]:
47
+ def get_workflow(self, image_name: str) -> Optional[str]:
50
48
  """Gets the workflow of an image."""
51
49
  pass
50
+
51
+ @abstractmethod
52
+ def get_graph(self, image_name: str) -> Optional[str]:
53
+ """Gets the graph of an image."""
54
+ pass
@@ -7,9 +7,7 @@ from PIL import Image, PngImagePlugin
7
7
  from PIL.Image import Image as PILImageType
8
8
  from send2trash import send2trash
9
9
 
10
- from invokeai.app.invocations.fields import MetadataField
11
10
  from invokeai.app.services.invoker import Invoker
12
- from invokeai.app.services.workflow_records.workflow_records_common import WorkflowWithoutID
13
11
  from invokeai.app.util.thumbnails import get_thumbnail_name, make_thumbnail
14
12
 
15
13
  from .image_files_base import ImageFileStorageBase
@@ -56,8 +54,9 @@ class DiskImageFileStorage(ImageFileStorageBase):
56
54
  self,
57
55
  image: PILImageType,
58
56
  image_name: str,
59
- metadata: Optional[MetadataField] = None,
60
- workflow: Optional[WorkflowWithoutID] = None,
57
+ metadata: Optional[str] = None,
58
+ workflow: Optional[str] = None,
59
+ graph: Optional[str] = None,
61
60
  thumbnail_size: int = 256,
62
61
  ) -> None:
63
62
  try:
@@ -68,13 +67,14 @@ class DiskImageFileStorage(ImageFileStorageBase):
68
67
  info_dict = {}
69
68
 
70
69
  if metadata is not None:
71
- metadata_json = metadata.model_dump_json()
72
- info_dict["invokeai_metadata"] = metadata_json
73
- pnginfo.add_text("invokeai_metadata", metadata_json)
70
+ info_dict["invokeai_metadata"] = metadata
71
+ pnginfo.add_text("invokeai_metadata", metadata)
74
72
  if workflow is not None:
75
- workflow_json = workflow.model_dump_json()
76
- info_dict["invokeai_workflow"] = workflow_json
77
- pnginfo.add_text("invokeai_workflow", workflow_json)
73
+ info_dict["invokeai_workflow"] = workflow
74
+ pnginfo.add_text("invokeai_workflow", workflow)
75
+ if graph is not None:
76
+ info_dict["invokeai_graph"] = graph
77
+ pnginfo.add_text("invokeai_graph", graph)
78
78
 
79
79
  # When saving the image, the image object's info field is not populated. We need to set it
80
80
  image.info = info_dict
@@ -129,11 +129,18 @@ class DiskImageFileStorage(ImageFileStorageBase):
129
129
  path = path if isinstance(path, Path) else Path(path)
130
130
  return path.exists()
131
131
 
132
- def get_workflow(self, image_name: str) -> WorkflowWithoutID | None:
132
+ def get_workflow(self, image_name: str) -> str | None:
133
133
  image = self.get(image_name)
134
134
  workflow = image.info.get("invokeai_workflow", None)
135
- if workflow is not None:
136
- return WorkflowWithoutID.model_validate_json(workflow)
135
+ if isinstance(workflow, str):
136
+ return workflow
137
+ return None
138
+
139
+ def get_graph(self, image_name: str) -> str | None:
140
+ image = self.get(image_name)
141
+ graph = image.info.get("invokeai_graph", None)
142
+ if isinstance(graph, str):
143
+ return graph
137
144
  return None
138
145
 
139
146
  def __validate_storage_folders(self) -> None:
@@ -80,7 +80,7 @@ class ImageRecordStorageBase(ABC):
80
80
  starred: Optional[bool] = False,
81
81
  session_id: Optional[str] = None,
82
82
  node_id: Optional[str] = None,
83
- metadata: Optional[MetadataField] = None,
83
+ metadata: Optional[str] = None,
84
84
  ) -> datetime:
85
85
  """Saves an image record."""
86
86
  pass