Mengelola sesi dan siklus proses

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() atau runner.deleteSession(sessionId) untuk mengosongkan alokasi memori yang dialokasikan untuk giliran dan output alat sebelumnya secara sinkron. Atau, memanggil metode session.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 induk ViewModel Anda dihancurkan secara permanen (dalam metode onCleared()). 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