Google Antigravity  ·  Live Stage Keynote google-genai

7 Modalities.
One Pipeline.

Video, speech, text, embeddings, image, spatial vision, and music — orchestrated by one coding agent.

00  /  The Premiseomni_source.mp4 + advertiser_espresso_can.png

One creator clip. One product photo.

Turn a raw creator video and a static product PNG into a context-matched CTV ad pod stream.

Input 1 · Creator Stream (omni_source.mp4) 40s · 16:9 HD · Press V to Play
Input 2 · Static Product Photo & Brief Brox Coffee Roasters
Keyframe at 00:06
Keyframe @ 00:06Brox Cup
Brox Coffee Can
Product PNGCold Brew
00  /  Architecture.agents/skills/

Skills kill SDK hallucinations.

Checking .agents/skills/ into the repo gives the agent verified scripts and current google-genai model IDs.

01 gemini-vision-video gemini-3.8-flash
02 gemini-stt gemini-3.5-transcribe
03 gemini-text gemini-4-argon + embedding-2
04 gemini-image gemini-nano-banana-2.1
05 gemini-vision-image gemini-3.8-flash
06 gemini-omni gemini-omni-1.1-flash-preview
07 gemini-38-tts gemini-3.8-flash-tts
08 generate-music lyria-3.5 / lyria-3-clip
01 Video· 02 STT· 03 Embeddings· 04 Image Gen· 05 Spatial Vision· 06 Video Gen· 07 TTS + Music

Find the ad break. Tag every brand.

Why: Pinpoint natural SCTE-35 splice timestamps and log every brand & visual swap in a single pass.

gemini-3.8-flash
Stage Prompt “Find the best ad break in our video”
Source Video Stream · Splice @ 00:26 omni_source.mp4
12 Events · GARM Low Risk
00:00–00:07Blue Bottle → Starbucks → BROX COFFEE cup swap
00:07–00:08Coffee cup morphs into Google TPU hardware chip
00:08–00:15Sweater → NHL jersey → Afro → Ostrich beside chair
00:15–00:25Studio dissolves to beach → Waterspout tornado
00:26 SPLICESCTE-35 Ad Break · Returns to wood-slat studio
from pydantic import BaseModel
from google import genai
from google.genai import types

class VideoEvent(BaseModel):
    start_time: str  # MM:SS
    end_time: str    # MM:SS
    event: str
    visual_details: str

client = genai.Client()
video_bytes = open("demo/assets/00_source/omni_source.mp4", "rb").read()

response = client.models.generate_content(
    model="gemini-3.8-flash",
    contents=[
        types.Part.from_bytes(data=video_bytes, mime_type="video/mp4"),
        "Extract every visual edit, brand logo, and natural ad-break timestamp (MM:SS).",
    ],
    config=types.GenerateContentConfig(
        response_mime_type="application/json",
        response_schema=list[VideoEvent],
    ),
)
01 Video· 02 STT· 03 Embeddings· 04 Image Gen· 05 Spatial Vision· 06 Video Gen· 07 TTS + Music

Words, timestamps, and vocal tone.

Why: Extract verbatim transcripts and SDH captions tagged with vocal delivery and emotion.

gemini-3.5-transcribe + gemini-3.8-flash
Stage Prompt “Transcribe the audio with speaker tone”
Extracted Dialogue Track · omni_audio.mp3 Press V to Play Audio
Creator Monologue (40s)16kHz MP3
Studio Monologue Keyframe
sdh_diarized_captions.json
00:00 · enthus.“I can change logos, I can change text, I can change the object into something else entirely.”
00:09 · excited“I can change people, I can change myself, I can add other people into the scene…”
00:15 · express.“…and I can make it something very peaceful, relaxing,”
00:23 · dramatic“or I can make it something really intense and scary.”
00:26 · enthus.“It’s going to have a huge impact on creativity and Hollywood…”
from pydantic import BaseModel
from google import genai
from google.genai import types

class CaptionSegment(BaseModel):
    speaker: str
    start_time: str  # MM:SS
    end_time: str    # MM:SS
    text: str
    tone: str

client = genai.Client()
audio_bytes = open("demo/assets/00_source/omni_audio.mp3", "rb").read()

verbatim = client.models.generate_content(
    model="gemini-3.5-transcribe",
    contents=[types.Part.from_bytes(data=audio_bytes, mime_type="audio/mp3"), "Transcribe verbatim."],
)

sdh = client.models.generate_content(
    model="gemini-3.8-flash",
    contents=[types.Part.from_bytes(data=audio_bytes, mime_type="audio/mp3"), "Transcribe with MM:SS and tone."],
    config=types.GenerateContentConfig(
        response_mime_type="application/json",
        response_schema=list[CaptionSegment],
    ),
)
01 Video· 02 STT· 03 Embeddings· 04 Image Gen· 05 Spatial Vision· 06 Video Gen· 07 TTS + Music

Match the clip to the advertiser brief.

Why: Score semantic vector similarity and synthesize a schema-locked JSON ad insertion plan.

gemini-4-argon + gemini-embedding-2
Stage Prompt “Match the video to our advertiser brief”
Contextual Vector Match Cosine Similarity: 0.7591
Scene Keyframe
Scene @ 00:06Brox Coffee Cup
Advertiser Can
Matched RFPcamp_brox_coffee_2026
ad_pod_decision.json
CampaignBrox Coffee Roasters (camp_brox_coffee_2026)
Similarity0.7591  ·  Brand Safety Verified (GARM Low)
SCTE-35 Cut00:26 (post-tornado return to studio)
Video BriefComposite Brox Cold Brew can onto wood-slat studio desk next to Shure SM7B mic
VO Script“<sigh> Late nights pushing the boundaries of AI… Keep the breakthroughs coming with Brox.”
from pydantic import BaseModel
from google import genai
from google.genai import types

class AdDecision(BaseModel):
    matched_campaign_id: str
    brand: str
    scte35_insertion_point_mm_ss: str
    dynamic_ctv_video_prompt: str
    dynamic_voiceover_script: str

client = genai.Client()

emb = client.models.embed_content(
    model="gemini-embedding-2",
    contents="Host holds a BROX COFFEE cup in a wood-slat podcast studio.",
)

decision = client.models.generate_content(
    model="gemini-4-argon",
    contents="Match this clip to the Brox Coffee brief and output a CTV ad plan.",
    config=types.GenerateContentConfig(
        response_mime_type="application/json",
        response_schema=AdDecision,
    ),
)
01 Video· 02 STT· 03 Embeddings· 04 Image Gen· 05 Spatial Vision· 06 Video Gen· 07 TTS + Music

One frame. Two cohort thumbnails.

Why: Conversationally restyle lighting, background, and typography while locking character & product identity.

gemini-nano-banana-2.1
Stage Prompt “Create two A/B thumbnails from our keyframe”
Generated A/B 16:9 CTV Hero Artwork Identity & Cup Preserved
Cohort A Thriller Thumbnail
Cohort A · Sci-Fi / TechTHE OMNI SHIFT
Cohort B Creator Thumbnail
Cohort B · Creator / PodBROX PODCAST
04_image_gen_and_edit.py
Input Frameraw_keyframe.png @ 00:06
LockedHost face, glasses, expression, and BROX COFFEE cup
Cohort ACyan rim light, stormy ocean vortex window, bold THE OMNI SHIFT title
Cohort BWarm golden-hour wood slats, rising steam, bold BROX PODCAST title
from google import genai
from google.genai import types

client = genai.Client()
keyframe_bytes = open("demo/assets/04_image_gen/raw_keyframe.png", "rb").read()

response = client.models.generate_content(
    model="gemini-nano-banana-2.1",
    contents=[
        types.Part.from_bytes(data=keyframe_bytes, mime_type="image/png"),
        "Transform this frame into a high-contrast 16:9 CTV thumbnail: keep the host and "
        "BROX COFFEE cup identical, add cyan rim lighting, a stormy ocean vortex outside "
        "a studio window behind him, and bold white text 'THE OMNI SHIFT' in the upper right.",
    ],
    config=types.GenerateContentConfig(
        response_modalities=["TEXT", "IMAGE"],
    ),
)
01 Video· 02 STT· 03 Embeddings· 04 Image Gen· 05 Spatial Vision· 06 Video Gen· 07 TTS + Music

Pause-ad safe zones.

Why: Detect 2D bounding boxes ([ymin, xmin, ymax, xmax]) so CTV overlays never collide with faces or props.

gemini-3.8-flash
Stage Prompt “Find safe zones for a pause ad”
2D Bounding Boxes + Computed Safe Zone pause_ad_annotated.png
Pause Ad Safe Zones Annotated
safe_zones.json
face[153, 412, 631, 622]  · Protected
coffee cup[343, 85, 650, 212]   · Protected
microphone[507, 531, 792, 676]  · Protected
plant[12, 0, 992, 260]     · Protected
SAFE ZONE[120, 690, 880, 965]  · Right wood-slat wall
from pydantic import BaseModel
from google import genai
from google.genai import types

class BoundingBox(BaseModel):
    label: str
    box_2d: list[int]  # [ymin, xmin, ymax, xmax] normalized 0..1000

client = genai.Client()
keyframe_bytes = open("demo/assets/04_image_gen/raw_keyframe.png", "rb").read()

response = client.models.generate_content(
    model="gemini-3.8-flash",
    contents=[
        types.Part.from_bytes(data=keyframe_bytes, mime_type="image/png"),
        "Detect host face, BROX COFFEE cup, podcast microphone, and tropical plant. "
        "Return 2D bounding boxes as [ymin, xmin, ymax, xmax] scaled 0 to 1000.",
    ],
    config=types.GenerateContentConfig(
        response_mime_type="application/json",
        response_schema=list[BoundingBox],
    ),
)
01 Video· 02 STT· 03 Embeddings· 04 Image Gen· 05 Spatial Vision· 06 Video Gen· 07 TTS + Music

Product photo to studio-matched video ad.

Why: Animate a static product PNG into 16:9 video, then conversationally edit the scene to match the show’s set.

gemini-omni-1.1-flash-preview
Stage Prompt “Turn the coffee photo into a studio video ad”
V1 Base Spot vs. V2 Context-Matched Studio Spot Press V to Play
V1 · Image-to-VideoBase Concrete Set
V2 · Conversational EditWood-Slat Studio
06_video_gen_and_edit.py
Turn 1 Inputadvertiser_espresso_can.png + rotation & rising steam prompt
Turn 1 IDChBhYWVhYTAyN2E0Y2I2ODhiEAgaAmNkKgRtYWlu
Turn 2 Edit“Place the BROX COFFEE cup and can in a modern wood-slat podcast studio next to a Shure SM7B mic.”
Turn 2 IDChAyYjExMjYxNDc4ZWVjZDdkEAgaAjc1KgRtYWlu
import base64
from google import genai

client = genai.Client(vertexai=True, project="ckbrox13", location="global")
img_b64 = base64.b64encode(open("demo/assets/00_source/advertiser_espresso_can.png", "rb").read()).decode()

# 1. Create 16:9 CTV Video Ad from Static Product Photo
v1 = client.interactions.create(
    model="gemini-omni-1.1-flash-preview",
    input=[
        {"type": "image", "data": img_b64, "mime_type": "image/png"},
        {"type": "text", "text": "BROX COFFEE cup and cold-brew can rotating slowly with rising steam."},
    ],
    response_format={"type": "video", "aspect_ratio": "16:9", "resolution": "720p"},
)

# 2. Conversationally Edit Video Background into the Host's Wood-Slat Studio
v2 = client.interactions.create(
    model="gemini-omni-1.1-flash-preview",
    previous_interaction_id=v1.id,
    input="Place the BROX COFFEE cup and can in a modern wood-slat podcast studio next to a Shure SM7B mic.",
    response_format={"type": "video", "aspect_ratio": "16:9", "resolution": "720p"},
)
01 Video· 02 STT· 03 Embeddings· 04 Image Gen· 05 Spatial Vision· 06 Video Gen· 07 TTS + Music

Voiceover, backing beat, and stream splice.

Why: Synthesize expressive voiceover with acting cues, score custom backing music, sidechain-duck, and splice at 00:25.

gemini-3.8-flash-tts + lyria-3-clip-preview
Stage Prompt “Add voiceover and music and splice the ad in”
Final Broadcast Master Stream (Spliced @ 00:25) Press V to Play Final Stream
07_tts_and_music.py
1 · Expressive Voiceover (Aoede · <sigh> cue)gemini-3.8-flash-tts
2 · Sidechain-Ducked Master (Voice + Lyria 114 BPM)lyria-3-clip-preview
Acting Cue“…only one roast keeps up. <sigh> Brox Coffee.”
from google import genai
from google.genai import types

client = genai.Client(vertexai=True, project="ckbrox13", location="global")

# 1. Expressive TTS Voiceover with Acting Cues (gemini-3.8-flash-tts)
tts_res = client.models.generate_content(
    model="gemini-3.8-flash-tts",
    contents=(
        "From Blue Bottle to Starbucks to Brox Coffee—when you are building the future of AI, "
        "only one roast keeps up. <sigh> Brox Coffee. Freshly roasted in San Francisco and New York."
    ),
    config=types.GenerateContentConfig(
        response_modalities=["AUDIO"],
        speech_config={"voice_config": {"prebuilt_voice_config": {"voice_name": "Aoede"}}},
    ),
)

# 2. Backing Music Generation (lyria-3-clip-preview)
music_res = genai.Client().interactions.create(
    model="lyria-3-clip-preview",
    input="Upbeat minimal electronic creator podcast beat, 114 BPM. Instrumental only, no vocals.",
)
7 Modalities  ·  8 Skills  ·  One Agent

Every modality is just another tool in the loop.

Drop .agents/skills/ into your workspace and run the entire pipeline from natural language.

Christopher Brox
Christopher Brox
linkedin.com/in/christopherbrox  ·  ckbrox.com/talks
QR code: Christopher Brox on LinkedIn
01 / 11
7 Modalities. One Pipeline. — Deck Overview
Click any slide to jump  ·  Esc or G to close
Stage Controls
Next / Previous Slide→ / ← / Space / Clicker
First / Last SlideHome / End
Copy Slide Stage PromptC
Play / Pause Slide MediaV
Toggle Output / Python SDK TabS
Peek Full-Bleed Title VideoK
Unmute / Mute Title AudioM
FullscreenF
Speaker Notes DrawerN
Synced Presenter WindowP
Slide Grid OverviewG or Esc
Dark / Light Room ModeT
Blackout StageB or .
Toggle Counter ChromeH
Offline Cache StatusChecking...