La API de Gemini Live permite interacciones de voz y texto de baja latencia mediante el procesamiento de transmisiones continuas de audio o texto llamadas sesiones para ofrecer respuestas habladas inmediatas y similares a las humanas. El desarrollador controla la administración del ciclo de vida de la sesión, desde el protocolo de enlace inicial hasta la finalización correcta.
En esta página, se muestra cómo iniciar una sesión de conversación con los modelos de Gemini mediante la API de Gemini Live. Puedes iniciar una sesión con Vertex AI Studio, el SDK de IA generativa de Google o WebSockets.
En esta página, también se muestra cómo hacer lo siguiente:
- Extender una sesión más allá del límite de tiempo predeterminado
- Reanudar una sesión anterior
- Actualizar las instrucciones del sistema durante una sesión
- Configurar la ventana de contexto de una sesión
- Habilitar la transcripción para una sesión
Duración de la sesión
Sin la compresión de la ventana de contexto, las sesiones solo de audio se limitan a 15 minutos, y las sesiones de audio y video se limitan a 2 minutos debido a los límites de tokens. Si se exceden estos límites, se finalizará la sesión, pero puedes usar la compresión de la ventana de contexto para extender las sesiones a una cantidad ilimitada de tiempo.
La duración de una conexión se limita a unos 10 minutos debido a las restricciones de conexión de WebSocket. Cuando finaliza la conexión, también finaliza la sesión. En este caso, puedes configurar una sola sesión para que permanezca activa en varias conexiones mediante la reanudación de la sesión. También recibirás un mensaje GoAway antes de que finalice la conexión, lo que te permitirá realizar más acciones.
Cantidad máxima de sesiones simultáneas
Puedes tener hasta 1,000 sesiones simultáneas por proyecto en un plan de pago por uso (PayGo). Este límite no se aplica a los clientes que usan la capacidad de procesamiento aprovisionada.
Inicia una sesión
En las siguientes pestañas, se muestra cómo iniciar una sesión de conversación en vivo con Vertex AI Studio, el SDK de IA generativa de Google o WebSockets:
Console
- Abre Vertex AI Studio > Stream realtime.
- Haz clic en Start session para iniciar la conversación.
Para finalizar la sesión, haz clic en Stop session.
Python
Antes de comenzar, debes autenticarte en Gemini Enterprise Agent Platform con una clave de API o credenciales predeterminadas de la aplicación (ADC):
gcloud auth application-default login
Para obtener más información sobre cómo configurar la autenticación, consulta nuestra guía de inicio rápido.
import asyncio from google import genai # Replace the PROJECT_ID and LOCATION with your Project ID and location. client = genai.Client(vertexai=True, project="PROJECT_ID", location="LOCATION") # Configuration MODEL = "gemini-live-2.5-flash-native-audio" config = { "response_modalities": ["audio"], } async def main(): # Establish WebSocket session async with client.aio.live.connect(model=MODEL, config=config) as session: print("Session established. Sending audio...") if __name__ == "__main__": asyncio.run(main())
Python
Cuando se usa WebSockets, la conexión se establece con un protocolo de enlace WebSocket estándar. El extremo es regional y usa tokens del portador de OAuth 2.0
para la autenticación. En este caso, el token de autenticación suele pasar en los encabezados de WebSocket (como Authorization: Bearer [TOKEN]).
import asyncio import websockets # Replace the PROJECT_ID and LOCATION with your Project ID and location. PROJECT_ID = "PROJECT_ID" LOCATION = "LOCATION" # Authentication token_list = !gcloud auth application-default print-access-token ACCESS_TOKEN = token_list[0] # Configuration MODEL_ID = "gemini-live-2.5-flash-native-audio" MODEL = f"projects/{PROJECT_ID}/locations/{LOCATION}/publishers/google/models/{MODEL_ID}" config = { "response_modalities": ["audio"], } # Construct the WSS URL HOST = f"{LOCATION}-aiplatform.googleapis.com" URI = f"wss://{HOST}/ws/google.cloud.aiplatform.v1.LlmBidiService/BidiGenerateContent" async def main(): headers = {"Authorization": f"Bearer {ACCESS_TOKEN}"} async with websockets.connect(URI, additional_headers=headers) as ws: print("Session established.") # Send Setup (Handshake) await ws.send(json.dumps({ "setup": { "model": MODEL, "generation_config": config } })) # Send audio/video ... if __name__ == "__main__": asyncio.run(main())
Extiende una sesión
La duración máxima predeterminada de una sesión de conversación es de 10 minutos. Se envía una goAway
notificación
(BidiGenerateContentServerMessage.goAway)
al cliente 60 segundos antes de que finalice la sesión.
Para extender una sesión más allá del límite de conexión de 10 minutos, debes volver a conectarte con la reanudación de la sesión. Cuando recibas una notificación goAway o cuando se finalice la conexión por otros motivos, puedes iniciar una conexión nueva con un controlador de sesión obtenido durante la sesión. De esta manera, se reanuda la sesión con su contexto intacto en la conexión nueva. No hay límite para la cantidad de veces que puedes hacer esto. Para obtener un ejemplo de cómo reanudar una sesión, consulta
Reanuda una sesión anterior.
En el siguiente ejemplo, se muestra cómo detectar una finalización de sesión inminente mediante la escucha de una notificación goAway:
Python
async for response in session.receive(): if response.go_away is not None: # The connection will soon be terminated print(response.go_away.time_left)
Reanuda una sesión anterior
La API de Gemini Live admite la reanudación de la sesión para evitar que el usuario pierda el contexto de la conversación durante una desconexión breve (por ejemplo, cambiar de Wi-Fi a 5G). Puedes reanudar una sesión anterior en un plazo de 24 horas. La reanudación de la sesión se logra almacenando datos almacenados en caché, incluidos texto, video, instrucciones de audio y resultados del modelo. La privacidad a nivel del proyecto se aplica a estos datos almacenados en caché.
De forma predeterminada, la reanudación de la sesión está inhabilitada. Para habilitar la reanudación de la sesión, establece
el sessionResumption campo del
BidiGenerateContentSetup
mensaje. Si está habilitado, el servidor envía periódicamente mensajes SessionResumptionUpdate que contienen un session_id y un token de reanudación. Si se desconecta WebSocket, el cliente puede volver a conectarse e incluir estas credenciales en el nuevo mensaje de configuración. Luego, el servidor restablece el contexto anterior, lo que permite que la conversación continúe sin problemas.
La ventana de reanudación es finita (por lo general, alrededor de 10 minutos). Si el cliente no se vuelve a conectar dentro de este período, se descarta el estado de la sesión para liberar recursos del servidor.
En el siguiente ejemplo, se conecta al servicio, se obtiene un controlador de reanudación de sesión, se simula una desconexión y, luego, se vuelve a conectar con el controlador para reanudar la sesión:
Python
import asyncio from google import genai from google.genai import types import websockets # Replace the PROJECT_ID and LOCATION with your Project ID and location. client = genai.Client(vertexai=True, project="PROJECT_ID", location="LOCATION") # Configuration MODEL = "gemini-live-2.5-flash-native-audio" async def resumable_session_example(): """Demonstrates session resumption by connecting, disconnecting, and reconnecting.""" session_handle = None print("Starting a new session...") try: async with client.aio.live.connect( model=MODEL, config=types.LiveConnectConfig( response_modalities=["audio"], session_resumption=types.SessionResumptionConfig(handle=None), ), ) as session: await session.send_content( content=types.Content(role="user", parts=[types.Part(text="Hello!")]) ) async for message in session.receive(): if message.session_resumption_update: update = message.session_resumption_update if update.resumable and update.new_handle: session_handle = update.new_handle print(f"Received session handle: {session_handle}") # For demonstration, we break to simulate a disconnect # after receiving a handle. break if message.server_content and message.server_content.turn_complete: break except websockets.exceptions.WebSocketException as e: print(f"Initial connection failed: {e}") return if not session_handle: print("Did not receive a session handle. Cannot demonstrate resumption.") return print(f"\nSimulating disconnect and reconnecting with handle {session_handle}...") try: async with client.aio.live.connect( model=MODEL, config=types.LiveConnectConfig( response_modalities=["audio"], session_resumption=types.SessionResumptionConfig(handle=session_handle), ), ) as session: print("Successfully resumed session.") await session.send_content( content=types.Content(role="user", parts=[types.Part(text="I am back!")]) ) async for message in session.receive(): if message.session_resumption_update: update = message.session_resumption_update if update.resumable and update.new_handle: session_handle = update.new_handle print(f"Received updated session handle: {session_handle}") if message.server_content: print(f"Received server content: {message.server_content}") if message.server_content.turn_complete: break print("Resumed session finished.") except websockets.exceptions.WebSocketException as e: print(f"Failed to resume session: {e}") if __name__ == "__main__": asyncio.run(resumable_session_example())
Habilita la reanudación de la sesión sin problemas con el modo transparente
Cuando habilitas la reanudación de la sesión, también puedes habilitar el modo transparente para que el proceso de reanudación sea más fluido para el usuario. Cuando se habilita el modo transparente, se muestra explícitamente el índice del mensaje del cliente que corresponde a la instantánea de contexto. Esto ayuda a identificar qué mensaje del cliente debes volver a enviar cuando reanudas la sesión desde el controlador de reanudación.
Para habilitar el modo transparente, haz lo siguiente:
Python
config = { "response_modalities": ["audio"], "session_resumption_config": { "transparent": True, } }
Actualiza las instrucciones del sistema durante una sesión
La API de Gemini Live te permite actualizar las instrucciones del sistema durante una sesión activa. Usa esta opción para adaptar las respuestas del modelo, como cambiar el idioma de respuesta o modificar el tono.
Para actualizar las instrucciones del sistema durante la sesión, puedes enviar contenido de texto con el rol system. La instrucción del sistema actualizada seguirá vigente durante el resto de la sesión.
Python
session.send_client_content( content=types.Content( role="system", parts=[types.Part(text="new system instruction")] ), turn_complete=False )
Configura la ventana de contexto de la sesión
La ventana de contexto de la API de Gemini Live se usa para almacenar datos transmitidos en tiempo real (25 tokens por segundo (TPS) para audio y 258 TPS para video) y otro contenido, incluidas las entradas de texto y los resultados del modelo. Todos los modelos de la API de Gemini Live tienen un límite de ventana de contexto de 128,000 tokens.
En las sesiones de larga duración, a medida que avanza la conversación, se acumula el historial de tokens de audio y texto. Si este historial excede el límite del modelo, es posible que el modelo alucine, se ralentice o que la sesión se finalice de forma forzosa. Para habilitar sesiones más largas, puedes habilitar la compresión de la ventana de contexto si configuras el campo contextWindowCompression como parte de la configuración de la sesión.
La compresión de la ventana de contexto usa una ventana deslizante del servidor para truncar los turnos más antiguos cuando está habilitada. Cuando los tokens acumulados exceden una longitud máxima definida (establecida con el control deslizante Max content size en Vertex AI Studio o trigger_tokens en la API), el servidor poda automáticamente los turnos más antiguos o los resume para mantener el contexto dentro del límite. En ContextWindowCompressionConfig, puedes configurar un mecanismo de ventana deslizante y la cantidad de tokens definidos en el parámetro target_tokens que activa la compresión.
Esto permite duraciones de sesión teóricamente infinitas desde la perspectiva del usuario, ya que la "memoria" se administra constantemente. Sin compresión, las sesiones solo de audio podrían limitarse a aproximadamente 15 minutos antes de alcanzar los límites estrictos.
Las longitudes mínimas y máximas para la longitud del contexto y el tamaño objetivo son las siguientes:
| Configuración (marca de la API) | Valor mínimo | Valor máximo |
|---|---|---|
Longitud máxima del contexto (trigger_tokens) |
5,000 | 128,000 |
Tamaño del contexto objetivo (target_tokens) |
0 | 128,000 |
Para configurar la ventana de contexto, haz lo siguiente:
Console
- Abre Vertex AI Studio > Stream realtime.
- Haz clic para abrir el menú Advanced.
- En la sección Session Context, usa el control deslizante Max context size para establecer el tamaño del contexto en un valor entre 5,000 y 128,000.
- (Opcional) En la misma sección, usa el control deslizante Target context size para establecer el tamaño objetivo en un valor entre 0 y 128,000.
Python
Establece los campos context_window_compression.trigger_tokens y
context_window_compression.sliding_window.target_tokens
en el mensaje de configuración:
config = { "response_modalities": ["audio"], # Configures compression "context_window_compression" : { "trigger_tokens": 10000, "sliding_window": {"target_tokens" : 512} } }
Habilita la transcripción de audio para la sesión
Puedes habilitar las transcripciones para el audio de entrada y salida.
Para recibir transcripciones, debes actualizar la configuración de la sesión. Debes agregar los objetos input_audio_transcription y output_audio_transcription y asegurarte de que text esté incluido en response_modalities.
Para mejorar la calidad de la transcripción para el reconocimiento de voz automático (ASR) multilingüe, puedes proporcionar sugerencias de idioma con el campo language_codes dentro de input_audio_transcription o output_audio_transcription. Se recomienda proporcionar sugerencias para mejorar la calidad de la transcripción, ya que reduce el riesgo de detección incorrecta del idioma, en especial para las instrucciones breves. El campo language_codes
acepta una lista de códigos de idioma BCP-47
(por ejemplo, "en-US", "es-US").
config = {
"response_modalities": ["audio", "text"],
"input_audio_transcription": {
"language_codes": ["en-US"]
},
"output_audio_transcription": {},
}
Procesa la respuesta
En el siguiente muestra de código, se muestra cómo conectarse con la sesión configurada y extraer las partes de texto (transcripciones) junto con los datos de audio.
# Receive Output Loop
async for message in session.receive():
server_content = message.server_content
if server_content:
# Handle Model Turns (Audio + Text)
model_turn = server_content.model_turn
if model_turn and model_turn.parts:
for part in model_turn.parts:
# Handle Text (Transcriptions)
if part.text:
print(f"Transcription: {part.text}")
# Handle Audio
if part.inline_data:
audio_data = part.inline_data.data
# Process audio bytes...
pass
# Check for turn completion
if server_content.turn_complete:
print("Turn complete.")
¿Qué sigue?
- Envía transmisiones de audio y video
- Prácticas recomendadas con la API de Gemini Live
- Diseña instrucciones multimodales
- Introducción a las llamadas a funciones