L'API Live consente interazioni vocali e testuali a bassa latenza elaborando flussi continui di audio o testo chiamati sessioni per fornire risposte immediate e simili a quelle umane. La gestione del ciclo di vita della sessione, dall'handshake iniziale alla chiusura controllata, è controllata dallo sviluppatore.
Questa pagina mostra come avviare una sessione di conversazione con i modelli Gemini utilizzando l'API Live. Puoi avviare una sessione utilizzando Vertex AI Studio, Gen AI SDK o WebSocket.
Questa pagina mostra anche come:
- Estendere una sessione oltre il limite di tempo predefinito
- Riprendere una sessione precedente
- Aggiornare le istruzioni di sistema durante una sessione
- Configurare la finestra contestuale di una sessione
- Attivare la trascrizione per una sessione
Durata della sessione
Senza compressione, le sessioni solo audio sono limitate a 15 minuti e le sessioni audio-video sono limitate a 2 minuti. Il superamento di questi limiti terminerà la sessione, ma puoi utilizzare la compressione della finestra contestuale per estendere le sessioni per un periodo di tempo illimitato.
La durata di una connessione è limitata a circa 10 minuti. Quando la
connessione termina, anche la sessione termina. In questo caso, puoi
configurare una singola sessione in modo che rimanga attiva su più connessioni utilizzando
il ripristino della sessione. Riceverai anche un messaggio GoAway prima che la connessione termini, per consentirti di intraprendere ulteriori azioni.
Numero massimo di sessioni simultanee
Puoi avere fino a 1000 sessioni simultanee per progetto con un piano con pagamento a consumo (PayGo). Questo limite non si applica ai clienti che utilizzano la velocità effettiva di provisioning.
Avviare una sessione
Le seguenti schede mostrano come avviare una sessione di conversazione live utilizzando Vertex AI Studio, Gen AI SDK o WebSocket:
Console
- Apri Vertex AI Studio > Stream realtime.
- Fai clic su Avvia sessione per iniziare la conversazione.
Per terminare la sessione, fai clic su Interrompi sessione.
Python
Prima di iniziare, devi autenticarti in Vertex AI utilizzando una chiave API o le credenziali predefinite dell'applicazione (ADC):
gcloud auth application-default login
Per ulteriori informazioni sulla configurazione dell'autenticazione, consulta la nostra guida rapida.
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
Quando utilizzi WebSocket, la connessione viene stabilita con un handshake WebSocket standard. L'endpoint è regionale e utilizza token di autenticazione
OAuth 2.0. In questo scenario, il token di autenticazione viene
in genere passato nelle intestazioni WebSocket (ad esempio 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())
Estendere una sessione
La durata massima predefinita di una sessione di conversazione è di 10 minuti. Una goAway
notifica
(BidiGenerateContentServerMessage.goAway)
viene inviata al cliente 60 secondi prima della fine della sessione.
Puoi estendere la durata della sessione con incrementi di 10 minuti utilizzando l'SDK Gen AI. Non esiste un limite al numero di volte in cui puoi estendere una sessione. Per un esempio, vedi Riprendere una sessione precedente.
Per estendere una sessione:
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)
Riprendere una sessione precedente
L'API Live supporta la ripresa della sessione per evitare che l'utente perda il contesto della conversazione durante una breve disconnessione (ad esempio, il passaggio dal Wi-Fi al 5G). Puoi riprendere una sessione precedente entro 24 ore. La ripresa della sessione viene ottenuta memorizzando i dati memorizzati nella cache, inclusi testo, video, prompt audio e output del modello. La privacy a livello di progetto viene applicata a questi dati memorizzati nella cache.
Per impostazione predefinita, la ripresa della sessione è disattivata. Per attivare la ripresa della sessione, imposta
il campo sessionResumption del
messaggio BidiGenerateContentSetup. Se attivato, il server invia periodicamente messaggi SessionResumptionUpdate
contenenti un session_id e un token di ripresa. Se la connessione WebSocket
si interrompe, il client può riconnettersi e includere queste credenziali nel nuovo
messaggio di configurazione. Il server ripristina quindi il contesto precedente, consentendo alla conversazione di continuare senza problemi.
Il periodo di ripresa è finito (in genere circa 10 minuti). Se il client non si riconnette entro questo periodo di tempo, lo stato della sessione viene eliminato per liberare le risorse del server.
Di seguito è riportato un esempio di attivazione della ripresa della sessione e recupero dell'ID handle:
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())
Attivare la ripresa della sessione senza interruzioni con la modalità trasparente
Quando attivi la ripresa della sessione, puoi anche attivare la modalità trasparente per rendere più semplice il processo di ripresa per l'utente. Quando la modalità trasparente è abilitata, viene restituito esplicitamente l'indice del messaggio del client che corrisponde all'istantanea del contesto. In questo modo è più facile identificare il messaggio del client che devi inviare di nuovo quando riprendi la sessione dal punto di ripresa.
Per attivare la modalità Trasparenza:
Python
config = { "response_modalities": ["audio"], "session_resumption": { "session_resumption_config": { "transparent": True, } } }
Aggiornare le istruzioni di sistema durante una sessione
L'API Live ti consente di aggiornare le istruzioni di sistema durante una sessione attiva. Utilizzalo per adattare le risposte del modello, ad esempio modificando la lingua della risposta o il tono.
Per aggiornare le istruzioni di sistema a metà sessione, puoi inviare contenuti di testo con
il ruolo system. L'istruzione di sistema aggiornata rimarrà in vigore per la
sessione rimanente.
Python
session.send_client_content( turns=types.Content( role="system", parts=[types.Part(text="new system instruction")] ), turn_complete=False )
Configurare la finestra contestuale della sessione
La finestra contestuale dell'API Live viene utilizzata per archiviare i dati trasmessi in streaming in tempo reale (25 token al secondo (TPS) per l'audio e 258 TPS per il video) e altri contenuti, inclusi input di testo e output del modello. Una sessione ha un limite della finestra contestuale di:
- 128.000 token per i modelli audio nativi
- 32.000 token per altri modelli dell'API Live
Nelle sessioni di lunga durata, man mano che la conversazione prosegue, si accumula la cronologia dei token audio e di testo. Se la cronologia supera il limite del modello, il modello potrebbe generare allucinazioni, rallentare o la sessione potrebbe essere interrotta forzatamente. Per
attivare sessioni più lunghe, puoi attivare la compressione della finestra contestuale impostando
il campo contextWindowCompression nell'ambito della configurazione della sessione.
La compressione della finestra contestuale utilizza una finestra scorrevole lato server per troncare
le conversazioni più vecchie quando è attivata. Quando i token accumulati superano una lunghezza massima definita (impostata utilizzando il cursore Dimensioni massime dei contenuti in Vertex AI Studio o trigger_tokens nell'API), il server elimina automaticamente i turni più vecchi o li riepiloga per mantenere il contesto entro il limite. In ContextWindowCompressionConfig, puoi configurare un meccanismo di finestra scorrevole e il numero di token definiti nel parametro target_tokens che attiva la compressione.
Ciò consente durate delle sessioni teoricamente infinite dal punto di vista dell'utente, poiché la "memoria" viene gestita costantemente. Senza compressione, le sessioni solo audio potrebbero essere limitate a circa 15 minuti prima di raggiungere i limiti rigidi.
Le lunghezze minime e massime per la lunghezza del contesto e le dimensioni del target sono:
| Impostazione (flag API) | Valore minimo | Valore massimo |
|---|---|---|
Lunghezza massima del contesto (trigger_tokens) |
5000 | 128.000 |
Dimensioni del contesto target (target_tokens) |
0 | 128.000 |
Per impostare la finestra contestuale:
Console
- Apri Vertex AI Studio > Stream realtime.
- Fai clic per aprire il menu Avanzate.
- Nella sezione Contesto della sessione, utilizza il cursore Dimensione massima del contesto per impostare la dimensione del contesto su un valore compreso tra 5000 e 128.000.
- (Facoltativo) Nella stessa sezione, utilizza il cursore Dimensione contesto target per impostare la dimensione target su un valore compreso tra 0 e 128.000.
Python
Imposta i campi context_window_compression.trigger_tokens e
context_window_compression.sliding_window.target_tokens
nel messaggio di configurazione:
config = { "response_modalities": ["audio"], # Configures compression "context_window_compression" : { "trigger_tokens": 10000, "sliding_window": {"target_tokens" : 512} } }
Attivare la trascrizione audio per la sessione
Puoi attivare le trascrizioni sia per l'audio di input che per quello di output.
Per ricevere le trascrizioni, devi aggiornare la configurazione della sessione. Devi
aggiungere gli oggetti input_audio_transcription e output_audio_transcription
e assicurarti che text sia incluso in response_modalities.
config = {
"response_modalities": ["audio", "text"],
"input_audio_transcription": {},
"output_audio_transcription": {},
}
Elaborazione della risposta
Il seguente esempio di codice mostra come connettersi utilizzando la sessione configurata ed estrarre le parti di testo (trascrizioni) insieme ai dati 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.")
Passaggi successivi
- Inviare stream audio e video
- Best practice per l'API Live
- Progetta prompt multimodali
- Introduzione alla chiamata di funzione