Skip to content

Flux 2 Klein 9B Image Creator V1.1.3 — Handbook

Files that matter (source of truth):

file role goes to
SoulCraft Image Creator (Flux 2 Klein 9B).json the ComfyUI workflow (292 nodes, 37 groups), V1.1.3 RunPod (/workspace/runpod-slim)
image-creator-flux-2-klein-9b-script.sh the thin package script (118 lines): 32 packs, 13 files, the SageAttention hook, the SUPERSEDED list — declared and handed to ComfyUI Base, which does the work RunPod, beside the JSON
suite.py + pytest.ini the suite: 38 test functions across 8 tiers, on the base’s basetest plugin RunPod, beside the JSON
image-creator-flux-2-klein-9b-handbook.md this document your machine / next Cowork session

image-creator-flux-2-klein-9b-runpod.zip is the four files above, built by base/comfyui-base/_build/package.py. comfyui-base/ is step one on a fresh pod; this package is step two. V1.0.0 (2026-09-04) is the first installer this workflow has had.

1. What it does

FLUX.2 Klein 9B stills with the stock Qwen3-8B text encoder (Comfy-Org’s bf16 repackage) and the UltraHD RAW VAE; a Klein LoRA loader with one row (the consistency LoRA, off); SAM3 SmartInpainter detail passes for face, eyes, hands and a spare, rendered by stock SDXL base 1.0 with its own detailer LoRA rows (off by default); Ultimate SD Upscale with the 4× NMKD Siax model and a SeedVR2 7B pass; Florence-2 (MiaoshouAI PromptGen v2.0) captions; Depth Anything V2 and the ControlNet preprocessors; the LC123 post suite (grade, grain, lens, overlays), CiviScribe’s Civitai-ready PNG saver. Eight Fast Groups Bypasser panels drive it; the Sage attention patch node is live.

2. Deploy on RunPod (RTX PRO 6000 Blackwell, ComfyUI template)

VRAM. 29 GB minimum and comfortable (estimated; the graph clears VRAM between its stages).

Terminal window
cd /workspace/runpod-slim
python3 -m zipfile -e "comfyui-base-runpod.zip" . # step one, once per pod
bash "comfyui-base/comfyui-base-script.sh"
python3 -m zipfile -e "image-creator-flux-2-klein-9b-runpod.zip" .
bash "image-creator-flux-2-klein-9b-script.sh" # 32 packs → SageAttention → 13 files → workflow paths → checks → suite → launch line

The token is required. Two files are gated on the Hub — black-forest-labs/FLUX.2-klein-9b (the engine) and facebook/sam3 — so HF_TOKEN must belong to an account that has accepted both licences; the base asks once and keeps it at /workspace/comfy-base/state/tokens.env (mode 600). Without it those two downloads fail and the run exits 1 naming them.

≈ 64 GB downloaded: the engine (18 GB), SeedVR2 (16.5 GB + 0.5), the Qwen3-8B text encoder (16.4 GB), SDXL base 1.0 (6.9 GB), SAM3 (3.5 GB), Depth Anything (1.3 GB), SAM ViT-B and NMKD. Florence-2 and RMBG-2.0 fetch their own weights on the first queue. Four files are yours — the graph names them by your own names and no source the base downloads from carries them:

dest file why LOCAL
loras/Flux.2/Klein f2k_consist_20260225.safetensors your LoRA
loras/SDXL/Detailers Beautiful face_alpha1.0_rank4_noxattn_last.safetensors a LoRA extraction of yours
vae/Flux.2 flux2UltrahdRAWVAE_fp32.safetensors FLUX.2 UltraHD RAW VAE, fp32: CivitAI only (model 2661016, file 2867447, 336 213 524 bytes); the base downloads from the Hub and GitHub only
loras/SDXL/Detailers DetailedEyes_V3.safetensors DetailedEyes_XL v3.0: CivitAI only (model 120723, 93 151 000 bytes), same reason

The base searches every filesystem on the pod for each by name (any size), moves it into the library, and on a pod without it fails the run by name; --check lists each as found or MISSING. Nothing is substituted. The graph was built on your pod, so these exist there; on a fresh pod, copy them to the volume first (anywhere — the index finds them).

SFW only (V1.1.0). The brand rule allows no field, toggle, preset or model row that turns nudity, sexual content or brutal gore on. Removed, and named in SUPERSEDED so a pod offers the old copies for deletion: the SDXL detailer checkpoint pornmaster_proSDXLV8 (an adult checkpoint; stock sd_xl_base_1.0 from Stability AI takes its place), the text encoder qwen3-8B-abliterated-bf16.gguf (abliterated, i.e. refusal-removed; Comfy-Org’s stock qwen_3_8b.safetensors takes its place, and ClipLoaderGGUF loads it through ComfyUI’s own loader), the prompt enhancer’s Qwen3-4B-abliterated-bf16.gguf, and the LoRAs egirl_v1_b_f2k9b_000002940 and insta klein9b (no model card exists for either, and their names point at the glamour genre the source workflow was built for). The Qwen prompt-enhancer branch is gone whole: its pack, ComfyUI-QwenVL-Mod, lists fourteen NSFW presets and a catalog of only abliterated or “heretic” models on the node itself, and the graph fed it a 🚫 NSFW instruction preset through a five-way switch. The pack is DROPPED_PACKS, with ComfyLiterals, whose String node served only those presets (the base warns while either is installed and no package claims it); the prompt now reaches the engine as written, with the Florence-2 caption joined when Prompt Assist is on. The detailer negative no longer lists censored, and the notes lost the abliterated-encoder links and their NSFW advice.

The library (the base’s <category>/<Family>[/<Purpose>]/<file>; the graph shipped Windows paths — Flux2\, Flux 2\Klein\, SDXL\detailers\ — which the base’s sync rewrote on eleven widgets): diffusion_models/Flux.2/Klein/, vae/Flux.2/, clip/Qwen/, loras/Flux.2/Klein/, checkpoints/SDXL/, loras/SDXL/Detailers/, upscale_models/NMKD/; and flat, because their packs os.listdir the folder: sams/ (SAM ViT-B for the Impact loader, sam3.pt for the SmartInpainters), SEEDVR2/, depthanything/. Node 821’s flux-2-klein-9b-Q8_0.gguf is a bypassed alternate of the bf16 engine: not a row (no alternate models); the base reports it by name at install. Two stale properties.models entries from the Flux.2 Dev workflow this graph grew out of (flux2_dev_fp8mixed, flux2-vae) were removed — they made the frontend offer downloads of files no node loads.

Packs. 32 beyond the base’s (rgthree, KJNodes, cg-use-everywhere): 25 are Krea 2’s, at Krea 2’s pins (the two packages share most of their node vocabulary — LC123, mxToolkit, RES4LYF, Detail Daemon, the flow-matching scheduler, SAM3 SmartInpainter, LayerStyle, RMBG, SeedVR2, Ultimate SD Upscale, essentials, DepthAnythingV2, controlnet_aux, Derfuu, DemonAlone, Logic, vslinx, Custom-Scripts, gguf (calcuis’ fork; its ClipLoaderGGUF is the text encoder loader the graph uses) and the rest; a row’s sha is the last-tested record), ComfyUI-Easy-Use and ComfyUI-Impact-Pack at the Continuer’s pins, and five of its own: ComfyUI-Florence2 (Krea 2 dropped it; this graph still captions with it), ComfyUI-GGUF (city96; UnetLoaderGGUF, the bypassed Q8 alternate — city96 spells its clip loader CLIPLoaderGGUF, so the two packs register different names and coexist), comfy-image-saver (Sampler Selector, Scheduler Selector), ccollins-civiscribe (the saver), ComfyUI-Flux2Klein-Enhancer (capitan01R; not in the Registry, pinned by commit). Not installed on purpose: comfyui-workflow-encrypt — two nodes carry that id (SAMLoader, easy showAnything) but they belong to Impact-Pack and Easy-Use; the id is a leftover of an encryption pass (extra.k2cf_state_id).

