🦔

ruby で gemini api を動かしてみる

に公開

Google AI Studio で API キーをもらう

ブラウザで [https://aistudio.google.com/ ]にアクセスして、APIキーを取得しましょう

取得したAPIキーはenvファイルにコピペ!
.env は 絶対に GitHub などに公開しない!
(キーがバレると他人にタダ乗りされます)

フォルダーと Gemfile を用意

gemini-chatbot/
├── Gemfile
├── app.rb
├── views/
│ └── index.erb
└── public/
└── js/
└── main.js

gemilfeを利用して以下のgemをインストールします(ruby:ver3.3.1)

  • sinatra
  • sinatra-contrib
  • faraday
  • dotenv

gemfileに書いた内容が反映させることを忘れずに

$ bundle install

フロント側ファイル

main.js
document.addEventListener('DOMContentLoaded', () => {
  const form  = document.getElementById('chat-form');
  const input = document.getElementById('message');
  const box   = document.getElementById('response');

  form.addEventListener('submit', async e => {
    e.preventDefault();

    const msg = input.value.trim();
    if (!msg) return;

    box.textContent = '…thinking';

    // TODO: fetch の第二引数を完成させよう(method, headers, body)
    const res  = await fetch('/chat', { /* ... */ });
    const data = await res.json();

    box.textContent = data.response || data.error;
    input.value = '';
  });
});

ステップアップできる方はtry catchを使うとよりよいコードになると思います

index.erb
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Gemini Chat</title>
  <script defer src="/js/main.js"></script>
</head>
<body>
  <form id="chat-form">
    <input  id="message" name="message"
            type="text" placeholder="メッセージを入力" >
    <button>送信</button>
  </form>
  <div id="response"></div>
</body>
</html>

バックエンド(Sinatra)

app.rb
require 'sinatra'
require 'sinatra/reloader' if development?
require 'dotenv/load'
require 'faraday'
require 'json'

API_KEY  = ENV.fetch('GEMINI_API_KEY')
MODEL    = 'models/gemini-1.5-flash-latest' #モデルはそれぞれに合わせて変更してください
ENDPOINT = "https://generativelanguage.googleapis.com/v1beta/#{MODEL}:generateContent"

helpers { def json(obj) = obj.to_json }

post '/chat' do
  prompt = #TODO: index.erbで入力された内容を取得して、文字列に変換して送信します
  halt 400, json(error: 'メッセージがありません') if prompt.empty?

  body = {
    contents: [
      { role: 'user', parts: [ { text: prompt } ] }
    ],
    generationConfig: {
      temperature: 0.7,
      maxOutputTokens: 1024
    }
  }

  res = Faraday.post("#{ENDPOINT}?key=#{API_KEY}", body.to_json,
                     'Content-Type' => 'application/json')

    text = JSON.parse(res.body)
             .dig('candidates', 0, 'content', 'parts', 0, 'text')
    content_type :json
    json(response: text)
end

get '/' do
  erb :index
end

今回は簡易的にチャットボットを作成したため、500エラーの時のエラーハンドリングなどはしていませんが、if文などで条件分岐するとより良いと思いました

起動してテスト

$ ruby app.rb

入力欄に こんにちは と打って送信 → 数秒後に AI の返答が表示されれば成功!

Discussion