インテリジェントなアプリ

Firebase AI Logic と Gemini Nano 4 を使用して、安全で費用が最適化された Android アプリを構築する

スピーカー

  • Ankita Saxena

    プロダクト マネージャー

  • Arthur Thompson

    デベロッパー リレーション エンジニア

概要

講演について

本番環境に対応した生成 AI を Android アプリに組み込むには、LLM への接続だけでなく、エンタープライズ グレードのセキュリティと費用管理が必要です。このセッションでは、Firebase AI Logic を使用して、安全で予算を意識した AI エクスペリエンスを大規模にデプロイする方法について説明します。

セキュリティの基礎、Firebase App Check、費用管理、動的モデル ルーティングから、マルチモーダル機能の活用まで、幅広く取り上げます。

概要

  • Firebase AI Logic は、カスタム バックエンドを使用せずに、クライアント SDK からのリクエストを Gemini API に直接ルーティングします。サーバー プロンプト テンプレートは、アプリの更新を回避するためにプロンプトをクラウドに保存します。
  • Firebase App Check は、リクエストがアプリから発信されたものであることを確認することで、リソースを不正行為から保護します。チェックを適用する前に、Play Integrity や reCAPTCHA Enterprise などの証明書プロバイダを統合します。
  • Gemini Nano 4 は、デバイス上で推論を実行してレイテンシを短縮し、ユーザーのプライバシーを保護します。Firebase AI Logic は、必要に応じてクラウドへのフォールバック ルーティングを管理します。
  • 単価の上限と Firebase AI Logic トリガーにより、クラウド費用を予測可能に保つことができます。Firebase は、費用が 100% に達すると AI サービスを自動的に一時停止します。また、トリガーを使用すると、生成の前後にカスタム関数を実行できます。
  • 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 Dev Summit へようこそ。

  • Firebase のプロダクト マネージャー、Ankita Saxena です。

  • Firebase チームのデベロッパー リレーションズ エンジニアの Arthur Thompson です。

  • 本日は、Android アプリに生成機能を追加する方法をご紹介します。

  • それでは

  • Firebase とは

  • Firebase を聞いたことがある方は挙手をお願いします。

  • たくさんあります。

  • ありがとうございます。

  • Firebase は Google のアプリ開発プラットフォームです。

  • Firebase が提供するのは、20 以上のプロダクトが統合された統合プラットフォームです。そのため、追加のソフトウェアを使用する場合のような、断片化されたエクスペリエンスはありません。

  • モバイルアプリに生成 AI を導入する際の課題について説明します。

  • 上位 3 つの課題を特定しました。

  • 1 つ目は API キーの漏洩です。API キーの抽出には数分しかかかりません。

  • 2 つ目は、モデル名の更新です。モデル名をアプリにハードコードしないことをおすすめします。ハードコードすると、新しいモデルがリリースされるたびに、別のリリースをプッシュする必要があるためです。

  • 3 つ目はファイルのプライバシーです。デベロッパーやアプリユーザーにとって、データを保護し、アプリに適切なガードレールを設けることは非常に重要です。

  • 前述の課題を解決するための主要なソリューションとして、Firebase AI Logic を紹介します。

  • Firebase AI Logic が提供する価値提案は何ですか?

  • 複雑なカスタム バックエンドは基本的にすべて Google が処理するため、お客様側で開発する必要はありません。

  • 2 つ目は、クライアント SDK を使用して、モバイルアプリから Gemini API を直接かつ安全に呼び出す方法です。

  • 内部の仕組みと、アーキテクチャのフローを見てみましょう。

  • 左側には Firebase クライアント SDK があります。

  • 現在、Google はさまざまなクライアント SDK をサポートしています。

  • また、Kotlin もサポートしています。

  • デベロッパーが AI アクションを実行したい場合、SDK はリクエストを Firebase AI Logic に送信します。Firebase AI Logic は、リクエストを Gemini Developer API または Agent Platform Gemini API に安全にルーティングします。

  • つまり、現在作成しているすべてのカスタム バックエンドを処理しています。

  • そして、そこから得られる価値は、ゼロコストで製品化までの時間を短縮できることです。

FriendlyMeals アプリのデモ

  • ここからが面白いところです。

  • これは、FriendlyMeals アプリを紹介するデモです。

  • なお、このセッションの残りのデモでも同じアプリを使用しますので、よろしければダウンロードしてください。

  • こちらの QR コードをスキャンしてください。

  • デモを見ていきましょう。

  • FriendlyMeals アプリは、基本的に、入力した食材に基づいてレシピを特定するのに役立ちます。

  • このワークフローでは、基本的に、これらの要素をキャプチャする 2 つの方法があります。

  • 1 つ目は、手元にある食材を入力する方法です。

  • 次に、材料の写真を撮ります。

  • 最初のワークフローである、材料の入力を使用します。

  • 冷蔵庫にあったのはこれだけです。

  • レシピが生成されている間に、いくつか注目していただきたい点があります。

  • 内部では、ここで Gemini モデルを呼び出しています。

  • このユースケースでは、3 つの Gemini 3.8 Flash を呼び出しています。

  • 上の画像は、Gemini Nano Banana モデル(最新バージョンの 2.1 Nano Banana)を使用しています。

  • コードに入る前に、Firebase AI Logic を通じて得られる価値提案を強調しておきたいと思います。

  • 1 つ目は、サーバーレス SDK です。

  • AI 機能を追加したいが、バックエンドを立ち上げたくない。

  • そこで、クライアントサイド SDK の出番です。

  • Android アプリから Gemini を直接呼び出す。

  • 2 つ目は、堅牢な組み込みセキュリティ機能です。

  • Gemini への呼び出しでは、Firebase App Check やサーバー プロンプト テンプレートなどを活用できます。これらのセキュリティ機能については、後ほど詳しく説明します。

  • 3 つ目は、マルチモーダル入力やストリーミングなどの高度な機能のサポートです。

  • たとえば、魔法のバックパックに関するストーリーを生成するシンプルな AI 機能を追加するアプリを構築するとします。

    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)
    }
  • この AI 機能を追加して本番環境にデプロイするには、次の 3 つの簡単な手順を行います。

  • Firebase AI Logic を使用すると、アプリに AI 機能を簡単に追加できます。最初に考えるべきことは、この機能をどのように保護するかです。

セキュリティとプロンプトの管理

  • では、Firebase App Check からセキュリティの詳細について説明します。

  • Firebase App Check は、リクエストがアプリから発信されたものであることを確認することで、データの保護、ユーザーの保護、API リソースへのアクセス制御を支援します。

  • これは、アプリの不正使用を防ぐための追加のセキュリティ層です。

  • コードを記述する前に、Firebase コンソールでいくつかの手順を行う必要があります。

  • Firebase コンソールの [App Check] で Android アプリを登録し、それぞれのアテステーション プロバイダを追加します。

  • たとえば、Play Integrity や reCAPTCHA Enterprise などです。

  • App Check を設定したら、まず未適用モードで開始することをおすすめします。

  • これにより、アプリがテレメトリーを提供できるようになり、適用前にすべてのアプリがバックエンドへの API 呼び出しを正常に取得していることを確認できます。

  • テレメトリーが正常に受信されていることを確認したら、App Check を適用できます。この時点で、ハードウェアで証明された有効なトークンを持たないリクエストはすべて拒否されます。

  • App Check を実装するコードは次のようになります。

    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)
       }
    }
  • アプリケーション クラスに App Check プロバイダをインストールします。

  • 開発段階では、開発用のデバッグ プロバイダを使用し、本番環境に移行する準備が整ったら、Play Integrity または reCAPTCHA Enterprise に切り替えます。

  • ただし、他の Firebase 呼び出しを行う前に、まず App Check を構成する必要があることに注意してください。

  • AI 機能を構築する際、デベロッパーはプロンプトをアプリのコードに直接ハードコードすることがよくありますが、これには 2 つの大きな課題があります。

  • 1 つ目は、プロンプトに即興が必要な場合、完全な更新をプッシュする必要があることです。

  • 2 つ目は、アプリを解凍したユーザーが、独自のプロンプト エンジニアリングにアクセスできることです。

  • この問題を解決するために、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 ユーザー トークンを使用してリクエストを承認します。

  • セキュリティ機能を補完し、アプリケーションを完全にロックダウンするには、Firebase コンソールから直接テンプレート専用モードを使用することもできます。

