🐥

Discord スラッシュコマンドでファイルアップロードする

2023/07/06に公開

はじめに

誰かがファイルをアップロードしたら、それをVectorDBに格納するコマンドが作ろうと思っています。
そこで、前段階として、スラッシュコマンドでファイルをアップロードできないか調べてみました。

なお、開発環境はNode.jsで、本番環境はAWS Lambdaを使って運用しています。
すでにbotの作成、登録済みであることを前提としています。
(そちらの解説はしません)

コマンドの作成

公式ドキュメントにて、コマンドのオプションを調べると"ATTACHMENT"がありました。

Application Command Option Type

上記をもとに、
以下のようにパラメタを作り

const PDF_COMMAND = {
  name: "pdf",
  description: "PDFのアップロード",
  type: 1,
  options: [
    {
      name: "memo",
      type: 3,
      required: true,
      description: "ファイル説明",
    },
    {
      name: "pdf",
      type: 11,
      required: true,
      description: "PDFファイル",
    },   
  ],
};

実行します。
PDF_COMMAND以外は既存のコマンド(ダミー)です。

const ALL_COMMANDS = [A_COMMAND, B_COMMAND, C_COMMAND, PDF_COMMAND];
InstallGlobalCommands(DISCORD_APP_ID, ALL_COMMANDS);

コマンドの作成方法の詳細は触れませんが、コードは公式ドキュメントでも使われている以下のサンプルコードを参照してください。
discord/discord-example-app

コマンドが作成されたかチェック

ドラッグ&ドロップするとファイルの項目が埋まるので、残りの項目を入力して送信します。

ログを取るとパラメタが届いていることがわかります。

形式は以下の資料のとおりです。

Interaction Object

上記内の"data"が

Interaction Data

で、"resolved"というキーが以下のResolved Dataです。

Resolved Data Structure

"attachment"というキーに目当てのファイルの情報が格納されます。

Attachment Object

※画像URLに urlと proxy_url があり、後者はCDNでキャッシュされた画像URLのようです。削除されるタイミングやURLが一定でないなど仕様の違いがあるようですが、明確に定義された資料が見つかっていません。
ただし、今回の用途はアップロード直後で、なおかつ内部アクセスなので、いずれを使っても大きな支障はないかと思います。

最後に

画像のURLが取れたので具体的な処理は省きます。
機会があれば、読み込んだファイルをVectorDBに格納する処理あたリは別途記事にするかもしれません。

ChatGPTは、いわば 1on1で生成AIと向き合うわけですが、Discordなどで資料を持ち寄りLLMを交えてディスカッションしてみるのも面白そうなので、この機能を使って実現してみたいと思います。

Discussion