จัดการเซสชันสำหรับ Live API

Gemini Live API จะประมวลผลสตรีมเสียงหรือข้อความต่อเนื่องที่เรียกว่า เซสชัน คุณสามารถจัดการวงจรชีวิตของเซสชันได้ตั้งแต่การเริ่มต้นการเชื่อมต่อครั้งแรกไปจนถึงการสิ้นสุดอย่างราบรื่น

ขีดจำกัดของเซสชัน

สำหรับ Live API นั้น เซสชัน หมายถึงการเชื่อมต่อแบบถาวรที่ระบบจะสตรีมอินพุต และเอาต์พุตอย่างต่อเนื่องผ่านการเชื่อมต่อเดียวกัน

หากเซสชันเกินขีดจำกัด ข้อใดข้อหนึ่ง ต่อไปนี้ ระบบจะยกเลิกการเชื่อมต่อ

  • ระยะเวลาการเชื่อมต่อ จำกัดไว้ที่ประมาณ 10 นาที

  • ระยะเวลาเซสชัน จะขึ้นอยู่กับรูปแบบอินพุต

    • เซสชันอินพุตแบบเสียงเท่านั้นจำกัดไว้ที่ 15 นาที
    • อินพุตวิดีโอ + เสียงจำกัดไว้ที่ 2 นาที
  • หน้าต่างบริบทของเซสชัน จำกัดไว้ที่ 128,000 โทเค็น

คุณจะได้รับการแจ้งเตือน การสิ้นสุดก่อนที่การเชื่อมต่อจะสิ้นสุดลง ซึ่งจะช่วยให้คุณดำเนินการเพิ่มเติมได้

เริ่มเซสชัน

ดูคู่มือเริ่มต้นใช้งานสำหรับ Live API เพื่อดูข้อมูลโค้ดแบบเต็มที่แสดงวิธีเริ่มเซสชัน

อัปเดตระหว่างเซสชัน

โมเดล Live API รองรับความสามารถขั้นสูงต่อไปนี้สำหรับ การอัปเดตระหว่างเซสชัน:

เพิ่มการอัปเดตเนื้อหาแบบเพิ่มทีละส่วน

คุณสามารถเพิ่มการอัปเดตแบบเพิ่มทีละส่วนระหว่างเซสชันที่ใช้งานอยู่ได้ ใช้ฟีเจอร์นี้เพื่อส่งอินพุตข้อความ สร้างบริบทของเซสชัน หรือกู้คืนบริบทของเซสชัน

  • สำหรับบริบทที่ยาวขึ้น เราขอแนะนำให้ระบุข้อมูลสรุปข้อความเดียวเพื่อเพิ่มพื้นที่ว่างในหน้าต่างบริบทสำหรับการโต้ตอบในภายหลัง

  • สำหรับบริบทสั้นๆ คุณสามารถส่งการโต้ตอบแบบเลี้ยวต่อเลี้ยวเพื่อแสดงลำดับเหตุการณ์ที่แน่นอน เช่น ข้อมูลโค้ดด้านล่าง

Swift

// Define initial turns (history/context).
let turns: [ModelContent] = [
  ModelContent(role: "user", parts: [TextPart("What is the capital of France?")]),
  ModelContent(role: "model", parts: [TextPart("Paris")]),
]

// Send history, keeping the conversational turn OPEN (false).
await session.sendContent(turns, turnComplete: false)

// Define the new user query.
let newTurn: [ModelContent] = [
  ModelContent(role: "user", parts: [TextPart("What is the capital of Germany?")]),
]

// Send the final query, CLOSING the turn (true) to trigger the model response.
await session.sendContent(newTurn, turnComplete: true)

Kotlin

Not yet supported for Android apps - check back soon!

Java

Not yet supported for Android apps - check back soon!

Web

const turns = [{ text: "Hello from the user!" }];

await session.send(
  turns,
  false // turnComplete: false
);

console.log("Sent history. Waiting for next input...");

// Define the new user query.
const newTurn [{ text: "And what is the capital of Germany?" }];

// Send the final query, CLOSING the turn (true) to trigger the model response.
await session.send(
    newTurn,
    true // turnComplete: true
);
console.log("Sent final query. Model response expected now.");

Dart

// Define initial turns (history/context).
final List turns = [
  Content(
    "user",
    [Part.text("What is the capital of France?")],
  ),
  Content(
    "model",
    [Part.text("Paris")],
  ),
];

// Send history, keeping the conversational turn OPEN (false).
await session.send(
  input: turns,
  turnComplete: false,
);

// Define the new user query.
final List newTurn = [
  Content(
    "user",
    [Part.text("What is the capital of Germany?")],
  ),
];

