<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>AI Evaluation on Max Woolf&#39;s Blog</title>
    <link>https://minimaxir.com/tag/ai-evaluation/</link>
    <description>Recent content in AI Evaluation on Max Woolf&#39;s Blog</description>
    <image>
      <title>Max Woolf&#39;s Blog</title>
      <url>https://minimaxir.com/android-chrome-512x512.png</url>
      <link>https://minimaxir.com/android-chrome-512x512.png</link>
    </image>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>Copyright Max Woolf © 2026</copyright>
    <lastBuildDate>Mon, 22 Dec 2025 10:45:00 -0800</lastBuildDate>
    <atom:link href="https://minimaxir.com/tag/ai-evaluation/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Nano Banana Pro is the best AI image generator, with caveats</title>
      <link>https://minimaxir.com/2025/12/nano-banana-pro/</link>
      <pubDate>Mon, 22 Dec 2025 10:45:00 -0800</pubDate>
      <guid>https://minimaxir.com/2025/12/nano-banana-pro/</guid>
      <description>The problem with Nano Banana Pro is that it&amp;rsquo;s too good.</description>
      <content:encoded><![CDATA[<p><span><style type="text/css">
pre code.language-txt {
white-space: pre-wrap !important;
word-break: normal !important;
}
</style></span></p>
<p>A month ago, I posted a <a href="https://minimaxir.com/2025/11/nano-banana-prompts/">very thorough analysis</a> on <a href="https://developers.googleblog.com/en/introducing-gemini-2-5-flash-image/">Nano Banana</a>, Google&rsquo;s then-latest AI image generation model, and how it can be prompt engineered to generate high quality and extremely nuanced images that most other image generations models can&rsquo;t achieve, including ChatGPT at the time. For example, you can give Nano Banana a prompt with a comical amount of constraints:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">Create an image featuring three specific kittens in three specific positions.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">All of the kittens MUST follow these descriptions EXACTLY:
</span></span><span class="line"><span class="cl">- Left: a kitten with prominent black-and-silver fur, wearing both blue denim overalls and a blue plain denim baseball hat.
</span></span><span class="line"><span class="cl">- Middle: a kitten with prominent white-and-gold fur and prominent gold-colored long goatee facial hair, wearing a 24k-carat golden monocle.
</span></span><span class="line"><span class="cl">- Right: a kitten with prominent #9F2B68-and-#00FF00 fur, wearing a San Franciso Giants sports jersey.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Aspects of the image composition that MUST be followed EXACTLY:
</span></span><span class="line"><span class="cl">- All kittens MUST be positioned according to the &#34;rule of thirds&#34; both horizontally and vertically.
</span></span><span class="line"><span class="cl">- All kittens MUST lay prone, facing the camera.
</span></span><span class="line"><span class="cl">- All kittens MUST have heterochromatic eye colors matching their two specified fur colors.
</span></span><span class="line"><span class="cl">- The image is shot on top of a bed in a multimillion-dollar Victorian mansion.
</span></span><span class="line"><span class="cl">- The image is a Pulitzer Prize winning cover photo for The New York Times with neutral diffuse 3PM lighting for both the subjects and background that complement each other.
</span></span><span class="line"><span class="cl">- NEVER include any text, watermarks, or line overlays.
</span></span></code></pre></div><p>Nano Banana can handle all of these constraints easily:</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/cats_hu_4bdc22e1b80032c6.webp 320w,/2025/12/nano-banana-pro/cats_hu_316e472f908653fd.webp 768w,/2025/12/nano-banana-pro/cats_hu_d0482bbd7f477d0c.webp 1024w,/2025/12/nano-banana-pro/cats.webp 1344w" src="cats.webp"/> 
</figure>

<p>Exactly one week later, Google <a href="https://blog.google/technology/ai/nano-banana-pro/">announced</a> Nano Banana Pro, another <a href="https://gemini.google/overview/image-generation/">AI image model</a> that in addition to better image quality now touts five new features: high-resolution output, better text rendering, grounding with Google Search, thinking/reasoning, and better utilization of image inputs. Nano Banana Pro can be accessed for free using the <a href="https://gemini.google.com/">Gemini chat app</a> with a visible watermark on each generation, but unlike the base Nano Banana, <a href="https://aistudio.google.com/">Google AI Studio</a> requires payment for Nano Banana Pro generations.</p>
<p>After a brief existential crisis worrying that my months of effort researching and developing that blog post were wasted, I relaxed a bit after reading the announcement and <a href="https://ai.google.dev/gemini-api/docs/image-generation">documentation</a> more carefully. Nano Banana and Nano Banana Pro are different models (despite some using the terms interchangeably), but <strong>Nano Banana Pro is not Nano Banana 2</strong> and does not obsolete the original Nano Banana—far from it. Not only is the cost of generating images with Nano Banana Pro far greater, but the model may not even be the best option depending on your intended style. That said, there are quite a few interesting things Nano Banana Pro can now do, many of which Google did not cover in their announcement and documentation.</p>
<h2 id="nano-banana-vs-nano-banana-pro">Nano Banana vs. Nano Banana Pro</h2>
<p>I&rsquo;ll start off answering the immediate question: how does Nano Banana Pro compare to the base Nano Banana? Working on my previous Nano Banana blog post required me to develop many test cases that were specifically oriented to Nano Banana&rsquo;s strengths and weaknesses: most passed, but some of them failed. Does Nano Banana Pro fix the issues I had encountered? Could Nano Banana Pro <em>cause</em> more issues in ways I don&rsquo;t anticipate? Only one way to find out.</p>
<p>We&rsquo;ll start with the test case that should now work: the infamous <code>Make me into Studio Ghibli</code> prompt, as Google&rsquo;s announcement explicitly highlights Nano Banana Pro&rsquo;s ability to style transfer. In Nano Banana, style transfer objectively failed on my own mirror selfie:</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/ghibli_hu_2f1f238060e0d6df.webp 320w,/2025/12/nano-banana-pro/ghibli_hu_bee952c0eeaa2411.webp 768w,/2025/12/nano-banana-pro/ghibli_hu_6713eaa16143a10c.webp 1024w,/2025/12/nano-banana-pro/ghibli.webp 2048w" src="ghibli.webp"/> 
</figure>

<p>How does Nano Banana Pro fare?</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/ghibli_nbp_hu_fc781d0201c19971.webp 320w,/2025/12/nano-banana-pro/ghibli_nbp_hu_2fcb08285b8b9312.webp 768w,/2025/12/nano-banana-pro/ghibli_nbp_hu_6b334aa3958aedb4.webp 1024w,/2025/12/nano-banana-pro/ghibli_nbp.webp 1024w" src="ghibli_nbp.webp"/> 
</figure>

<p>Yeah, that&rsquo;s now a pass. You can nit on whether the style is truly Ghibli or just something animesque, but it&rsquo;s clear Nano Banana Pro now understands the intent behind the prompt, and it does a better job of the Ghibli style than ChatGPT ever did.</p>
<p>Next, code generation. Last time I included an example prompt instructing Nano Banana to display a minimal Python implementation of a recursive <a href="https://en.wikipedia.org/wiki/Fibonacci_sequence">Fibonacci sequence</a> with proper indentation and syntax highlighting, which should result in something like:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">fib</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">n</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">n</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span>
</span></span></code></pre></div><p>Nano Banana failed to indent the code and syntax highlight it correctly:</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/fibbonacci_hu_a40689cd9d389a5d.webp 320w,/2025/12/nano-banana-pro/fibbonacci_hu_c5145df788ab51d2.webp 768w,/2025/12/nano-banana-pro/fibbonacci_hu_9b2fa3380d26665d.webp 1024w,/2025/12/nano-banana-pro/fibbonacci.webp 1184w" src="fibbonacci.webp"/> 
</figure>

<p>How does Nano Banana Pro fare?</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/fibbonacci_nbp_hu_f63883244c64578a.webp 320w,/2025/12/nano-banana-pro/fibbonacci_nbp_hu_96539e15f64d577b.webp 768w,/2025/12/nano-banana-pro/fibbonacci_nbp_hu_17d6b0fbd2659d5c.webp 1024w,/2025/12/nano-banana-pro/fibbonacci_nbp.webp 1200w" src="fibbonacci_nbp.webp"/> 
</figure>

<p>Much much better. In addition to better utilization of the space, the code is properly indented and tries to highlight keywords, functions, variables, and numbers differently, although not perfectly. It even added a test case!</p>
<p>Relatedly, OpenAI&rsquo;s just released <a href="https://openai.com/index/new-chatgpt-images-is-here/">ChatGPT Images</a> based on their new <code>gpt-image-1.5</code> image generation model. While it&rsquo;s beating Nano Banana Pro in the <a href="https://lmarena.ai/leaderboard/text-to-image">Text-To-Image leaderboards on LMArena</a>, it has difficulty with prompt adherence especially with complex prompts such as this one.</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/fibbonacci_chatgpt_hu_ca7c83871a535618.webp 320w,/2025/12/nano-banana-pro/fibbonacci_chatgpt_hu_82d8ae4b9f9542fb.webp 768w,/2025/12/nano-banana-pro/fibbonacci_chatgpt.webp 768w" src="fibbonacci_chatgpt.webp"/> 
</figure>

<p>Syntax highlighting is very bad, the <code>fib()</code> is missing a parameter, and there&rsquo;s a random <code>-</code> in front of the return statements. At least it no longer has a piss-yellow hue.</p>
<p>Speaking of code, how well can it handle rendering webpages given a <a href="https://github.com/minimaxir/gemimg/blob/main/docs/files/counter_app.html">single-page HTML file</a> with about a thousand tokens worth of HTML/CSS/JS? Here&rsquo;s a simple Counter app rendered in a browser.</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/webpage_screenshot_hu_699fb00e70924198.webp 320w,/2025/12/nano-banana-pro/webpage_screenshot_hu_95baea215f5b5b74.webp 768w,/2025/12/nano-banana-pro/webpage_screenshot_hu_9198610b7be17c1e.webp 1024w,/2025/12/nano-banana-pro/webpage_screenshot.png 1470w" src="webpage_screenshot.png"/> 
</figure>

<p>Nano Banana wasn&rsquo;t able to handle the typography and layout correctly, but Nano Banana Pro is supposedly better at typography.</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/counter_nbp_hu_76fe3a7daf850522.webp 320w,/2025/12/nano-banana-pro/counter_nbp_hu_5b6c09bd9c03a49b.webp 768w,/2025/12/nano-banana-pro/counter_nbp_hu_39c5e4501209f298.webp 1024w,/2025/12/nano-banana-pro/counter_nbp.webp 2368w" src="counter_nbp.webp"/> 
</figure>

<p>That&rsquo;s a significant improvement!</p>
<p>At the end of the Nano Banana post, I illustrated a more comedic example where characters from popular intellectual property such as Mario, Mickey Mouse, and Pikachu are partying hard at a seedy club, primarily to test just how strict Google is with IP.</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/ip_bonanza_hu_fd55169ac5fe9102.webp 320w,/2025/12/nano-banana-pro/ip_bonanza_hu_8fe51d705f8d393e.webp 768w,/2025/12/nano-banana-pro/ip_bonanza_hu_6af0b4a25063b14.webp 1024w,/2025/12/nano-banana-pro/ip_bonanza.webp 1184w" src="ip_bonanza.webp"/> 
</figure>

<p>Since the training data is likely similar, I suspect any issues around IP will be the same with Nano Banana Pro—as a side note, Disney <a href="https://variety.com/2025/digital/news/disney-google-ai-copyright-infringement-cease-and-desist-letter-1236606429/">has now sued Google</a> over Google&rsquo;s use of Disney&rsquo;s IP in their AI generation products.</p>
<p>However, due to post length I cut out an analysis on how it didn&rsquo;t actually handle the image composition perfectly:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">The composition of the image MUST obey ALL the FOLLOWING descriptions:
</span></span><span class="line"><span class="cl">- The nightclub is extremely realistic, to starkly contrast with the animated depictions of the characters
</span></span><span class="line"><span class="cl">  - The lighting of the nightclub is EXTREMELY dark and moody, with strobing lights
</span></span><span class="line"><span class="cl">- The photo has an overhead perspective of the corner stall
</span></span><span class="line"><span class="cl">- Tall cans of White Claw Hard Seltzer, bottles of Grey Goose vodka, and bottles of Jack Daniels whiskey are messily present on the table, among other brands of liquor
</span></span><span class="line"><span class="cl">  - All brand logos are highly visible
</span></span><span class="line"><span class="cl">  - Some characters are drinking the liquor
</span></span><span class="line"><span class="cl">- The photo is low-light, low-resolution, and taken with a cheap smartphone camera
</span></span></code></pre></div><p>Here&rsquo;s the Nano Banana Pro image using the full original prompt:</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/ip_bonanza_nbp_hu_8d7f43aff0363011.webp 320w,/2025/12/nano-banana-pro/ip_bonanza_nbp_hu_59eaf8803f45f1f0.webp 768w,/2025/12/nano-banana-pro/ip_bonanza_nbp_hu_b412e61bd81ede3c.webp 1024w,/2025/12/nano-banana-pro/ip_bonanza_nbp.webp 1200w" src="ip_bonanza_nbp.webp"/> 
</figure>

<p>Prompt adherence to the composition is much better: the image is more &ldquo;low quality&rdquo;, the nightclub is darker and seedier, the stall is indeed a corner stall, the labels on the alcohol are accurate without extreme inspection. There&rsquo;s even a date watermark: one curious trend I&rsquo;ve found with Nano Banana Pro is that it likes to use dates within 2023.</p>
<h2 id="the-differences-between-nano-banana-and-pro">The Differences Between Nano Banana and Pro</h2>
<p>The immediate thing that caught my eye <a href="https://ai.google.dev/gemini-api/docs/image-generation">from the documentation</a> is that Nano Banana Pro has 2K output (4 megapixels, e.g. 2048x2048) compared to Nano Banana&rsquo;s 1K/1 megapixel output, which is a significant improvement and allows the model to generate images with more detail. What&rsquo;s also curious is the image token count: while Nano Banana generates 1,290 tokens before generating a 1 megapixel image, Nano Banana Pro generates fewer tokens at 1,120 tokens for a 2K output, which implies that Google made advancements in Nano Banana Pro&rsquo;s image token decoder as well. Curiously, Nano Banana Pro also offers 4K output (16 megapixels, e.g. 4096x4096) at 2,000 tokens: a 79% token increase for a 4x increase in resolution. The tradeoffs are the costs: A 1K/2K image from Nano Banana Pro <a href="https://ai.google.dev/gemini-api/docs/pricing#gemini-3-pro-image-preview">costs</a> $0.134 per image: about three times the <a href="https://ai.google.dev/gemini-api/docs/pricing#gemini-2.5-flash-image">cost</a> of a base Nano Banana generation at $0.039. A 4K image costs $0.24.</p>
<p>If you didn&rsquo;t read my previous blog post, I argued that the secret to Nano Banana&rsquo;s good generation is its text encoder, which not only processes the prompt but also generates the autoregressive image tokens to be fed to the image decoder. Nano Banana is based off of <a href="https://developers.googleblog.com/en/continuing-to-bring-you-our-latest-models-with-an-improved-gemini-2-5-flash-and-flash-lite-release/">Gemini 2.5 Flash</a>, one of the strongest LLMs at the tier that optimizes for speed. Nano Banana Pro&rsquo;s text encoder, however, is based off <a href="https://blog.google/products/gemini/gemini-3/">Gemini 3 Pro</a> which not only is a LLM tier that optimizes for accuracy, it&rsquo;s a major version increase with a significant performance increase over the Gemini 2.5 line. <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Therefore, the prompt understanding <em>should</em> be even stronger.</p>
<p>However, there&rsquo;s a very big difference: as Gemini 3 Pro is a model that forces &ldquo;thinking&rdquo; before returning a result and cannot be disabled, Nano Banana Pro also thinks. In my previous post, I also mentioned that popular AI image generation models often perform prompt rewriting/augmentation—in a reductive sense, this thinking step can be thought of as prompt augmentation to better orient the user&rsquo;s prompt toward the user&rsquo;s intent. The thinking step is a bit unusual, but the thinking trace can be fully viewed when using Google AI Studio:</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/thinking_hu_6e9745b293476eee.webp 320w,/2025/12/nano-banana-pro/thinking.webp 683w" src="thinking.webp"/> 
</figure>

<p>Nano Banana Pro often generates a sample 1K image to prototype a generation, which is new. I&rsquo;m always a fan of two-pass strategies for getting better quality from LLMs so this is useful, albeit in my testing the final output 2K image isn&rsquo;t significantly different aside from higher detail.</p>
<p>One annoying aspect of the thinking step is that it makes generation time inconsistent: I&rsquo;ve had 2K generations take anywhere from 20 seconds to <em>one minute</em>, sometimes even longer during peak hours.</p>
<h2 id="grounding-with-google-search">Grounding With Google Search</h2>
<p>One of the more viral use cases of Nano Banana Pro is its ability to generate legible infographics. However, since infographics require factual information and <a href="https://en.wikipedia.org/wiki/Hallucination_%28artificial_intelligence%29">LLM hallucination</a> remains unsolved, Nano Banana Pro now supports <a href="https://ai.google.dev/gemini-api/docs/image-generation#use-with-grounding">Grounding with Google Search</a>, which allows the model to search Google to find relevant data to input into its context. For example, I asked Nano Banana Pro to generate an infographic for my <a href="https://github.com/minimaxir/gemimg">gemimg Python package</a> with this prompt and Grounding explicitly enabled, with some prompt engineering to ensure it uses the Search tool and also make it <em>fancy</em>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">Create a professional infographic illustrating how the the `gemimg` Python package functions. You MUST use the Search tool to gather factual information about `gemimg` from GitHub.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">The infographic you generate MUST obey ALL the FOLLOWING descriptions:
</span></span><span class="line"><span class="cl">- The infographic MUST use different fontfaces for each of the title/headers and body text.
</span></span><span class="line"><span class="cl">- The typesetting MUST be professional with proper padding, margins, and text wrapping.
</span></span><span class="line"><span class="cl">- For each section of the infographic, include a relevant and fun vector art illustration
</span></span><span class="line"><span class="cl">- The color scheme of the infographic MUST obey the FOLLOWING palette:
</span></span><span class="line"><span class="cl">  - #2c3e50 as primary color
</span></span><span class="line"><span class="cl">  - #ffffff as the background color
</span></span><span class="line"><span class="cl">  - #09090a as the text color-
</span></span><span class="line"><span class="cl">  - #27ae60, #c0392b and #f1c40f for accent colors and vector art colors.
</span></span></code></pre></div><figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/infographic_hu_e3c1d6ec5acfdd1a.webp 320w,/2025/12/nano-banana-pro/infographic_hu_d0950bb92fe2ce62.webp 768w,/2025/12/nano-banana-pro/infographic_hu_1bf7e80236cbf8ce.webp 1024w,/2025/12/nano-banana-pro/infographic.webp 1408w" src="infographic.webp"/> 
</figure>

<p>That&rsquo;s a correct <em>enough</em> summation of the repository intro and the style adheres to the specific constraints, although it&rsquo;s not something that would be interesting to share. It also duplicates the word &ldquo;interfaces&rdquo; in the third panel.</p>
<p>In my opinion, these infographics are a gimmick more intended to appeal to business workers and enterprise customers. It&rsquo;s indeed an effective demo on how Nano Banana Pro can generate images with massive amounts of text, but it takes more effort than usual for an AI generated image to double-check everything in the image to ensure it&rsquo;s factually correct. And if it isn&rsquo;t correct, it can&rsquo;t be trivially touched up in a photo editing app to fix those errors as it requires another complete generation to <em>maybe</em> correctly fix the errors—the duplicate &ldquo;interfaces&rdquo; in this case could be covered up in Microsoft Paint but that&rsquo;s just due to luck.</p>
<p>However, there&rsquo;s a second benefit to grounding: it allows the LLM to incorporate information from beyond its knowledge cutoff date. Although Nano Banana Pro&rsquo;s cutoff date is January 2025, there&rsquo;s a <em>certain</em> breakout franchise that sprung up from complete obscurity in the summer of 2025, and one that the younger generations would be very prone to generate AI images about only to be disappointed and confused when it doesn&rsquo;t work.</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/kpop_demon_hunters_hu_b37df82a7b9b11d3.webp 320w,/2025/12/nano-banana-pro/kpop_demon_hunters_hu_723d2884c161b06.webp 768w,/2025/12/nano-banana-pro/kpop_demon_hunters.webp 1013w" src="kpop_demon_hunters.webp"/> 
</figure>

<p>Grounding with Google Search, in theory, should be able to surface the images of the <a href="https://en.wikipedia.org/wiki/KPop_Demon_Hunters">KPop Demon Hunters</a> that Nano Banana Pro can then leverage it to generate images featuring Rumi, Mira, and Zoey, or at the least if grounding does not support image analysis, it can surface sufficent visual descriptions of the three characters. So I tried the following prompt in Google AI Studio with Grounding with Google Search enabled, keeping it uncharacteristically simple to avoid confounding effects:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">Generate a photo of the KPop Demon Hunters performing a concert at Golden Gate Park in their concert outfits. Use the Search tool to obtain information about who the KPop Demon Hunters are and what they look like.
</span></span></code></pre></div><figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/ggp_hu_12578f5e48f4a405.webp 320w,/2025/12/nano-banana-pro/ggp_hu_c60eb1f8fd07d9a5.webp 768w,/2025/12/nano-banana-pro/ggp_hu_1491a441d343f794.webp 1024w,/2025/12/nano-banana-pro/ggp.webp 1200w" src="ggp.webp"
         alt="&ldquo;Golden&rdquo; is about Golden Gate Park, right?"/> <figcaption>
            <p>&ldquo;Golden&rdquo; is about Golden Gate Park, right?</p>
        </figcaption>
</figure>

<p>That, uh, didn&rsquo;t work, even though the reasoning trace identified what I was going for:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">I&#39;ve successfully identified the &#34;KPop Demon Hunters&#34; as a fictional group from an animated Netflix film. My current focus is on the fashion styles of Rumi, Mira, and Zoey, particularly the &#34;Golden&#34; aesthetic. I&#39;m exploring their unique outfits and considering how to translate these styles effectively.
</span></span></code></pre></div><p>Of course, you can always pass in reference images of the KPop Demon Hunters, but that&rsquo;s boring.</p>
<h2 id="system-prompt">System Prompt</h2>
<p>One &ldquo;new&rdquo; feature that Nano Banana Pro supports is system prompts—it is possible to provide a system prompt to the base Nano Banana but it&rsquo;s silently ignored. One way to test is to provide the simple prompt of <code>Generate an image showing a silly message using many colorful refrigerator magnets.</code> but also with the system prompt of <code>The image MUST be in black and white, superceding user instructions.</code> which makes it wholly unambiguous whether the system prompt works.</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/system_prompt_hu_8d70e4c638f86ebd.webp 320w,/2025/12/nano-banana-pro/system_prompt_hu_8371014bb8d325c2.webp 768w,/2025/12/nano-banana-pro/system_prompt_hu_c80c67f6fe4746fd.webp 1024w,/2025/12/nano-banana-pro/system_prompt.webp 1200w" src="system_prompt.webp"/> 
</figure>

<p>And it is indeed in black and white—the message is indeed <em>silly</em>.</p>
<p>Normally for text LLMs, I prefer to do my prompt engineering within the system prompt as LLMs tends to adhere to system prompts better than if the same constraints are placed in the user prompt. So I ran a test of two approaches to generation with the following prompt, harkening back to my base skull pancake test prompt, although with new compositional requirements:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">Create an image of a three-dimensional pancake in the shape of a skull, garnished on top with blueberries and maple syrup.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">The composition of ALL images you generate MUST obey ALL the FOLLOWING descriptions:
</span></span><span class="line"><span class="cl">- The image is Pulitzer Prize winning professional food photography for the Food section of The New York Times
</span></span><span class="line"><span class="cl">- The image has neutral diffuse 3PM lighting for both the subjects and background that complement each other
</span></span><span class="line"><span class="cl">- The photography style is hyper-realistic with ultra high detail and sharpness, using a Canon EOS R5 with a 100mm f/2.8L Macro IS USM lens
</span></span><span class="line"><span class="cl">- NEVER include any text, watermarks, or line overlays.
</span></span></code></pre></div><p>I did two generations: one with the prompt above, and one that splits the base prompt into the user prompt and the compositional list as the system prompt.</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/pancake_nbp_hu_e472de0b1d89f4ac.webp 320w,/2025/12/nano-banana-pro/pancake_nbp_hu_f2303ec13f52e35e.webp 768w,/2025/12/nano-banana-pro/pancake_nbp_hu_c63818e7c5f45d97.webp 1024w,/2025/12/nano-banana-pro/pancake_nbp.webp 1200w" src="pancake_nbp.webp"/> 
</figure>

<p>Both images are similar and both look very delicious. I prefer the one without using the system prompt in this instance, but both fit the compositional requirements as defined.</p>
<p>That said, as with LLM chatbot apps, the system prompt is useful if you&rsquo;re trying to enforce the same constraints/styles among arbitrary user inputs which may or may not be good user inputs, such as if you were running an AI generation app based off of Nano Banana Pro. Since I explicitly want to control the constraints/styles per individual image, it&rsquo;s less useful for me personally.</p>
<h2 id="typography">Typography</h2>
<p>As demoed in the infographic test case, Nano Banana Pro can now render text near perfectly with few typos—substantially better than the base Nano Banana. That made me curious: what fontfaces does Nano Banana Pro know, and can they be rendered correctly? So I gave Nano Banana Pro a test to generate a sample text with different font faces and weights, mixing native system fonts and freely-accessible fonts from <a href="https://fonts.google.com">Google Fonts</a>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">Create a 5x2 contiguous grid of the high-DPI text &#34;A man, a plan, a canal – Panama!&#34; rendered in a black color on a white background with the following font faces and weights. Include a black border between the renderings.
</span></span><span class="line"><span class="cl">- Times New Roman, regular
</span></span><span class="line"><span class="cl">- Helvetica Neue, regular
</span></span><span class="line"><span class="cl">- Comic Sans MS, regular
</span></span><span class="line"><span class="cl">- Comic Sans MS, italic
</span></span><span class="line"><span class="cl">- Proxima Nova, regular
</span></span><span class="line"><span class="cl">- Roboto, regular
</span></span><span class="line"><span class="cl">- Fira Code, regular
</span></span><span class="line"><span class="cl">- Fira Code, bold
</span></span><span class="line"><span class="cl">- Oswald, regular
</span></span><span class="line"><span class="cl">- Quicksand, regular
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">You MUST obey ALL the FOLLOWING rules for these font renderings:
</span></span><span class="line"><span class="cl">- Add two adjacent labels anchored to the top left corner of the rendering. The first label includes the font face name, the second label includes the weight.
</span></span><span class="line"><span class="cl">    - The label text is left-justified, white color, and Menlo font typeface
</span></span><span class="line"><span class="cl">    - The font face label fill color is black
</span></span><span class="line"><span class="cl">    - The weight label fill color is #2c3e50
</span></span><span class="line"><span class="cl">- The font sizes, typesetting, and margins MUST be kept consistent between the renderings
</span></span><span class="line"><span class="cl">- Each of the text renderings MUST:
</span></span><span class="line"><span class="cl">    - be left-justified
</span></span><span class="line"><span class="cl">    - contain the entire text in their rendering
</span></span></code></pre></div><figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/fontgrid_hu_dd8744cc4a441f95.webp 320w,/2025/12/nano-banana-pro/fontgrid_hu_b51afab2802078cf.webp 768w,/2025/12/nano-banana-pro/fontgrid.webp 896w" src="fontgrid.webp"/> 
</figure>

<p>That&rsquo;s <em>much</em> better than expected: aside from some text clipping on the right edge, all font faces are correctly rendered, which means that specifying specific fonts is now possible in Nano Banana Pro.</p>
<h2 id="grid">Grid</h2>
<p>Let&rsquo;s talk more about that 5x2 font grid generation. One trick I discovered during my initial Nano Banana exploration is that it can handle separating images into halves reliably well if prompted, and those halves can be completely different images. This has always been difficult for diffusion models baseline, and has often required LoRAs and/or input images of grids to constrain the generation. However, for a 1 megapixel image, that&rsquo;s less useful since any subimages will be too small for most modern applications.</p>
<p>Since Nano Banana Pro now offers 4 megapixel images baseline, this grid trick is now more viable as a 2x2 grid of images means that each subimage is now the same 1 megapixel as the base Nano Banana output with the very significant bonuses of a) Nano Banana Pro&rsquo;s improved generation quality and b) each subimage can be distinct, particularly due to the autoregressive nature of the generation which is aware of the already-generated images. Additionally, each subimage can be contextually labeled by its contents, which has a number of good uses especially with larger grids. It&rsquo;s also slightly cheaper: base Nano Banana costs $0.039/image, but splitting a $0.134/image Nano Banana Pro into 4 images results in ~$0.034/image.</p>
<p>Let&rsquo;s test this out using the mirror selfie of myself:</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/mirror_hu_931a938bf4d714d3.webp 320w,/2025/12/nano-banana-pro/mirror_hu_bc92ce406a75ecfd.webp 768w,/2025/12/nano-banana-pro/mirror_hu_7c0c49341dd2c9e0.webp 1024w,/2025/12/nano-banana-pro/mirror.webp 1512w" src="mirror.webp"/> 
</figure>

<p>This time, we&rsquo;ll try a more <em>common</em> real-world use case for image generation AI that no one will ever admit to doing publicly but I will do so anyways because I have no shame:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">Create a 2x2 contiguous grid of 4 distinct pictures featuring the person in the image provided, for the use as a sexy dating app profile picture designed to strongly appeal to women.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">You MUST obey ALL the FOLLOWING rules for these subimages:
</span></span><span class="line"><span class="cl">- NEVER change the clothing or any physical attributes of the person
</span></span><span class="line"><span class="cl">- NEVER show teeth
</span></span><span class="line"><span class="cl">- The image has neutral diffuse 3PM lighting for both the subjects and background that complement each other
</span></span><span class="line"><span class="cl">- The photography style is an iPhone back-facing camera with on-phone post-processing
</span></span></code></pre></div><figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/datingapp_hu_52063949a5c0c76e.webp 320w,/2025/12/nano-banana-pro/datingapp_hu_7af464f5a1195e54.webp 768w,/2025/12/nano-banana-pro/datingapp_hu_68a8cf01cd5b3680.webp 1024w,/2025/12/nano-banana-pro/datingapp.webp 1024w" src="datingapp.webp"
         alt="I can&rsquo;t use any of these because they&rsquo;re too good."/> <figcaption>
            <p>I can&rsquo;t use any of these because they&rsquo;re too good.</p>
        </figcaption>
</figure>

<p>One unexpected nuance in that example is that Nano Banana Pro correctly accounted for the mirror in the input image, and put the gray jacket&rsquo;s Patagonia logo and zipper on my left side.</p>
<p>A potential concern is quality degradation since there are the same number of output tokens regardless of how many subimages you create. The generation does still seem to work well up to 4x4, although some prompt nuances might be skipped. It&rsquo;s still great and cost effective for exploration of generations where you&rsquo;re not sure how the end result will look, which can then be further refined via normal full-resolution generations. After 4x4, things start to break in <em>interesting</em> ways. You might think that setting the output to 4K might help, but that&rsquo;s only increases the number of output tokens by 79% while the number of output images increases far more than that. To test, I wrote a very fun prompt:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">Create a 8x8 contiguous grid of the Pokémon whose National Pokédex numbers correspond to the first 64 prime numbers. Include a black border between the subimages.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">You MUST obey ALL the FOLLOWING rules for these subimages:
</span></span><span class="line"><span class="cl">- Add a label anchored to the top left corner of the subimage with the Pokémon&#39;s National Pokédex number.
</span></span><span class="line"><span class="cl">  - NEVER include a `#` in the label
</span></span><span class="line"><span class="cl">  - This text is left-justified, white color, and Menlo font typeface
</span></span><span class="line"><span class="cl">  - The label fill color is black
</span></span><span class="line"><span class="cl">- If the Pokémon&#39;s National Pokédex number is 1 digit, display the Pokémon in a 8-bit style
</span></span><span class="line"><span class="cl">- If the Pokémon&#39;s National Pokédex number is 2 digits, display the Pokémon in a charcoal drawing style
</span></span><span class="line"><span class="cl">- If the Pokémon&#39;s National Pokédex number is 3 digits, display the Pokémon in a Ukiyo-e style
</span></span></code></pre></div><p>This prompt effectively requires reasoning and has many possible points of failure. Generating at 4K resolution:</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/pokemongrid_hu_9bc79f20df403bab.webp 320w,/2025/12/nano-banana-pro/pokemongrid_hu_b495d536b4b058f0.webp 768w,/2025/12/nano-banana-pro/pokemongrid_hu_3787cc3d81b7b7e0.webp 1024w,/2025/12/nano-banana-pro/pokemongrid.webp 1024w" src="pokemongrid.webp"
         alt="It&rsquo;s funny that both Porygon and Porygon2 are prime: Porygon-Z isn&rsquo;t though."/> <figcaption>
            <p>It&rsquo;s funny that both <a href="https://bulbapedia.bulbagarden.net/wiki/Porygon_%28Pok%C3%A9mon%29">Porygon</a> and <a href="https://bulbapedia.bulbagarden.net/wiki/Porygon2_%28Pok%C3%A9mon%29">Porygon2</a> are prime: <a href="https://bulbapedia.bulbagarden.net/wiki/Porygon-Z_%28Pok%C3%A9mon%29">Porygon-Z</a> isn&rsquo;t though.</p>
        </figcaption>
