Extensions/ComfyUI Qwen Rectified Flow Tools
ComfyUI Extension

ComfyUI Qwen Rectified Flow Tools

This custom node pack for ComfyUI provides a suite of advanced tools for performing 'invert-and-resample' workflows with Rectified Flow models like Qwen-VL. It allows…

By ttulttul·Created 10 months ago·Updated 7 months ago· 7
ttulttul/ComfyUI-FlowMatching-Inverter
Nodes3
On cloudLocal install
CategoryQwen/Sampling, Qwen/Diagnostics
Stars7
Updated7 months ago
Readme

ComfyUI Qwen Rectified Flow Inverter

Custom nodes for ComfyUI that target rectified-flow models (for example, Qwen). This pack focuses on inversion and diagnostics; the latent/image/conditioning noise nodes live in Skoogeer-Noise (see ../Skoogeer-Noise).

Installation

  1. Clone this repository into ComfyUI/custom_nodes/ComfyUI-QwenRectifiedFlowInverter.
  2. (Optional but recommended) Also install Skoogeer-Noise into ComfyUI/custom_nodes/Skoogeer-Noise for the forward-diffusion/noise/conditioning helpers.
  3. Restart ComfyUI.

Data types

LATENT

ComfyUI latents are dictionaries containing a "samples" tensor.

  • Common SD-style latents: samples has shape (B, C, H, W).
  • Video / flow-matching latents may be 5D: (B, C, T, H, W).

CONDITIONING

ComfyUI represents prompt conditioning as a list of [embedding, metadata] entries. This pack reads the embedding tensor from positive[0][0] and uses it as the model context during inversion.

Nodes

Qwen Rectified Flow Inverter

Runs the rectified-flow integration to produce a partially inverted (re-noised) latent. Supports deterministic velocity amplification, seeded stochastic perturbation, and optional output normalization.

  • Menu category: Qwen/Sampling
  • Returns: LATENT

Inputs

| Field | Type | Default | Notes | |------|------|---------|------| | model | MODEL | – | Diffusion model / UNet used to predict velocity. | | latent_image | LATENT | – | Source latent to invert. | | positive | CONDITIONING | – | Positive prompt conditioning used as context. | | seed | INT | 0 | Seed for the velocity perturbation noise. | | steps | INT | 20 | Integration budget; effective steps = int(steps * inversion_strength). | | inversion_strength | FLOAT | 0.5 | Fraction of the schedule to traverse (0 = no-op). | | velocity_amplification | FLOAT | 0.0 | Multiplies predicted velocity by (1 + velocity_amplification) each step. | | velocity_perturb_strength | FLOAT | 0.0 | Adds seeded noise to velocity (scaled by velocity std). | | internal_precision | enum | bfloat16 | Autocast dtype while running the UNet (force_float32 is most stable). | | normalize_output | enum | enable | When enabled, normalizes each batch item to mean 0 / std 1 at the end. |

Notes

  • If you see NaN detected at step ..., increase precision (internal_precision = force_float32) and/or reduce velocity_amplification / velocity_perturb_strength.
  • normalize_output = enable is strongly recommended at higher inversion_strength.

Latent Hybrid Inverter (Qwen)

Runs the inverter and an internal forward-diffusion anchor pass, then blends both latents via spherical interpolation (SLERP).

  • Menu category: Qwen/Sampling
  • Returns: LATENT

Inputs

| Field | Type | Default | Notes | |------|------|---------|------| | model | MODEL | – | Model used for both passes. | | latent_image | LATENT | – | Source latent. | | positive | CONDITIONING | – | Context used by the inverter pass. | | steps | INT | 20 | Schedule/integration steps. | | strength | FLOAT | 0.5 | Target noise level (also used as the forward-diffusion strength). | | blend_factor | FLOAT | 0.5 | 0 = 100% forward diffusion (stable), 1 = 100% inverter (creative). | | inverter_seed | INT | 0 | Seed for the inverter’s velocity perturbation. | | forward_diffusion_seed | INT | 1 | Seed for the forward-diffusion anchor noise. | | velocity_amplification | FLOAT | 1.0 | Passed through to the inverter node. | | velocity_perturb_strength | FLOAT | 0.2 | Passed through to the inverter node. | | internal_precision | enum | bfloat16 | Passed through to the inverter node. | | normalize_output | enum | enable | Passed through to the inverter node. |


Memory Diagnostics (Pass-Through)

Passes any input through unchanged while printing basic GPU memory statistics to the console.

  • Menu category: Qwen/Diagnostics
  • Returns: same as input

Inputs

| Field | Type | Default | Notes | |------|------|---------|------| | data | any | – | Input payload (any ComfyUI type). | | label | STRING | "" | Optional label included in the printed line. | | synchronize | enum | enable | When enabled, synchronizes GPU kernels before sampling memory. |

Example workflows

Manual composition (recommended with Skoogeer-Noise)

  1. Encode an image to a latent.
  2. Run Qwen Rectified Flow Inverter.
  3. In Skoogeer-Noise, run Forward Diffusion (Add Scheduled Noise) with the same steps and noise_strength but a different seed (this gives an anchor latent samplers expect).
  4. Blend the two latents (e.g. Latent Slerp) and sample with denoise matching the strength you used.

Hybrid node quickstart

  1. Encode an image to a latent.
  2. Run Latent Hybrid Inverter (Qwen).
  3. Sample the output latent with denoise = strength.

Running the tests

Run:

./run_tests.sh

The script creates (or reuses) a .venv folder, installs the dependencies from requirements.txt, and launches pytest.