ChatGPTをDiscordで使えるようにしてみた(nest.js)

2023/03/07に公開

超ざっくり手順の説明をするよ

まずnode.jsを使うね

1.プロジェクトを作る

  • 適当な名前で空のフォルダを作成
  • package.jsonの作成・インストール
  • 空のindex.jsを作成
command
npm init -y 
npm install discord.js openai dotenv

  • discordのトークン/OpenAIのORG・KEYが後で必要になります

2. Discord Developer Portalでbot作成

1.以下のリンクにアクセス

https://discord.com/developers/applications

2.新規Applicationの作成

  • New Applicationボタンを押下、名前を設定し作成
  • 作成したApplicationからBotを選択し、Add Botで作成
  • トークンの発行
    • これが.envのDISCORD_TOKENにあたる

  • BOTのMESSAGE CONTENT INTENT にチェック

3. discordの鯖へ招待

1. ApplicationのOAuth2でURL Generatorを行いアクセス

  • SCOPESのbot・BOT PERMISSIONSのAdministratorにチェック
  • 以下のようなURLになる(client_idは自分のID)
https://discord.com/api/oauth2/authorize?client_id={自分のID}&permissions=8&scope=bot
  • URLにアクセス、鯖を選択して招待

4.OpenAIで必要情報の取得

1.KEYの発行と.envの設定

  • ログインして右上の個人アイコンからView API Keysを選択
  • Create new secret keyを押下して、KEYを発行
    • これが.envのOPENAI_KEY
  • 同画面のsettingsからOrganization IDを探す
    • これが.envのOPENAI_ORG

5.実装

1. APIを利用して実装する

index.js
require("dotenv").config();

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

const { Configuration, OpenAIApi } = require("openai");
const configuration = new Configuration({
  organization: process.env.OPENAI_ORG,
  apiKey: process.env.OPENAI_KEY,
});
const openai = new OpenAIApi(configuration);

client.on("messageCreate", async function (message) {
  try {
    if (message.author.bot) return;

    const getResponse = await openai.createChatCompletion({
      model: "gpt-3.5-turbo",
      messages: [{ role: "user", content: `${message.content}` }],
    });

    message.reply(`${getResponse.data.choices[0].message.content}`);
    return;
  } catch (err) {
    console.log(err);
  }
});

client.login(process.env.DISCORD_TOKEN);

2. 実行

node .\index.js  
  • こんな感じに表示されればOK!

6.text-davinci-003との違い

  • openai.createCompletionからopenai.createChatCompletion
  • promptからmessages
    • roleという権限が必要になった
text-davinci-003
const getResponse = await openai.createCompletion({
      model: "text-davinci-003",
      prompt: `${message.content}`,
      temperature: 0.9,
      max_tokens: 500,
    });
gpt-3.5-turbo
const getResponse = await openai.createChatCompletion({
      model: "gpt-3.5-turbo",
      messages: [{ role: "user", content: `${message.content}` }],
    });

Discussion