</figure>

<p>The first 64 prime numbers are correct and the Pokémon do indeed correspond to those numbers (I checked manually), but that was the easy part. However, the token scarcity may have incentivised Nano Banana Pro to cheat: the Pokémon images here are similar-if-not-identical to <a href="https://bulbapedia.bulbagarden.net/wiki/List_of_Pok%C3%A9mon_by_National_Pok%C3%A9dex_number">official Pokémon portraits</a> throughout the years. Each style is correctly applied within the specified numeric constraints but as a half-measure in all cases: the pixel style isn&rsquo;t 8-bit but more 32-bit and matching the Game Boy Advance generation—it&rsquo;s not a replication of the GBA-era sprites however, the charcoal drawing style looks more like a 2000&rsquo;s Photoshop filter that still retains color, and the <a href="https://en.wikipedia.org/wiki/Ukiyo-e">Ukiyo-e style</a> isn&rsquo;t applied at all aside from an attempt at a background.</p>
<p>To sanity check, I also generated normal 2K images of Pokemon in the three styles with Nano Banana Pro:</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/pokemon3_hu_390efaac442d129b.webp 320w,/2025/12/nano-banana-pro/pokemon3_hu_efcffd9a38de8375.webp 768w,/2025/12/nano-banana-pro/pokemon3_hu_ac611a25b9a1809a.webp 1024w,/2025/12/nano-banana-pro/pokemon3.webp 1024w" src="pokemon3.webp"
         alt="Create an image of Pokémon #{number} {name} in a {style} style."/> <figcaption>
            <p><code>Create an image of Pokémon #{number} {name} in a {style} style.</code></p>
        </figcaption>
