Live API

API Live mundëson ndërveprime zanore dhe video dydrejtimëshe me vonesë të ulët me Gemini. Duke përdorur API-në Live, ju mund t'u ofroni përdoruesve fundorë 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 Live API në Google AI Studio .

Çfarë ka të re

Shikoni Changelog për veçoritë dhe aftësitë e reja më të fundit në Live API!

Përdorni API-në e drejtpërdrejtë

Ky seksion përshkruan se si të përdorni API-në e drejtpërdrejtë 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 .

Për të përdorur të gjitha veçoritë, sigurohuni që të instaloni versionin më të fundit të SDK-së, p.sh., pip install -U google-genai .

Dërgoni dhe merrni tekst

import asyncio
from google import genai

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

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_client_content(
                turns={"role": "user", "parts": [{"text": message}]}, turn_complete=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")
model = "gemini-2.0-flash-live-001"

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_client_content(
            turns={"role": "user", "parts": [{"text": message}]}, turn_complete=True
        )

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

            # Un-comment this code 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

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:

turns = [
    {"role": "user", "parts": [{"text": "What is the capital of France?"}]},
    {"role": "model", "parts": [{"text": "Paris"}]},
]

await session.send_client_content(turns=turns, turn_complete=False)

turns = [{"role": "user", "parts": [{"text": "What is the capital of Germany?"}]}]

await session.send_client_content(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

API Live mbështet zërat e mëposhtëm: Puck, Charon, Kore, Fenrir, Aoede, Leda, Orus dhe Zephyr.

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"
    }
  }
}

Ndrysho gjuhën

API Live mbështet shumë gjuhë .

Për të ndryshuar gjuhën, vendosni kodin e gjuhës brenda objektit speechConfig si pjesë e konfigurimit të sesionit:

from google.genai import types

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    speech_config=types.SpeechConfig(
        language_code="de-DE",
    )
)

Përdorni mjete

Mund të përcaktoni mjete të tilla si Thirrja e funksionit , ekzekutimi i kodit dhe Kërkimi në Google me API-në e drejtpërdrejtë.

Përdorni thirrjen e funksionit

Ju mund të përcaktoni deklaratat e funksioneve si pjesë e konfigurimit të sesionit. Shikoni tutorialin e thirrjes së funksionit për të mësuar më shumë.

Pas marrjes së thirrjeve të veglave, klienti duhet të përgjigjet me një listë të objekteve FunctionResponse duke përdorur metodën session.send_tool_response .

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

# Simple function definitions
turn_on_the_lights = {"name": "turn_on_the_lights"}
turn_off_the_lights = {"name": "turn_off_the_lights"}

tools = [{"function_declarations": [turn_on_the_lights, turn_off_the_lights]}]
config = {"response_modalities": ["TEXT"], "tools": tools}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        prompt = "Turn on the lights please"
        await session.send_client_content(turns={"parts": [{"text": prompt}]})

        async for chunk in session.receive():
            if chunk.server_content:
                if chunk.text is not None:
                    print(chunk.text)
            elif chunk.tool_call:
                function_responses = []
                for fc in tool_call.function_calls:
                    function_response = types.FunctionResponse(
                        id=fc.id,
                        name=fc.name,
                        response={ "result": "ok" } # simple, hard-coded function response
                    )
                    function_responses.append(function_response)

                await session.send_tool_response(function_responses=function_responses)


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

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.

Hyrjet dhe daljet audio ndikojnë negativisht në aftësinë e modelit për të përdorur thirrjen e funksionit.

Përdorni ekzekutimin e kodit

Ju mund të përcaktoni ekzekutimin e kodit si pjesë e konfigurimit të sesionit. Shihni tutorialin e ekzekutimit të kodit për të mësuar më shumë.

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

tools = [{'code_execution': {}}]
config = {"response_modalities": ["TEXT"], "tools": tools}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        prompt = "Compute the largest prime palindrome under 100000."
        await session.send_client_content(turns={"parts": [{"text": prompt}]})

        async for chunk in session.receive():
            if chunk.server_content:
                if chunk.text is not None:
                    print(chunk.text)
            
                model_turn = chunk.server_content.model_turn
                if model_turn:
                    for part in model_turn.parts:
                      if part.executable_code is not None:
                        print(part.executable_code.code)

                      if part.code_execution_result is not None:
                        print(part.code_execution_result.output)

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

Mund të aktivizoni Grounding me Google Search si pjesë e konfigurimit të sesionit. Shihni tutorialin e tokëzimit për të mësuar më shumë.

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

tools = [{'google_search': {}}]
config = {"response_modalities": ["TEXT"], "tools": tools}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        prompt = "When did the last Brazil vs. Argentina soccer match happen?"
        await session.send_client_content(turns={"parts": [{"text": prompt}]})

        async for chunk in session.receive():
            if chunk.server_content:
                if chunk.text is not None:
                    print(chunk.text)

                # The model might generate and execute Python code to use Search
                model_turn = chunk.server_content.model_turn
                if model_turn:
                    for part in model_turn.parts:
                      if part.executable_code is not None:
                        print(part.executable_code.code)

                      if part.code_execution_result is not None:
                        print(part.code_execution_result.output)

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

Kombinoni mjete të shumta

Ju mund të kombinoni shumë mjete brenda API-së Live:

prompt = """
Hey, I need you to do three things for me.

1. Compute the largest prime palindrome under 100000.
2. Then use Google Search to look up information about the largest earthquake in California the week of Dec 5 2024?
3. Turn on the lights

Thanks!
"""

tools = [
    {"google_search": {}},
    {"code_execution": {}},
    {"function_declarations": [turn_on_the_lights, turn_off_the_lights]},
]

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

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 True:
        # The generation was interrupted

Konfiguro zbulimin e aktivitetit zanor (VAD)

Mund të konfiguroni ose çaktivizoni zbulimin e aktivitetit zanor (VAD).

Përdorni VAD automatike

Si parazgjedhje, modeli kryen automatikisht VAD në një transmetim të vazhdueshëm të hyrjes audio. VAD mund të konfigurohet me fushën realtimeInputConfig.automaticActivityDetectionkonfigurimit të konfigurimit .

Kur transmetimi i audios ndalet për më shumë se një sekondë (për shembull, për shkak se përdoruesi ka fikur mikrofonin), duhet të dërgohet një ngjarje audioStreamEnd për të pastruar çdo audio të ruajtur në memorie. Klienti mund të rifillojë dërgimin e të dhënave audio në çdo kohë.

# example audio file to try:
# URL = "https://storage.googleapis.com/generativeai-downloads/data/hello_are_you_there.pcm"
# !wget -q $URL -O sample.pcm
import asyncio
from pathlib import Path
from google import genai

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

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

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        audio_bytes = Path("sample.pcm").read_bytes()

        await session.send_realtime_input(
            audio=types.Blob(data=audio_bytes, mime_type="audio/pcm;rate=16000")
        )

        # if stream gets paused, send:
        # await session.send_realtime_input(audio_stream_end=True)

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

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

Me send_realtime_input , API do t'i përgjigjet audios automatikisht bazuar në VAD. Ndërsa send_client_content shton mesazhe në kontekstin e modelit sipas radhës, send_realtime_input optimizohet për reagim në kurriz të renditjes përcaktuese.

Konfiguro VAD automatike

Për më shumë kontroll mbi aktivitetin VAD, mund të konfiguroni parametrat e mëposhtëm. Shih referencën API për më shumë informacion.

from google.genai import types

config = {
    "response_modalities": ["TEXT"],
    "realtime_input_config": {
        "automatic_activity_detection": {
            "disabled": False, # default
            "start_of_speech_sensitivity": types.StartSensitivity.START_SENSITIVITY_LOW,
            "end_of_speech_sensitivity": types.EndSensitivity.END_SENSITIVITY_LOW,
            "prefix_padding_ms": 20,
            "silence_duration_ms": 100,
        }
    }
}

Çaktivizo VAD-në automatike

Përndryshe, VAD-i automatik mund të çaktivizohet duke vendosur realtimeInputConfig.automaticActivityDetection.disabledtrue në mesazhin e konfigurimit. Në këtë konfigurim klienti është përgjegjës për zbulimin e të folurit të përdoruesit dhe dërgimin e mesazheve activityStart dhe activityEnd në kohën e duhur. Një audioStreamEnd nuk dërgohet në këtë konfigurim. Në vend të kësaj, çdo ndërprerje e transmetimit shënohet nga një mesazh activityEnd .

config = {
    "response_modalities": ["TEXT"],
    "realtime_input_config": {"automatic_activity_detection": {"disabled": True}},
}

async with client.aio.live.connect(model=model, config=config) as session:
    # ...
    await session.send_realtime_input(activity_start=types.ActivityStart())
    await session.send_realtime_input(
        audio=types.Blob(data=audio_bytes, mime_type="audio/pcm;rate=16000")
    )
    await session.send_realtime_input(activity_end=types.ActivityEnd())
    # ...

Merrni numrin e shenjave

Ju mund të gjeni numrin total të argumenteve të konsumuara në fushën usageMetadata të mesazhit të serverit të kthyer.

async for message in session.receive():
    # The server will periodically send messages that include UsageMetadata.
    if message.usage_metadata:
        usage = message.usage_metadata
        print(
            f"Used {usage.total_token_count} tokens in total. Response token breakdown:"
        )
        for detail in usage.response_tokens_details:
            match detail:
                case types.ModalityTokenCount(modality=modality, token_count=count):
                    print(f"{modality}: {count}")

Zgjatni kohëzgjatjen e seancës

Kohëzgjatja maksimale e seancës mund të zgjatet në të pakufizuar me dy mekanizma:

Për më tepër, do të merrni një mesazh GoAway përpara përfundimit të seancës, duke ju lejuar të ndërmerrni veprime të mëtejshme.

Aktivizo ngjeshjen e dritares së kontekstit

Për të aktivizuar sesione më të gjata dhe për të shmangur ndërprerjen e papritur të lidhjes, mund të aktivizoni ngjeshjen e dritares së kontekstit duke vendosur fushën e kontekstitWindowCompression si pjesë e konfigurimit të sesionit.

ContextWindowCompressionConfig , ju mund të konfiguroni një mekanizëm me dritare rrëshqitëse dhe numrin e shenjave që nxisin kompresimin.

from google.genai import types

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    context_window_compression=(
        # Configures compression with default parameters.
        types.ContextWindowCompressionConfig(
            sliding_window=types.SlidingWindow(),
        )
    ),
)

Konfiguro rifillimin e sesionit

Për të parandaluar përfundimin e sesionit kur serveri rivendos periodikisht lidhjen WebSocket, konfiguroni fushën sessionResumption brenda konfigurimit të konfigurimit .

Kalimi i këtij konfigurimi bën që serveri të dërgojë mesazhe SessionResumptionUpdate , të cilat mund të përdoren për të rifilluar seancën duke kaluar shenjën e fundit të rifillimit si SessionResumptionConfig.handle e lidhjes pasuese.

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

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())

Merr një mesazh përpara se seanca të shkëputet

Serveri dërgon një mesazh GoAway që sinjalizon se lidhja aktuale do të ndërpritet së shpejti. Ky mesazh përfshin timeLeft , që tregon kohën e mbetur dhe ju lejon të ndërmerrni veprime të mëtejshme përpara se lidhja të ndërpritet si E ABORTUAR.

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)

Merr një mesazh kur gjenerimi të ketë përfunduar

Serveri dërgon një mesazh gjenerimi i plotë që sinjalizon se modeli ka përfunduar gjenerimin e përgjigjes.

async for response in session.receive():
    if response.server_content.generation_complete is True:
        # The generation is complete

Ndryshoni rezolucionin e medias

Mund të specifikoni rezolucionin e medias për median hyrëse duke vendosur fushën mediaResolution si pjesë e konfigurimit të sesionit:

from google.genai import types

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    media_resolution=types.MediaResolution.MEDIA_RESOLUTION_LOW,
)

Merr transkriptime audio

Mund të aktivizoni transkriptimin e daljes audio të modelit. Gjuha e transkriptimit nxirret nga përgjigja e modelit.

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

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

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        message = "Hello? Gemini are you there?"

        await session.send_client_content(
            turns={"role": "user", "parts": [{"text": message}]}, turn_complete=True
        )

        async for response in session.receive():
            if response.server_content.model_turn:
                print("Model turn:", response.server_content.model_turn)
            if response.server_content.output_transcription:
                print("Transcript:", response.server_content.output_transcription.text)


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

Kufizimet

Merrni parasysh kufizimet e mëposhtme të Live API dhe Gemini 2.0 kur planifikoni projektin tuaj.

Modalitetet e reagimit

Mund të vendosni vetëm një modalitet përgjigjeje ( TEXT ose AUDIO ) për sesion në konfigurimin e sesionit. Përpjekja për të vendosur të dyja do të rezultojë në një mesazh gabimi të konfigurimit. Kjo do të thotë që ju mund ta konfiguroni modelin që të përgjigjet me tekst ose audio, por jo të dyja në të njëjtin seancë.

Autentifikimi i klientit

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 Live API.

Kohëzgjatja e seancës

Kohëzgjatja e sesionit mund të zgjatet në të pakufizuar duke aktivizuar kompresimin e sesionit. Pa kompresim, seancat vetëm me audio janë të kufizuara në 15 minuta dhe seancat audio plus video janë të kufizuara në 2 minuta. Tejkalimi i këtyre kufijve pa kompresim do të ndërpresë lidhjen.

Për më tepër, mund të konfiguroni rifillimin e sesionit për të lejuar klientin të rifillojë një sesion që është përfunduar.

Dritarja e kontekstit

Një seancë ka një kufi të dritares së kontekstit prej 32 mijë shenjash.

Gjuhët e mbështetura

Live API mbështet gjuhët e mëposhtme:

Gjuha Kodi i PKK-47
gjermanisht (Gjermani) de-DE
anglisht (Australi) en-AU
Anglisht (Mbretëria e Bashkuar) en-GB
anglisht (Indi) en-IN
Anglisht (SHBA) en-SHBA
Spanjisht (Shtetet e Bashkuara të Amerikës) es-SHBA
Frëngjisht (Francë) fr-FR
Hindi (Indi) hi-IN
Portugeze (Brazil) pt-BR
Arabisht (Gjenerike) ar-XA
spanjisht (Spanjë) es-ES
Frëngjisht (Kanada) fr-CA
Indonezisht (Indonezi) ID-ID
italisht (Itali) it-IT
japoneze (Japoni) ja-JP
turqisht (Turqi) tr-TR
Vietnamisht (Vietnam) vi-VN
Bengalisht (Indi) bn-IN
Guxharatisht (Indi) gu-IN
Kanada (Indi) kn-IN
Malajalame (Indi) ml-IN
Marathi (Indi) mr-IN
Tamile (Indi) ta-IN
telugu (Indi) te-IN
Hollandisht (Holandë) nl-NL
Koreane (Koreja e Jugut) ko-KR
Mandarin kineze (Kinë) cmn-CN
polake (Poloni) pl-PL
Rusisht (Rusi) ru-RU
Thai (Tajlandë) th-TH

Integrimet e palëve të treta

Për vendosjen e aplikacioneve në ueb dhe celular, mund të eksploroni opsionet nga:

,

