Trong Live API, phiên (session) đề cập đến một kết nối ổn định, trong đó dữ liệu đầu vào và đầu ra được truyền liên tục qua cùng một kết nối (hãy đọc thêm về cách hoạt động của phiên). Thiết kế phiên hoạt động độc đáo này giúp giảm độ trễ và hỗ trợ các tính năng độc đáo, nhưng cũng có thể gây ra các thách thức, chẳng hạn như giới hạn thời gian phiên và kết thúc sớm. Hướng dẫn này trình bày các chiến lược để khắc phục những thách thức về việc quản lý phiên có thể phát sinh khi sử dụng API Trực tiếp.
Vòng đời của phiên
Nếu không nén, các phiên chỉ âm thanh sẽ bị giới hạn ở 15 phút và các phiên âm thanh-video sẽ bị giới hạn ở 2 phút. Việc vượt quá các giới hạn này sẽ chấm dứt phiên (và do đó là kết nối), nhưng bạn có thể sử dụng tính năng nén cửa sổ ngữ cảnh để kéo dài phiên đến một khoảng thời gian không giới hạn.
Thời gian tồn tại của một kết nối cũng bị giới hạn ở mức khoảng 10 phút. Khi kết nối chấm dứt, phiên cũng chấm dứt. Trong trường hợp này, bạn có thể định cấu hình một phiên duy nhất để luôn hoạt động trên nhiều kết nối bằng cách sử dụng tính năng tiếp tục phiên. Bạn cũng sẽ nhận được một thông báo GoAway trước khi kết nối kết thúc, cho phép bạn thực hiện thêm hành động.
Nén cửa sổ ngữ cảnh
Để bật các phiên dài hơn và tránh bị ngắt kết nối đột ngột, bạn có thể bật tính năng nén cửa sổ ngữ cảnh bằng cách đặt trường contextWindowCompression trong cấu hình phiên.
Trong ContextWindowCompressionConfig, bạn có thể định cấu hình cơ chế cửa sổ trượt và số lượng mã thông báo kích hoạt quá trình nén.
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: {} }
};
Tiếp tục phiên
Để ngăn phiên bị chấm dứt khi máy chủ định kỳ đặt lại kết nối WebSocket, hãy định cấu hình trường sessionResumption trong cấu hình thiết lập.
Việc truyền cấu hình này sẽ khiến máy chủ gửi thông báo SessionResumptionUpdate. Bạn có thể dùng thông báo này để tiếp tục phiên bằng cách truyền mã thông báo tiếp tục gần đây nhất dưới dạng SessionResumptionConfig.handle
của kết nối tiếp theo.
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();
Nhận thông báo trước khi phiên ngắt kết nối
Máy chủ sẽ gửi một thông báo GoAway để báo hiệu rằng kết nối hiện tại sẽ sớm bị chấm dứt. Thông báo này bao gồm timeLeft, cho biết thời gian còn lại và cho phép bạn thực hiện hành động khác trước khi kết nối bị chấm dứt với trạng thái ABORTED (BỊ HUỶ).
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);
}
}
Nhận thông báo khi quá trình tạo hoàn tất
Máy chủ sẽ gửi thông báo generationComplete để báo hiệu rằng mô hình đã hoàn tất việc tạo phản hồi.
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
}
}
Bước tiếp theo
Khám phá thêm các cách làm việc với Live API trong hướng dẫn đầy đủ về Chức năng, trang Sử dụng công cụ hoặc Sách dạy nấu ăn về Live API.