gemini-live-api-dev
google-gemini/gemini-skills · Agent Skill
Build real-time, bidirectional streaming applications with the Gemini Live API, including WebSocket audio, video, and text, VAD, session management, and ephemeral client auth tokens.
Jump to install ↓Overview
| Publisher | |
|---|---|
| Repository | google-gemini/gemini-skills ↗ |
| Skill folder | gemini-live-api-dev |
| Stars | 4,341 |
| Forks | 467 |
| Bundled files | 2 |
| License | Apache-2.0 |
| Last updated | October 13, 2026 |
| Links | Skill source ↗ · Repository ↗ |
Mozgi check
What we found in the skill files. Details come with a subscription.
Installation
A skill is a folder with a SKILL.md file. Pick your agent and run the commands in a terminal (macOS, Linux or Git Bash on Windows) from your project root.
Copy the prompt into Claude, Codex or another assistant: it will review the skill and install it for you.
Install the “gemini-live-api-dev” skill from mozgi.io (https://mozgi.io/skills/google-gemini-gemini-live-api-dev/) for me. 1. Download the archive: https://mozgi.io/skills/google-gemini-gemini-live-api-dev/download If it fails, take the skill folder from the source: https://github.com/google-gemini/gemini-skills/tree/main/skills/gemini-live-api-dev 2. Read SKILL.md and the other files. Check the skill is safe: no hidden commands, no sending data elsewhere, no scripts doing something other than described. If anything looks suspicious, stop and tell me. 3. Put the “gemini-live-api-dev” folder into your agent's skills folder: .claude/skills/ for Claude Code, .agents/skills/ for Codex, .cursor/skills/ for Cursor, .gemini/skills/ for Gemini CLI. Inside the project if we are in one, otherwise in the home folder (~/.claude/skills/ etc.). 4. Make sure <skills folder>/gemini-live-api-dev/SKILL.md exists. 5. Briefly tell me what this skill does and offer to try it on my task. If you cannot do a step yourself, tell me what to click or type.
git clone --depth 1 --branch main https://github.com/google-gemini/gemini-skills.git /tmp/gemini-skills mkdir -p .claude/skills cp -r /tmp/gemini-skills/skills/gemini-live-api-dev .claude/skills/gemini-live-api-dev
Restart Claude Code — the skill appears in the list; call it manually with /gemini-live-api-dev. For all projects use ~/.claude/skills.
git clone --depth 1 --branch main https://github.com/google-gemini/gemini-skills.git /tmp/gemini-skills mkdir -p .agents/skills cp -r /tmp/gemini-skills/skills/gemini-live-api-dev .agents/skills/gemini-live-api-dev
Codex looks for skills in .agents/skills from the current folder up to the repo root; call one with /skills or $gemini-live-api-dev. For all projects use ~/.agents/skills.
git clone --depth 1 --branch main https://github.com/google-gemini/gemini-skills.git /tmp/gemini-skills mkdir -p .cursor/skills cp -r /tmp/gemini-skills/skills/gemini-live-api-dev .cursor/skills/gemini-live-api-dev
Cursor picks the skill up on start; call it with “/” in Agent chat. Cursor also reads .claude/skills and .agents/skills. For all projects use ~/.cursor/skills.
git clone --depth 1 --branch main https://github.com/google-gemini/gemini-skills.git /tmp/gemini-skills mkdir -p .gemini/skills cp -r /tmp/gemini-skills/skills/gemini-live-api-dev .gemini/skills/gemini-live-api-dev
Gemini CLI offers to activate the skill when a task matches — you approve it. For all projects use ~/.gemini/skills.
Read SKILL.md and any companion files before deciding whether to install. Click a file to preview it.
SKILL.md contents
Original author text · read-onlyGemini Live API Development Skill
Overview
The Live API enables low-latency, real-time voice and video interactions with Gemini over WebSockets. It processes continuous streams of audio, video, or text to deliver immediate, human-like spoken responses and background reasoning.
Key capabilities:
- Bidirectional audio streaming — real-time mic-to-speaker conversations
- Background reasoning (extended thinking) — multi-step background reasoning with spoken conversational fillers
- Live streaming transcription — real-time speech-to-text with interim and finalized streams
- Video streaming — send camera/screen frames alongside audio
- Text input/output — send and receive text within a live session
- Audio transcriptions — get text transcripts of both input and output audio
- Voice Activity Detection (VAD) — automatic server VAD, client-side Hybrid VAD, and manual Push-to-Talk
- Asynchronous function calling — non-blocking tool execution while audio continues streaming
- Full-session client content — inject and update conversation turns mid-stream
- Session management — context compression, session resumption, GoAway signals
- Ephemeral tokens — secure client-side authentication
> [!NOTE]
> The Live API connects directly via WebSockets. For WebRTC support or simplified integration, use a partner integration.
Models
Current Models (Use These)
gemini-3.8-live— Default option for most low-latency voice agent experiences and real-time dialogue without reasoning delays. Supports interleaved reasoning, asynchronous function calling by default (behavior: NON_BLOCKING), and full-session client content updates.gemini-3.8-live-extended-thinking— High-reasoning audio-to-audio model recommended when higher background reasoning is required during live interactions. Processes background reasoning and async tool calls (behavior: NON_BLOCKINGrequired) while streaming continuous spoken conversational fillers; lifecycle managed viainteraction_status(IN_PROGRESSvsIDLE).gemini-3.5-transcribe-live— Real-time streaming speech-to-text with interim hypotheses, finalized transcripts, smart formatting, and Hybrid VAD.gemini-3.5-live-translate-preview— Real-time speech-to-speech streaming translation across 70+ languages.
> [!WARNING]
> **Legacy Models (gemini-3.1-flash-live-preview, gemini-2.5-flash-native-audio-*, gemini-live-2.5-flash-preview, gemini-2.0-flash-live-001)**: Read references/migration.md ↗ for breaking protocol changes (behavior: "NON_BLOCKING", thinking_level, interaction_status, send_client_content).
SDKs
- Python:
google-genai>=2.3.0—pip install -U google-genai - JavaScript/TypeScript:
@google/genai>=2.3.0—npm install @google/genai
> [!WARNING]
> Legacy SDKs google-generativeai (Python) and @google/generative-ai (JS) are deprecated. Never use them.
Partner Integrations
To streamline real-time audio/video app development, use a third-party integration supporting the Gemini Live API over WebRTC or WebSockets:
- LiveKit ↗ — Use the Gemini Live API with LiveKit Agents.
- Pipecat by Daily ↗ — Create a real-time AI chatbot using Gemini Live and Pipecat.
- Fishjam by Software Mansion ↗ — Create live video and audio streaming applications with Fishjam.
- Vision Agents by Stream ↗ — Build real-time voice and video AI applications with Vision Agents.
- Voximplant ↗ — Connect inbound and outbound calls to Live API with Voximplant.
- Firebase AI SDK ↗ — Get started with the Gemini Live API using Firebase AI Logic.
Audio Formats
- Input: Raw PCM, little-endian, 16-bit, mono. 16kHz native (will resample others). MIME type:
audio/pcm;rate=16000 - Output: Raw PCM, little-endian, 16-bit, mono. 24kHz sample rate.
> [!IMPORTANT]
> Use send_realtime_input / sendRealtimeInput for all real-time streaming user input (audio, video, and text). On Gemini 3.8 models, send_client_content / sendClientContent is supported across the full session lifecycle with explicit roles (user or model) to inject conversation context (turn_complete=true unconditionally interrupts active generation).
> [!WARNING]
> Do not use media in sendRealtimeInput. Use the specific keys: audio for audio data, video for images/video frames, and text for text input.
---
Quick Start
Authentication
Python
from google import genai
client = genai.Client(api_key="YOUR_API_KEY")
JavaScript
import { GoogleGenAI } from '@google/genai';
const ai = new GoogleGenAI({ apiKey: 'YOUR_API_KEY' });
Connecting to the Live API
Python
from google.genai import types
config = types.LiveConnectConfig(
response_modalities=[types.Modality.AUDIO],
system_instruction=types.Content(
parts=[types.Part(text="You are a helpful assistant.")]
)
)
async with client.aio.live.connect(model="gemini-3.8-live", config=config) as session:
pass # Session is active
JavaScript
const session = await ai.live.connect({
model: 'gemini-3.8-live',
config: {
responseModalities: ['audio'],
systemInstruction: { parts: [{ text: 'You are a helpful assistant.' }] }
},
callbacks: {
onopen: () => console.log('Connected'),
onmessage: (response) => console.log('Message:', response),
onerror: (error) => console.error('Error:', error),
onclose: () => console.log('Closed')
}
});
Sending Text
Python
await session.send_realtime_input(text="Hello, how are you?")
JavaScript
session.sendRealtimeInput({ text: 'Hello, how are you?' });
Sending Audio
Python
await session.send_realtime_input(
audio=types.Blob(data=chunk, mime_type="audio/pcm;rate=16000")
)
JavaScript
session.sendRealtimeInput({
audio: { data: chunk.toString('base64'), mimeType: 'audio/pcm;rate=16000' }
});
Sending Video
Python
# frame: raw JPEG-encoded bytes
await session.send_realtime_input(
video=types.Blob(data=frame, mime_type="image/jpeg")
)
JavaScript
session.sendRealtimeInput({
video: { data: frame.toString('base64'), mimeType: 'image/jpeg' }
});
Receiving Audio and Text
> [!IMPORTANT]
> A single server event can contain multiple content parts simultaneously (e.g., audio chunks and transcript). Always process all parts in each event to avoid missing content.
Python
async for response in session.receive():
content = response.server_content
if content:
# Audio — process ALL parts in each event
if content.model_turn:
for part in content.model_turn.parts:
if part.inline_data:
audio_data = part.inline_data.data
# Transcription
if content.input_transcription:
print(f"User: {content.input_transcription.text}")
if content.output_transcription:
print(f"Gemini: {content.output_transcription.text}")
# Interruption
if content.interrupted is True:
pass # Stop playback, clear audio queue
JavaScript
// Inside the onmessage callback
const content = response.serverContent;
if (content?.modelTurn?.parts) {
for (const part of content.modelTurn.parts) {
if (part.inlineData) {
const audioData = part.inlineData.data; // Base64 encoded
}
}
}
if (content?.inputTranscription) console.log('User:', content.inputTranscription.text);
if (content?.outputTranscription) console.log('Gemini:', content.outputTranscription.text);
if (content?.interrupted) { /* Stop playback, clear audio queue */ }
---
Background Reasoning (Extended Thinking)
Use gemini-3.8-live-extended-thinking when your voice agent must evaluate complex data, plan multiple steps, or handle long-running tools. The model speaks natural conversational fillers (e.g. *"Checking flight options now..."*) while executing asynchronous tools in the background.
Key requirements:
- Thinking config: Set
thinking_config=types.ThinkingConfig(thinking_level="low")("minimal"|"low"|"medium"|"high"). - Non-blocking tools: All function declarations must set
behavior="NON_BLOCKING". Synchronous blocking mode is not supported and returns an error. - Lifecycle tracking (
interaction_status): Do not rely onturn_complete=Truealone to detect turn completion. Monitormessage.interaction_status(Python) /message.interactionStatus(JS): "IN_PROGRESS": Server is reasoning, speaking conversational fillers, or waiting for async tool responses."IDLE": Server has completed all background reasoning and tool calls; session is ready for user input.
See references/migration.md ↗ and the Thinking in Live API Guide ↗ for complete Python and JavaScript implementation examples.
---
Live Translation (Gemini Live Translate)
The Live API supports real-time, low-latency streaming translation of speech (audio) across 70+ languages. For full details on options and capabilities, see the Live Translate Guide ↗.
Model
gemini-3.5-live-translate-preview— The recommended translation model for all Live Translate use cases.
Configuration (TranslationConfig)
To enable translation, specify a TranslationConfig object inside your live session setup:
- Python SDK: Configure the connection using
translation_configonLiveConnectConfig:
```python
config = types.LiveConnectConfig(
response_modalities=[types.Modality.AUDIO],
translation_config=types.TranslationConfig(
target_language_code="es", # Target language code (e.g. es, fr, pl)
echo_target_language=True,
),
input_audio_transcription=types.AudioTranscriptionConfig(),
output_audio_transcription=types.AudioTranscriptionConfig(),
)
```
- Raw WebSockets: Place
translationConfiginsidegenerationConfig:
```json
{
"setup": {
"model": "models/gemini-3.5-live-translate-preview",
"generationConfig": {
"responseModalities": ["AUDIO"],
"translationConfig": {
"targetLanguageCode": "es",
"echoTargetLanguage": true
}
}
}
}
```
---
Live Streaming Transcription (Gemini Live Transcribe)
The Live API supports real-time streaming speech-to-text over WebSockets with low-latency interim hypotheses, finalized transcripts, and Hybrid VAD. For full details, see the Live Transcription Guide ↗ and Colab Cookbook ↗.
Model
gemini-3.5-transcribe-live
Modes
smart: cleans up filler words, resolves inline self-corrections, and structures formatting.verbatim(default): exact word-for-word transcript.
Python
config = types.LiveConnectConfig(
response_modalities=["TEXT"],
input_audio_transcription=types.AudioTranscriptionConfig(),
)
async with client.aio.live.connect(model="gemini-3.5-transcribe-live", config=config) as session:
# Stream audio
await session.send_realtime_input(audio=types.Blob(data=chunk, mime_type="audio/pcm;rate=16000"))
# Hybrid VAD: notify turn end on client-detected silence for zero latency
await session.send_realtime_input(audio_stream_end=True)
JavaScript
const session = await ai.live.connect({
model: 'gemini-3.5-transcribe-live',
config: {
responseModalities: ['text'],
inputAudioTranscription: { mode: 'smart' }
},
callbacks: {
onmessage: (msg) => {
if (msg.serverContent?.interimInputTranscription) {
console.log('Interim:', msg.serverContent.interimInputTranscription.text);
}
if (msg.serverContent?.inputTranscription) {
console.log('Final:', msg.serverContent.inputTranscription.text);
}
}
}
});
session.sendRealtimeInput({ audio: { data: chunkBase64, mimeType: 'audio/pcm;rate=16000' } });
session.sendRealtimeInput({ audioStreamEnd: true }); // Hybrid VAD
Raw WebSockets
{
"setup": {
"model": "models/gemini-3.5-transcribe-live",
"generationConfig": {
"responseModalities": ["TEXT"],
"speechConfig": {
"voiceConfig": {}
}
},
"inputAudioTranscription": {
"mode": "smart"
}
}
}
---
Limitations
- Response modality — Only
TEXTorAUDIOper session, not both. Native audio models output audio (response_modalities=["AUDIO"]); enableoutput_audio_transcriptionif you need text transcripts. - Audio-only session — 15 min without compression
- Audio+video session — 2 min without compression
- Connection lifetime — ~10 min (use session resumption)
- Context window — 128k input tokens / 64k output tokens
- Code execution / URL context — Not supported
Upgrading & Migration
For step-by-step migration checklists and protocol deltas when upgrading from gemini-3.1-flash-live-preview, gemini-2.5-flash-native-audio-*, or gemini-2.0-flash-live-001 to Gemini 3.8 Live or Gemini 3.8 Live Extended Thinking, read references/migration.md ↗.
Best Practices
1. Use headphones when testing mic audio to prevent echo/self-interruption
2. Enable context window compression for sessions longer than 15 minutes
3. Implement session resumption to handle connection resets gracefully
4. Use ephemeral tokens for client-side deployments — never expose API keys in browsers
5. Use send_realtime_input for real-time user input (audio, video, text). Use send_client_content with explicit user/model roles to inject context turns mid-stream
6. Send audioStreamEnd / audio_stream_end (Hybrid VAD) when the mic is paused or user finishes speaking
7. Clear audio playback queues on interruption signals (interrupted: true)
8. Process all parts in each server event — events can contain multiple content parts
9. Monitor interaction_status (IN_PROGRESS vs IDLE) when using gemini-3.8-live-extended-thinking rather than relying on turn_complete alone
Documentation Lookup
When MCP is Installed (Preferred)
If the search_docs tool (from the Google MCP server) is available, use it as your only documentation source:
1. Call search_docs with your query
2. Read the returned documentation
3. Trust MCP results as source of truth for API details — they are always up-to-date.
> [!IMPORTANT]
> When MCP tools are present, never fetch URLs manually. MCP provides up-to-date, indexed documentation that is more accurate and token-efficient than URL fetching.
When MCP is NOT Installed (Fallback Only)
If no MCP documentation tools are available, fetch from the official docs index:
llms.txt URL: https://ai.google.dev/gemini-api/docs/llms.txt
This index contains links to all documentation pages in .md.txt format. Use web fetch tools to:
1. Fetch llms.txt to discover available documentation pages
2. Fetch specific pages (e.g., https://ai.google.dev/gemini-api/docs/live-session.md.txt)
Key Documentation Pages
> [!IMPORTANT]
> Those are not all the documentation pages. Use the llms.txt index to discover available documentation pages
- Live API Overview ↗ — getting started, raw WebSocket usage
- Thinking in Live API ↗ — background reasoning, conversational fillers, interaction_status, non-blocking tools
- Model Card: Gemini 3.8 Live ↗ — default low-latency voice agent model & migration guide
- Model Card: Gemini 3.8 Live Extended Thinking ↗ — high-reasoning voice model & upgrading guide
- Live Transcription ↗ — real-time speech-to-text, interim hypotheses, smart formatting, and Hybrid VAD
- Live Translate ↗ — configuration options and capabilities for translation
- Live API Capabilities Guide ↗ — voice config, transcription config, VAD configuration, media resolution
- Live API Tool Use ↗ — function calling (sync and async), Google Search grounding
- Session Management ↗ — context window compression, session resumption, GoAway signals
- Ephemeral Tokens ↗ — secure client-side authentication for browser/mobile
- WebSockets API Reference ↗ — raw WebSocket protocol details
- Migration & Upgrading Guide ↗ — step-by-step checklists and code examples for Gemini 3.8 Live and Extended Thinking
Supported Languages
The Live API supports 70 languages including: English, Spanish, French, German, Italian, Portuguese, Chinese, Japanese, Korean, Hindi, Arabic, Russian, and many more. Native audio models automatically detect and switch languages.
Frequently asked questions
What does the gemini-live-api-dev skill do?
Build real-time, bidirectional streaming applications with the Gemini Live API, including WebSocket audio, video, and text, VAD, session management, and ephemeral client auth tokens.
How do I install gemini-live-api-dev?
Open the “Installation” block on this page and pick your agent — Claude Code, Codex, Cursor or Gemini CLI — for ready-made commands that copy the skill folder to the right place. Or copy the prompt from the “Via assistant” tab and let the assistant review and install the skill.
Which AI models work with gemini-live-api-dev?
Skills are plain Markdown instructions (the Agent Skills format), so gemini-live-api-dev works with any agent that reads SKILL.md: Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and more. The model loads the instructions only when a task matches the skill's description.
Is gemini-live-api-dev free?
The skill is published openly by google-gemini under the Apache-2.0 license. The skill itself costs nothing — you only pay your AI provider for the tokens you use.
Is it safe to install skills?
A skill is a set of instructions your agent will follow, so read SKILL.md and its companion files before installing. Scripts in the skill folder only run if your agent runs them — keep an eye on what it does and do not grant unnecessary permissions.
How is a skill different from an MCP server or a plugin?
An MCP server or plugin gives the model new tools — code that runs and returns a result. A skill gives it knowledge and process: how to approach a task, which steps to follow and what good output looks like. It needs no server or API key.