Умные приложения

Создание безопасных и экономичных приложений для Android с помощью Firebase AI Logic и Gemini Nano 4

Колонки

  • Анкита Саксена

    Менеджер по продукту

  • Артур Томпсон

    Инженер по связям с разработчиками

О приложении

О выступлении

Чтобы встроить генеративный искусственный интеллект в приложение для Android, недостаточно просто подключиться к LLM. Нужны средства контроля расходов и безопасности корпоративного уровня. На этом занятии вы узнаете, как Firebase AI Logic помогает разработчикам развертывать безопасные и экономичные ИИ-решения в больших масштабах.

Мы рассмотрим основы безопасности и проверку приложений Firebase, управление расходами, динамическую маршрутизацию моделей и использование мультимодальных возможностей.

Сводка

  • Firebase AI Logic направляет запросы из клиентских SDK напрямую в Gemini API без пользовательского бэкенда. Шаблоны запросов на сервере хранят запросы в облаке, чтобы избежать обновления приложения.
  • Проверка приложений Firebase защищает ресурсы от злоупотреблений, гарантируя, что запросы поступают из вашего приложения. Она интегрирует поставщиков аттестации, таких как Play Integrity и reCAPTCHA Enterprise, прежде чем вы примените проверки.
  • Gemini Nano 4 выполняет вывод на устройстве, чтобы снизить задержку и защитить конфиденциальность пользователей. Firebase AI Logic при необходимости управляет резервной маршрутизацией в облако.
  • Пределы расходов и триггеры Firebase AI Logic помогают прогнозировать расходы на облачные сервисы. Firebase автоматически приостанавливает работу ИИ-сервиса при достижении 100 % расходов, а триггеры позволяют запускать пользовательские функции до или после генерации.
  • Gemini Live API обеспечивает двунаправленную потоковую передачу аудио и видео. Клиентский SDK управляет базовыми подключениями WebSocket и протоколами потоковой передачи.

Gemini Notebook

Темы

  • firebase-ai-logic
  • gemini-nano
  • firebase-app-check
  • on-device-ai
  • оптимизация расходов
  • gemini-live-api

Расшифровка

Введение и обзор Firebase AI Logic

  • Добро пожаловать на саммит для разработчиков Android.

  • Меня зовут Анкита Саксена, я менеджер по продукту Firebase.

  • А я Артур Томпсон, инженер по связям с разработчиками в команде Firebase.

  • Сегодня мы покажем, как добавить генеративные функции в приложения для Android.

  • Теперь

  • Что такое Firebase?

  • Поднимите руку, если вы слышали о Firebase.

  • О, я много чего вижу.

  • Отлично.

  • Firebase – это платформа Google для разработки приложений.

  • Firebase – это единая платформа, которая объединяет более 20 продуктов, поэтому вам не придется использовать разрозненные инструменты.

  • Давайте поговорим о сложностях, связанных с внедрением генеративного ИИ в мобильные приложения.

  • Мы выделили три основные проблемы.

  • Во-первых, утечка ключей API. На их извлечение уходят минуты.

  • Во-вторых, обновление названий моделей. Мы всегда рекомендуем разработчикам не задавать их в коде приложений, иначе при каждом появлении новой модели придется выпускать обновление.

  • Третий аспект – конфиденциальность файлов. Для разработчиков и пользователей приложений очень важно, чтобы данные были защищены и в приложении были предусмотрены необходимые меры безопасности.

  • Firebase AI Logic – это ключевое решение для преодоления трудностей, о которых мы говорили.

  • В чем ценностное предложение Firebase AI Logic для вас?

  • Мы берем на себя всю сложную работу по настройке серверной части, чтобы вам не пришлось делать это самостоятельно.

  • Во-вторых, используя наши клиентские SDK, вы можете вызывать Gemini API напрямую и безопасно из своих мобильных приложений.

  • Давайте заглянем под капот и разберемся, как устроена архитектура.

  • Слева у нас клиентские SDK Firebase.

  • В настоящее время мы поддерживаем множество клиентских SDK.

  • Я хочу отметить, что мы также поддерживаем Kotlin.

  • Когда разработчик хочет выполнить действие ИИ, SDK отправляет запрос в Firebase AI Logic, который затем безопасно перенаправляет его в Gemini Developer API или Agent Platform Gemini API.

  • То есть мы берем на себя всю работу с серверной частью, которую вы сейчас выполняете самостоятельно.

  • И ценность, которую мы получаем от этого, заключается в том, что вы ускоряете время выхода на рынок при нулевых затратах.

Демонстрация приложения FriendlyMeals

  • Теперь самое интересное.

  • Это будет демонстрация приложения FriendlyMeals.

  • Кстати, мы будем использовать это приложение для остальных демонстраций в рамках этого занятия, поэтому вы можете его скачать.

  • Вы можете отсканировать его с помощью QR-кода.

  • Давайте посмотрим демоверсию.

  • Приложение FriendlyMeals помогает находить рецепты на основе ингредиентов, которые вы вводите.

  • Итак, в этом рабочем процессе вы видите два способа, по сути, захвата этих ингредиентов.

  • Первый – вы вводите ингредиенты, которые у вас есть.

  • Затем вы фотографируете ингредиенты.

  • Я собираюсь использовать первый рабочий процесс, который заключается в вводе ингредиентов.

  • Это все, что я нашел в холодильнике.

  • Пока генерируется рецепт, я хочу обратить ваше внимание на несколько вещей.

  • Итак, под капотом мы вызываем модели Gemini.

  • В этом примере мы вызываем три модели Gemini 3.8 Flash.

  • Если вы посмотрите на верхнее изображение, то оно создано с помощью модели Gemini Nano Banana, а именно последней версии 2.1 Nano Banana.

  • Прежде чем перейти к коду, я хочу подчеркнуть ценностное предложение, которое вы получаете благодаря Firebase AI Logic.

  • Первый – это бессерверные SDK.

  • Вы хотите добавить функцию ИИ, но не хотите создавать серверную часть.

  • Для этого и нужны наши клиентские SDK.

  • Вы звоните напрямую в Gemini из приложения Android.

  • Второе – надежные встроенные функции безопасности.

  • Для вызовов Gemini можно использовать такие инструменты, как Firebase App Check, шаблоны запросов на сервере и другие. О них мы поговорим позже.

  • В-третьих, это поддержка продвинутых функций, таких как мультимодальные входные данные и потоковая передача.

  • Допустим, вы хотите создать приложение с простой ИИ-функцией, которая генерирует историю о волшебном рюкзаке.

    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)
    }
  • Чтобы добавить эту ИИ-функцию и подготовить ее к работе, необходимо выполнить три простых шага.

  • Firebase AI Logic позволяет легко добавлять в приложение ИИ-функции. Но как обеспечить их безопасность?

Безопасность и управление запросами

  • Давайте перейдем к деталям безопасности, начиная с Проверкой приложений Firebase.

  • Проверка приложений Firebase помогает защищать данные и пользователей, а также контролировать доступ к ресурсам API, подтверждая, что запросы поступают из вашего приложения.

  • Это дополнительный уровень защиты, который помогает предотвратить злоупотребления в приложении.

  • Прежде чем перейти к коду, необходимо выполнить несколько действий в консоли Firebase.

  • В консоли Firebase в разделе "Проверка приложений" вы регистрируете приложение для Android и добавляете поставщиков аттестации.

  • например Play Integrity или reCAPTCHA Enterprise.

  • Обратите внимание, что после настройки Проверки приложений лучше начать с режима без принудительного применения.

  • Это позволит вашему приложению предоставлять телеметрию, чтобы убедиться, что все ваши приложения получают успешные вызовы API к вашему бэкенду, прежде чем вы примените принудительное исполнение.

  • Когда вы увидите, что телеметрия поступает правильно, вы можете принудительно включить проверку приложений. После этого все запросы, не имеющие действительного токена, подтвержденного аппаратным обеспечением, будут отклоняться.

  • Вот как выглядит код для реализации Проверки приложений.

    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)
       }
    }
  • В классе приложения установите поставщика Проверки приложений.

  • На этапе разработки вы можете использовать отладочный поставщик, а когда будете готовы к запуску, переключитесь на Play Integrity или reCAPTCHA Enterprise.

  • Помните, что Проверку приложений нужно настроить до того, как вы будете выполнять другие вызовы Firebase.

  • При создании ИИ-функций разработчики часто встраивают запросы прямо в код приложения, но это создает две большие проблемы.

  • Во-первых, если в подсказку нужно внести изменения, вам придется полностью обновить ее.

  • Во-вторых, любой, кто распакует ваше приложение, получит доступ к вашему собственному составлению запросов.

  • Чтобы решить эту проблему, Firebase AI Logic использует шаблоны запросов на сервере.

  • Вместо того чтобы хранить ваши запросы на устройстве, они сохраняются в облаке.

  • Это представление шаблонов подсказок сервера, как оно выглядит в консоли Firebase.

  • Шаблоны создаются в формате .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.
  • Вы можете задать название модели прямо здесь.

  • Вы можете изменить его в любое время.

  • Вам не нужно выпускать полное обновление приложения.

  • Вы также можете обновить системные инструкции. Кроме того, для ввода и вывода используется строгая схема JSON.

  • Выпускать новую версию приложения не нужно.

  • Поскольку он находится в облаке, вы можете мгновенно настроить подсказку или поменять модель.

  • А вот как выглядит код на 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.text
  • Обратите внимание, что шаблоны запросов к серверу находятся в общедоступной предварительной версии.

  • Вы также можете реализовать режим только авторизации.

  • Для авторизации запроса используются токены пользователей Firebase Auth.

  • Чтобы дополнить функции защиты и полностью защитить приложение, вы можете включить режим Template-Only Mode непосредственно в консоли Firebase.

