🦔
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