You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[docs] add modular pipeline conventions and gotchas
Create .ai/modular.md as a shared reference for modular pipeline
conventions, patterns, and common mistakes β parallel to the existing
models.md for model conventions.
Consolidates content from the former modular-conversion.md skill file
and adds gotchas identified from reviewing recent modular pipeline PRs
(LTX #13378, SD3 #13324).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: .ai/AGENTS.md
+4Lines changed: 4 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -35,6 +35,10 @@ Strive to write code as simple and explicit as possible.
35
35
- Use `self.progress_bar(timesteps)` for progress tracking
36
36
- Don't subclass an existing pipeline for a variant β DO NOT use an existing pipeline class (e.g., `FluxPipeline`) to override another pipeline (e.g., `FluxImg2ImgPipeline`) which will be a part of the core codebase (`src`)
37
37
38
+
### Modular Pipelines
39
+
40
+
- See [modular.md](modular.md) for modular pipeline conventions, patterns, and gotchas.
41
+
38
42
## Skills
39
43
40
44
Task-specific guides live in `.ai/skills/` and are loaded on demand by AI agents. Available skills include:
Note: blocks inside `LoopSequentialPipelineBlocks` receive `(components, block_state, k)`where `k` is the loop iteration index.
93
+
Note: sub-blocks inside `LoopSequentialPipelineBlocks` receive `(components, block_state, i, t)`for denoise loops or `(components, block_state, k)` for chunk loops.
93
94
94
95
## Key pattern: Workflow selection
95
96
@@ -136,6 +137,26 @@ ComponentSpec(
136
137
)
137
138
```
138
139
140
+
## Gotchas
141
+
142
+
1.**Importing from standard pipelines.** The modular and standard pipeline systems are parallel β modular blocks must not import from `diffusers.pipelines.*`. For shared utility methods (e.g. `_pack_latents`, `retrieve_timesteps`), either redefine as standalone functions or use `# Copied from diffusers.pipelines.<model>...` headers. See `wan/before_denoise.py` and `helios/before_denoise.py` for examples.
143
+
144
+
2.**Cross-importing between modular pipelines.** Don't import utilities from another model's modular pipeline (e.g. SD3 importing from `qwenimage.inputs`). If a utility is shared, move it to `modular_pipeline_utils.py` or copy it with a `# Copied from` header.
145
+
146
+
3.**Accepting `guidance_scale` as a pipeline input.** Users configure the guider separately (see [guider docs](https://huggingface.co/docs/diffusers/main/en/api/guiders)). Different guider types have different parameters; forwarding them through the pipeline doesn't scale. Don't manually set `components.guider.guidance_scale = ...` inside blocks. Same applies to computing `do_classifier_free_guidance` β that logic belongs in the guider.
147
+
148
+
4.**Accepting pre-computed outputs as inputs to skip encoding.** In standard pipelines we accept `prompt_embeds`, `negative_prompt_embeds`, `image_latents`, etc. so users can skip encoding steps. In modular pipelines this is unnecessary β users just pop out the encoder block and run it separately. Encoder blocks should only accept raw inputs (`prompt`, `image`, etc.).
149
+
150
+
5.**VAE encoding inside prepare-latents.** Image encoding should be its own block in `encoders.py` (e.g. `MyModelVaeEncoderStep`). The prepare-latents block should accept `image_latents`, not raw images. This lets users run encoding standalone. See `WanVaeEncoderStep` for reference.
151
+
152
+
6.**Instantiating components inline.** If a class like `VideoProcessor` is needed, register it as a `ComponentSpec` and access via `components.video_processor`. Don't create new instances inside block `__call__`.
153
+
154
+
7.**Deeply nested block structure.** Prefer flat sequences over nesting Auto blocks inside Sequential blocks inside Auto blocks. Put the `Auto` selection at the top level and make each workflow variant a flat `InsertableDict` of leaf blocks. See `flux2/modular_blocks_flux2_klein.py` for the pattern.
155
+
156
+
8.**Using `InputParam.template()` / `OutputParam.template()` when semantics don't match.** Templates carry predefined descriptions β e.g. the `"latents"` output template means "Denoised latents". Don't use it for initial noisy latents from a prepare-latents step. Use a plain `InputParam(...)` / `OutputParam(...)` with an accurate description instead.
157
+
158
+
9.**Test model paths pointing to contributor repos.** Tiny test models must live under `hf-internal-testing/`, not personal repos like `username/tiny-model`. Move the model before merge.
159
+
139
160
## Conversion checklist
140
161
141
162
-[ ] Read original pipeline's `__call__` end-to-end, map stages
Copy file name to clipboardExpand all lines: .ai/skills/model-integration/SKILL.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -82,7 +82,7 @@ See [../../models.md](../../models.md) for the attention pattern, implementation
82
82
83
83
## Modular Pipeline Conversion
84
84
85
-
See [modular-conversion.md](modular-conversion.md) for the full guide on converting standard pipelines to modular format, including block types, build order, guider abstraction, and conversion checklist.
85
+
See [modular.md](../../modular.md) for the full guide on modular pipeline conventions, block types, build order, guider abstraction, gotchas, and conversion checklist.
0 commit comments