Flux 3 Image Klein (BFL)
The small FLUX 3 tier, phoned in from someone else's GPU
- config
- IMAGE
What you're actually looking at
This node does not run a model. No checkpoint to download, no VRAM cost, no first-load wait while something spills to system RAM. It takes your prompt, turns it into an HTTP POST to Black Forest Labs' API, waits around, and hands the finished picture back into your graph as a normal IMAGE - indistinguishable downstream from something a local sampler made.
FLUX 3 landed in July 2026 as a gated, multimodal, API-first release, and Klein - German for small, same pattern as Flux 2 - is its cheap tier. The README calls the endpoint an "open-weights 5.6B FLUX 3", which is nice for whoever can download it; it doesn't put a runnable checkpoint in your models folder today. So the practical way to touch it is this node plus a BFL key with credits on it: per-call cost and your prompt leaving the machine, in exchange for FLUX 3 quality on a machine with no usable GPU.
How it works
Two hops. First the node submits the job - flux-3-image-klein - with only the arguments that differ from the defaults. It then polls the polling_url BFL hands back, every 5 seconds, up to 120 attempts. That's a ten-minute ceiling, on purpose: 4k can genuinely take several minutes. When the task reports ready, the node downloads the sample URL and converts it into a ComfyUI tensor.
Klein is the pack's Flux 3 Image node with the interesting part swapped: grounding is gone - no web-search pass before drawing - and in exchange you get steps and explicit width/height.
The inputs that matter
Most of the required block you can leave alone. prompt obviously. resolution (768sq → 4k, default 1k) and aspect_ratio (default auto, plus 15 named ratios) are sent only when you change them, so the defaults literally send nothing and let BFL decide.
The three that actually change results:
steps- 1 to 16, default 16. That's the ceiling, not a cautious default; dropping to 8 or 4 is how you buy speed on drafts.width/height- default 0, meaning "not sent". Fill in both, from 64 to 6256, and they overrideresolutionandaspect_ratio. Set only one and it warns, then sends neither.output_format-jpegorpng. Pickpngif the image is going anywhere afterwards. The node re-encodes whatever comes back through PIL into this format, and the jpeg path adds a lossy pass on top of the compression BFL already did. The sibling Flux 3 Image node works around this by always asking for png internally; Klein doesn't.
safety_tolerance runs 0 to 7 here - 0 strictest, 7 loosest - which changes how much the model will entertain before refusing. It does not turn off moderation.
Output is a single IMAGE - wire it into Save Image or an upscaler like anything else.
References, and the "Image 1" trap
image_1 through image_10 are text inputs, not image inputs - each wants a base64 string or a URL, which is why you feed them from the pack's own Image to Base64 (BFL) node. Connect one and your prompt can call it Image 1.
The numbering is positional, and that's the trap. Only image_3 connected? It becomes Image 1, and your prompt saying "match Image 3's jacket" now points at nothing. The node warns when sockets skip a gap, easy to miss in a busy console. Fill from image_1 upward and keep them contiguous.
Install
Manager search for "ComfyUI-FLUX-BFL-API", or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/gelasdev/ComfyUI-FLUX-BFL-API.git
Restart ComfyUI. No dependency drama: requirements.txt is one line, torch, which you already have.
Then a key. Grab one from api.bfl.ai and put it in the pack's config.ini:
[API]
X_KEY = YOUR_API_KEY
BASE_URL = https://api.bfl.ai/v1/
Or drop a Flux Config (BFL) node in the graph, paste the key there, and wire it to config. Check your balance with Flux Credits (BFL) before a long session, not mid-render.
Common issues
You get a black square and the queue says everything succeeded. That's the node's failure path: on Error, Content Moderated or Request Moderated it stops polling immediately and returns a black 512×512 placeholder so the workflow keeps running. Nothing turns red. Scroll the console for a [BFL] Details: entry - it names the moderation categories that tripped.
Your API key is in your console log. The pack prints the full request as a curl command on every submit, headers included, x-key and all. Handy for debugging, bad for screenshots. Crop before posting, and don't commit a config.ini with a live key.
And one thing worth saying out loud: this is a metered cloud node. Reach for it on a model you can't run, not as a default for one you can.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | — | |
| resolution | COMBO | 1k | 5 options: 768sq, 1k, 1.5k, 2k, 4k |
| aspect_ratio | COMBO | auto | 16 options: auto, 21:9, 2:1, 16:9, 3:2, 7:5, +10 |
| safety_tolerance | INT | 20–7 | — |
| output_format | COMBO | jpeg | 2 options: jpeg, png |
| steps | INT | 161–16 | — |
| widthopt | INT | 00–6256 | 0 = not sent. Set width and height together (64-6256) to override resolution and aspect_ratio |
| heightopt | INT | 00–6256 | 0 = not sent. Set width and height together (64-6256) to override resolution and aspect_ratio |
| seedopt | INT | -1 | — |
| image_1opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| image_2opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| image_3opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| image_4opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| image_5opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| image_6opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| image_7opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| image_8opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| image_9opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| image_10opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| configopt | BFL_CONFIG | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |