Die Gemini Live API-Prozesse verarbeiten kontinuierliche Audio- oder Textstreams, die als Sitzungen bezeichnet werden. Sie können den Sitzungslebenszyklus vom ersten Handshake bis zum ordnungsgemäßen Beenden verwalten.
Limits für Sitzungen
Bei Live API bezieht sich eine Sitzung auf eine persistente Verbindung, über die Ein- und Ausgabe kontinuierlich über dieselbe Verbindung gestreamt werden.
Wenn die Sitzung eines der folgenden Limits überschreitet, wird die Verbindung beendet.
Die Verbindungsdauer ist auf etwa 10 Minuten begrenzt.
Die Sitzungslänge hängt von den Eingabemodalitäten ab:
- Eingabesitzungen, die nur Audio enthalten, sind auf 15 Minuten begrenzt.
- Video- und Audioeingaben sind auf 2 Minuten begrenzt.
Das Sitzungskontextfenster ist auf 128.000 Tokens begrenzt.
Sie erhalten eine Benachrichtigung über die bevorstehende Einstellung, bevor die Verbindung beendet wird. So haben Sie die Möglichkeit, weitere Maßnahmen zu ergreifen.
Sitzung starten
Im Startleitfaden für Live API finden Sie ein vollständiges Snippet, das zeigt, wie eine Sitzung gestartet wird.
Aktualisierung während der Sitzung
Die Live API-Modelle unterstützen die folgenden erweiterten Funktionen für Aktualisierungen während der Sitzung:
Systemanweisungen aktualisieren (nur für Vertex AI Gemini API)
Inkrementelle Aktualisierungen von Inhalten hinzufügen
Sie können während einer aktiven Sitzung inkrementelle Updates hinzufügen. Damit können Sie Texteingaben senden, Sitzungskontext festlegen oder Sitzungskontext wiederherstellen.
Bei längeren Kontexten empfehlen wir, eine Zusammenfassung der einzelnen Nachrichten bereitzustellen, um das Kontextfenster für nachfolgende Interaktionen freizugeben.
Bei kurzen Kontexten können Sie die Interaktionen als Abfolge von Ereignissen senden, wie im folgenden Snippet dargestellt.
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,
);
Einheit
// 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
);
Systemanweisungen während einer Sitzung aktualisieren
| Nur verfügbar, wenn Sie Vertex AI Gemini API als API-Anbieter verwenden. |
Sie können die Systemanweisungen während einer aktiven Sitzung aktualisieren. Damit können Sie die Antworten des Modells anpassen, z. B. die Sprache oder den Ton ändern.
Wenn Sie die Systemanweisungen während der Sitzung aktualisieren möchten, können Sie Textinhalte mit der Rolle system senden. Die aktualisierten Systemanweisungen bleiben für den Rest der Sitzung in Kraft.
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');
}
Einheit
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}");
}
Erkennen, wann eine Sitzung beendet wird
Im folgenden Beispiel wird gezeigt, wie Sie eine bevorstehende Sitzungsbeendigung erkennen, indem Sie auf eine going away-Benachrichtigung warten:
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}');
}
}
Einheit
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}");
}
}