API Live mundëson ndërveprime zanore dhe video dydrejtimëshe me vonesë të ulët me Gemini. Duke përdorur API-në Live, ju mund t'u ofroni përdoruesve fundorë 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 Live API në Google AI Studio .

Çfarë ka të re

Shikoni Changelog për veçoritë dhe aftësitë e reja më të fundit në Live API!

Përdorni API-në e drejtpërdrejtë

Ky seksion përshkruan se si të përdorni API-në e drejtpërdrejtë 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 .

Për të përdorur të gjitha veçoritë, sigurohuni që të instaloni versionin më të fundit të SDK-së, p.sh., pip install -U google-genai .

Dërgoni dhe merrni tekst

import asyncio
from google import genai

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

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_client_content(
                turns={"role": "user", "parts": [{"text": message}]}, turn_complete=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")
model = "gemini-2.0-flash-live-001"

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_client_content(
            turns={"role": "user", "parts": [{"text": message}]}, turn_complete=True
        )

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

            # Un-comment this code 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

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:

turns = [
    {"role": "user", "parts": [{"text": "What is the capital of France?"}]},
    {"role": "model", "parts": [{"text": "Paris"}]},
]

await session.send_client_content(turns=turns, turn_complete=False)

turns = [{"role": "user", "parts": [{"text": "What is the capital of Germany?"}]}]

await session.send_client_content(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

API Live mbështet zërat e mëposhtëm: Puck, Charon, Kore, Fenrir, Aoede, Leda, Orus dhe Zephyr.

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"
    }
  }
}

Ndrysho gjuhën

API Live mbështet shumë gjuhë .

Për të ndryshuar gjuhën, vendosni kodin e gjuhës brenda objektit speechConfig si pjesë e konfigurimit të sesionit:

from google.genai import types

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    speech_config=types.SpeechConfig(
        language_code="de-DE",
    )
)

Përdorni mjete

Mund të përcaktoni mjete të tilla si Thirrja e funksionit , ekzekutimi i kodit dhe Kërkimi në Google me API-në e drejtpërdrejtë.

Përdorni thirrjen e funksionit

Ju mund të përcaktoni deklaratat e funksioneve si pjesë e konfigurimit të sesionit. Shikoni tutorialin e thirrjes së funksionit për të mësuar më shumë.

Pas marrjes së thirrjeve të veglave, klienti duhet të përgjigjet me një listë të objekteve FunctionResponse duke përdorur metodën session.send_tool_response .

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

# Simple function definitions
turn_on_the_lights = {"name": "turn_on_the_lights"}
turn_off_the_lights = {"name": "turn_off_the_lights"}

tools = [{"function_declarations": [turn_on_the_lights, turn_off_the_lights]}]
config = {"response_modalities": ["TEXT"], "tools": tools}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        prompt = "Turn on the lights please"
        await session.send_client_content(turns={"parts": [{"text": prompt}]})

        async for chunk in session.receive():
            if chunk.server_content:
                if chunk.text is not None:
                    print(chunk.text)
            elif chunk.tool_call:
                function_responses = []
                for fc in tool_call.function_calls:
                    function_response = types.FunctionResponse(
                        id=fc.id,
                        name=fc.name,
                        response={ "result": "ok" } # simple, hard-coded function response
                    )
                    function_responses.append(function_response)

                await session.send_tool_response(function_responses=function_responses)


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

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.

Hyrjet dhe daljet audio ndikojnë negativisht në aftësinë e modelit për të përdorur thirrjen e funksionit.

Përdorni ekzekutimin e kodit

Ju mund të përcaktoni ekzekutimin e kodit si pjesë e konfigurimit të sesionit. Shihni tutorialin e ekzekutimit të kodit për të mësuar më shumë.

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

tools = [{'code_execution': {}}]
config = {"response_modalities": ["TEXT"], "tools": tools}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        prompt = "Compute the largest prime palindrome under 100000."
        await session.send_client_content(turns={"parts": [{"text": prompt}]})

        async for chunk in session.receive():
            if chunk.server_content:
                if chunk.text is not None:
                    print(chunk.text)
            
                model_turn = chunk.server_content.model_turn
                if model_turn:
                    for part in model_turn.parts:
                      if part.executable_code is not None:
                        print(part.executable_code.code)

                      if part.code_execution_result is not None:
                        print(part.code_execution_result.output)

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

Mund të aktivizoni Grounding me Google Search si pjesë e konfigurimit të sesionit. Shihni tutorialin e tokëzimit për të mësuar më shumë.

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

tools = [{'google_search': {}}]
config = {"response_modalities": ["TEXT"], "tools": tools}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        prompt = "When did the last Brazil vs. Argentina soccer match happen?"
        await session.send_client_content(turns={"parts": [{"text": prompt}]})

        async for chunk in session.receive():
            if chunk.server_content:
                if chunk.text is not None:
                    print(chunk.text)

                # The model might generate and execute Python code to use Search
                model_turn = chunk.server_content.model_turn
                if model_turn:
                    for part in model_turn.parts:
                      if part.executable_code is not None:
                        print(part.executable_code.code)

                      if part.code_execution_result is not None:
                        print(part.code_execution_result.output)

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

Kombinoni mjete të shumta

Ju mund të kombinoni shumë mjete brenda API-së Live:

prompt = """
Hey, I need you to do three things for me.

1. Compute the largest prime palindrome under 100000.
2. Then use Google Search to look up information about the largest earthquake in California the week of Dec 5 2024?
3. Turn on the lights

Thanks!
"""

tools = [
    {"google_search": {}},
    {"code_execution": {}},
    {"function_declarations": [turn_on_the_lights, turn_off_the_lights]},
]

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

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 True:
        # The generation was interrupted

Konfiguro zbulimin e aktivitetit zanor (VAD)

Mund të konfiguroni ose çaktivizoni zbulimin e aktivitetit zanor (VAD).

Përdorni VAD automatike

Si parazgjedhje, modeli kryen automatikisht VAD në një transmetim të vazhdueshëm të hyrjes audio. VAD mund të konfigurohet me fushën realtimeInputConfig.automaticActivityDetectionkonfigurimit të konfigurimit .

Kur transmetimi i audios ndalet për më shumë se një sekondë (për shembull, për shkak se përdoruesi ka fikur mikrofonin), duhet të dërgohet një ngjarje audioStreamEnd për të pastruar çdo audio të ruajtur në memorie. Klienti mund të rifillojë dërgimin e të dhënave audio në çdo kohë.

# example audio file to try:
# URL = "https://storage.googleapis.com/generativeai-downloads/data/hello_are_you_there.pcm"
# !wget -q $URL -O sample.pcm
import asyncio
from pathlib import Path
from google import genai

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

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

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        audio_bytes = Path("sample.pcm").read_bytes()

        await session.send_realtime_input(
            audio=types.Blob(data=audio_bytes, mime_type="audio/pcm;rate=16000")
        )

        # if stream gets paused, send:
        # await session.send_realtime_input(audio_stream_end=True)

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

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

Me send_realtime_input , API do t'i përgjigjet audios automatikisht bazuar në VAD. Ndërsa send_client_content shton mesazhe në kontekstin e modelit sipas radhës, send_realtime_input optimizohet për reagim në kurriz të renditjes përcaktuese.

Konfiguro VAD automatike

Për më shumë kontroll mbi aktivitetin VAD, mund të konfiguroni parametrat e mëposhtëm. Shih referencën API për më shumë informacion.

from google.genai import types

config = {
    "response_modalities": ["TEXT"],
    "realtime_input_config": {
        "automatic_activity_detection": {
            "disabled": False, # default
            "start_of_speech_sensitivity": types.StartSensitivity.START_SENSITIVITY_LOW,
            "end_of_speech_sensitivity": types.EndSensitivity.END_SENSITIVITY_LOW,
            "prefix_padding_ms": 20,
            "silence_duration_ms": 100,
        }
    }
}

Çaktivizo VAD-në automatike

Përndryshe, VAD-i automatik mund të çaktivizohet duke vendosur realtimeInputConfig.automaticActivityDetection.disabledtrue në mesazhin e konfigurimit. Në këtë konfigurim klienti është përgjegjës për zbulimin e të folurit të përdoruesit dhe dërgimin e mesazheve activityStart dhe activityEnd në kohën e duhur. Një audioStreamEnd nuk dërgohet në këtë konfigurim. Në vend të kësaj, çdo ndërprerje e transmetimit shënohet nga një mesazh activityEnd .

config = {
    "response_modalities": ["TEXT"],
    "realtime_input_config": {"automatic_activity_detection": {"disabled": True}},
}

async with client.aio.live.connect(model=model, config=config) as session:
    # ...
    await session.send_realtime_input(activity_start=types.ActivityStart())
    await session.send_realtime_input(
        audio=types.Blob(data=audio_bytes, mime_type="audio/pcm;rate=16000")
    )
    await session.send_realtime_input(activity_end=types.ActivityEnd())
    # ...

Merrni numrin e shenjave

Ju mund të gjeni numrin total të argumenteve të konsumuara në fushën usageMetadata të mesazhit të serverit të kthyer.

async for message in session.receive():
    # The server will periodically send messages that include UsageMetadata.
    if message.usage_metadata:
        usage = message.usage_metadata
        print(
            f"Used {usage.total_token_count} tokens in total. Response token breakdown:"
        )
        for detail in usage.response_tokens_details:
            match detail:
                case types.ModalityTokenCount(modality=modality, token_count=count):
                    print(f"{modality}: {count}")

Zgjatni kohëzgjatjen e seancës

Kohëzgjatja maksimale e seancës mund të zgjatet në të pakufizuar me dy mekanizma:

Për më tepër, do të merrni një mesazh GoAway përpara përfundimit të seancës, duke ju lejuar të ndërmerrni veprime të mëtejshme.

Aktivizo ngjeshjen e dritares së kontekstit

Për të aktivizuar sesione më të gjata dhe për të shmangur ndërprerjen e papritur të lidhjes, mund të aktivizoni ngjeshjen e dritares së kontekstit duke vendosur fushën e kontekstitWindowCompression si pjesë e konfigurimit të sesionit.

ContextWindowCompressionConfig , ju mund të konfiguroni një mekanizëm me dritare rrëshqitëse dhe numrin e shenjave që nxisin kompresimin.

from google.genai import types

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    context_window_compression=(
        # Configures compression with default parameters.
        types.ContextWindowCompressionConfig(
            sliding_window=types.SlidingWindow(),
        )
    ),
)

Konfiguro rifillimin e sesionit

Për të parandaluar përfundimin e sesionit kur serveri rivendos periodikisht lidhjen WebSocket, konfiguroni fushën sessionResumption brenda konfigurimit të konfigurimit .

Kalimi i këtij konfigurimi bën që serveri të dërgojë mesazhe SessionResumptionUpdate , të cilat mund të përdoren për të rifilluar seancën duke kaluar shenjën e fundit të rifillimit si SessionResumptionConfig.handle e lidhjes pasuese.

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

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())

Merr një mesazh përpara se seanca të shkëputet

Serveri dërgon një mesazh GoAway që sinjalizon se lidhja aktuale do të ndërpritet së shpejti. Ky mesazh përfshin timeLeft , që tregon kohën e mbetur dhe ju lejon të ndërmerrni veprime të mëtejshme përpara se lidhja të ndërpritet si E ABORTUAR.

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)

Merr një mesazh kur gjenerimi të ketë përfunduar

Serveri dërgon një mesazh gjenerimi i plotë që sinjalizon se modeli ka përfunduar gjenerimin e përgjigjes.

async for response in session.receive():
    if response.server_content.generation_complete is True:
        # The generation is complete

Ndryshoni rezolucionin e medias

Mund të specifikoni rezolucionin e medias për median hyrëse duke vendosur fushën mediaResolution si pjesë e konfigurimit të sesionit:

from google.genai import types

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    media_resolution=types.MediaResolution.MEDIA_RESOLUTION_LOW,
)

Merr transkriptime audio

Mund të aktivizoni transkriptimin e daljes audio të modelit. Gjuha e transkriptimit nxirret nga përgjigja e modelit.

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

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

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        message = "Hello? Gemini are you there?"

        await session.send_client_content(
            turns={"role": "user", "parts": [{"text": message}]}, turn_complete=True
        )

        async for response in session.receive():
            if response.server_content.model_turn:
                print("Model turn:", response.server_content.model_turn)
            if response.server_content.output_transcription:
                print("Transcript:", response.server_content.output_transcription.text)


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

Kufizimet

Merrni parasysh kufizimet e mëposhtme të Live API dhe Gemini 2.0 kur planifikoni projektin tuaj.

Modalitetet e reagimit

Mund të vendosni vetëm një modalitet përgjigjeje ( TEXT ose AUDIO ) për sesion në konfigurimin e sesionit. Përpjekja për të vendosur të dyja do të rezultojë në një mesazh gabimi të konfigurimit. Kjo do të thotë që ju mund ta konfiguroni modelin që të përgjigjet me tekst ose audio, por jo të dyja në të njëjtin seancë.

Autentifikimi i klientit

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 Live API.

Kohëzgjatja e seancës

Kohëzgjatja e sesionit mund të zgjatet në të pakufizuar duke aktivizuar kompresimin e sesionit. Pa kompresim, seancat vetëm me audio janë të kufizuara në 15 minuta dhe seancat audio plus video janë të kufizuara në 2 minuta. Tejkalimi i këtyre kufijve pa kompresim do të ndërpresë lidhjen.

Për më tepër, mund të konfiguroni rifillimin e sesionit për të lejuar klientin të rifillojë një sesion që është përfunduar.

Dritarja e kontekstit

Një seancë ka një kufi të dritares së kontekstit prej 32 mijë shenjash.

Gjuhët e mbështetura

Live API mbështet gjuhët e mëposhtme:

Gjuha Kodi i PKK-47
gjermanisht (Gjermani) de-DE
anglisht (Australi) en-AU
Anglisht (Mbretëria e Bashkuar) en-GB
anglisht (Indi) en-IN
Anglisht (SHBA) en-SHBA
Spanjisht (Shtetet e Bashkuara të Amerikës) es-SHBA
Frëngjisht (Francë) fr-FR
Hindi (Indi) hi-IN
Portugeze (Brazil) pt-BR
Arabisht (Gjenerike) ar-XA
spanjisht (Spanjë) es-ES
Frëngjisht (Kanada) fr-CA
Indonezisht (Indonezi) ID-ID
italisht (Itali) it-IT
japoneze (Japoni) ja-JP
turqisht (Turqi) tr-TR
Vietnamisht (Vietnam) vi-VN
Bengalisht (Indi) bn-IN
Guxharatisht (Indi) gu-IN
Kanada (Indi) kn-IN
Malajalame (Indi) ml-IN
Marathi (Indi) mr-IN
Tamile (Indi) ta-IN
telugu (Indi) te-IN
Hollandisht (Holandë) nl-NL
Koreane (Koreja e Jugut) ko-KR
Mandarin kineze (Kinë) cmn-CN
polake (Poloni) pl-PL
Rusisht (Rusi) ru-RU
Thai (Tajlandë) th-TH

Integrimet e palëve të treta

Për vendosjen e aplikacioneve në ueb dhe celular, mund të eksploroni opsionet nga:

,

