What You Build
You build a two-model image-to-video pipeline. Nano Banana 2 Lite generates a still image in about four seconds, you hand that image to Gemini Omni Flash, and Omni Flash animates it into a 720p clip you can then edit in plain language, up to three times. Both models shipped to developers on June 30, 2026, and both run through the same Interactions API, which is what makes the hand-off clean.
The mental model: NB2 Lite is the fast draft artist, Omni Flash is the animator and editor. You are not choosing between them; you run them back to back. The launch blog is blunt about it: the real magic happens when you chain these models together.
Pipeline Step 1 gemini-3.1-flash-lite-image -> still image (GA, ~4s, ~$0.0336 / 1K image) Step 2 gemini-omni-flash-preview -> 720p video (preview, ~$0.10 / sec, 3-10s) Step 3 gemini-omni-flash-preview -> edit (plain language, up to 3x) Transport Interactions API POST /v1beta/interactions Session previous_interaction_id (server replays history; no re-upload)
Combine the new Nano Banana 2 Lite and Gemini Omni Flash using the Interactions API. Generate an image with NanoBanana and then animate it with Omni Flash.
— João Carrasqueira (@jocarrasqueira)June 30, 2026
This post focuses on the chain itself. For the full Omni Flash API surface, task types, streaming, background jobs, and URI delivery, read the Gemini Omni Flash developer guide.
Why NB2 Lite Generates and Omni Flash Animates
Use NB2 Lite for the still because it is fast, cheap, and has good prompt adherence and legible text, but it is explicitly not an editor. The docs say NB2 Lite is not optimized for multiple reference inputs or multi-turn sequential editing. Omni Flash is the opposite: it is built for animation and conversational editing but it is not the cheapest way to create a first frame. So you split the job.
If you need heavy multi-reference character consistency in the still itself, multiple characters or 4K output, reach for full NB2 (gemini-3.1-flash-image) instead of Lite. Here is the family so you pick the right generator before you animate.
| Model | Model ID | Role |
|---|---|---|
| NB2 Lite | gemini-3.1-flash-lite-image | Speed. ~4s per image, ~$0.0336 / 1K. One-shot generator, GA. |
| NB2 | gemini-3.1-flash-image | Generalist. Up to 4K, up to 4 characters / 10 objects. |
| NB Pro | gemini-3-pro-image | Maximum control. |
| NB1 | gemini-2.5-flash-image | Legacy. |
Pattern A: The Full Pipeline Code
Pattern A is the pattern the launch blog literally describes, and the one I recommend shipping: generate the still with NB2 Lite, read its base64 image out, and pass that image as an input part to Omni Flash with task set to image_to_video. It is the most robust option because every hand-off is explicit and testable.
import base64
from google import genai
client = genai.Client()
# STEP 1 - NB2 Lite generates the still (GA, ~4s, ~$0.0336 / 1K image)
img = client.interactions.create(
model="gemini-3.1-flash-lite-image",
input="Studio product shot: matte-black ceramic mug on marble, soft window light, photorealistic."
)
image_b64 = img.output_image.data
# STEP 2 - Omni Flash animates it. store=True (default) keeps the clip editable.
vid = client.interactions.create(
model="gemini-omni-flash-preview",
input=[
{"type": "image", "data": image_b64, "mime_type": "image/png"},
{"type": "text", "text": "Slow cinematic push-in on the mug, steam rising, shallow depth of field. Single continuous shot."}
],
generation_config={"video_config": {"task": "image_to_video"}},
)
with open("promo_v1.mp4", "wb") as f:
f.write(base64.b64decode(vid.output_video.data))
# STEP 3 - conversational edit, no re-upload (chain by previous_interaction_id)
edit = client.interactions.create(
model="gemini-omni-flash-preview",
previous_interaction_id=vid.id,
input="Change the lighting to warm golden hour. Keep everything else the same."
)Two things to notice. First, store defaults to true, and you want it true here because that is what makes the follow-up edit in step 3 possible. Second, set generation_config.video_config.task to image_to_video explicitly so Omni does not have to guess the task from your inputs.
Here are the same first two steps in JavaScript. The config keys go camelCase in the JS SDK (generationConfig, videoConfig), which is an easy way to lose an afternoon.
import { GoogleGenAI } from '@google/genai';
import * as fs from 'fs';
const ai = new GoogleGenAI({});
// STEP 1 - NB2 Lite still
const img = await ai.interactions.create({
model: 'gemini-3.1-flash-lite-image',
input: 'Studio product shot: matte-black ceramic mug on marble, soft window light, photorealistic.',
});
// STEP 2 - Omni Flash animates it (note camelCase config keys in JS)
const vid = await ai.interactions.create({
model: 'gemini-omni-flash-preview',
input: [
{ type: 'image', data: img.output_image.data, mime_type: 'image/png' },
{ type: 'text', text: 'Slow cinematic push-in on the mug, steam rising. Single continuous shot.' },
],
generationConfig: { videoConfig: { task: 'image_to_video' } },
});
if (vid.output_video?.data) {
fs.writeFileSync('promo_v1.mp4', Buffer.from(vid.output_video.data, 'base64'));
}The 3-Edit Conversational Chain
Once Omni Flash has a clip, you edit it in plain English by chaining calls with previous_interaction_id. The server replays the session history, so you never re-upload the video. The launch blog caps this at up to three sequential edits per session, and that number is official, not folklore. Below is the doc example: one generate call plus three edits.
import base64
from google import genai
client = genai.Client()
res1 = client.interactions.create(
model="gemini-omni-flash-preview",
input="A woman playing violin outdoors."
)
res2 = client.interactions.create(
model="gemini-omni-flash-preview",
previous_interaction_id=res1.id,
input="Make the violin invisible."
)
res3 = client.interactions.create(
model="gemini-omni-flash-preview",
previous_interaction_id=res2.id,
input="Change the camera angle to be over the shoulder. Keep everything else the same."
)
res4 = client.interactions.create(
model="gemini-omni-flash-preview",
previous_interaction_id=res3.id,
input="Make it look like Japanese anime. Keep everything else the same."
)
with open("final.mp4", "wb") as f:
f.write(base64.b64decode(res4.output_video.data))Two rules from the docs make the edits behave. Keep each edit prompt short, and append the phrase Keep everything else the same so the model preserves what you did not mention. Also remember that previous_interaction_id carries only the conversation history; tools, system_instruction, and generation_config are not inherited, so re-specify them each turn.
One warning belongs here, not just in the cost section: every edit re-renders and re-bills the full clip. Three ten-second edits is thirty billed seconds, not three free tweaks.
Pattern B: One Server-Side Session
Pattern B is the elegant version. Instead of reading the image bytes out of NB2 Lite and passing them back in, you keep one session: point Omni Flash at the image interaction with previous_interaction_id=img.id and let the server carry the frame forward.
# Pattern B - one server-side session; Omni continues from the NB2 Lite image.
# Documented in principle (mixing interactions), but no explicit official
# image-to-Omni sample yet. Verify against your account before depending on it.
vid = client.interactions.create(
model="gemini-omni-flash-preview",
previous_interaction_id=img.id, # continue the SAME session that made the image
input="Animate the previous product image: slow cinematic push-in, steam rising. Single continuous shot.",
generation_config={"video_config": {"task": "image_to_video"}},
)Be honest about its status. The Interactions mixing best practice does allow mixing models in one session, so Pattern B is documented in principle. But there is no explicit official image-to-Omni sample for it. Treat Pattern A as the tested path and Pattern B as the clean alternative to verify against your own account before you depend on it. Both require store=true, which is the default.
The Official Demo Apps
Google shipped three remixable AI Studio applets that are exactly this pipeline, so you can read working code instead of guessing. The headline one is Omni Product Studio.
Introducing Omni Product Studio. 1. Upload a product photo. 2. Nano Banana 2 Lite generates brand-accurate assets. 3. Gemini Omni Flash renders them into video.
— Google (@Google)June 30, 2026
| Applet | Pipeline | Link |
|---|---|---|
| Omni Product Studio | Product photo → NB2 Lite brand assets → Omni video | Demo |
| Anywhere | Photo → NB2 Lite drops you at landmarks → Omni animates | Open in AI Studio |
| Space Lift | Room photo → NB2 Lite redesign → Omni walkthrough | Open in AI Studio |
All three are the same generate-then-animate chain with a different prompt template. If you want an agent such as Claude Code or Antigravity to drive this pipeline instead of a hand-written script, Google ships a gemini-omni-flash-api skill plus a Gemini Docs MCP server; see our roundup of the best MCP servers for Claude Code.
Pipeline Cost: The ~$9.34 Reel
A full 60-second product reel built this way costs about $9.34, and the video seconds are essentially the entire bill. The images are a rounding error.
Nano Banana 2 Lite is extremely fast (<4s image) & cheap ($0.034/1K image). Omni Flash is SOTA at video editing at $0.10/sec, same as Veo 3.1 Fast!
— Logan Kilpatrick (@OfficialLoganK)June 30, 2026
| Model | Input | Output | Practical rate |
|---|---|---|---|
| Omni Flash (gemini-omni-flash-preview) | $1.50 / 1M | $17.50 / 1M video | ~$0.10 / sec of 720p video |
| NB2 Lite (gemini-3.1-flash-lite-image) | $0.25 / 1M | $30 / 1M images | ~$0.0336 / 1K image (batch $0.0168) |
60-second product reel 10 candidate stills, NB2 Lite (1K) 10 x $0.0336 = $0.336 6 hero clips x 10s = 60s Omni video 60 x $0.10 = $6.00 3 conversational edits x 10s = 30s 30 x $0.10 = $3.00 input tokens < $0.10 ------------------------------------------------------------ total ~= $9.34 formula: cost ~= (N_images x $0.0336) + (M_video_seconds x $0.10)
Notice the edits sit inside the video-seconds term, because each edit re-bills its full duration. Also note that batch image pricing ($0.0168 per 1K) only applies through the Batch API on generateContent, not inside the Interactions API, so interactive pipelines pay the standard $0.0336 image rate.
Gotchas and Limitations
Four things break this pipeline quietly, in rough order of how often they bite:
store=trueis mandatory. It is the default, but if you setstore=falsefor a fast one-shot, you silently disableprevious_interaction_id, which kills both Pattern B and every edit.store=falseis also incompatible withbackground=true.- Every edit re-bills the full clip duration. Budget three edits as three renders, not three tweaks.
- Editing uploaded videos is regionally blocked in the EEA, Switzerland, the UK, and some US states. The symptom is nasty because it is not an error: the call completes fast with empty output. Editing video that Omni Flash generated is fine everywhere; only user-uploaded media is blocked.
- NB2 Lite is not an editor. It is a one-shot generator, not optimized for multiple reference inputs or multi-turn editing. Do consistency and editing in Omni Flash or full NB2, never in Lite.
# Symptom of the EEA / UK / CH / some-US uploaded-video edit block:
# the call SUCCEEDS but returns nothing.
{
"status": "completed",
"usage": { "total_output_tokens": 0 },
"steps": [ /* no video content */ ]
}
# Editing video that Omni Flash GENERATED is fine everywhere.A few hard limits worth pinning: Omni output is 720p only (ignore any 4K claim), clips are 3 to 10 seconds (longer coming soon), English is fully supported and other languages are not evaluated, and on the reference side, video references over 3s are accepted but not processed, there is no audio-reference input, and there is no multi-video reasoning. On SDK versions, Interactions needs google-genai >= 1.55.0 (Python) or @google/genai >= 1.33.0 (JS); the Omni agent skill recommends google-genai >= 2.10.0. If client.interactions is missing, upgrade. Omni Flash itself is still public preview, so its schemas can shift.
If you want a text-and-reasoning Flash model rather than these media models, that is a different product; see the Gemini 3.5 Flash developer guide.
FAQ
What does the Nano Banana 2 Lite to Omni Flash pipeline do?
It generates a still image with Nano Banana 2 Lite (gemini-3.1-flash-lite-image) in about four seconds, passes that image to Gemini Omni Flash (gemini-omni-flash-preview) as an image_to_video input, and produces a 720p clip you can then edit in plain language. Both models run through the Interactions API.
Why use two models instead of Omni Flash alone?
Nano Banana 2 Lite is a fast, cheap one-shot image generator (about $0.0336 per 1K image), but Google's docs say it is not optimized for multiple reference inputs or multi-turn editing. Omni Flash is built for animation and conversational editing. Use Lite for the first frame and Omni Flash for motion and edits.
How many edits can I stack in one session?
Up to three sequential edits per session, chained with previous_interaction_id. That cap is stated in Google's launch blog. Every edit re-renders and re-bills the full clip duration, so three ten-second edits cost thirty billed seconds.
How much does a 60-second product reel cost?
About $9.34: roughly $0.336 for ten NB2 Lite stills, $6.00 for 60 seconds of Omni video, $3.00 for three ten-second edits, and under $0.10 of input tokens. The formula is cost = (N_images x $0.0336) + (M_video_seconds x $0.10).
Do I need store=true?
Yes. store defaults to true and it is mandatory for the edit chain. Setting store=false makes the clip a stateless one-shot: it disables previous_interaction_id editing and is incompatible with background=true.
Can I edit a video I uploaded myself?
Editing uploaded videos is blocked in the EEA, Switzerland, the UK, and some US states. The symptom is a fast completion with empty output (total_output_tokens: 0). Editing video that Omni Flash generated is fine everywhere.
Which SDK version do I need?
Interactions needs google-genai >= 1.55.0 (Python) or @google/genai >= 1.33.0 (JavaScript). The official Omni Flash agent skill recommends google-genai >= 2.10.0. If client.interactions is missing, upgrade.
Glossary
- Interactions API — Google's stateful endpoint (
POST /v1beta/interactions). Every Omni Flash and NB2 Lite call in this post runs through it. previous_interaction_id— the field that continues a session; the server replays history so you never re-upload the image or video.store— whether an interaction is retained (default true). Paid tier keeps stored interactions 55 days, free tier 1 day. Must be true to edit.image_to_video/task— thevideo_config.taskvalue that tells Omni to animate an input image rather than guess.- Nano Banana 2 Lite —
gemini-3.1-flash-lite-image, the fast GA image generator (~4s, ~$0.0336 per 1K). - Gemini Omni Flash —
gemini-omni-flash-preview, the public-preview video model (720p, 3 to 10s, ~$0.10 per sec). - reference_to_video — the Omni task that uses images as style or subject references via
<FIRST_FRAME>and<IMAGE_REF_N>tags in the prompt. - SynthID — the invisible, detectable watermark on every Omni output.
Verdict
Ship Pattern A. It is the path Google documents end to end, it costs about $9.34 for a full reel, and the only things that will surprise you are store=false silently breaking edits and the EEA, UK, and Switzerland upload-edit block. NB2 Lite for the frame, Omni Flash for motion and edits, previous_interaction_id to glue them, and store left at its default.
Ship checklist 1. NB2 Lite generates the still gemini-3.1-flash-lite-image 2. Pass image bytes to Omni, task = image_to_video 3. Leave store = true (keeps the clip editable) 4. Chain edits with previous_interaction_id (max 3; keep prompts short) 5. Budget video seconds, not images cost ~= (N x $0.0336)+(M x $0.10) 6. No user-uploaded video edits in EEA / UK / CH / some US states 7. Omni is preview: pin the SDK google-genai >= 1.55.0
Sources
All code and numbers above come from official Google announcements and developer docs published around the June 30, 2026 launch.
Official announcements
- Google launch blog: Start building with Nano Banana 2 Lite and Gemini Omni Flash
- Joao Carrasqueira (Google): the NB2 Lite to Omni Flash chain in one sentence
- @Google: Omni Product Studio applet demo
- Logan Kilpatrick: launch pricing and speed one-liner
- Google DeepMind: Gemini Omni model page and benchmarks
Developer docs
- Gemini API docs: Omni Flash guide (all code)
- Gemini API reference: Interactions API
- Gemini API docs: Interactions overview
- Gemini API docs: image generation (Nano Banana 2 Lite)
- Gemini API docs: pricing
- Gemini API docs: Omni Flash model page (720p spec)
- GitHub: google-gemini/gemini-skills (gemini-omni-flash-api skill)
Get the Ultimate Antigravity Cheat Sheet
Join 5,000+ developers and get our exclusive PDF guide to mastering Gemini 3 shortcuts and agent workflows.
Get the latest on AI, LLMs & developer tools
New MCP servers, model updates, and guides like this one — delivered weekly.