// Send the final query, CLOSING the turn (true) to trigger the model response.
await session.send(
  input: newTurn,
  turnComplete: true,
);

Unity

// Define initial turns (history/context).
List turns = new List {
    new ModelContent("user", new ModelContent.TextPart("What is the capital of France?") ),
    new ModelContent("model", new ModelContent.TextPart("Paris") ),
};

// Send history, keeping the conversational turn OPEN (false).
foreach (ModelContent turn in turns)
{
    await session.SendAsync(
        content: turn,
        turnComplete: false
    );
}

// Define the new user query.
ModelContent newTurn = ModelContent.Text("What is the capital of Germany?");

// Send the final query, CLOSING the turn (true) to trigger the model response.
await session.SendAsync(
    content: newTurn,
    turnComplete: true
);

อัปเดตคำแนะนำระบบระหว่างเซสชัน

ใช้ได้เฉพาะเมื่อใช้ Vertex AI Gemini API เป็น ผู้ให้บริการ API ของคุณ

คุณสามารถอัปเดตคำแนะนำระบบระหว่างเซสชันที่ใช้งานอยู่ได้ ใช้ฟีเจอร์นี้เพื่อปรับการตอบสนองของโมเดล เช่น เปลี่ยนภาษาที่ใช้ตอบสนองหรือปรับโทน

หากต้องการอัปเดตคำแนะนำระบบระหว่างเซสชัน คุณสามารถส่งเนื้อหาข้อความที่มีบทบาท system ได้ คำแนะนำระบบที่อัปเดตแล้วจะมีผลตลอดระยะเวลาที่เหลือของเซสชัน

Swift

await session.sendContent(
  [ModelContent(
    role: "system",
    parts: [TextPart("new system instruction")]
  )],
  turnComplete: false
)

Kotlin

Not yet supported for Android apps - check back soon!

Java

Not yet supported for Android apps - check back soon!

Web

Not yet supported for Web apps - check back soon!

Dart

try {
  await _session.send(
    input: Content(
      'system',
      [Part.text('new system instruction')],
    ),
    turnComplete: false,
  );
} catch (e) {
  print('Failed to update system instructions: $e');
}

Unity

try
{
    await session.SendAsync(
        content: new ModelContent(
            "system",
            new ModelContent.TextPart("new system instruction")
        ),
        turnComplete: false
    );
}
catch (Exception e)
{
    Debug.LogError($"Failed to update system instructions: {e.Message}");
}

ตรวจหาเวลาที่เซสชันกำลังจะสิ้นสุด

ระบบจะส่งการแจ้งเตือน การสิ้นสุด ไปยังไคลเอ็นต์ 60 วินาที ก่อน ที่เซสชันจะสิ้นสุดลง ซึ่งจะช่วยให้คุณดำเนินการเพิ่มเติมได้

ตัวอย่างต่อไปนี้แสดงวิธีตรวจหาการสิ้นสุดเซสชันที่กำลังจะเกิดขึ้นโดยการฟังการแจ้งเตือน การสิ้นสุด

Swift

for try await response in session.responses {
  switch response.payload {

  case .goingAwayNotice(let goingAwayNotice):
    // Prepare for the session to close soon
    if let timeLeft = goingAwayNotice.timeLeft {
        print("Server going away in \(timeLeft) seconds")
    }
  }
}

Kotlin

for (response in session.responses) {
    when (val message = response.payload) {
        is LiveServerGoAway -> {
            // Prepare for the session to close soon
            val remaining = message.timeLeft
            logger.info("Server going away in $remaining")
        }
    }
}

Java

session.getResponses().forEach(response -> {
    if (response.getPayload() instanceof LiveServerResponse.GoingAwayNotice) {
        LiveServerResponse.GoingAwayNotice notice = (LiveServerResponse.GoingAwayNotice) response.getPayload();
        // Prepare for the session to close soon
        Duration timeLeft = notice.getTimeLeft();
    }
});

Web

for await (const message of session.receive()) {
  switch (message.type) {

  ...
  case "goingAwayNotice":
    console.log("Server going away. Time left:", message.timeLeft);
    break;
  }
}

Dart

Future _handleLiveServerMessage(LiveServerResponse response) async {
  final message = response.message;
  if (message is GoingAwayNotice) {
     // Prepare for the session to close soon
     developer.log('Server going away. Time left: ${message.timeLeft}');
  }
}

Unity

foreach (var response in session.Responses) {
    if (response.Payload is LiveSessionGoingAway notice) {
        // Prepare for the session to close soon
        TimeSpan timeLeft = notice.TimeLeft;
        Debug.Log($"Server going away notice received. Remaining: {timeLeft}");
    }
}