live
MODEL IDgoogle:nano-banana@2.1

Nano Banana 2.1

Google
by

Nano Banana 2.1 is Google's updated image generation and editing model in the Nano Banana 2 family. It improves graphic composition and subject consistency, and it follows complex prompts and edit instructions more accurately. It works from text alone or from as many as fourteen reference images plus one reference video, and it can ground a generation in live web and image search so the result reflects current facts and real visual references. It generates at 1K, 2K and 4K, with three levels of thinking that trade speed for reasoning depth, which suits layout-heavy design work, recurring characters and products, and precise multi-step edits.

Nano Banana 2.1

Grounding with web and image search

How to ground Nano Banana 2.1 in live facts and real appearances with settings.webSearch and settings.imageSearch, and when to leave both lookups off.

Introduction

Ask an image model for a card with today's exchange rates and it will render numbers, all of them invented. The model knows nothing after its training cutoff, so a prompt that depends on a current fact gets confident fiction set in clean type.

Nano Banana 2.1 can look things up before it renders. settings.webSearch lets it read the web for facts the image has to state, and settings.imageSearch lets it retrieve pictures of something the image has to resemble.

The three rates and the date on that card were fetched while the request ran. This guide covers the two settings, what each one grounds, how to phrase a prompt a search can act on, and when a lookup is not worth the wait.

The two settings

Both are booleans under settings, and both are off unless you turn them on:

Try in Playground
import { createClient } from '@runware/sdk'

const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()

const [result] = await client.run({
  model: 'google:nano-banana@2.1',
  positivePrompt: 'A social media card for a travel money app titled "TODAY\'S RATES" in bold white capitals on a deep navy background. Below the title, three rows, each with a pair of small circular flag icons, a currency pair label, and the real current mid-market exchange rate looked up from the web, to four decimal places: "EUR / USD", "GBP / USD", and "USD / JPY". At the bottom in small light gray type, today\'s real date and the line "Rates are indicative". Clean modern fintech design, crisp legible numerals, generous spacing.',
  width: 2400,
  height: 1792,
  settings: {
    webSearch: true
  }
})
import asyncio
import os

from runware import Runware


async def main():
    async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
        results = await client.run({
            "model": "google:nano-banana@2.1",
            "positivePrompt": "A social media card for a travel money app titled \"TODAY'S RATES\" in bold white capitals on a deep navy background. Below the title, three rows, each with a pair of small circular flag icons, a currency pair label, and the real current mid-market exchange rate looked up from the web, to four decimal places: \"EUR / USD\", \"GBP / USD\", and \"USD / JPY\". At the bottom in small light gray type, today's real date and the line \"Rates are indicative\". Clean modern fintech design, crisp legible numerals, generous spacing.",
            "width": 2400,
            "height": 1792,
            "settings": {
                "webSearch": True
            }
        })


asyncio.run(main())
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "imageInference",
      "taskUUID": "a3d81f06-7c29-4b54-9e03-6f1c8a5d2b79",
      "model": "google:nano-banana@2.1",
      "positivePrompt": "A social media card for a travel money app titled \"TODAY'S RATES\" in bold white capitals on a deep navy background. Below the title, three rows, each with a pair of small circular flag icons, a currency pair label, and the real current mid-market exchange rate looked up from the web, to four decimal places: \"EUR / USD\", \"GBP / USD\", and \"USD / JPY\". At the bottom in small light gray type, today's real date and the line \"Rates are indicative\". Clean modern fintech design, crisp legible numerals, generous spacing.",
      "width": 2400,
      "height": 1792,
      "settings": {
        "webSearch": true
      }
    }
  ]'