API Live mundëson ndërveprime zanore dhe video dydrejtimëshe me vonesë të ulët me Gemini. Duke përdorur API-në Live, ju mund t'u ofroni përdoruesve fundorë 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 Live API në Google AI Studio .

Çfarë ka të re

Shikoni Changelog për veçoritë dhe aftësitë e reja më të fundit në Live API!

Përdorni API-në e drejtpërdrejtë

Ky seksion përshkruan se si të përdorni API-në e drejtpërdrejtë 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 .

Për të përdorur të gjitha veçoritë, sigurohuni që të instaloni versionin më të fundit të SDK-së, p.sh., pip install -U google-genai .

Dërgoni dhe merrni tekst

import asyncio
from google import genai

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

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_client_content(
                turns={"role": "user", "parts": [{"text": message}]}, turn_complete=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")
model = "gemini-2.0-flash-live-001"

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_client_content(
            turns={"role": "user", "parts": [{"text": message}]}, turn_complete=True
        )

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

            # Un-comment this code 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

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:

turns = [
    {"role": "user", "parts": [{"text": "What is the capital of France?"}]},
    {"role": "model", "parts": [{"text": "Paris"}]},
]

await session.send_client_content(turns=turns, turn_complete=False)

turns = [{"role": "user", "parts": [{"text": "What is the capital of Germany?"}]}]

await session.send_client_content(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

API Live mbështet zërat e mëposhtëm: Puck, Charon, Kore, Fenrir, Aoede, Leda, Orus dhe Zephyr.

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"
    }
  }
}

Ndrysho gjuhën

API Live mbështet shumë gjuhë .

Për të ndryshuar gjuhën, vendosni kodin e gjuhës brenda objektit speechConfig si pjesë e konfigurimit të sesionit:

from google.genai import types

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    speech_config=types.SpeechConfig(
        language_code="de-DE",
    )
)

Përdorni mjete

Mund të përcaktoni mjete të tilla si Thirrja e funksionit , ekzekutimi i kodit dhe Kërkimi në Google me API-në e drejtpërdrejtë.

Përdorni thirrjen e funksionit

Ju mund të përcaktoni deklaratat e funksioneve si pjesë e konfigurimit të sesionit. Shikoni tutorialin e thirrjes së funksionit për të mësuar më shumë.

Pas marrjes së thirrjeve të veglave, klienti duhet të përgjigjet me një listë të objekteve FunctionResponse duke përdorur metodën session.send_tool_response .

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

# Simple function definitions
turn_on_the_lights = {"name": "turn_on_the_lights"}
turn_off_the_lights = {"name": "turn_off_the_lights"}

tools = [{"function_declarations": [turn_on_the_lights, turn_off_the_lights]}]
config = {"response_modalities": ["TEXT"], "tools": tools}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        prompt = "Turn on the lights please"
        await session.send_client_content(turns={"parts": [{"text": prompt}]})

        async for chunk in session.receive():
            if chunk.server_content:
                if chunk.text is not None:
                    print(chunk.text)
            elif chunk.tool_call:
                function_responses = []
                for fc in tool_call.function_calls:
                    function_response = types.FunctionResponse(
                        id=fc.id,
                        name=fc.name,
                        response={ "result": "ok" } # simple, hard-coded function response
                    )
                    function_responses.append(function_response)

                await session.send_tool_response(function_responses=function_responses)


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

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.

Hyrjet dhe daljet audio ndikojnë negativisht në aftësinë e modelit për të përdorur thirrjen e funksionit.

Përdorni ekzekutimin e kodit

Ju mund të përcaktoni ekzekutimin e kodit si pjesë e konfigurimit të sesionit. Shihni tutorialin e ekzekutimit të kodit për të mësuar më shumë.

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

tools = [{'code_execution': {}}]
config = {"response_modalities": ["TEXT"], "tools": tools}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        prompt = "Compute the largest prime palindrome under 100000."
        await session.send_client_content(turns={"parts": [{"text": prompt}]})

        async for chunk in session.receive():
            if chunk.server_content:
                if chunk.text is not None:
                    print(chunk.text)
            
                model_turn = chunk.server_content.model_turn
                if model_turn:
                    for part in model_turn.parts:
                      if part.executable_code is not None:
                        print(part.executable_code.code)

                      if part.code_execution_result is not None:
                        print(part.code_execution_result.output)

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

Mund të aktivizoni Grounding me Google Search si pjesë e konfigurimit të sesionit. Shihni tutorialin e tokëzimit për të mësuar më shumë.

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

tools = [{'google_search': {}}]
config = {"response_modalities": ["TEXT"], "tools": tools}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        prompt = "When did the last Brazil vs. Argentina soccer match happen?"
        await session.send_client_content(turns={"parts": [{"text": prompt}]})

        async for chunk in session.receive():
            if chunk.server_content:
                if chunk.text is not None:
                    print(chunk.text)

                # The model might generate and execute Python code to use Search
                model_turn = chunk.server_content.model_turn
                if model_turn:
                    for part in model_turn.parts:
                      if part.executable_code is not None:
                        print(part.executable_code.code)

                      if part.code_execution_result is not None:
                        print(part.code_execution_result.output)

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

Kombinoni mjete të shumta

Ju mund të kombinoni shumë mjete brenda API-së Live:

prompt = """
Hey, I need you to do three things for me.

1. Compute the largest prime palindrome under 100000.
2. Then use Google Search to look up information about the largest earthquake in California the week of Dec 5 2024?
3. Turn on the lights

Thanks!
"""

tools = [
    {"google_search": {}},
    {"code_execution": {}},
    {"function_declarations": [turn_on_the_lights, turn_off_the_lights]},
]

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

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 True:
        # The generation was interrupted

Konfiguro zbulimin e aktivitetit zanor (VAD)

Mund të konfiguroni ose çaktivizoni zbulimin e aktivitetit zanor (VAD).

Përdorni VAD automatike

Si parazgjedhje, modeli kryen automatikisht VAD në një transmetim të vazhdueshëm të hyrjes audio. VAD mund të konfigurohet me fushën realtimeInputConfig.automaticActivityDetectionkonfigurimit të konfigurimit .

Kur transmetimi i audios ndalet për më shumë se një sekondë (për shembull, për shkak se përdoruesi ka fikur mikrofonin), duhet të dërgohet një ngjarje audioStreamEnd për të pastruar çdo audio të ruajtur në memorie. Klienti mund të rifillojë dërgimin e të dhënave audio në çdo kohë.

# example audio file to try:
# URL = "https://storage.googleapis.com/generativeai-downloads/data/hello_are_you_there.pcm"
# !wget -q $URL -O sample.pcm
import asyncio
from pathlib import Path
from google import genai

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

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

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        audio_bytes = Path("sample.pcm").read_bytes()

        await session.send_realtime_input(
            audio=types.Blob(data=audio_bytes, mime_type="audio/pcm;rate=16000")
        )

        # if stream gets paused, send:
        # await session.send_realtime_input(audio_stream_end=True)

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

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

Me send_realtime_input , API do t'i përgjigjet audios automatikisht bazuar në VAD. Ndërsa send_client_content shton mesazhe në kontekstin e modelit sipas radhës, send_realtime_input optimizohet për reagim në kurriz të renditjes përcaktuese.

Konfiguro VAD automatike

Për më shumë kontroll mbi aktivitetin VAD, mund të konfiguroni parametrat e mëposhtëm. Shih referencën API për më shumë informacion.

from google.genai import types

config = {
    "response_modalities": ["TEXT"],
    "realtime_input_config": {
        "automatic_activity_detection": {
            "disabled": False, # default
            "start_of_speech_sensitivity": types.StartSensitivity.START_SENSITIVITY_LOW,
            "end_of_speech_sensitivity": types.EndSensitivity.END_SENSITIVITY_LOW,
            "prefix_padding_ms": 20,
            "silence_duration_ms": 100,
        }
    }
}

Çaktivizo VAD-në automatike

Përndryshe, VAD-i automatik mund të çaktivizohet duke vendosur realtimeInputConfig.automaticActivityDetection.disabledtrue në mesazhin e konfigurimit. Në këtë konfigurim klienti është përgjegjës për zbulimin e të folurit të përdoruesit dhe dërgimin e mesazheve activityStart dhe activityEnd në kohën e duhur. Një audioStreamEnd nuk dërgohet në këtë konfigurim. Në vend të kësaj, çdo ndërprerje e transmetimit shënohet nga një mesazh activityEnd .

config = {
    "response_modalities": ["TEXT"],
    "realtime_input_config": {"automatic_activity_detection": {"disabled": True}},
}

async with client.aio.live.connect(model=model, config=config) as session:
    # ...
    await session.send_realtime_input(activity_start=types.ActivityStart())
    await session.send_realtime_input(
        audio=types.Blob(data=audio_bytes, mime_type="audio/pcm;rate=16000")
    )
    await session.send_realtime_input(activity_end=types.ActivityEnd())
    # ...

Merrni numrin e shenjave

Ju mund të gjeni numrin total të argumenteve të konsumuara në fushën usageMetadata të mesazhit të serverit të kthyer.

async for message in session.receive():
    # The server will periodically send messages that include UsageMetadata.
    if message.usage_metadata:
        usage = message.usage_metadata
        print(
            f"Used {usage.total_token_count} tokens in total. Response token breakdown:"
        )
        for detail in usage.response_tokens_details:
            match detail:
                case types.ModalityTokenCount(modality=modality, token_count=count):
                    print(f"{modality}: {count}")

Zgjatni kohëzgjatjen e seancës

Kohëzgjatja maksimale e seancës mund të zgjatet në të pakufizuar me dy mekanizma:

Për më tepër, do të merrni një mesazh GoAway përpara përfundimit të seancës, duke ju lejuar të ndërmerrni veprime të mëtejshme.

Aktivizo ngjeshjen e dritares së kontekstit

Për të aktivizuar sesione më të gjata dhe për të shmangur ndërprerjen e papritur të lidhjes, mund të aktivizoni ngjeshjen e dritares së kontekstit duke vendosur fushën e kontekstitWindowCompression si pjesë e konfigurimit të sesionit.

ContextWindowCompressionConfig , ju mund të konfiguroni një mekanizëm me dritare rrëshqitëse dhe numrin e shenjave që nxisin kompresimin.

from google.genai import types

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    context_window_compression=(
        # Configures compression with default parameters.
        types.ContextWindowCompressionConfig(
            sliding_window=types.SlidingWindow(),
        )
    ),
)

Konfiguro rifillimin e sesionit

Për të parandaluar përfundimin e sesionit kur serveri rivendos periodikisht lidhjen WebSocket, konfiguroni fushën sessionResumption brenda konfigurimit të konfigurimit .

Kalimi i këtij konfigurimi bën që serveri të dërgojë mesazhe SessionResumptionUpdate , të cilat mund të përdoren për të rifilluar seancën duke kaluar shenjën e fundit të rifillimit si SessionResumptionConfig.handle e lidhjes pasuese.

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

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())

Merr një mesazh përpara se seanca të shkëputet

Serveri dërgon një mesazh GoAway që sinjalizon se lidhja aktuale do të ndërpritet së shpejti. Ky mesazh përfshin timeLeft , që tregon kohën e mbetur dhe ju lejon të ndërmerrni veprime të mëtejshme përpara se lidhja të ndërpritet si E ABORTUAR.

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)

Merr një mesazh kur gjenerimi të ketë përfunduar

Serveri dërgon një mesazh gjenerimi i plotë që sinjalizon se modeli ka përfunduar gjenerimin e përgjigjes.

async for response in session.receive():
    if response.server_content.generation_complete is True:
        # The generation is complete

Ndryshoni rezolucionin e medias

Mund të specifikoni rezolucionin e medias për median hyrëse duke vendosur fushën mediaResolution si pjesë e konfigurimit të sesionit:

from google.genai import types

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    media_resolution=types.MediaResolution.MEDIA_RESOLUTION_LOW,
)

Merr transkriptime audio

Mund të aktivizoni transkriptimin e daljes audio të modelit. Gjuha e transkriptimit nxirret nga përgjigja e modelit.

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

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

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        message = "Hello? Gemini are you there?"

        await session.send_client_content(
            turns={"role": "user", "parts": [{"text": message}]}, turn_complete=True
        )

        async for response in session.receive():
            if response.server_content.model_turn:
                print("Model turn:", response.server_content.model_turn)
            if response.server_content.output_transcription:
                print("Transcript:", response.server_content.output_transcription.text)


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

Kufizimet

Merrni parasysh kufizimet e mëposhtme të Live API dhe Gemini 2.0 kur planifikoni projektin tuaj.

Modalitetet e reagimit

Mund të vendosni vetëm një modalitet përgjigjeje ( TEXT ose AUDIO ) për sesion në konfigurimin e sesionit. Përpjekja për të vendosur të dyja do të rezultojë në një mesazh gabimi të konfigurimit. Kjo do të thotë që ju mund ta konfiguroni modelin që të përgjigjet me tekst ose audio, por jo të dyja në të njëjtin seancë.

Autentifikimi i klientit

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 Live API.

Kohëzgjatja e seancës

Kohëzgjatja e sesionit mund të zgjatet në të pakufizuar duke aktivizuar kompresimin e sesionit. Pa kompresim, seancat vetëm me audio janë të kufizuara në 15 minuta dhe seancat audio plus video janë të kufizuara në 2 minuta. Tejkalimi i këtyre kufijve pa kompresim do të ndërpresë lidhjen.

Për më tepër, mund të konfiguroni rifillimin e sesionit për të lejuar klientin të rifillojë një sesion që është përfunduar.

Dritarja e kontekstit

Një seancë ka një kufi të dritares së kontekstit prej 32 mijë shenjash.

Gjuhët e mbështetura

Live API mbështet gjuhët e mëposhtme:

Gjuha Kodi i PKK-47
gjermanisht (Gjermani) de-DE
anglisht (Australi) en-AU
Anglisht (Mbretëria e Bashkuar) en-GB
anglisht (Indi) en-IN
Anglisht (SHBA) en-SHBA
Spanjisht (Shtetet e Bashkuara të Amerikës) es-SHBA
Frëngjisht (Francë) fr-FR
Hindi (Indi) hi-IN
Portugeze (Brazil) pt-BR
Arabisht (Gjenerike) ar-XA
spanjisht (Spanjë) es-ES
Frëngjisht (Kanada) fr-CA
Indonezisht (Indonezi) ID-ID
italisht (Itali) it-IT
japoneze (Japoni) ja-JP
turqisht (Turqi) tr-TR
Vietnamisht (Vietnam) vi-VN
Bengalisht (Indi) bn-IN
Guxharatisht (Indi) gu-IN
Kanada (Indi) kn-IN
Malajalame (Indi) ml-IN
Marathi (Indi) mr-IN
Tamile (Indi) ta-IN
telugu (Indi) te-IN
Hollandisht (Holandë) nl-NL
Koreane (Koreja e Jugut) ko-KR
Mandarin kineze (Kinë) cmn-CN
polake (Poloni) pl-PL
Rusisht (Rusi) ru-RU
Thai (Tajlandë) th-TH

Integrimet e palëve të treta

Për vendosjen e aplikacioneve në ueb dhe celular, mund të eksploroni opsionet nga:

,

