Cihaz üzerinde temsilci tabanlı iş akışları (AgentRunner sınıfını kullanarak), sıralar arasında bellek içi sohbet geçmişini otomatik olarak kaydeden yönetilen çok turlu oturumlar sağlar. Böylece transkriptleri manuel olarak yönetmeniz gerekmez. (Kendi sohbet geçmişinizi doğrudan yönetmeyi tercih ederseniz USER ve MODEL rollerine ve sessionId değerine sahip çok turlu bir List<Content> nesnesini doğrudan model erişimi kullanarak bir GenerateContentRequest nesnesine iletebilirsiniz.)
Bu sayfada, Android bileşen yaşam döngüleri, yapılandırma değişiklikleri ve bellek geri kazanımı genelinde AgentSession örneklerinin yönetimi ele alınmaktadır.
Çok aşamalı etkileşim oturumları
runner.getOrCreateSession(sessionId) yöntemini kullanarak elde edilen kapsamlı AgentSession örneklerini kullanarak çok adımlı görüşmeleri yönetin. Diyalog sıraları (kullanıcı mesajları, araç çağrıları ve model yanıtları) oturum içinde otomatik olarak belleğe kaydedilir. session.runAsync(content) yöntemine yapılan sonraki çağrılar, önceki sıraları bağlam olarak korur.
Oturum tanımlayıcıları boş olmamalı, en fazla 128 karakterden oluşmalı ve yalnızca alfanümerik karakterler, alt çizgiler, kısa çizgiler veya noktalar (^[a-zA-Z0-9_.-]+$, . ve .. hariç) içermelidir. UUID.randomUUID().toString() yöntemi kullanılarak oluşturulan UUID dizeleri bu kısıtlamalara uygundur.
Çok adımlı bir sohbet başlatmak için bir oturum tanımlayıcı oluşturun ve AgentRunner örneğinizden bir AgentSession örneği alın:
val sessionId = "user_chat_${System.currentTimeMillis()}"
val session = runner.getOrCreateSession(sessionId)
session.runAsync(content) yöntemine yapılan her çağrı, ilgili oturumda yeni bir istem sırası gönderir. Model, görüşmenin önceki aşamalarındaki bağlamı korur.
Yapılandırma değişiklikleri sırasında oturumları koruma
AgentSession arayüzü, diyalog geçmişini bellekte tutar ve Parcelable arayüzünü uygulamaz. Android uygulamalarında, yapılandırma değişiklikleri (ör. ekran döndürme) sırasında etkinlikler ve parçalar yok edilir ve yeniden oluşturulur. Oturumu doğrudan bir etkinlikte depolarsanız rotasyon sırasında görüşme geçmişi kaybolur.
Yapılandırma değişiklikleri sırasında görüşme geçmişini korumak için AgentSession örneğinizi bir AndroidX ViewModel sınıfında saklayın:
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()
}
}
Bellek yönetimi ve oturum temizleme
Uygulama performansını korumak için bellek içi görüşme durumunu sınırlı tutun:
- Açık oturum silme: Kullanıcı bir görüşme dizisinden ayrıldığında veya "Yeni Sohbet"e dokunduğunda, geçmiş sıralar ve araç çıkışları için ayrılan belleği eşzamanlı olarak boşaltmak üzere
session.delete()veyarunner.deleteSession(sessionId)yöntemini çağırın. Alternatif olarak,session.close()yöntemini çağırmak arka planda tahliyeyi tetikler. - Oturum kapatma temizliği: Kullanıcı oturumu kapattığında veya uygulama verilerini temizlediğinde
runner.clearAllSessions()yöntemini çağırın. - Yaşam döngüsü sonunda oturum temizleme:
ViewModelsınıfınız veya üst bileşeniniz kalıcı olarak yok edildiğinde (onCleared()yönteminde)session.close()yöntemini çağırın. Bu işlem, beklemedeki eş yordamları iptal eder ve söz konusu görüşme oturumu için arka planda çıkarma işlemini başlatır.
Tek adımlık geçici yürütme
Geçmiş bağlamın gerekli olmadığı tek seferlik temsilci görevleri (ör. hızlı bir özet oluşturma, girişi doğrulama veya bağımsız bir soruyu yanıtlama) için doğrudan runner.runSingleTurnAsync(content) yöntemini çağırın:
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)
}
}
runner.runSingleTurnAsync(content) yöntemini doğrudan çağırırken AgentRunner sınıfı, dahili olarak geçici bir oturum tahsis eder ve yanıt akışı tamamlandığında veya iptal edildiğinde tüm görüşme durumunu bellekten otomatik olarak temizleyerek bellek sızıntılarını önler.
Sonraki adımlar
- Stream events and UI integration (Akış etkinlikleri ve kullanıcı arayüzü entegrasyonu) bölümünde temsilcinin reaktif akışını Compose'a bağlayın.
- Araçları yapılandırma hakkında bilgi edinmek için Araçları tanımlama bölümüne bakın.