From 9cc14db62ffe171eb1f1072fdcd34ba76fe5b220 Mon Sep 17 00:00:00 2001 From: yiyixuxu Date: Mon, 17 Aug 2026 21:10:58 +0000 Subject: [PATCH] drop the default of a required InputParam, with a warning Co-Authored-By: Claude Opus 5 --- .../modular_pipelines/cosmos/before_denoise.py | 4 ++-- src/diffusers/modular_pipelines/cosmos/denoise.py | 2 +- src/diffusers/modular_pipelines/krea2/denoise.py | 4 ++-- src/diffusers/modular_pipelines/ltx/before_denoise.py | 4 ++-- src/diffusers/modular_pipelines/ltx/decoders.py | 2 +- src/diffusers/modular_pipelines/ltx/denoise.py | 10 +++++----- src/diffusers/modular_pipelines/ltx2/decoders.py | 4 ++-- src/diffusers/modular_pipelines/ltx2/denoise.py | 4 ++-- .../modular_pipelines/minimax_h3/before_denoise.py | 2 +- .../modular_pipelines/modular_pipeline_utils.py | 9 +++++++++ src/diffusers/modular_pipelines/qwenimage/denoise.py | 2 +- 11 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/diffusers/modular_pipelines/cosmos/before_denoise.py b/src/diffusers/modular_pipelines/cosmos/before_denoise.py index 7bf431aa855b..d4ee399ec852 100644 --- a/src/diffusers/modular_pipelines/cosmos/before_denoise.py +++ b/src/diffusers/modular_pipelines/cosmos/before_denoise.py @@ -950,7 +950,7 @@ def expected_configs(self) -> list[ConfigSpec]: @property def inputs(self) -> list[InputParam]: return [ - InputParam.template("num_inference_steps", required=True), + InputParam.template("num_inference_steps"), ] @property @@ -1221,7 +1221,7 @@ def expected_components(self) -> list[ComponentSpec]: @property def inputs(self) -> list[InputParam]: - return [InputParam.template("num_inference_steps", required=True)] + return [InputParam.template("num_inference_steps")] @property def intermediate_outputs(self) -> list[OutputParam]: diff --git a/src/diffusers/modular_pipelines/cosmos/denoise.py b/src/diffusers/modular_pipelines/cosmos/denoise.py index eda37c8e99cf..c050840bffc6 100644 --- a/src/diffusers/modular_pipelines/cosmos/denoise.py +++ b/src/diffusers/modular_pipelines/cosmos/denoise.py @@ -459,7 +459,7 @@ def loop_expected_components(self) -> list[ComponentSpec]: def loop_inputs(self) -> list[InputParam]: return [ InputParam.template("timesteps", required=True), - InputParam.template("num_inference_steps", required=True), + InputParam.template("num_inference_steps"), InputParam( name="num_warmup_steps", type_hint=int, required=True, description="Number of scheduler warmup steps." ), diff --git a/src/diffusers/modular_pipelines/krea2/denoise.py b/src/diffusers/modular_pipelines/krea2/denoise.py index 88c6cdca7aba..74cf48e880da 100644 --- a/src/diffusers/modular_pipelines/krea2/denoise.py +++ b/src/diffusers/modular_pipelines/krea2/denoise.py @@ -89,7 +89,7 @@ def expected_components(self) -> list[ComponentSpec]: def inputs(self) -> list[InputParam]: return [ InputParam(name="latents", required=True, type_hint=torch.Tensor, description="Packed image latents."), - InputParam.template("num_inference_steps", required=True), + InputParam.template("num_inference_steps"), InputParam( name="prompt_embeds", required=True, @@ -256,7 +256,7 @@ def loop_inputs(self) -> list[InputParam]: type_hint=torch.Tensor, description="Denoising timesteps from set_timesteps.", ), - InputParam.template("num_inference_steps", required=True), + InputParam.template("num_inference_steps"), InputParam.template("attention_kwargs"), ] diff --git a/src/diffusers/modular_pipelines/ltx/before_denoise.py b/src/diffusers/modular_pipelines/ltx/before_denoise.py index cd8b3ea82b82..05370a4c6b8b 100644 --- a/src/diffusers/modular_pipelines/ltx/before_denoise.py +++ b/src/diffusers/modular_pipelines/ltx/before_denoise.py @@ -278,7 +278,7 @@ def inputs(self) -> list[InputParam]: InputParam.template("latents"), InputParam.template("num_images_per_prompt", name="num_videos_per_prompt"), InputParam.template("generator"), - InputParam.template("batch_size", required=True), + InputParam.template("batch_size", required=True, default=None), ] @property @@ -342,7 +342,7 @@ def inputs(self) -> list[InputParam]: InputParam.template("width", default=704), InputParam("num_frames", type_hint=int, default=161), InputParam.template("num_images_per_prompt", name="num_videos_per_prompt"), - InputParam.template("batch_size", required=True), + InputParam.template("batch_size", required=True, default=None), ] @property diff --git a/src/diffusers/modular_pipelines/ltx/decoders.py b/src/diffusers/modular_pipelines/ltx/decoders.py index 8664dee25bfe..ec147aecccbd 100644 --- a/src/diffusers/modular_pipelines/ltx/decoders.py +++ b/src/diffusers/modular_pipelines/ltx/decoders.py @@ -76,7 +76,7 @@ def inputs(self) -> list[tuple[str, Any]]: InputParam("decode_noise_scale", default=None), InputParam.template("generator"), InputParam.template("batch_size"), - InputParam.template("dtype", required=True), + InputParam.template("dtype", required=True, default=None), ] @property diff --git a/src/diffusers/modular_pipelines/ltx/denoise.py b/src/diffusers/modular_pipelines/ltx/denoise.py index b3ed86b51679..9aee87568a85 100644 --- a/src/diffusers/modular_pipelines/ltx/denoise.py +++ b/src/diffusers/modular_pipelines/ltx/denoise.py @@ -45,7 +45,7 @@ def description(self) -> str: def inputs(self) -> list[InputParam]: return [ InputParam.template("latents", required=True), - InputParam.template("dtype", required=True), + InputParam.template("dtype", required=True, default=None), ] @torch.no_grad() @@ -95,7 +95,7 @@ def description(self) -> str: def inputs(self) -> list[tuple[str, Any]]: inputs = [ InputParam.template("attention_kwargs"), - InputParam.template("num_inference_steps", required=True), + InputParam.template("num_inference_steps"), InputParam("rope_interpolation_scale", type_hint=tuple), InputParam.template("height"), InputParam.template("width"), @@ -207,7 +207,7 @@ def loop_expected_components(self) -> list[ComponentSpec]: def loop_inputs(self) -> list[InputParam]: return [ InputParam.template("timesteps", required=True), - InputParam.template("num_inference_steps", required=True), + InputParam.template("num_inference_steps"), ] @torch.no_grad() @@ -271,7 +271,7 @@ def inputs(self) -> list[InputParam]: return [ InputParam.template("latents", required=True), InputParam("conditioning_mask", required=True, type_hint=torch.Tensor), - InputParam.template("dtype", required=True), + InputParam.template("dtype", required=True, default=None), ] @torch.no_grad() @@ -323,7 +323,7 @@ def description(self) -> str: def inputs(self) -> list[tuple[str, Any]]: inputs = [ InputParam.template("attention_kwargs"), - InputParam.template("num_inference_steps", required=True), + InputParam.template("num_inference_steps"), InputParam("rope_interpolation_scale", type_hint=tuple), InputParam.template("height"), InputParam.template("width"), diff --git a/src/diffusers/modular_pipelines/ltx2/decoders.py b/src/diffusers/modular_pipelines/ltx2/decoders.py index fc957a3f9925..16e97c3fb178 100644 --- a/src/diffusers/modular_pipelines/ltx2/decoders.py +++ b/src/diffusers/modular_pipelines/ltx2/decoders.py @@ -160,7 +160,7 @@ def inputs(self) -> list[tuple[str, Any]]: "num_frames", type_hint=int, default=121, description="The number of frames in the generated video." ), InputParam.template("generator"), - InputParam.template("dtype", required=True), + InputParam.template("dtype", required=True, default=None), ] @property @@ -250,7 +250,7 @@ def inputs(self) -> list[tuple[str, Any]]: ), InputParam.template("generator"), InputParam.template("batch_size"), - InputParam.template("dtype", required=True), + InputParam.template("dtype", required=True, default=None), ] @property diff --git a/src/diffusers/modular_pipelines/ltx2/denoise.py b/src/diffusers/modular_pipelines/ltx2/denoise.py index 5cc5a4e57abc..07f15582f785 100644 --- a/src/diffusers/modular_pipelines/ltx2/denoise.py +++ b/src/diffusers/modular_pipelines/ltx2/denoise.py @@ -297,7 +297,7 @@ def inputs(self) -> list[InputParam]: # `audio_num_frames`, `video_coords`, `audio_coords` arrive tagged `denoiser_input_fields` upstream and # are collected from the tagged dict (filtered against the transformer signature) in `__call__`. InputParam.template("denoiser_input_fields"), - InputParam.template("num_inference_steps", required=True), + InputParam.template("num_inference_steps"), InputParam.template("height", default=512), InputParam.template("width", default=704), InputParam( @@ -620,7 +620,7 @@ def loop_expected_components(self) -> list[ComponentSpec]: def loop_inputs(self) -> list[InputParam]: return [ InputParam("timesteps", type_hint=torch.Tensor, required=True), - InputParam.template("num_inference_steps", required=True), + InputParam.template("num_inference_steps"), ] @torch.no_grad() diff --git a/src/diffusers/modular_pipelines/minimax_h3/before_denoise.py b/src/diffusers/modular_pipelines/minimax_h3/before_denoise.py index c670467a9307..fd297e1b654f 100644 --- a/src/diffusers/modular_pipelines/minimax_h3/before_denoise.py +++ b/src/diffusers/modular_pipelines/minimax_h3/before_denoise.py @@ -1126,7 +1126,7 @@ def expected_components(self) -> list[ComponentSpec]: @property def inputs(self) -> list[InputParam]: return [ - InputParam.template("num_inference_steps", required=True), + InputParam.template("num_inference_steps"), InputParam( name="video_indices", type_hint=torch.Tensor, diff --git a/src/diffusers/modular_pipelines/modular_pipeline_utils.py b/src/diffusers/modular_pipelines/modular_pipeline_utils.py index e4a81e398e8c..49253188f9df 100644 --- a/src/diffusers/modular_pipelines/modular_pipeline_utils.py +++ b/src/diffusers/modular_pipelines/modular_pipeline_utils.py @@ -571,6 +571,15 @@ class InputParam: # resolves its own default at runtime in `get_block_state` defaults_by_block: dict[str, Any] = None + def __post_init__(self): + if self.required and self.default is not None: + logger.warning( + f"InputParam '{self.name}' is required and declares a default ({self.default!r}), which cannot both " + f"hold: a required input is never missing, so its default is unreachable. Dropping the default. Drop " + f"`required=True` instead if {self.default!r} is meant to be the real fallback." + ) + self.default = None + def __repr__(self): return f"<{self.name}: {'required' if self.required else 'optional'}, default={self.default}>" diff --git a/src/diffusers/modular_pipelines/qwenimage/denoise.py b/src/diffusers/modular_pipelines/qwenimage/denoise.py index de8ea05c5047..1366f7a027b2 100644 --- a/src/diffusers/modular_pipelines/qwenimage/denoise.py +++ b/src/diffusers/modular_pipelines/qwenimage/denoise.py @@ -462,7 +462,7 @@ def loop_inputs(self) -> list[InputParam]: type_hint=torch.Tensor, description="The timesteps to use for the denoising process. Can be generated in set_timesteps step.", ), - InputParam.template("num_inference_steps", required=True), + InputParam.template("num_inference_steps"), ] @torch.no_grad()