AI モニタリングとテレメトリーのダッシュボード

  • アプリが公開されたら、その動作を可視化したいと思うかもしれません。

  • [AI Monitoring] タブでは、1 回クリックするだけで AI Monitoring を有効にでき、サンプリング レートも構成できます。

  • Firebase は、カスタム分析コードを記述しなくても、指標、レイテンシ、トークン数を自動的にキャプチャします。

  • 先ほど説明した 2 つのモードは、同じウィンドウで使用できます。

  • Firebase コンソールで AI Monitoring を有効にすると、このデータが AI Monitoring ダッシュボードに直接フィードされます。

  • 95 パーセンタイルのレイテンシをモニタリングし、エラーの急増を検出し、テキスト、画像、音声などのさまざまなモダリティでトークンの消費量を追跡できます。

  • また、Trace Viewer を使用して、特定のトレースを横断的に確認することもできます。

  • この場合、使用しているモデルの差分が表示されるため、レイテンシや成功率を確認できます。

Gemini Nano を使用したハイブリッド推論

  • Firebase コンソールでは、すべてのテレメトリーを取得し、AI 機能の動作を可視化できます。

  • たとえば、トークンの使用量やレイテンシが急増した場合、ハイブリッドはコストやレイテンシを削減する 1 つの方法です。

  • 生成 AI 機能がアプリの重要な部分を占めるようになるにつれて、100% クラウドのみに依存することは、おそらく適切な選択肢ではなくなるでしょう。

  • Android のオンデバイス モデルである Nano 4 を利用することで、3 つの大きなメリットが得られます。これらは、皆さんにとって馴染みのあるものかもしれません。

  • 1 つ目はオフライン モードです。

  • そのため、大規模な会議に参加しているときでも、飛行機や地下鉄に乗っているときでも、AI 機能は引き続き動作します。

  • 費用。

  • 推論はデバイス上で実行されるため、AI 機能のコスト上昇を心配することなく、これらの機能を追加できます。

  • 3 つ目はデータのプライバシーです。

  • 機密データの場合、推論がデバイスから流出しないことをユーザーに保証できます。

  • Firebase AI Logic を使用すると、これらの推論モードを設定し、PREFER_ON_DEVICE、PREFER_IN_CLOUD、ONLY_ON_DEVICE などの明確なルーティング戦略を立てることができます。

  • ONLY_ON_DEVICE を選択すると、SDK はクラウドを完全にバイパスして、オンデバイス モデルを直接利用します。

  • スマートフォンに切り替えましょう。

  • では、FriendlyMeals に戻って、オンデバイス機能の一部を見てみましょう。

  • まず、冷蔵庫にある材料をもとにレシピを作成してみましょう。

  • 先ほど、Ankita が材料を手動で入力してレシピを生成する方法を紹介しました。

  • 別の方法を試してみましょう。

  • では、この本物の冷蔵庫(生成されたものではありません)を例にしましょう。

  • この冷蔵庫にはオリーブがたくさん入っているので、どのようなレシピが生成されるか見てみましょう。

  • ここで、いくつか指摘しておきたいことがあります。

  • 1 つは、画像がデバイスから送信されないことです。

  • 画像は Nano by Gemma によってローカルで分析されました…

  • Nano 4。

  • 2 つ目は、回答が返ってくる速度です。

  • 材料が生成されました。

  • つまり、2 つのメリットが得られます。

  • データがデバイスから外に出ないだけでなく、レイテンシも大幅に短縮されます。

  • では、オリーブでいっぱいの冷蔵庫からどのようなレシピが生成されるか見てみましょう。

  • そこで、今回はクラウドを使用します。

  • 冷蔵庫から特定された食材をクラウドに送信し、Firebase AI Logic を使用してレシピを生成します。

  • 冷蔵庫に鮭は入っていませんが、レシピには鮭が使われています。

  • スライドに戻りましょう。

  • デモで見たように、ローカルモデルとクラウドモデルの切り替えは非常に簡単です。

  • 現在、Firebase AI Logic は、ネットワークの可用性に基づく基本的なルーティングを使用して推論を可能にしています。

  • この推論を管理するために、ガードレールと考えることができます。

  • そのため、このアーキテクチャには、マルチモーダルや入出力スキーマなどの機能のサポートが組み込まれており、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 はまずローカルモデルを試行し、利用できない場合は自動的にクラウドにフォールバックします。

