26
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

HRBrainAdvent Calendar 2024

Day 24

Gemini API + Cloudflare + Astro で作るアイスブレイクジェネレーター

Last updated at Posted at 2024-12-23

HRBrain Advent Calendar 2024 24日目の記事です。

はじめに

こんにちは。@yug1224(Yuji Yamaguchi)です。

MTGをスムーズに進めるためのアイスブレイク。しかし、毎回ありきたりな質問になりがちで、新しいアイデアを考えるのに苦労することもあります。そこで今回は、Googleの大規模言語モデルGeminiを活用し、アイスブレイクの話題を生成するWebアプリケーションを作ってみました。

Google AI Studio を使った準備

まず、Google AI StudioでGemini APIのAPI Keyとサンプルコードを取得します。Google AI Studioは、Geminiを利用するための環境が整っており、API Keyの管理やプロンプトの実行が簡単に行えます。

  1. Google AI Studioのプロジェクトを開きます
  2. API Keyとサンプルコードを取得します
API Key Gemini Code
daab3ab50a74df57971d_スクリーンショット_2024-12-24_API_Key.png daab3ab50a74df57971d_スクリーンショット_2024-12-24_Gemini_Code.png
サンプルコード
const {
  GoogleGenerativeAI,
  HarmCategory,
  HarmBlockThreshold,
} = require('@google/generative-ai')

const apiKey = process.env.GEMINI_API_KEY
const genAI = new GoogleGenerativeAI(apiKey)

const model = genAI.getGenerativeModel({
  model: 'gemini-1.5-flash',
})

const generationConfig = {
  temperature: 2,
  topP: 0.95,
  topK: 40,
  maxOutputTokens: 8192,
  responseMimeType: 'text/plain',
}

async function run() {
  const chatSession = model.startChat({
    generationConfig,
    history: [],
  })

  const result = await chatSession.sendMessage('INSERT_INPUT_HERE')
  console.log(result.response.text())
}

run()

上記は取得可能なサンプルコードです。JavaScript以外にもGoやPythonのコードがあるので、ご自身の環境に合わせて選択できます。

Astro Actionsを用いたAPIリクエスト

このアプリケーションでは、フレームワークにAstroを採用しました。

まだExperimentalな機能ですが、バックエンド関数を呼びだすことができるAstro Actionsを利用して、Gemini APIにリクエストを送信します。

  1. #generateTalkThemeボタンの押下時、Gemini APIにリクエストを送信する
  2. nanostoresを利用して、生成結果はクライアントサイドで保持しておく
  3. #generateTalkThemeボタンの再押下時、これまでの生成結果も渡すことで、類似の話題が生成されないようにする
src/stores/index.ts
import { atom } from 'nanostores'

export const $talkThemes = atom<string[]>([])
src/actions/index.ts
import { defineAction } from 'astro:actions'
import { z } from 'astro:schema'
import { GoogleGenerativeAI } from '@google/generative-ai'

const Message = `
## 要求事項
- アイスブレイクのお題を1つ生成し、生成した結果のみを出力してください。
- ただし、下記履歴と同様のお題は除外していてください。

## 履歴
`

export const server = {
  myAction: defineAction({
    input: z.array(z.string()),
    handler: async (input) => {
      const apiKey = import.meta.env.GOOGLE_AI_API_KEY
      const genAI = new GoogleGenerativeAI(apiKey)

      const model = genAI.getGenerativeModel({
        model: import.meta.env.GOOGLE_AI_MODEL,
      })

      const generationConfig = {
        temperature: 2,
        topP: 0.95,
        topK: 40,
        maxOutputTokens: 8192,
        responseMimeType: 'text/plain',
      }

      const chatSession = model.startChat({
        generationConfig,
        history: [],
      })
      const sendMessage = Message + '- ' + input.join('- ')

      const result = await chatSession.sendMessage(sendMessage)
      return result.response.text()
    },
  }),
}
src/components/Hero.astro
<div class="hero bg-base-200 min-h-screen">
  <div class="hero-content text-center">
    <div class="w-full">
      <h1 class="text-4xl font-bold break-keep">
        アイスブレイク<wbr />ジェネレーター
      </h1>
      <p id="talkTheme" class="text-2xl py-12">
        あのイーハトーヴォのすきとおった風
      </p>
      <button id="generateTalkTheme" class="btn btn-primary">Ice Break</button>
    </div>
  </div>
</div>

<script>
  import { actions } from 'astro:actions'
  import { $talkThemes } from '../stores'

  const button = document.querySelector('#generateTalkTheme')
  const paragraph = document.querySelector('#talkTheme')

  button?.addEventListener('click', async () => {
    const { data, error } = await actions.myAction($talkThemes.get())
    if (!error && paragraph) {
      console.log(data)
      $talkThemes.set([data, ...$talkThemes.get()])
      paragraph.textContent = $talkThemes.get()[0]
    }
  })
</script>

Cloudflare Workersにデプロイする

最後に、アプリケーションをCloudflare Workersにデプロイします。Cloudflare Workersは、Cloudflareが提供するサーバーレスアプリケーションを構築・デプロイするためのプラットフォームであり、迅速なデプロイとスケーリングを可能にします。

  1. @astrojs/cloudflareをAstroプロジェクトに追加し、SSRを有効にします
  2. astro buildで、Astroプロジェクトをビルドします
  3. npx wrangler pages deploy distで、生成された成果物をCloudflare Workersにデプロイします
astro.config.mjs
import { defineConfig } from 'astro/config'
import tailwind from '@astrojs/tailwind'
import cloudflare from '@astrojs/cloudflare'

export default defineConfig({
  integrations: [tailwind()],
  adapter: cloudflare({ mode: 'directory' }),
  output: 'server',
})

daab3ab50a74df57971d_画面収録_2024-12-24_アイスブレイクジェネレーター.gif

まとめ

Gemini API・Cloudflare・Astroを組み合わせることで、高機能でスケーラブルなアイスブレイクジェネレーターを簡単に構築できました。

実際に作ったアプリケーションとソースコードも公開しているので、良かったら参考にしてみてください!

We're hiring!

HRBrainでは一緒に働く仲間を募集しています。歴史に残るトライをしよう!

26
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?