Google shipped two generative-media models to the Gemini API on June 30, 2026, and the headline isn't the quality — it's the price. Nano Banana 2 Lite makes an image for $0.034 per thousand, about $0.000034 each. Gemini Omni Flash makes video for ten cents a second. Those numbers are low enough to change where the generation happens: instead of pre-baking a fixed library of assets, you can call the model per request, inside the product, for each user.
Here's what the two models are, the exact code to call them, and the one place the cheap tier is the wrong tool.
The two models, in one screen#
| Nano Banana 2 Lite | Gemini Omni Flash | |
|---|---|---|
| Model ID | gemini-3.1-flash-lite-image | gemini-omni-flash-preview |
| Makes | images | video (with native audio) |
| Takes | text, image (to edit) | text, image, video |
| Price | $0.034 / 1,000 images | $0.10 / second |
| Unit | ~$0.000034 / image | $1.00 / 10-second clip |
| Speed | ~4 seconds / image | quality-first |
| Max length | — | ~10 seconds / clip |
| Status | GA | public preview |
Both are reachable from Google AI Studio, the Gemini API, and the Enterprise Agent Platform, and both stamp a SynthID watermark and C2PA content credentials by default — hold that thought, it matters at the end.
Generate an image (the copy-paste path)#
Nano Banana 2 Lite is a single generate_content call. The trick that trips people up: you have to ask for the IMAGE modality explicitly, and the picture comes back as raw bytes on part.inline_data.data, not as a URL.
from google import genai
from google.genai import types
client = genai.Client() # reads GEMINI_API_KEY from the environment
resp = client.models.generate_content(
model="gemini-3.1-flash-lite-image",
contents="A clean product hero shot of a matte-black water bottle "
"on a concrete surface, soft studio light, no text.",
config=types.GenerateContentConfig(response_modalities=["IMAGE"]),
)
for part in resp.candidates[0].content.parts:
if part.inline_data: # the image bytes
with open("hero.png", "wb") as f:
f.write(part.inline_data.data)
elif part.text: # any model commentary
print(part.text)
That's the whole loop: prompt in, bytes out, ~4 seconds later. To edit an image instead of making one from scratch, pass the existing image in contents next to a text instruction:
from PIL import Image
resp = client.models.generate_content(
model="gemini-3.1-flash-lite-image",
contents=[
Image.open("hero.png"),
"Same bottle, but change the surface to pale oak wood.",
],
config=types.GenerateContentConfig(response_modalities=["IMAGE"]),
)
Google ships an official Colab for the image path if you want a runnable starting point.
Generate video#
Omni Flash uses the same multimodal call shape, swapping the model to gemini-omni-flash-preview and asking for a video modality. It takes text, image, and video inputs and edits by natural-language instruction ("make the camera pan left", "make it dusk"), returning a clip up to about ten seconds with native audio. Because it's a public preview with an evolving parameter surface, drive it from Google's Omni Flash quickstart rather than hard-coding options that may still move.
The cost math a founder actually cares about#
The reason to care isn't a single image — it's what per-unit pricing does to product decisions.
- Images: $0.034 / 1,000 → one million generated images is about $34. Personalized OG cards for every shared link, a fresh thumbnail per document, a mockup per product variant — all now rounding error.
- Video: $0.10 / second → a six-second clip is $0.60, a ten-second one $1.00. A short generated demo or social cut per campaign is a line item, not a project.
When generation costs less than the CDN bandwidth to serve the result, "generate on demand" beats "pre-render a library" for anything that benefits from being personalized or fresh. Once you're calling it per request, the plumbing — not the model — becomes the constraint: cache by prompt hash, fall back across providers, and cap spend so a per-request pipeline can't run away with your invoice.
Where the cheap tier is the wrong call#
Three cases, and they're specific:
- Brand-critical hero art. Good-enough at scale is the whole point of this tier; pixel-perfect, on-brand key art still wants a human in the loop or a heavier model. Use Lite for the thousand disposable images, not the one that goes on the homepage.
- Video that needs an SLA. Omni Flash is a public preview. Prototype freely, but don't put a preview model on a critical path you can't degrade gracefully.
- When you can't disclose AI generation. Every output carries a SynthID watermark and C2PA credentials by default. That's a feature for provenance and a legal nicety for disclosure — but it means the media is detectable as generated. Design your copy and your compliance around that instead of assuming the output is anonymous.
The short version: Google made in-product media generation cheap enough to stop treating it as a batch pipeline. Wire the image call above into the one place your product shows a picture it currently ships static, and watch what per-request generation does to it.