費用の最適化と AI Logic トリガー

  • 安全なアプリを構築し、オンデバイス モデルを活用する方法について説明しました。次は、費用の最適化について説明します。

  • 生成機能は迅速にスケーリングできるため、Cloud Billing も増加します。

  • そのため、適切なプロアクティブなインフラストラクチャ制御と自動化機能を備えた適切なガードレールを導入して、予算を予測可能にし、アプリケーションの財務効率を高める必要があります。

  • Arthur が強調したように、オンデバイス推論は完全に無料ですが、複雑な推論タスクが必要で、フォールバックも必要で、クラウドへのルーティングが必要なシナリオは常に存在します。

  • このようなクラウド呼び出しが発生した場合は、予算を予測可能に保つためのガードレールが必要です。

  • そこで役立つのが Firebase の予算の上限です。

  • 費用上限を設定すると、アプリの費用をより細かく管理できます。

  • つまり、プロジェクト全体に適用される一般的な予算設定や、メールを送信するだけの予算アラートではなく、Firebase AI Logic などの個々のサービスに特定の予算上限を設定できます。

  • 利用額が 100% に達すると、Firebase は AI サービスを自動的に一時停止し、請求額が急増するのを防ぎます。

  • 単純な単価の上限以外にも、高度な費用最適化戦略がいくつかあります。

  • 本日ご紹介するのは、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 つご紹介したいのは、音声入力、失礼、テキスト読み上げです。

  • テキスト読み上げでは、この例ではレシピの手順があります。

  • そこで、[生成] または [読み上げ] をクリックすると、手順のテキストがテキスト読み上げモデルに送信されます。

  • 音声が生成され、デバイスに返されます。

  • 再生したり、後で再生するためにキャッシュに保存したりできます。

  • 1.

  • オーブントースターまたはブロイラーを中〜強火で予熱します。

  • 2.

  • 2 枚のパンをベーキング シートまたはトースター トレイに置きます。

  • とても便利です。

  • 便利ですね。

  • Firebase AI Logic を使用すると、このような優れた機能をわずか数行のコードで実装できます。

  • スライドに戻りましょう。

  • デモで Gemini Live API の仕組みを確認しましたが、ハンズフリーの会話機能を自分で構築したい場合はどうすればよいでしょうか。

  • ここで Gemini Live API の出番です。この 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()
  • 音声レスポンス用に構成されたライブモデルをインスタンス化し、ストリーム ハンドラを使用してセッションに接続します。

  • ここで強調しておきたいのは、この SDK が WebSocket の処理とストリーミング プロトコルを内部で完全に処理しているという点です。

  • コーディングする必要はありません。

  • 行を書き続けます。

Firebase エージェント スキルと重要なポイント

  • デモを終え、アプリ デベロッパーの未来を見据えるにあたり、ワークフローに役立つ強力なツールである Firebase エージェント スキルをご紹介します。

    # Execute to add agent capabilities to your workspace
    npx skills add firebase/agent-skills
  • また、Antigravity と Android Studio を使用している場合は、Firebase AI Logic がオンボーディング フローに直接統合されています。

  • 最後に、3 つの重要なポイントをご紹介します。1 つ目は、構築を開始すること。2 つ目は、本日ご紹介したセキュリティ ツールなどの本番環境ツールを早期に活用すること。3 つ目は、可能な限りエージェント スキルを使用することです。

  • ありがとうございました

コード

コード スニペット

「FriendlyMeals アプリのデモ」の 5 分 14 秒の Kotlin スニペット
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)
}
「セキュリティとプロンプト管理」の 07:07 の 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)
   }
}
「セキュリティとプロンプト管理」の 08:18 の YAML スニペット
---
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.
「セキュリティとプロンプト管理」の 08:54 の 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
「Gemini Nano を使用したハイブリッド推論」の 15:09 の Kotlin スニペット
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)
}
「Gemini Live API とモデルの機能」の 21:02 の 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()
「Firebase エージェント スキルと重要なポイント」の 21:30 のシェル スニペット
# Execute to add agent capabilities to your workspace
npx skills add firebase/agent-skills