API Multimodal Live mundëson ndërveprime dydrejtimëshe me zë dhe video me vonesë të ulët me Gemini. Duke përdorur Multimodal Live API, ju mund t'u ofroni përdoruesve të fundit përvojën e bisedave zanore natyrale, të ngjashme me njerëzit, dhe aftësinë për të ndërprerë përgjigjet e modelit duke përdorur komandat zanore. Modeli mund të përpunojë hyrjen e tekstit, audio dhe video, dhe mund të sigurojë dalje teksti dhe audio.
Mund të provoni Multimodal Live API në Google AI Studio .
Përdorni API Multimodal Live
Ky seksion përshkruan se si të përdoret API Multimodal Live me një nga SDK-të tona. Për më shumë informacion në lidhje me API-në themelore të WebSockets, shihni referencën e WebSockets API më poshtë.
Dërgo dhe merr tekst
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())
Merr audio
Shembulli i mëposhtëm tregon se si të merrni të dhëna audio dhe t'i shkruani ato në një skedar .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())
Formatet audio
Multimodal Live API mbështet formatet e mëposhtme të audios:
- Formati i hyrjes së audios: Audio PCM e papërpunuar 16 bit në 16 kHz pak-endian
- Formati i daljes së audios: Audio PCM e papërpunuar 16 bit në 24 kHz pak-endian
Transmetoni audio dhe video
Udhëzimet e sistemit
Udhëzimet e sistemit ju lejojnë të drejtoni sjelljen e një modeli bazuar në nevojat tuaja specifike dhe rastet e përdorimit. Udhëzimet e sistemit mund të vendosen në konfigurimin e konfigurimit dhe do të mbeten në fuqi për të gjithë seancën.
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"],
}
Përditësimet në rritje të përmbajtjes
Përdorni përditësime shtesë për të dërguar të dhëna teksti, për të krijuar kontekstin e sesionit ose për të rivendosur kontekstin e sesionit. Për kontekste të shkurtra, mund të dërgoni ndërveprime kthesë pas kthese për të përfaqësuar sekuencën e saktë të ngjarjeve:
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
}
}
Për kontekste më të gjata, rekomandohet të sigurohet një përmbledhje e vetme e mesazhit për të liruar dritaren e kontekstit për ndërveprimet e mëvonshme.
Ndryshoni zërat
Multimodal Live API mbështet zërat e mëposhtëm: Aoede, Charon, Fenrir, Kore dhe Puck.
Për të specifikuar një zë, vendosni emrin e zërit brenda objektit speechConfig
si pjesë e konfigurimit të sesionit:
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"
}
}
}
Përdorni thirrjen e funksionit
Ju mund të përcaktoni mjete me API Multimodal Live. Shikoni udhëzuesin e thirrjes së funksionit për të mësuar më shumë rreth thirrjes së funksionit.
Mjetet duhet të përcaktohen si pjesë e konfigurimit të sesionit:
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)
Nga një kërkesë e vetme, modeli mund të gjenerojë thirrje të shumëfishta funksionesh dhe kodin e nevojshëm për zinxhirin e daljeve të tyre. Ky kod ekzekutohet në një mjedis sandbox, duke gjeneruar mesazhe të mëvonshme BidiGenerateContentToolCall . Ekzekutimi ndalon derisa rezultatet e çdo thirrjeje funksioni të jenë të disponueshme, gjë që siguron përpunim vijues.
Klienti duhet të përgjigjet me BidiGenerateContentToolResponse .
Hyrjet dhe daljet audio ndikojnë negativisht në aftësinë e modelit për të përdorur thirrjen e funksionit.
Trajtoni ndërprerjet
Përdoruesit mund të ndërpresin daljen e modelit në çdo kohë. Kur Zbulimi i aktivitetit zanor (VAD) zbulon një ndërprerje, gjenerimi në vazhdim anulohet dhe hidhet poshtë. Vetëm informacioni i dërguar tashmë klientit ruhet në historikun e sesionit. Serveri më pas dërgon një mesazh BidiGenerateContentServerContent për të raportuar ndërprerjen.
Përveç kësaj, serveri Gemini hedh poshtë çdo thirrje funksioni në pritje dhe dërgon një mesazh BidiGenerateContentServerContent
me ID-të e thirrjeve të anuluara.
async for response in session.receive():
if response.server_content.interrupted is not None:
# The generation was interrupted
Kufizimet
Merrni parasysh kufizimet e mëposhtme të Multimodal Live API dhe Gemini 2.0 kur planifikoni projektin tuaj.
Autentifikimi i klientit
Multimodal Live API ofron vetëm vërtetim nga serveri në server dhe nuk rekomandohet për përdorim të drejtpërdrejtë të klientit. Hyrja e klientit duhet të drejtohet përmes një serveri të ndërmjetëm aplikacioni për vërtetim të sigurt me API Multimodal Live.
Historia e bisedave
Ndërsa modeli mban gjurmët e ndërveprimeve gjatë sesionit, historiku i bisedave nuk ruhet. Kur përfundon një sesion, konteksti përkatës fshihet.
Për të rivendosur një sesion të mëparshëm ose për t'i dhënë modelit kontekstin historik të ndërveprimeve të përdoruesve, aplikacioni duhet të mbajë regjistrin e vet të bisedave dhe të përdorë një mesazh BidiGenerateContentClientContent për të dërguar këtë informacion në fillim të një sesioni të ri.
Kohëzgjatja maksimale e seancës
Kohëzgjatja e seancës është e kufizuar deri në 15 minuta për audio ose deri në 2 minuta audio dhe video. Kur kohëzgjatja e seancës tejkalon kufirin, lidhja ndërpritet.
Modeli kufizohet gjithashtu nga madhësia e kontekstit. Dërgimi i pjesëve të mëdha të përmbajtjes së bashku me transmetimet video dhe audio mund të rezultojë në përfundimin e mëparshëm të sesionit.
Zbulimi i aktivitetit zanor (VAD)
Modeli kryen automatikisht zbulimin e aktivitetit zanor (VAD) në një transmetim të vazhdueshëm të hyrjes audio. VAD është gjithmonë i aktivizuar dhe parametrat e tij nuk janë të konfigurueshëm.
Numri i shenjave
Numri i tokenit nuk mbështetet.
Kufijtë e tarifave
Zbatohen kufijtë e mëposhtëm të tarifave:
- 3 seanca të njëkohshme për çelësin API
- 4 milion argumente në minutë
Referenca e API-së së WebSockets
Multimodal Live API është një API shtetërore që përdor WebSockets . Në këtë seksion, do të gjeni detaje shtesë në lidhje me API-në e WebSockets.
Sesionet
Një lidhje WebSocket krijon një seancë midis klientit dhe serverit Gemini. Pasi një klient fillon një lidhje të re, sesioni mund të shkëmbejë mesazhe me serverin për:
- Dërgoni tekst, audio ose video te serveri Gemini.
- Merr kërkesa për thirrje audio, teksti ose funksioni nga serveri Gemini.
Mesazhi fillestar pas lidhjes përcakton konfigurimin e sesionit, i cili përfshin modelin, parametrat e gjenerimit, udhëzimet e sistemit dhe mjetet.
Shihni shembullin e mëposhtëm të konfigurimit. Vini re se kutia e emrit në SDK mund të ndryshojë. Mund të kërkoni opsionet e konfigurimit të Python SDK këtu .
{
"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]
}
Dërgo mesazhe
Për të shkëmbyer mesazhe përmes lidhjes WebSocket, klienti duhet të dërgojë një objekt JSON mbi një lidhje të hapur WebSocket. Objekti JSON duhet të ketë saktësisht një nga fushat nga grupi i mëposhtëm i objekteve:
{
"setup": BidiGenerateContentSetup,
"clientContent": BidiGenerateContentClientContent,
"realtimeInput": BidiGenerateContentRealtimeInput,
"toolResponse": BidiGenerateContentToolResponse
}
Mesazhet e klientit të mbështetur
Shihni mesazhet e klientit të mbështetur në tabelën e mëposhtme:
Mesazh | Përshkrimi |
---|---|
BidiGenerateContentSetup | Konfigurimi i sesionit do të dërgohet në mesazhin e parë |
BidiGenerateContentClientContent | Përditësimi në rritje i përmbajtjes së bisedës aktuale të dorëzuar nga klienti |
BidiGenerateContentRealtimeInput | Hyrja audio ose video në kohë reale |
BidiGenerateContentToolResponse | Përgjigja ndaj një ToolCallMessage të marrë nga serveri |
Merr mesazhe
Për të marrë mesazhe nga Gemini, dëgjoni për ngjarjen 'mesazh' në WebSocket dhe më pas analizoni rezultatin sipas përcaktimit të mesazheve të serverit të mbështetur.
Shihni sa vijon:
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)
Mesazhet e serverit do të kenë saktësisht një nga fushat nga grupi i mëposhtëm i objekteve:
{
"setupComplete": BidiGenerateContentSetupComplete,
"serverContent": BidiGenerateContentServerContent,
"toolCall": BidiGenerateContentToolCall,
"toolCallCancellation": BidiGenerateContentToolCallCancellation
}
Mesazhet e serverit të mbështetur
Shihni mesazhet e serverit të mbështetur në tabelën e mëposhtme:
Mesazh | Përshkrimi |
---|---|
BidiGenerateContentSetupComplete | Një mesazh BidiGenerateContentSetup nga klienti, i dërguar kur të përfundojë konfigurimi |
BidiGenerateContentServerContent | Përmbajtja e krijuar nga modeli në përgjigje të një mesazhi të klientit |
BidiGenerateContentToolCall | Kërkoni që klienti të ekzekutojë thirrjet e funksionit dhe të kthejë përgjigjet me ID-të që përputhen |
BidiGenerateContentToolCallCancellation | Dërgohet kur një thirrje funksioni anulohet për shkak të ndërprerjes së daljes së modelit nga përdoruesi |
Mesazhet dhe ngjarjet
BidiGenerateContentClientContent
Përditësimi në rritje i bisedës aktuale të dorëzuar nga klienti. E gjithë përmbajtja këtu i shtohet pa kushte historisë së bisedave dhe përdoret si pjesë e kërkesës për modelin për të gjeneruar përmbajtje.
Një mesazh këtu do të ndërpresë çdo gjenerim aktual të modelit.
Fushat | |
---|---|
turns[] | Fakultative. Përmbajtja i është bashkangjitur bisedës aktuale me modelen. Për pyetjet me një kthesë, ky është një shembull i vetëm. Për pyetjet me shumë kthesa, kjo është një fushë e përsëritur që përmban historikun e bisedave dhe kërkesën më të fundit. |
turn_ complete | Fakultative. Nëse është e vërtetë, tregon që gjenerimi i përmbajtjes së serverit duhet të fillojë me kërkesën e akumuluar aktualisht. Përndryshe, serveri pret mesazhe shtesë përpara se të fillojë gjenerimin. |
BidiGenerateContentInputRealtime
Hyrja e përdoruesit që dërgohet në kohë reale.
Kjo është e ndryshme nga BidiGenerateContentClientContent
në disa mënyra:
- Mund të dërgohet vazhdimisht pa ndërprerje në gjenerimin e modelit.
- Nëse ka nevojë për të përzier të dhënat e ndërthurura në
BidiGenerateContentClientContent
dheBidiGenerateContentRealtimeInput
, serveri përpiqet të optimizojë për përgjigjen më të mirë, por nuk ka garanci. - Fundi i radhës nuk është specifikuar në mënyrë eksplicite, por rrjedh nga aktiviteti i përdoruesit (për shembull, fundi i fjalës).
- Edhe para fundit të kthesës, të dhënat përpunohen në mënyrë incrementale për të optimizuar për një fillim të shpejtë të përgjigjes nga modeli.
- Gjithmonë supozohet të jetë hyrja e përdoruesit (nuk mund të përdoret për të mbushur historinë e bisedave). Mund të dërgohet vazhdimisht pa ndërprerje. Modeli zbulon automatikisht fillimin dhe fundin e fjalimit të përdoruesit dhe fillon ose përfundon transmetimin e përgjigjes në përputhje me rrethanat. Të dhënat përpunohen në mënyrë graduale ndërsa mbërrijnë, duke minimizuar vonesën.
Fushat | |
---|---|
media_ chunks[] | Fakultative. Të dhënat e bajteve të rreshtuara për hyrjen e medias. |
BidiGenerateContentServerContent
Përditësimi në rritje i serverit i krijuar nga modeli në përgjigje të mesazheve të klientit.
Përmbajtja gjenerohet sa më shpejt që të jetë e mundur, dhe jo në kohë reale. Klientët mund të zgjedhin ta ruajnë dhe ta luajnë atë në kohë reale.
Fushat | |
---|---|
turn_ complete | Vetëm dalje. Nëse është e vërtetë, tregon që modeli ka përfunduar duke gjeneruar. Gjenerimi do të fillojë vetëm në përgjigje të mesazheve shtesë të klientit. Mund të vendoset krahas |
interrupted | Vetëm dalje. Nëse është e vërtetë, tregon se një mesazh klienti ka ndërprerë gjenerimin aktual të modelit. Nëse klienti po luan përmbajtjen në kohë reale, ky është një sinjal i mirë për të ndaluar dhe zbrazur radhën aktuale të riprodhimit. |
grounding_ metadata | Vetëm dalje. Tokëzimi i meta të dhënave për përmbajtjen e krijuar. |
model_ turn | Vetëm dalje. Përmbajtja që modeli ka gjeneruar si pjesë e bisedës aktuale me përdoruesin. |
BidiGenerateContentSetup
Mesazhi do të dërgohet në mesazhin e parë dhe të vetëm të klientit. Përmban konfigurimin që do të zbatohet për kohëzgjatjen e sesionit të transmetimit.
Klientët duhet të presin për një mesazh BidiGenerateContentSetupComplete
përpara se të dërgojnë ndonjë mesazh shtesë.
Fushat | |
---|---|
model | E detyrueshme. Emri i burimit të modelit. Kjo shërben si një ID për Modelin për t'u përdorur. Formati: |
generation_ config | Fakultative. Konfigurimi i gjeneratës. Fushat e mëposhtme nuk mbështeten:
|
system_ instruction | Fakultative. Përdoruesi dha udhëzime të sistemit për modelin. Shënim: Vetëm teksti duhet të përdoret në pjesë. Përmbajtja në secilën pjesë do të jetë në një paragraf të veçantë. |
tools[] | Fakultative. Një listë e Një |
BidiGenerateContentSetupComplete
Ky lloj nuk ka fusha.
Dërguar si përgjigje ndaj një mesazhi BidiGenerateContentSetup
nga klienti.
BidiGenerateContentToolCall
Kërkoni që klienti të ekzekutojë thirrjet e funksionit dhe të kthejë përgjigjet me id
-në që përputhen.
Fushat | |
---|---|
function_ calls[] | Vetëm dalje. Thirrja e funksionit që do të ekzekutohet. |
BidiGenerateContentToolCallCancellation
Njoftim për klientin se një ToolCallMessage
e lëshuar më parë me id
-të e specifikuara nuk duhej të ishte ekzekutuar dhe duhet të anulohej. Nëse ka pasur efekte anësore në ato thirrje të veglave, klientët mund të përpiqen të zhbëjnë thirrjet e veglave. Ky mesazh shfaqet vetëm në rastet kur klientët ndërpresin kthesat e serverit.
Fushat | |
---|---|
ids[] | Vetëm dalje. ID-të e mjetit thërret për t'u anuluar. |
BidiGenerateContentToolResponse
Klienti gjeneroi përgjigje ndaj një ToolCall
të marrë nga serveri. Objektet individuale FunctionResponse
përputhen me objektet përkatëse FunctionCall
nga fusha id
.
Vini re se në funksionin GenerateContent API-të unare dhe të transmetimit të serverit, thirrja ndodh duke shkëmbyer pjesët e Content
, ndërsa në funksionin e GenerateContent API-të bidi thirrja ndodh mbi këto grupe të dedikuara mesazhesh.
Fushat | |
---|---|
function_ responses[] | Fakultative. Përgjigja ndaj thirrjeve të funksionit. |
Më shumë informacion mbi llojet e zakonshme
Për më shumë informacion mbi llojet e burimeve të përdorura zakonisht të API Blob
, Content
, FunctionCall
, FunctionResponse
, GenerationConfig
, GroundingMetadata
dhe Tool
, shihni Gjenerimi i përmbajtjes .
Integrimet e palëve të treta
Për vendosjen e aplikacioneve në ueb dhe celular, mund të eksploroni opsionet nga: