Text-to-image has crystallised around three frontier models in 2026: Flux Kontext Pro (Black Forest Labs), Nano Banana (Google), and 4o Image (OpenAI). Each represents a distinct trade-off between speed, fidelity, and price.
Here's what our own generations look like when we ran the same prompt through all three.
The prompt
"A red fox sitting in fresh snow at golden hour, shallow depth of field, photo-realistic"
Speed and price (our current gateway rates)
- Nano Banana — 6 seconds, $0.056 per image
- Flux Kontext Pro — 9 seconds, $0.084 per image
- 4o Image — 12 seconds, $0.14 per image
Quality observations
- Flux Kontext Pro: best overall adherence to complex prompts. Handles text-in-image convincingly (menus, signs). Slight plastic sheen on skin occasionally.
- Nano Banana: fastest, cleanest realism for nature, products, portraits. Weaker on embedded text and complex multi-subject scenes.
- 4o Image: strongest at illustration and concept art. Realism slightly behind Flux. Best for stylised output.
Picking for your use case
- E-commerce and marketing photography: Nano Banana first. Cheapest + fastest + realistic enough for 90% of product/lifestyle shots.
- Complex editorial scenes with text: Flux Kontext Pro. Only model that reliably spells things correctly.
- Stylised illustration, concept art, editorial: 4o Image. OpenAI's art direction instincts are hard to beat.
- Batch generation (>1000 images/day): Nano Banana. The $0.03 per image saved over Flux compounds to real money.
Usage pattern: pick per prompt, not per product
Most successful image-heavy products we see on our API aren't loyal to one model. They route: "if prompt contains text" → Flux, "if category == illustration" → 4o Image, default → Nano Banana. That simple rule delivers 30% cost savings without sacrificing output quality on hard prompts.
Calling all three through one API
// Route in your app code:
const model = prompt.includes('text') || prompt.includes('sign')
? 'black-forest-labs/flux-kontext-pro'
: style === 'illustration'
? 'openai/4o-image'
: 'google/nano-banana';
await fetch('https://aimarcus.eu/aigenerate/api/v1/jobs/createTask', {
method: 'POST',
headers: {
'Authorization': 'Bearer sk-aig-...',
'Content-Type': 'application/json',
},
body: JSON.stringify({ model, input: { prompt, output_format: 'png', image_size: '1:1' } }),
});
One Bearer token, three state-of-the-art providers, smart routing in application code. That's the entire advantage of an aggregator API.