ComfyUI Extension: ComfyUI Qwen Rectified Flow Tools

Authored by ttulttul

Created

Updated

6 stars

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 you to take an existing image, convert it to a noisy latent using a guided inversion process, and then use that latent as a starting point to generate creative, high-quality variations.

Custom Nodes (0)

    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.