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).
cd /workspace/runpod-slimpython3 -m zipfile -e "comfyui-base-runpod.zip" . # step one, once per podbash "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 lineThe 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 ownmemory_requiredactivations 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> --pinprinted on 2026-10-16, and the two gated rows (black-forest-labs/FLUX.2-klein-9bat92196c8,facebook/sam3at3c879f3) the commit the Hub’s model API names, set by hand becausegen-modelscannot 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_MINis 3.12.0, because an older base drops the revision and fetchesmain. 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.safetensorsshipped ON. It is CivitAI model 1185671, version 2747664 (that exact file name), and CivitAI’s public API flags the modelnsfw: 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 (bothwidgets_valuesandwidgets_values_named), its LOCAL row, its hint in the summary and its handbook lines. The file isSUPERSEDED(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) andf2k_consist(1939453) readnsfw: false; the “Beautiful face” extraction is not listed. The Hub rows carry nonot-for-all-audiencestag. A new test holds it: no file CivitAI flags is named in the workflow, a row or anywhere in the script butSUPERSEDED. 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: theegirlandinstaKlein LoRAs, and the whole Qwen prompt-enhancer branch (11 nodes, 2 groups: the enhancer, its VRAM clear, five instruction presets one of which was🚫 NSFWand 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: itsStringnode served only those presets. The five old files areSUPERSEDED(offered for deletion, never taken); both packs areDROPPED_PACKS. The detailer negative dropscensored; 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 (bothwidgets_valuesand itswidgets_values_namedmirror). 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
--checklists 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,RMBGmay 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) installedSAGE_WHEELwhen set and returned early whenever any build already imported, so a reused venv never followed upstream. It now callsbase_build_sageattention, as Krea 2 does;ninjaleavesPIP_EXTRA(the base installs it, at its newest, before a build);sagereads the version from the package metadata (SageAttention 2 sets no__version__);--latestis described as the plain run it now is;BASE_MINis 3.0.0, the first base whose build cannot be held below its newest. The install tier reads the base-ownedstate/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.