📘

Android の Gemini API Starter テンプレートを使ってみる

2023/12/17に公開

この記事はmob Advent Calendar 17日目の記事です。

下記で AndroidアプリでGeminiを活用する 方法が紹介されていました。 その中で Android Studio のプロジェクトテンプレートとして 「Gemini API Starter」 が追加されていることも紹介されています。

https://android-developers.googleblog.com/2023/12/leverage-generative-ai-in-your-android-apps.html

ただ 「Gemini API Starter」 を選ぶとどうなるのかが、何が準備されているのかがわからなかったので実際に触ってみました。

Android プレビュー版をインストールする

現状は プレビュー版でのみリリースされているので、下記からプレビュー版をインストールする必要があります。

https://developer.android.com/studio/preview?hl=en

ちなみに自分が使ったプレビュー版は以下になります。

Android Studio Iguana | 2023.2.1 Canary 18
Build #AI-232.10227.8.2321.11203637, built on December 12, 2023
Runtime version: 17.0.9+0-17.0.9b1087.7-11185874 x86_64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
macOS 12.7.1
GC: G1 Young Generation, G1 Old Generation
Memory: 2048M
Cores: 8
Metal Rendering is ON
Registry:
    ide.experimental.ui=true

APIキーを作成する

こちらから APIキーを作成しておきます。

作成した API キーは手元にコピーしておいてください。

プロジェクトを立ち上げる

プレビュー版で New Project をするといつものテンプレート内に 「Gemini API Starter」が追加されているのでこちらを選択します。

必要情報を入力して Next を押します。

先ほどコピーした API Key を入力して Finish を押します。

立ち上げてみる

冒頭の記事の一部をコピペして 「Go」を押してみます。

hintを見る限りは URL も行けそうなので試してみます。

これはできないみたいですね( なんで hint 違うやん...)

コードを見てみる

libs.versions.toml を除いてみます。 com.google.ai.client.generativeai:generativeai が定義されています。これが新しいSDKのようです。

[versions]
...
generativeai = "0.1.0"
...

[libraries]
...
generativeai = { group = "com.google.ai.client.generativeai", name = "generativeai", version.ref = "generativeai" }

APIKey は local.properties にありました。

sdk.dir=/Users/kgmyshin/Library/Android/sdk
apiKey={{ここに先ほど指定したAPIキー}}

com.google.android.libraries.mapsplatform.secrets-gradle-plugin が適用されているので、これによってコード上で BuildConfig.apiKey としてアクセスできているようです。

https://github.com/google/secrets-gradle-plugin

プロンプト送信部分は次のようになっていました。

SummarizeViewModel.kt
package com.example.androidaisample

...
import com.google.ai.client.generativeai.GenerativeModel
...

class SummarizeViewModel(
        private val generativeModel: GenerativeModel
) : ViewModel() {

    ...

    fun summarize(inputText: String) {
        _uiState.value = SummarizeUiState.Loading

        val prompt = "Summarize the following text for me: $inputText"

        viewModelScope.launch {
            try {
                val response = generativeModel.generateContent(prompt)
                response.text?.let { outputContent ->
                    _uiState.value = SummarizeUiState.Success(outputContent)
                }
            } catch (e: Exception) {
                _uiState.value = SummarizeUiState.Error(e.localizedMessage ?: "")
            }
        }
    }
}

ただ生成するだけならこれだけでよさそうです。かなり簡単です。

val prompt = "{なにか指示}"
val generativeModel = GenerativeModel(
    modelName = "gemini-pro",
    apiKey = BuildConfig.apiKey
)
val response = generativeModel.generateContent(prompt)

まとめ

  • sdきょさそう

Discussion