API Live mundëson ndërveprime zanore dhe video dydrejtimëshe me vonesë të ulët me Gemini. Duke përdorur API-në Live, ju mund t'u ofroni përdoruesve fundorë 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 Live API në Google AI Studio .

Çfarë ka të re

Shikoni Changelog për veçoritë dhe aftësitë e reja më të fundit në Live API!

Përdorni API-në e drejtpërdrejtë

Ky seksion përshkruan se si të përdorni API-në e drejtpërdrejtë 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 .

Për të përdorur të gjitha veçoritë, sigurohuni që të instaloni versionin më të fundit të SDK-së, p.sh., pip install -U google-genai .

Dërgoni dhe merrni tekst

import asyncio
from google import genai

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

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_client_content(
                turns={"role": "user", "parts": [{"text": message}]}, turn_complete=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")
model = "gemini-2.0-flash-live-001"

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_client_content(
            turns={"role": "user", "parts": [{"text": message}]}, turn_complete=True
        )

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

            # Un-comment this code 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

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:

turns = [
    {"role": "user", "parts": [{"text": "What is the capital of France?"}]},
    {"role": "model", "parts": [{"text": "Paris"}]},
]

await session.send_client_content(turns=turns, turn_complete=False)

turns = [{"role": "user", "parts": [{"text": "What is the capital of Germany?"}]}]

await session.send_client_content(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

API Live mbështet zërat e mëposhtëm: Puck, Charon, Kore, Fenrir, Aoede, Leda, Orus dhe Zephyr.

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"
    }
  }
}

Ndrysho gjuhën

API Live mbështet shumë gjuhë .

Për të ndryshuar gjuhën, vendosni kodin e gjuhës brenda objektit speechConfig si pjesë e konfigurimit të sesionit:

from google.genai import types

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    speech_config=types.SpeechConfig(
        language_code="de-DE",
    )
)

Përdorni mjete

Mund të përcaktoni mjete të tilla si Thirrja e funksionit , ekzekutimi i kodit dhe Kërkimi në Google me API-në e drejtpërdrejtë.

Përdorni thirrjen e funksionit

Ju mund të përcaktoni deklaratat e funksioneve si pjesë e konfigurimit të sesionit. Shikoni tutorialin e thirrjes së funksionit për të mësuar më shumë.

Pas marrjes së thirrjeve të veglave, klienti duhet të përgjigjet me një listë të objekteve FunctionResponse duke përdorur metodën session.send_tool_response .

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

# Simple function definitions
turn_on_the_lights = {"name": "turn_on_the_lights"}
turn_off_the_lights = {"name": "turn_off_the_lights"}

tools = [{"function_declarations": [turn_on_the_lights, turn_off_the_lights]}]
config = {"response_modalities": ["TEXT"], "tools": tools}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        prompt = "Turn on the lights please"
        await session.send_client_content(turns={"parts": [{"text": prompt}]})

        async for chunk in session.receive():
            if chunk.server_content:
                if chunk.text is not None:
                    print(chunk.text)
            elif chunk.tool_call:
                function_responses = []
                for fc in tool_call.function_calls:
                    function_response = types.FunctionResponse(
                        id=fc.id,
                        name=fc.name,
                        response={ "result": "ok" } # simple, hard-coded function response
                    )
                    function_responses.append(function_response)

                await session.send_tool_response(function_responses=function_responses)


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

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.

Hyrjet dhe daljet audio ndikojnë negativisht në aftësinë e modelit për të përdorur thirrjen e funksionit.

Përdorni ekzekutimin e kodit

Ju mund të përcaktoni ekzekutimin e kodit si pjesë e konfigurimit të sesionit. Shihni tutorialin e ekzekutimit të kodit për të mësuar më shumë.

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

tools = [{'code_execution': {}}]
config = {"response_modalities": ["TEXT"], "tools": tools}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        prompt = "Compute the largest prime palindrome under 100000."
        await session.send_client_content(turns={"parts": [{"text": prompt}]})

        async for chunk in session.receive():
            if chunk.server_content:
                if chunk.text is not None:
                    print(chunk.text)
            
                model_turn = chunk.server_content.model_turn
                if model_turn:
                    for part in model_turn.parts:
                      if part.executable_code is not None:
                        print(part.executable_code.code)

                      if part.code_execution_result is not None:
                        print(part.code_execution_result.output)

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

Mund të aktivizoni Grounding me Google Search si pjesë e konfigurimit të sesionit. Shihni tutorialin e tokëzimit për të mësuar më shumë.

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

tools = [{'google_search': {}}]
config = {"response_modalities": ["TEXT"], "tools": tools}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        prompt = "When did the last Brazil vs. Argentina soccer match happen?"
        await session.send_client_content(turns={"parts": [{"text": prompt}]})

        async for chunk in session.receive():
            if chunk.server_content:
                if chunk.text is not None:
                    print(chunk.text)

                # The model might generate and execute Python code to use Search
                model_turn = chunk.server_content.model_turn
                if model_turn:
                    for part in model_turn.parts:
                      if part.executable_code is not None:
                        print(part.executable_code.code)

                      if part.code_execution_result is not None:
                        print(part.code_execution_result.output)

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

Kombinoni mjete të shumta

Ju mund të kombinoni shumë mjete brenda API-së Live:

prompt = """
Hey, I need you to do three things for me.

1. Compute the largest prime palindrome under 100000.
2. Then use Google Search to look up information about the largest earthquake in California the week of Dec 5 2024?
3. Turn on the lights

Thanks!
"""

tools = [
    {"google_search": {}},
    {"code_execution": {}},
    {"function_declarations": [turn_on_the_lights, turn_off_the_lights]},
]

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

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 True:
        # The generation was interrupted

Konfiguro zbulimin e aktivitetit zanor (VAD)

Mund të konfiguroni ose çaktivizoni zbulimin e aktivitetit zanor (VAD).

Përdorni VAD automatike

Si parazgjedhje, modeli kryen automatikisht VAD në një transmetim të vazhdueshëm të hyrjes audio. VAD mund të konfigurohet me fushën realtimeInputConfig.automaticActivityDetectionkonfigurimit të konfigurimit .

Kur transmetimi i audios ndalet për më shumë se një sekondë (për shembull, për shkak se përdoruesi ka fikur mikrofonin), duhet të dërgohet një ngjarje audioStreamEnd për të pastruar çdo audio të ruajtur në memorie. Klienti mund të rifillojë dërgimin e të dhënave audio në çdo kohë.

# example audio file to try:
# URL = "https://storage.googleapis.com/generativeai-downloads/data/hello_are_you_there.pcm"
# !wget -q $URL -O sample.pcm
import asyncio
from pathlib import Path
from google import genai

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

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

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        audio_bytes = Path("sample.pcm").read_bytes()

        await session.send_realtime_input(
            audio=types.Blob(data=audio_bytes, mime_type="audio/pcm;rate=16000")
        )

        # if stream gets paused, send:
        # await session.send_realtime_input(audio_stream_end=True)

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

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

Me send_realtime_input , API do t'i përgjigjet audios automatikisht bazuar në VAD. Ndërsa send_client_content shton mesazhe në kontekstin e modelit sipas radhës, send_realtime_input optimizohet për reagim në kurriz të renditjes përcaktuese.

Konfiguro VAD automatike

Për më shumë kontroll mbi aktivitetin VAD, mund të konfiguroni parametrat e mëposhtëm. Shih referencën API për më shumë informacion.

from google.genai import types

config = {
    "response_modalities": ["TEXT"],
    "realtime_input_config": {
        "automatic_activity_detection": {
            "disabled": False, # default
            "start_of_speech_sensitivity": types.StartSensitivity.START_SENSITIVITY_LOW,
            "end_of_speech_sensitivity": types.EndSensitivity.END_SENSITIVITY_LOW,
            "prefix_padding_ms": 20,
            "silence_duration_ms": 100,
        }
    }
}

