It has been a busy week, only just two days ago I posted about MOSS and today I am diving into FIBO 2.0 (Edit Turbo model specifically). You can find below my quick summary, and you can also see my deep dive at my HF: huggingface.co/lvladikov/FIBO2-Edit-Turbo-T2I where I have run comparisons of images created with direct prompt and captioned (json) prompts, and also provided ComfyUI workflows, and diffusion python scripts for torch, mlx and mflux!
Bria's FIBO 2.0 came out with two checkpoints: Fibo-2.0-dev (text-to-image and editing, 50 steps, CFG 5) and Fibo-2.0-edit-turbo, which the model card presents as the few-step, guidance-free editing model.
Edit Turbo runs text-to-image too. It's the same BriaFibo2Pipeline, so you call it with no input image: 4 steps, guidance_scale=1.0. A render is 4 transformer passes, where Dev takes 100 (50 steps, each with a CFG pass).
The prompt does most of the work. FIBO 2 is trained on structured JSON captions (Bria's VGL). Bria's own captioner, bria-vgl, runs on Gemini, but you don't need it: FIBO 2's text encoder is a complete Qwen3-VL-4B-Instruct, so the pipeline can write its own caption. Give it bria-vgl's open "generate" system prompt and field guide (github.com/Bria-AI/vgl, under src/bria_vgl/dialects/thales/), take the JSON it writes, and pass that as the prompt. Plain prompts work too.
import json, torch
from diffusers import BriaFibo2Pipeline # diffusers from git main (FIBO 2 landed Oct 20)
pipe = BriaFibo2Pipeline.from_pretrained("briaai/Fibo-2.0-edit-turbo", torch_dtype=torch.bfloat16)
pipe.to("cuda") # "mps" on a Mac; pipe.enable_model_cpu_offload() on a smaller GPU
# 1. FIBO's own Qwen3-VL-4B-Instruct writes the VGL caption, with bria-vgl's open prompts:
# prompts/generate/system_prompt.txt and input_schema/generate.txt
system = open("system_prompt.txt").read().replace("{style_preset_block}", "").replace(
"{llm_input_schema}", open("generate.txt").read())
idea = "a woman in a cream cable-knit sweater on a misty lake pier at dawn, holding a steaming enamel mug"
user = ("Generate a detailed JSON object, adhering to the expected schema, for an imagined scene "
f"based on the following request: {idea}.")
messages = [{"role": "system", "content": system},
{"role": "user", "content": [{"type": "text", "text": user}]}]
text = pipe.processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = pipe.processor(text=[text], return_tensors="pt").to(pipe.device)
out = pipe.text_encoder.generate(**inputs, max_new_tokens=2048, do_sample=False)
reply = pipe.processor.batch_decode(out[:, inputs["input_ids"].shape[1]:], skip_special_tokens=True)[0]
caption = json.loads(reply[reply.find("{"): reply.rfind("}") + 1])
# 2. Edit Turbo as text-to-image: no image, 4 steps, no CFG
image = pipe(prompt=json.dumps(caption), num_inference_steps=4, guidance_scale=1.0, width=1024, height=1024,
generator=torch.Generator().manual_seed(4242)).images[0]
image.save("fibo2_turbo_t2i.png")
What 22 prompts showed
I rendered 22 prompts twice at seed 4242, 1024×1024: once as typed, and once through the caption the model writes for itself. Most came out clean either way. Counts held for five friends, three kittens and two dogs, and text rendered where the caption asked for it (a neon "Café Lumière" sign). Writing a caption took about 70% as long as rendering the image.
Three prompts went wrong, each for a different reason:
- "A family of four having dinner … seen from directly above" gave six people, as typed and with the caption. The model miscounts on its own here, and the written caption didn't help: it never lists the people as objects, and it adds walls and a framed family photo that can't be seen from above. A caption with four person objects and a straight-down camera gave exactly four.
- "Close-up of a pianist's two hands": the written caption added the piano's ornate legs seen from the side, and the render pulled back to a toy keyboard played by three hands. As typed, it was a good grand piano with one pianist, plus a second player's hands at the far end. In every version the black keys run evenly instead of in groups of two and three. No caption fixed that, so it's the model.
- "A gleaming white colony ship … clean sci-fi concept art, bold simple shapes": as typed, a detailed ship over an ocean planet. With the caption, a featureless egg under a daytime sky, because the writer read "bold simple shapes" as no windows, no rivets and no stars. Another seed looked the same, and three sampled captions asked for the same. Removing those lines from the caption fixed it.
So when a count, a layout or the amount of detail matters, open the caption it saved next to the image, fix it, and render it again.
Running it
- ComfyUI (native FIBO 2 support since Oct 21, PR #17240): two minimal workflows, one for the bf16 model and one for vantagewithai's GGUF quants. No custom nodes beyond ComfyUI-GGUF for the GGUF one.
- diffusers: a script for one prompt or a batch, with
--plain (the prompt as typed), --sample N (another take on the caption) and --json (render a saved or edited caption). It keeps one part of the model in memory at a time: the text encoder, then the transformer, then the VAE.
- Apple silicon (MLX): a standalone MLX port of the same model, no PyTorch needed, plus a variant that uses mflux's VAE. Float16 compute is about a quarter faster than bf16, and a 1024×1024 run peaks at about 17.4 GB. With PyTorch installed (it only draws the starting noise), a seed gives the same picture as the diffusers script.
The workflows, the scripts and the 22 examples, both sets side by side with the notes above: huggingface.co/lvladikov/FIBO2-Edit-Turbo-T2I. No models are hosted there; they download from Bria's and the community's repositories. Both checkpoints are CC BY-NC 4.0 (non-commercial).
So here you go, have fun and share your FIBO 2 Edit Turbo generated images from text. FIBO2 is very good, for all I've seen, and I've not even focused on Edit where everyone says it's amazing. As Text to Image (for Turbo Edit model) it is pretty good!