Iniciar y gestionar sesiones en directo

La API Live permite interacciones de voz y texto con baja latencia procesando flujos continuos de audio o texto llamados sesiones para ofrecer respuestas habladas inmediatas y similares a las humanas. El desarrollador controla la gestión del ciclo de vida de la sesión, desde el handshake inicial hasta la finalización correcta.

En esta página se muestra cómo iniciar una sesión de conversación con modelos de Gemini mediante la API Live. Puedes iniciar una sesión con Vertex AI Studio, el SDK de IA generativa o WebSockets.

En esta página también se explica cómo hacer lo siguiente:

  • Prolongar 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 de una sesión

Tiempo de vida de la sesión

Sin compresión, las sesiones de solo audio están limitadas a 15 minutos y las sesiones de audio y vídeo, a 2 minutos. Si superas estos límites, la sesión finalizará, pero puedes usar la compresión de la ventana de contexto para ampliar las sesiones durante un tiempo ilimitado.

La duración de una conexión está limitada a unos 10 minutos. Cuando se cierra la conexión, también se cierra la sesión. En este caso, puede 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 GoAway mensaje antes de que finalice la conexión, lo que te permitirá tomar más medidas.

Número máximo de sesiones simultáneas

Puedes tener hasta 1000 sesiones simultáneas por proyecto en un plan de pago por uso (PayGo). Este límite no se aplica a los clientes que usan Provisioned Throughput.

Iniciar una sesión

En las siguientes pestañas se muestra cómo iniciar una sesión de conversación en directo con Vertex AI Studio, el SDK de IA generativa o WebSockets:

Consola

  1. Abre Vertex AI Studio > Stream realtime (Vertex AI Studio > Transmitir en tiempo real).
  2. Haz clic en Iniciar sesión para iniciar la conversación.

Para finalizar la sesión, haz clic en Detener sesión.

Python

Antes de empezar, debes autenticarte en Vertex AI mediante una clave de API o las 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-preview-native-audio-09-2025"
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 usan WebSockets, la conexión se establece con un handshake de WebSocket estándar. El endpoint es regional y usa tokens de portador de OAuth 2.0 para la autenticación. En este caso, el token de autenticación se suele enviar 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-preview-native-audio-09-2025"
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())
      

Prolongar 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.

Puedes ampliar la duración de la sesión en incrementos de 10 minutos con el SDK de IA generativa. Puedes ampliar una sesión tantas veces como quieras. Para ver un ejemplo, consulta Reanudar una sesión anterior.

Para ampliar una sesión, sigue estos pasos:

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)
      

Reanudar una sesión anterior

