Gemini API呼び出し方法

# はじめに

Google GeminiをAPIで利用する方法を記載する。

利用する方法としてGoogle AIとVertex AIの2種類がある。
Google AIはAPIキー認証で簡易に利用可能。個人開発に向いている。
Vertex AIはよりカスタマイズ性が高い。
もう少し詳細な違いは以下参照。

https://ai.google.dev/gemini-api/docs/migrate-to-cloud?hl=ja

## Google AI

### APIキーの取得

[Google AI for Developers](https://ai.google.dev/gemini-api/docs?hl=ja) にアクセスし、API キーを取得する。

### API呼び出し（curl）

- 以下のコマンドを実行する。
- 取得したAPIキーへの置換を忘れず行う。

```bash
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp:generateContent?key=GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
  "contents": [{
    "parts":[{"text": "富士山とは何ですか？"}]
    }]
   }'
```

### API呼び出し（python）

#### google-generativeai

```py
import google.generativeai as genai

# APIキーの設定
genai.configure(api_key="GEMINI_API_KEY")

# モデルの初期化
model = genai.GenerativeModel(model_name="gemini-2.0-flash-exp")

# プロンプトの設定
prompt = "富士山とは何ですか？"

# コンテンツ生成の実行
response = model.generate_content(prompt)

# 結果の表示
print(response.candidates[0]['content']['parts'])
```

#### google-genai

```py
from google import genai
from google.genai import types

# クライアントの初期化
client = genai.Client(api_key='GEMINI_API_KEY')

# コンテンツ生成の実行
response = client.models.generate_content(
    model='gemini-2.0-flash-exp',
    contents='富士山とは何ですか？',
    config=types.GenerateContentConfig(
        system_instruction='あなたは地理学の専門家として答えてください。',
        temperature= 0.1,
    ),
)

# 結果の表示
print(response.text)
```

参考：Google Gen AI SDK ドキュメント

https://googleapis.github.io/python-genai/index.html

#### langchain_google_genai

```py
from langchain_google_genai import ChatGoogleGenerativeAI

# APIキーの設定
google_api_key="GEMINI_API_KEY"

# LLMの初期化
model = ChatGoogleGenerativeAI(model="gemini-2.0-flash-exp", google_api_key=google_api_key)

# プロンプトの定義
prompt = "富士山とは何ですか？"

# 応答の生成
response = model.invoke(prompt)

print(response)
```

参考：

https://pypi.org/project/langchain-google-genai/

## Vertex AI

### サービスアカウントファイルの取得

1. **Google Cloud プロジェクトの作成**:
   - [Google Cloud Console](https://console.cloud.google.com/)にアクセスし、プロジェクトを作成する。
   - 既存のプロジェクトを使用する場合は、そのプロジェクトを選択する。

2. **Vertex AI APIの有効化**:
   - Google Cloud Consoleのナビゲーション メニューから「APIとサービス」 > 「ライブラリ」を選択する。
   - 「Vertex AI API」を検索し、「有効にする」をクリックしてAPIを有効化する。

3. **課金の有効化**:
   - Vertex AI APIを利用するには、プロジェクトで課金が有効になっている必要がある。
   - Google Cloud Consoleの「課金」セクションで課金アカウントを設定する。

4. **認証情報の設定**:
   - **サービス アカウントの作成**:
     - Google Cloud Consoleのナビゲーション メニューから「IAMと管理」 > 「サービス アカウント」を選択する。
     - 「+ サービス アカウントを作成」をクリックし、サービス アカウント名、ID、説明を入力する。
     - 「作成して続行」をクリックする。
   - **ロールの割り当て**:
     - サービス アカウントに適切なロールを割り当てる。
     - 「ロールを選択」で「Vertex AI ユーザー」などの必要な権限を選択し、「続行」をクリックする。
   - **サービス アカウント キーの作成とダウンロード**:
     - サービス アカウントの詳細ページで「キー」タブを選択する。
     - 「鍵を追加」 > 「新しい鍵を作成」をクリックする。
     - キーのタイプとして「JSON」を選択し、「作成」をクリックする。
     - JSON形式のキーファイルが自動的にダウンロードされる。
     - このキーファイルは機密情報であるため、安全な場所に保管し、第三者と共有しないこと。

5-a. **環境変数の設定**:
   - ダウンロードしたサービス アカウントのキーファイルのパスを環境変数`GOOGLE_APPLICATION_CREDENTIALS`に設定する。
     ```bash
     export GOOGLE_APPLICATION_CREDENTIALS="path/to/your/service-account-file.json"
     ```
   - この設定により、Google Cloud クライアント ライブラリは指定された認証情報を使用してAPIにアクセスできる。

5-b. 
  - もしくはコード内でサービスアカウントファイルを参照する
  - 以降のコードはこの方法を用いる

### API呼び出し（python）

#### Vertex AI SDK

```py
import vertexai
from vertexai.generative_models import GenerativeModel
from google.oauth2 import service_account

# サービス アカウント キーファイルのパス
key_path = "./service-account-key/service-account-file.json"

# 認証情報の読み込み
credentials = service_account.Credentials.from_service_account_file(key_path)

PROJECT_ID = "vertexai-dev-1"
REGION = "us-central1"  # e.g. us-central1
vertexai.init(project=PROJECT_ID, location=REGION, credentials=credentials)

model = GenerativeModel("gemini-2.0-flash-exp")

response = model.generate_content("富士山とは何ですか？")
print(response.text)

```

参考：

https://cloud.google.com/vertex-ai/docs/start/install-sdk?hl=ja

#### langchain_google_vertexai

```py
from google.oauth2 import service_account
from langchain_google_vertexai import ChatVertexAI

# サービス アカウント キーファイルのパス
key_path = "./service-account-key/service-account-file.json"

# 認証情報の読み込み
credentials = service_account.Credentials.from_service_account_file(key_path)

# LLMの初期化
model = ChatVertexAI(
    model="gemini-2.0-flash-exp",
    project="vertexai-dev-1",
    location="us-central1",
    credentials=credentials,
)

# プロンプトの定義
prompt = "富士山とは何ですか？"

# 応答の生成
response = model.invoke(prompt)

print(response)

```