runware run google:nano-banana@2.1 \
  positivePrompt="A social media card for a travel money app titled \"TODAY'S RATES\" in bold white capitals on a deep navy background. Below the title, three rows, each with a pair of small circular flag icons, a currency pair label, and the real current mid-market exchange rate looked up from the web, to four decimal places: \"EUR / USD\", \"GBP / USD\", and \"USD / JPY\". At the bottom in small light gray type, today's real date and the line \"Rates are indicative\". Clean modern fintech design, crisp legible numerals, generous spacing." \
  width=2400 \
  height=1792 \
  settings.webSearch=true
{
  "taskType": "imageInference",
  "taskUUID": "a3d81f06-7c29-4b54-9e03-6f1c8a5d2b79",
  "model": "google:nano-banana@2.1",
  "positivePrompt": "A social media card for a travel money app titled \"TODAY'S RATES\" in bold white capitals on a deep navy background. Below the title, three rows, each with a pair of small circular flag icons, a currency pair label, and the real current mid-market exchange rate looked up from the web, to four decimal places: \"EUR / USD\", \"GBP / USD\", and \"USD / JPY\". At the bottom in small light gray type, today's real date and the line \"Rates are indicative\". Clean modern fintech design, crisp legible numerals, generous spacing.",
  "width": 2400,
  "height": 1792,
  "settings": {
    "webSearch": true
  }
}
Response
[
  {
    "taskType": "imageInference",
    "taskUUID": "a3d81f06-7c29-4b54-9e03-6f1c8a5d2b79",
    "imageUUID": "5b9e2c74-d1a6-4f38-8c05-e7a3f0b6d914",
    "imageURL": "https://im.runware.ai/image/os/a14d18/ws/2/ii/5b9e2c74-d1a6-4f38-8c05-e7a3f0b6d914.jpg"
  }
]

settings.webSearch gives the model text it can quote: a rate, a date, a schedule, a name. settings.imageSearch gives it pictures it can match: the shape of a building, the look of a specific vehicle. The two are independent, so a request can turn on either one or both.

The response carries the generated image and nothing about the pages or pictures the model consulted. A grounded result cannot be traced to its sources, so check any figure that matters before it ships.

A grounded image reflects what the search returned at that moment. Keep the file you approved, because the same prompt tomorrow returns tomorrow's values.

Writing a prompt a search can act on

A lookup needs a query, and the query comes from the prompt. Four habits make a prompt searchable:

  • Name the entity exactly. "The Sagrada Família in Barcelona" is a query. "A famous basilica" is a description, and there is nothing to look up.
  • Ask for the real value in words. "The real current exchange rate" and "today's real date" tell the model the value has to be fetched and not composed.
  • Say which fields you need. "To four decimal places" and "with the day of the week" define what the search has to return.
  • Give a look a time anchor. "As it looks today" asks for the current state of a place that has changed.

The card below needs both lookups, a real view for the photograph and real values for the strip under it:

Try in Playground
import { createClient } from '@runware/sdk'

const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()

const [result] = await client.run({
  model: 'google:nano-banana@2.1',
  positivePrompt: 'A travel information card for hiking Mount Fuji that fills the whole frame edge to edge. The top two-thirds is a photograph of Mount Fuji as it really looks from the north shore of Lake Kawaguchi in early summer, with the lake in the foreground. The bottom third is a clean white information strip with the title "HIKING MOUNT FUJI" in bold dark capitals and three facts under it in dark type, each with a small line icon: the official climbing season dates for the Yoshida Trail this year, the current mandatory entry fee per person for the Yoshida Trail in yen, and the summit elevation in meters. Use the real current values from the web. Crisp legible sans serif, no other text.',
  width: 2400,
  height: 1792,
  settings: {
    webSearch: true,
    imageSearch: true
  }
})
import asyncio
import os

from runware import Runware


