🔥

Firebase Genkit + DiscordJSで始めるDiscord Bot作成

2024/08/04に公開

先日 Google Cloud Next Tokyo'24に参加してきました。

https://note.com/samurai_se/n/n14850ca3a06a

当日はさまざまなセッションを拝聴したのですが、セッションのみならず全体的にGeminiにフィーチャーした会でした。

自分は2日間参加したのですが、参加した結果すっかりGeminiを試してみたくなり、実際に手を動かしてみた内容[1]をこの記事として公開しています。

環境構築

Discord Appの作成

まずはDoscord開発者ポータルへアクセス。

https://discord.com/developers/applications

アプリケーションを作成します。

次にトークンを生成し、インテントをアクティブ化します。

Gemini API keyの取得

chat botで利用するGeminiを呼び出すためのAPIキーを取得します。

https://ai.google.dev/gemini-api/docs/api-key?hl=ja

その後、「APIキーを生成」からchatbotで利用するキーを作成します。作成後、このキーを控えておきます。

ライブラリのインストール

Nodeがインストールされている前提。

npm init -y
npm install discord.js
npm install @genkit-ai/googleai

これでひとまず準備完了です。

botでDiscordにログインできることを確認する

index.js
const { Client, GatewayIntentBits } = require("discord.js");
require("dotenv").config();

const client = new Client({
    intents: [
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildMessages,
        GatewayIntentBits.MessageContent,
    ],
});

client.once("ready", () => {
    console.log(`こんにちは、AI chat botです!何かお手伝いしましょうか?`);
});

client.login(process.env.DISCORD_TOKEN);

intentというのはDiscord独特な概念らしいです。一言で言えば、「botが受信するイベント」のことらしいです。詳しくはこちらに。

https://discordjs.guide/popular-topics/intents.html#privileged-intents

ここではbotがプロンプトとなるメッセージを受信するのに最低限必要なintentを付与し、ログイン後に一度だけメッセージが表示される様になっています。

dotenvで読み込んでいる、DISCORD用のトークンを.envに用意します。

このトークンは先の環境準備の際に作成したトークンです。

.env
DISCORD_TOKEN=<先の環境準備の際に作成したトークン>

ここまで準備した上で、動作を確認します。

node index.js

ターミナルにこんにちは、AI chat botです!何かお手伝いしましょうか?が表示されれば成功です!

Geminiからレスポンスを取得する部分の実装

ひとまずGeminiからレスポンスが返ってくることを確認するためにclient.onceの実装を書き換えてみます。

index.js
const { Client, GatewayIntentBits } = require("discord.js");
require("dotenv").config();
const { googleAI, gemini15Flash } = require("@genkit-ai/googleai");
const { configureGenkit } = require("@genkit-ai/core");
const { generate } = require("@genkit-ai/ai");

// Configure Genkit with the Google Generative AI plugin
configureGenkit({
    plugins: [googleAI({ apiVersion: "v1beta" })],
});

const client = new Client({
    intents: [
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildMessages,
        GatewayIntentBits.MessageContent,
    ],
});

client.once("ready", async () => {
    console.log(`こんにちは、AI chat botです!何かお手伝いしましょうか?`);
    const llmResponse = await generate({
        model: gemini15Flash,
        prompt: `次の内容に日本語で返事してあげて。: 今日の献立を提案して`,
    });
    console.log(llmResponse.text());
});

client.login(process.env.DISCORD_TOKEN);

次に.envに以下の内容を追記します。

.env
DISCORD_TOKEN=<先の環境準備の際に作成したトークン>
+ GOOGLE_GENAI_API_KEY=<先の環境準備の際に作成したAPIキー>

コードのなかではAPIキーのセットを行っていません。どうやらライブラリ側で環境変数を見に行ってくれている様です。

環境変数にAPIキーをセットせずに実行した場合、以下の様にエラーメッセージが出力されます。

メッセージによると、GOOGLE_GENAI_API_KEY または GOOGLE_API_KEYをセットしてあげればよいようです。

ではこの状態でjsを実行します。

node index.js

自分の環境では以下の様なレスポンスを取得できました。

例えば、

* **がっつり食べたい気分なら:** 豚肉と野菜の炒め物、ご飯、味噌汁
* **さっぱり食べたい気分なら:** 鶏むね肉と豆腐の冷奴、野菜たっぷりサラダ、ご飯
* **ちょっと贅沢したい気分なら:** サーモンのムニエル、きのこパスタ、サラダ

など、どんなものが好みか教えてください!

作成したコードをDiscord Botへインストール

Discord開発者ポータルから、botに必要な権限を付与してあげます。

次に、↓からhttps://discord.com/oauth2/authorize?client_id=xxxのリンクをコピーし、ブラウザにペーストします。

以下の画面が表示されるので、「サーバーに追加」より追加してあげます。

その後、ローカルでDidcord botを動作させるため、node index.jsを実行します。

すると、サーバーに追加したDiscord botがオンライン状態になっていることが確認できるはずです。

あとは、メンションをつけてボットにいろいろ聞いてみると…

こんな感じでやりとりしてくれます!

おわりに

Firebase Genkitの方はめちゃくちゃ簡単に扱うことができました!

どっちかというとDiscord botの仕様についてわからないことの方が多いくらいで、AIとのやりとり自体はとても簡単でした。

今回は簡単に試すだけだったのでやってないですが、プロンプトの履歴をもたせたりとかも普通にできそう🤔

ぶっちゃけこの程度のことならもうすごく簡単に始められる時代がきてますよね。仕事でRAGをChatGPTでやったりしてますが、やや複雑ではあるものの実装自体はそこまで難しくないという。

いずれはGoogle Cloud Nextのこの日本放送さんの事例のように、大規模なAI活用システムの実装などに関わってみたいものです。

https://x.com/googlecloud_jp/status/1819186392473501703

脚注
  1. 手を動かすにあたり、以下の英語記事を参考にさせていただきました。 https://medium.com/welltested-ai/create-a-discord-bot-with-ai-features-firebase-genkit-discordjs-01a715ace219 ↩︎

Discussion