cd /news/generative-ai/don-t-eyeball-ai-generated-product-i… Β· home β€Ί topics β€Ί generative-ai β€Ί article
[ARTICLE Β· art-167555] src=dev.to β†— pub= topic=generative-ai verified=true sentiment=↑ positive

Don't eyeball AI-generated product images. Test the text like CI.

A developer benchmarked OpenAI's GPT Image 2 and Google's Nano Banana Pro through the Crazyrouter gateway on Nov 11, 2026, generating three e-commerce scenes with 14 required text strings each; both models rendered all 14 strings correctly, with only minor dotted artifacts on one Nano Banana Pro edge. The developer argues that generated product images should be treated as build artifacts, with OCR run over each render and diffed against declared required and forbidden strings so jobs fail on a miss, and recommends drafting in bulk with Nano Banana Pro before promoting winners to GPT Image 2 for finishing.

by read3 min views1 publishedNov 11, 2026

If you generate product artwork through an API, at some point a render ships with the price painted wrong, and the first person to notice is a customer. Visual "quality" reviews catch that maybe. Automation catches it always. This post is about the second option β€” plus a baseline measurement I ran to see where two popular image models actually stand on on-image text.

The baseline first. On Nov 11, 2026 I sent identical prompts to GPT Image 2 (OpenAI's reasoning-first image model, Apr 2026) and Nano Banana Pro (Google's Gemini 3 Pro Image, GA May 2026) through Crazyrouter β€” gpt-image-2 and nano-banana-pro on one account and one key, three e-commerce scenes at a time, one render per prompt, every flaw kept. Fourteen required strings total: headlines, discount badges, prices, a struck-through price, a dated banner, brand names, and one tiny spec line. The verdict: 14 of 14 correct on both models β€” no typos, no garbled glyphs, and no invented "decorative" words on a label that explicitly banned them.

Here are the six renders. Read them like code review, not like a gallery:

Flash-sale hero β€” check the strikethrough placement and the banner:

Hot-sauce label β€” the scene that banned extra words; scan every edge for fake typography:

Cold-brew detail card β€” the tiny NET WT 300ml / SERVINGS: 2 line is the real exam. One defect of the whole run lives in the Nano render: dotted artifacts on the bottom-right edge. Kept on purpose:

So if both models spell, what did the run actually measure? The integration details β€” and that's where "trust the prompt" breaks down.

Assert the strings, don't admire the picture

Treat a render like a build artifact. Each prompt declares required strings and forbidden strings; after generation, run OCR over the output and diff against the declaration. Fail the job on a miss. Both of my models passed a human-read version of this check, but human reads don't run at batch scale, and OCR-based assertion is cheap enough to gate every job. Bonus: the "no invented words" constraint from the label scene is exactly the kind of assertion that catches regression when a provider silently updates a model behind the same ID.

Model IDs are contracts that change under you

Model naming drifts fast β€” I confirmed both IDs and their exposed tiers in Crazyrouter's model directory before the run, and you should too, on your run day. Availability changes do not announce themselves in your error logs until they do.

What differs once spelling ties

IncompleteRead mid-transfer on the Nano side β€” connection layer, retry fixed it. A content-policy refusal would not have been retryable. Your job runner should classify failures, not blanket-retry them.asyncGenerateContent β†’ poll a task id).parts. Both IDs are callable from one gateway with one key β€” check availability before you build β€” and switching models is one model parameter plus a different request body shape. Entry point:

https://api.crazyrouter.com/v1

The pairing that actually works

Draft in bulk with Nano Banana Pro (cheap at 20 seconds a layout), then promote winners to GPT Image 2 for finishing β€” texture, typography, or a surgical mask edit. Drafting and finishing are different jobs; using one model for both is how you pay GPT-tier latency for every rejected idea.

Not covered, on purpose

One render per prompt, English only, 1024Γ—1024, a single day. CJK text, extreme small type, reference-image editing, 2K/4K output β€” all untested, so I'm not extending the 14/14 claim to them. Automate the assertion and the next model update answers the question for you.

Disclosure per DEV's AI guidelines: this article was written with AI assistance. Every image and every number in it comes from real API runs performed on Nov 11, 2026, and the failed/artifact-bearing renders were kept as-is.

── more in #generative-ai 4 stories Β· sorted by recency
── more on @openai 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain β€” perfect for shipping the agent you just read about.

$git push zahid main
β†’ Live at https://your-agent.zahid.host βœ“
Get free account β†’ Pricing
from €0/mo Β· no card required
LIVE [news/don-t-eyeball-ai-gen…] indexed:0 read:3min 2026-11-11 Β· β€”