はじめに
チャット型AIのAPIを使ってAI機能をRailsアプリに組み込もうとしたところ、Geminiが無料枠で使えることを知り、Geminiを使うことにしました。
RubyにはGemini用の公式gemが存在しないことを知り、直接APIを叩く方法をつかうことになったので、それを共有します。
APIキーの設定
まずは、Google AI Studioにアクセスし、左側のダッシュボードから"APIキー"の欄を選択し、APIキーを取得しましょう。
次に環境変数としてAPIキーを設定しましょう。
GEMINI_API_KEY="APIキー"
.envやcredentialに入れても問題ありません。
使用可能モデルを確認する
Geminiのモデル名は変わることがあるため、使用可能なモデル名を取得しておきましょう。
curl "https://generativelanguage.googleapis.com/v1/models?key=YOUR_API_KEY"
YOUR_API_KEYには先ほど取得したAPIキーを入れてください。ENV["GEMINI_API_KEY"]を入れてもOKです。
すると、"models/gemini-2.5-flash"といったようなモデル名がJSON形式で返ってくるため、コピーしておきましょう。
HTTPの基本
ここから実際にAPIを叩いていきますが、今回知っていていただきたいHTTP通信の基本をおさらいします。
POST /v1/models/gemini-2.5-flash:generateContent?key=API_KEY HTTP/1.1 ←リクエストライン
Host: generativelanguage.googleapis.com ←ヘッダ開始
Content-Type: application/json; charset=UTF-8
Content-Length: xxxx ←ヘッダここまで
{ ...JSON本文など... } ←ボディ
HTTPメッセージは
- リクエストライン
- ヘッダ
- ボディ
から構成されていることを意識すると、実際のコードもよく理解できます。
NET:HTTPで簡単にAPIを叩く
以下のようなコードでGeminiに挨拶をし、返答を出力してみます。
require "net/http"
require "json"
require "uri"
api_key = ENV["GEMINI_API_KEY"]
uri = URI("https://generativelanguage.googleapis.com/v1/models/gemini-2.5-flash:generateContent?key=#{api_key}")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request["Content-Type"] = "application/json"
request.body = {
contents: [
{
parts: [
{ text: "こんにちは。自己紹介してください。" }
]
}
]
}.to_json
response = http.request(request)
json = JSON.parse(response.body)
puts json.dig("candidates", 0, "content", "parts", 0, "text")
上から簡単にコードを解説します。
require "net/http"
require "json"
require "uri"
api_key = ENV["GEMINI_API_KEY"]
まずは標準ライブラリを読み込んで、環境変数を設定しています。
uri = URI("https://generativelanguage.googleapis.com/v1/models/gemini-2.5-flash:generateContent?key=#{api_key}")
こちらはURLの文字列からURIのオブジェクトを作っています。のちにuri.hostような形で用い、ホスト名やポート番号を取得できるようになります。
gemini-2.5-flashにはcurlで得たモデル名を入れましょう。
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
ホスト名とポート番号を指定し、HTTP通信するためのオブジェクトを作っています。また、ssl通信を指定しています。
request = Net::HTTP::Post.new(uri)
request["Content-Type"] = "application/json"
この記述はPOSTメソッドでリクエストを送るためのオブジェクトを作っています。リクエストの内容として、Json形式を指定しています。
request.body = {
contents: [
{
parts: [
{ text: "こんにちは。自己紹介してください。" }
]
}
]
}.to_json
HTTPリクエストのボディを指定しています。Geminiではこの形式でリクエストを送る必要があります。
例えば、partsの中には複数の要素を入れることができます。
"parts": [
{ "text": "この画像を説明して" },
{ "inline_data": { ...画像データ... } }
]
今回は自己紹介をテキストで要求しているため、textのみを使用しています。
response = http.request(request)
json = JSON.parse(response.body)
この部分は、requestオブジェクトに対する応答をオブジェクトとして受け取り、リクエストのボディをRubyの八種に変換しています。
json["candidates"][0]["content"]["parts"][0]["text"]とすることで中身のテキストを取得できます。
puts json.dig("candidates", 0, "content", "parts", 0, "text")
これは中身のテキストを取り出して標準出力をしています。
これでGeminiから回答を得ることができました。
まとめ
- Gemini APIキーを取得する
- Geminiのモデル名を確認する
- NET:HTTPで通信する
標準ライブラリだけでも十分に Gemini API は扱えます。
Rails から AI 機能を組み込みたい場合の最小実装として参考になれば幸いです。