diffusers 0.33.1__py3-none-any.whl → 0.35.0__py3-none-any.whl

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 (551) hide show
  1. diffusers/__init__.py +145 -1
  2. diffusers/callbacks.py +35 -0
  3. diffusers/commands/__init__.py +1 -1
  4. diffusers/commands/custom_blocks.py +134 -0
  5. diffusers/commands/diffusers_cli.py +3 -1
  6. diffusers/commands/env.py +1 -1
  7. diffusers/commands/fp16_safetensors.py +2 -2
  8. diffusers/configuration_utils.py +11 -2
  9. diffusers/dependency_versions_check.py +1 -1
  10. diffusers/dependency_versions_table.py +3 -3
  11. diffusers/experimental/rl/value_guided_sampling.py +1 -1
  12. diffusers/guiders/__init__.py +41 -0
  13. diffusers/guiders/adaptive_projected_guidance.py +188 -0
  14. diffusers/guiders/auto_guidance.py +190 -0
  15. diffusers/guiders/classifier_free_guidance.py +141 -0
  16. diffusers/guiders/classifier_free_zero_star_guidance.py +152 -0
  17. diffusers/guiders/frequency_decoupled_guidance.py +327 -0
  18. diffusers/guiders/guider_utils.py +309 -0
  19. diffusers/guiders/perturbed_attention_guidance.py +271 -0
  20. diffusers/guiders/skip_layer_guidance.py +262 -0
  21. diffusers/guiders/smoothed_energy_guidance.py +251 -0
  22. diffusers/guiders/tangential_classifier_free_guidance.py +143 -0
  23. diffusers/hooks/__init__.py +17 -0
  24. diffusers/hooks/_common.py +56 -0
  25. diffusers/hooks/_helpers.py +293 -0
  26. diffusers/hooks/faster_cache.py +9 -8
  27. diffusers/hooks/first_block_cache.py +259 -0
  28. diffusers/hooks/group_offloading.py +332 -227
  29. diffusers/hooks/hooks.py +58 -3
  30. diffusers/hooks/layer_skip.py +263 -0
  31. diffusers/hooks/layerwise_casting.py +5 -10
  32. diffusers/hooks/pyramid_attention_broadcast.py +15 -12
  33. diffusers/hooks/smoothed_energy_guidance_utils.py +167 -0
  34. diffusers/hooks/utils.py +43 -0
  35. diffusers/image_processor.py +7 -2
  36. diffusers/loaders/__init__.py +10 -0
  37. diffusers/loaders/ip_adapter.py +260 -18
  38. diffusers/loaders/lora_base.py +261 -127
  39. diffusers/loaders/lora_conversion_utils.py +657 -35
  40. diffusers/loaders/lora_pipeline.py +2778 -1246
  41. diffusers/loaders/peft.py +78 -112
  42. diffusers/loaders/single_file.py +2 -2
  43. diffusers/loaders/single_file_model.py +64 -15
  44. diffusers/loaders/single_file_utils.py +395 -7
  45. diffusers/loaders/textual_inversion.py +3 -2
  46. diffusers/loaders/transformer_flux.py +10 -11
  47. diffusers/loaders/transformer_sd3.py +8 -3
  48. diffusers/loaders/unet.py +24 -21
  49. diffusers/loaders/unet_loader_utils.py +6 -3
  50. diffusers/loaders/utils.py +1 -1
  51. diffusers/models/__init__.py +23 -1
  52. diffusers/models/activations.py +5 -5
  53. diffusers/models/adapter.py +2 -3
  54. diffusers/models/attention.py +488 -7
  55. diffusers/models/attention_dispatch.py +1218 -0
  56. diffusers/models/attention_flax.py +10 -10
  57. diffusers/models/attention_processor.py +113 -667
  58. diffusers/models/auto_model.py +49 -12
  59. diffusers/models/autoencoders/__init__.py +2 -0
  60. diffusers/models/autoencoders/autoencoder_asym_kl.py +4 -4
  61. diffusers/models/autoencoders/autoencoder_dc.py +17 -4
  62. diffusers/models/autoencoders/autoencoder_kl.py +5 -5
  63. diffusers/models/autoencoders/autoencoder_kl_allegro.py +4 -4
  64. diffusers/models/autoencoders/autoencoder_kl_cogvideox.py +6 -6
  65. diffusers/models/autoencoders/autoencoder_kl_cosmos.py +1110 -0
  66. diffusers/models/autoencoders/autoencoder_kl_hunyuan_video.py +2 -2
  67. diffusers/models/autoencoders/autoencoder_kl_ltx.py +3 -3
  68. diffusers/models/autoencoders/autoencoder_kl_magvit.py +4 -4
  69. diffusers/models/autoencoders/autoencoder_kl_mochi.py +3 -3
  70. diffusers/models/autoencoders/autoencoder_kl_qwenimage.py +1070 -0
  71. diffusers/models/autoencoders/autoencoder_kl_temporal_decoder.py +4 -4
  72. diffusers/models/autoencoders/autoencoder_kl_wan.py +626 -62
  73. diffusers/models/autoencoders/autoencoder_oobleck.py +1 -1
  74. diffusers/models/autoencoders/autoencoder_tiny.py +3 -3
  75. diffusers/models/autoencoders/consistency_decoder_vae.py +1 -1
  76. diffusers/models/autoencoders/vae.py +13 -2
  77. diffusers/models/autoencoders/vq_model.py +2 -2
  78. diffusers/models/cache_utils.py +32 -10
  79. diffusers/models/controlnet.py +1 -1
  80. diffusers/models/controlnet_flux.py +1 -1
  81. diffusers/models/controlnet_sd3.py +1 -1
  82. diffusers/models/controlnet_sparsectrl.py +1 -1
  83. diffusers/models/controlnets/__init__.py +1 -0
  84. diffusers/models/controlnets/controlnet.py +3 -3
  85. diffusers/models/controlnets/controlnet_flax.py +1 -1
  86. diffusers/models/controlnets/controlnet_flux.py +21 -20
  87. diffusers/models/controlnets/controlnet_hunyuan.py +2 -2
  88. diffusers/models/controlnets/controlnet_sana.py +290 -0
  89. diffusers/models/controlnets/controlnet_sd3.py +1 -1
  90. diffusers/models/controlnets/controlnet_sparsectrl.py +2 -2
  91. diffusers/models/controlnets/controlnet_union.py +5 -5
  92. diffusers/models/controlnets/controlnet_xs.py +7 -7
  93. diffusers/models/controlnets/multicontrolnet.py +4 -5
  94. diffusers/models/controlnets/multicontrolnet_union.py +5 -6
  95. diffusers/models/downsampling.py +2 -2
  96. diffusers/models/embeddings.py +36 -46
  97. diffusers/models/embeddings_flax.py +2 -2
  98. diffusers/models/lora.py +3 -3
  99. diffusers/models/model_loading_utils.py +233 -1
  100. diffusers/models/modeling_flax_utils.py +1 -2
  101. diffusers/models/modeling_utils.py +203 -108
  102. diffusers/models/normalization.py +4 -4
  103. diffusers/models/resnet.py +2 -2
  104. diffusers/models/resnet_flax.py +1 -1
  105. diffusers/models/transformers/__init__.py +7 -0
  106. diffusers/models/transformers/auraflow_transformer_2d.py +70 -24
  107. diffusers/models/transformers/cogvideox_transformer_3d.py +1 -1
  108. diffusers/models/transformers/consisid_transformer_3d.py +1 -1
  109. diffusers/models/transformers/dit_transformer_2d.py +2 -2
  110. diffusers/models/transformers/dual_transformer_2d.py +1 -1
  111. diffusers/models/transformers/hunyuan_transformer_2d.py +2 -2
  112. diffusers/models/transformers/latte_transformer_3d.py +4 -5
  113. diffusers/models/transformers/lumina_nextdit2d.py +2 -2
  114. diffusers/models/transformers/pixart_transformer_2d.py +3 -3
  115. diffusers/models/transformers/prior_transformer.py +1 -1
  116. diffusers/models/transformers/sana_transformer.py +8 -3
  117. diffusers/models/transformers/stable_audio_transformer.py +5 -9
  118. diffusers/models/transformers/t5_film_transformer.py +3 -3
  119. diffusers/models/transformers/transformer_2d.py +1 -1
  120. diffusers/models/transformers/transformer_allegro.py +1 -1
  121. diffusers/models/transformers/transformer_chroma.py +641 -0
  122. diffusers/models/transformers/transformer_cogview3plus.py +5 -10
  123. diffusers/models/transformers/transformer_cogview4.py +353 -27
  124. diffusers/models/transformers/transformer_cosmos.py +586 -0
  125. diffusers/models/transformers/transformer_flux.py +376 -138
  126. diffusers/models/transformers/transformer_hidream_image.py +942 -0
  127. diffusers/models/transformers/transformer_hunyuan_video.py +12 -8
  128. diffusers/models/transformers/transformer_hunyuan_video_framepack.py +416 -0
  129. diffusers/models/transformers/transformer_ltx.py +105 -24
  130. diffusers/models/transformers/transformer_lumina2.py +1 -1
  131. diffusers/models/transformers/transformer_mochi.py +1 -1
  132. diffusers/models/transformers/transformer_omnigen.py +2 -2
  133. diffusers/models/transformers/transformer_qwenimage.py +645 -0
  134. diffusers/models/transformers/transformer_sd3.py +7 -7
  135. diffusers/models/transformers/transformer_skyreels_v2.py +607 -0
  136. diffusers/models/transformers/transformer_temporal.py +1 -1
  137. diffusers/models/transformers/transformer_wan.py +316 -87
  138. diffusers/models/transformers/transformer_wan_vace.py +387 -0
  139. diffusers/models/unets/unet_1d.py +1 -1
  140. diffusers/models/unets/unet_1d_blocks.py +1 -1
  141. diffusers/models/unets/unet_2d.py +1 -1
  142. diffusers/models/unets/unet_2d_blocks.py +1 -1
  143. diffusers/models/unets/unet_2d_blocks_flax.py +8 -7
  144. diffusers/models/unets/unet_2d_condition.py +4 -3
  145. diffusers/models/unets/unet_2d_condition_flax.py +2 -2
  146. diffusers/models/unets/unet_3d_blocks.py +1 -1
  147. diffusers/models/unets/unet_3d_condition.py +3 -3
  148. diffusers/models/unets/unet_i2vgen_xl.py +3 -3
  149. diffusers/models/unets/unet_kandinsky3.py +1 -1
  150. diffusers/models/unets/unet_motion_model.py +2 -2
  151. diffusers/models/unets/unet_stable_cascade.py +1 -1
  152. diffusers/models/upsampling.py +2 -2
  153. diffusers/models/vae_flax.py +2 -2
  154. diffusers/models/vq_model.py +1 -1
  155. diffusers/modular_pipelines/__init__.py +83 -0
  156. diffusers/modular_pipelines/components_manager.py +1068 -0
  157. diffusers/modular_pipelines/flux/__init__.py +66 -0
  158. diffusers/modular_pipelines/flux/before_denoise.py +689 -0
  159. diffusers/modular_pipelines/flux/decoders.py +109 -0
  160. diffusers/modular_pipelines/flux/denoise.py +227 -0
  161. diffusers/modular_pipelines/flux/encoders.py +412 -0
  162. diffusers/modular_pipelines/flux/modular_blocks.py +181 -0
  163. diffusers/modular_pipelines/flux/modular_pipeline.py +59 -0
  164. diffusers/modular_pipelines/modular_pipeline.py +2446 -0
  165. diffusers/modular_pipelines/modular_pipeline_utils.py +672 -0
  166. diffusers/modular_pipelines/node_utils.py +665 -0
  167. diffusers/modular_pipelines/stable_diffusion_xl/__init__.py +77 -0
  168. diffusers/modular_pipelines/stable_diffusion_xl/before_denoise.py +1874 -0
  169. diffusers/modular_pipelines/stable_diffusion_xl/decoders.py +208 -0
  170. diffusers/modular_pipelines/stable_diffusion_xl/denoise.py +771 -0
  171. diffusers/modular_pipelines/stable_diffusion_xl/encoders.py +887 -0
  172. diffusers/modular_pipelines/stable_diffusion_xl/modular_blocks.py +380 -0
  173. diffusers/modular_pipelines/stable_diffusion_xl/modular_pipeline.py +365 -0
  174. diffusers/modular_pipelines/wan/__init__.py +66 -0
  175. diffusers/modular_pipelines/wan/before_denoise.py +365 -0
  176. diffusers/modular_pipelines/wan/decoders.py +105 -0
  177. diffusers/modular_pipelines/wan/denoise.py +261 -0
  178. diffusers/modular_pipelines/wan/encoders.py +242 -0
  179. diffusers/modular_pipelines/wan/modular_blocks.py +144 -0
  180. diffusers/modular_pipelines/wan/modular_pipeline.py +90 -0
  181. diffusers/pipelines/__init__.py +68 -6
  182. diffusers/pipelines/allegro/pipeline_allegro.py +11 -11
  183. diffusers/pipelines/amused/pipeline_amused.py +7 -6
  184. diffusers/pipelines/amused/pipeline_amused_img2img.py +6 -5
  185. diffusers/pipelines/amused/pipeline_amused_inpaint.py +6 -5
  186. diffusers/pipelines/animatediff/pipeline_animatediff.py +6 -6
  187. diffusers/pipelines/animatediff/pipeline_animatediff_controlnet.py +6 -6
  188. diffusers/pipelines/animatediff/pipeline_animatediff_sdxl.py +16 -15
  189. diffusers/pipelines/animatediff/pipeline_animatediff_sparsectrl.py +6 -6
  190. diffusers/pipelines/animatediff/pipeline_animatediff_video2video.py +5 -5
  191. diffusers/pipelines/animatediff/pipeline_animatediff_video2video_controlnet.py +5 -5
  192. diffusers/pipelines/audioldm/pipeline_audioldm.py +8 -7
  193. diffusers/pipelines/audioldm2/modeling_audioldm2.py +1 -1
  194. diffusers/pipelines/audioldm2/pipeline_audioldm2.py +22 -13
  195. diffusers/pipelines/aura_flow/pipeline_aura_flow.py +48 -11
  196. diffusers/pipelines/auto_pipeline.py +23 -20
  197. diffusers/pipelines/blip_diffusion/modeling_blip2.py +1 -1
  198. diffusers/pipelines/blip_diffusion/modeling_ctx_clip.py +2 -2
  199. diffusers/pipelines/blip_diffusion/pipeline_blip_diffusion.py +11 -10
  200. diffusers/pipelines/chroma/__init__.py +49 -0
  201. diffusers/pipelines/chroma/pipeline_chroma.py +949 -0
  202. diffusers/pipelines/chroma/pipeline_chroma_img2img.py +1034 -0
  203. diffusers/pipelines/chroma/pipeline_output.py +21 -0
  204. diffusers/pipelines/cogvideo/pipeline_cogvideox.py +17 -16
  205. diffusers/pipelines/cogvideo/pipeline_cogvideox_fun_control.py +17 -16
  206. diffusers/pipelines/cogvideo/pipeline_cogvideox_image2video.py +18 -17
  207. diffusers/pipelines/cogvideo/pipeline_cogvideox_video2video.py +17 -16
  208. diffusers/pipelines/cogview3/pipeline_cogview3plus.py +9 -9
  209. diffusers/pipelines/cogview4/pipeline_cogview4.py +23 -22
  210. diffusers/pipelines/cogview4/pipeline_cogview4_control.py +7 -7
  211. diffusers/pipelines/consisid/consisid_utils.py +2 -2
  212. diffusers/pipelines/consisid/pipeline_consisid.py +8 -8
  213. diffusers/pipelines/consistency_models/pipeline_consistency_models.py +1 -1
  214. diffusers/pipelines/controlnet/pipeline_controlnet.py +7 -7
  215. diffusers/pipelines/controlnet/pipeline_controlnet_blip_diffusion.py +11 -10
  216. diffusers/pipelines/controlnet/pipeline_controlnet_img2img.py +7 -7
  217. diffusers/pipelines/controlnet/pipeline_controlnet_inpaint.py +7 -7
  218. diffusers/pipelines/controlnet/pipeline_controlnet_inpaint_sd_xl.py +14 -14
  219. diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl.py +10 -6
  220. diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl_img2img.py +13 -13
  221. diffusers/pipelines/controlnet/pipeline_controlnet_union_inpaint_sd_xl.py +226 -107
  222. diffusers/pipelines/controlnet/pipeline_controlnet_union_sd_xl.py +12 -8
  223. diffusers/pipelines/controlnet/pipeline_controlnet_union_sd_xl_img2img.py +207 -105
  224. diffusers/pipelines/controlnet/pipeline_flax_controlnet.py +1 -1
  225. diffusers/pipelines/controlnet_hunyuandit/pipeline_hunyuandit_controlnet.py +8 -8
  226. diffusers/pipelines/controlnet_sd3/pipeline_stable_diffusion_3_controlnet.py +7 -7
  227. diffusers/pipelines/controlnet_sd3/pipeline_stable_diffusion_3_controlnet_inpainting.py +7 -7
  228. diffusers/pipelines/controlnet_xs/pipeline_controlnet_xs.py +12 -10
  229. diffusers/pipelines/controlnet_xs/pipeline_controlnet_xs_sd_xl.py +9 -7
  230. diffusers/pipelines/cosmos/__init__.py +54 -0
  231. diffusers/pipelines/cosmos/pipeline_cosmos2_text2image.py +673 -0
  232. diffusers/pipelines/cosmos/pipeline_cosmos2_video2world.py +792 -0
  233. diffusers/pipelines/cosmos/pipeline_cosmos_text2world.py +664 -0
  234. diffusers/pipelines/cosmos/pipeline_cosmos_video2world.py +826 -0
  235. diffusers/pipelines/cosmos/pipeline_output.py +40 -0
  236. diffusers/pipelines/dance_diffusion/pipeline_dance_diffusion.py +5 -4
  237. diffusers/pipelines/ddim/pipeline_ddim.py +4 -4
  238. diffusers/pipelines/ddpm/pipeline_ddpm.py +1 -1
  239. diffusers/pipelines/deepfloyd_if/pipeline_if.py +10 -10
  240. diffusers/pipelines/deepfloyd_if/pipeline_if_img2img.py +10 -10
  241. diffusers/pipelines/deepfloyd_if/pipeline_if_img2img_superresolution.py +10 -10
  242. diffusers/pipelines/deepfloyd_if/pipeline_if_inpainting.py +10 -10
  243. diffusers/pipelines/deepfloyd_if/pipeline_if_inpainting_superresolution.py +10 -10
  244. diffusers/pipelines/deepfloyd_if/pipeline_if_superresolution.py +10 -10
  245. diffusers/pipelines/deprecated/alt_diffusion/pipeline_alt_diffusion.py +8 -8
  246. diffusers/pipelines/deprecated/alt_diffusion/pipeline_alt_diffusion_img2img.py +5 -5
  247. diffusers/pipelines/deprecated/audio_diffusion/mel.py +1 -1
  248. diffusers/pipelines/deprecated/audio_diffusion/pipeline_audio_diffusion.py +3 -3
  249. diffusers/pipelines/deprecated/latent_diffusion_uncond/pipeline_latent_diffusion_uncond.py +1 -1
  250. diffusers/pipelines/deprecated/pndm/pipeline_pndm.py +2 -2
  251. diffusers/pipelines/deprecated/repaint/pipeline_repaint.py +4 -3
  252. diffusers/pipelines/deprecated/score_sde_ve/pipeline_score_sde_ve.py +1 -1
  253. diffusers/pipelines/deprecated/spectrogram_diffusion/continuous_encoder.py +1 -1
  254. diffusers/pipelines/deprecated/spectrogram_diffusion/midi_utils.py +1 -1
  255. diffusers/pipelines/deprecated/spectrogram_diffusion/notes_encoder.py +1 -1
  256. diffusers/pipelines/deprecated/spectrogram_diffusion/pipeline_spectrogram_diffusion.py +1 -1
  257. diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_cycle_diffusion.py +8 -8
  258. diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_onnx_stable_diffusion_inpaint_legacy.py +9 -9
  259. diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_inpaint_legacy.py +10 -10
  260. diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_model_editing.py +10 -8
  261. diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_paradigms.py +5 -5
  262. diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_pix2pix_zero.py +18 -18
  263. diffusers/pipelines/deprecated/stochastic_karras_ve/pipeline_stochastic_karras_ve.py +1 -1
  264. diffusers/pipelines/deprecated/versatile_diffusion/modeling_text_unet.py +2 -2
  265. diffusers/pipelines/deprecated/versatile_diffusion/pipeline_versatile_diffusion.py +6 -6
  266. diffusers/pipelines/deprecated/versatile_diffusion/pipeline_versatile_diffusion_dual_guided.py +5 -5
  267. diffusers/pipelines/deprecated/versatile_diffusion/pipeline_versatile_diffusion_image_variation.py +5 -5
  268. diffusers/pipelines/deprecated/versatile_diffusion/pipeline_versatile_diffusion_text_to_image.py +5 -5
  269. diffusers/pipelines/deprecated/vq_diffusion/pipeline_vq_diffusion.py +1 -1
  270. diffusers/pipelines/dit/pipeline_dit.py +4 -2
  271. diffusers/pipelines/easyanimate/pipeline_easyanimate.py +4 -4
  272. diffusers/pipelines/easyanimate/pipeline_easyanimate_control.py +4 -4
  273. diffusers/pipelines/easyanimate/pipeline_easyanimate_inpaint.py +7 -6
  274. diffusers/pipelines/flux/__init__.py +4 -0
  275. diffusers/pipelines/flux/modeling_flux.py +1 -1
  276. diffusers/pipelines/flux/pipeline_flux.py +37 -36
  277. diffusers/pipelines/flux/pipeline_flux_control.py +9 -9
  278. diffusers/pipelines/flux/pipeline_flux_control_img2img.py +7 -7
  279. diffusers/pipelines/flux/pipeline_flux_control_inpaint.py +7 -7
  280. diffusers/pipelines/flux/pipeline_flux_controlnet.py +7 -7
  281. diffusers/pipelines/flux/pipeline_flux_controlnet_image_to_image.py +31 -23
  282. diffusers/pipelines/flux/pipeline_flux_controlnet_inpainting.py +3 -2
  283. diffusers/pipelines/flux/pipeline_flux_fill.py +7 -7
  284. diffusers/pipelines/flux/pipeline_flux_img2img.py +40 -7
  285. diffusers/pipelines/flux/pipeline_flux_inpaint.py +12 -7
  286. diffusers/pipelines/flux/pipeline_flux_kontext.py +1134 -0
  287. diffusers/pipelines/flux/pipeline_flux_kontext_inpaint.py +1460 -0
  288. diffusers/pipelines/flux/pipeline_flux_prior_redux.py +2 -2
  289. diffusers/pipelines/flux/pipeline_output.py +6 -4
  290. diffusers/pipelines/free_init_utils.py +2 -2
  291. diffusers/pipelines/free_noise_utils.py +3 -3
  292. diffusers/pipelines/hidream_image/__init__.py +47 -0
  293. diffusers/pipelines/hidream_image/pipeline_hidream_image.py +1026 -0
  294. diffusers/pipelines/hidream_image/pipeline_output.py +35 -0
  295. diffusers/pipelines/hunyuan_video/__init__.py +2 -0
  296. diffusers/pipelines/hunyuan_video/pipeline_hunyuan_skyreels_image2video.py +8 -8
  297. diffusers/pipelines/hunyuan_video/pipeline_hunyuan_video.py +26 -25
  298. diffusers/pipelines/hunyuan_video/pipeline_hunyuan_video_framepack.py +1114 -0
  299. diffusers/pipelines/hunyuan_video/pipeline_hunyuan_video_image2video.py +71 -15
  300. diffusers/pipelines/hunyuan_video/pipeline_output.py +19 -0
  301. diffusers/pipelines/hunyuandit/pipeline_hunyuandit.py +8 -8
  302. diffusers/pipelines/i2vgen_xl/pipeline_i2vgen_xl.py +10 -8
  303. diffusers/pipelines/kandinsky/pipeline_kandinsky.py +6 -6
  304. diffusers/pipelines/kandinsky/pipeline_kandinsky_combined.py +34 -34
  305. diffusers/pipelines/kandinsky/pipeline_kandinsky_img2img.py +19 -26
  306. diffusers/pipelines/kandinsky/pipeline_kandinsky_inpaint.py +7 -7
  307. diffusers/pipelines/kandinsky/pipeline_kandinsky_prior.py +11 -11
  308. diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2.py +6 -6
  309. diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_combined.py +35 -35
  310. diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_controlnet.py +6 -6
  311. diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_controlnet_img2img.py +17 -39
  312. diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_img2img.py +17 -45
  313. diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_inpainting.py +7 -7
  314. diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_prior.py +10 -10
  315. diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_prior_emb2emb.py +10 -10
  316. diffusers/pipelines/kandinsky3/pipeline_kandinsky3.py +7 -7
  317. diffusers/pipelines/kandinsky3/pipeline_kandinsky3_img2img.py +17 -38
  318. diffusers/pipelines/kolors/pipeline_kolors.py +10 -10
  319. diffusers/pipelines/kolors/pipeline_kolors_img2img.py +12 -12
  320. diffusers/pipelines/kolors/text_encoder.py +3 -3
  321. diffusers/pipelines/kolors/tokenizer.py +1 -1
  322. diffusers/pipelines/latent_consistency_models/pipeline_latent_consistency_img2img.py +2 -2
  323. diffusers/pipelines/latent_consistency_models/pipeline_latent_consistency_text2img.py +2 -2
  324. diffusers/pipelines/latent_diffusion/pipeline_latent_diffusion.py +1 -1
  325. diffusers/pipelines/latent_diffusion/pipeline_latent_diffusion_superresolution.py +3 -3
  326. diffusers/pipelines/latte/pipeline_latte.py +12 -12
  327. diffusers/pipelines/ledits_pp/pipeline_leditspp_stable_diffusion.py +13 -13
  328. diffusers/pipelines/ledits_pp/pipeline_leditspp_stable_diffusion_xl.py +17 -16
  329. diffusers/pipelines/ltx/__init__.py +4 -0
  330. diffusers/pipelines/ltx/modeling_latent_upsampler.py +188 -0
  331. diffusers/pipelines/ltx/pipeline_ltx.py +64 -18
  332. diffusers/pipelines/ltx/pipeline_ltx_condition.py +117 -38
  333. diffusers/pipelines/ltx/pipeline_ltx_image2video.py +63 -18
  334. diffusers/pipelines/ltx/pipeline_ltx_latent_upsample.py +277 -0
  335. diffusers/pipelines/lumina/pipeline_lumina.py +13 -13
  336. diffusers/pipelines/lumina2/pipeline_lumina2.py +10 -10
  337. diffusers/pipelines/marigold/marigold_image_processing.py +2 -2
  338. diffusers/pipelines/mochi/pipeline_mochi.py +15 -14
  339. diffusers/pipelines/musicldm/pipeline_musicldm.py +16 -13
  340. diffusers/pipelines/omnigen/pipeline_omnigen.py +13 -11
  341. diffusers/pipelines/omnigen/processor_omnigen.py +8 -3
  342. diffusers/pipelines/onnx_utils.py +15 -2
  343. diffusers/pipelines/pag/pag_utils.py +2 -2
  344. diffusers/pipelines/pag/pipeline_pag_controlnet_sd.py +12 -8
  345. diffusers/pipelines/pag/pipeline_pag_controlnet_sd_inpaint.py +7 -7
  346. diffusers/pipelines/pag/pipeline_pag_controlnet_sd_xl.py +10 -6
  347. diffusers/pipelines/pag/pipeline_pag_controlnet_sd_xl_img2img.py +14 -14
  348. diffusers/pipelines/pag/pipeline_pag_hunyuandit.py +8 -8
  349. diffusers/pipelines/pag/pipeline_pag_kolors.py +10 -10
  350. diffusers/pipelines/pag/pipeline_pag_pixart_sigma.py +11 -11
  351. diffusers/pipelines/pag/pipeline_pag_sana.py +18 -12
  352. diffusers/pipelines/pag/pipeline_pag_sd.py +8 -8
  353. diffusers/pipelines/pag/pipeline_pag_sd_3.py +7 -7
  354. diffusers/pipelines/pag/pipeline_pag_sd_3_img2img.py +7 -7
  355. diffusers/pipelines/pag/pipeline_pag_sd_animatediff.py +6 -6
  356. diffusers/pipelines/pag/pipeline_pag_sd_img2img.py +5 -5
  357. diffusers/pipelines/pag/pipeline_pag_sd_inpaint.py +8 -8
  358. diffusers/pipelines/pag/pipeline_pag_sd_xl.py +16 -15
  359. diffusers/pipelines/pag/pipeline_pag_sd_xl_img2img.py +18 -17
  360. diffusers/pipelines/pag/pipeline_pag_sd_xl_inpaint.py +12 -12
  361. diffusers/pipelines/paint_by_example/image_encoder.py +1 -1
  362. diffusers/pipelines/paint_by_example/pipeline_paint_by_example.py +8 -7
  363. diffusers/pipelines/pia/pipeline_pia.py +8 -6
  364. diffusers/pipelines/pipeline_flax_utils.py +5 -6
  365. diffusers/pipelines/pipeline_loading_utils.py +113 -15
  366. diffusers/pipelines/pipeline_utils.py +127 -48
  367. diffusers/pipelines/pixart_alpha/pipeline_pixart_alpha.py +14 -12
  368. diffusers/pipelines/pixart_alpha/pipeline_pixart_sigma.py +31 -11
  369. diffusers/pipelines/qwenimage/__init__.py +55 -0
  370. diffusers/pipelines/qwenimage/pipeline_output.py +21 -0
  371. diffusers/pipelines/qwenimage/pipeline_qwenimage.py +726 -0
  372. diffusers/pipelines/qwenimage/pipeline_qwenimage_edit.py +882 -0
  373. diffusers/pipelines/qwenimage/pipeline_qwenimage_img2img.py +829 -0
  374. diffusers/pipelines/qwenimage/pipeline_qwenimage_inpaint.py +1015 -0
  375. diffusers/pipelines/sana/__init__.py +4 -0
  376. diffusers/pipelines/sana/pipeline_sana.py +23 -21
  377. diffusers/pipelines/sana/pipeline_sana_controlnet.py +1106 -0
  378. diffusers/pipelines/sana/pipeline_sana_sprint.py +23 -19
  379. diffusers/pipelines/sana/pipeline_sana_sprint_img2img.py +981 -0
  380. diffusers/pipelines/semantic_stable_diffusion/pipeline_semantic_stable_diffusion.py +7 -6
  381. diffusers/pipelines/shap_e/camera.py +1 -1
  382. diffusers/pipelines/shap_e/pipeline_shap_e.py +1 -1
  383. diffusers/pipelines/shap_e/pipeline_shap_e_img2img.py +1 -1
  384. diffusers/pipelines/shap_e/renderer.py +3 -3
  385. diffusers/pipelines/skyreels_v2/__init__.py +59 -0
  386. diffusers/pipelines/skyreels_v2/pipeline_output.py +20 -0
  387. diffusers/pipelines/skyreels_v2/pipeline_skyreels_v2.py +610 -0
  388. diffusers/pipelines/skyreels_v2/pipeline_skyreels_v2_diffusion_forcing.py +978 -0
  389. diffusers/pipelines/skyreels_v2/pipeline_skyreels_v2_diffusion_forcing_i2v.py +1059 -0
  390. diffusers/pipelines/skyreels_v2/pipeline_skyreels_v2_diffusion_forcing_v2v.py +1063 -0
  391. diffusers/pipelines/skyreels_v2/pipeline_skyreels_v2_i2v.py +745 -0
  392. diffusers/pipelines/stable_audio/modeling_stable_audio.py +1 -1
  393. diffusers/pipelines/stable_audio/pipeline_stable_audio.py +5 -5
  394. diffusers/pipelines/stable_cascade/pipeline_stable_cascade.py +8 -8
  395. diffusers/pipelines/stable_cascade/pipeline_stable_cascade_combined.py +13 -13
  396. diffusers/pipelines/stable_cascade/pipeline_stable_cascade_prior.py +9 -9
  397. diffusers/pipelines/stable_diffusion/__init__.py +0 -7
  398. diffusers/pipelines/stable_diffusion/clip_image_project_model.py +1 -1
  399. diffusers/pipelines/stable_diffusion/convert_from_ckpt.py +11 -4
  400. diffusers/pipelines/stable_diffusion/pipeline_flax_stable_diffusion.py +1 -1
  401. diffusers/pipelines/stable_diffusion/pipeline_flax_stable_diffusion_img2img.py +1 -1
  402. diffusers/pipelines/stable_diffusion/pipeline_flax_stable_diffusion_inpaint.py +1 -1
  403. diffusers/pipelines/stable_diffusion/pipeline_onnx_stable_diffusion.py +12 -11
  404. diffusers/pipelines/stable_diffusion/pipeline_onnx_stable_diffusion_img2img.py +10 -10
  405. diffusers/pipelines/stable_diffusion/pipeline_onnx_stable_diffusion_inpaint.py +11 -11
  406. diffusers/pipelines/stable_diffusion/pipeline_onnx_stable_diffusion_upscale.py +10 -10
  407. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion.py +10 -9
  408. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_depth2img.py +5 -5
  409. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_image_variation.py +5 -5
  410. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_img2img.py +5 -5
  411. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_inpaint.py +5 -5
  412. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_instruct_pix2pix.py +5 -5
  413. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_latent_upscale.py +4 -4
  414. diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_upscale.py +5 -5
  415. diffusers/pipelines/stable_diffusion/pipeline_stable_unclip.py +7 -7
  416. diffusers/pipelines/stable_diffusion/pipeline_stable_unclip_img2img.py +5 -5
  417. diffusers/pipelines/stable_diffusion/safety_checker.py +1 -1
  418. diffusers/pipelines/stable_diffusion/safety_checker_flax.py +1 -1
  419. diffusers/pipelines/stable_diffusion/stable_unclip_image_normalizer.py +1 -1
  420. diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3.py +13 -12
  421. diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3_img2img.py +7 -7
  422. diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3_inpaint.py +7 -7
  423. diffusers/pipelines/stable_diffusion_attend_and_excite/pipeline_stable_diffusion_attend_and_excite.py +12 -8
  424. diffusers/pipelines/stable_diffusion_diffedit/pipeline_stable_diffusion_diffedit.py +15 -9
  425. diffusers/pipelines/stable_diffusion_gligen/pipeline_stable_diffusion_gligen.py +11 -9
  426. diffusers/pipelines/stable_diffusion_gligen/pipeline_stable_diffusion_gligen_text_image.py +11 -9
  427. diffusers/pipelines/stable_diffusion_k_diffusion/pipeline_stable_diffusion_k_diffusion.py +18 -12
  428. diffusers/pipelines/stable_diffusion_k_diffusion/pipeline_stable_diffusion_xl_k_diffusion.py +11 -8
  429. diffusers/pipelines/stable_diffusion_ldm3d/pipeline_stable_diffusion_ldm3d.py +11 -8
  430. diffusers/pipelines/stable_diffusion_panorama/pipeline_stable_diffusion_panorama.py +15 -12
  431. diffusers/pipelines/stable_diffusion_safe/pipeline_stable_diffusion_safe.py +8 -6
  432. diffusers/pipelines/stable_diffusion_safe/safety_checker.py +1 -1
  433. diffusers/pipelines/stable_diffusion_sag/pipeline_stable_diffusion_sag.py +15 -11
  434. diffusers/pipelines/stable_diffusion_xl/pipeline_flax_stable_diffusion_xl.py +1 -1
  435. diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl.py +16 -15
  436. diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_img2img.py +18 -17
  437. diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_inpaint.py +12 -12
  438. diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_instruct_pix2pix.py +16 -15
  439. diffusers/pipelines/stable_video_diffusion/pipeline_stable_video_diffusion.py +3 -3
  440. diffusers/pipelines/t2i_adapter/pipeline_stable_diffusion_adapter.py +12 -12
  441. diffusers/pipelines/t2i_adapter/pipeline_stable_diffusion_xl_adapter.py +18 -17
  442. diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_synth.py +12 -7
  443. diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_synth_img2img.py +12 -7
  444. diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_zero.py +15 -13
  445. diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_zero_sdxl.py +24 -21
  446. diffusers/pipelines/unclip/pipeline_unclip.py +4 -3
  447. diffusers/pipelines/unclip/pipeline_unclip_image_variation.py +4 -3
  448. diffusers/pipelines/unclip/text_proj.py +2 -2
  449. diffusers/pipelines/unidiffuser/modeling_text_decoder.py +2 -2
  450. diffusers/pipelines/unidiffuser/modeling_uvit.py +1 -1
  451. diffusers/pipelines/unidiffuser/pipeline_unidiffuser.py +8 -7
  452. diffusers/pipelines/visualcloze/__init__.py +52 -0
  453. diffusers/pipelines/visualcloze/pipeline_visualcloze_combined.py +444 -0
  454. diffusers/pipelines/visualcloze/pipeline_visualcloze_generation.py +952 -0
  455. diffusers/pipelines/visualcloze/visualcloze_utils.py +251 -0
  456. diffusers/pipelines/wan/__init__.py +2 -0
  457. diffusers/pipelines/wan/pipeline_wan.py +91 -30
  458. diffusers/pipelines/wan/pipeline_wan_i2v.py +145 -45
  459. diffusers/pipelines/wan/pipeline_wan_vace.py +975 -0
  460. diffusers/pipelines/wan/pipeline_wan_video2video.py +14 -16
  461. diffusers/pipelines/wuerstchen/modeling_paella_vq_model.py +1 -1
  462. diffusers/pipelines/wuerstchen/modeling_wuerstchen_diffnext.py +1 -1
  463. diffusers/pipelines/wuerstchen/modeling_wuerstchen_prior.py +1 -1
  464. diffusers/pipelines/wuerstchen/pipeline_wuerstchen.py +8 -8
  465. diffusers/pipelines/wuerstchen/pipeline_wuerstchen_combined.py +16 -15
  466. diffusers/pipelines/wuerstchen/pipeline_wuerstchen_prior.py +6 -6
  467. diffusers/quantizers/__init__.py +3 -1
  468. diffusers/quantizers/base.py +17 -1
  469. diffusers/quantizers/bitsandbytes/bnb_quantizer.py +4 -0
  470. diffusers/quantizers/bitsandbytes/utils.py +10 -7
  471. diffusers/quantizers/gguf/gguf_quantizer.py +13 -4
  472. diffusers/quantizers/gguf/utils.py +108 -16
  473. diffusers/quantizers/pipe_quant_config.py +202 -0
  474. diffusers/quantizers/quantization_config.py +18 -16
  475. diffusers/quantizers/quanto/quanto_quantizer.py +4 -0
  476. diffusers/quantizers/torchao/torchao_quantizer.py +31 -1
  477. diffusers/schedulers/__init__.py +3 -1
  478. diffusers/schedulers/deprecated/scheduling_karras_ve.py +4 -3
  479. diffusers/schedulers/deprecated/scheduling_sde_vp.py +1 -1
  480. diffusers/schedulers/scheduling_consistency_models.py +1 -1
  481. diffusers/schedulers/scheduling_cosine_dpmsolver_multistep.py +10 -5
  482. diffusers/schedulers/scheduling_ddim.py +8 -8
  483. diffusers/schedulers/scheduling_ddim_cogvideox.py +5 -5
  484. diffusers/schedulers/scheduling_ddim_flax.py +6 -6
  485. diffusers/schedulers/scheduling_ddim_inverse.py +6 -6
  486. diffusers/schedulers/scheduling_ddim_parallel.py +22 -22
  487. diffusers/schedulers/scheduling_ddpm.py +9 -9
  488. diffusers/schedulers/scheduling_ddpm_flax.py +7 -7
  489. diffusers/schedulers/scheduling_ddpm_parallel.py +18 -18
  490. diffusers/schedulers/scheduling_ddpm_wuerstchen.py +2 -2
  491. diffusers/schedulers/scheduling_deis_multistep.py +16 -9
  492. diffusers/schedulers/scheduling_dpm_cogvideox.py +5 -5
  493. diffusers/schedulers/scheduling_dpmsolver_multistep.py +18 -12
  494. diffusers/schedulers/scheduling_dpmsolver_multistep_flax.py +22 -20
  495. diffusers/schedulers/scheduling_dpmsolver_multistep_inverse.py +11 -11
  496. diffusers/schedulers/scheduling_dpmsolver_sde.py +2 -2
  497. diffusers/schedulers/scheduling_dpmsolver_singlestep.py +19 -13
  498. diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py +13 -8
  499. diffusers/schedulers/scheduling_edm_euler.py +20 -11
  500. diffusers/schedulers/scheduling_euler_ancestral_discrete.py +3 -3
  501. diffusers/schedulers/scheduling_euler_discrete.py +3 -3
  502. diffusers/schedulers/scheduling_euler_discrete_flax.py +3 -3
  503. diffusers/schedulers/scheduling_flow_match_euler_discrete.py +20 -5
  504. diffusers/schedulers/scheduling_flow_match_heun_discrete.py +1 -1
  505. diffusers/schedulers/scheduling_flow_match_lcm.py +561 -0
  506. diffusers/schedulers/scheduling_heun_discrete.py +2 -2
  507. diffusers/schedulers/scheduling_ipndm.py +2 -2
  508. diffusers/schedulers/scheduling_k_dpm_2_ancestral_discrete.py +2 -2
  509. diffusers/schedulers/scheduling_k_dpm_2_discrete.py +2 -2
  510. diffusers/schedulers/scheduling_karras_ve_flax.py +5 -5
  511. diffusers/schedulers/scheduling_lcm.py +3 -3
  512. diffusers/schedulers/scheduling_lms_discrete.py +2 -2
  513. diffusers/schedulers/scheduling_lms_discrete_flax.py +1 -1
  514. diffusers/schedulers/scheduling_pndm.py +4 -4
  515. diffusers/schedulers/scheduling_pndm_flax.py +4 -4
  516. diffusers/schedulers/scheduling_repaint.py +9 -9
  517. diffusers/schedulers/scheduling_sasolver.py +15 -15
  518. diffusers/schedulers/scheduling_scm.py +1 -2
  519. diffusers/schedulers/scheduling_sde_ve.py +1 -1
  520. diffusers/schedulers/scheduling_sde_ve_flax.py +2 -2
  521. diffusers/schedulers/scheduling_tcd.py +3 -3
  522. diffusers/schedulers/scheduling_unclip.py +5 -5
  523. diffusers/schedulers/scheduling_unipc_multistep.py +21 -12
  524. diffusers/schedulers/scheduling_utils.py +3 -3
  525. diffusers/schedulers/scheduling_utils_flax.py +2 -2
  526. diffusers/schedulers/scheduling_vq_diffusion.py +1 -1
  527. diffusers/training_utils.py +91 -5
  528. diffusers/utils/__init__.py +15 -0
  529. diffusers/utils/accelerate_utils.py +1 -1
  530. diffusers/utils/constants.py +4 -0
  531. diffusers/utils/doc_utils.py +1 -1
  532. diffusers/utils/dummy_pt_objects.py +432 -0
  533. diffusers/utils/dummy_torch_and_transformers_objects.py +480 -0
  534. diffusers/utils/dynamic_modules_utils.py +85 -8
  535. diffusers/utils/export_utils.py +1 -1
  536. diffusers/utils/hub_utils.py +33 -17
  537. diffusers/utils/import_utils.py +151 -18
  538. diffusers/utils/logging.py +1 -1
  539. diffusers/utils/outputs.py +2 -1
  540. diffusers/utils/peft_utils.py +96 -10
  541. diffusers/utils/state_dict_utils.py +20 -3
  542. diffusers/utils/testing_utils.py +195 -17
  543. diffusers/utils/torch_utils.py +43 -5
  544. diffusers/video_processor.py +2 -2
  545. {diffusers-0.33.1.dist-info → diffusers-0.35.0.dist-info}/METADATA +72 -57
  546. diffusers-0.35.0.dist-info/RECORD +703 -0
  547. {diffusers-0.33.1.dist-info → diffusers-0.35.0.dist-info}/WHEEL +1 -1
  548. diffusers-0.33.1.dist-info/RECORD +0 -608
  549. {diffusers-0.33.1.dist-info → diffusers-0.35.0.dist-info}/LICENSE +0 -0
  550. {diffusers-0.33.1.dist-info → diffusers-0.35.0.dist-info}/entry_points.txt +0 -0
  551. {diffusers-0.33.1.dist-info → diffusers-0.35.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,665 @@
1
+ import json
2
+ import logging
3
+ import os
4
+ from pathlib import Path
5
+ from typing import List, Optional, Tuple, Union
6
+
7
+ import numpy as np
8
+ import PIL
9
+ import torch
10
+
11
+ from ..configuration_utils import ConfigMixin
12
+ from ..image_processor import PipelineImageInput
13
+ from .modular_pipeline import ModularPipelineBlocks, SequentialPipelineBlocks
14
+ from .modular_pipeline_utils import InputParam
15
+
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+ # YiYi Notes: this is actually for SDXL, put it here for now
20
+ SDXL_INPUTS_SCHEMA = {
21
+ "prompt": InputParam(
22
+ "prompt", type_hint=Union[str, List[str]], description="The prompt or prompts to guide the image generation"
23
+ ),
24
+ "prompt_2": InputParam(
25
+ "prompt_2",
26
+ type_hint=Union[str, List[str]],
27
+ description="The prompt or prompts to be sent to the tokenizer_2 and text_encoder_2",
28
+ ),
29
+ "negative_prompt": InputParam(
30
+ "negative_prompt",
31
+ type_hint=Union[str, List[str]],
32
+ description="The prompt or prompts not to guide the image generation",
33
+ ),
34
+ "negative_prompt_2": InputParam(
35
+ "negative_prompt_2",
36
+ type_hint=Union[str, List[str]],
37
+ description="The negative prompt or prompts for text_encoder_2",
38
+ ),
39
+ "cross_attention_kwargs": InputParam(
40
+ "cross_attention_kwargs",
41
+ type_hint=Optional[dict],
42
+ description="Kwargs dictionary passed to the AttentionProcessor",
43
+ ),
44
+ "clip_skip": InputParam(
45
+ "clip_skip", type_hint=Optional[int], description="Number of layers to skip in CLIP text encoder"
46
+ ),
47
+ "image": InputParam(
48
+ "image",
49
+ type_hint=PipelineImageInput,
50
+ required=True,
51
+ description="The image(s) to modify for img2img or inpainting",
52
+ ),
53
+ "mask_image": InputParam(
54
+ "mask_image",
55
+ type_hint=PipelineImageInput,
56
+ required=True,
57
+ description="Mask image for inpainting, white pixels will be repainted",
58
+ ),
59
+ "generator": InputParam(
60
+ "generator",
61
+ type_hint=Optional[Union[torch.Generator, List[torch.Generator]]],
62
+ description="Generator(s) for deterministic generation",
63
+ ),
64
+ "height": InputParam("height", type_hint=Optional[int], description="Height in pixels of the generated image"),
65
+ "width": InputParam("width", type_hint=Optional[int], description="Width in pixels of the generated image"),
66
+ "num_images_per_prompt": InputParam(
67
+ "num_images_per_prompt", type_hint=int, default=1, description="Number of images to generate per prompt"
68
+ ),
69
+ "num_inference_steps": InputParam(
70
+ "num_inference_steps", type_hint=int, default=50, description="Number of denoising steps"
71
+ ),
72
+ "timesteps": InputParam(
73
+ "timesteps", type_hint=Optional[torch.Tensor], description="Custom timesteps for the denoising process"
74
+ ),
75
+ "sigmas": InputParam(
76
+ "sigmas", type_hint=Optional[torch.Tensor], description="Custom sigmas for the denoising process"
77
+ ),
78
+ "denoising_end": InputParam(
79
+ "denoising_end",
80
+ type_hint=Optional[float],
81
+ description="Fraction of denoising process to complete before termination",
82
+ ),
83
+ # YiYi Notes: img2img defaults to 0.3, inpainting defaults to 0.9999
84
+ "strength": InputParam(
85
+ "strength", type_hint=float, default=0.3, description="How much to transform the reference image"
86
+ ),
87
+ "denoising_start": InputParam(
88
+ "denoising_start", type_hint=Optional[float], description="Starting point of the denoising process"
89
+ ),
90
+ "latents": InputParam(
91
+ "latents", type_hint=Optional[torch.Tensor], description="Pre-generated noisy latents for image generation"
92
+ ),
93
+ "padding_mask_crop": InputParam(
94
+ "padding_mask_crop",
95
+ type_hint=Optional[Tuple[int, int]],
96
+ description="Size of margin in crop for image and mask",
97
+ ),
98
+ "original_size": InputParam(
99
+ "original_size",
100
+ type_hint=Optional[Tuple[int, int]],
101
+ description="Original size of the image for SDXL's micro-conditioning",
102
+ ),
103
+ "target_size": InputParam(
104
+ "target_size", type_hint=Optional[Tuple[int, int]], description="Target size for SDXL's micro-conditioning"
105
+ ),
106
+ "negative_original_size": InputParam(
107
+ "negative_original_size",
108
+ type_hint=Optional[Tuple[int, int]],
109
+ description="Negative conditioning based on image resolution",
110
+ ),
111
+ "negative_target_size": InputParam(
112
+ "negative_target_size",
113
+ type_hint=Optional[Tuple[int, int]],
114
+ description="Negative conditioning based on target resolution",
115
+ ),
116
+ "crops_coords_top_left": InputParam(
117
+ "crops_coords_top_left",
118
+ type_hint=Tuple[int, int],
119
+ default=(0, 0),
120
+ description="Top-left coordinates for SDXL's micro-conditioning",
121
+ ),
122
+ "negative_crops_coords_top_left": InputParam(
123
+ "negative_crops_coords_top_left",
124
+ type_hint=Tuple[int, int],
125
+ default=(0, 0),
126
+ description="Negative conditioning crop coordinates",
127
+ ),
128
+ "aesthetic_score": InputParam(
129
+ "aesthetic_score", type_hint=float, default=6.0, description="Simulates aesthetic score of generated image"
130
+ ),
131
+ "negative_aesthetic_score": InputParam(
132
+ "negative_aesthetic_score", type_hint=float, default=2.0, description="Simulates negative aesthetic score"
133
+ ),
134
+ "eta": InputParam("eta", type_hint=float, default=0.0, description="Parameter η in the DDIM paper"),
135
+ "output_type": InputParam(
136
+ "output_type", type_hint=str, default="pil", description="Output format (pil/tensor/np.array)"
137
+ ),
138
+ "ip_adapter_image": InputParam(
139
+ "ip_adapter_image",
140
+ type_hint=PipelineImageInput,
141
+ required=True,
142
+ description="Image(s) to be used as IP adapter",
143
+ ),
144
+ "control_image": InputParam(
145
+ "control_image", type_hint=PipelineImageInput, required=True, description="ControlNet input condition"
146
+ ),
147
+ "control_guidance_start": InputParam(
148
+ "control_guidance_start",
149
+ type_hint=Union[float, List[float]],
150
+ default=0.0,
151
+ description="When ControlNet starts applying",
152
+ ),
153
+ "control_guidance_end": InputParam(
154
+ "control_guidance_end",
155
+ type_hint=Union[float, List[float]],
156
+ default=1.0,
157
+ description="When ControlNet stops applying",
158
+ ),
159
+ "controlnet_conditioning_scale": InputParam(
160
+ "controlnet_conditioning_scale",
161
+ type_hint=Union[float, List[float]],
162
+ default=1.0,
163
+ description="Scale factor for ControlNet outputs",
164
+ ),
165
+ "guess_mode": InputParam(
166
+ "guess_mode",
167
+ type_hint=bool,
168
+ default=False,
169
+ description="Enables ControlNet encoder to recognize input without prompts",
170
+ ),
171
+ "control_mode": InputParam(
172
+ "control_mode", type_hint=List[int], required=True, description="Control mode for union controlnet"
173
+ ),
174
+ }
175
+
176
+ SDXL_INTERMEDIATE_INPUTS_SCHEMA = {
177
+ "prompt_embeds": InputParam(
178
+ "prompt_embeds",
179
+ type_hint=torch.Tensor,
180
+ required=True,
181
+ description="Text embeddings used to guide image generation",
182
+ ),
183
+ "negative_prompt_embeds": InputParam(
184
+ "negative_prompt_embeds", type_hint=torch.Tensor, description="Negative text embeddings"
185
+ ),
186
+ "pooled_prompt_embeds": InputParam(
187
+ "pooled_prompt_embeds", type_hint=torch.Tensor, required=True, description="Pooled text embeddings"
188
+ ),
189
+ "negative_pooled_prompt_embeds": InputParam(
190
+ "negative_pooled_prompt_embeds", type_hint=torch.Tensor, description="Negative pooled text embeddings"
191
+ ),
192
+ "batch_size": InputParam("batch_size", type_hint=int, required=True, description="Number of prompts"),
193
+ "dtype": InputParam("dtype", type_hint=torch.dtype, description="Data type of model tensor inputs"),
194
+ "preprocess_kwargs": InputParam(
195
+ "preprocess_kwargs", type_hint=Optional[dict], description="Kwargs for ImageProcessor"
196
+ ),
197
+ "latents": InputParam(
198
+ "latents", type_hint=torch.Tensor, required=True, description="Initial latents for denoising process"
199
+ ),
200
+ "timesteps": InputParam("timesteps", type_hint=torch.Tensor, required=True, description="Timesteps for inference"),
201
+ "num_inference_steps": InputParam(
202
+ "num_inference_steps", type_hint=int, required=True, description="Number of denoising steps"
203
+ ),
204
+ "latent_timestep": InputParam(
205
+ "latent_timestep", type_hint=torch.Tensor, required=True, description="Initial noise level timestep"
206
+ ),
207
+ "image_latents": InputParam(
208
+ "image_latents", type_hint=torch.Tensor, required=True, description="Latents representing reference image"
209
+ ),
210
+ "mask": InputParam("mask", type_hint=torch.Tensor, required=True, description="Mask for inpainting"),
211
+ "masked_image_latents": InputParam(
212
+ "masked_image_latents", type_hint=torch.Tensor, description="Masked image latents for inpainting"
213
+ ),
214
+ "add_time_ids": InputParam(
215
+ "add_time_ids", type_hint=torch.Tensor, required=True, description="Time ids for conditioning"
216
+ ),
217
+ "negative_add_time_ids": InputParam(
218
+ "negative_add_time_ids", type_hint=torch.Tensor, description="Negative time ids"
219
+ ),
220
+ "timestep_cond": InputParam("timestep_cond", type_hint=torch.Tensor, description="Timestep conditioning for LCM"),
221
+ "noise": InputParam("noise", type_hint=torch.Tensor, description="Noise added to image latents"),
222
+ "crops_coords": InputParam("crops_coords", type_hint=Optional[Tuple[int]], description="Crop coordinates"),
223
+ "ip_adapter_embeds": InputParam(
224
+ "ip_adapter_embeds", type_hint=List[torch.Tensor], description="Image embeddings for IP-Adapter"
225
+ ),
226
+ "negative_ip_adapter_embeds": InputParam(
227
+ "negative_ip_adapter_embeds",
228
+ type_hint=List[torch.Tensor],
229
+ description="Negative image embeddings for IP-Adapter",
230
+ ),
231
+ "images": InputParam(
232
+ "images",
233
+ type_hint=Union[List[PIL.Image.Image], List[torch.Tensor], List[np.array]],
234
+ required=True,
235
+ description="Generated images",
236
+ ),
237
+ }
238
+
239
+ SDXL_PARAM_SCHEMA = {**SDXL_INPUTS_SCHEMA, **SDXL_INTERMEDIATE_INPUTS_SCHEMA}
240
+
241
+
242
+ DEFAULT_PARAM_MAPS = {
243
+ "prompt": {
244
+ "label": "Prompt",
245
+ "type": "string",
246
+ "default": "a bear sitting in a chair drinking a milkshake",
247
+ "display": "textarea",
248
+ },
249
+ "negative_prompt": {
250
+ "label": "Negative Prompt",
251
+ "type": "string",
252
+ "default": "deformed, ugly, wrong proportion, low res, bad anatomy, worst quality, low quality",
253
+ "display": "textarea",
254
+ },
255
+ "num_inference_steps": {
256
+ "label": "Steps",
257
+ "type": "int",
258
+ "default": 25,
259
+ "min": 1,
260
+ "max": 1000,
261
+ },
262
+ "seed": {
263
+ "label": "Seed",
264
+ "type": "int",
265
+ "default": 0,
266
+ "min": 0,
267
+ "display": "random",
268
+ },
269
+ "width": {
270
+ "label": "Width",
271
+ "type": "int",
272
+ "display": "text",
273
+ "default": 1024,
274
+ "min": 8,
275
+ "max": 8192,
276
+ "step": 8,
277
+ "group": "dimensions",
278
+ },
279
+ "height": {
280
+ "label": "Height",
281
+ "type": "int",
282
+ "display": "text",
283
+ "default": 1024,
284
+ "min": 8,
285
+ "max": 8192,
286
+ "step": 8,
287
+ "group": "dimensions",
288
+ },
289
+ "images": {
290
+ "label": "Images",
291
+ "type": "image",
292
+ "display": "output",
293
+ },
294
+ "image": {
295
+ "label": "Image",
296
+ "type": "image",
297
+ "display": "input",
298
+ },
299
+ }
300
+
301
+ DEFAULT_TYPE_MAPS = {
302
+ "int": {
303
+ "type": "int",
304
+ "default": 0,
305
+ "min": 0,
306
+ },
307
+ "float": {
308
+ "type": "float",
309
+ "default": 0.0,
310
+ "min": 0.0,
311
+ },
312
+ "str": {
313
+ "type": "string",
314
+ "default": "",
315
+ },
316
+ "bool": {
317
+ "type": "boolean",
318
+ "default": False,
319
+ },
320
+ "image": {
321
+ "type": "image",
322
+ },
323
+ }
324
+
325
+ DEFAULT_MODEL_KEYS = ["unet", "vae", "text_encoder", "tokenizer", "controlnet", "transformer", "image_encoder"]
326
+ DEFAULT_CATEGORY = "Modular Diffusers"
327
+ DEFAULT_EXCLUDE_MODEL_KEYS = ["processor", "feature_extractor", "safety_checker"]
328
+ DEFAULT_PARAMS_GROUPS_KEYS = {
329
+ "text_encoders": ["text_encoder", "tokenizer"],
330
+ "ip_adapter_embeds": ["ip_adapter_embeds"],
331
+ "prompt_embeddings": ["prompt_embeds"],
332
+ }
333
+
334
+
335
+ def get_group_name(name, group_params_keys=DEFAULT_PARAMS_GROUPS_KEYS):
336
+ """
337
+ Get the group name for a given parameter name, if not part of a group, return None e.g. "prompt_embeds" ->
338
+ "text_embeds", "text_encoder" -> "text_encoders", "prompt" -> None
339
+ """
340
+ if name is None:
341
+ return None
342
+ for group_name, group_keys in group_params_keys.items():
343
+ for group_key in group_keys:
344
+ if group_key in name:
345
+ return group_name
346
+ return None
347
+
348
+
349
+ class ModularNode(ConfigMixin):
350
+ """
351
+ A ModularNode is a base class to build UI nodes using diffusers. Currently only supports Mellon. It is a wrapper
352
+ around a ModularPipelineBlocks object.
353
+
354
+ <Tip warning={true}>
355
+
356
+ This is an experimental feature and is likely to change in the future.
357
+
358
+ </Tip>
359
+ """
360
+
361
+ config_name = "node_config.json"
362
+
363
+ @classmethod
364
+ def from_pretrained(
365
+ cls,
366
+ pretrained_model_name_or_path: str,
367
+ trust_remote_code: Optional[bool] = None,
368
+ **kwargs,
369
+ ):
370
+ blocks = ModularPipelineBlocks.from_pretrained(
371
+ pretrained_model_name_or_path, trust_remote_code=trust_remote_code, **kwargs
372
+ )
373
+ return cls(blocks, **kwargs)
374
+
375
+ def __init__(self, blocks, category=DEFAULT_CATEGORY, label=None, **kwargs):
376
+ self.blocks = blocks
377
+
378
+ if label is None:
379
+ label = self.blocks.__class__.__name__
380
+ # blocks param name -> mellon param name
381
+ self.name_mapping = {}
382
+
383
+ input_params = {}
384
+ # pass or create a default param dict for each input
385
+ # e.g. for prompt,
386
+ # prompt = {
387
+ # "name": "text_input", # the name of the input in node defination, could be different from the input name in diffusers
388
+ # "label": "Prompt",
389
+ # "type": "string",
390
+ # "default": "a bear sitting in a chair drinking a milkshake",
391
+ # "display": "textarea"}
392
+ # if type is not specified, it'll be a "custom" param of its own type
393
+ # e.g. you can pass ModularNode(scheduler = {name :"scheduler"})
394
+ # it will get this spec in node defination {"scheduler": {"label": "Scheduler", "type": "scheduler", "display": "input"}}
395
+ # name can be a dict, in that case, it is part of a "dict" input in mellon nodes, e.g. text_encoder= {name: {"text_encoders": "text_encoder"}}
396
+ inputs = self.blocks.inputs + self.blocks.intermediate_inputs
397
+ for inp in inputs:
398
+ param = kwargs.pop(inp.name, None)
399
+ if param:
400
+ # user can pass a param dict for all inputs, e.g. ModularNode(prompt = {...})
401
+ input_params[inp.name] = param
402
+ mellon_name = param.pop("name", inp.name)
403
+ if mellon_name != inp.name:
404
+ self.name_mapping[inp.name] = mellon_name
405
+ continue
406
+
407
+ if inp.name not in DEFAULT_PARAM_MAPS and not inp.required and not get_group_name(inp.name):
408
+ continue
409
+
410
+ if inp.name in DEFAULT_PARAM_MAPS:
411
+ # first check if it's in the default param map, if so, directly use that
412
+ param = DEFAULT_PARAM_MAPS[inp.name].copy()
413
+ elif get_group_name(inp.name):
414
+ param = get_group_name(inp.name)
415
+ if inp.name not in self.name_mapping:
416
+ self.name_mapping[inp.name] = param
417
+ else:
418
+ # if not, check if it's in the SDXL input schema, if so,
419
+ # 1. use the type hint to determine the type
420
+ # 2. use the default param dict for the type e.g. if "steps" is a "int" type, {"steps": {"type": "int", "default": 0, "min": 0}}
421
+ if inp.type_hint is not None:
422
+ type_str = str(inp.type_hint).lower()
423
+ else:
424
+ inp_spec = SDXL_PARAM_SCHEMA.get(inp.name, None)
425
+ type_str = str(inp_spec.type_hint).lower() if inp_spec else ""
426
+ for type_key, type_param in DEFAULT_TYPE_MAPS.items():
427
+ if type_key in type_str:
428
+ param = type_param.copy()
429
+ param["label"] = inp.name
430
+ param["display"] = "input"
431
+ break
432
+ else:
433
+ param = inp.name
434
+ # add the param dict to the inp_params dict
435
+ input_params[inp.name] = param
436
+
437
+ component_params = {}
438
+ for comp in self.blocks.expected_components:
439
+ param = kwargs.pop(comp.name, None)
440
+ if param:
441
+ component_params[comp.name] = param
442
+ mellon_name = param.pop("name", comp.name)
443
+ if mellon_name != comp.name:
444
+ self.name_mapping[comp.name] = mellon_name
445
+ continue
446
+
447
+ to_exclude = False
448
+ for exclude_key in DEFAULT_EXCLUDE_MODEL_KEYS:
449
+ if exclude_key in comp.name:
450
+ to_exclude = True
451
+ break
452
+ if to_exclude:
453
+ continue
454
+
455
+ if get_group_name(comp.name):
456
+ param = get_group_name(comp.name)
457
+ if comp.name not in self.name_mapping:
458
+ self.name_mapping[comp.name] = param
459
+ elif comp.name in DEFAULT_MODEL_KEYS:
460
+ param = {"label": comp.name, "type": "diffusers_auto_model", "display": "input"}
461
+ else:
462
+ param = comp.name
463
+ # add the param dict to the model_params dict
464
+ component_params[comp.name] = param
465
+
466
+ output_params = {}
467
+ if isinstance(self.blocks, SequentialPipelineBlocks):
468
+ last_block_name = list(self.blocks.sub_blocks.keys())[-1]
469
+ outputs = self.blocks.sub_blocks[last_block_name].intermediate_outputs
470
+ else:
471
+ outputs = self.blocks.intermediate_outputs
472
+
473
+ for out in outputs:
474
+ param = kwargs.pop(out.name, None)
475
+ if param:
476
+ output_params[out.name] = param
477
+ mellon_name = param.pop("name", out.name)
478
+ if mellon_name != out.name:
479
+ self.name_mapping[out.name] = mellon_name
480
+ continue
481
+
482
+ if out.name in DEFAULT_PARAM_MAPS:
483
+ param = DEFAULT_PARAM_MAPS[out.name].copy()
484
+ param["display"] = "output"
485
+ else:
486
+ group_name = get_group_name(out.name)
487
+ if group_name:
488
+ param = group_name
489
+ if out.name not in self.name_mapping:
490
+ self.name_mapping[out.name] = param
491
+ else:
492
+ param = out.name
493
+ # add the param dict to the outputs dict
494
+ output_params[out.name] = param
495
+
496
+ if len(kwargs) > 0:
497
+ logger.warning(f"Unused kwargs: {kwargs}")
498
+
499
+ register_dict = {
500
+ "category": category,
501
+ "label": label,
502
+ "input_params": input_params,
503
+ "component_params": component_params,
504
+ "output_params": output_params,
505
+ "name_mapping": self.name_mapping,
506
+ }
507
+ self.register_to_config(**register_dict)
508
+
509
+ def setup(self, components_manager, collection=None):
510
+ self.pipeline = self.blocks.init_pipeline(components_manager=components_manager, collection=collection)
511
+ self._components_manager = components_manager
512
+
513
+ @property
514
+ def mellon_config(self):
515
+ return self._convert_to_mellon_config()
516
+
517
+ def _convert_to_mellon_config(self):
518
+ node = {}
519
+ node["label"] = self.config.label
520
+ node["category"] = self.config.category
521
+
522
+ node_param = {}
523
+ for inp_name, inp_param in self.config.input_params.items():
524
+ if inp_name in self.name_mapping:
525
+ mellon_name = self.name_mapping[inp_name]
526
+ else:
527
+ mellon_name = inp_name
528
+ if isinstance(inp_param, str):
529
+ param = {
530
+ "label": inp_param,
531
+ "type": inp_param,
532
+ "display": "input",
533
+ }
534
+ else:
535
+ param = inp_param
536
+
537
+ if mellon_name not in node_param:
538
+ node_param[mellon_name] = param
539
+ else:
540
+ logger.debug(f"Input param {mellon_name} already exists in node_param, skipping {inp_name}")
541
+
542
+ for comp_name, comp_param in self.config.component_params.items():
543
+ if comp_name in self.name_mapping:
544
+ mellon_name = self.name_mapping[comp_name]
545
+ else:
546
+ mellon_name = comp_name
547
+ if isinstance(comp_param, str):
548
+ param = {
549
+ "label": comp_param,
550
+ "type": comp_param,
551
+ "display": "input",
552
+ }
553
+ else:
554
+ param = comp_param
555
+
556
+ if mellon_name not in node_param:
557
+ node_param[mellon_name] = param
558
+ else:
559
+ logger.debug(f"Component param {comp_param} already exists in node_param, skipping {comp_name}")
560
+
561
+ for out_name, out_param in self.config.output_params.items():
562
+ if out_name in self.name_mapping:
563
+ mellon_name = self.name_mapping[out_name]
564
+ else:
565
+ mellon_name = out_name
566
+ if isinstance(out_param, str):
567
+ param = {
568
+ "label": out_param,
569
+ "type": out_param,
570
+ "display": "output",
571
+ }
572
+ else:
573
+ param = out_param
574
+
575
+ if mellon_name not in node_param:
576
+ node_param[mellon_name] = param
577
+ else:
578
+ logger.debug(f"Output param {out_param} already exists in node_param, skipping {out_name}")
579
+ node["params"] = node_param
580
+ return node
581
+
582
+ def save_mellon_config(self, file_path):
583
+ """
584
+ Save the Mellon configuration to a JSON file.
585
+
586
+ Args:
587
+ file_path (str or Path): Path where the JSON file will be saved
588
+
589
+ Returns:
590
+ Path: Path to the saved config file
591
+ """
592
+ file_path = Path(file_path)
593
+
594
+ # Create directory if it doesn't exist
595
+ os.makedirs(file_path.parent, exist_ok=True)
596
+
597
+ # Create a combined dictionary with module definition and name mapping
598
+ config = {"module": self.mellon_config, "name_mapping": self.name_mapping}
599
+
600
+ # Save the config to file
601
+ with open(file_path, "w", encoding="utf-8") as f:
602
+ json.dump(config, f, indent=2)
603
+
604
+ logger.info(f"Mellon config and name mapping saved to {file_path}")
605
+
606
+ return file_path
607
+
608
+ @classmethod
609
+ def load_mellon_config(cls, file_path):
610
+ """
611
+ Load a Mellon configuration from a JSON file.
612
+
613
+ Args:
614
+ file_path (str or Path): Path to the JSON file containing Mellon config
615
+
616
+ Returns:
617
+ dict: The loaded combined configuration containing 'module' and 'name_mapping'
618
+ """
619
+ file_path = Path(file_path)
620
+
621
+ if not file_path.exists():
622
+ raise FileNotFoundError(f"Config file not found: {file_path}")
623
+
624
+ with open(file_path, "r", encoding="utf-8") as f:
625
+ config = json.load(f)
626
+
627
+ logger.info(f"Mellon config loaded from {file_path}")
628
+
629
+ return config
630
+
631
+ def process_inputs(self, **kwargs):
632
+ params_components = {}
633
+ for comp_name, comp_param in self.config.component_params.items():
634
+ logger.debug(f"component: {comp_name}")
635
+ mellon_comp_name = self.name_mapping.get(comp_name, comp_name)
636
+ if mellon_comp_name in kwargs:
637
+ if isinstance(kwargs[mellon_comp_name], dict) and comp_name in kwargs[mellon_comp_name]:
638
+ comp = kwargs[mellon_comp_name].pop(comp_name)
639
+ else:
640
+ comp = kwargs.pop(mellon_comp_name)
641
+ if comp:
642
+ params_components[comp_name] = self._components_manager.get_one(comp["model_id"])
643
+
644
+ params_run = {}
645
+ for inp_name, inp_param in self.config.input_params.items():
646
+ logger.debug(f"input: {inp_name}")
647
+ mellon_inp_name = self.name_mapping.get(inp_name, inp_name)
648
+ if mellon_inp_name in kwargs:
649
+ if isinstance(kwargs[mellon_inp_name], dict) and inp_name in kwargs[mellon_inp_name]:
650
+ inp = kwargs[mellon_inp_name].pop(inp_name)
651
+ else:
652
+ inp = kwargs.pop(mellon_inp_name)
653
+ if inp is not None:
654
+ params_run[inp_name] = inp
655
+
656
+ return_output_names = list(self.config.output_params.keys())
657
+
658
+ return params_components, params_run, return_output_names
659
+
660
+ def execute(self, **kwargs):
661
+ params_components, params_run, return_output_names = self.process_inputs(**kwargs)
662
+
663
+ self.pipeline.update_components(**params_components)
664
+ output = self.pipeline(**params_run, output=return_output_names)
665
+ return output