La API Live admite la reanudación de sesiones para evitar que el usuario pierda el contexto de la conversación durante una breve desconexión (por ejemplo, al 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 consigue almacenando datos en caché, como texto, vídeo, peticiones de audio y salidas del modelo. La privacidad a nivel de 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 sesiones, define el campo sessionResumption del mensaje BidiGenerateContentSetup. Si está habilitado, el servidor envía periódicamente SessionResumptionUpdate mensajes que contienen un session_id y un token de reanudación. Si el WebSocket se desconecta, el cliente puede volver a conectarse e incluir estas credenciales en el nuevo mensaje de configuración. A continuación, el servidor restaura el contexto anterior, lo que permite que la conversación continúe sin problemas.

El periodo de reanudación es finito (normalmente, unos 10 minutos). Si el cliente no vuelve a conectarse en ese plazo, el estado de la sesión se descarta para liberar recursos del servidor.

A continuación, se muestra un ejemplo de cómo habilitar la recuperación de la sesión y obtener el ID de controlador:

Python

import asyncio
from google import genai
from google.genai import types


# 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-preview-native-audio-09-2025"

async def main():
    print(f"Connecting to the service with handle {previous_session_handle}...")
    async with client.aio.live.connect(
        model=MODEL,
        config=types.LiveConnectConfig(
            response_modalities=["audio"],
            session_resumption=types.SessionResumptionConfig(
                # The handle of the session to resume is passed here,
                # or else None to start a new session.
                handle=previous_session_handle
            ),
        ),
    ) as session:
        while True:
            await session.send_client_content(
                turns=types.Content(
                    role="user", parts=[types.Part(text="Hello world!")]
                )
            )
            async for message in session.receive():
                # Periodically, the server will send update messages that may
                # contain a handle for the current state of the session.
                if message.session_resumption_update:
                    update = message.session_resumption_update
                    if update.resumable and update.new_handle:
                        # The handle should be retained and linked to the session.
                        return update.new_handle

                # For the purposes of this example, placeholder input is continually fed
                # to the model. In non-sample code, the model inputs would come from
                # the user.
                if message.server_content and message.server_content.turn_complete:
                    break

if __name__ == "__main__":
    asyncio.run(main())
      

Habilitar la reanudación de sesiones sin interrupciones con el modo Transparencia

Si 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 el modo transparente está habilitado, se devuelve 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 reanudes la sesión desde el identificador de reanudación.

Para habilitar el modo Ambiente, sigue estos pasos:

Python

config = {
   "response_modalities": ["audio"],
   "session_resumption": {
     "session_resumption_config": {
        "transparent": True,
     }
   }
}
      

Actualizar las instrucciones del sistema durante una sesión

La API Live te permite actualizar las instrucciones del sistema durante una sesión activa. Úsala para adaptar las respuestas del modelo, como cambiar el idioma 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á en vigor durante el resto de la sesión.

Python

session.send_client_content(
      turns=types.Content(
          role="system", parts=[types.Part(text="new system instruction")]
      ),
      turn_complete=False
  )
      

Configurar la ventana de contexto de la sesión

La ventana de contexto de la API Live se usa para almacenar datos transmitidos en tiempo real (25 tokens por segundo [TPS] para audio y 258 TPS para vídeo) y otro contenido, incluidas las entradas de texto y las salidas del modelo. Una sesión tiene un límite de ventana de contexto de:

  • 128.000 tokens para modelos de audio nativos
  • 32.000 tokens para otros modelos de la API Live

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 supera el límite del modelo, es posible que el modelo tenga alucinaciones, se ralentice o que la sesión se cierre de forma forzosa. Para habilitar sesiones más largas, puedes habilitar la compresión de la ventana de contexto configurando 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 lado del servidor para truncar las conversaciones más antiguas cuando está habilitada. Cuando los tokens acumulados superan una longitud máxima definida (establecida mediante el control deslizante Tamaño máximo del contenido en Vertex AI Studio o trigger_tokens en la API), el servidor recorta automáticamente las conversaciones más antiguas o las resume para mantener el contexto dentro del límite. En ContextWindowCompressionConfig, puede configurar un mecanismo de ventana deslizante y el número de tokens definidos en el parámetro target_tokens que activa la compresión.

De esta forma, la duración de las sesiones puede ser infinita desde el punto de vista del usuario, ya que la "memoria" se gestiona constantemente. Sin compresión, las sesiones solo de audio pueden limitarse a unos 15 minutos antes de alcanzar los límites estrictos.

Las longitudes mínimas y máximas de la longitud del contexto y del tamaño de destino son las siguientes:

Ajuste (marca de API) Valor mínimo Valor máximo
Longitud máxima del contexto (trigger_tokens) 5000 128.000
Tamaño del contexto objetivo (target_tokens) 0 128.000

Para definir la ventana de contexto, sigue estos pasos:

Consola

  1. Abre Vertex AI Studio > Stream realtime (Vertex AI Studio > Transcribir en tiempo real).
  2. Haz clic para abrir el menú Avanzado.
  3. En la sección Contexto de la sesión, use el control deslizante Tamaño máximo del contexto para definir un valor entre 5000 y 128.000.
  4. (Opcional) En la misma sección, use el control deslizante Tamaño del contexto objetivo para definir el tamaño objetivo en un valor entre 0 y 128.000.

Python

Define 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}
   }
}
      

Habilitar la transcripción de audio de la sesión

Puedes habilitar las transcripciones del audio de entrada y de salida.

Para recibir transcripciones, debes actualizar la configuración de la sesión. Debe añadir los objetos input_audio_transcription y output_audio_transcription, y asegurarse de que text se incluye en response_modalities.

config = {
    "response_modalities": ["audio", "text"],
    "input_audio_transcription": {},
    "output_audio_transcription": {},
}

Procesar la respuesta

En el siguiente código de ejemplo se muestra cómo conectarse mediante 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.")

Siguientes pasos