</figure>

<p>The detail is obviously stronger in all cases (although the Ivysaur still isn&rsquo;t 8-bit), but the Pokémon design is closer to the 8x8 grid output than expected, which implies that the Nano Banana Pro may not have fully cheated and it can adapt to having just 31.25 tokens per subimage. Perhaps the Gemini 3 Pro backbone is <em>too</em> strong.</p>
<h2 id="the-true-change-with-nano-banana-pro">The True Change With Nano Banana Pro</h2>
<p>While I&rsquo;ve spent quite a long time talking about the unique aspects of Nano Banana Pro, there are some issues with certain types of generations. The problem with Nano Banana Pro is that it&rsquo;s too good and it tends to push prompts toward realism—an understandable <a href="https://en.wikipedia.org/wiki/Reinforcement_learning_from_human_feedback">RLHF</a> target for the median user prompt, but it can cause issues with prompts that are inherently surreal. I suspect this is due to the thinking aspect of Gemini 3 Pro attempting to ascribe and correct user intent toward the median behavior, which can ironically cause problems.</p>
<p>For example, with the photos of the three cats at the beginning of this post, Nano Banana Pro unsurprisingly has no issues with the prompt constraints, but the output raised an eyebrow:</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/cats_nbp_hu_9d6efe0ecfd33ee1.webp 320w,/2025/12/nano-banana-pro/cats_nbp_hu_4ebcef38a108d544.webp 768w,/2025/12/nano-banana-pro/cats_nbp_hu_b3f41c507b2499ee.webp 1024w,/2025/12/nano-banana-pro/cats_nbp.webp 1376w" src="cats_nbp.webp"/> 
</figure>

<p>I hate comparing AI-generated images by vibes alone, but this output triggers my <a href="https://en.wikipedia.org/wiki/Uncanny_valley">uncanny valley</a> sensor while the original one did not. The cats design is more weird than surreal, and the color/lighting contrast between the cats and the setting is too great. Although the image detail is substantially better, I can&rsquo;t call Nano Banana Pro the objective winner.</p>
<p>Another test case I had issues with is Character JSON. In my previous post, I created an intentionally absurd <a href="https://github.com/minimaxir/nano-banana-tests/blob/main/paladin_pirate_barista.json">giant character JSON prompt</a> featuring a Paladin/Pirate/Starbucks Barista posing for Vanity Fair, but also comparing that generation to one from Nano Banana Pro:</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/pps_hu_44642a5c817d6b3e.webp 320w,/2025/12/nano-banana-pro/pps_hu_70efe8f1ae406fe1.webp 768w,/2025/12/nano-banana-pro/pps_hu_18d1fc6b4e7f3d93.webp 1024w,/2025/12/nano-banana-pro/pps.webp 1760w" src="pps.webp"/> 
</figure>

