Multimodal Live API

Interfejs API Multimodal Live umożliwia dwukierunkowe interakcje z użyciem głosu i wideo z niewielkimi opóźnieniami dzięki Gemini. Dzięki interfejsowi API Multimodal Live możesz zapewnić użytkownikom naturalne, ludzkie konwersacje głosowe oraz możliwość przerywania odpowiedzi modelu za pomocą poleceń głosowych. Model może przetwarzać tekst, dźwięk i wideo, a także generować tekst i dźwięk.

Interfejs API Multimodal Live możesz wypróbować w Google AI Studio.

Korzystanie z interfejsu Multimodal Live API

W tej sekcji opisaliśmy, jak używać interfejsu API Multimodal Live z jednym z naszych pakietów SDK. Więcej informacji o interfejsie WebSockets API znajdziesz w dokumentacji WebSockets API.

Wysyłanie i odbieranie SMS-ów

import asyncio
from google import genai

client = genai.Client(api_key="GEMINI_API_KEY", http_options={'api_version': 'v1alpha'})
model = "gemini-2.0-flash-exp"

config = {"response_modalities": ["TEXT"]}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        while True:
            message = input("User> ")
            if message.lower() == "exit":
                break
            await session.send(input=message, end_of_turn=True)

            async for response in session.receive():
                if response.text is not None:
                    print(response.text, end="")

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

Odbieranie dźwięku

Ten przykład pokazuje, jak odbierać dane audio i zapisywać je w pliku .wav.

import asyncio
import wave
from google import genai

client = genai.Client(api_key="GEMINI_API_KEY", http_options={'api_version': 'v1alpha'})
model = "gemini-2.0-flash-exp"

config = {"response_modalities": ["AUDIO"]}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        wf = wave.open("audio.wav", "wb")
        wf.setnchannels(1)
        wf.setsampwidth(2)
        wf.setframerate(24000)

        message = "Hello? Gemini are you there?"
        await session.send(input=message, end_of_turn=True)

        async for idx,response in async_enumerate(session.receive()):
            if response.data is not None:
                wf.writeframes(response.data)

            # Comment this out to print audio data info
            # if response.server_content.model_turn is not None:
            #      print(response.server_content.model_turn.parts[0].inline_data.mime_type)

        wf.close()

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

Formaty audio

Interfejs API Multimodal Live obsługuje te formaty audio:

  • Format audio wejściowego: surowy 16-bitowy PCM z częstotliwością 16 kHz w formacie little-endian
  • Format wyjściowy dźwięku: surowy 16-bitowy dźwięk PCM z częstotliwością 24 kHz w formacie little-endian

strumieniowanie dźwięku i obrazu,

Instrukcje systemowe

Instrukcje systemu umożliwiają kierowanie działaniem modelu na podstawie konkretnych potrzeb i przypadków użycia. Instrukcje dotyczące systemu można ustawić w konfiguracji i będą one obowiązywać przez całą sesję.

from google.genai import types

config = {
    "system_instruction": types.Content(
        parts=[
            types.Part(
                text="You are a helpful assistant and answer in a friendly tone."
            )
        ]
    ),
    "response_modalities": ["TEXT"],
}

Przyrostowe aktualizacje treści

Używaj przyrostowych aktualizacji, aby wysyłać dane wejściowe tekstowe, ustalać kontekst sesji lub przywracać kontekst sesji. W przypadku krótkich kontekstów możesz wysyłać interakcje krok po kroku, aby reprezentować dokładną sekwencję zdarzeń:

PythonJSON
from google.genai import types

turns = [
    types.Content(parts=[types.Part(text="What is the capital of France?")], role="user"),
    types.Content(parts=[types.Part(text="Paris")], role="model")
]
await session.send(input=types.LiveClientContent(turns=turns))

turns = [types.Content(parts=[types.Part(text="What is the capital of Germany?")], role="user")]
await session.send(input=types.LiveClientContent(turns=turns, turn_complete=True))
{
  "clientContent": {
    "turns": [
      {
        "parts":[
          {
            "text": ""
          }
        ],
        "role":"user"
      },
      {
        "parts":[
          {
            "text": ""
          }
        ],
        "role":"model"
      }
    ],
    "turnComplete": true
  }
}

W przypadku dłuższych kontekstów zalecamy podanie podsumowania w jednej wiadomości, aby zwolnić okno kontekstu na potrzeby kolejnych interakcji.

Zmień głosy

Interfejs API Multimodal Live obsługuje te głosy: Aoede, Charon, Fenrir, Kore i Puck.

Aby określić głos, ustaw nazwę głosu w obiekcie speechConfig w ramach konfiguracji sesji:

PythonJSON
from google.genai import types

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    speech_config=types.SpeechConfig(
        voice_config=types.VoiceConfig(
            prebuilt_voice_config=types.PrebuiltVoiceConfig(voice_name="Kore")
        )
    )
)
{
  "voiceConfig": {
    "prebuiltVoiceConfig": {
      "voiceName": "Kore"
    }
  }
}

Korzystanie z wywołania funkcji

Za pomocą interfejsu Multimodal Live API możesz definiować narzędzia. Aby dowiedzieć się więcej o wywoływaniu funkcji, zapoznaj się z samouczkiem dotyczącym wywoływania funkcji.

Narzędzia muszą być zdefiniowane w ramach konfiguracji sesji:

config = types.LiveConnectConfig(
    response_modalities=["TEXT"],
    tools=[set_light_values]
)

async with client.aio.live.connect(model=model, config=config) as session:
    await session.send(input="Turn the lights down to a romantic level", end_of_turn=True)

    async for response in session.receive():
        print(response.tool_call)

Na podstawie jednego prompta model może wygenerować wiele wywołań funkcji i kodu niezbędnego do połączenia ich danych wyjściowych. Ten kod jest wykonywany w środowisku piaskownicy, generując kolejne wiadomości BidiGenerateContentToolCall. Wykonanie zostaje wstrzymane do czasu, aż będą dostępne wyniki każdego wywołania funkcji, co zapewnia przetwarzanie sekwencyjne.

Klient powinien odpowiedzieć, podając BidiGenerateContentToolResponse.

Wejścia i wyjścia audio negatywnie wpływają na zdolność modelu do używania funkcji wywoływania.

Zarządzanie powiadomieniami

Użytkownicy mogą w dowolnym momencie przerwać działanie modelu. Gdy wykrywanie aktywności związanej z głosem (VAD) wykryje przerwanie, trwające generowanie zostanie anulowane i odrzucone. W historii sesji są przechowywane tylko informacje już wysłane do klienta. Następnie serwer wysyła wiadomość BidiGenerateContentServerContent, aby zgłosić przerwanie.

Dodatkowo serwer Gemini odrzuca wszystkie oczekujące wywołania funkcji i wysyła wiadomość BidiGenerateContentServerContent z identyfikatorami anulowanych wywołań.

async for response in session.receive():
    if response.server_content.interrupted is not None:
        # The generation was interrupted

Ograniczenia

Podczas planowania projektu weź pod uwagę te ograniczenia interfejsu Multimodal Live API i Gemini 2.0.

Uwierzytelnianie klienta

Interfejs Multimodal Live API zapewnia uwierzytelnianie serwera z serwerem i nie jest zalecany do bezpośredniego użycia przez klienta. Dane wejściowe klienta powinny być kierowane przez pośredni serwer aplikacji, aby zapewnić bezpieczne uwierzytelnianie za pomocą interfejsu Multimodal Live API.

Historia rozmowy

Model śledzi interakcje w ramach sesji, ale historia rozmowy nie jest przechowywana. Po zakończeniu sesji odpowiedni kontekst jest usuwany.

Aby przywrócić poprzednią sesję lub przekazać modelowi historyczny kontekst interakcji z użytkownikiem, aplikacja powinna prowadzić własny dziennik rozmów i używać wiadomości BidiGenerateContentClientContent do wysyłania tych informacji na początku nowej sesji.

Maksymalny czas trwania sesji

Czas trwania sesji jest ograniczony do 15 minut w przypadku dźwięku lub do 2 minut w przypadku dźwięku i obrazu. Gdy czas trwania sesji przekroczy limit, połączenie zostanie zakończone.

Model jest też ograniczony rozmiarem kontekstu. Wysyłanie dużych fragmentów treści wraz ze strumieniami wideo i dźwięku może spowodować wcześniejsze zakończenie sesji.

wykrywanie aktywności głosowej (VAD);

Model automatycznie wykrywa aktywność głosową (VAD) w ciągłym strumieniu danych wejściowych audio. Funkcja VAD jest zawsze włączona, a jej parametry nie są konfigurowalne.

Liczba tokenów

Liczba tokenów nie jest obsługiwana.

Ograniczenia liczby żądań

Obowiązują te limity szybkości:

  • 3 jednoczesne sesje na klucz interfejsu API
  • 4 mln tokenów na minutę

Materiały referencyjne interfejsu WebSocket API

Interfejs API Multimodal Live to interfejs stateful API, który korzysta z WebSockets. W tej sekcji znajdziesz dodatkowe informacje o interfejsie WebSockets API.

Sesje

Połączenie WebSocket nawiązuje sesję między klientem a serwerem Gemini. Gdy klient inicjuje nowe połączenie, sesja może wymieniać się wiadomościami z serwerem, aby:

  • Wysyłanie tekstu, dźwięku lub filmu na serwer Gemini.
  • odbierać prośby o wykonanie funkcji, wysłane z serwera Gemini.

Początkowy komunikat po nawiązaniu połączenia określa konfigurację sesji, która obejmuje model, parametry generowania, instrukcje systemowe i narzędzia.

Poniżej znajdziesz przykładową konfigurację. Pamiętaj, że wielkość liter w nazwach pakietów SDK może się różnić. Opcje konfiguracji pakietu Python SDK możesz sprawdzić tutaj.


{
 
"model": string,
 
"generationConfig": {
   
"candidateCount": integer,
   
"maxOutputTokens": integer,
   
"temperature": number,
   
"topP": number,
   
"topK": integer,
   
"presencePenalty": number,
   
"frequencyPenalty": number,
   
"responseModalities": [string],
   
"speechConfig": object
 
},
 
"systemInstruction": string,
 
"tools": [object]
}

Wysyłanie wiadomości

Aby wymieniać wiadomości przez połączenie WebSocket, klient musi wysłać obiekt JSON przez otwarte połączenie WebSocket. Obiekt JSON musi mieć dokładnie jedno z tych pól:


{
 
"setup": BidiGenerateContentSetup,
 
"clientContent": BidiGenerateContentClientContent,
 
"realtimeInput": BidiGenerateContentRealtimeInput,
 
"toolResponse": BidiGenerateContentToolResponse
}

Obsługiwane wiadomości od klienta

W tabeli poniżej znajdziesz obsługiwane wiadomości od klienta:

Wiadomość Opis
BidiGenerateContentSetup Konfiguracja sesji do wysłania w pierwszej wiadomości
BidiGenerateContentClientContent Przyrostowa aktualizacja treści bieżącej rozmowy przesyłana z klienta
BidiGenerateContentRealtimeInput wejście audio lub wideo w czasie rzeczywistym,
BidiGenerateContentToolResponse Odpowiedź na ToolCallMessage otrzymaną z serwera

Odbieranie wiadomości

Aby otrzymywać wiadomości od Gemini, nasłuchuj zdarzenia WebSocket „message”, a potem przeanalizuj wynik zgodnie z definicją obsługiwanych wiadomości serwera.

Zapoznaj się z tymi informacjami:

async with client.aio.live.connect(model='...', config=config) as session:
    await session.send(input='Hello world!', end_of_turn=True)
    async for message in session.receive():
        print(message)

Komunikaty serwera będą zawierać dokładnie jedno z tych pól z podanego zestawu obiektów:


{
 
"setupComplete": BidiGenerateContentSetupComplete,
 
"serverContent": BidiGenerateContentServerContent,
 
"toolCall": BidiGenerateContentToolCall,
 
"toolCallCancellation": BidiGenerateContentToolCallCancellation
}

Obsługiwane komunikaty serwera

Obsługiwane komunikaty serwera znajdziesz w tabeli poniżej:

Wiadomość Opis
BidiGenerateContentSetupComplete wiadomość BidiGenerateContentSetup od klienta, wysłana po zakończeniu konfiguracji;
BidiGenerateContentServerContent Treści wygenerowane przez model w odpowiedzi na wiadomość od klienta
BidiGenerateContentToolCall Poproś klienta o wykonanie wywołań funkcji i zwrócenie odpowiedzi z odpowiednimi identyfikatorami
BidiGenerateContentToolCallCancellation Wysyłane, gdy wywołanie funkcji zostanie anulowane, ponieważ użytkownik przerwał działanie modelu

Wiadomości i zdarzenia

BidiGenerateContentClientContent

Przyrostowa aktualizacja bieżącej rozmowy przesyłana z klienta. Wszystkie te treści są bezwarunkowo dołączane do historii rozmowy i używane jako część promptu do generowania treści.

Komunikat w tym miejscu przerwie bieżące generowanie modelu.

Pola
turns[]

Content

Opcjonalnie: Treść dołączona do bieżącej rozmowy z modelem.

W przypadku zapytań z jednym ruchem jest to pojedyncza instancja. W przypadku zapytań wieloetapowych jest to powtarzalne pole, które zawiera historię rozmowy i ostatnie żądanie.

turn_complete

bool

Opcjonalnie: Jeśli to ustawienie ma wartość true, generowanie treści na serwerze powinno się rozpocząć od aktualnie gromadzonego promptu. W przeciwnym razie serwer czeka na dodatkowe wiadomości, zanim rozpocznie generowanie.

BidiGenerateContentRealtimeInput

dane wejściowe użytkownika, które są wysyłane w czasie rzeczywistym;

Różni się ona od BidiGenerateContentClientContent w kilku aspektach:

  • mogą być przesyłane bez przerwy w generowaniu modelu;
  • Jeśli trzeba mieszać dane przeplatane w BidiGenerateContentClientContentBidiGenerateContentRealtimeInput, serwer próbuje zoptymalizować odpowiedź, ale nie ma żadnych gwarancji.
  • Koniec tury nie jest wyraźnie określony, ale wynika z działania użytkownika (np. zakończenia mowy).
  • Dane są przetwarzane stopniowo jeszcze przed zakończeniem tury, aby zoptymalizować szybkie rozpoczęcie odpowiedzi przez model.
  • Zawsze przyjmuje się, że jest to dane wejściowe użytkownika (nie można go używać do wypełniania historii konwersacji). mogą być wysyłane bez przerwy; Model automatycznie wykrywa początek i koniec mowy użytkownika oraz odpowiednio uruchamia lub zatrzymuje przesyłanie odpowiedzi. Dane są przetwarzane stopniowo w miarę ich przychodzenia, co minimalizuje opóźnienia.
Pola
media_chunks[]

Blob

Opcjonalnie: Wstawione bajty danych dla wejścia multimedialnego.

BidiGenerateContentServerContent

Przyrostowa aktualizacja serwera generowana przez model w odpowiedzi na wiadomości od klienta.

Treści są generowane tak szybko, jak to możliwe, a nie w czasie rzeczywistym. Klienci mogą wybrać buforowanie i odtwarzanie w czasie rzeczywistym.

Pola
turn_complete

bool

Tylko dane wyjściowe. Jeśli ma wartość true (prawda), wskazuje, że model został wygenerowany. Generowanie rozpocznie się dopiero po otrzymaniu kolejnych wiadomości od klientów. Może być ustawiony obok content, co oznacza, że content jest ostatnim elementem w tej turze.

interrupted

bool

Tylko dane wyjściowe. Jeśli ma wartość true, oznacza, że wiadomość od klienta przerwała bieżące generowanie modelu. Jeśli klient odtwarza treści w czasie rzeczywistym, jest to dobry sygnał, aby zatrzymać i opróżnić bieżącą kolejkę odtwarzania.

grounding_metadata

GroundingMetadata

Tylko dane wyjściowe. metadane odniesienia dla wygenerowanych treści;

model_turn

Content

Tylko dane wyjściowe. Treści wygenerowane przez model w ramach bieżącej rozmowy z użytkownikiem.

BidiGenerateContentSetup

wiadomość, która zostanie wysłana w pierwszym i jedynym komunikacie od klienta; Zawiera konfigurację, która będzie obowiązywać przez czas trwania sesji strumieniowania.

Klienci powinni zaczekać na wiadomość BidiGenerateContentSetupComplete, zanim wyślą kolejne wiadomości.

Pola
model

string

Wymagany. Nazwa zasobu modelu. Jest to identyfikator modelu, którego chcesz użyć.

Format: models/{model}

generation_config

GenerationConfig

Opcjonalnie: Konfiguracja generowania.

Nieobsługiwane są następujące pola:

  • responseLogprobs
  • responseMimeType
  • logprobs
  • responseSchema
  • stopSequence
  • routingConfig
  • audioTimestamp
system_instruction

Content

Opcjonalnie: Użytkownik podał instrukcje systemowe dotyczące modelu.

Uwaga: w częściach można używać tylko tekstu. Treści w każdej części będą znajdować się w osobnym akapicie.

tools[]

Tool

Opcjonalnie: Lista Tools, których model może użyć do wygenerowania następnej odpowiedzi.

Tool to fragment kodu, który umożliwia systemowi interakcję z systemami zewnętrznymi w celu wykonania działania lub zestawu działań wykraczających poza wiedzę i zakres modelu.

BidiGenerateContentSetupComplete

Ten typ nie ma pól.

Wysłano w odpowiedzi na wiadomość BidiGenerateContentSetup od klienta.

BidiGenerateContentToolCall

Poproś klienta o wykonanie wywołań funkcji i zwrócenie odpowiedzi z odpowiednimi wartościami id.

Pola
function_calls[]

FunctionCall

Tylko dane wyjściowe. wywołanie funkcji do wykonania,

BidiGenerateContentToolCallCancellation

Powiadomienie dla klienta, że wcześniej wydany ToolCallMessage z określonymi id nie powinien zostać wykonany i powinien zostać anulowany. Jeśli wywołania tych narzędzi miały jakieś skutki uboczne, klienci mogą spróbować cofnąć te wywołania. Ta wiadomość pojawia się tylko wtedy, gdy klienci przerywają kolejność serwera.

Pola
ids[]

string

Tylko dane wyjściowe. Identyfikatory wywołań narzędzia, które mają zostać anulowane.

BidiGenerateContentToolResponse

Odpowiedź wygenerowana przez klienta na ToolCall otrzymaną z serwera. Poszczególne obiekty FunctionResponse są dopasowywane do odpowiednich obiektów FunctionCall za pomocą pola id.

Pamiętaj, że w przypadku wywołania funkcji interfejsów API do generowania treści w wersji unary i z transmisją po stronie serwera następuje wymiana elementów Content, a w przypadku wywołania funkcji interfejsów API do generowania treści w wersji bidi następuje wymiana dedykowanego zestawu wiadomości.

Pola
function_responses[]

FunctionResponse

Opcjonalnie: Odpowiedź na wywołania funkcji.

Więcej informacji o najczęstszych typach

Więcej informacji o najczęściej używanych typach zasobów API Blob, Content, FunctionCall, FunctionResponse, GenerationConfig, GroundingMetadataTool znajdziesz w artykule Generowanie treści.

Integracje z rozwiązaniami innych firm

W przypadku wdrożeń aplikacji internetowych i mobilnych możesz zapoznać się z opcjami dostępnymi w tych usługach: