Agentic Workflows di perangkat (menggunakan class AgentRunner) menyediakan sesi multi-turn terkelola yang otomatis mencatat histori percakapan dalam memori di seluruh giliran, sehingga Anda tidak perlu mengelola transkrip secara manual. (Jika Anda lebih suka mengelola
histori percakapan Anda sendiri secara langsung, Anda dapat meneruskan objek List<Content> multi-turn
dengan peran USER dan MODEL serta nilai sessionId ke
objek GenerateContentRequest menggunakan akses model langsung.)
Halaman ini membahas pengelolaan instance AgentSession di seluruh siklus proses komponen Android, perubahan konfigurasi, dan reklamasi memori.
Sesi multi-giliran
Kelola percakapan multi-giliran menggunakan instance AgentSession tercakup yang diperoleh
menggunakan metode runner.getOrCreateSession(sessionId). Giliran dialog (pesan pengguna, pemanggilan alat, dan respons model) dicatat dalam memori secara otomatis dalam sesi. Panggilan berikutnya ke metode session.runAsync(content) mempertahankan giliran sebelumnya sebagai konteks.
ID sesi tidak boleh kosong, maksimal 128 karakter, dan hanya berisi
karakter alfanumerik, garis bawah, tanda hubung, atau titik
(^[a-zA-Z0-9_.-]+$, tidak termasuk . dan ..). String UUID yang dihasilkan menggunakan
metode UUID.randomUUID().toString() sesuai dengan batasan ini.
Untuk memulai percakapan multi-turn, buat ID sesi dan dapatkan instance AgentSession dari instance AgentRunner Anda:
val sessionId = "user_chat_${System.currentTimeMillis()}"
val session = runner.getOrCreateSession(sessionId)
Setiap panggilan ke metode session.runAsync(content) akan mengirimkan giliran perintah baru dalam sesi tersebut. Model mempertahankan konteks dari giliran sebelumnya dalam percakapan.
Mempertahankan sesi di seluruh perubahan konfigurasi
Antarmuka AgentSession menyimpan histori dialog dalam memori dan tidak
mengimplementasikan antarmuka Parcelable. Di aplikasi Android, Aktivitas dan Fragmen
dihancurkan dan dibuat ulang selama perubahan konfigurasi (seperti rotasi
layar). Jika Anda menyimpan sesi langsung di Aktivitas, histori percakapan
akan hilang saat rotasi.
Untuk mempertahankan histori percakapan di seluruh perubahan konfigurasi, pertahankan instance AgentSession Anda di dalam class ViewModel AndroidX:
package com.example.ai.agent.ui
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.google.mlkit.genai.agent.AgentRunner
import com.google.mlkit.genai.agent.AgentSession
import com.google.mlkit.genai.agent.textTokens
import com.google.mlkit.genai.prompt.Content
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
class ChatViewModel(
private val runner: AgentRunner,
private val sessionId: String = "default_chat_session"
) : ViewModel() {
// Retain the session inside the ViewModel to survive screen rotations
private val session: AgentSession = runner.getOrCreateSession(sessionId)
private val _responseText = MutableStateFlow("")
val responseText: StateFlow<String> = _responseText.asStateFlow()
fun sendMessage(userPrompt: String) {
viewModelScope.launch {
val content = Content.builder().text(userPrompt).build()
session.runAsync(content)
.textTokens()
.collect { token ->
_responseText.update { it + token }
}
}
}
override fun onCleared() {
super.onCleared()
// Release session memory and cancel active coroutines when ViewModel is destroyed
session.close()
}
}
Manajemen memori dan pembersihan sesi
Batasi status percakapan dalam memori untuk mempertahankan performa aplikasi:
- Penghapusan sesi eksplisit: Saat pengguna keluar dari rangkaian percakapan atau
mengetuk "Percakapan Baru", panggil metode
session.delete()ataurunner.deleteSession(sessionId)untuk mengosongkan alokasi memori yang dialokasikan untuk giliran dan output alat sebelumnya secara sinkron. Atau, memanggil metodesession.close()akan mengirimkan penghapusan latar belakang. - Pembersihan logout: Panggil metode
runner.clearAllSessions()saat pengguna logout atau menghapus data aplikasi. - Pembersihan sesi di akhir siklus proses: Panggil metode
session.close()saat class atau komponen indukViewModelAnda dihancurkan secara permanen (dalam metodeonCleared()). Tindakan ini akan membatalkan coroutine yang sedang berjalan dan mengirimkan pengeluaran latar belakang untuk sesi percakapan tersebut.
Eksekusi sementara satu giliran
Untuk tugas agen satu kali (seperti membuat ringkasan cepat, memvalidasi
input, atau menjawab pertanyaan mandiri) yang tidak memerlukan konteks sebelumnya,
panggil metode runner.runSingleTurnAsync(content) secara langsung:
import com.google.mlkit.genai.agent.AgentEvent
import com.google.mlkit.genai.prompt.Content
val content = Content.builder()
.text("Summarize order history for customer #1042: ...")
.build()
runner.runSingleTurnAsync(content)
.collect { event ->
if (event is AgentEvent.TextMessage && !event.isPartial) {
displaySummary(event.text)
}
}
Saat memanggil metode runner.runSingleTurnAsync(content) secara langsung, class AgentRunner
mengalokasikan sesi sementara secara internal dan otomatis menghapus semua
status percakapan dari memori setelah aliran respons selesai atau dibatalkan,
sehingga menghindari kebocoran memori.
Langkah berikutnya
- Hubungkan streaming reaktif agen ke Compose di Peristiwa streaming dan integrasi UI.
- Pelajari cara mengonfigurasi alat di Menentukan alat.