অন-ডিভাইস এজেন্টিক ওয়ার্কফ্লো (AgentRunner ক্লাস ব্যবহার করে) ম্যানেজ করা মাল্টি-টার্ন সেশন প্রদান করে যা
টার্ন জুড়ে অটোমেটিক ইন-মেমরি কথোপকথনের ইতিহাস রেকর্ড করে, যাতে আপনাকে ম্যানুয়ালি ট্রান্সক্রিপ্ট ম্যানেজ করতে না হয়। (আপনি যদি নিজের চ্যাট ইতিহাস সরাসরি ম্যানেজ করতে চান, তাহলে সরাসরি মডেল অ্যাক্সেস ব্যবহার করে GenerateContentRequest অবজেক্টে USER এবং MODEL ভূমিকা এবং sessionId ভ্যালু সহ একটি মাল্টি-টার্ন List<Content> অবজেক্ট পাস করতে পারেন।)
এই পৃষ্ঠায় Android কম্পোনেন্ট লাইফসাইকেল, কনফিগারেশন পরিবর্তন ও মেমরি রিক্লেমেশন জুড়ে AgentSession ইনস্ট্যান্স ম্যানেজ করার বিষয়ে আলোচনা করা হয়েছে।
মাল্টি-টার্ন সেশন
runner.getOrCreateSession(sessionId) পদ্ধতি ব্যবহার করে পাওয়া স্কোপ করা AgentSession ইনস্ট্যান্স ব্যবহার করে
মাল্টি-টার্ন কথোপকথন ম্যানেজ করুন। সেশনের মধ্যে কথোপকথনের টার্ন (ব্যবহারকারীর
মেসেজ, টুল ইনভোকেশন ও মডেলের উত্তর) অটোমেটিক মেমরিতে রেকর্ড করা হয়। session.runAsync(content) পদ্ধতিতে
পরবর্তী কলগুলি প্রসঙ্গ হিসেবে আগের টার্নগুলি সংরক্ষণ করে।
সেশন আইডেন্টিফায়ার ফাঁকা রাখা যাবে না, সর্বাধিক ১২৮টি অক্ষর থাকতে হবে এবং শুধুমাত্র
বর্ণসাংখ্যিক অক্ষর, আন্ডারস্কোর, হাইফেন বা ফুলস্টপ থাকতে হবে
(^[a-zA-Z0-9_.-]+$, . এবং .. বাদে)। UUID.randomUUID().toString() পদ্ধতি ব্যবহার করে তৈরি করা
UUID স্ট্রিং এইসব সীমাবদ্ধতা মেনে চলে।
মাল্টি-টার্ন কথোপকথন শুরু করতে, সেশন আইডেন্টিফায়ার তৈরি করুন এবং আপনার AgentRunner ইনস্ট্যান্স থেকে
AgentSession ইনস্ট্যান্স পান:
val sessionId = "user_chat_${System.currentTimeMillis()}"
val session = runner.getOrCreateSession(sessionId)
session.runAsync(content) মেথডে করা প্রতিটি কল সেই সেশনে একটি নতুন প্রম্পট টার্ন
পাঠায়। মডেলটি কথোপকথনের আগের ধাপ থেকে প্রসঙ্গ বজায় রাখে।
কনফিগারেশন পরিবর্তন জুড়ে সেশন সংরক্ষণ করুন
AgentSession ইন্টারফেস মেমরিতে ডায়ালগের ইতিহাস সেভ করে রাখে এবং
Parcelable ইন্টারফেস প্রয়োগ করে না। Android অ্যাপে, কনফিগারেশন পরিবর্তনের সময় (যেমন স্ক্রিন
ঘোরানো) অ্যাক্টিভিটি ও ফ্র্যাগমেন্ট
নষ্ট হয়ে যায় এবং আবার তৈরি হয়। আপনি যদি সেশনটি সরাসরি কোনও অ্যাক্টিভিটিতে স্টোর করেন, তাহলে রোটেশনের পরে কথোপকথনের
ইতিহাস মুছে যায়।
কনফিগারেশন পরিবর্তন জুড়ে কথোপকথনের ইতিহাস সংরক্ষণ করতে, AndroidX ViewModel ক্লাসের মধ্যে আপনার
AgentSession ইনস্ট্যান্স ধরে রাখুন:
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()
}
}
মেমোরি ম্যানেজমেন্ট ও সেশন ক্লিন-আপ
অ্যাপের পারফর্ম্যান্স বজায় রাখতে ইন-মেমরি কথোপকথনের স্ট্যাটাস বাউন্ডেড রাখুন:
- স্পষ্ট সেশন মুছে ফেলা: কোনও ব্যবহারকারী কথোপকথন থ্রেড থেকে বেরিয়ে গেলে বা "নতুন চ্যাট" বিকল্পে ট্যাপ করলে, আগের টার্ন ও টুল আউটপুটের জন্য বরাদ্দ মেমরি সিঙ্ক্রোনাসভাবে খালি করতে
session.delete()বাrunner.deleteSession(sessionId)মেথড কল করুন। অন্যভাবে,session.close()মেথড কল করলে ব্যাকগ্রাউন্ড ইভিকশন ডিসপ্যাচ হয়। - সাইন-আউট ক্লিনআপ: ব্যবহারকারী সাইন-আউট করলে বা অ্যাপ ডেটা মুছে দিলে
runner.clearAllSessions()মেথড কল করুন। - লাইফসাইকেল শেষ হওয়ার পরে সেশন ক্লিন-আপ: আপনার
ViewModelক্লাস বা পেরেন্ট কম্পোনেন্ট স্থায়ীভাবে নষ্ট হয়ে গেলে (onCleared()পদ্ধতিতে)session.close()পদ্ধতি কল করুন। এটি বাকি থাকা ইন-ফ্লাইট কোরুটিন বাতিল করে এবং সেই কথোপকথন সেশনের জন্য ব্যাকগ্রাউন্ড ইভিকশন ডিসপ্যাচ করে।
সিঙ্গেল-টার্ন ক্ষণস্থায়ী এক্সিকিউশন
এজেন্টের এককালীন টাস্কের (যেমন, দ্রুত সারসংক্ষেপ তৈরি করা, ইনপুট যাচাই করা বা
কোনও স্বতন্ত্র প্রশ্নের উত্তর দেওয়া) জন্য যেখানে অতীতের প্রসঙ্গ প্রয়োজন হয় না,
সেখানে সরাসরি runner.runSingleTurnAsync(content) মেথড কল করুন:
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) পদ্ধতি ব্যবহার করার সময়, AgentRunner ক্লাস
অভ্যন্তরীণভাবে একটি অস্থায়ী সেশন বরাদ্দ করে এবং উত্তর স্ট্রিম সম্পূর্ণ বা বাতিল হয়ে গেলে
অটোমেটিক মেমরি থেকে সব কথোপকথনের স্ট্যাটাস মুছে দেয়,
যার ফলে মেমরি লিক হয় না।
পরবর্তী ধাপ
- স্ট্রিম ইভেন্ট ও UI ইন্টিগ্রেশন-এ Compose-এর সাথে এজেন্টের রিঅ্যাক্টিভ স্ট্রিম কানেক্ট করুন।
- টুল সংজ্ঞায়িত করুন বিকল্পে গিয়ে টুল কনফিগার করা সম্পর্কে জানুন।