Çaktivizo VAD-në automatike

Përndryshe, VAD-i automatik mund të çaktivizohet duke vendosur realtimeInputConfig.automaticActivityDetection.disabledtrue në mesazhin e konfigurimit. Në këtë konfigurim klienti është përgjegjës për zbulimin e të folurit të përdoruesit dhe dërgimin e mesazheve activityStart dhe activityEnd në kohën e duhur. Një audioStreamEnd nuk dërgohet në këtë konfigurim. Në vend të kësaj, çdo ndërprerje e transmetimit shënohet nga një mesazh activityEnd .

config = {
    "response_modalities": ["TEXT"],
    "realtime_input_config": {"automatic_activity_detection": {"disabled": True}},
}

async with client.aio.live.connect(model=model, config=config) as session:
    # ...
    await session.send_realtime_input(activity_start=types.ActivityStart())
    await session.send_realtime_input(
        audio=types.Blob(data=audio_bytes, mime_type="audio/pcm;rate=16000")
    )
    await session.send_realtime_input(activity_end=types.ActivityEnd())
    # ...

Merrni numrin e shenjave

Ju mund të gjeni numrin total të argumenteve të konsumuara në fushën usageMetadata të mesazhit të serverit të kthyer.

async for message in session.receive():
    # The server will periodically send messages that include UsageMetadata.
    if message.usage_metadata:
        usage = message.usage_metadata
        print(
            f"Used {usage.total_token_count} tokens in total. Response token breakdown:"
        )
        for detail in usage.response_tokens_details:
            match detail:
                case types.ModalityTokenCount(modality=modality, token_count=count):
                    print(f"{modality}: {count}")

Zgjatni kohëzgjatjen e seancës

Kohëzgjatja maksimale e seancës mund të zgjatet në të pakufizuar me dy mekanizma:

Për më tepër, do të merrni një mesazh GoAway përpara përfundimit të seancës, duke ju lejuar të ndërmerrni veprime të mëtejshme.

Aktivizo ngjeshjen e dritares së kontekstit

Për të aktivizuar sesione më të gjata dhe për të shmangur ndërprerjen e papritur të lidhjes, mund të aktivizoni ngjeshjen e dritares së kontekstit duke vendosur fushën e kontekstitWindowCompression si pjesë e konfigurimit të sesionit.

ContextWindowCompressionConfig , ju mund të konfiguroni një mekanizëm me dritare rrëshqitëse dhe numrin e shenjave që nxisin kompresimin.

from google.genai import types

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    context_window_compression=(
        # Configures compression with default parameters.
        types.ContextWindowCompressionConfig(
            sliding_window=types.SlidingWindow(),
        )
    ),
)

Konfiguro rifillimin e sesionit

Për të parandaluar përfundimin e sesionit kur serveri rivendos periodikisht lidhjen WebSocket, konfiguroni fushën sessionResumption brenda konfigurimit të konfigurimit .

Kalimi i këtij konfigurimi bën që serveri të dërgojë mesazhe SessionResumptionUpdate , të cilat mund të përdoren për të rifilluar seancën duke kaluar shenjën e fundit të rifillimit si SessionResumptionConfig.handle e lidhjes pasuese.

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

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())

Merr një mesazh përpara se seanca të shkëputet

Serveri dërgon një mesazh GoAway që sinjalizon se lidhja aktuale do të ndërpritet së shpejti. Ky mesazh përfshin timeLeft , që tregon kohën e mbetur dhe ju lejon të ndërmerrni veprime të mëtejshme përpara se lidhja të ndërpritet si E ABORTUAR.

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)

Merr një mesazh kur gjenerimi të ketë përfunduar

Serveri dërgon një mesazh gjenerimi i plotë që sinjalizon se modeli ka përfunduar gjenerimin e përgjigjes.

async for response in session.receive():
    if response.server_content.generation_complete is True:
        # The generation is complete

Ndryshoni rezolucionin e medias

Mund të specifikoni rezolucionin e medias për median hyrëse duke vendosur fushën mediaResolution si pjesë e konfigurimit të sesionit:

from google.genai import types

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    media_resolution=types.MediaResolution.MEDIA_RESOLUTION_LOW,
)

Merr transkriptime audio

Mund të aktivizoni transkriptimin e daljes audio të modelit. Gjuha e transkriptimit nxirret nga përgjigja e modelit.

import asyncio
from google import genai
from google.genai import types

client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"

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

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        message = "Hello? Gemini are you there?"

        await session.send_client_content(
            turns={"role": "user", "parts": [{"text": message}]}, turn_complete=True
        )

        async for response in session.receive():
            if response.server_content.model_turn:
                print("Model turn:", response.server_content.model_turn)
            if response.server_content.output_transcription:
                print("Transcript:", response.server_content.output_transcription.text)


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

Kufizimet

Merrni parasysh kufizimet e mëposhtme të Live API dhe Gemini 2.0 kur planifikoni projektin tuaj.

Modalitetet e reagimit

Mund të vendosni vetëm një modalitet përgjigjeje ( TEXT ose AUDIO ) për sesion në konfigurimin e sesionit. Përpjekja për të vendosur të dyja do të rezultojë në një mesazh gabimi të konfigurimit. Kjo do të thotë që ju mund ta konfiguroni modelin që të përgjigjet me tekst ose audio, por jo të dyja në të njëjtin seancë.

Autentifikimi i klientit

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 Live API.

Kohëzgjatja e seancës

Kohëzgjatja e sesionit mund të zgjatet në të pakufizuar duke aktivizuar kompresimin e sesionit. Pa kompresim, seancat vetëm me audio janë të kufizuara në 15 minuta dhe seancat audio plus video janë të kufizuara në 2 minuta. Tejkalimi i këtyre kufijve pa kompresim do të ndërpresë lidhjen.

Për më tepër, mund të konfiguroni rifillimin e sesionit për të lejuar klientin të rifillojë një sesion që është përfunduar.

Dritarja e kontekstit

Një seancë ka një kufi të dritares së kontekstit prej 32 mijë shenjash.

Gjuhët e mbështetura

Live API mbështet gjuhët e mëposhtme:

Gjuha Kodi i PKK-47
gjermanisht (Gjermani) de-DE
anglisht (Australi) en-AU
Anglisht (Mbretëria e Bashkuar) en-GB
anglisht (Indi) en-IN
Anglisht (SHBA) en-SHBA
Spanjisht (Shtetet e Bashkuara të Amerikës) es-SHBA
Frëngjisht (Francë) fr-FR
Hindi (Indi) hi-IN
Portugeze (Brazil) pt-BR
Arabisht (Gjenerike) ar-XA
spanjisht (Spanjë) es-ES
Frëngjisht (Kanada) fr-CA
Indonezisht (Indonezi) ID-ID
italisht (Itali) it-IT
japoneze (Japoni) ja-JP
turqisht (Turqi) tr-TR
Vietnamisht (Vietnam) vi-VN
Bengalisht (Indi) bn-IN
Guxharatisht (Indi) gu-IN
Kanada (Indi) kn-IN
Malajalame (Indi) ml-IN
Marathi (Indi) mr-IN
Tamile (Indi) ta-IN
telugu (Indi) te-IN
Hollandisht (Holandë) nl-NL
Koreane (Koreja e Jugut) ko-KR
Mandarin kineze (Kinë) cmn-CN
polake (Poloni) pl-PL
Rusisht (Rusi) ru-RU
Thai (Tajlandë) th-TH

Integrimet e palëve të treta

Për vendosjen e aplikacioneve në ueb dhe celular, mund të eksploroni opsionet nga: