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ń:
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:
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[] |
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_ |
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
BidiGenerateContentClientContent
iBidiGenerateContentRealtimeInput
, 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_ |
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_ |
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 |
interrupted |
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_ |
Tylko dane wyjściowe. metadane odniesienia dla wygenerowanych treści; |
model_ |
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 |
Wymagany. Nazwa zasobu modelu. Jest to identyfikator modelu, którego chcesz użyć. Format: |
generation_ |
Opcjonalnie: Konfiguracja generowania. Nieobsługiwane są następujące pola:
|
system_ |
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[] |
Opcjonalnie: Lista
|
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_ |
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[] |
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_ |
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
, GroundingMetadata
i Tool
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: