少し間が空いたけど、今も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日数回はエラーになると言われてるので、ある程度の割り切りは必要かもしれません。
まとめ
これで簡単なチャットは作成できるようになりました。もちろん今更チャット作っても仕方ないので、他のサービス考える必要あるけどね。


コメント