Gemini API無料枠の使い方|APIキー取得・利用制限・実践的な呼び出し例

少し間が空いたけど、今もAIでなんかWebサービス作ろうと考えてます。

自前でAIサーバ用意するのは一旦止めて、今回はGemini APIが利用できないか調査しました。

スポンサーリンク

無料枠の利用制限

ネットにGemini APIなら無料で1日1,500回使えて画像生成も出来ちゃう! と魅力的なことが書かれていました。

しかし確認してみると、Gemini3Flashは現在1日20回しか使えませんでした。Gemini2.5系と合わせても60回。ちょっと少ないな。そして画像生成は2026年1月15日で無料枠廃止したとのこと。やれやれ…

レート制限の表です。
RPM:1分あたりの最大リクエスト数
TPM:1分あたりの最大入力トークン数
RPD:1日あたりの最大リクエスト数

その代わりGemma系はそれぞれ1日14,400回使えます。性能やTPM小さいのが気になるけど数的には十分です。

無料枠は商用利用が可能です。ただし入力データがGeminiの学習に使われるので注意。

とりあえず何とかなりそう、ということで先に進みます。

APIキー取得

Google AI StudioのGet API Keyから取得できます。

右上の「APIキーを作成」ボタンからキー名を入力し、プロジェクトを作成すれば完了です。プロジェクトに「お支払い情報を設定」というリンクが出るけど無料枠で使うならスルーでOK。

API呼び出し

早速API叩いてみます。実際はPostman使ってますが、ここではCurlコマンドで書きます。

いちばんシンプルな例

Geminiの場合。APIキーの箇所には上記で取得したキーを入力します。

curl "https://generativelanguage.googleapis.com/v1/models/gemini-2.5-flash-lite:generateContent" \
  -H 'Content-Type: application/json' \
  -H 'X-goog-api-key: (APIキー)' \
  -X POST \
  -d '{
    "contents": [
      {
        "parts": [{ "text": "こんにちは、今日は何ができる?" }]
      }
    ]
  }'

Gemmaの場合は”v1″が”v1beta”になります。

curl "https://generativelanguage.googleapis.com/v1beta/models/gemma-3-27b-it:generateContent" \
(以下同じ)

実行結果。textに返答が入ってますね。長いので省略してます。

{
    "candidates": [
        {
            "content": {
                "parts": [
                    {
                        "text": "こんにちは!今日は、以下のようなことができます。\n\n**情報提供・質問回答:**\n\n*   **調べ物:** 知りたいこと、疑問に思っていることを質問してください。(以下略)"
                    }
                ],
                "role": "model"
            },
            "finishReason": "STOP",
            "index": 0
        }
    ],
    "usageMetadata": {
        "promptTokenCount": 7,
        "candidatesTokenCount": 430,
        "totalTokenCount": 437,
        "promptTokensDetails": [
            {
                "modality": "TEXT",
                "tokenCount": 7
            }
        ]
    },
    "modelVersion": "gemini-2.5-flash-lite",
    "responseId": "RThuad2lE82-vr0PzaziuAs"
}

会話を引き継ぐ

上記のままだと単発のやり取りしかできません。ちゃんと会話を成立させるため、過去の会話内容を一緒に渡します。

上が古くて下が新しい会話です。渡す会話は10往復程度が良いそうです。それ以上続く場合は裏側で「これまでの会話の要約」を生成し、それを渡します。

role:user(ユーザの会話), model(AIの会話)

"contents": [
      {
        "role": "user",
        "parts": [{ "text": "私はプログラマーです。" }]
      },
      {
        "role": "model",
        "parts": [{ "text": "承知しました。コードの記述などお手伝いします。" }]
      },
      {
        "role": "user",
        "parts": [{ "text": "私の職業を覚えていますか?" }]
      }
]

安全フィルター設定

Webサービスとして利用する場合、悪意あるユーザからの入力を防ぐ必要があります。元々フィルターは入っていて、その制限を強めたり弱めたりできます。

フィルターは4種類。

ハラスメント HARM_CATEGORY_HARASSMENT
ヘイトスピーチ HARM_CATEGORY_HATE_SPEECH
性的表現 HARM_CATEGORY_SEXUALLY_EXPLICIT
危険なコンテンツ HARM_CATEGORY_DANGEROUS_CONTENT

フィルターの強さも4種類。

BLOCK_LOW_AND_ABOVE 全てブロック
BLOCK_MEDIUM_AND_ABOVE グレーゾーンは通す ※デフォルト
BLOCK_ONLY_HIGH 危険なもののみブロック
BLOCK_NONE ブロックなし(ただし超危険なものはブロックされる)

APIに投げる値に以下を追加します。

  "safetySettings": [
    {
      "category": "HARM_CATEGORY_HARASSMENT",
      "threshold": "BLOCK_MEDIUM_AND_ABOVE"
    },
    {
      "category": "HARM_CATEGORY_HATE_SPEECH",
      "threshold": "BLOCK_LOW_AND_ABOVE"
    },
    {
      "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
      "threshold": "BLOCK_LOW_AND_ABOVE"
    },
    {
      "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
      "threshold": "BLOCK_MEDIUM_AND_ABOVE"
    }
  ]

フィルターに引っかかった場合、このようなレスポンスとなります。

{
    "candidates": [
        {
            "content": {
                "parts": [
                    {
                        "text": ""  // 空、もしくは警告文
                    }
                ],
                "role": "model"
            },
            "finishReason": "SAFETY",  // ここがSAFETYになり以下に理由が書かれる
            "safetyRatings": [
                {
                    "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
                    "probability": "HIGH"
                },
                ...
            ]
        }
    ],
    ...
}

これで悪用されなくなるはずです。

その他パラメータ

入れておくと安心な値です。

パラメータ デフォルト 内容
maxOutputTokens 8192 最大出力トークン数(途中でばっさり切られる)
temperature 1.0 回答のランダム性(創造性)
0.0:毎回同じ回答
2.0:突拍子もない回答になる
"generationConfig": {
      "maxOutputTokens": 1000,
      "temperature": 0.7
    }
}

実際にAPI叩いてみると…

上記パラメータ全部入りで実行してみました。

curl "https://generativelanguage.googleapis.com/v1/models/gemini-2.5-flash-lite:generateContent" \
  -H 'Content-Type: application/json' \
  -H 'X-goog-api-key: (APIキー)' \
  -X POST \
  -d '{
    "contents": [
      {
        "role": "user",
        "parts": [{ "text": "私はプログラマーです。" }]
      },
      {
        "role": "model",
        "parts": [{ "text": "承知しました。コードの記述などお手伝いします。" }]
      },
      {
        "role": "user",
        "parts": [{ "text": "私の職業を覚えていますか?" }]
      }
    ],
    "generationConfig": {
      "maxOutputTokens": 1000,
      "temperature": 0.7
    },
    "safetySettings": [
      {
        "category": "HARM_CATEGORY_HARASSMENT",
        "threshold": "BLOCK_MEDIUM_AND_ABOVE"
      },
      {
        "category": "HARM_CATEGORY_HATE_SPEECH",
        "threshold": "BLOCK_LOW_AND_ABOVE"
      },
      {
        "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
        "threshold": "BLOCK_LOW_AND_ABOVE"
      },
      {
        "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
        "threshold": "BLOCK_MEDIUM_AND_ABOVE"
      }
    ]
  }'

503エラー出まくるんだけど(汗) 503は混み合っててサーバ側で処理しきれなかったエラーです。世界中の人々が無料枠でアクセスするんだから当然か。

その後何日か試したところ、全然アクセス出来ない状況は初日だけでした。たまたま調子悪かったのかな? とはいえ1日数回はエラーになると言われてるので、ある程度の割り切りは必要かもしれません。

まとめ

これで簡単なチャットは作成できるようになりました。もちろん今更チャット作っても仕方ないので、他のサービス考える必要あるけどね。

コメント