I stopped trusting the zoom-out
I make bilingual promo assets: an event poster, an OG image for the release post, a membership notice for a partner in Taipei. The artwork is never the problem. The small print is, because a generated headline forgives everything and a generated footer line forgives nothing.
My process used to be re-roll until it looked right at normal zoom. Then a wrong year reached a published asset, and I decided to measure the failure instead of dodging it.
Two days, two prompts, three model tiers, 19 required text elements, each one read character by character at zoom. This is the ledger, plus the two flags that surprised me.
Everything ran through the Bailian CLI (bl). Timings are wall clock from my machine. Prices came out of bl model list on the day I ran the tests.
The two prompts
Round one is an event poster: headline, sub-headline, three bullet lines that carry numbers, and a footer line with a date, a time and a venue. Ten required text elements.
Round two is nastier on purpose: a membership benefits notice with a headline, a sub-headline, five bullets, and two footer lines. One footer line is a date range, the other is a legal sentence, and the bullets include a 1:1.5 decimal. Nine required text elements.
Each prompt ran against all three tiers. Only --model changed between runs, and every other flag stayed at CLI default. Scoring was manual and deliberately dumb: find the element, zoom in, check each character, log it as correct, wrong glyph, missing stroke, transposed or absent.
npm install -g bailian-cli
bl auth login --api-key <your-key>
bl image generate --prompt "$(cat poster.txt)" --model z-image-turbo --size 3:4 --out-dir ./out/turbo
| Tier | Price per image | Notes |
|---|---|---|
z-image-turbo |
¥0.1 (about $0.014) | The official model card claims first place among open source text-to-image models on Artificial Analysis, with 6B parameters and 8 inference steps. That is a vendor statement; I did not re-verify the leaderboard. |
qwen-image-3.0 |
¥0.18 (about $0.025) | Same price at 1K and 2K. Aimed at dense information layouts. |
qwen-image-3.0-pro |
¥0.25 at 1K (about $0.035), ¥0.5 at 2K | Pro tier of the same family, with layout and text rendering strengthened. |
Those dollar figures are rough conversions of the yuan list prices, so read them as approximations.
Round one was the boring result
All three tiers scored 10 out of 10. Headline, sub-headline including its comma, three bullets with their numbers, footer date, time and venue. No errors anywhere.
The assumption that CJK fine print is a coin flip does not hold on these three tiers at poster-scale type. Round one was still worth the afternoon, because it produced two things I did not expect.
Speed inverts the price ladder. z-image-turbo came back in 5.1 seconds, qwen-image-3.0-pro in 53.8 seconds, and qwen-image-3.0 in 101.1 seconds. The most expensive tier took about half the wall clock of the middle one, and the cheapest was roughly twenty times faster than Standard.
Watermark behaviour differs between tiers. With identical flags, the Standard image carried an orange corner badge clipped by the canvas edge, with half of the word still visible, and the Pro image had nothing in that corner. --help says the watermark defaults to on. A follow-up run with --watermark false removed the badge cleanly, so the flag works. The inconsistency sits between tiers, not in the flag.
Round two, where the cheap tier slipped
Round one's type was still fairly large. The interesting test is footer-scale text carrying digits and long sentences.
z-image-turbo, 5.1 seconds: 8 out of 9. The footer asked for a date range opening on 2026-10-01 and rendered that year as 2016. One digit, a 2 that became a 1. The other eight elements were correct, including the decimal and the legal sentence.
qwen-image-3.0, 112.4 seconds: 9 out of 9.
qwen-image-3.0-pro, 81.8 seconds: 9 out of 9.
Aggregate over both rounds: turbo 18 of 19 (94.7%), Standard 19 of 19, Pro 19 of 19.
Gibberish would have been obvious and I would have caught it at a glance. What I got was a plausible-looking digit in the smallest line on the page, which is precisely where nobody proofreads. On a published promo asset a wrong year is an ops incident.
The trade, in numbers you can recompute: 5.1 seconds against 112.4 seconds, ¥0.1 against ¥0.18 or ¥0.25, for a 5.3 point accuracy gap that lived entirely in footer-scale digits.
Patching instead of re-rolling
When turbo wrote 2016, my first instinct was to patch the image rather than regenerate it.
bl image edit --image ./out/turbo/poster.png --prompt "Change the year 2016 in the first footer line to 2026; keep every other character, layout and colour exactly the same" --model qwen-image-3.0
Half good. Both footer lines came back correct and 2026 was restored. Half bad: the artwork did not survive. The source was an illustrated poster with figures and colour, and the output was a plain white text-only layout. It corrected the glyphs and re-rendered the whole canvas.
That gives me a simple rule. bl image edit suits text-dominant assets such as price lists and benefit notices. If the asset is illustration-heavy and you want to move one line, regenerate from the original prompt on Standard or Pro instead of editing.
The second trap was seed. I assumed --seed would make runs comparable for an A/B read. It does not on this path. Same model, same prompt, same seed 42, only the watermark flag different, and the two images came back with completely different compositions. Do not build retry or comparison logic on the assumption that a fixed seed returns the same picture.
Reproduce it in an afternoon
Install the Bailian CLI (bl), create a key on the console key management page, and loop the tiers over one prompt file:
for m in z-image-turbo qwen-image-3.0 qwen-image-3.0-pro; do bl image generate --prompt "$(cat poster.txt)" --model "$m" --size 3:4 --seed 42 --watermark false --out-dir "./out/$m" --out-prefix poster; done
Time each iteration with whatever your shell gives you, and pull the price back as data you can log:
bl model list --model qwen-image-3.0 --output json
Three settings matter once you batch. --n goes up to 6 per request, --concurrent defaults to 1, and --size accepts a ratio (3:4, 16:9, 1:1) or explicit pixels (2048*2048), which is what you want when the artifact has to fill a fixed slot like a social card.
On money: my entire run caps at ¥0.86 at list price, about $0.12. The official free quota ledger shows 10 free generations each for qwen-image-3.0 and -pro, expiring 2026-11-03, and no free quota at all for z-image-turbo. Whether any of that lands on your account depends on your own console bill and quota page, so check there instead of trusting my numbers.
What I changed
Anything published, meaning anything carrying a date, a price, a legal line or contact info, now goes to qwen-image-3.0 or -pro. Both scored 19 of 19 across the two rounds with no footer-digit failures. Between them I lean Pro: ¥0.07 more per image (about $0.01) and faster in both rounds, 53.8 seconds against 101.1 in round one and 81.8 against 112.4 in round two, which adds up when you batch localized variants.
Drafts and direction-finding go to z-image-turbo. Five seconds, ¥0.1, and a wrong digit does not matter because the draft is getting rewritten anyway. Its large and mid-size type was as clean as the other two tiers.
One habit stays regardless of tier: after generating anything with a date, a price or a phone number, zoom in and read the digits. The 2016 was only visible at zoom, and the rest of that poster looked perfect.
If you generate CJK or bilingual assets from a pipeline, what does your proofreading step look like? Mine is still a human with a magnified crop, and I would like to hear about anything better.

Top comments (0)