live
MODEL IDgoogle:gemini@omni-flash-1.2

Gemini Omni Flash 1.2

Google
by
Available with Zero Data Retention

Gemini Omni Flash 1.2 is Google's multimodal video model for generating, editing, and extending clips with native synchronized audio. It generates up to 15 seconds from text or a single starting image, edits source videos of up to 15 seconds with optional reference images, and keeps characters, products, and brand details consistent across reference images and videos. Output runs from 360p for quick drafts to 1080p and 4K for delivery, which suits high-volume work such as product clips, virtual try-ons, and ad variations.

Gemini Omni Flash 1.2

First and last frame

How to animate an opening frame or connect a first and last frame with Gemini Omni Flash 1.2, from building a matching pair to describing the motion between them.

Introduction

Gemini Omni Flash 1.2 can start a clip on an image you supply, or start on one image and end on another. One image in inputs.frameImages becomes the opening frame. With two, the first and last frames are fixed and the model generates the motion that connects them.

Open on the first frame and end exactly on the last frame. The room is staged in a quick stop-motion sequence while the daylight stays the same: the rug unrolls across the floor, the sofa slides in against the back wall, the coffee table lands on the rug, the plant and the floor lamp pop into place, and the two photographs appear on the wall last. Locked-off camera, single continuous shot, no cuts. Audio: a soft thud as each piece lands over light acoustic guitar music. No voiceover, no on-screen text.

The last frame is an image edit of the first, so everything but the furniture matches before the video starts. Choosing a frame pair shows how to build one.

Request shape

inputs.frameImages takes one or two images. Each item is either a plain image or an object that names its position, { "image": ..., "frame": "first" } or "last". This is the hero request, written with objects:

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:gemini@omni-flash-1.2',
  positivePrompt: 'Open on the first frame and end exactly on the last frame. The room is staged in a quick stop-motion sequence while the daylight stays the same: the rug unrolls across the floor, the sofa slides in against the back wall, the coffee table lands on the rug, the plant and the floor lamp pop into place, and the two photographs appear on the wall last. Locked-off camera, single continuous shot, no cuts. Audio: a soft thud as each piece lands over light acoustic guitar music. No voiceover, no on-screen text.',
  resolution: '1080p',
  duration: 8,
  inputs: {
    frameImages: [
      {
        image: 'https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-first.jpg',
        frame: 'first'
      },
      {
        image: 'https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-last.jpg',
        frame: 'last'
      }
    ]
  }
})
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:gemini@omni-flash-1.2",
            "positivePrompt": "Open on the first frame and end exactly on the last frame. The room is staged in a quick stop-motion sequence while the daylight stays the same: the rug unrolls across the floor, the sofa slides in against the back wall, the coffee table lands on the rug, the plant and the floor lamp pop into place, and the two photographs appear on the wall last. Locked-off camera, single continuous shot, no cuts. Audio: a soft thud as each piece lands over light acoustic guitar music. No voiceover, no on-screen text.",
            "resolution": "1080p",
            "duration": 8,
            "inputs": {
                "frameImages": [
                    {
                        "image": "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-first.jpg",
                        "frame": "first"
                    },
                    {
                        "image": "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-last.jpg",
                        "frame": "last"
                    }
                ]
            }
        })


asyncio.run(main())
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "videoInference",
      "taskUUID": "45e73ce9-3d8d-45b0-a4cb-c8139a0905f9",
      "model": "google:gemini@omni-flash-1.2",
      "positivePrompt": "Open on the first frame and end exactly on the last frame. The room is staged in a quick stop-motion sequence while the daylight stays the same: the rug unrolls across the floor, the sofa slides in against the back wall, the coffee table lands on the rug, the plant and the floor lamp pop into place, and the two photographs appear on the wall last. Locked-off camera, single continuous shot, no cuts. Audio: a soft thud as each piece lands over light acoustic guitar music. No voiceover, no on-screen text.",
      "resolution": "1080p",
      "duration": 8,
      "inputs": {
        "frameImages": [
          {
            "image": "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-first.jpg",
            "frame": "first"
          },
          {
            "image": "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-last.jpg",
            "frame": "last"
          }
        ]
      }
    }
  ]'
