Questo documento descrive le modifiche necessarie durante la migrazione da Gemini 2.5 Flash Live API Native Audio a Gemini 3.8 Live.
Modifiche alla chiamata di funzione
Il server audio nativo dell'API Gemini 2.5 Flash Live consente chiamate asincrone agli strumenti. Al contrario, Gemini 3.8 Live supporta la chiamata di funzioni asincrona con le seguenti modifiche del comportamento:
Gemini 3.8 Live supporta la funzione di blocco delle chiamate di funzioni quando la dichiarazione di funzione dichiara
behavior=BLOCKINGnella configurazione. Se viene ricevuto un nuovo input durante l'esecuzione della chiamata di funzione di blocco, il server dell'API Live annulla la chiamata di funzione corrente.Il comportamento dell'opzione
scheduling=interruptperFunctionResponseè cambiato:Pianificazione di FunctionResponseChi sta parlando API Gemini 2.5 Flash Live Audio nativo Gemini 3.8 Live interrompi modello Interrompe la risposta immediata del modello attivo e riproduce la risposta dello strumento. Interrompe la risposta immediata del modello attivo e riproduce la risposta dello strumento. interrompere utente Interrompe immediatamente; riproduce la risposta dello strumento per l'utente. Attende che l'utente finisca prima di riprodurre la risposta dello strumento.
Mitigazione di sweep ridondanti e tentativi di chiamata di funzione
A volte Gemini 3.8 Live esegue chiamate di funzioni ridondanti consecutive in un singolo turno quando uno strumento non restituisce risultati. che possono includere la ripetizione di parametri variabili, la scansione da due a cinque volte prima di rispondere. Il comportamento aumenta il tempo al primo audio (TTFA) e produce un discorso di riserva impreciso.
Le chiamate di funzioni ridondanti consecutive sono causate da Gemini 3.8 Live
che tenta di risolvere le query. Quando uno strumento restituisce una risposta non informativa o vuota, ad esempio {"results": [], "total_available": 0} o None, il modello non riesce a distinguere tra "esaurimento permanente", "finestra di query troppo ristretta" o "argomento non valido". Il modello tenta di ampliare o variare la query nel tentativo di migliorare i risultati e inizia la scansione.
Applica le seguenti pratiche complementari:
Restituisci risposte informative alle funzioni: ogni risposta dello strumento deve contenere informazioni sull'errore o sui risultati, per guidare il modello Gemini 3.8 Live su come procedere.
La tabella seguente descrive i casi, il modo in cui il modello dovrebbe rispondere e l'esempio di payload richiesto per assistere il modello:
Richiesta Cosa deve fare il modello Contenuti del payload obbligatori Query valida che non restituisce risultati. Riprovare non servirà. Interrompi la ricerca, informa l'utente e offri alternative. status: 'no_results',
retryable: false,
e un messaggio esplicativo chiaro in linguaggio naturale.Argomento non valido o inesistente (ad esempio, "fornitore errato"). Interrompi la ricerca e chiedi all'utente di chiarire o confermare. status: 'invalid_argument',
reason_code,
retryable: falsee
elencovalid_optionsQuery valida con una finestra vuota. Una query più ampia è davvero utile. Esegui un tentativo ragionevole. status: 'no_results_in_range',
retryable: truee
retry_hintL'esempio seguente mostra un esempio di payload in cui viene chiamato
search_appointment, ma tutte le potenziali date non sono disponibili. L'utente si aspetta di provare un fornitore anziché scorrere le date:def search_appointment(vendor: str, date: Datetime): # BEFORE (Invites Sweeping): { "results": [], "total_available": 0 } # AFTER - Exhausted / Dead End (Stops Sweeping): { "results": [], "status": "no_availability", "retryable": false, "message": "No appointments are available for this provider for the foreseeable future. Searching other dates will not surface anything; openings only come from cancellations.", "suggested_next_step": "offer_waitlist_or_a_different_provider" } # AFTER - Invalid Argument (Prompts User Clarification): { "results": [], "status": "invalid_argument", "reason": "no_such_provider", "retryable": false, "message": "There is no provider named 'Mr. Johnson'. Ask the caller to confirm the name.", "valid_options": ["Dr. Johnson", "Dr. Chen"] }L'esempio seguente mostra la gestione quando
check_user_accountnon restituisce corrispondenze esatte. Il risultato previsto è la modifica della query di ricerca o il trasferimento del controllo all'utente anziché il nuovo tentativo:def check_user_account(user_name: str, phone_suffix: str):... # Checked user account but not existing # BEFORE: insufficient error information { "found": false, "matches": [] } # AFTER: providing sufficient information to the LiveAPI to avoid further retries because the retries have been exhausted. { "status": "EXHAUSTED", "retryable": false, "search_criteria": { "name": "Alex Rivera", "phone_suffix": "4921" }, "search_scope": "Checked active orders, archived accounts, and guest checkouts across all regions.", "guidance": "Exhaustive search completed with 0 matches. Do NOT retry with parameter substrings or variations. Inform the user that no account was found matching those details, and ask if they have an Order ID or billing email." }Norme sui tentativi per le istruzioni di sistema: integra le risposte informative con un vincolo esplicito nelle istruzioni di sistema:
"When a tool returns no results, tell the user the result before calling the tool again. If a call fails for a reason fundamental to the arguments (for example, the entity does not exist), do not silently retry with variations; ask the user to clarify or confirm. You may broaden a query once when a result set is simply empty. Do not run repeated searches with different parameters on your own initiative. Hard cap: Never issue more than two consecutive function calls without saying something back to the user."
Scambio della cronologia delle sessioni
Nell'API Gemini 2.5 Flash Live Native Audio, send_client_content viene utilizzato per
configurare l'inizializzazione della cronologia prima del primo turno e per aggiungere cronologia extra
a metà sessione.
In Gemini 3.8 Live, se vuoi utilizzare il metodo send_client_content
per configurare l'inizializzazione della cronologia, nella sezione HistoryConfig del messaggio di configurazione,
imposta initial_history_in_client_content=True. Dopo aver ricevuto setup_complete.
Puoi quindi chiamare send_client_content ripetutamente per creare la cronologia fino all'ultimo messaggio in cui è impostato turn_complete=True.
Differenze nel comportamento del modello
La seguente tabella descrive le differenze di comportamento del modello per audio, multimodale e output tra l'API Gemini 2.5 Flash Live Native Audio e Gemini 3.8 Live:
| Funzionalità | API Gemini 2.5 Flash Live Audio nativo | Gemini 3.8 Live |
|---|---|---|
| Dialogo empatico | Supportato tramite il flag enable_affective_dialog. |
Sempre attivo per impostazione predefinita. |
| Audio proattivo | Supportato tramite il flag proactivity. |
Sempre attivo per impostazione predefinita. |
| Token fotogramma di immagine o video | Budget predefinito per fotogramma inferiore. | media_resolution è sempre supportato quando vengono passati i frame
dell'immagine. Consente di bilanciare costi e accuratezza. |
| Trascrizione e contenuti | Trascrizione di riferimento stabile. |
Puoi aggiungere custom_vocabulary per fornire un bias alle parole specifiche del dominio e migliorare l'accuratezza.
|
Il seguente codice Python mostra l'impostazione di media_resolution e
custom_vocabulary:
# Example: Setting media_resolution for image frames in Gemini 3.8 Live
from google import genai
from google.genai import types
client = genai.Client()
config = types.LiveConnectConfig(
response_modalities=["AUDIO"],
media_resolution=types.MediaResolution.MEDIA_RESOLUTION_LOW, # or MEDIA_RESOLUTION_LOW or MEDIA_RESOLUTION_MEDIUM
)
async with client.aio.live.connect(
model="gemini-3.8-live",
config=config,
) as session:
# Send image frames with the configured resolution budget
...
# Example: Setting custom_vocabulary for domain-specific word biasing in Gemini 3.8 Live
from google import genai
from google.genai import types
client = genai.Client()
config = types.LiveConnectConfig(
response_modalities=["AUDIO"],
input_audio_transcription=types.AudioTranscriptionConfig(
custom_vocabulary=["Gemini", "MagicWord", "Lagrangian"],
),
)
async with client.aio.live.connect(
model="gemini-3.8-live",
config=config,
) as session:
...
Compatibilità con framework di terze parti
Le sezioni seguenti descrivono il funzionamento dei framework di terze parti con Gemini 3.8 Live:
LiveKit
Il plug-in Google RealtimeModel di LiveKit supporta Gemini 3.8 Live, ma le seguenti impostazioni non sono supportate nel plug-in Google di LiveKit:
thinking_levelenable_affective_dialogproactivity
Ti consigliamo di prestare particolare attenzione quando utilizzi il plug-in Google di LiveKit, perché richiede un adattamento accurato per funzionare con Gemini 3.8 Live.
Pipecat
Pipecat supporta Gemini 3.8 Live, con le seguenti modifiche:
Configurazione del pensiero: rimuovi il livello di ragionamento perché non è supportato da Gemini 3.8 Live.
Pipecat si connette agli endpoint di Agent Platform utilizzando
GoogleVertexLLMServicetramite il connettoreGeminiLiveLLMService.
Telemetria sull'utilizzo dei token a livello di cavo
Ogni turno del server restituisce un frame usage_metadata. Questo vale per
l'API Gemini 2.5 Flash Live Native Audio e Gemini 3.8 Live. I metadati di utilizzo sono più categorizzati, ad esempio token memorizzati nella cache, token di utilizzo degli strumenti, token in diverse modalità e così via.
Limitazioni e mitigazioni note del modello
Per informazioni sulle limitazioni e le mitigazioni note durante lo sviluppo di applicazioni con Gemini 3.8 Live, consulta Limitazioni note.
Elenco di controllo per la migrazione
Di seguito è riportato un elenco di controllo per la migrazione dei client che puoi utilizzare durante la migrazione dall'API Gemini 2.5 Flash Live Native Audio a Gemini 3.8 Live:
Chiamata di funzione:
Risposte informative degli strumenti: refattorizza tutti i gestori degli strumenti per restituire codici di stato espliciti, flag di ripetizione e spiegazioni in linguaggio naturale. Non restituire mai
Nonenudo o{}vuoto.Norme sulle istruzioni di sistema: aggiungi vincoli espliciti che vietano i nuovi tentativi silenziosi degli strumenti, richiedono la conferma dell'utente in caso di errori degli argomenti e limitano le chiamate consecutive agli strumenti.
Corrispondenza dell'ID chiamata allo strumento: assicurati che
FunctionResponsepassiid=fc.idin ogni risposta dello strumento.Modifica del comportamento di pianificazione delle funzioni: quando l'utente parla, il
scheduling=interruptviene declassato ascheduling=when_idleper offrire un'esperienza utente più fluida.
Sessione: limita
send_client_content: utilizzasend_client_contentper impostare la cronologia iniziale fornendo unHistoryConfigragionevole.Pensiero: elimina gli hack di pensiero a livello di prompt: per evitare l'interruzione dell'audio, rimuovi tutto il testo del prompt che tenta di imporre schemi di pensiero passo passo o limiti di token.