Google Gemini API クレカなしで使える生成AI

無課金勢です。

従量課金に定評のある生成AIたちですが、Google Geminiがクレカなしで一通り使えて便利だったので、使えるようになるまでの手順をまとめました。

## 読んでほしい人

- ~~私のような~~クレジットカードを持っていない学生
- 生成AIの組み込みを試してみたいけどお金をかけたくない人
- 生成AIで遊んでみたい人

:::note warn
無料枠の個人利用を想定しています。
詳しくは[こちら](https://ai.google.dev/gemini-api/docs/pricing/)を参照してください。
:::

## Geminiとは
Googleが提供している生成AIです。
[Gemini利用規約](https://ai.google.dev/gemini-api/terms/)

一般利用において生成AI代表格のChatGPTと違う点は、課金しなくてもファイルをアップロードできることが大きいと思います。
そのような機能もAPIで扱うことができます。

## 使ってみる

### 用意するもの

- Googleアカウント(GCP・Google AI Studio)

### 下準備

#### GCPプロジェクトの作成

[Google Cloud コンソール](https://console.cloud.google.com/)

GCPにアクセスしたらGemini用のプロジェクトを作成しましょう。
既存のプロジェクトで使う場合、新たに作る必要はありません。

初めてアクセスした場合My First Projectというプロジェクトが作られます。
こだわりがなければそのまま使っても良いと思います。

![GCP1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903819/3af3fdd7-0d9f-4c69-aeea-2b03b5741869.png)

新しいプロジェクトを作成

![GCP2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903819/eb2c6910-b0a9-475a-a4b5-5bab4b6bd7bf.png)

#### APIキーの作成

[Google AI Studio](https://aistudio.google.com/)

Google AI StudioではGeminiのモデルを試したりモデル同士の比較ができたりします。

![key1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903819/922eb3be-2615-4f49-987e-f070690b6a89.png)

先ほど作成したプロジェクトを選択してAPIキーを作成します

![key2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903819/a82a74a1-7f70-4440-9765-a6b3220f076e.png)

APIキーをクリックするとコピーできます。

![key3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903819/56aa66c2-61b9-4b84-9392-ad9f9bb14b0e.png)

### 試してみる

というわけでAPIキー作成の上にcURLがあるので試しに動かしてみましょう。
APIキーはコピーしたものを貼り付けてください。

```bash
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=ここにAPIキー" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
  "contents": [{
    "parts":[{"text": "Explain how AI works"}]
    }]
   }'
```

結果

```json
{
  "candidates": [
    {
      "content": {
        "parts": [
          {
            "text": "Okay, let's break down how AI works. It's a broad field, so I'll focus on the core concepts and common techniques.長いので割愛\n\nThis is a high-level overview, and each of these areas has a lot more depth. If you have specific areas you'd like me to elaborate on, just let me know!\n"
          }
        ],
        "role": "model"
      },
      "finishReason": "STOP",
      "citationMetadata": {
        "citationSources": [
          {
            "startIndex": 2257,
            "endIndex": 2380
          },
          {
            "startIndex": 2878,
            "endIndex": 3001
          },
          {
            "startIndex": 4761,
            "endIndex": 4902
          },
          {
            "startIndex": 6550,
            "endIndex": 6681
          }
        ]
      },
      "avgLogprobs": -0.27055628493345085
    }
  ],
  "usageMetadata": {
    "promptTokenCount": 4,
    "candidatesTokenCount": 1613,
    "totalTokenCount": 1617,
    "promptTokensDetails": [
      {
        "modality": "TEXT",
        "tokenCount": 4
      }
    ],
    "candidatesTokensDetails": [
      {
        "modality": "TEXT",
        "tokenCount": 1613
      }
    ]
  },
  "modelVersion": "gemini-2.0-flash"
}
```

長かったので割愛しました。
少し待ってこのように返ってくればとりあえず使えるようになっています。

生成AI全般そうですが、Geminiもマークダウンを使用して返答するので、必要に応じてプロンプトで指示したりマークダウンを置換するようなプログラムを作成しましょう。

私がやった限りでは返答をJSON形式にさせる場合、いくらプロンプトで指示してもコードブロックで返してきたので、置換することにしました。

### おまけ

私が組み込む上でしたこともまとめておきます。
だいたい[公式ドキュメント](https://ai.google.dev/gemini-api/docs/)に書いてあります。

#### モデルの変更

モデルによって言うことを聞いてくれやすかったりにくかったり、返答が早かったり遅かったりします。

![other1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903819/74f4980b-36cf-4271-a6b4-63f1a6870cc0.png)

モデル名の下に書いてある部分をURLに入れるとそのモデルを使うことができます。
```
https://generativelanguage.googleapis.com/v1beta/models/ここにモデル:generateContent?key=ここにAPIキー
```

#### システムインストラクション

初期設定するプロンプトです。
ChatGPTなどのシステムプロンプトに該当します。

```json
{
  "system_instruction": {
    "parts": {"text": "You are a cat. Your name is Neko."}
  },
  "contents": {
    "parts": {"text": "Hello there"}
  }
}
```

<details><summary>結果</summary>

```json
{
  "candidates": [
    {
      "content": {
        "parts": [
          {
            "text": "Mrow! Hello, human. What do you have for me? Is it tuna? Or maybe a nice sunbeam? I am Neko, and I am ready for attention. *purrs expectantly*\n"   
          }
        ],
        "role": "model"
      },
      "finishReason": "STOP",
      "avgLogprobs": -0.52213126962835144
    }
  ],
  "usageMetadata": {
    "promptTokenCount": 13,
    "candidatesTokenCount": 44,
    "totalTokenCount": 57,
    "promptTokensDetails": [
      {
        "modality": "TEXT",
        "tokenCount": 13
      }
    ],
    "candidatesTokensDetails": [
      {
        "modality": "TEXT",
        "tokenCount": 44
      }
    ]
  },
  "modelVersion": "gemini-2.0-flash"
}
```

かわいい🐈~~Geminyan~~

</details>


#### ファイルの送信

Geminiは画像、動画、音声も読み取ってくれます。

<details><summary>対応しているファイル</summary>

| ファイル形式 | 拡張子 | MIMEタイプ |
| - | - | - |
| 画像 | PNG | image/png |
| 画像 | JPEG | image/jpeg |
| 画像 | WEBP | image/webp |
| 画像 | HEIC | image/heic |
| 画像 | HEIF | image/heif |
| 動画 | MP4 | video/mp4 |
| 動画 | MPEG | video/mpeg |
| 動画 | MOV | video/quicktime |
| 動画 | AVI | video/x-msvideo |
| 動画 | FLV | video/x-flv |
| 動画 | MPG | video/mpeg |
| 動画 | WEBM | video/webm |
| 動画 | WMV | video/x-ms-wmv |
| 動画 | 3GPP | video/3gpp |
| 音声 | WAV | audio/wav |
| 音声 | MP3 | audio/mpeg |
| 音声 | AIFF | audio/aiff |
| 音声 | AAC | audio/aac |
| 音声 | OGG | audio/ogg |
| 音声 | FLAC | audio/flac |

</details>

```json
{
  "contents": {
    "parts":[
      {"text": "Tell me about this instrument"},
      {
        "inline_data": {
          "mime_type": "image/jpeg",
          "data": "base64でエンコードした画像"
        }
      }
    ]
  }
}
```

公式ドキュメントのプロンプトに従って楽器のバンジョーを送ってみます。

https://commons.wikimedia.org/wiki/File:BluegrassBanjo.jpg

<details><summary>結果</summary>

```json
{
  "candidates": [
    {
      "content": {
        "parts": [
          {
            "text": "Based on the image, the instrument is a banjo. It appears to be a 5-string banjo, given the number of tuning pegs visible on the headstock and the overall look. It has a resonator, which is the circular drum-like part of the instrument, a neck with frets, and a tailpiece at the bottom. There is also a strap attached, and it is equipped with an armrest on the left side.\n"
          }
        ],
        "role": "model"
      },
      "finishReason": "STOP",
      "avgLogprobs": -0.69045356150423542
    }
  ],
  "usageMetadata": {
    "promptTokenCount": 2327,
    "candidatesTokenCount": 89,
    "totalTokenCount": 2416,
    "promptTokensDetails": [
      {
        "modality": "TEXT",
        "tokenCount": 5
      },
      {
        "modality": "IMAGE",
        "tokenCount": 2322
      }
    ],
    "candidatesTokensDetails": [
      {
        "modality": "TEXT",
        "tokenCount": 89
      }
    ]
  },
  "modelVersion": "gemini-2.0-flash"
}
```

意訳：5弦のバンジョーだね。

</details>

私は画像一枚だったので使っていませんが、合計20MB超える際はGoogle File APIを使うみたいです。

ファイルのみを送信する場合でもtextプロパティは必要なので
`"text": ""`としましょう。

## まとめ

これで生成AIのGeminiを~~タダで~~使うことができました！
SDKを使うと前の会話を参照したりできるようなので気になったら使ってみましょう。