runware run google:gemini@omni-flash-1.2 \
  positivePrompt="Open on the first frame and end exactly on the last frame. The room is staged in a quick stop-motion sequence while the daylight stays the same: the rug unrolls across the floor, the sofa slides in against the back wall, the coffee table lands on the rug, the plant and the floor lamp pop into place, and the two photographs appear on the wall last. Locked-off camera, single continuous shot, no cuts. Audio: a soft thud as each piece lands over light acoustic guitar music. No voiceover, no on-screen text." \
  resolution=1080p \
  duration=8 \
  inputs.frameImages.0.image=https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-first.jpg \
  inputs.frameImages.0.frame=first \
  inputs.frameImages.1.image=https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-last.jpg \
  inputs.frameImages.1.frame=last
{
  "taskType": "videoInference",
  "taskUUID": "45e73ce9-3d8d-45b0-a4cb-c8139a0905f9",
  "model": "google:gemini@omni-flash-1.2",
  "positivePrompt": "Open on the first frame and end exactly on the last frame. The room is staged in a quick stop-motion sequence while the daylight stays the same: the rug unrolls across the floor, the sofa slides in against the back wall, the coffee table lands on the rug, the plant and the floor lamp pop into place, and the two photographs appear on the wall last. Locked-off camera, single continuous shot, no cuts. Audio: a soft thud as each piece lands over light acoustic guitar music. No voiceover, no on-screen text.",
  "resolution": "1080p",
  "duration": 8,
  "inputs": {
    "frameImages": [
      {
        "image": "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-first.jpg",
        "frame": "first"
      },
      {
        "image": "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-last.jpg",
        "frame": "last"
      }
    ]
  }
}
Response
[
  {
    "taskType": "videoInference",
    "taskUUID": "45e73ce9-3d8d-45b0-a4cb-c8139a0905f9",
    "videoUUID": "ebae0ec7-0863-4544-94e3-9f2fec66b842",
    "videoURL": "https://vm.runware.ai/video/os/a14d18/ws/2/vi/ebae0ec7-0863-4544-94e3-9f2fec66b842.mp4"
  }
]

With plain images, the order sets the position: the first item is the opening frame and the second the closing one. The same pair as above:

{
  "inputs": {
    "frameImages": [
      "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-first.jpg",
      "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-hero-last.jpg"
    ]
  }
}

The number of frames sets the duration ceiling: one frame allows a duration of up to 15 seconds, and two frames up to 10. Resolution and duration has the full limits.

Frames can't be mixed with other media inputs. Adding reference images, reference videos or a source video to a request with inputs.frameImages is rejected.

Set the size with resolution and the clip takes the shape of the frame: a 16:9 frame gives a horizontal clip and a 9:16 frame a vertical one. Those are the only two shapes the model renders, so generate frames in one of them. Each frame can be up to 4096 px on a side and 5 MB.

Animating a single frame

A single opening frame tells the model where the clip starts and nothing more. Everything after the first frame comes from the prompt, so describe what the subject does and what the camera does. A prompt that only asks for movement leaves both to the model.

The concrete prompt gives the subject and the camera a part each:

Use the image as the opening frame of an unboxing video., Two hands, the only hands in the shot, enter from the bottom of the frame, lift the lid straight up, and set it down beside the box, revealing a sage green, pebble-shaped wireless earbuds charging case in a black foam tray. One hand lifts the case out and opens its lid toward the camera, showing both earbuds inside., The camera pushes in slowly over the whole clip, from the medium shot to a close-up of the open case., Single continuous shot, no cuts., Audio: the soft scrape of the lid, the click of the case opening, and quiet room tone. No music, no voiceover, no on-screen text.
FrameSubject motionCamera motionShotAudio

Describe what the frame cannot show: the box is closed in the opening frame, so the prompt says what is inside it. The camera move has a start and an end, the medium shot of the frame and a close-up of the case, which spreads one push-in over the whole clip.

The request sends the frame as a plain image and runs 12 seconds, inside the 15-second ceiling for one frame:

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:gemini@omni-flash-1.2',
  positivePrompt: 'Use the image as the opening frame of an unboxing video. Two hands, the only hands in the shot, enter from the bottom of the frame, lift the lid straight up, and set it down beside the box, revealing a sage green, pebble-shaped wireless earbuds charging case in a black foam tray. One hand lifts the case out and opens its lid toward the camera, showing both earbuds inside. The camera pushes in slowly over the whole clip, from the medium shot to a close-up of the open case. Single continuous shot, no cuts. Audio: the soft scrape of the lid, the click of the case opening, and quiet room tone. No music, no voiceover, no on-screen text.',
  resolution: '1080p',
  duration: 12,
  inputs: {
    frameImages: [
      'https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-box.jpg'
    ]
  }
})
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:gemini@omni-flash-1.2",
            "positivePrompt": "Use the image as the opening frame of an unboxing video. Two hands, the only hands in the shot, enter from the bottom of the frame, lift the lid straight up, and set it down beside the box, revealing a sage green, pebble-shaped wireless earbuds charging case in a black foam tray. One hand lifts the case out and opens its lid toward the camera, showing both earbuds inside. The camera pushes in slowly over the whole clip, from the medium shot to a close-up of the open case. Single continuous shot, no cuts. Audio: the soft scrape of the lid, the click of the case opening, and quiet room tone. No music, no voiceover, no on-screen text.",
            "resolution": "1080p",
            "duration": 12,
            "inputs": {
                "frameImages": [
                    "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-box.jpg"
                ]
            }
        })


