בדף הזה מוסבר איך להגדיר את פרויקט Android, להגדיר את ספריית genai-agent וליצור את הנציג הראשון במכשיר.
דרישות מוקדמות
לפני שיוצרים Agentic Workflows באמצעות Gemini Nano, צריך לוודא שהסביבה עומדת בדרישות הבאות:
- גרסת Android: Android 14 (רמת API 34) ומעלה, שרשומה בתוכנית AICore Developer Preview.
- מכשירים נתמכים: רשימה של מכשירים נתמכים וגרסאות המודל של Gemini Nano מופיעה במאמר תמיכה במכשירים ליצירת סוכנים בהתאמה אישית.
- גרסת SDK מינימלית:
minSdk 26ואילך. - Kotlin: גרסה 2.3 ומעלה.
הגדרת הפרויקט
מוסיפים את התלות ב-genai-agent לקובץ build.gradle.kts של המודול:
dependencies {
// Gemini Nano agentic workflows
implementation("com.google.mlkit:genai-agent:1.0.0-alpha1")
// Optional: Only required when defining tools using Android AppFunctions
implementation("androidx.appfunctions:appfunctions:1.0.0-alpha13")
ksp("androidx.appfunctions:appfunctions-compiler:1.0.0-alpha13")
}
יצירת הסוכן הראשון
לנציג יש שני רכיבים עיקריים:
- הגדרת הסוכן: הוראות ומגבלות שקובעות את ההתנהגות של הסוכן.
- מריץ הסוכנים: מנוע ההפעלה שמתקשר עם AICore ומנהל את השיחות.
1. הגדרת הסוכן וה-runner
דוגמת הקוד הבאה מראה איך להגדיר את הסוכן באמצעות הוראות מערכת ולהפעיל את המחלקה AgentRunner:
import com.google.mlkit.genai.agent.Agent
import com.google.mlkit.genai.agent.AgentRunner
// 1. Build the agent configuration
val agent = Agent.builder()
.setName("Assistant")
.setInstructions("You are a helpful on-device assistant.")
.build()
// 2. Initialize the runner
val runner = AgentRunner(agent)
2. ניהול שיחה
בשיחות עם כמה שלבים, היסטוריית הדיאלוג נשמרת בין השלבים באמצעות מופע של AgentSession. עוטפים את טקסט ההנחיה באובייקט Content ואוספים את התשובה בסטרימינג:
import android.util.Log
import androidx.lifecycle.lifecycleScope
import com.google.mlkit.genai.agent.textTokens
import com.google.mlkit.genai.prompt.Content
import kotlinx.coroutines.launch
// Create or retrieve a conversation session
val session = runner.getOrCreateSession("chat_session")
val prompt = Content.builder()
.text("Hello! Can you help me organize my day?")
.build()
// Collect streamed tokens in a coroutine
lifecycleScope.launch {
session.runAsync(prompt)
.textTokens()
.collect { token ->
Log.d("Agent", token)
}
}
לשאילתות חד-פעמיות שבהן לא צריך לשמור את היסטוריית השיחות, אפשר להפעיל את ה-method runner.runSingleTurnAsync(prompt) ישירות:
lifecycleScope.launch {
runner.runSingleTurnAsync(prompt)
.textTokens()
.collect { token ->
Log.d("Agent", token)
}
}
3. מחיקת משאבים
המחלקה AgentRunner מטמיעה את הממשק AutoCloseable. כשרכיב ViewModel או Activity נהרס, צריך לסגור את ה-runner כדי לשחרר סשנים פעילים ולבטל קורוטינות ברקע:
runner.close()
השלבים הבאים
- הוספת יכולות באמצעות כלים: אתם יכולים לתת לסוכן את היכולת לבצע פעולות או לשלוח שאילתות לגבי נתוני האפליקציה באמצעות Android AppFunctions. איך מגדירים כלים
- שמירה על סשנים במהלך סיבוב: במאמר ניהול סשנים ומחזור חיים מוסבר איך לשמור על המכונה של
AgentSessionבתוך מחלקה שלViewModelבמהלך שינויים בהגדרות. - חיבור ל-Compose: העברת אירועים בסטרימינג ורינדור בועות צ'אט אינטראקטיביות באירועי סטרימינג ושילוב ממשק משתמש.