Live API'de oturum, giriş ve çıkışın aynı bağlantı üzerinden sürekli olarak aktarıldığı kalıcı bir bağlantıyı ifade eder (çalışma şekli hakkında daha fazla bilgi edinin). Bu benzersiz oturum tasarımı, düşük gecikmeyi sağlar ve benzersiz özellikleri destekler ancak oturum süre sınırlamaları ve erken sonlandırma gibi zorluklar da ortaya çıkarabilir. Bu kılavuzda, Live API kullanılırken ortaya çıkabilecek oturum yönetimi sorunlarının üstesinden gelme stratejileri ele alınmaktadır.
Oturum ömrü
Sıkıştırma olmadan, yalnızca sesli oturumlar 15 dakikayla, sesli ve görüntülü oturumlar ise 2 dakikayla sınırlıdır. Bu sınırların aşılması oturumu (ve dolayısıyla bağlantıyı) sonlandırır ancak oturumları sınırsız bir süreye uzatmak için bağlam penceresi sıkıştırmasını kullanabilirsiniz.
Bağlantının ömrü de yaklaşık 10 dakika ile sınırlıdır. Bağlantı sona erdiğinde oturum da sona erer. Bu durumda, oturum devam ettirme özelliğini kullanarak tek bir oturumu birden fazla bağlantıda etkin kalacak şekilde yapılandırabilirsiniz. Ayrıca, bağlantı sona ermeden önce başka işlemler yapabilmeniz için bir GoAway mesajı da alırsınız.
Bağlam penceresi sıkıştırma
Daha uzun oturumlar etkinleştirmek ve bağlantının aniden kesilmesini önlemek için oturum yapılandırmasının bir parçası olarak contextWindowCompression alanını ayarlayarak bağlam penceresi sıkıştırmasını etkinleştirebilirsiniz.
ContextWindowCompressionConfig'de, sıkıştırmayı tetikleyen kaydırma aralığı mekanizmasını ve jeton sayısını yapılandırabilirsiniz.
Python
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(),
)
),
)
JavaScript
const config = {
responseModalities: [Modality.AUDIO],
contextWindowCompression: { slidingWindow: {} }
};
Oturum devam ettirme
Sunucu, WebSocket bağlantısını düzenli olarak sıfırladığında oturumun sonlandırılmasını önlemek için kurulum yapılandırması içinde sessionResumption alanını yapılandırın.
Bu yapılandırma iletildiğinde sunucu, SessionResumptionUpdate mesajları gönderir. Bu mesajlar, sonraki bağlantının SessionResumptionConfig.handle
olarak son devam ettirme jetonunu ileterek oturumu devam ettirmek için kullanılabilir.
Python
import asyncio
from google import genai
from google.genai import types
client = genai.Client()
model = "gemini-live-2.5-flash-preview"
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())
JavaScript
import { GoogleGenAI, Modality } from '@google/genai';
const ai = new GoogleGenAI({});
const model = 'gemini-live-2.5-flash-preview';
async function live() {
const responseQueue = [];
async function waitMessage() {
let done = false;
let message = undefined;
while (!done) {
message = responseQueue.shift();
if (message) {
done = true;
} else {
await new Promise((resolve) => setTimeout(resolve, 100));
}
}
return message;
}
async function handleTurn() {
const turns = [];
let done = false;
while (!done) {
const message = await waitMessage();
turns.push(message);
if (message.serverContent && message.serverContent.turnComplete) {
done = true;
}
}
return turns;
}
console.debug('Connecting to the service with handle %s...', previousSessionHandle)
const session = await ai.live.connect({
model: model,
callbacks: {
onopen: function () {
console.debug('Opened');
},
onmessage: function (message) {
responseQueue.push(message);
},
onerror: function (e) {
console.debug('Error:', e.message);
},
onclose: function (e) {
console.debug('Close:', e.reason);
},
},
config: {
responseModalities: [Modality.TEXT],
sessionResumption: { handle: previousSessionHandle }
// The handle of the session to resume is passed here, or else null to start a new session.
}
});
const inputTurns = 'Hello how are you?';
session.sendClientContent({ turns: inputTurns });
const turns = await handleTurn();
for (const turn of turns) {
if (turn.sessionResumptionUpdate) {
if (turn.sessionResumptionUpdate.resumable && turn.sessionResumptionUpdate.newHandle) {
let newHandle = turn.sessionResumptionUpdate.newHandle
// ...Store newHandle and start new session with this handle here
}
}
}
session.close();
}
async function main() {
await live().catch((e) => console.error('got error', e));
}
main();
Oturum bağlantısı kesilmeden önce mesaj alma
Sunucu, mevcut bağlantının yakında sonlandırılacağını belirten bir GoAway mesajı gönderir. Bu mesaj, kalan süreyi belirten timeLeft değerini içerir ve bağlantı ABORTED olarak sonlandırılmadan önce başka işlemler yapmanıza olanak tanır.
Python
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)
JavaScript
const turns = await handleTurn();
for (const turn of turns) {
if (turn.goAway) {
console.debug('Time left: %s\n', turn.goAway.timeLeft);
}
}
Oluşturma işlemi tamamlandığında mesaj alma
Sunucu, modelin yanıtı oluşturmayı tamamladığını belirten bir generationComplete mesajı gönderir.
Python
async for response in session.receive():
if response.server_content.generation_complete is True:
# The generation is complete
JavaScript
const turns = await handleTurn();
for (const turn of turns) {
if (turn.serverContent && turn.serverContent.generationComplete) {
// The generation is complete
}
}
Sırada ne var?
Live API ile çalışmanın diğer yollarını Özellikler kılavuzunun tamamında, Araç kullanımı sayfasında veya Live API yemek kitabında bulabilirsiniz.