from diffusers.modular_pipelines import SequentialPipelineBlocks from diffusers.modular_pipelines.modular_pipeline_utils import InsertableDict from .before_denoise import ChronoEditPrepareLatentStep, ChronoEditSetTimestepsStep from .denoise import ChronoEditDenoiseStep from .inputs import ChronoEditImageInputStep, ChronoEditInputStep from .encoders import ChronoEditImageEncoderStep, ChronoEditProcessImageStep, ChronoEditTextEncoderStep from .decoders import ChronoEditDecodeStep class ChronoEditBeforeDenoiseStep(SequentialPipelineBlocks): block_classes = [ ChronoEditInputStep, ChronoEditSetTimestepsStep, ChronoEditImageInputStep, ChronoEditImageEncoderStep, ChronoEditProcessImageStep, ChronoEditPrepareLatentStep, ] block_names = [ "input", "set_timesteps", "image_input_resolution", "encode_image", "process_image_for_latent_prep", "prepare_latent", ] @property def description(self): return ( "Before denoise step that prepare the inputs for the denoise step.\n" + "This is a sequential pipeline blocks:\n" + " - `ChronoEditSetTimestepsStep` is used to set timesteps\n" + " - `ChronoEditImageInputStep` is used to set the image resolution\n" + " - `ChronoEditImageEncoderStep` is used to derive image embeddings for conditioning\n" + " - `ChronoEditProcessImageStep` is used to process the image for latent preparation\n" + " - `ChronoEditPrepareLatentStep` is used to prepare the latents" ) EDIT_BLOCKS = InsertableDict( [ ("text_encoder", ChronoEditTextEncoderStep), ("before_denoise", ChronoEditBeforeDenoiseStep), ("denoise", ChronoEditDenoiseStep), ("decode", ChronoEditDecodeStep), ] ) ALL_BLOCKS = {"img2img": EDIT_BLOCKS} class ChronoEditBlocks(SequentialPipelineBlocks): block_classes = list(EDIT_BLOCKS.copy().values()) block_names = list(EDIT_BLOCKS.copy().keys())