async def main():
    async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
        results = await client.run({
            "model": "google:nano-banana@2.1",
            "positivePrompt": "A travel information card for hiking Mount Fuji that fills the whole frame edge to edge. The top two-thirds is a photograph of Mount Fuji as it really looks from the north shore of Lake Kawaguchi in early summer, with the lake in the foreground. The bottom third is a clean white information strip with the title \"HIKING MOUNT FUJI\" in bold dark capitals and three facts under it in dark type, each with a small line icon: the official climbing season dates for the Yoshida Trail this year, the current mandatory entry fee per person for the Yoshida Trail in yen, and the summit elevation in meters. Use the real current values from the web. Crisp legible sans serif, no other text.",
            "width": 2400,
            "height": 1792,
            "settings": {
                "webSearch": True,
                "imageSearch": True
            }
        })


asyncio.run(main())
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "imageInference",
      "taskUUID": "f6c20b93-5e7a-4d14-a8b2-1d9e4c7f3a50",
      "model": "google:nano-banana@2.1",
      "positivePrompt": "A travel information card for hiking Mount Fuji that fills the whole frame edge to edge. The top two-thirds is a photograph of Mount Fuji as it really looks from the north shore of Lake Kawaguchi in early summer, with the lake in the foreground. The bottom third is a clean white information strip with the title \"HIKING MOUNT FUJI\" in bold dark capitals and three facts under it in dark type, each with a small line icon: the official climbing season dates for the Yoshida Trail this year, the current mandatory entry fee per person for the Yoshida Trail in yen, and the summit elevation in meters. Use the real current values from the web. Crisp legible sans serif, no other text.",
      "width": 2400,
      "height": 1792,
      "settings": {
        "webSearch": true,
        "imageSearch": true
      }
    }
  ]'
runware run google:nano-banana@2.1 \
  positivePrompt="A travel information card for hiking Mount Fuji that fills the whole frame edge to edge. The top two-thirds is a photograph of Mount Fuji as it really looks from the north shore of Lake Kawaguchi in early summer, with the lake in the foreground. The bottom third is a clean white information strip with the title \"HIKING MOUNT FUJI\" in bold dark capitals and three facts under it in dark type, each with a small line icon: the official climbing season dates for the Yoshida Trail this year, the current mandatory entry fee per person for the Yoshida Trail in yen, and the summit elevation in meters. Use the real current values from the web. Crisp legible sans serif, no other text." \
  width=2400 \
  height=1792 \
  settings.webSearch=true \
  settings.imageSearch=true
{
  "taskType": "imageInference",
  "taskUUID": "f6c20b93-5e7a-4d14-a8b2-1d9e4c7f3a50",
  "model": "google:nano-banana@2.1",
  "positivePrompt": "A travel information card for hiking Mount Fuji that fills the whole frame edge to edge. The top two-thirds is a photograph of Mount Fuji as it really looks from the north shore of Lake Kawaguchi in early summer, with the lake in the foreground. The bottom third is a clean white information strip with the title \"HIKING MOUNT FUJI\" in bold dark capitals and three facts under it in dark type, each with a small line icon: the official climbing season dates for the Yoshida Trail this year, the current mandatory entry fee per person for the Yoshida Trail in yen, and the summit elevation in meters. Use the real current values from the web. Crisp legible sans serif, no other text.",
  "width": 2400,
  "height": 1792,
  "settings": {
    "webSearch": true,
    "imageSearch": true
  }
}

When to leave both off

Each lookup adds time to the request, which is the reason to enable them per prompt and not across a whole pipeline.

A prompt about an invented subject gives a search nothing to find. A fictional brand or an illustration described fully in the prompt renders the same with or without a lookup, minus the wait. The test is whether the image could be wrong about the world. If nothing in it can be checked against a fact or a real appearance, leave both settings off.

Tips

  1. Turn lookups on per prompt. Both settings are off by default, and most prompts are better served that way.

  2. Name the entity and the fields. The search runs on what the prompt names, so a vague request returns vague facts.

  3. Ask for "real" and "current" in words. That is what separates a value to fetch from a value to make up.

  4. Verify figures before publishing. The response does not include sources, so a number that matters needs a second check.

  5. Save grounded results. The data is current as of generation, and a rerun fetches new values.