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.
- diffusers/__init__.py +145 -1
- diffusers/callbacks.py +35 -0
- diffusers/commands/__init__.py +1 -1
- diffusers/commands/custom_blocks.py +134 -0
- diffusers/commands/diffusers_cli.py +3 -1
- diffusers/commands/env.py +1 -1
- diffusers/commands/fp16_safetensors.py +2 -2
- diffusers/configuration_utils.py +11 -2
- diffusers/dependency_versions_check.py +1 -1
- diffusers/dependency_versions_table.py +3 -3
- diffusers/experimental/rl/value_guided_sampling.py +1 -1
- diffusers/guiders/__init__.py +41 -0
- diffusers/guiders/adaptive_projected_guidance.py +188 -0
- diffusers/guiders/auto_guidance.py +190 -0
- diffusers/guiders/classifier_free_guidance.py +141 -0
- diffusers/guiders/classifier_free_zero_star_guidance.py +152 -0
- diffusers/guiders/frequency_decoupled_guidance.py +327 -0
- diffusers/guiders/guider_utils.py +309 -0
- diffusers/guiders/perturbed_attention_guidance.py +271 -0
- diffusers/guiders/skip_layer_guidance.py +262 -0
- diffusers/guiders/smoothed_energy_guidance.py +251 -0
- diffusers/guiders/tangential_classifier_free_guidance.py +143 -0
- diffusers/hooks/__init__.py +17 -0
- diffusers/hooks/_common.py +56 -0
- diffusers/hooks/_helpers.py +293 -0
- diffusers/hooks/faster_cache.py +9 -8
- diffusers/hooks/first_block_cache.py +259 -0
- diffusers/hooks/group_offloading.py +332 -227
- diffusers/hooks/hooks.py +58 -3
- diffusers/hooks/layer_skip.py +263 -0
- diffusers/hooks/layerwise_casting.py +5 -10
- diffusers/hooks/pyramid_attention_broadcast.py +15 -12
- diffusers/hooks/smoothed_energy_guidance_utils.py +167 -0
- diffusers/hooks/utils.py +43 -0
- diffusers/image_processor.py +7 -2
- diffusers/loaders/__init__.py +10 -0
- diffusers/loaders/ip_adapter.py +260 -18
- diffusers/loaders/lora_base.py +261 -127
- diffusers/loaders/lora_conversion_utils.py +657 -35
- diffusers/loaders/lora_pipeline.py +2778 -1246
- diffusers/loaders/peft.py +78 -112
- diffusers/loaders/single_file.py +2 -2
- diffusers/loaders/single_file_model.py +64 -15
- diffusers/loaders/single_file_utils.py +395 -7
- diffusers/loaders/textual_inversion.py +3 -2
- diffusers/loaders/transformer_flux.py +10 -11
- diffusers/loaders/transformer_sd3.py +8 -3
- diffusers/loaders/unet.py +24 -21
- diffusers/loaders/unet_loader_utils.py +6 -3
- diffusers/loaders/utils.py +1 -1
- diffusers/models/__init__.py +23 -1
- diffusers/models/activations.py +5 -5
- diffusers/models/adapter.py +2 -3
- diffusers/models/attention.py +488 -7
- diffusers/models/attention_dispatch.py +1218 -0
- diffusers/models/attention_flax.py +10 -10
- diffusers/models/attention_processor.py +113 -667
- diffusers/models/auto_model.py +49 -12
- diffusers/models/autoencoders/__init__.py +2 -0
- diffusers/models/autoencoders/autoencoder_asym_kl.py +4 -4
- diffusers/models/autoencoders/autoencoder_dc.py +17 -4
- diffusers/models/autoencoders/autoencoder_kl.py +5 -5
- diffusers/models/autoencoders/autoencoder_kl_allegro.py +4 -4
- diffusers/models/autoencoders/autoencoder_kl_cogvideox.py +6 -6
- diffusers/models/autoencoders/autoencoder_kl_cosmos.py +1110 -0
- diffusers/models/autoencoders/autoencoder_kl_hunyuan_video.py +2 -2
- diffusers/models/autoencoders/autoencoder_kl_ltx.py +3 -3
- diffusers/models/autoencoders/autoencoder_kl_magvit.py +4 -4
- diffusers/models/autoencoders/autoencoder_kl_mochi.py +3 -3
- diffusers/models/autoencoders/autoencoder_kl_qwenimage.py +1070 -0
- diffusers/models/autoencoders/autoencoder_kl_temporal_decoder.py +4 -4
- diffusers/models/autoencoders/autoencoder_kl_wan.py +626 -62
- diffusers/models/autoencoders/autoencoder_oobleck.py +1 -1
- diffusers/models/autoencoders/autoencoder_tiny.py +3 -3
- diffusers/models/autoencoders/consistency_decoder_vae.py +1 -1
- diffusers/models/autoencoders/vae.py +13 -2
- diffusers/models/autoencoders/vq_model.py +2 -2
- diffusers/models/cache_utils.py +32 -10
- diffusers/models/controlnet.py +1 -1
- diffusers/models/controlnet_flux.py +1 -1
- diffusers/models/controlnet_sd3.py +1 -1
- diffusers/models/controlnet_sparsectrl.py +1 -1
- diffusers/models/controlnets/__init__.py +1 -0
- diffusers/models/controlnets/controlnet.py +3 -3
- diffusers/models/controlnets/controlnet_flax.py +1 -1
- diffusers/models/controlnets/controlnet_flux.py +21 -20
- diffusers/models/controlnets/controlnet_hunyuan.py +2 -2
- diffusers/models/controlnets/controlnet_sana.py +290 -0
- diffusers/models/controlnets/controlnet_sd3.py +1 -1
- diffusers/models/controlnets/controlnet_sparsectrl.py +2 -2
- diffusers/models/controlnets/controlnet_union.py +5 -5
- diffusers/models/controlnets/controlnet_xs.py +7 -7
- diffusers/models/controlnets/multicontrolnet.py +4 -5
- diffusers/models/controlnets/multicontrolnet_union.py +5 -6
- diffusers/models/downsampling.py +2 -2
- diffusers/models/embeddings.py +36 -46
- diffusers/models/embeddings_flax.py +2 -2
- diffusers/models/lora.py +3 -3
- diffusers/models/model_loading_utils.py +233 -1
- diffusers/models/modeling_flax_utils.py +1 -2
- diffusers/models/modeling_utils.py +203 -108
- diffusers/models/normalization.py +4 -4
- diffusers/models/resnet.py +2 -2
- diffusers/models/resnet_flax.py +1 -1
- diffusers/models/transformers/__init__.py +7 -0
- diffusers/models/transformers/auraflow_transformer_2d.py +70 -24
- diffusers/models/transformers/cogvideox_transformer_3d.py +1 -1
- diffusers/models/transformers/consisid_transformer_3d.py +1 -1
- diffusers/models/transformers/dit_transformer_2d.py +2 -2
- diffusers/models/transformers/dual_transformer_2d.py +1 -1
- diffusers/models/transformers/hunyuan_transformer_2d.py +2 -2
- diffusers/models/transformers/latte_transformer_3d.py +4 -5
- diffusers/models/transformers/lumina_nextdit2d.py +2 -2
- diffusers/models/transformers/pixart_transformer_2d.py +3 -3
- diffusers/models/transformers/prior_transformer.py +1 -1
- diffusers/models/transformers/sana_transformer.py +8 -3
- diffusers/models/transformers/stable_audio_transformer.py +5 -9
- diffusers/models/transformers/t5_film_transformer.py +3 -3
- diffusers/models/transformers/transformer_2d.py +1 -1
- diffusers/models/transformers/transformer_allegro.py +1 -1
- diffusers/models/transformers/transformer_chroma.py +641 -0
- diffusers/models/transformers/transformer_cogview3plus.py +5 -10
- diffusers/models/transformers/transformer_cogview4.py +353 -27
- diffusers/models/transformers/transformer_cosmos.py +586 -0
- diffusers/models/transformers/transformer_flux.py +376 -138
- diffusers/models/transformers/transformer_hidream_image.py +942 -0
- diffusers/models/transformers/transformer_hunyuan_video.py +12 -8
- diffusers/models/transformers/transformer_hunyuan_video_framepack.py +416 -0
- diffusers/models/transformers/transformer_ltx.py +105 -24
- diffusers/models/transformers/transformer_lumina2.py +1 -1
- diffusers/models/transformers/transformer_mochi.py +1 -1
- diffusers/models/transformers/transformer_omnigen.py +2 -2
- diffusers/models/transformers/transformer_qwenimage.py +645 -0
- diffusers/models/transformers/transformer_sd3.py +7 -7
- diffusers/models/transformers/transformer_skyreels_v2.py +607 -0
- diffusers/models/transformers/transformer_temporal.py +1 -1
- diffusers/models/transformers/transformer_wan.py +316 -87
- diffusers/models/transformers/transformer_wan_vace.py +387 -0
- diffusers/models/unets/unet_1d.py +1 -1
- diffusers/models/unets/unet_1d_blocks.py +1 -1
- diffusers/models/unets/unet_2d.py +1 -1
- diffusers/models/unets/unet_2d_blocks.py +1 -1
- diffusers/models/unets/unet_2d_blocks_flax.py +8 -7
- diffusers/models/unets/unet_2d_condition.py +4 -3
- diffusers/models/unets/unet_2d_condition_flax.py +2 -2
- diffusers/models/unets/unet_3d_blocks.py +1 -1
- diffusers/models/unets/unet_3d_condition.py +3 -3
- diffusers/models/unets/unet_i2vgen_xl.py +3 -3
- diffusers/models/unets/unet_kandinsky3.py +1 -1
- diffusers/models/unets/unet_motion_model.py +2 -2
- diffusers/models/unets/unet_stable_cascade.py +1 -1
- diffusers/models/upsampling.py +2 -2
- diffusers/models/vae_flax.py +2 -2
- diffusers/models/vq_model.py +1 -1
- diffusers/modular_pipelines/__init__.py +83 -0
- diffusers/modular_pipelines/components_manager.py +1068 -0
- diffusers/modular_pipelines/flux/__init__.py +66 -0
- diffusers/modular_pipelines/flux/before_denoise.py +689 -0
- diffusers/modular_pipelines/flux/decoders.py +109 -0
- diffusers/modular_pipelines/flux/denoise.py +227 -0
- diffusers/modular_pipelines/flux/encoders.py +412 -0
- diffusers/modular_pipelines/flux/modular_blocks.py +181 -0
- diffusers/modular_pipelines/flux/modular_pipeline.py +59 -0
- diffusers/modular_pipelines/modular_pipeline.py +2446 -0
- diffusers/modular_pipelines/modular_pipeline_utils.py +672 -0
- diffusers/modular_pipelines/node_utils.py +665 -0
- diffusers/modular_pipelines/stable_diffusion_xl/__init__.py +77 -0
- diffusers/modular_pipelines/stable_diffusion_xl/before_denoise.py +1874 -0
- diffusers/modular_pipelines/stable_diffusion_xl/decoders.py +208 -0
- diffusers/modular_pipelines/stable_diffusion_xl/denoise.py +771 -0
- diffusers/modular_pipelines/stable_diffusion_xl/encoders.py +887 -0
- diffusers/modular_pipelines/stable_diffusion_xl/modular_blocks.py +380 -0
- diffusers/modular_pipelines/stable_diffusion_xl/modular_pipeline.py +365 -0
- diffusers/modular_pipelines/wan/__init__.py +66 -0
- diffusers/modular_pipelines/wan/before_denoise.py +365 -0
- diffusers/modular_pipelines/wan/decoders.py +105 -0
- diffusers/modular_pipelines/wan/denoise.py +261 -0
- diffusers/modular_pipelines/wan/encoders.py +242 -0
- diffusers/modular_pipelines/wan/modular_blocks.py +144 -0
- diffusers/modular_pipelines/wan/modular_pipeline.py +90 -0
- diffusers/pipelines/__init__.py +68 -6
- diffusers/pipelines/allegro/pipeline_allegro.py +11 -11
- diffusers/pipelines/amused/pipeline_amused.py +7 -6
- diffusers/pipelines/amused/pipeline_amused_img2img.py +6 -5
- diffusers/pipelines/amused/pipeline_amused_inpaint.py +6 -5
- diffusers/pipelines/animatediff/pipeline_animatediff.py +6 -6
- diffusers/pipelines/animatediff/pipeline_animatediff_controlnet.py +6 -6
- diffusers/pipelines/animatediff/pipeline_animatediff_sdxl.py +16 -15
- diffusers/pipelines/animatediff/pipeline_animatediff_sparsectrl.py +6 -6
- diffusers/pipelines/animatediff/pipeline_animatediff_video2video.py +5 -5
- diffusers/pipelines/animatediff/pipeline_animatediff_video2video_controlnet.py +5 -5
- diffusers/pipelines/audioldm/pipeline_audioldm.py +8 -7
- diffusers/pipelines/audioldm2/modeling_audioldm2.py +1 -1
- diffusers/pipelines/audioldm2/pipeline_audioldm2.py +22 -13
- diffusers/pipelines/aura_flow/pipeline_aura_flow.py +48 -11
- diffusers/pipelines/auto_pipeline.py +23 -20
- diffusers/pipelines/blip_diffusion/modeling_blip2.py +1 -1
- diffusers/pipelines/blip_diffusion/modeling_ctx_clip.py +2 -2
- diffusers/pipelines/blip_diffusion/pipeline_blip_diffusion.py +11 -10
- diffusers/pipelines/chroma/__init__.py +49 -0
- diffusers/pipelines/chroma/pipeline_chroma.py +949 -0
- diffusers/pipelines/chroma/pipeline_chroma_img2img.py +1034 -0
- diffusers/pipelines/chroma/pipeline_output.py +21 -0
- diffusers/pipelines/cogvideo/pipeline_cogvideox.py +17 -16
- diffusers/pipelines/cogvideo/pipeline_cogvideox_fun_control.py +17 -16
- diffusers/pipelines/cogvideo/pipeline_cogvideox_image2video.py +18 -17
- diffusers/pipelines/cogvideo/pipeline_cogvideox_video2video.py +17 -16
- diffusers/pipelines/cogview3/pipeline_cogview3plus.py +9 -9
- diffusers/pipelines/cogview4/pipeline_cogview4.py +23 -22
- diffusers/pipelines/cogview4/pipeline_cogview4_control.py +7 -7
- diffusers/pipelines/consisid/consisid_utils.py +2 -2
- diffusers/pipelines/consisid/pipeline_consisid.py +8 -8
- diffusers/pipelines/consistency_models/pipeline_consistency_models.py +1 -1
- diffusers/pipelines/controlnet/pipeline_controlnet.py +7 -7
- diffusers/pipelines/controlnet/pipeline_controlnet_blip_diffusion.py +11 -10
- diffusers/pipelines/controlnet/pipeline_controlnet_img2img.py +7 -7
- diffusers/pipelines/controlnet/pipeline_controlnet_inpaint.py +7 -7
- diffusers/pipelines/controlnet/pipeline_controlnet_inpaint_sd_xl.py +14 -14
- diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl.py +10 -6
- diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl_img2img.py +13 -13
- diffusers/pipelines/controlnet/pipeline_controlnet_union_inpaint_sd_xl.py +226 -107
- diffusers/pipelines/controlnet/pipeline_controlnet_union_sd_xl.py +12 -8
- diffusers/pipelines/controlnet/pipeline_controlnet_union_sd_xl_img2img.py +207 -105
- diffusers/pipelines/controlnet/pipeline_flax_controlnet.py +1 -1
- diffusers/pipelines/controlnet_hunyuandit/pipeline_hunyuandit_controlnet.py +8 -8
- diffusers/pipelines/controlnet_sd3/pipeline_stable_diffusion_3_controlnet.py +7 -7
- diffusers/pipelines/controlnet_sd3/pipeline_stable_diffusion_3_controlnet_inpainting.py +7 -7
- diffusers/pipelines/controlnet_xs/pipeline_controlnet_xs.py +12 -10
- diffusers/pipelines/controlnet_xs/pipeline_controlnet_xs_sd_xl.py +9 -7
- diffusers/pipelines/cosmos/__init__.py +54 -0
- diffusers/pipelines/cosmos/pipeline_cosmos2_text2image.py +673 -0
- diffusers/pipelines/cosmos/pipeline_cosmos2_video2world.py +792 -0
- diffusers/pipelines/cosmos/pipeline_cosmos_text2world.py +664 -0
- diffusers/pipelines/cosmos/pipeline_cosmos_video2world.py +826 -0
- diffusers/pipelines/cosmos/pipeline_output.py +40 -0
- diffusers/pipelines/dance_diffusion/pipeline_dance_diffusion.py +5 -4
- diffusers/pipelines/ddim/pipeline_ddim.py +4 -4
- diffusers/pipelines/ddpm/pipeline_ddpm.py +1 -1
- diffusers/pipelines/deepfloyd_if/pipeline_if.py +10 -10
- diffusers/pipelines/deepfloyd_if/pipeline_if_img2img.py +10 -10
- diffusers/pipelines/deepfloyd_if/pipeline_if_img2img_superresolution.py +10 -10
- diffusers/pipelines/deepfloyd_if/pipeline_if_inpainting.py +10 -10
- diffusers/pipelines/deepfloyd_if/pipeline_if_inpainting_superresolution.py +10 -10
- diffusers/pipelines/deepfloyd_if/pipeline_if_superresolution.py +10 -10
- diffusers/pipelines/deprecated/alt_diffusion/pipeline_alt_diffusion.py +8 -8
- diffusers/pipelines/deprecated/alt_diffusion/pipeline_alt_diffusion_img2img.py +5 -5
- diffusers/pipelines/deprecated/audio_diffusion/mel.py +1 -1
- diffusers/pipelines/deprecated/audio_diffusion/pipeline_audio_diffusion.py +3 -3
- diffusers/pipelines/deprecated/latent_diffusion_uncond/pipeline_latent_diffusion_uncond.py +1 -1
- diffusers/pipelines/deprecated/pndm/pipeline_pndm.py +2 -2
- diffusers/pipelines/deprecated/repaint/pipeline_repaint.py +4 -3
- diffusers/pipelines/deprecated/score_sde_ve/pipeline_score_sde_ve.py +1 -1
- diffusers/pipelines/deprecated/spectrogram_diffusion/continuous_encoder.py +1 -1
- diffusers/pipelines/deprecated/spectrogram_diffusion/midi_utils.py +1 -1
- diffusers/pipelines/deprecated/spectrogram_diffusion/notes_encoder.py +1 -1
- diffusers/pipelines/deprecated/spectrogram_diffusion/pipeline_spectrogram_diffusion.py +1 -1
- diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_cycle_diffusion.py +8 -8
- diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_onnx_stable_diffusion_inpaint_legacy.py +9 -9
- diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_inpaint_legacy.py +10 -10
- diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_model_editing.py +10 -8
- diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_paradigms.py +5 -5
- diffusers/pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_pix2pix_zero.py +18 -18
- diffusers/pipelines/deprecated/stochastic_karras_ve/pipeline_stochastic_karras_ve.py +1 -1
- diffusers/pipelines/deprecated/versatile_diffusion/modeling_text_unet.py +2 -2
- diffusers/pipelines/deprecated/versatile_diffusion/pipeline_versatile_diffusion.py +6 -6
- diffusers/pipelines/deprecated/versatile_diffusion/pipeline_versatile_diffusion_dual_guided.py +5 -5
- diffusers/pipelines/deprecated/versatile_diffusion/pipeline_versatile_diffusion_image_variation.py +5 -5
- diffusers/pipelines/deprecated/versatile_diffusion/pipeline_versatile_diffusion_text_to_image.py +5 -5
- diffusers/pipelines/deprecated/vq_diffusion/pipeline_vq_diffusion.py +1 -1
- diffusers/pipelines/dit/pipeline_dit.py +4 -2
- diffusers/pipelines/easyanimate/pipeline_easyanimate.py +4 -4
- diffusers/pipelines/easyanimate/pipeline_easyanimate_control.py +4 -4
- diffusers/pipelines/easyanimate/pipeline_easyanimate_inpaint.py +7 -6
- diffusers/pipelines/flux/__init__.py +4 -0
- diffusers/pipelines/flux/modeling_flux.py +1 -1
- diffusers/pipelines/flux/pipeline_flux.py +37 -36
- diffusers/pipelines/flux/pipeline_flux_control.py +9 -9
- diffusers/pipelines/flux/pipeline_flux_control_img2img.py +7 -7
- diffusers/pipelines/flux/pipeline_flux_control_inpaint.py +7 -7
- diffusers/pipelines/flux/pipeline_flux_controlnet.py +7 -7
- diffusers/pipelines/flux/pipeline_flux_controlnet_image_to_image.py +31 -23
- diffusers/pipelines/flux/pipeline_flux_controlnet_inpainting.py +3 -2
- diffusers/pipelines/flux/pipeline_flux_fill.py +7 -7
- diffusers/pipelines/flux/pipeline_flux_img2img.py +40 -7
- diffusers/pipelines/flux/pipeline_flux_inpaint.py +12 -7
- diffusers/pipelines/flux/pipeline_flux_kontext.py +1134 -0
- diffusers/pipelines/flux/pipeline_flux_kontext_inpaint.py +1460 -0
- diffusers/pipelines/flux/pipeline_flux_prior_redux.py +2 -2
- diffusers/pipelines/flux/pipeline_output.py +6 -4
- diffusers/pipelines/free_init_utils.py +2 -2
- diffusers/pipelines/free_noise_utils.py +3 -3
- diffusers/pipelines/hidream_image/__init__.py +47 -0
- diffusers/pipelines/hidream_image/pipeline_hidream_image.py +1026 -0
- diffusers/pipelines/hidream_image/pipeline_output.py +35 -0
- diffusers/pipelines/hunyuan_video/__init__.py +2 -0
- diffusers/pipelines/hunyuan_video/pipeline_hunyuan_skyreels_image2video.py +8 -8
- diffusers/pipelines/hunyuan_video/pipeline_hunyuan_video.py +26 -25
- diffusers/pipelines/hunyuan_video/pipeline_hunyuan_video_framepack.py +1114 -0
- diffusers/pipelines/hunyuan_video/pipeline_hunyuan_video_image2video.py +71 -15
- diffusers/pipelines/hunyuan_video/pipeline_output.py +19 -0
- diffusers/pipelines/hunyuandit/pipeline_hunyuandit.py +8 -8
- diffusers/pipelines/i2vgen_xl/pipeline_i2vgen_xl.py +10 -8
- diffusers/pipelines/kandinsky/pipeline_kandinsky.py +6 -6
- diffusers/pipelines/kandinsky/pipeline_kandinsky_combined.py +34 -34
- diffusers/pipelines/kandinsky/pipeline_kandinsky_img2img.py +19 -26
- diffusers/pipelines/kandinsky/pipeline_kandinsky_inpaint.py +7 -7
- diffusers/pipelines/kandinsky/pipeline_kandinsky_prior.py +11 -11
- diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2.py +6 -6
- diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_combined.py +35 -35
- diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_controlnet.py +6 -6
- diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_controlnet_img2img.py +17 -39
- diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_img2img.py +17 -45
- diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_inpainting.py +7 -7
- diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_prior.py +10 -10
- diffusers/pipelines/kandinsky2_2/pipeline_kandinsky2_2_prior_emb2emb.py +10 -10
- diffusers/pipelines/kandinsky3/pipeline_kandinsky3.py +7 -7
- diffusers/pipelines/kandinsky3/pipeline_kandinsky3_img2img.py +17 -38
- diffusers/pipelines/kolors/pipeline_kolors.py +10 -10
- diffusers/pipelines/kolors/pipeline_kolors_img2img.py +12 -12
- diffusers/pipelines/kolors/text_encoder.py +3 -3
- diffusers/pipelines/kolors/tokenizer.py +1 -1
- diffusers/pipelines/latent_consistency_models/pipeline_latent_consistency_img2img.py +2 -2
- diffusers/pipelines/latent_consistency_models/pipeline_latent_consistency_text2img.py +2 -2
- diffusers/pipelines/latent_diffusion/pipeline_latent_diffusion.py +1 -1
- diffusers/pipelines/latent_diffusion/pipeline_latent_diffusion_superresolution.py +3 -3
- diffusers/pipelines/latte/pipeline_latte.py +12 -12
- diffusers/pipelines/ledits_pp/pipeline_leditspp_stable_diffusion.py +13 -13
- diffusers/pipelines/ledits_pp/pipeline_leditspp_stable_diffusion_xl.py +17 -16
- diffusers/pipelines/ltx/__init__.py +4 -0
- diffusers/pipelines/ltx/modeling_latent_upsampler.py +188 -0
- diffusers/pipelines/ltx/pipeline_ltx.py +64 -18
- diffusers/pipelines/ltx/pipeline_ltx_condition.py +117 -38
- diffusers/pipelines/ltx/pipeline_ltx_image2video.py +63 -18
- diffusers/pipelines/ltx/pipeline_ltx_latent_upsample.py +277 -0
- diffusers/pipelines/lumina/pipeline_lumina.py +13 -13
- diffusers/pipelines/lumina2/pipeline_lumina2.py +10 -10
- diffusers/pipelines/marigold/marigold_image_processing.py +2 -2
- diffusers/pipelines/mochi/pipeline_mochi.py +15 -14
- diffusers/pipelines/musicldm/pipeline_musicldm.py +16 -13
- diffusers/pipelines/omnigen/pipeline_omnigen.py +13 -11
- diffusers/pipelines/omnigen/processor_omnigen.py +8 -3
- diffusers/pipelines/onnx_utils.py +15 -2
- diffusers/pipelines/pag/pag_utils.py +2 -2
- diffusers/pipelines/pag/pipeline_pag_controlnet_sd.py +12 -8
- diffusers/pipelines/pag/pipeline_pag_controlnet_sd_inpaint.py +7 -7
- diffusers/pipelines/pag/pipeline_pag_controlnet_sd_xl.py +10 -6
- diffusers/pipelines/pag/pipeline_pag_controlnet_sd_xl_img2img.py +14 -14
- diffusers/pipelines/pag/pipeline_pag_hunyuandit.py +8 -8
- diffusers/pipelines/pag/pipeline_pag_kolors.py +10 -10
- diffusers/pipelines/pag/pipeline_pag_pixart_sigma.py +11 -11
- diffusers/pipelines/pag/pipeline_pag_sana.py +18 -12
- diffusers/pipelines/pag/pipeline_pag_sd.py +8 -8
- diffusers/pipelines/pag/pipeline_pag_sd_3.py +7 -7
- diffusers/pipelines/pag/pipeline_pag_sd_3_img2img.py +7 -7
- diffusers/pipelines/pag/pipeline_pag_sd_animatediff.py +6 -6
- diffusers/pipelines/pag/pipeline_pag_sd_img2img.py +5 -5
- diffusers/pipelines/pag/pipeline_pag_sd_inpaint.py +8 -8
- diffusers/pipelines/pag/pipeline_pag_sd_xl.py +16 -15
- diffusers/pipelines/pag/pipeline_pag_sd_xl_img2img.py +18 -17
- diffusers/pipelines/pag/pipeline_pag_sd_xl_inpaint.py +12 -12
- diffusers/pipelines/paint_by_example/image_encoder.py +1 -1
- diffusers/pipelines/paint_by_example/pipeline_paint_by_example.py +8 -7
- diffusers/pipelines/pia/pipeline_pia.py +8 -6
- diffusers/pipelines/pipeline_flax_utils.py +5 -6
- diffusers/pipelines/pipeline_loading_utils.py +113 -15
- diffusers/pipelines/pipeline_utils.py +127 -48
- diffusers/pipelines/pixart_alpha/pipeline_pixart_alpha.py +14 -12
- diffusers/pipelines/pixart_alpha/pipeline_pixart_sigma.py +31 -11
- diffusers/pipelines/qwenimage/__init__.py +55 -0
- diffusers/pipelines/qwenimage/pipeline_output.py +21 -0
- diffusers/pipelines/qwenimage/pipeline_qwenimage.py +726 -0
- diffusers/pipelines/qwenimage/pipeline_qwenimage_edit.py +882 -0
- diffusers/pipelines/qwenimage/pipeline_qwenimage_img2img.py +829 -0
- diffusers/pipelines/qwenimage/pipeline_qwenimage_inpaint.py +1015 -0
- diffusers/pipelines/sana/__init__.py +4 -0
- diffusers/pipelines/sana/pipeline_sana.py +23 -21
- diffusers/pipelines/sana/pipeline_sana_controlnet.py +1106 -0
- diffusers/pipelines/sana/pipeline_sana_sprint.py +23 -19
- diffusers/pipelines/sana/pipeline_sana_sprint_img2img.py +981 -0
- diffusers/pipelines/semantic_stable_diffusion/pipeline_semantic_stable_diffusion.py +7 -6
- diffusers/pipelines/shap_e/camera.py +1 -1
- diffusers/pipelines/shap_e/pipeline_shap_e.py +1 -1
- diffusers/pipelines/shap_e/pipeline_shap_e_img2img.py +1 -1
- diffusers/pipelines/shap_e/renderer.py +3 -3
- diffusers/pipelines/skyreels_v2/__init__.py +59 -0
- diffusers/pipelines/skyreels_v2/pipeline_output.py +20 -0
- diffusers/pipelines/skyreels_v2/pipeline_skyreels_v2.py +610 -0
- diffusers/pipelines/skyreels_v2/pipeline_skyreels_v2_diffusion_forcing.py +978 -0
- diffusers/pipelines/skyreels_v2/pipeline_skyreels_v2_diffusion_forcing_i2v.py +1059 -0
- diffusers/pipelines/skyreels_v2/pipeline_skyreels_v2_diffusion_forcing_v2v.py +1063 -0
- diffusers/pipelines/skyreels_v2/pipeline_skyreels_v2_i2v.py +745 -0
- diffusers/pipelines/stable_audio/modeling_stable_audio.py +1 -1
- diffusers/pipelines/stable_audio/pipeline_stable_audio.py +5 -5
- diffusers/pipelines/stable_cascade/pipeline_stable_cascade.py +8 -8
- diffusers/pipelines/stable_cascade/pipeline_stable_cascade_combined.py +13 -13
- diffusers/pipelines/stable_cascade/pipeline_stable_cascade_prior.py +9 -9
- diffusers/pipelines/stable_diffusion/__init__.py +0 -7
- diffusers/pipelines/stable_diffusion/clip_image_project_model.py +1 -1
- diffusers/pipelines/stable_diffusion/convert_from_ckpt.py +11 -4
- diffusers/pipelines/stable_diffusion/pipeline_flax_stable_diffusion.py +1 -1
- diffusers/pipelines/stable_diffusion/pipeline_flax_stable_diffusion_img2img.py +1 -1
- diffusers/pipelines/stable_diffusion/pipeline_flax_stable_diffusion_inpaint.py +1 -1
- diffusers/pipelines/stable_diffusion/pipeline_onnx_stable_diffusion.py +12 -11
- diffusers/pipelines/stable_diffusion/pipeline_onnx_stable_diffusion_img2img.py +10 -10
- diffusers/pipelines/stable_diffusion/pipeline_onnx_stable_diffusion_inpaint.py +11 -11
- diffusers/pipelines/stable_diffusion/pipeline_onnx_stable_diffusion_upscale.py +10 -10
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion.py +10 -9
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_depth2img.py +5 -5
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_image_variation.py +5 -5
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_img2img.py +5 -5
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_inpaint.py +5 -5
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_instruct_pix2pix.py +5 -5
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_latent_upscale.py +4 -4
- diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_upscale.py +5 -5
- diffusers/pipelines/stable_diffusion/pipeline_stable_unclip.py +7 -7
- diffusers/pipelines/stable_diffusion/pipeline_stable_unclip_img2img.py +5 -5
- diffusers/pipelines/stable_diffusion/safety_checker.py +1 -1
- diffusers/pipelines/stable_diffusion/safety_checker_flax.py +1 -1
- diffusers/pipelines/stable_diffusion/stable_unclip_image_normalizer.py +1 -1
- diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3.py +13 -12
- diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3_img2img.py +7 -7
- diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3_inpaint.py +7 -7
- diffusers/pipelines/stable_diffusion_attend_and_excite/pipeline_stable_diffusion_attend_and_excite.py +12 -8
- diffusers/pipelines/stable_diffusion_diffedit/pipeline_stable_diffusion_diffedit.py +15 -9
- diffusers/pipelines/stable_diffusion_gligen/pipeline_stable_diffusion_gligen.py +11 -9
- diffusers/pipelines/stable_diffusion_gligen/pipeline_stable_diffusion_gligen_text_image.py +11 -9
- diffusers/pipelines/stable_diffusion_k_diffusion/pipeline_stable_diffusion_k_diffusion.py +18 -12
- diffusers/pipelines/stable_diffusion_k_diffusion/pipeline_stable_diffusion_xl_k_diffusion.py +11 -8
- diffusers/pipelines/stable_diffusion_ldm3d/pipeline_stable_diffusion_ldm3d.py +11 -8
- diffusers/pipelines/stable_diffusion_panorama/pipeline_stable_diffusion_panorama.py +15 -12
- diffusers/pipelines/stable_diffusion_safe/pipeline_stable_diffusion_safe.py +8 -6
- diffusers/pipelines/stable_diffusion_safe/safety_checker.py +1 -1
- diffusers/pipelines/stable_diffusion_sag/pipeline_stable_diffusion_sag.py +15 -11
- diffusers/pipelines/stable_diffusion_xl/pipeline_flax_stable_diffusion_xl.py +1 -1
- diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl.py +16 -15
- diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_img2img.py +18 -17
- diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_inpaint.py +12 -12
- diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_instruct_pix2pix.py +16 -15
- diffusers/pipelines/stable_video_diffusion/pipeline_stable_video_diffusion.py +3 -3
- diffusers/pipelines/t2i_adapter/pipeline_stable_diffusion_adapter.py +12 -12
- diffusers/pipelines/t2i_adapter/pipeline_stable_diffusion_xl_adapter.py +18 -17
- diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_synth.py +12 -7
- diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_synth_img2img.py +12 -7
- diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_zero.py +15 -13
- diffusers/pipelines/text_to_video_synthesis/pipeline_text_to_video_zero_sdxl.py +24 -21
- diffusers/pipelines/unclip/pipeline_unclip.py +4 -3
- diffusers/pipelines/unclip/pipeline_unclip_image_variation.py +4 -3
- diffusers/pipelines/unclip/text_proj.py +2 -2
- diffusers/pipelines/unidiffuser/modeling_text_decoder.py +2 -2
- diffusers/pipelines/unidiffuser/modeling_uvit.py +1 -1
- diffusers/pipelines/unidiffuser/pipeline_unidiffuser.py +8 -7
- diffusers/pipelines/visualcloze/__init__.py +52 -0
- diffusers/pipelines/visualcloze/pipeline_visualcloze_combined.py +444 -0
- diffusers/pipelines/visualcloze/pipeline_visualcloze_generation.py +952 -0
- diffusers/pipelines/visualcloze/visualcloze_utils.py +251 -0
- diffusers/pipelines/wan/__init__.py +2 -0
- diffusers/pipelines/wan/pipeline_wan.py +91 -30
- diffusers/pipelines/wan/pipeline_wan_i2v.py +145 -45
- diffusers/pipelines/wan/pipeline_wan_vace.py +975 -0
- diffusers/pipelines/wan/pipeline_wan_video2video.py +14 -16
- diffusers/pipelines/wuerstchen/modeling_paella_vq_model.py +1 -1
- diffusers/pipelines/wuerstchen/modeling_wuerstchen_diffnext.py +1 -1
- diffusers/pipelines/wuerstchen/modeling_wuerstchen_prior.py +1 -1
- diffusers/pipelines/wuerstchen/pipeline_wuerstchen.py +8 -8
- diffusers/pipelines/wuerstchen/pipeline_wuerstchen_combined.py +16 -15
- diffusers/pipelines/wuerstchen/pipeline_wuerstchen_prior.py +6 -6
- diffusers/quantizers/__init__.py +3 -1
- diffusers/quantizers/base.py +17 -1
- diffusers/quantizers/bitsandbytes/bnb_quantizer.py +4 -0
- diffusers/quantizers/bitsandbytes/utils.py +10 -7
- diffusers/quantizers/gguf/gguf_quantizer.py +13 -4
- diffusers/quantizers/gguf/utils.py +108 -16
- diffusers/quantizers/pipe_quant_config.py +202 -0
- diffusers/quantizers/quantization_config.py +18 -16
- diffusers/quantizers/quanto/quanto_quantizer.py +4 -0
- diffusers/quantizers/torchao/torchao_quantizer.py +31 -1
- diffusers/schedulers/__init__.py +3 -1
- diffusers/schedulers/deprecated/scheduling_karras_ve.py +4 -3
- diffusers/schedulers/deprecated/scheduling_sde_vp.py +1 -1
- diffusers/schedulers/scheduling_consistency_models.py +1 -1
- diffusers/schedulers/scheduling_cosine_dpmsolver_multistep.py +10 -5
- diffusers/schedulers/scheduling_ddim.py +8 -8
- diffusers/schedulers/scheduling_ddim_cogvideox.py +5 -5
- diffusers/schedulers/scheduling_ddim_flax.py +6 -6
- diffusers/schedulers/scheduling_ddim_inverse.py +6 -6
- diffusers/schedulers/scheduling_ddim_parallel.py +22 -22
- diffusers/schedulers/scheduling_ddpm.py +9 -9
- diffusers/schedulers/scheduling_ddpm_flax.py +7 -7
- diffusers/schedulers/scheduling_ddpm_parallel.py +18 -18
- diffusers/schedulers/scheduling_ddpm_wuerstchen.py +2 -2
- diffusers/schedulers/scheduling_deis_multistep.py +16 -9
- diffusers/schedulers/scheduling_dpm_cogvideox.py +5 -5
- diffusers/schedulers/scheduling_dpmsolver_multistep.py +18 -12
- diffusers/schedulers/scheduling_dpmsolver_multistep_flax.py +22 -20
- diffusers/schedulers/scheduling_dpmsolver_multistep_inverse.py +11 -11
- diffusers/schedulers/scheduling_dpmsolver_sde.py +2 -2
- diffusers/schedulers/scheduling_dpmsolver_singlestep.py +19 -13
- diffusers/schedulers/scheduling_edm_dpmsolver_multistep.py +13 -8
- diffusers/schedulers/scheduling_edm_euler.py +20 -11
- diffusers/schedulers/scheduling_euler_ancestral_discrete.py +3 -3
- diffusers/schedulers/scheduling_euler_discrete.py +3 -3
- diffusers/schedulers/scheduling_euler_discrete_flax.py +3 -3
- diffusers/schedulers/scheduling_flow_match_euler_discrete.py +20 -5
- diffusers/schedulers/scheduling_flow_match_heun_discrete.py +1 -1
- diffusers/schedulers/scheduling_flow_match_lcm.py +561 -0
- diffusers/schedulers/scheduling_heun_discrete.py +2 -2
- diffusers/schedulers/scheduling_ipndm.py +2 -2
- diffusers/schedulers/scheduling_k_dpm_2_ancestral_discrete.py +2 -2
- diffusers/schedulers/scheduling_k_dpm_2_discrete.py +2 -2
- diffusers/schedulers/scheduling_karras_ve_flax.py +5 -5
- diffusers/schedulers/scheduling_lcm.py +3 -3
- diffusers/schedulers/scheduling_lms_discrete.py +2 -2
- diffusers/schedulers/scheduling_lms_discrete_flax.py +1 -1
- diffusers/schedulers/scheduling_pndm.py +4 -4
- diffusers/schedulers/scheduling_pndm_flax.py +4 -4
- diffusers/schedulers/scheduling_repaint.py +9 -9
- diffusers/schedulers/scheduling_sasolver.py +15 -15
- diffusers/schedulers/scheduling_scm.py +1 -2
- diffusers/schedulers/scheduling_sde_ve.py +1 -1
- diffusers/schedulers/scheduling_sde_ve_flax.py +2 -2
- diffusers/schedulers/scheduling_tcd.py +3 -3
- diffusers/schedulers/scheduling_unclip.py +5 -5
- diffusers/schedulers/scheduling_unipc_multistep.py +21 -12
- diffusers/schedulers/scheduling_utils.py +3 -3
- diffusers/schedulers/scheduling_utils_flax.py +2 -2
- diffusers/schedulers/scheduling_vq_diffusion.py +1 -1
- diffusers/training_utils.py +91 -5
- diffusers/utils/__init__.py +15 -0
- diffusers/utils/accelerate_utils.py +1 -1
- diffusers/utils/constants.py +4 -0
- diffusers/utils/doc_utils.py +1 -1
- diffusers/utils/dummy_pt_objects.py +432 -0
- diffusers/utils/dummy_torch_and_transformers_objects.py +480 -0
- diffusers/utils/dynamic_modules_utils.py +85 -8
- diffusers/utils/export_utils.py +1 -1
- diffusers/utils/hub_utils.py +33 -17
- diffusers/utils/import_utils.py +151 -18
- diffusers/utils/logging.py +1 -1
- diffusers/utils/outputs.py +2 -1
- diffusers/utils/peft_utils.py +96 -10
- diffusers/utils/state_dict_utils.py +20 -3
- diffusers/utils/testing_utils.py +195 -17
- diffusers/utils/torch_utils.py +43 -5
- diffusers/video_processor.py +2 -2
- {diffusers-0.33.1.dist-info → diffusers-0.35.0.dist-info}/METADATA +72 -57
- diffusers-0.35.0.dist-info/RECORD +703 -0
- {diffusers-0.33.1.dist-info → diffusers-0.35.0.dist-info}/WHEEL +1 -1
- diffusers-0.33.1.dist-info/RECORD +0 -608
- {diffusers-0.33.1.dist-info → diffusers-0.35.0.dist-info}/LICENSE +0 -0
- {diffusers-0.33.1.dist-info → diffusers-0.35.0.dist-info}/entry_points.txt +0 -0
- {diffusers-0.33.1.dist-info → diffusers-0.35.0.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright
|
1
|
+
# Copyright 2025 The HuggingFace Team. All rights reserved.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -108,7 +108,7 @@ def rescale_noise_cfg(noise_cfg, noise_pred_text, guidance_rescale=0.0):
|
|
108
108
|
r"""
|
109
109
|
Rescales `noise_cfg` tensor based on `guidance_rescale` to improve image quality and fix overexposure. Based on
|
110
110
|
Section 3.4 from [Common Diffusion Noise Schedules and Sample Steps are
|
111
|
-
Flawed](https://
|
111
|
+
Flawed](https://huggingface.co/papers/2305.08891).
|
112
112
|
|
113
113
|
Args:
|
114
114
|
noise_cfg (`torch.Tensor`):
|
@@ -643,7 +643,7 @@ class StableDiffusionXLPAGInpaintPipeline(
|
|
643
643
|
def prepare_extra_step_kwargs(self, generator, eta):
|
644
644
|
# prepare extra kwargs for the scheduler step, since not all schedulers have the same signature
|
645
645
|
# eta (η) is only used with the DDIMScheduler, it will be ignored for other schedulers.
|
646
|
-
# eta corresponds to η in DDIM paper: https://
|
646
|
+
# eta corresponds to η in DDIM paper: https://huggingface.co/papers/2010.02502
|
647
647
|
# and should be between [0, 1]
|
648
648
|
|
649
649
|
accepts_eta = "eta" in set(inspect.signature(self.scheduler.step).parameters.keys())
|
@@ -1061,7 +1061,7 @@ class StableDiffusionXLPAGInpaintPipeline(
|
|
1061
1061
|
return self._clip_skip
|
1062
1062
|
|
1063
1063
|
# here `guidance_scale` is defined analog to the guidance weight `w` of equation (2)
|
1064
|
-
# of the Imagen paper: https://
|
1064
|
+
# of the Imagen paper: https://huggingface.co/papers/2205.11487 . `guidance_scale = 1`
|
1065
1065
|
# corresponds to doing no classifier free guidance.
|
1066
1066
|
@property
|
1067
1067
|
def do_classifier_free_guidance(self):
|
@@ -1208,11 +1208,11 @@ class StableDiffusionXLPAGInpaintPipeline(
|
|
1208
1208
|
forms a part of a "Mixture of Denoisers" multi-pipeline setup, as elaborated in [**Refining the Image
|
1209
1209
|
Output**](https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion/stable_diffusion_xl#refining-the-image-output).
|
1210
1210
|
guidance_scale (`float`, *optional*, defaults to 7.5):
|
1211
|
-
Guidance scale as defined in [Classifier-Free Diffusion
|
1212
|
-
`guidance_scale` is defined as `w` of equation 2.
|
1213
|
-
Paper](https://
|
1214
|
-
1`. Higher guidance scale encourages to generate images that are closely linked to
|
1215
|
-
usually at the expense of lower image quality.
|
1211
|
+
Guidance scale as defined in [Classifier-Free Diffusion
|
1212
|
+
Guidance](https://huggingface.co/papers/2207.12598). `guidance_scale` is defined as `w` of equation 2.
|
1213
|
+
of [Imagen Paper](https://huggingface.co/papers/2205.11487). Guidance scale is enabled by setting
|
1214
|
+
`guidance_scale > 1`. Higher guidance scale encourages to generate images that are closely linked to
|
1215
|
+
the text `prompt`, usually at the expense of lower image quality.
|
1216
1216
|
negative_prompt (`str` or `List[str]`, *optional*):
|
1217
1217
|
The prompt or prompts not to guide the image generation. If not defined, one has to pass
|
1218
1218
|
`negative_prompt_embeds` instead. Ignored when not using guidance (i.e., ignored if `guidance_scale` is
|
@@ -1243,8 +1243,8 @@ class StableDiffusionXLPAGInpaintPipeline(
|
|
1243
1243
|
num_images_per_prompt (`int`, *optional*, defaults to 1):
|
1244
1244
|
The number of images to generate per prompt.
|
1245
1245
|
eta (`float`, *optional*, defaults to 0.0):
|
1246
|
-
Corresponds to parameter eta (η) in the DDIM paper: https://
|
1247
|
-
[`schedulers.DDIMScheduler`], will be ignored for others.
|
1246
|
+
Corresponds to parameter eta (η) in the DDIM paper: https://huggingface.co/papers/2010.02502. Only
|
1247
|
+
applies to [`schedulers.DDIMScheduler`], will be ignored for others.
|
1248
1248
|
generator (`torch.Generator`, *optional*):
|
1249
1249
|
One or a list of [torch generator(s)](https://pytorch.org/docs/stable/generated/torch.Generator.html)
|
1250
1250
|
to make generation deterministic.
|
@@ -1673,7 +1673,7 @@ class StableDiffusionXLPAGInpaintPipeline(
|
|
1673
1673
|
noise_pred = noise_pred_uncond + self.guidance_scale * (noise_pred_text - noise_pred_uncond)
|
1674
1674
|
|
1675
1675
|
if self.do_classifier_free_guidance and self.guidance_rescale > 0.0:
|
1676
|
-
# Based on 3.4. in https://
|
1676
|
+
# Based on 3.4. in https://huggingface.co/papers/2305.08891
|
1677
1677
|
noise_pred = rescale_noise_cfg(noise_pred, noise_pred_text, guidance_rescale=self.guidance_rescale)
|
1678
1678
|
|
1679
1679
|
# compute the previous noisy sample x_t -> x_t-1
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright
|
1
|
+
# Copyright 2025 The HuggingFace Team. All rights reserved.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -25,7 +25,7 @@ from ...models import AutoencoderKL, UNet2DConditionModel
|
|
25
25
|
from ...schedulers import DDIMScheduler, LMSDiscreteScheduler, PNDMScheduler
|
26
26
|
from ...utils import deprecate, is_torch_xla_available, logging
|
27
27
|
from ...utils.torch_utils import randn_tensor
|
28
|
-
from ..pipeline_utils import DiffusionPipeline, StableDiffusionMixin
|
28
|
+
from ..pipeline_utils import DeprecatedPipelineMixin, DiffusionPipeline, StableDiffusionMixin
|
29
29
|
from ..stable_diffusion import StableDiffusionPipelineOutput
|
30
30
|
from ..stable_diffusion.safety_checker import StableDiffusionSafetyChecker
|
31
31
|
from .image_encoder import PaintByExampleImageEncoder
|
@@ -155,7 +155,8 @@ def prepare_mask_and_masked_image(image, mask):
|
|
155
155
|
return mask, masked_image
|
156
156
|
|
157
157
|
|
158
|
-
class PaintByExamplePipeline(DiffusionPipeline, StableDiffusionMixin):
|
158
|
+
class PaintByExamplePipeline(DeprecatedPipelineMixin, DiffusionPipeline, StableDiffusionMixin):
|
159
|
+
_last_supported_version = "0.33.1"
|
159
160
|
r"""
|
160
161
|
<Tip warning={true}>
|
161
162
|
|
@@ -239,7 +240,7 @@ class PaintByExamplePipeline(DiffusionPipeline, StableDiffusionMixin):
|
|
239
240
|
def prepare_extra_step_kwargs(self, generator, eta):
|
240
241
|
# prepare extra kwargs for the scheduler step, since not all schedulers have the same signature
|
241
242
|
# eta (η) is only used with the DDIMScheduler, it will be ignored for other schedulers.
|
242
|
-
# eta corresponds to η in DDIM paper: https://
|
243
|
+
# eta corresponds to η in DDIM paper: https://huggingface.co/papers/2010.02502
|
243
244
|
# and should be between [0, 1]
|
244
245
|
|
245
246
|
accepts_eta = "eta" in set(inspect.signature(self.scheduler.step).parameters.keys())
|
@@ -447,8 +448,8 @@ class PaintByExamplePipeline(DiffusionPipeline, StableDiffusionMixin):
|
|
447
448
|
num_images_per_prompt (`int`, *optional*, defaults to 1):
|
448
449
|
The number of images to generate per prompt.
|
449
450
|
eta (`float`, *optional*, defaults to 0.0):
|
450
|
-
Corresponds to parameter eta (η) from the [DDIM](https://
|
451
|
-
to the [`~schedulers.DDIMScheduler`], and is ignored in other schedulers.
|
451
|
+
Corresponds to parameter eta (η) from the [DDIM](https://huggingface.co/papers/2010.02502) paper. Only
|
452
|
+
applies to the [`~schedulers.DDIMScheduler`], and is ignored in other schedulers.
|
452
453
|
generator (`torch.Generator` or `List[torch.Generator]`, *optional*):
|
453
454
|
A [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) to make
|
454
455
|
generation deterministic.
|
@@ -521,7 +522,7 @@ class PaintByExamplePipeline(DiffusionPipeline, StableDiffusionMixin):
|
|
521
522
|
batch_size = image.shape[0]
|
522
523
|
device = self._execution_device
|
523
524
|
# here `guidance_scale` is defined analog to the guidance weight `w` of equation (2)
|
524
|
-
# of the Imagen paper: https://
|
525
|
+
# of the Imagen paper: https://huggingface.co/papers/2205.11487 . `guidance_scale = 1`
|
525
526
|
# corresponds to doing no classifier free guidance.
|
526
527
|
do_classifier_free_guidance = guidance_scale > 1.0
|
527
528
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright
|
1
|
+
# Copyright 2025 The HuggingFace Team. All rights reserved.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -46,7 +46,7 @@ from ...utils import (
|
|
46
46
|
from ...utils.torch_utils import randn_tensor
|
47
47
|
from ...video_processor import VideoProcessor
|
48
48
|
from ..free_init_utils import FreeInitMixin
|
49
|
-
from ..pipeline_utils import DiffusionPipeline, StableDiffusionMixin
|
49
|
+
from ..pipeline_utils import DeprecatedPipelineMixin, DiffusionPipeline, StableDiffusionMixin
|
50
50
|
|
51
51
|
|
52
52
|
if is_torch_xla_available():
|
@@ -132,6 +132,7 @@ class PIAPipelineOutput(BaseOutput):
|
|
132
132
|
|
133
133
|
|
134
134
|
class PIAPipeline(
|
135
|
+
DeprecatedPipelineMixin,
|
135
136
|
DiffusionPipeline,
|
136
137
|
StableDiffusionMixin,
|
137
138
|
TextualInversionLoaderMixin,
|
@@ -140,6 +141,7 @@ class PIAPipeline(
|
|
140
141
|
FromSingleFileMixin,
|
141
142
|
FreeInitMixin,
|
142
143
|
):
|
144
|
+
_last_supported_version = "0.33.1"
|
143
145
|
r"""
|
144
146
|
Pipeline for text-to-video generation.
|
145
147
|
|
@@ -432,7 +434,7 @@ class PIAPipeline(
|
|
432
434
|
def prepare_extra_step_kwargs(self, generator, eta):
|
433
435
|
# prepare extra kwargs for the scheduler step, since not all schedulers have the same signature
|
434
436
|
# eta (η) is only used with the DDIMScheduler, it will be ignored for other schedulers.
|
435
|
-
# eta corresponds to η in DDIM paper: https://
|
437
|
+
# eta corresponds to η in DDIM paper: https://huggingface.co/papers/2010.02502
|
436
438
|
# and should be between [0, 1]
|
437
439
|
|
438
440
|
accepts_eta = "eta" in set(inspect.signature(self.scheduler.step).parameters.keys())
|
@@ -653,7 +655,7 @@ class PIAPipeline(
|
|
653
655
|
return self._clip_skip
|
654
656
|
|
655
657
|
# here `guidance_scale` is defined analog to the guidance weight `w` of equation (2)
|
656
|
-
# of the Imagen paper: https://
|
658
|
+
# of the Imagen paper: https://huggingface.co/papers/2205.11487 . `guidance_scale = 1`
|
657
659
|
# corresponds to doing no classifier free guidance.
|
658
660
|
@property
|
659
661
|
def do_classifier_free_guidance(self):
|
@@ -723,8 +725,8 @@ class PIAPipeline(
|
|
723
725
|
The prompt or prompts to guide what to not include in image generation. If not defined, you need to
|
724
726
|
pass `negative_prompt_embeds` instead. Ignored when not using guidance (`guidance_scale < 1`).
|
725
727
|
eta (`float`, *optional*, defaults to 0.0):
|
726
|
-
Corresponds to parameter eta (η) from the [DDIM](https://
|
727
|
-
to the [`~schedulers.DDIMScheduler`], and is ignored in other schedulers.
|
728
|
+
Corresponds to parameter eta (η) from the [DDIM](https://huggingface.co/papers/2010.02502) paper. Only
|
729
|
+
applies to the [`~schedulers.DDIMScheduler`], and is ignored in other schedulers.
|
728
730
|
generator (`torch.Generator` or `List[torch.Generator]`, *optional*):
|
729
731
|
A [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) to make
|
730
732
|
generation deterministic.
|
@@ -248,9 +248,8 @@ class FlaxDiffusionPipeline(ConfigMixin, PushToHubMixin):
|
|
248
248
|
pretrained pipeline hosted on the Hub.
|
249
249
|
- A path to a *directory* (for example `./my_model_directory`) containing the model weights saved
|
250
250
|
using [`~FlaxDiffusionPipeline.save_pretrained`].
|
251
|
-
dtype (`
|
252
|
-
Override the default `jnp.dtype` and load the model under this dtype.
|
253
|
-
automatically derived from the model's weights.
|
251
|
+
dtype (`jnp.dtype`, *optional*):
|
252
|
+
Override the default `jnp.dtype` and load the model under this dtype.
|
254
253
|
force_download (`bool`, *optional*, defaults to `False`):
|
255
254
|
Whether or not to force the (re-)download of the model weights and configuration files, overriding the
|
256
255
|
cached versions if they exist.
|
@@ -279,8 +278,8 @@ class FlaxDiffusionPipeline(ConfigMixin, PushToHubMixin):
|
|
279
278
|
|
280
279
|
<Tip>
|
281
280
|
|
282
|
-
To use private or [gated models](https://huggingface.co/docs/hub/models-gated#gated-models), log-in with
|
283
|
-
|
281
|
+
To use private or [gated models](https://huggingface.co/docs/hub/models-gated#gated-models), log-in with `hf
|
282
|
+
auth login`.
|
284
283
|
|
285
284
|
</Tip>
|
286
285
|
|
@@ -469,7 +468,7 @@ class FlaxDiffusionPipeline(ConfigMixin, PushToHubMixin):
|
|
469
468
|
class_obj = import_flax_or_no_model(pipeline_module, class_name)
|
470
469
|
|
471
470
|
importable_classes = ALL_IMPORTABLE_CLASSES
|
472
|
-
class_candidates =
|
471
|
+
class_candidates = dict.fromkeys(importable_classes.keys(), class_obj)
|
473
472
|
else:
|
474
473
|
# else we just import it from the library.
|
475
474
|
library = importlib.import_module(library_name)
|
@@ -92,7 +92,7 @@ for library in LOADABLE_CLASSES:
|
|
92
92
|
ALL_IMPORTABLE_CLASSES.update(LOADABLE_CLASSES[library])
|
93
93
|
|
94
94
|
|
95
|
-
def is_safetensors_compatible(filenames, passed_components=None, folder_names=None) -> bool:
|
95
|
+
def is_safetensors_compatible(filenames, passed_components=None, folder_names=None, variant=None) -> bool:
|
96
96
|
"""
|
97
97
|
Checking for safetensors compatibility:
|
98
98
|
- The model is safetensors compatible only if there is a safetensors file for each model component present in
|
@@ -103,6 +103,31 @@ def is_safetensors_compatible(filenames, passed_components=None, folder_names=No
|
|
103
103
|
- For models from the transformers library, the filename changes from "pytorch_model" to "model", and the ".bin"
|
104
104
|
extension is replaced with ".safetensors"
|
105
105
|
"""
|
106
|
+
weight_names = [
|
107
|
+
WEIGHTS_NAME,
|
108
|
+
SAFETENSORS_WEIGHTS_NAME,
|
109
|
+
FLAX_WEIGHTS_NAME,
|
110
|
+
ONNX_WEIGHTS_NAME,
|
111
|
+
ONNX_EXTERNAL_WEIGHTS_NAME,
|
112
|
+
]
|
113
|
+
|
114
|
+
if is_transformers_available():
|
115
|
+
weight_names += [TRANSFORMERS_WEIGHTS_NAME, TRANSFORMERS_SAFE_WEIGHTS_NAME, TRANSFORMERS_FLAX_WEIGHTS_NAME]
|
116
|
+
|
117
|
+
# model_pytorch, diffusion_model_pytorch, ...
|
118
|
+
weight_prefixes = [w.split(".")[0] for w in weight_names]
|
119
|
+
# .bin, .safetensors, ...
|
120
|
+
weight_suffixs = [w.split(".")[-1] for w in weight_names]
|
121
|
+
# -00001-of-00002
|
122
|
+
transformers_index_format = r"\d{5}-of-\d{5}"
|
123
|
+
# `diffusion_pytorch_model.bin` as well as `model-00001-of-00002.safetensors`
|
124
|
+
variant_file_re = re.compile(
|
125
|
+
rf"({'|'.join(weight_prefixes)})\.({variant}|{variant}-{transformers_index_format})\.({'|'.join(weight_suffixs)})$"
|
126
|
+
)
|
127
|
+
non_variant_file_re = re.compile(
|
128
|
+
rf"({'|'.join(weight_prefixes)})(-{transformers_index_format})?\.({'|'.join(weight_suffixs)})$"
|
129
|
+
)
|
130
|
+
|
106
131
|
passed_components = passed_components or []
|
107
132
|
if folder_names:
|
108
133
|
filenames = {f for f in filenames if os.path.split(f)[0] in folder_names}
|
@@ -121,15 +146,29 @@ def is_safetensors_compatible(filenames, passed_components=None, folder_names=No
|
|
121
146
|
components[component].append(component_filename)
|
122
147
|
|
123
148
|
# If there are no component folders check the main directory for safetensors files
|
149
|
+
filtered_filenames = set()
|
124
150
|
if not components:
|
125
|
-
|
151
|
+
if variant is not None:
|
152
|
+
filtered_filenames = filter_with_regex(filenames, variant_file_re)
|
153
|
+
|
154
|
+
# If no variant filenames exist check if non-variant files are available
|
155
|
+
if not filtered_filenames:
|
156
|
+
filtered_filenames = filter_with_regex(filenames, non_variant_file_re)
|
157
|
+
return any(".safetensors" in filename for filename in filtered_filenames)
|
126
158
|
|
127
159
|
# iterate over all files of a component
|
128
160
|
# check if safetensor files exist for that component
|
129
|
-
# if variant is provided check if the variant of the safetensors exists
|
130
161
|
for component, component_filenames in components.items():
|
131
162
|
matches = []
|
132
|
-
|
163
|
+
filtered_component_filenames = set()
|
164
|
+
# if variant is provided check if the variant of the safetensors exists
|
165
|
+
if variant is not None:
|
166
|
+
filtered_component_filenames = filter_with_regex(component_filenames, variant_file_re)
|
167
|
+
|
168
|
+
# if variant safetensor files do not exist check for non-variants
|
169
|
+
if not filtered_component_filenames:
|
170
|
+
filtered_component_filenames = filter_with_regex(component_filenames, non_variant_file_re)
|
171
|
+
for component_filename in filtered_component_filenames:
|
133
172
|
filename, extension = os.path.splitext(component_filename)
|
134
173
|
|
135
174
|
match_exists = extension == ".safetensors"
|
@@ -159,6 +198,10 @@ def filter_model_files(filenames):
|
|
159
198
|
return [f for f in filenames if any(f.endswith(extension) for extension in allowed_extensions)]
|
160
199
|
|
161
200
|
|
201
|
+
def filter_with_regex(filenames, pattern_re):
|
202
|
+
return {f for f in filenames if pattern_re.match(f.split("/")[-1]) is not None}
|
203
|
+
|
204
|
+
|
162
205
|
def variant_compatible_siblings(filenames, variant=None, ignore_patterns=None) -> Union[List[os.PathLike], str]:
|
163
206
|
weight_names = [
|
164
207
|
WEIGHTS_NAME,
|
@@ -207,9 +250,6 @@ def variant_compatible_siblings(filenames, variant=None, ignore_patterns=None) -
|
|
207
250
|
# interested in the extension name
|
208
251
|
return {f for f in filenames if not any(f.endswith(pat.lstrip("*.")) for pat in ignore_patterns)}
|
209
252
|
|
210
|
-
def filter_with_regex(filenames, pattern_re):
|
211
|
-
return {f for f in filenames if pattern_re.match(f.split("/")[-1]) is not None}
|
212
|
-
|
213
253
|
# Group files by component
|
214
254
|
components = {}
|
215
255
|
for filename in filenames:
|
@@ -331,23 +371,39 @@ def maybe_raise_or_warn(
|
|
331
371
|
)
|
332
372
|
|
333
373
|
|
374
|
+
# a simpler version of get_class_obj_and_candidates, it won't work with custom code
|
375
|
+
def simple_get_class_obj(library_name, class_name):
|
376
|
+
from diffusers import pipelines
|
377
|
+
|
378
|
+
is_pipeline_module = hasattr(pipelines, library_name)
|
379
|
+
|
380
|
+
if is_pipeline_module:
|
381
|
+
pipeline_module = getattr(pipelines, library_name)
|
382
|
+
class_obj = getattr(pipeline_module, class_name)
|
383
|
+
else:
|
384
|
+
library = importlib.import_module(library_name)
|
385
|
+
class_obj = getattr(library, class_name)
|
386
|
+
|
387
|
+
return class_obj
|
388
|
+
|
389
|
+
|
334
390
|
def get_class_obj_and_candidates(
|
335
391
|
library_name, class_name, importable_classes, pipelines, is_pipeline_module, component_name=None, cache_dir=None
|
336
392
|
):
|
337
393
|
"""Simple helper method to retrieve class object of module as well as potential parent class objects"""
|
338
|
-
component_folder = os.path.join(cache_dir, component_name)
|
394
|
+
component_folder = os.path.join(cache_dir, component_name) if component_name and cache_dir else None
|
339
395
|
|
340
396
|
if is_pipeline_module:
|
341
397
|
pipeline_module = getattr(pipelines, library_name)
|
342
398
|
|
343
399
|
class_obj = getattr(pipeline_module, class_name)
|
344
|
-
class_candidates =
|
345
|
-
elif os.path.isfile(os.path.join(component_folder, library_name + ".py")):
|
400
|
+
class_candidates = dict.fromkeys(importable_classes.keys(), class_obj)
|
401
|
+
elif component_folder and os.path.isfile(os.path.join(component_folder, library_name + ".py")):
|
346
402
|
# load custom component
|
347
403
|
class_obj = get_class_from_dynamic_module(
|
348
404
|
component_folder, module_file=library_name + ".py", class_name=class_name
|
349
405
|
)
|
350
|
-
class_candidates =
|
406
|
+
class_candidates = dict.fromkeys(importable_classes.keys(), class_obj)
|
351
407
|
else:
|
352
408
|
# else we just import it from the library.
|
353
409
|
library = importlib.import_module(library_name)
|
@@ -412,7 +468,7 @@ def _get_pipeline_class(
|
|
412
468
|
revision=revision,
|
413
469
|
)
|
414
470
|
|
415
|
-
if class_obj.__name__ != "DiffusionPipeline":
|
471
|
+
if class_obj.__name__ != "DiffusionPipeline" and class_obj.__name__ != "ModularPipeline":
|
416
472
|
return class_obj
|
417
473
|
|
418
474
|
diffusers_module = importlib.import_module(class_obj.__module__.split(".")[0])
|
@@ -557,6 +613,9 @@ def _assign_components_to_devices(
|
|
557
613
|
|
558
614
|
|
559
615
|
def _get_final_device_map(device_map, pipeline_class, passed_class_obj, init_dict, library, max_memory, **kwargs):
|
616
|
+
# TODO: seperate out different device_map methods when it gets to it.
|
617
|
+
if device_map != "balanced":
|
618
|
+
return device_map
|
560
619
|
# To avoid circular import problem.
|
561
620
|
from diffusers import pipelines
|
562
621
|
|
@@ -675,8 +734,10 @@ def load_sub_model(
|
|
675
734
|
use_safetensors: bool,
|
676
735
|
dduf_entries: Optional[Dict[str, DDUFEntry]],
|
677
736
|
provider_options: Any,
|
737
|
+
quantization_config: Optional[Any] = None,
|
678
738
|
):
|
679
739
|
"""Helper method to load the module `name` from `library_name` and `class_name`"""
|
740
|
+
from ..quantizers import PipelineQuantizationConfig
|
680
741
|
|
681
742
|
# retrieve class candidates
|
682
743
|
|
@@ -769,6 +830,17 @@ def load_sub_model(
|
|
769
830
|
else:
|
770
831
|
loading_kwargs["low_cpu_mem_usage"] = False
|
771
832
|
|
833
|
+
if (
|
834
|
+
quantization_config is not None
|
835
|
+
and isinstance(quantization_config, PipelineQuantizationConfig)
|
836
|
+
and issubclass(class_obj, torch.nn.Module)
|
837
|
+
):
|
838
|
+
model_quant_config = quantization_config._resolve_quant_config(
|
839
|
+
is_diffusers=is_diffusers_model, module_name=name
|
840
|
+
)
|
841
|
+
if model_quant_config is not None:
|
842
|
+
loading_kwargs["quantization_config"] = model_quant_config
|
843
|
+
|
772
844
|
# check if the module is in a subdirectory
|
773
845
|
if dduf_entries:
|
774
846
|
loading_kwargs["dduf_entries"] = dduf_entries
|
@@ -839,7 +911,10 @@ def _fetch_class_library_tuple(module):
|
|
839
911
|
library = not_compiled_module.__module__
|
840
912
|
|
841
913
|
# retrieve class_name
|
842
|
-
|
914
|
+
if isinstance(not_compiled_module, type):
|
915
|
+
class_name = not_compiled_module.__name__
|
916
|
+
else:
|
917
|
+
class_name = not_compiled_module.__class__.__name__
|
843
918
|
|
844
919
|
return (library, class_name)
|
845
920
|
|
@@ -984,7 +1059,7 @@ def _get_ignore_patterns(
|
|
984
1059
|
use_safetensors
|
985
1060
|
and not allow_pickle
|
986
1061
|
and not is_safetensors_compatible(
|
987
|
-
model_filenames, passed_components=passed_components, folder_names=model_folder_names
|
1062
|
+
model_filenames, passed_components=passed_components, folder_names=model_folder_names, variant=variant
|
988
1063
|
)
|
989
1064
|
):
|
990
1065
|
raise EnvironmentError(
|
@@ -995,7 +1070,7 @@ def _get_ignore_patterns(
|
|
995
1070
|
ignore_patterns = ["*.bin", "*.safetensors", "*.onnx", "*.pb"]
|
996
1071
|
|
997
1072
|
elif use_safetensors and is_safetensors_compatible(
|
998
|
-
model_filenames, passed_components=passed_components, folder_names=model_folder_names
|
1073
|
+
model_filenames, passed_components=passed_components, folder_names=model_folder_names, variant=variant
|
999
1074
|
):
|
1000
1075
|
ignore_patterns = ["*.bin", "*.msgpack"]
|
1001
1076
|
|
@@ -1078,3 +1153,26 @@ def _maybe_raise_error_for_incorrect_transformers(config_dict):
|
|
1078
1153
|
break
|
1079
1154
|
if has_transformers_component and not is_transformers_version(">", "4.47.1"):
|
1080
1155
|
raise ValueError("Please upgrade your `transformers` installation to the latest version to use DDUF.")
|
1156
|
+
|
1157
|
+
|
1158
|
+
def _maybe_warn_for_wrong_component_in_quant_config(pipe_init_dict, quant_config):
|
1159
|
+
if quant_config is None:
|
1160
|
+
return
|
1161
|
+
|
1162
|
+
actual_pipe_components = set(pipe_init_dict.keys())
|
1163
|
+
missing = ""
|
1164
|
+
quant_components = None
|
1165
|
+
if getattr(quant_config, "components_to_quantize", None) is not None:
|
1166
|
+
quant_components = set(quant_config.components_to_quantize)
|
1167
|
+
elif getattr(quant_config, "quant_mapping", None) is not None and isinstance(quant_config.quant_mapping, dict):
|
1168
|
+
quant_components = set(quant_config.quant_mapping.keys())
|
1169
|
+
|
1170
|
+
if quant_components and not quant_components.issubset(actual_pipe_components):
|
1171
|
+
missing = quant_components - actual_pipe_components
|
1172
|
+
|
1173
|
+
if missing:
|
1174
|
+
logger.warning(
|
1175
|
+
f"The following components in the quantization config {missing} will be ignored "
|
1176
|
+
"as they do not belong to the underlying pipeline. Acceptable values for the pipeline "
|
1177
|
+
f"components are: {', '.join(actual_pipe_components)}."
|
1178
|
+
)
|