asyncio.run(main())
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "videoInference",
      "taskUUID": "cbb73a75-9ffe-48d6-b525-80ed87916e75",
      "model": "google:gemini@omni-flash-1.2",
      "positivePrompt": "Use the image as the opening frame of an unboxing video. Two hands, the only hands in the shot, enter from the bottom of the frame, lift the lid straight up, and set it down beside the box, revealing a sage green, pebble-shaped wireless earbuds charging case in a black foam tray. One hand lifts the case out and opens its lid toward the camera, showing both earbuds inside. The camera pushes in slowly over the whole clip, from the medium shot to a close-up of the open case. Single continuous shot, no cuts. Audio: the soft scrape of the lid, the click of the case opening, and quiet room tone. No music, no voiceover, no on-screen text.",
      "resolution": "1080p",
      "duration": 12,
      "inputs": {
        "frameImages": [
          "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-box.jpg"
        ]
      }
    }
  ]'
runware run google:gemini@omni-flash-1.2 \
  positivePrompt="Use the image as the opening frame of an unboxing video. Two hands, the only hands in the shot, enter from the bottom of the frame, lift the lid straight up, and set it down beside the box, revealing a sage green, pebble-shaped wireless earbuds charging case in a black foam tray. One hand lifts the case out and opens its lid toward the camera, showing both earbuds inside. The camera pushes in slowly over the whole clip, from the medium shot to a close-up of the open case. Single continuous shot, no cuts. Audio: the soft scrape of the lid, the click of the case opening, and quiet room tone. No music, no voiceover, no on-screen text." \
  resolution=1080p \
  duration=12 \
  inputs.frameImages.0=https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-box.jpg
{
  "taskType": "videoInference",
  "taskUUID": "cbb73a75-9ffe-48d6-b525-80ed87916e75",
  "model": "google:gemini@omni-flash-1.2",
  "positivePrompt": "Use the image as the opening frame of an unboxing video. Two hands, the only hands in the shot, enter from the bottom of the frame, lift the lid straight up, and set it down beside the box, revealing a sage green, pebble-shaped wireless earbuds charging case in a black foam tray. One hand lifts the case out and opens its lid toward the camera, showing both earbuds inside. The camera pushes in slowly over the whole clip, from the medium shot to a close-up of the open case. Single continuous shot, no cuts. Audio: the soft scrape of the lid, the click of the case opening, and quiet room tone. No music, no voiceover, no on-screen text.",
  "resolution": "1080p",
  "duration": 12,
  "inputs": {
    "frameImages": [
      "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-box.jpg"
    ]
  }
}
Response
[
  {
    "taskType": "videoInference",
    "taskUUID": "cbb73a75-9ffe-48d6-b525-80ed87916e75",
    "videoUUID": "a3bdfa29-2dd4-46f3-b4d0-7a15b7a8ef32",
    "videoURL": "https://vm.runware.ai/video/os/a14d18/ws/2/vi/a3bdfa29-2dd4-46f3-b4d0-7a15b7a8ef32.mp4"
  }
]

Choosing a frame pair

A pair works when the two frames differ only in what the clip should change. Keep the subject, the setting, the light and the lens the same in both, and the model only has to animate the change. Two unrelated photos leave it to invent a route between two different shots.

A reliable way to get a matching pair is to build the last frame from the first with an image edit. Send the first frame to Nano Banana 2.1 in inputs.referenceImages, name the one change, and list what stays. Request the last frame at the same size as the first, with matching width and height:

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: 'Change only her outfit to a tailored camel wool coat over a black turtleneck, black wide-leg trousers, and black leather loafers. Keep her face, hair, pose, the backdrop, the light, and the framing exactly the same.',
  width: 1536,
  height: 2752,
  inputs: {
    referenceImages: [
      'https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-outfit-first.jpg'
    ]
  }
})
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": "Change only her outfit to a tailored camel wool coat over a black turtleneck, black wide-leg trousers, and black leather loafers. Keep her face, hair, pose, the backdrop, the light, and the framing exactly the same.",
            "width": 1536,
            "height": 2752,
            "inputs": {
                "referenceImages": [
                    "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-outfit-first.jpg"
                ]
            }
        })


asyncio.run(main())
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "imageInference",
      "taskUUID": "1385b9e4-8239-4a7e-a44a-e3c553d86154",
      "model": "google:nano-banana@2.1",
      "positivePrompt": "Change only her outfit to a tailored camel wool coat over a black turtleneck, black wide-leg trousers, and black leather loafers. Keep her face, hair, pose, the backdrop, the light, and the framing exactly the same.",
      "width": 1536,
      "height": 2752,
      "inputs": {
        "referenceImages": [
          "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-outfit-first.jpg"
        ]
      }
    }
  ]'
runware run google:nano-banana@2.1 \
  positivePrompt="Change only her outfit to a tailored camel wool coat over a black turtleneck, black wide-leg trousers, and black leather loafers. Keep her face, hair, pose, the backdrop, the light, and the framing exactly the same." \
  width=1536 \
  height=2752 \
  inputs.referenceImages.0=https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-outfit-first.jpg
{
  "taskType": "imageInference",
  "taskUUID": "1385b9e4-8239-4a7e-a44a-e3c553d86154",
  "model": "google:nano-banana@2.1",
  "positivePrompt": "Change only her outfit to a tailored camel wool coat over a black turtleneck, black wide-leg trousers, and black leather loafers. Keep her face, hair, pose, the backdrop, the light, and the framing exactly the same.",
  "width": 1536,
  "height": 2752,
  "inputs": {
    "referenceImages": [
      "https://assets.runware.ai/guides/google-gemini-omni-flash-1-2/first-and-last-frame/source-outfit-first.jpg"
    ]
  }
}
Response
[
  {
    "taskType": "imageInference",
    "taskUUID": "1385b9e4-8239-4a7e-a44a-e3c553d86154",
    "imageUUID": "ec77a3a6-19ed-4b94-8c97-9b8d871f0029",
    "imageURL": "https://im.runware.ai/image/os/a14d18/ws/2/ii/ec77a3a6-19ed-4b94-8c97-9b8d871f0029.jpg"
  }
]

An outfit transition for a fashion reel. Open on the first frame and end on the last frame. She spins once on the spot, and as her back turns to the camera the casual outfit is replaced by the tailored one in a single instant, hidden in the motion blur of the spin, with no dissolve and no second figure, so she finishes the turn in the new look and settles back into the same pose. Static camera, single continuous shot, no cuts. Audio: a whoosh on the spin over an upbeat pop beat. No dialogue, no on-screen text.

Both frames share one camera position, so the video prompt locks the camera. It never describes either outfit, since the frames carry the look, and spends its words on when the switch happens: as her back turns to the camera, which hides the change inside the spin.

Describing the transition

The two frames fix the ends of the clip, and the prompt sets the route between them: the order things change in, and how each one moves. Write it as a sequence.

A UI animation for an app launch video. Open on the loading screen in the first frame and end on the finished page in the last frame. The layout never moves. The placeholders resolve one at a time from top to bottom: the shoe photo fades in inside the large block with a slight zoom that settles, the name "Trail Runner" types in letter by letter, the price "$129" slides up into place, and the button fills with black as its label "Add to cart" fades in with a small bounce. Flat 2D motion graphics, static camera, single continuous shot. Audio: a soft click as each element lands over a light electronic beat. No voiceover.

A UI animation for an app launch video., Open on the loading screen in the first frame and end on the finished page in the last frame., The layout never moves., The placeholders resolve one at a time from top to bottom:, the shoe photo fades in inside the large block with a slight zoom that settles, the name "Trail Runner" types in letter by letter, the price "$129" slides up into place, and the button fills with black as its label "Add to cart" fades in with a small bounce., Flat 2D motion graphics, static camera, single continuous shot., Audio: a soft click as each element lands over a light electronic beat. No voiceover.
PurposeFramesWhat holdsOrderMotionCameraAudio

"One at a time from top to bottom" gives the four changes an order, and "the layout never moves" holds everything the two frames share in place. Quote on-screen words exactly as the last frame shows them, so the text the clip types in matches the text it ends on.

Tips

  1. Describe motion, not the scene. The frames already show the scene, so spend the prompt on what moves and how.

  2. Give the camera one move with a start and an end. When both frames come from one edit and share a framing, lock the camera instead.

  3. Ask for a single continuous shot. The model often cuts between several shots by default, and "single continuous shot, no cuts" keeps the clip on one path from frame to frame.

  4. Build the last frame from the first. An image edit with one change keeps everything else identical in both frames.

  5. Put the transition in order. Say what changes first and what lands last.

  6. Match the frames to the clip shape. Generate them at 16:9 or 9:16, since the clip takes the shape of the frame.