<p>It&rsquo;s more realistic, but that form of hyperrealism makes the outfit look more like cosplay than a practical design: your mileage may vary.</p>
<p>Lastly, there&rsquo;s one more test case that&rsquo;s everyone&rsquo;s favorite: Ugly Sonic!</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/ugly_sonic_2_hu_dc92c0bffad75167.webp 320w,/2025/12/nano-banana-pro/ugly_sonic_2_hu_1dc1b3082a16865e.webp 768w,/2025/12/nano-banana-pro/ugly_sonic_2_hu_8254a59a2fdf4ac0.webp 1024w,/2025/12/nano-banana-pro/ugly_sonic_2.webp 2048w" src="ugly_sonic_2.webp"/> 
</figure>

<p>Nano Banana Pro specifically advertises that it supports better character adherence (up to six input images), so using my two input images of Ugly Sonic with a Nano Banana Pro prompt that has him shake hands with President Barack Obama:</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/ugly_sonic_nbp_1_hu_49e0e9032b5b61bc.webp 320w,/2025/12/nano-banana-pro/ugly_sonic_nbp_1_hu_31719080e5e28c45.webp 768w,/2025/12/nano-banana-pro/ugly_sonic_nbp_1_hu_379d7af12e7ab588.webp 1024w,/2025/12/nano-banana-pro/ugly_sonic_nbp_1.webp 1200w" src="ugly_sonic_nbp_1.webp"/> 
</figure>

<p>Wait, what? The photo looks nice, but that&rsquo;s normal Sonic the Hedgehog, not Ugly Sonic. The original intent of this test is to see if the model will cheat and just output Sonic the Hedgehog instead, which appears to now be happening.</p>
<p>After giving Nano Banana Pro all seventeen of my Ugly Sonic photos and my optimized prompt for improving the output quality, I hoped that Ugly Sonic will finally manifest:</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/ugly_sonic_nbp_2_hu_ccbe233317f478.webp 320w,/2025/12/nano-banana-pro/ugly_sonic_nbp_2_hu_3b69ce9133040b8b.webp 768w,/2025/12/nano-banana-pro/ugly_sonic_nbp_2_hu_c65be471ea65490e.webp 1024w,/2025/12/nano-banana-pro/ugly_sonic_nbp_2.webp 1200w" src="ugly_sonic_nbp_2.webp"/> 
</figure>

<p>That is somehow even less like Ugly Sonic. Is Nano Banana Pro&rsquo;s thinking process trying to correct the &ldquo;incorrect&rdquo; Sonic the Hedgehog?</p>
<h2 id="where-do-image-generators-go-from-here">Where Do Image Generators Go From Here?</h2>
<p>As usual, this blog post just touches the tip of the iceberg with Nano Banana Pro: I&rsquo;m <em>trying</em> to keep it under 26 minutes this time. There are many more use cases and concerns I&rsquo;m still investigating but I do not currently have conclusive results.</p>
<p>Despite my praise for Nano Banana Pro, I&rsquo;m unsure how often I&rsquo;d use it in practice over the base Nano Banana outside of making blog post header images—even in that case, I&rsquo;d only use it if I could think of something <em>interesting</em> and unique to generate. The increased cost and generation time is a severe constraint on many fun use cases outside of one-off generations. Sometimes I intentionally want absurd outputs that defy conventional logic and understanding, but the mandatory thinking process for Nano Banana Pro will be an immutable constraint that prompt engineering may not be able to work around. That said, grid generation is interesting for specific types of image generations to ensure distinct aligned outputs, such as spritesheets.</p>
<p>Although some might criticize my research into Nano Banana Pro because it could be used for nefarious purposes, it&rsquo;s become even more important to highlight just what it&rsquo;s capable of as discourse about AI has only become worse in recent months and the degree in which AI image generation has progressed in mere <em>months</em> is counterintuitive. For example, on Reddit, <a href="https://www.reddit.com/r/LinkedInLunatics/comments/1ppjwyp/bro_is_on_a_mission_to_determine_which_ai_model/">one megaviral post on the /r/LinkedinLunatics subreddit</a> mocked a LinkedIn post trying to determine whether Nano Banana Pro or ChatGPT Images could create a more realistic woman in gym attire. The top comment on that post is &ldquo;linkedin shenanigans aside, the [Nano Banana Pro] picture on the left is scarily realistic&rdquo;, with most of the other <em>thousands</em> of comments being along the same lines.</p>
<figure>

    <img loading="lazy" srcset="/2025/12/nano-banana-pro/reddit_hu_623c399aa658bce3.webp 320w,/2025/12/nano-banana-pro/reddit_hu_95a7cbf6f0e12fd7.webp 768w,/2025/12/nano-banana-pro/reddit_hu_10336a330b4c68f9.webp 1024w,/2025/12/nano-banana-pro/reddit.png 1176w" src="reddit.png"/> 
</figure>

