Source profileQuality 87/100

artokun/comfyui-mcp/plugin/skills/flux-txt2img/SKILL.md

flux-txt2img

Build Flux txt2img workflows — Flux.1 Dev (SRPO), Flux 2 Klein 9B, Turbo LoRAs, FluxGuidance, and DualCLIPLoader patterns

Source repository stars
485
Declared platforms
0
Static risk flags
0
Last source update
2026-08-04
Source checked
2026-08-04

Decision brief

What it does—and where it fits

Build Flux txt2img workflows — Flux. 1 Dev (SRPO), Flux 2 Klein 9B, Turbo LoRAs, FluxGuidance, and DualCLIPLoader patterns

Best for

    Not for

    • Tasks that require unconfirmed production actions or broad system permissions.
    • Environments where the pinned source and install steps cannot be inspected.

    Compatibility matrix

    Platform support, with evidence labels

    PlatformStatusEvidenceWhat to check
    CodexNot declaredNo explicit evidencePortability before use
    Claude CodeNot declaredNo explicit evidencePortability before use
    CursorNot declaredNo explicit evidencePortability before use
    Gemini CLINot declaredNo explicit evidencePortability before use
    Open the compatibility checker

    Installation

    Inspect first. Install second.

    The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

    Source-detected install commandSource
    npx skills add https://github.com/artokun/comfyui-mcp --skill "plugin/skills/flux-txt2img"
    Safe inspection promptEditorial

    Inspect the Agent Skill "flux-txt2img" from https://github.com/artokun/comfyui-mcp/blob/0852abe2c68d9fe9e2af89c54cd039357f08ae6c/plugin/skills/flux-txt2img/SKILL.md at commit 0852abe2c68d9fe9e2af89c54cd039357f08ae6c. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

    Workflow

    What the source asks the agent to do

    1. 01

      Complete Workflow: Flux.1 Dev SRPO

      Review the “Complete Workflow: Flux.1 Dev SRPO” section in the pinned source before continuing.

      Review and apply the “Complete Workflow: Flux.1 Dev SRPO” source section.
    2. 02

      Complete Workflow: Flux 2 Klein 9B (Distilled, 4-Step)

      Klein note: Uses single CLIPLoader (not DualCLIPLoader) with type: "flux2" and the Qwen3-8B text encoder from textencoders/. The CLIP loader path resolves from models/textencoders/.

      type must be flux2, not flux. Both values exist in the CLIPLoader enum, so flux loads without complaint and then dies during sampling.Use EmptyFlux2LatentImage, not EmptyLatentImage — Flux 2 uses a different latent channel count.Klein 9B pairs with the Qwen3-8B encoder (qwen38b from Comfy-Org/vae-text-encorder-for-flux-klein-9b). The similarly-named qwen34b ships in the klein-4b repo and is for the 4B model. Mismatching them raises mat1 and mat…
    3. 03

      Complete Workflow: Flux.1 Dev + Turbo LoRA (4-Step)

      Review the “Complete Workflow: Flux.1 Dev + Turbo LoRA (4-Step)” section in the pinned source before continuing.

      Review and apply the “Complete Workflow: Flux.1 Dev + Turbo LoRA (4-Step)” source section.
    4. 04

      Models

      Klein 9B vs Flux.1 Dev: Klein uses Qwen3-8B text encoder (not T5XXL + CLIP-L). It has a different VAE (flux2-vae.safetensors). 9B distilled runs in 4 steps; 9B base needs 50 steps at CFG 5.0. Fits in 20GB VRAM with FP8.

      Klein 9B vs Flux.1 Dev: Klein uses Qwen3-8B text encoder (not T5XXL + CLIP-L). It has a different VAE (flux2-vae.safetensors). 9B distilled runs in 4 steps; 9B base needs 50 steps at CFG 5.0. Fits in 20GB VRAM with FP8.
    5. 05

      Flux.1 Dev SRPO

      Review the “Flux.1 Dev SRPO” section in the pinned source before continuing.

      Review and apply the “Flux.1 Dev SRPO” source section.

    Permission review

    Static risk signals and limitations

    No configured static risk pattern was detected

    This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.

    Evidence record

    Why each signal appears

    EvidenceSourceComputedTestedEditorial
    SignalValueEvidence typeMeaning
    Quality score87/100ComputedDocumentation, specificity, maintenance, and trust rules
    Repository stars485SourceRepository attention, not individual Skill quality
    Compatibility0 platformsSourceDeclared in the catalog source record
    Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

    Pinned source

    Provenance and original SKILL.md

    Repository
    artokun/comfyui-mcp
    Skill path
    plugin/skills/flux-txt2img/SKILL.md
    Commit
    0852abe2c68d9fe9e2af89c54cd039357f08ae6c
    License
    MIT
    Collected
    2026-08-04
    Default branch
    main
    View the original SKILL.md

    Flux Text-to-Image Workflows

    Overview

    Flux is a guidance-distilled diffusion model family from Black Forest Labs. It uses a separate FluxGuidance node instead of KSampler CFG (which must always be 1.0). Three variants are available locally:

    1. Flux.1 Dev SRPO — Fine-tuned Flux.1 Dev with SRPO alignment. Uses DualCLIPLoader (T5XXL + CLIP-L). BF16 only.
    2. Flux 2 Klein 9B — Distilled Flux 2 variant. Uses single CLIPLoader (Qwen3-8B) + flux2-vae.safetensors. Fast 4-step generation.
    3. Flux 2 Turbo LoRA — Applied to Flux.1 Dev for 4-step generation.

    Models

    Flux.1 Dev SRPO

    ComponentNodeModelNotes
    UNETUNETLoaderflux.1-dev-SRPO-BFL-bf16.safetensors22.7GB, BF16 only — FP8 produces broken results
    CLIPDualCLIPLoader (type=flux)clip_name1: t5xxl_fp8_e4m3fn.safetensors, clip_name2: clip_l.safetensorsT5XXL (4.7GB) + CLIP-L (235MB)
    VAEVAELoaderae.safetensorsStandard Flux VAE (320MB). Z-Image uses the same VAE architecture but different weights — its VAE is a separate file (z-image-ae.safetensors), not this one

    Flux 2 Klein 9B

    ComponentNodeModelNotes
    UNETUNETLoaderbigLove_klein1.safetensors17.3GB, Klein 9B variant
    CLIPCLIPLoader (type=flux2)qwen_3_8b_fp8mixed.safetensorsQwen3-8B in text_encoders/ (8.3GB). Use flux2, NOT flux — both exist in the enum and flux fails at the sampler
    VAEVAELoaderflux2-vae.safetensorsFlux 2 specific VAE (321MB)

    Klein 9B vs Flux.1 Dev: Klein uses Qwen3-8B text encoder (not T5XXL + CLIP-L). It has a different VAE (flux2-vae.safetensors). 9B distilled runs in 4 steps; 9B base needs ~50 steps at CFG 5.0. Fits in ~20GB VRAM with FP8.

    Flux 2 Turbo LoRA (applied to Flux.1 Dev)

    ComponentNodeModelNotes
    LoRALoraLoaderModelOnlyflux2-turbo-lora.safetensors2.6GB, strength 1.0
    Alt LoRALoraLoaderModelOnlyFlux2TurboComfyv2.safetensorsCommunity variant, same size

    Conditioning

    CLIPTextEncodeFlux (Recommended for Flux.1 Dev)

    Provides separate prompt fields for each text encoder:

    {
      "class_type": "CLIPTextEncodeFlux",
      "inputs": {
        "clip": ["<dual_clip>", 0],
        "clip_l": "short prompt for CLIP-L",
        "t5xxl": "detailed description for T5XXL",
        "guidance": 3.5
      }
    }
    

    clip_l captures key semantic features. t5xxl expands and refines descriptions. For simple use, put the same prompt in both fields. Guidance is built into this node — no separate FluxGuidance needed.

    FluxGuidance (Alternative)

    If using standard CLIPTextEncode instead of CLIPTextEncodeFlux, apply guidance separately:

    {
      "class_type": "FluxGuidance",
      "inputs": {
        "conditioning": ["<clip_text_encode>", 0],
        "guidance": 3.5
      }
    }
    

    Guidance Values

    ScenarioGuidanceNotes
    Short prompts3.5–4.0Tighter prompt adherence
    Long/complex prompts1.0–1.5More creative freedom
    Realism2.5Less glossy skin, richer detail
    Standard3.5Default for most use cases

    Negative Conditioning

    Flux does NOT support traditional negative prompts (guidance-distilled, CFG=1.0). Use ConditioningZeroOut:

    {
      "class_type": "ConditioningZeroOut",
      "inputs": { "conditioning": ["<positive_cond>", 0] }
    }
    

    Or simply use an empty CLIPTextEncode for the negative input.

    Sampler Settings

    Flux.1 Dev SRPO

    ParameterStandardNotes
    steps20Range: 20–28
    cfg1.0Always 1.0 — guidance is via FluxGuidance
    sampler_nameipndmAuthor-recommended for SRPO
    schedulerbetaAuthor-recommended for SRPO
    guidance3.5Via CLIPTextEncodeFlux or FluxGuidance
    denoise1.0

    SRPO note: The ipndm/beta combo is specifically recommended by the SRPO author. Standard Flux settings (euler/simple) also work but ipndm/beta gives better results with this fine-tune.

    Flux 2 Klein 9B (Distilled)

    ParameterValueNotes
    steps4Distilled model, 4 steps is optimal
    cfg1.0Always 1.0
    sampler_nameeuler
    schedulersimple
    denoise1.0

    Flux 2 Klein 9B (Base/Undistilled)

    ParameterValueNotes
    steps50Full quality
    cfg5.0Higher CFG for base model
    sampler_nameeuler
    schedulersimple

    Flux.1 Dev + Turbo LoRA

    ParameterValueNotes
    steps4Turbo-distilled
    cfg1.0
    sampler_nameeuler
    schedulersimple
    lora_strength1.0

    Resolutions

    AspectResolutionMegapixels
    Square1024x10241.0MP
    Portrait 3:4896x11521.0MP
    Landscape 4:31152x8961.0MP
    Landscape 16:91344x7681.0MP
    Portrait 9:16768x13441.0MP

    Flux operates at ~1 megapixel natively. Dimensions should be multiples of 8.

    Prompt Style

    Natural language descriptions. No quality tags needed (unlike SDXL/Illustrious). Detailed, descriptive prompts work best.

    Good: "A young woman with auburn hair sits at a sunlit cafe in Paris, wearing a cream linen blazer, soft bokeh background, shot on Sony A7III 85mm f/1.4"
    Bad: "masterpiece, best quality, 1girl, cafe, paris"
    

    Complete Workflow: Flux.1 Dev SRPO

    {
      "1": { "class_type": "UNETLoader", "inputs": { "unet_name": "flux.1-dev-SRPO-BFL-bf16.safetensors", "weight_dtype": "default" }},
      "2": { "class_type": "DualCLIPLoader", "inputs": { "clip_name1": "t5xxl_fp8_e4m3fn.safetensors", "clip_name2": "clip_l.safetensors", "type": "flux" }},
      "3": { "class_type": "VAELoader", "inputs": { "vae_name": "ae.safetensors" }},
      "4": { "class_type": "CLIPTextEncodeFlux", "inputs": {
        "clip": ["2", 0],
        "clip_l": "<short prompt>",
        "t5xxl": "<detailed prompt>",
        "guidance": 3.5
      }},
      "5": { "class_type": "ConditioningZeroOut", "inputs": { "conditioning": ["4", 0] }},
      "6": { "class_type": "EmptyLatentImage", "inputs": { "width": 896, "height": 1152, "batch_size": 1 }},
      "7": { "class_type": "KSampler", "inputs": {
        "model": ["1", 0],
        "positive": ["4", 0],
        "negative": ["5", 0],
        "latent_image": ["6", 0],
        "seed": 42, "steps": 20, "cfg": 1, "sampler_name": "ipndm", "scheduler": "beta", "denoise": 1
      }},
      "8": { "class_type": "VAEDecode", "inputs": { "samples": ["7", 0], "vae": ["3", 0] }},
      "9": { "class_type": "SaveImage", "inputs": { "images": ["8", 0], "filename_prefix": "flux_srpo" }}
    }
    

    Complete Workflow: Flux 2 Klein 9B (Distilled, 4-Step)

    {
      "1": { "class_type": "UNETLoader", "inputs": { "unet_name": "bigLove_klein1.safetensors", "weight_dtype": "default" }},
      "2": { "class_type": "CLIPLoader", "inputs": { "clip_name": "qwen_3_8b_fp8mixed.safetensors", "type": "flux2" }},
      "3": { "class_type": "VAELoader", "inputs": { "vae_name": "flux2-vae.safetensors" }},
      "4": { "class_type": "CLIPTextEncode", "inputs": { "clip": ["2", 0], "text": "<prompt>" }},
      "5": { "class_type": "ConditioningZeroOut", "inputs": { "conditioning": ["4", 0] }},
      "6": { "class_type": "EmptyFlux2LatentImage", "inputs": { "width": 1024, "height": 1024, "batch_size": 1 }},
      "7": { "class_type": "KSampler", "inputs": {
        "model": ["1", 0],
        "positive": ["4", 0],
        "negative": ["5", 0],
        "latent_image": ["6", 0],
        "seed": 42, "steps": 4, "cfg": 1, "sampler_name": "euler", "scheduler": "simple", "denoise": 1
      }},
      "8": { "class_type": "VAEDecode", "inputs": { "samples": ["7", 0], "vae": ["3", 0] }},
      "9": { "class_type": "SaveImage", "inputs": { "images": ["8", 0], "filename_prefix": "flux_klein" }}
    }
    

    Klein note: Uses single CLIPLoader (not DualCLIPLoader) with type: "flux2" and the Qwen3-8B text encoder from text_encoders/. The CLIP loader path resolves from models/text_encoders/.

    Two Flux-2-specific gotchas (both fail at the KSampler, not at the loader, so the error points at the wrong node):

    • type must be flux2, not flux. Both values exist in the CLIPLoader enum, so flux loads without complaint and then dies during sampling.
    • Use EmptyFlux2LatentImage, not EmptyLatentImage — Flux 2 uses a different latent channel count.
    • Klein 9B pairs with the Qwen3-8B encoder (qwen_3_8b* from Comfy-Org/vae-text-encorder-for-flux-klein-9b). The similarly-named qwen_3_4b ships in the klein-4b repo and is for the 4B model. Mismatching them raises mat1 and mat2 shapes cannot be multiplied (512x7680 and 12288x4096) — 7680 = 2560x3 (4B hidden size) vs 12288 = 4096x3 (8B) — which reads as a confusing CLIP error rather than a wrong-file error.

    Complete Workflow: Flux.1 Dev + Turbo LoRA (4-Step)

    {
      "1": { "class_type": "UNETLoader", "inputs": { "unet_name": "flux.1-dev-SRPO-BFL-bf16.safetensors", "weight_dtype": "default" }},
      "2": { "class_type": "LoraLoaderModelOnly", "inputs": { "model": ["1", 0], "lora_name": "flux2-turbo-lora.safetensors", "strength_model": 1.0 }},
      "3": { "class_type": "DualCLIPLoader", "inputs": { "clip_name1": "t5xxl_fp8_e4m3fn.safetensors", "clip_name2": "clip_l.safetensors", "type": "flux" }},
      "4": { "class_type": "VAELoader", "inputs": { "vae_name": "ae.safetensors" }},
      "5": { "class_type": "CLIPTextEncodeFlux", "inputs": {
        "clip": ["3", 0],
        "clip_l": "<short prompt>",
        "t5xxl": "<detailed prompt>",
        "guidance": 3.5
      }},
      "6": { "class_type": "ConditioningZeroOut", "inputs": { "conditioning": ["5", 0] }},
      "7": { "class_type": "EmptyLatentImage", "inputs": { "width": 1024, "height": 1024, "batch_size": 1 }},
      "8": { "class_type": "KSampler", "inputs": {
        "model": ["2", 0],
        "positive": ["5", 0],
        "negative": ["6", 0],
        "latent_image": ["7", 0],
        "seed": 42, "steps": 4, "cfg": 1, "sampler_name": "euler", "scheduler": "simple", "denoise": 1
      }},
      "9": { "class_type": "VAEDecode", "inputs": { "samples": ["8", 0], "vae": ["4", 0] }},
      "10": { "class_type": "SaveImage", "inputs": { "images": ["9", 0], "filename_prefix": "flux_turbo" }}
    }
    

    LoRA Support

    Custom LoRAs (jellyfish, etc.)

    Apply Flux LoRAs with LoraLoaderModelOnly between UNET and KSampler:

    {
      "class_type": "LoraLoaderModelOnly",
      "inputs": {
        "model": ["<unet_or_previous_lora>", 0],
        "lora_name": "<lora_file>.safetensors",
        "strength_model": 1.0
      }
    }
    

    Klein LoRAs

    Klein 9B LoRAs go in loras/Flux.2 Klein 9B/ subfolder:

    • klein_slider_detail.safetensors — Detail slider LoRA

    VRAM Considerations

    ModelVRAMNotes
    SRPO BF16 + DualCLIP~24GBFills RTX 4090 exactly. Must use BF16 — FP8 is broken for SRPO
    Klein 9B FP8 + Qwen3-8B~20GBFits comfortably on 4090
    SRPO + Turbo LoRA~24GBSame as SRPO base
    • Always clear_vram before switching to Flux from another model family
    • T5XXL is the main VRAM consumer alongside the UNET — both stay loaded during sampling
    • CLIP-L is small (235MB) and negligible

    Tips

    1. KSampler CFG must always be 1.0 — all guidance is through CLIPTextEncodeFlux or FluxGuidance
    2. SRPO requires BF16 — the FP8 quantization is known to produce broken results with this fine-tune
    3. For short prompts (1-2 sentences), increase guidance to 3.5–4.0. For long prompts (paragraph), decrease to 1.0–1.5
    4. Flux generates excellent text in images — put text to render in quotes within your prompt
    5. Klein 9B is the fastest option at 4 steps — use it for rapid iteration, then switch to SRPO for final quality