Inżynier ds. relacji z deweloperami
Wdrażanie generatywnej AI przygotowanej do zastosowań produkcyjnych w aplikacjach na Androida wymaga czegoś więcej niż tylko połączenia z LLM – wymaga zabezpieczeń klasy korporacyjnej i kontroli kosztów. Podczas tej sesji dowiesz się, jak Firebase AI Logic umożliwia deweloperom wdrażanie bezpiecznych i ekonomicznych rozwiązań opartych na AI na dużą skalę.
Omówimy podstawy bezpieczeństwa i Sprawdzanie aplikacji Firebase, zarządzanie kosztami, kierowanie do odpowiedniego modelu dynamicznego oraz wykorzystanie możliwości multimodalnych.
Transkrypcja
Witamy na Android Dev Summit.
Nazywam się Ankita Saxena i jestem menedżerką produktu Firebase.
A ja jestem Arthur Thompson, inżynier ds. relacji z programistami w zespole Firebase.
Dzisiaj pokażemy, jak dodać funkcje generatywne do aplikacji na Androida.
OK.
Czym jest Firebase?
Podnieście ręce, jeśli słyszeliście o Firebase.
Widzę bardzo dużo.
Świetnie.
Firebase to platforma Google do tworzenia aplikacji.
Firebase to ujednolicona platforma, która integruje ponad 20 usług, dzięki czemu nie musisz korzystać z rozproszonych rozwiązań, jak w przypadku dodatkowego oprogramowania.
Porozmawiajmy o wyzwaniach związanych z wdrażaniem generatywnej AI w aplikacjach mobilnych.
Zidentyfikowaliśmy 3 główne wyzwania.
Po pierwsze, wycieki kluczy interfejsu API: ich wyodrębnienie zajmuje kilka minut.
Po drugie, aktualizowanie nazw modeli: zawsze zalecamy deweloperom, aby nie kodowali ich na stałe w aplikacjach. W przeciwnym razie za każdym razem, gdy pojawi się nowy model, trzeba będzie opublikować nową wersję.
Trzecia kwestia to prywatność plików: dla każdego dewelopera i użytkownika aplikacji bardzo ważne jest, aby dane były chronione i aby aplikacja miała odpowiednie zabezpieczenia.
Przedstawiamy Firebase AI Logic jako kluczowe rozwiązanie problemów, które omówiliśmy.
Jaką propozycję wartości zapewnia Firebase AI Logic?
Zajmujemy się całą złożoną niestandardową infrastrukturą, dzięki czemu nie musisz jej tworzyć po swojej stronie.
Po drugie, dzięki naszym pakietom SDK klienta możesz wywoływać interfejs Gemini API bezpośrednio i bezpiecznie z aplikacji mobilnych.
Przyjrzyjmy się temu, co jest pod maską, i zobaczmy, jak działa architektura.
Po lewej stronie mamy pakiety SDK klienta Firebase.
Obecnie obsługujemy wiele różnych pakietów SDK klienta.
Chcę też wspomnieć o języku Kotlin, który również obsługujemy.
Gdy deweloper chce wykonać działanie AI, pakiet SDK wysyła żądanie do Firebase AI Logic, który następnie bezpiecznie przekierowuje je do interfejsu Gemini Developer API lub Agent Platform Gemini API.
Zasadniczo zajmujemy się więc całym niestandardowym backendem, który tworzysz.
Korzyścią dla nas jest to, że przyspieszacie czas wprowadzania na rynek bez opłat.
Teraz czas na zabawę.
To będzie wersja demonstracyjna aplikacji FriendlyMeals.
Przy okazji: będziemy używać tej samej aplikacji w pozostałych prezentacjach w tej sesji, więc możesz ją pobrać.
Możesz go zeskanować za pomocą tego kodu QR.
Przejdźmy do wersji demonstracyjnej.
Aplikacja FriendlyMeals pomaga znaleźć przepisy na podstawie wprowadzonych składników.
W tym procesie widzisz 2 sposoby na uchwycenie tych elementów.
Po pierwsze, podaj składniki, które masz.
Następnie robisz zdjęcie składników.
Użyję pierwszego przepływu pracy, czyli wpisania składników.
To wszystko, co udało mi się znaleźć w lodówce.
Podczas generowania przepisu chcę zwrócić uwagę na kilka rzeczy.
W tle wywołujemy modele Gemini.
W tym konkretnym przypadku użycia wywołujemy 3 modele Gemini 3.8 Flash.
Jeśli spojrzysz na górę, zobaczysz obraz, który faktycznie korzysta z modelu Gemini Nano Banana, czyli 2.1 Nano Banana, najnowszej wersji.
Zanim przejdziemy do kodu, chcę podkreślić korzyści, jakie daje Firebase AI Logic.
Pierwszy to pakiety SDK bezserwerowe.
Chcesz dodać funkcję opartą na AI, ale nie chcesz tworzyć backendu.
Właśnie dlatego powstały nasze pakiety SDK po stronie klienta.
Wywołujesz Gemini bezpośrednio z aplikacji na Androida.
Drugi to zaawansowane wbudowane funkcje zabezpieczeń.
Dzięki temu w przypadku wywołań Gemini możesz korzystać z takich funkcji jak Sprawdzanie aplikacji Firebase czy szablony promptów serwera. O tych funkcjach zabezpieczeń opowiemy nieco później.
Po trzecie, obsługuje funkcje zaawansowane, takie jak multimodalne dane wejściowe i strumieniowanie.
Załóżmy, że chcesz utworzyć aplikację, która dodaje prostą funkcję opartą na AI, aby wygenerować opowiadanie o magicznym plecaku.
import com.google.firebase.Firebase
import com.google.firebase.ai.ai
@Composable
fun MagicBackpackGenerator() {
var output by remember { mutableStateOf("") }
LaunchedEffect(Unit) {
val model=Firebase.ai.generativeModel("gemini-4-argon")
val response = model.generateContent("Write a story about a magic backpack")
output = response.text.toString()
}
MagicBackpackUI(output)
}Aby dodać tę funkcję opartą na AI i przygotować ją do produkcji, wystarczy wykonać te 3 proste kroki.
Firebase AI Logic ułatwia dodawanie funkcji opartych na AI do aplikacji, więc pierwsze pytanie, jakie należy sobie zadać, brzmi: jak zabezpieczyć tę funkcję?
Przejdźmy do szczegółów dotyczących bezpieczeństwa, zaczynając od Sprawdzania aplikacji Firebase.
Sprawdzanie aplikacji Firebase pomaga chronić dane i użytkowników oraz kontrolować, kto ma dostęp do zasobów interfejsu API, potwierdzając, że żądania pochodzą z Twojej aplikacji.
To dodatkowa warstwa zabezpieczeń, która pomaga zapobiegać nadużyciom w aplikacji.
Zanim przejdziesz do kodu, musisz wykonać kilka czynności w konsoli Firebase.
W sekcji Sprawdzanie aplikacji w konsoli Firebase zarejestruj aplikację na Androida i dodaj odpowiednich dostawców atestów.
Są to na przykład Play Integrity czy reCAPTCHA Enterprise.
Zauważ, że po skonfigurowaniu Sprawdzania aplikacji warto zacząć od trybu niewymuszonego.
W ten sposób zezwalasz aplikacji na dostarczanie danych telemetrycznych, aby upewnić się, że wszystkie aplikacje otrzymują udane wywołania interfejsu API do backendu, zanim zaczniesz egzekwować zasady.
Gdy zobaczysz, że dane telemetryczne są przesyłane prawidłowo, możesz wymusić Sprawdzanie aplikacji. Wtedy wszystkie żądania, które nie mają prawidłowego tokena potwierdzonego sprzętowo, będą odrzucane.
Oto jak wygląda kod implementacji Sprawdzania aplikacji.
class FireTravelApp : Application() {
lateinit var appContainer: AppContainer
private set
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) {
Firebase.appCheck.installAppCheckProviderFactory(
DebugAppCheckProviderFactory.getInstance()
)
} else {
Firebase.appCheck.installAppCheckProviderFactory(
PlayIntegrityAppCheckProviderFactory.getInstance()
)
}
appContainer = AppContainer(this)
}
}W klasie aplikacji zainstaluj dostawcę funkcji Sprawdzanie aplikacji.
Na etapach programowania warto używać dostawcy debugowania, a gdy aplikacja będzie gotowa do wdrożenia produkcyjnego, można przejść na Play Integrity lub reCAPTCHA Enterprise.
Pamiętaj jednak, że przed wykonaniem jakichkolwiek innych wywołań Firebase musisz najpierw skonfigurować Sprawdzanie aplikacji.
Podczas tworzenia funkcji opartych na AI deweloperzy często kodują prompty na stałe bezpośrednio w kodzie aplikacji, co wiąże się z 2 poważnymi wyzwaniami.
Po pierwsze, jeśli prompt wymaga jakichkolwiek zmian, musisz przesłać pełną aktualizację.
Po drugie, każdy, kto rozpakuje Twoją aplikację, ma dostęp do Twoich zastrzeżonych technik tworzenia promptów.
Aby rozwiązać ten problem, Firebase AI Logic używa szablonów promptów przechowywanych na serwerach.
Zamiast przechowywać prompty na urządzeniu, zapisuje je w chmurze.
To jest widok szablonów promptów przechowywanych na serwerach w konsoli Firebase.
Szablony tworzysz w formacie .prompt.
---
model: 'gemini-3-flash'
input:
schema:...
tools:...
---
{{role "system"}}
You're a storyteller that tells nice and joyful stories with happy endings.
{{role "user"}}
Create a story about {{topic}} with the length of {{length}} words in the {{language}} language.Nazwę modelu możesz ustawić tutaj.
Możesz go zmienić w każdej chwili.
Nie musisz przesyłać pełnej aktualizacji aplikacji.
Możesz też zaktualizować instrukcje systemowe. Przyjmują one również ścisły schemat JSON dla danych wejściowych i wyjściowych.
Nie musisz publikować nowej wersji aplikacji.
Ponieważ działa w chmurze, możesz dostosować prompta lub natychmiast zmienić model.
A tak wygląda kod w języku Kotlin.
val generativeModel = Firebase.ai.templateGenerativeModel()
val response = generativeModel.generateContent("storyteller-v1",
mapOf(
"topic" to topic,
"length" to length,
"language" to language
)
)
output.value = response.textWarto wspomnieć, że szablony promptów serwera są dostępne w publicznej wersji przedpremierowej.
Możesz też wdrożyć tryb „Tylko autoryzacja”.
Do autoryzacji żądania używa tokenów użytkownika Firebase Auth.
Aby uzupełnić funkcje zabezpieczeń i całkowicie zablokować aplikację, możesz też użyć trybu „Tylko szablon” bezpośrednio w konsoli Firebase.
Po opublikowaniu aplikacji możesz chcieć sprawdzić, jak działa.
Na karcie Monitorowanie wykorzystania AI możesz jednym kliknięciem włączyć monitorowanie wykorzystania AI i skonfigurować częstotliwość próbkowania.
Firebase będzie automatycznie rejestrować dane, opóźnienia i liczbę tokenów bez konieczności pisania niestandardowego kodu analitycznego.
Warto wspomnieć, że oba tryby, które właśnie widzieliśmy, są dostępne w tym samym oknie.
Po włączeniu monitorowania wykorzystania AI w konsoli Firebase dane będą przesyłane bezpośrednio do panelu monitorowania wykorzystania AI.
Możesz obserwować 95-percentyl opóźnienia, wykrywać nagłe skoki błędów i śledzić wykorzystanie tokenów w różnych modalnościach, takich jak tekst, obrazy i dźwięk.
Możesz też sprawdzić przeglądarkę logów czasu, aby zobaczyć określone logi czasu.
W tym przypadku, gdy wyświetlane są różne modele, których używamy, możesz zobaczyć czas oczekiwania i wskaźnik sukcesu.
W konsoli Firebase, gdzie możesz uzyskać wszystkie dane telemetryczne i wgląd w działanie funkcji opartej na AI.
Jeśli więc zauważysz nagły wzrost wykorzystania tokenów lub nagły wzrost opóźnienia, model hybrydowy jest jednym ze sposobów na obniżenie tych kosztów lub opóźnienia.
A ponieważ funkcje generatywnej AI stają się kluczową częścią naszych aplikacji, poleganie w 100% wyłącznie na chmurze prawdopodobnie nie jest właściwym wyborem.
Dzięki wykorzystaniu Nano 4, modeli na urządzeniu z Androidem, można uzyskać 3 główne korzyści, które mogą być Ci znane.
Pierwszy to tryb offline.
Dzięki temu funkcja oparta na AI będzie działać niezależnie od tego, czy jesteś na dużej konferencji, w samolocie czy w metrze.
koszt,
Ponieważ wnioskowanie odbywa się na urządzeniu, możesz dodać te funkcje i nie musisz się martwić o rosnące koszty funkcji opartych na AI.
Trzeci aspekt to prywatność danych.
Jeśli więc chodzi o dane wrażliwe, możesz zagwarantować użytkownikom, że żadne wnioskowanie nie opuści urządzenia.
Dzięki Firebase AI Logic możesz ustawić te tryby wnioskowania i mieć jasne strategie routingu, takie jak PREFER_ON_DEVICE, PREFER_IN_CLOUD lub ONLY_ON_DEVICE.
Gdy wybierzesz ONLY_ON_DEVICE, pakiet SDK będzie korzystać bezpośrednio z modelu na urządzeniu, całkowicie pomijając chmurę.
Przełączmy się na telefon.
Wróćmy do FriendlyMeals i przyjrzyjmy się niektórym funkcjom na urządzeniu.
Najpierw spróbujemy utworzyć przepis na podstawie składników, które mogą być w lodówce.
Wcześniej Ankita użyła metody ręcznej, wpisując składniki, a następnie generując przepis.
Spróbujmy więc inaczej.
Weźmy tę prawdziwą lodówkę, która nie została wygenerowana.
W lodówce jest dużo oliwek, więc zobaczmy, jaki przepis zostanie wygenerowany.
Chcę zwrócić uwagę na kilka rzeczy.
Po pierwsze obraz nigdy nie opuścił urządzenia.
Obraz został przeanalizowany lokalnie przez Nano by Gemma…
Nano 4.
Drugą kwestią jest szybkość, z jaką otrzymaliśmy odpowiedź.
Składniki zostały wygenerowane.
Dzięki temu zyskujesz 2 korzyści.
Dane nie opuszczają urządzenia, a opóźnienie jest znacznie mniejsze.
Zobaczmy, jaki przepis otrzymamy, gdy w lodówce mamy tylko oliwki.
Tym razem używamy chmury.
Bierzemy więc składniki, które zostały zidentyfikowane w lodówce, i wysyłamy je do chmury, używając Firebase AI Logic do wygenerowania przepisu.
Nie widzę łososia w lodówce, ale jest on w przepisie.
Wróćmy do prezentacji.
Jak widzieliśmy w prezentacji, przełączanie się między modelem lokalnym a modelem w chmurze jest dość proste.
Obecnie Firebase AI Logic umożliwia wnioskowanie przy użyciu podstawowego routingu opartego na dostępności sieci.
Aby zarządzać tym wnioskowaniem, możesz użyć zabezpieczeń.
Architektura obejmuje więc wbudowaną obsługę funkcji takich jak schematy multimodalne oraz schematy wejściowe i wyjściowe, a także pełną integrację z Gemini Nano 4.
Zobaczmy, jak te zabezpieczenia są wdrażane w praktyce.
Dzięki temu routing hybrydowy nie wymaga tworzenia złożonego oprogramowania pośredniczącego ani wielu funkcji zastępczych.
Jeśli chodzi o kod, jest to po prostu dodatkowy parametr.
Aby ustawić preferowany tryb, przekazujesz parametr do onDeviceConfig.
import com.google.firebase.Firebase
import com.google.firebase.ai.ai
@Composable
fun MagicBackpackGenerator() {
var output by remember { mutableStateOf("") }
LaunchedEffect(Unit) {
val model = Firebase.ai.generativeModel(modelName = "gemini-3.8-flash",
onDeviceConfig = OnDeviceConfig(mode = InferenceMode.PREFER_ON_DEVICE))
val response = model.generateContent("Write a story about a magic backpack")
output = response.text.toString()
}
MagicBackpackUI(output)
}W takim przypadku pakiet SDK najpierw spróbuje użyć modelu lokalnego, a jeśli nie będzie on dostępny, automatycznie przełączy się na model w chmurze.
Wiemy już, jak tworzyć bezpieczne aplikacje i korzystać z modeli na urządzeniu, więc porozmawiajmy o optymalizacji kosztów.
Funkcje generatywne mogą szybko się skalować, co może zwiększyć Twoje rachunki za usługi w chmurze.
Dlatego musimy mieć odpowiednie zabezpieczenia, aby zapewnić właściwe proaktywne mechanizmy kontroli infrastruktury i funkcje automatyczne, które pomogą Ci przewidywać budżety i zapewnić efektywność finansową aplikacji.
Arthur podkreślił, że wnioskowanie na urządzeniu jest całkowicie bezpłatne, ale zawsze będą występować scenariusze, które wymagają złożonych zadań rozumowania, a także wymagają zastąpienia i przekierowania do chmury.
Gdy dochodzi do takich wywołań, potrzebujesz zabezpieczeń, które pozwolą Ci utrzymać budżet na przewidywalnym poziomie.
Właśnie dlatego wprowadziliśmy limity wydatków Firebase.
Dzięki limitom wydatków możesz mieć większą kontrolę nad kosztami aplikacji.
Zamiast ogólnego ustawienia budżetu dla całego projektu i alertów budżetowych, które wysyłają tylko e-maile, możesz ustawić konkretny limit budżetu dla poszczególnych usług, takich jak Firebase AI Logic.
Gdy wydatki osiągną 100%, Firebase automatycznie wstrzyma usługę AI, aby zapobiec niekontrolowanemu wzrostowi kosztów.
Oprócz prostych limitów wydatków istnieje kilka zaawansowanych strategii optymalizacji kosztów.
Dzisiaj chcemy zwrócić uwagę na aktywatory Firebase AI Logic.
Co zrobić, jeśli potrzebujesz niestandardowej logiki w środku?
To są aktywatory Firebase AI Logic.
Możesz uruchomić funkcję przed wygenerowaniem treści lub po nim.
Możesz go użyć do sprawdzenia użytkownika, filtrowania danych wejściowych, dodawania kontekstu, a także dostosowywania odpowiedzi.
Omówiliśmy już optymalizację kosztów i bezpieczeństwo, więc teraz przejdźmy do możliwości modelu i zobaczmy, co oferuje Firebase AI Logic.
Aby umożliwić korzystanie z tych multimodalnych funkcji, Firebase AI Logic udostępnia obszerny katalog modeli i narzędzi gotowych do wykorzystania w środowisku produkcyjnym.
Do szybkiego wnioskowania, generowania tekstu, kodu i multimediów możesz używać m.in. modeli Gemini 4 Argon, Gemini 3.1 Pro i Gemini 3.8 Flash.
Możesz też połączyć te modele z danymi ze świata rzeczywistego, korzystając z groundingu w wyszukiwarce i Mapach.
W przypadku głosu zapewniamy naturalną zamianę tekstu na mowę i generowanie dźwięku w Gemini Live.
Przełączmy się jeszcze raz na telefon.
Mamy tu więc słodkie i wytrawne.
Nie, nie to.
Oto nasz przepis na szybkie tosty z serem i ketchupem.
Brzmi pysznie.
Pierwszą rzeczą, której chcemy się przyjrzeć, jest interfejs Live API.
W tym przypadku możemy użyć filmu, który otrzymamy, i powiedzieć: „Hej, Gemini, czy możesz mi powiedzieć, jakie składniki są na stole?”.
Na podstawie obrazu na ekranie laptopa masz chleb, ser cheddar i ketchup.
OK.
Czy mogę zacząć od pierwszego kroku przepisu?
Tak.
Pierwszym krokiem jest rozgrzanie tostera lub opiekacza do średnio wysokiej temperatury.
Dziękujemy.
OK.
W tym przypadku był to interfejs Live API, a rozmowa pozostałaby otwarta, dopóki bym jej nie zamknął.
Kolejna funkcja, którą chcę pokazać, to zamiana mowy na tekst, a raczej zamiana tekstu na mowę.
W tym przykładzie mamy instrukcje przepisu, które są odczytywane przez funkcję zamiany tekstu na mowę.
Zamiast czytać, mogę kliknąć „Wygeneruj” lub „Mów”, a tekst instrukcji zostanie wysłany do modelu zamiany tekstu na mowę.
Wygeneruje dźwięk i wyśle go z powrotem na urządzenie.
Mogę go odtworzyć, zapisać w pamięci podręcznej na później i będzie odtwarzany tak, jak widzimy tutaj.
1.
Rozgrzej opiekacz lub grill do średnio wysokiej temperatury.
2.
Połóż 2 kromki chleba na blasze do pieczenia lub tacy tostera.
Nieźle.
Fajnie, prawda?
Firebase AI Logic pozwala nam wdrażać tego typu funkcje za pomocą zaledwie kilku linijek kodu.
Wróćmy do slajdów.
Teraz, gdy już widzieliśmy, jak działa Gemini Live API, co jeśli chcesz samodzielnie stworzyć obsługiwany bez użycia rąk tryb konwersacyjny?
W tym miejscu przydaje się interfejs Gemini Live API, który umożliwia tworzenie dwukierunkowych rozmów głosowych.
Aplikacja na Androida może przesyłać strumieniowo dźwięk z mikrofonu i klatki z kamery oraz otrzymywać w czasie rzeczywistym naturalne odpowiedzi głosowe o niskiej latencji.
W Kotlinie konfiguracja wygląda dość znajomo.
val model = Firebase.ai.liveModel(
modelName = "gemini-3.1-flash-live-preview",
generationConfig = liveGenerationConfig {
responseModality = ResponseModality.AUDIO
},
systemInstruction = "Your main job is to change the color...",
tools = listOf(Tool.functionDeclarations(listOf(changeColorFunction)))
)
val session = model.connect(::handler)
session.startAudioConversation(::handler)
session.stopAudioConversation()Utworzysz instancję modelu Live skonfigurowanego do generowania odpowiedzi audio i połączysz się z sesją za pomocą modułu obsługi strumienia.
Najważniejszą kwestią, na którą chcielibyśmy zwrócić uwagę, jest to, że pakiet SDK obsługuje wszystkie elementy WebSocket i protokoły strumieniowe.
Nie musisz więc pisać kodu.
Pisz dalej.
Kończąc nasze prezentacje i patrząc w przyszłość tworzenia aplikacji, chcielibyśmy zwrócić uwagę na jedno potężne narzędzie, które może usprawnić Twój przepływ pracy – umiejętności agenta Firebase.
# Execute to add agent capabilities to your workspace
npx skills add firebase/agent-skillsDodatkowo dla osób korzystających z Antigravity i Android Studio zintegrowaliśmy Firebase AI Logic bezpośrednio z procesem wprowadzającym.
Na koniec 3 najważniejsze wnioski: zacznij tworzyć, korzystaj z narzędzi produkcyjnych, takich jak te związane z bezpieczeństwem, które dzisiaj omówiliśmy, i używaj umiejętności agentów, gdzie tylko możesz.
Dziękujemy.
import com.google.firebase.Firebase
import com.google.firebase.ai.ai
@Composable
fun MagicBackpackGenerator() {
var output by remember { mutableStateOf("") }
LaunchedEffect(Unit) {
val model=Firebase.ai.generativeModel("gemini-4-argon")
val response = model.generateContent("Write a story about a magic backpack")
output = response.text.toString()
}
MagicBackpackUI(output)
}class FireTravelApp : Application() {
lateinit var appContainer: AppContainer
private set
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) {
Firebase.appCheck.installAppCheckProviderFactory(
DebugAppCheckProviderFactory.getInstance()
)
} else {
Firebase.appCheck.installAppCheckProviderFactory(
PlayIntegrityAppCheckProviderFactory.getInstance()
)
}
appContainer = AppContainer(this)
}
}---
model: 'gemini-3-flash'
input:
schema:...
tools:...
---
{{role "system"}}
You're a storyteller that tells nice and joyful stories with happy endings.
{{role "user"}}
Create a story about {{topic}} with the length of {{length}} words in the {{language}} language.val generativeModel = Firebase.ai.templateGenerativeModel()
val response = generativeModel.generateContent("storyteller-v1",
mapOf(
"topic" to topic,
"length" to length,
"language" to language
)
)
output.value = response.textimport com.google.firebase.Firebase
import com.google.firebase.ai.ai
@Composable
fun MagicBackpackGenerator() {
var output by remember { mutableStateOf("") }
LaunchedEffect(Unit) {
val model = Firebase.ai.generativeModel(modelName = "gemini-3.8-flash",
onDeviceConfig = OnDeviceConfig(mode = InferenceMode.PREFER_ON_DEVICE))
val response = model.generateContent("Write a story about a magic backpack")
output = response.text.toString()
}
MagicBackpackUI(output)
}val model = Firebase.ai.liveModel(
modelName = "gemini-3.1-flash-live-preview",
generationConfig = liveGenerationConfig {
responseModality = ResponseModality.AUDIO
},
systemInstruction = "Your main job is to change the color...",
tools = listOf(Tool.functionDeclarations(listOf(changeColorFunction)))
)
val session = model.connect(::handler)
session.startAudioConversation(::handler)
session.stopAudioConversation()# Execute to add agent capabilities to your workspace
npx skills add firebase/agent-skills