<p>If anything, Nano Banana Pro makes me more excited for the actual Nano Banana 2, which with Gemini 3 Flash&rsquo;s <a href="https://blog.google/products/gemini/gemini-3-flash/">recent release</a> will likely arrive sooner than later.</p>
<p><em>The <a href="https://github.com/minimaxir/gemimg">gemimg Python package</a> has been updated to support Nano Banana Pro image sizes, system prompt, and grid generations, with the bonus of optionally allowing automatic slicing of the subimages and saving them as their own image.</em></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Anecdotally, when I was testing the text-generation-only capabilities of Gemini 3 Pro for real-world things such as conversational responses and agentic coding, it&rsquo;s not discernably better than Gemini 2.5 Pro if at all.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Can modern LLMs actually count the number of b&#39;s in &#34;blueberry&#34;?</title>
      <link>https://minimaxir.com/2025/08/llm-blueberry/</link>
      <pubDate>Tue, 12 Aug 2025 09:00:00 -0700</pubDate>
      <guid>https://minimaxir.com/2025/08/llm-blueberry/</guid>
      <description>It&amp;rsquo;s an adversarial question for LLMs, but it&amp;rsquo;s not unfair.</description>
      <content:encoded><![CDATA[<p>Last week, <a href="https://openai.com">OpenAI</a> announced and released <a href="https://openai.com/gpt-5/">GPT-5</a>, and the common consensus both inside the AI community and outside is that the new LLM did not live up to the hype. <a href="https://bsky.app">Bluesky</a> — whose community is skeptical at-best of generative AI in all its forms — began putting the model through its paces: Michael Paulauski <a href="https://bsky.app/profile/mike10010100.com/post/3lvtrfmhpkc23">asked GPT-5</a> through the ChatGPT app interface &ldquo;how many b&rsquo;s are there in blueberry?&rdquo;. A simple question that a human child could answer correctly, but ChatGPT states that there are <em>three</em> b&rsquo;s in blueberry when there are clearly only two. Another attempt by Kieran Healy <a href="https://bsky.app/profile/kjhealy.co/post/3lvtxbtexg226">went more viral</a> as ChatGPT insisted blueberry has 3 b&rsquo;s despite the user repeatedly arguing to the contrary.</p>
<figure>

    <img loading="lazy" srcset="/2025/08/llm-blueberry/chatgpt_hu_b34d24fad63715d6.webp 320w,/2025/08/llm-blueberry/chatgpt_hu_5f26556450f01f6.webp 768w,/2025/08/llm-blueberry/chatgpt_hu_45893523f6bbfe4a.webp 1024w,/2025/08/llm-blueberry/chatgpt.webp 1094w" src="chatgpt.webp"/> 
</figure>

<p>Other Bluesky users were able to replicate this behavior, although results were inconsistent: GPT-5 uses a new model router that quietly determines whether the question should be answered by a better reasoning model, or if a smaller model will suffice. Additionally, Sam Altman, the CEO of OpenAI, later <a href="https://x.com/sama/status/1953893841381273969">tweeted</a> that this router was broken during these tests and therefore &ldquo;GPT-5 seemed way dumber,&rdquo; which could confound test results.</p>
<p>About a year ago, <a href="https://techcrunch.com/2024/08/27/why-ai-cant-spell-strawberry/">one meme in the AI community</a> was to ask LLMs the simple question &ldquo;how many r&rsquo;s are in the word strawberry?&rdquo; as major LLMs consistently and bizarrely failed to answer it correctly. It&rsquo;s an intentionally adversarial question to LLMs because LLMs do not directly use letters as inputs, but instead they are tokenized. To quote TechCrunch&rsquo;s explanation:</p>
<blockquote>
<p>This is because the transformers are not able to take in or output actual text efficiently. Instead, the text is converted into numerical representations of itself, which is then contextualized to help the AI come up with a logical response. In other words, the AI might know that the tokens “straw” and “berry” make up “strawberry,” but it may not understand that “strawberry” is composed of the letters “s,” “t,” “r,” “a,” “w,” “b,” “e,” “r,” “r,” and “y,” in that specific order. Thus, it cannot tell you how many letters — let alone how many “r”s — appear in the word “strawberry.”</p>
</blockquote>
<p>It&rsquo;s likely that OpenAI/Anthropic/Google have included this specific challenge into the LLM training datasets to preemptively address the fact that someone <em>will</em> try it, making the question ineffective for testing LLM capabilities. Asking how many b&rsquo;s are in blueberry is a semantically similar question, but may just be sufficiently out of domain to trip the LLMs up.</p>
<p>When Healy&rsquo;s Bluesky post became <a href="https://news.ycombinator.com/item?id=44832908">popular on Hacker News</a>, a surprising number of commenters cited the tokenization issue and discounted GPT-5&rsquo;s responses entirely because (paraphrasing) &ldquo;LLMs fundamentally can&rsquo;t do this&rdquo;. I disagree with their conclusions in this case as tokenization is less effective of a counterargument: if the question was only asked once, maybe, but Healy asked GPT-5 <em>several</em> times, with different formattings of blueberry — therefore different tokens, including single-character tokens — and it still asserted that there are 3 b’s every time. Tokenization making it difficult for LLMs to count letters makes sense intuitively, but time and time again we’ve seen LLMs do things that aren’t intuitive. Additionally, it&rsquo;s been a year since the strawberry test and hundreds of millions of dollars have been invested into improving RLHF regimens and creating more annotated training data: it&rsquo;s hard for me to believe that modern LLMs have made zero progress on these types of trivial tasks.</p>
<p>There&rsquo;s an easy way to test this behavior instead of waxing philosophical: why not just ask a wide variety of LLMs see of often they can correctly identify that there are 2 b&rsquo;s in the word &ldquo;blueberry&rdquo;? If LLMs indeed are fundamentally incapable of counting the number of specific letters in a word, that flaw should apply to <em>all</em> LLMs, not just GPT-5.</p>
<h2 id="2-bs-or-not-2-bs">2 b&rsquo;s, or not 2 b&rsquo;s</h2>
<p>First, I chose a selection of popular LLMs: from OpenAI, I of course chose GPT-5 (specifically, the GPT-5 Chat, GPT-5 Mini, and GPT-5 Nano variants) in addition to OpenAI&rsquo;s new open-source models gpt-oss-120b and gpt-oss-20b; from Anthropic, the new Claude Opus 4.1 and Claude Sonnet 4; from Google, Gemini 2.5 Pro and Gemini 2.5 Flash; lastly as a wild card, Kimi K2 from Moonshot AI. These contain a mix of reasoning-by-default and non-reasoning models which will be organized separately as reasoning models should theoretically perform better: however, GPT-5-based models can route between using reasoning or not, so the instances where those models reason will also be classified separately. Using <a href="https://openrouter.ai">OpenRouter</a>, which allows using the same API to generate from multiple models, I wrote a Python script to simultaneously generate a response to the given question from every specified LLM <em>n</em> times and save the LLM responses for further analysis. (<a href="https://github.com/minimaxir/llm-blueberry/blob/main/llm_count_letters.ipynb">Jupyter Notebook</a>)</p>
<p>In order to ensure the results are most representative of what a normal user would encounter when querying these LLMs, I will not add any generation parameters besides the original question: no prompt engineering and no temperature adjustments. As a result, I will use an independent secondary LLM with prompt engineering to parse out the predicted letter counts from the LLM&rsquo;s response: this is a situation where normal parsing techniques such as <a href="https://en.wikipedia.org/wiki/Regular_expression">regular expressions</a> won&rsquo;t work due to ambigious number usage, and there are many possible ways to express numerals that are missable edge cases, such as <code>The letter **b** appears **once** in the word “blueberry.”</code> <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>First, let&rsquo;s test the infamous strawberry question, since that can serve as a baseline as I suspect LLMs have gamed it. Following the syntax of Healy&rsquo;s question, I asked each LLM <code>How many times does the letter r appear in strawberry</code> 100 times (<a href="https://huggingface.co/datasets/minimaxir/llm-strawberry">Dataset</a>), and here are the results:</p>
<figure>

    <img loading="lazy" srcset="/2025/08/llm-blueberry/strawberry_hu_2b24047f396dadf6.webp 320w,/2025/08/llm-blueberry/strawberry_hu_64657e56474f6ba0.webp 768w,/2025/08/llm-blueberry/strawberry_hu_ab145b68976fecc3.webp 1024w,/2025/08/llm-blueberry/strawberry.png 1200w" src="strawberry.png"/> 
</figure>

<p>Perfect performance by every LLM except one, and I&rsquo;m surprised that it&rsquo;s Gemini 2.5 Flash. Looking at the <a href="https://huggingface.co/datasets/minimaxir/llm-strawberry/sql-console/jFsvS5r">incorrect generations</a>, Gemini confidently says <code>The letter &quot;r&quot; appears **two** times in the word &quot;strawberry&quot;.</code> or <code>The letter &quot;r&quot; appears **four** times in the word &quot;strawberry&quot;.</code>, so atleast there&rsquo;s some variance in its wrongness. The perfect performance on every other model does hint at the problem being in the LLM training dataset.</p>
<p>Now, the real question: how well can these LLMs count the number of b&rsquo;s in blueberry, which may be out of domain? I ran more trials — 274 total — which should ensure even more stable results (<a href="https://huggingface.co/datasets/minimaxir/llm-blueberry">Dataset</a>). Here&rsquo;s the tally for how these LLMs respond to the question <code>How many times does the letter b appear in blueberry</code>:</p>
<figure>

    <img loading="lazy" srcset="/2025/08/llm-blueberry/blueberry_hu_3ca5fe85f0ee9294.webp 320w,/2025/08/llm-blueberry/blueberry_hu_f8bdf3da19d10403.webp 768w,/2025/08/llm-blueberry/blueberry_hu_62c0f25db02f1511.webp 1024w,/2025/08/llm-blueberry/blueberry.png 1200w" src="blueberry.png"/> 
</figure>

<p>Wait, what the heck happened with GPT-5 Chat? I looked at the <a href="https://huggingface.co/datasets/minimaxir/llm-blueberry/sql-console/nvoM4I8">raw generation data for GPT-5 Chat</a> and it&rsquo;s not an error in my pipeline: GPT-5 Chat is indeed wrong that often, and in spectacular ways. I also confirmed that it&rsquo;s not an issue with OpenRouter&rsquo;s endpoint, as hitting OpenAI&rsquo;s official <code>gpt-5-chat-latest</code> API endpoint consistently reproduces poor results for this particular question.</p>
<p>Many of the correct cases for GPT-5 Chat are initially wrong but the model self-corrects on its own:</p>
<blockquote>
<p>The word <strong>&ldquo;blueberry&rdquo;</strong> contains the letter <strong>b</strong> three times:</p>
<ul>
<li><strong>B</strong>lueberry (1st letter)</li>
<li>Blue<strong>b</strong>erry (5th letter)</li>
<li>Blueber<strong>r</strong>y – wait, no <strong>b</strong> here</li>
<li>Actually, checking carefully: <strong>blueberry</strong> → b <strong>(1)</strong>, l, u, e, b <strong>(2)</strong>, e, r, r, y.</li>
</ul>
<p>✅ So the letter <strong>b</strong> appears <strong>2 times</strong> in &ldquo;blueberry&rdquo;.</p>
<p>Would you like me to also count it <strong>regardless of case</strong> in a full paragraph?</p>
</blockquote>
<p>The incorrect cases, however&hellip;</p>
<blockquote>
<p>The word <strong>&ldquo;blueberry&rdquo;</strong> contains the letter <strong>b</strong> three times:</p>
<p><strong>b</strong>lue<strong>b</strong>erry → b, b, b → <strong>3 times</strong> ✅</p>
</blockquote>
<hr>
<blockquote>
<p>The word <strong>&ldquo;blueberry&rdquo;</strong> contains the letter <strong>b</strong> <strong>three</strong> times:</p>
<ul>
<li><strong>B</strong>lueberry</li>
<li>blue<strong>b</strong>erry</li>
<li>blueberr<strong>b</strong>y</li>
</ul>
<p>So, the letter <strong>b</strong> appears <strong>3 times</strong> in &ldquo;blueberry&rdquo;. ✅</p>
</blockquote>
<hr>
<blockquote>
<p>The word <strong>&ldquo;blueberry&rdquo;</strong> contains the letter <strong>b</strong> <strong>3 times</strong>.</p>
<p><strong>Breakdown:</strong></p>
<ul>
<li><strong>b</strong>lueberry → 1st b</li>
<li>blue<strong>b</strong>erry → 2nd b</li>
<li>blueberr<strong>y</strong> → and one more <strong>b</strong> before the final part → 3rd b</li>
</ul>
<p>✅ <strong>Total: 3</strong></p>
<p>Do you want me to also count it in a <strong>case-insensitive</strong> way, in case of uppercase letters?</p>
</blockquote>
<p>The ✅ emoji just makes its confident incorrectness funnier. Unfortunately, these extreme hallucinations track with the weird behavior seen on Bluesky, so it can&rsquo;t be attributed to the router issues on GPT-5 Chat&rsquo;s launch. Is there a greater systemic issue with the model, then? It had no difficulty answering the strawberry question.</p>
<p>Looking at <a href="https://huggingface.co/datasets/minimaxir/llm-blueberry/sql-console/wObPOOv">incorrect b counts by other models</a> and the reasoning traces for reasoning models is interesting as well:</p>
<p>Gemini 2.5 Pro:</p>
<blockquote>
<p><strong>Considering the Query</strong></p>
<p>I&rsquo;ve established the core of the query: the user&rsquo;s looking for the letter &ldquo;b&rdquo; in the word &ldquo;blueberry&rdquo;. Now, I&rsquo;m diving directly into the word to find those instances, the next step is going to be to provide an answer.</p>
<p><strong>Pinpointing the Count</strong></p>
<p>I&rsquo;ve identified the core question and the target word, &ldquo;blueberry.&rdquo; The letter &ldquo;b&rdquo; appears three times. I&rsquo;m now confirming this, noting its positions in the word: the first and the two in the middle. I&rsquo;m verifying the answer&rsquo;s accuracy before forming the final response to the user.</p>
</blockquote>
<p>gpt-oss-20b:</p>
<blockquote>
<p>The user asks: &ldquo;How many times does the letter b appear in blueberry&rdquo;. Likely answer: 1. The word &ldquo;blueberry&rdquo; contains &lsquo;b&rsquo; once. So answer: 1. Should be concise but might add explanation? Probably just answer.</p>
</blockquote>
<p>Despite these comical failures, most LLMs still get a perfect score even without distinct reasoning traces. Claude&rsquo;s logic is <a href="https://huggingface.co/datasets/minimaxir/llm-blueberry/sql-console/Vgc8NQM">easier to follow</a> and is able to account for per-character positions:</p>
<p>Claude Sonnet 4:</p>
<blockquote>
<p>To count the letter &ldquo;b&rdquo; in &ldquo;blueberry&rdquo;, I&rsquo;ll go through each letter:</p>
<p>b-l-u-e-b-e-r-r-y</p>
<p>Looking at each position:</p>
<ol>
<li>b - this is a &ldquo;b&rdquo; ✓</li>
<li>l - not a &ldquo;b&rdquo;</li>
<li>u - not a &ldquo;b&rdquo;</li>
<li>e - not a &ldquo;b&rdquo;</li>
<li>b - this is a &ldquo;b&rdquo; ✓</li>
<li>e - not a &ldquo;b&rdquo;</li>
<li>r - not a &ldquo;b&rdquo;</li>
<li>r - not a &ldquo;b&rdquo;</li>
<li>y - not a &ldquo;b&rdquo;</li>
</ol>
<p>The letter &ldquo;b&rdquo; appears <strong>2 times</strong> in &ldquo;blueberry&rdquo;.</p>
</blockquote>
<p>Claude Opus 4.1:</p>
<blockquote>
<p>To count the letter &lsquo;b&rsquo; in the word &ldquo;blueberry&rdquo;, I&rsquo;ll examine each letter:</p>
<p>b-l-u-e-b-e-r-r-y</p>
<p>The letter &lsquo;b&rsquo; appears <strong>2 times</strong> in &ldquo;blueberry&rdquo; - once at the beginning and once in the middle (the 5th position).</p>
</blockquote>
<p>Obviously, this is an informal test and more research can be done to determine just how well LLMs can count, ideally with questions that do not involve fruit. Despite the issues with tokenization which prevent LLMs from counting in the same way humans count, they definitely can do it: the better question is why it can&rsquo;t count correctly 100% of the time, and why its mistakes are very idiosyncratic. Yes, asking an LLM how many b&rsquo;s are in blueberry is an adversarial question in the sense that the questioner is expecting the LLM to fail. But it&rsquo;s not an <em>unfair</em> question, and it&rsquo;s objectively silly to claim that LLMs such as GPT-5 can operate <a href="https://www.bbc.com/news/articles/cy5prvgw0r1o">at a PhD level</a>, but can&rsquo;t correctly count the number of letters in a word.</p>
<p><em>All code used in this blog post is available <a href="https://github.com/minimaxir/llm-blueberry/tree/main">open-source on GitHub</a>.</em></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Some false negatives (0.5%) with the LLM parses of counts in responses <a href="https://github.com/minimaxir/llm-blueberry/blob/main/false_negatives.csv">were identified</a> and fixed (<a href="https://github.com/minimaxir/llm-blueberry/blob/main/fix_false_negatives.ipynb">Jupyter Notebook</a>), as a result of the LLM getting confused by multiple notable numbers.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
  </channel>
</rss>