Панель мониторинга и телеметрии ИИ

  • После публикации приложения вы можете захотеть узнать, как оно работает.

  • На вкладке "ИИ-мониторинг" вы можете одним кликом включить ИИ-мониторинг и настроить частоту дискретизации.

  • Firebase будет автоматически собирать показатели, задержки и количество токенов, и вам не придется писать для этого специальный код аналитики.

  • Обратите внимание, что оба режима, о которых мы только что говорили, доступны в одном окне.

  • После того как вы включите ИИ-мониторинг в консоли Firebase, данные будут поступать непосредственно на панель управления ИИ-мониторингом.

  • Вы можете отслеживать задержку 95-го процентиля, выявлять внезапные всплески ошибок и отслеживать потребление токенов в различных модальностях, таких как текст, изображения и аудио.

  • Вы также можете использовать Trace Viewer, чтобы посмотреть определенные трассировки.

  • В этом случае, поскольку он демонстрирует, как diff-- модель, которую мы используем, вы можете увидеть задержку, долю успешных запросов.

Гибридный вывод с Gemini Nano

  • В консоли Firebase, где можно получить все телеметрические данные и информацию о том, как работает ИИ-функция.

  • Например, если вы видите внезапный скачок в использовании токенов или задержке, гибридный подход может помочь снизить эти затраты или задержку.

  • А поскольку функции на основе генеративного ИИ становятся ключевой частью наших приложений, полагаться на 100 % только на облако, вероятно, не лучший выбор.

  • Использование Nano 4, локальной модели на Android, дает три основных преимущества, которые вам, возможно, уже знакомы.

  • Первый – офлайн-режим.

  • Поэтому, находитесь ли вы на большой конференции, в самолете или в метро, ваша ИИ-функция все равно будет работать.

  • Стоимость.

  • Поскольку инференс выполняется на устройстве, вы можете добавлять эти функции и не беспокоиться о росте расходов на ИИ-функции.

  • И третий – конфиденциальность данных.

  • Поэтому, если это данные деликатного характера, вы можете гарантировать своим пользователям, что никакие умозаключения не покинут ваше устройство.

  • Firebase AI Logic позволяет задавать режимы инференса и настраивать стратегии маршрутизации, такие как PREFER_ON_DEVICE, PREFER_IN_CLOUD или ONLY_ON_DEVICE.

  • Если вы выберете ONLY_ON_DEVICE, SDK будет использовать модель на устройстве, не обращаясь к облаку.

  • Давайте переключимся на телефон.

  • Итак, мы снова открываем FriendlyMeals и смотрим, какие возможности есть на устройстве.

  • Итак, первое, что мы попробуем сделать, – это создать рецепт на основе некоторых ингредиентов, которые могут быть в нашем холодильнике.

  • Ранее вы видели, как Анкита использовала ручной метод, просто вводя ингредиенты, а затем генерируя рецепт.

  • Давайте попробуем другой способ.

  • Давайте возьмем этот настоящий холодильник, который точно не сгенерирован.

  • В холодильнике много оливок. Посмотрим, какой рецепт мы получим.

  • Я хочу обратить ваше внимание на несколько моментов.

  • Во-первых, изображение не покидало устройство.

  • Изображение было проанализировано локально моделью Nano от Gemma…

  • Nano 4.

  • И второе – это скорость, с которой пришел ответ.

  • Итак, ингредиенты сгенерированы.

  • Таким образом, вы получаете два преимущества.

  • Данные не покидают устройство, а задержка значительно снижается.

  • Давайте посмотрим, какой рецепт мы получим для холодильника, заполненного оливками.

  • Поэтому в этот раз мы используем облако.

  • Мы берем ингредиенты, которые были идентифицированы в холодильнике, и отправляем их в облако, используя Firebase AI Logic для создания рецепта.

  • Я не вижу лосося в холодильнике, но он есть в рецепте.

  • Но давайте вернемся к слайдам.

  • Как мы видели в демонстрации, переключение между локальной и облачной моделями довольно простое.

  • Сейчас Firebase AI Logic позволяет выполнять логический вывод, используя базовую маршрутизацию на основе доступности сети.

  • Чтобы управлять этим умозаключением, вы можете думать об этом как о защитных ограждениях.

  • Поэтому архитектура включает встроенную поддержку таких функций, как мультимодальные схемы ввода и вывода, а также полную интеграцию с Gemma, извините, с Gemini Nano 4.

  • Давайте посмотрим, как эти ограничения реализуются на практике.

  • Таким образом, гибридная маршрутизация не требует от вас создания сложного промежуточного ПО или большого количества резервной логики.

  • В коде это просто дополнительный параметр.

  • Чтобы задать нужный режим, передайте параметр 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)
    }
  • В этом случае SDK сначала попробует использовать локальную модель, а если она недоступна, автоматически переключится на облачную.

Оптимизация расходов и триггеры логики ИИ

  • Теперь, когда мы обсудили, как создавать безопасные приложения и использовать локальные модели, давайте поговорим об оптимизации затрат.

  • Функции генеративного ИИ могут быстро масштабироваться, что может привести к увеличению расходов на облачные сервисы.

  • Поэтому нам нужны надлежащие меры предосторожности, чтобы у нас были правильные упреждающие средства управления инфраструктурой и автоматизированные функции, которые могут помочь сделать ваши бюджеты предсказуемыми, а ваши приложения финансово эффективными.

  • Артур только что подчеркнул, что вывод на устройстве полностью бесплатен, но всегда будут сценарии, требующие сложных задач по рассуждению, а также требующие резервного копирования и маршрутизации в облако.

  • Чтобы контролировать расходы, вам нужны ограничения.

  • Именно для этого и нужны пределы расходов Firebase.

  • С пределами расходов вы можете более детально контролировать затраты на приложения.

  • То есть вместо общего бюджета на весь проект и оповещений по электронной почте вы можете задать лимит для отдельных сервисов, например Firebase AI Logic.

  • Когда расходы достигают 100 %, Firebase автоматически приостанавливает работу ИИ-сервиса, чтобы предотвратить непредвиденные траты.

  • Помимо простых пределов расходов, существует несколько продвинутых стратегий оптимизации затрат.

  • Сегодня мы хотим рассказать о триггерах Firebase AI Logic.

  • Что если вам нужна собственная логика?

  • Это триггеры Firebase AI Logic.

  • Вы можете запустить функцию до или после генерации контента.

  • Используйте его, чтобы проверить пользователя, отфильтровать входные данные, добавить контекст, а также скорректировать ответ.

Возможности Gemini Live API и моделей

  • Мы рассмотрели оптимизацию расходов и безопасность. Теперь давайте перейдем к возможностям моделей и посмотрим, что предлагает Firebase AI Logic.

  • Чтобы обеспечить работу этих мультимодальных функций, Firebase AI Logic предоставляет обширный каталог готовых к использованию моделей и инструментов.

  • Для быстрого анализа, работы с текстом, кодом и медиафайлами можно использовать Gemini 4 Argon, Gemini 3.1 Pro, Gemini 3.8 Flash и другие модели.

  • Вы также можете подключить эти модели к реальным данным с помощью обоснования в Поиске и Картах.

  • И наконец, для голоса мы предлагаем естественное преобразование текста в речь и генерацию аудио в Gemini Live.

  • Давайте ещё раз переключимся на телефон.

  • Итак, у нас есть сладкое и соленое.

  • Ой, извините, не то.

  • Вот наш быстрый сырный тост с кетчупом.

  • Звучит аппетитно.

  • И первое, что мы хотим рассмотреть, это Live API.

  • В этом случае мы сможем использовать видео, которое возвращается, и я могу сказать: "Эй, Gemini, не мог бы ты сказать мне, что на столе из ингредиентов?"

  • Судя по изображению на экране ноутбука, у вас есть хлеб, сыр чеддер и кетчуп.

  • Теперь

  • Можем ли мы начать с первого шага рецепта?

  • Да.

  • Сначала разогрейте духовку или гриль до средней температуры.

  • Спасибо!

  • Теперь

  • В этом случае использовался Live API, и разговор оставался открытым, пока я его не завершил.

  • Ещё одна функция, которую я хочу показать, – это преобразование речи в текст. Точнее, преобразование текста в речь.

  • А с помощью преобразования текста в речь, в этом примере, у нас есть инструкции по рецепту.

  • И вместо того, чтобы читать, я могу нажать "Сгенерировать" или "Озвучить", и текст инструкции будет отправлен в модель преобразования текста в речь.

  • Она сгенерирует аудио и отправит его обратно на устройство.

  • Я могу воспроизвести его, сохранить в кеше и посмотреть позже.

  • 1.

  • Разогрейте духовку или гриль до средней температуры.

  • 2.

  • Положите два ломтика хлеба на противень или поддон тостера.

  • Хорошо.

  • Здорово, правда?

  • Firebase AI Logic позволяет реализовать такие функции всего несколькими строками кода.

  • Вернемся к слайдам.

  • Теперь, когда мы увидели, как работает Gemini Live API, что если вы хотите создать собственный разговорный интерфейс с голосовым управлением?

  • Gemini Live API позволяет создавать двусторонние голосовые разговоры.

  • Ваше приложение для Android может передавать аудио с микрофона и кадры с камеры и получать естественные голосовые ответы в реальном времени с низкой задержкой.

  • В Kotlin настройка выглядит довольно знакомо.

    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()
  • Вы создаете экземпляр модели Live, настроенной для аудиоответов, и подключаетесь к сеансу с помощью обработчика потока.

  • Самое главное, что нужно отметить, – SDK полностью обрабатывает все, что связано с WebSocket и протоколами потоковой передачи.

  • Так что вам не нужно писать код, верно?

  • Продолжайте писать.

Навыки агента Firebase и основные выводы

  • В завершение демонстраций и в преддверии будущего разработки приложений мы хотели бы выделить один мощный инструмент для вашего рабочего процесса – навыки агента Firebase.

    # Execute to add agent capabilities to your workspace
    npx skills add firebase/agent-skills
  • Кроме того, для тех, кто использует Antigravity и Android Studio, мы уже интегрировали Firebase AI Logic непосредственно в процесс адаптации.

  • В заключение я хочу дать вам три совета. Во-первых, начните создавать агентов. Во-вторых, как можно раньше начните использовать инструменты для работы с ними, например те, что связаны с безопасностью и о которых мы сегодня говорили. В-третьих, используйте навыки агентов везде, где это возможно.

  • Спасибо!

Код

Фрагменты кода

Фрагмент кода на Kotlin в видео "Демонстрация приложения FriendlyMeals"
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)
}
Фрагмент кода на Kotlin в разделе "Безопасность и управление запросами"
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)
   }
}
Фрагмент YAML на 08:18 в разделе "Безопасность и управление запросами"
---
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.
Фрагмент кода на 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.text
Фрагмент кода на Kotlin в видео "Гибридный вывод с Gemini Nano"
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)
}
Фрагмент кода на Kotlin в видео "Gemini Live API и возможности модели"
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()
Фрагмент Shell на 21:30 в видео "Навыки агента Firebase и основные выводы"
# Execute to add agent capabilities to your workspace
npx skills add firebase/agent-skills