SageAttention. PathchSageAttentionKJ (node 95) is live, so the graph needs sageattention in the venv: pkg_post_venv calls the base’s base_build_sageattention, which builds it from its newest source for this GPU’s sm at install (cached by the resolved upstream commit, rebuilt whenever main, Python, torch or the sm moves); a failed build fails the run. --use-sage-attention is removed from the launch args: the node is the one control.

3. The suite

unit, graph (loaders on library paths with no backslash left, the LoRA rows’ on/off state, the bypassed alternate, the stale Dev entries gone, flat categories bare, panels naming real groups, no adult or uncensored text in any string of the JSON, no file CivitAI flags nsfw named anywhere, the UE links), contract (the thin script, the 32 pins against Krea 2’s and the Continuer’s, no row or pack that is adult or uncensored and the removed files SUPERSEDED, the four LOCAL rows named, the two gated rows, every loader ⇄ row, the handbook), install (fake pod: --check changes nothing and lists every LOCAL row; a run with the four files planted lands all 13 and removes the sage flag; a run without them fails naming all four; failed downloads name every file), comfyui (every node type resolves to core or an installed pack, by source or by the graph’s own pack id), server, runpod, gpu (pod only). Run: bash image-creator-flux-2-klein-9b-script.sh test.

4. Record

  • V1.1.3 (2026-10-17). GPU_MIN_GB for the site’s catalog. GPU_MIN_GB="29", estimated: the smallest card the default flow runs on, for the site’s catalog. It is the heaviest stage’s weights at the precision the loader picks, plus ComfyUI’s own memory_required activations and its 1.2 GiB inference reserve, with ComfyUI swapping models between stages; the script’s comment holds the arithmetic. Comfortable: 29 GB. A measured peak replaces the estimate at the next free GPU smoke. No graph change but the version stamp.
  • V1.1.2 (2026-10-16). Every Hub row is pinned to a commit. ComfyUI Base 3.12.0 honours the revision in a row and checks each Hub file against the sha256 the Hub states for that commit, once, at download, so a repo that moves or renames a file upstream can no longer 404 a row or change what installs (the H3 latent upscaler broke that way on 2026-09-17). The nine Hub rows name a commit: seven the one base.sh gen-models <dir> --pin printed on 2026-10-16, and the two gated rows (black-forest-labs/FLUX.2-klein-9b at 92196c8, facebook/sam3 at 3c879f3) the commit the Hub’s model API names, set by hand because gen-models cannot read a gated repo without a token; the Hub’s tree at each commit lists the file at the declared size. Each file’s size is unchanged. The four LOCAL rows stay LOCAL. Files already on a volume are kept as they are: no download and no re-hash. BASE_MIN is 3.12.0, because an older base drops the revision and fetches main. No graph change but the version stamp.
  • V1.1.1 (2026-10-16). Posing Dynamics is gone. The Klein LoRA Posing Dynamics-v1 Flux2-Klein-9b.safetensors shipped ON. It is CivitAI model 1185671, version 2747664 (that exact file name), and CivitAI’s public API flags the model nsfw: true, nsfwLevel: 60; V1.0.2’s note that it was “not on CivitAI under this name” was wrong. Under the SFW rule it is not kept off by default but removed: its row in node 539 (both widgets_values and widgets_values_named), its LOCAL row, its hint in the summary and its handbook lines. The file is SUPERSEDED (a pod offers its copy for deletion, never takes it). Node 539 keeps one row, the consistency LoRA, off. The other four LOCAL files were checked on the same API: the UltraHD RAW VAE (2661016) and DetailedEyes_XL (120723) and f2k_consist (1939453) read nsfw: false; the “Beautiful face” extraction is not listed. The Hub rows carry no not-for-all-audiences tag. A new test holds it: no file CivitAI flags is named in the workflow, a row or anywhere in the script but SUPERSEDED. 292 nodes, 13 files (4 LOCAL), 32 packs, ≈ 64 GB.
  • V1.1.0 (2026-10-16). SFW only. The brand rule (no switch, field, toggle, flag or model row that turns nudity, sexual content or brutal gore on) applied to every model row, LoRA, text encoder, captioner and prompt text, the way the Video Creator’s V8.1.0 removed its uncensored set. Replaced: the adult SDXL detailer checkpoint by stock SDXL base 1.0, the abliterated Qwen3-8B GGUF text encoder by Comfy-Org’s stock qwen_3_8b.safetensors (both now download rows, not LOCAL). Removed: the egirl and insta Klein LoRAs, and the whole Qwen prompt-enhancer branch (11 nodes, 2 groups: the enhancer, its VRAM clear, five instruction presets one of which was 🚫 NSFW and three more of which told the model to describe nudity and sexual acts, their switch, bypasser, panel and note), with its abliterated Qwen3-4B GGUF and the ComfyUI-QwenVL-Mod pack, whose own presets and model catalog are NSFW and uncensored. ComfyLiterals goes too: its String node served only those presets. The five old files are SUPERSEDED (offered for deletion, never taken); both packs are DROPPED_PACKS. The detailer negative drops censored; three notes lose an abliterated-encoder link and NSFW advice. Audited and kept: Florence-2 PromptGen v2.0 (a captioner that describes the input image), the UltraHD RAW VAE, the consistency and Posing Dynamics LoRAs (Posing Dynamics: removed in V1.1.1), the two SDXL detailer LoRAs (face, eyes), SAM, SAM3, SeedVR2, NMKD, Depth Anything. The package has no builder: the workflow was patched in place by one scripted pass (both widgets_values and its widgets_values_named mirror). Two new tests hold the rule: no string in the JSON and no row or pack matches the adult or uncensored vocabulary, and the five files are SUPERSEDED. 292 nodes, 14 files (5 LOCAL), 32 packs, ≈ 64 GB.
  • V1.0.2 (2026-10-16). The gate is green again. The two CivitAI rows (the UltraHD RAW VAE and DetailedEyes_V3), refused by the base since 2.3.0, are LOCAL rows: ten files are yours now, and --check lists them by name. Six pack records (gguf, LayerStyle, LayerStyle_Advance, RES4LYF, DemonAlone, LC123) move to Krea 2’s current ones; Krea 2 dropped Florence-2 and QwenVL-Mod, so 25 packs are Krea 2’s and seven are this package’s own. The two Krea 2 comparisons skip where the siblings are absent (an extracted zip, a pod). On the Mac only, RMBG may be unregistered: ComfyUI-RMBG (229529e) imports its SAM3 module, which needs triton, and its error handler then fails the whole pack. On a host with neither CUDA nor MPS (the CI’s Linux runner) SeedVR2’s two loaders do not register either: their device combo defaults to the first of an empty list. No graph change.
  • V1.0.1 (2026-09-25). Onto ComfyUI Base 3.0.0, which is always the newest and retired SAGE_WHEEL. The package’s own SageAttention hook (a copy of the Replacer’s) installed SAGE_WHEEL when set and returned early whenever any build already imported, so a reused venv never followed upstream. It now calls base_build_sageattention, as Krea 2 does; ninja leaves PIP_EXTRA (the base installs it, at its newest, before a build); sage reads the version from the package metadata (SageAttention 2 sets no __version__); --latest is described as the plain run it now is; BASE_MIN is 3.0.0, the first base whose build cannot be held below its newest. The install tier reads the base-owned state/comfyui_args.txt. No graph change. Still owed (HANDOFF): the two CivitAI rows, which the base has refused since 2.3.0, so the suite stops at collection.
  • V1.0.0 (2026-09-04). First installer, on ComfyUI Base (plan 7 of the base series, the last package). Sources researched for all 17 files: nine download (two gated, two CivitAI fileId-pinned, five Hub), eight are LOCAL as above. Verification: 32 passed, 3 skipped (the pod-only tiers) on the repo testbed with a live server. Pod acceptance (base zip → this zip → test runpod) is the open step, and this graph has never rendered under the installer — the first render, with the eight files in place, is the real test.