仕組み (アーキテクチャ)
これを設定する前に、個別のボットアプリケーションをホストしたり、サーバー上で「ボット」スクリプト(Node.jsやPythonボットなど)を実行したりする必要がないことを理解しておくことが重要です。
このインテグレーションは、Discordインタラクション(Webhook)とプログレッシブ編集を組み合わせて、ストリーミングAI体験をシミュレートします:
- ユーザーアクション: ユーザーがDiscordサーバーで
/askと入力します。 - Webhook: DiscordはHTTP POSTリクエストを直接Discourseサーバーに送信します。
- 即時Ack: Discourseは「検索中…」ステータスで即座に応答します。これにより、Discordの「インタラクション失敗」タイムアウトを防ぎます。
- ストリーミング応答: バックグラウンドジョブがAIの回答の生成を開始します。AIがテキストを生成するにつれて、Discourseは頻繁にHTTP PATCHリクエストを送信し、Discordメッセージをリアルタイムで編集します。
結果: ユーザーは、単一の静的なテキストブロックを待つのではなく、ChatGPTのように回答がライブで入力されているのを目にします。
主な利点: Discourseがロジックを内部で処理するため、維持すべき追加のインフラストラクチャがありません。フォーラムがオンラインであれば、ボットもオンラインです。
このガイドでは、Discourse AIボットをDiscordサーバーと統合するための完全なプロセスを詳述します。プラグイン内の自動同期の問題を回避するために現在必要とされている、スラッシュコマンドを手動で登録するための具体的な手順が含まれています。
前提条件
- Discourse管理者アクセス: セルフホスト型Discourseインスタンスの管理者である必要があります。
- Discord管理者アクセス: 対象のDiscordサーバーで「サーバー管理」権限を持っている必要があります。
- ターミナルアクセス:
curlコマンドを実行するためにターミナルが必要です。
1. Discordアプリケーションの作成
- Discord開発者ポータルに移動します。
- 右上隅にある新しいアプリケーションをクリックします。
- アプリケーションに名前(例:「Discourse Helper」)を付け、作成をクリックします。
- 認証情報のコピー: 一般情報ページで、後で使用するために次の情報を探して保存します。
2. ボットユーザーの設定
-
左側のサイドバーメニューでボットをクリックします。
-
トークンのリセットをクリックします。
-
特権インテントを有効にする:
- 「特権ゲートウェイインテント」セクションまで下にスクロールします。
- メッセージ内容インテントをオンに切り替えます。(これにより、ボットは応答する必要のあるメッセージを読み取れるようになります)。
-
変更を保存をクリックします。
3. Discourse設定の構成
-
Discourse管理者パネルにログインします。
-
管理 → プラグイン → AI → 機能に移動します。
-
"discord"を検索し、編集をクリックします。
-
詳細を入力します
AI Discord app ID:=ApplicationId=を貼り付けますAI Discord app public key:=PublicKey=を貼り付けます
-
Discordサーバーを許可する:
- Discordアプリを開き、開発者モードを有効にします(ユーザー設定 → 詳細設定 → 開発者モード)。
- サイドバーのサーバーアイコンを右クリックし、サーバーIDをコピーを選択します。
- Discourse設定で、このIDを
AI Discord allowed guildsフィールドに貼り付けます。
4. インタラクションエンドポイントの設定
- エンドポイントURLを構築します:
https://=ForumUrl=/discourse-ai/discord/interactions - Discord開発者ポータルに戻ります。
- 一般情報ページで、インタラクションエンドポイントURLまでスクロールします。
- URLを貼り付け、変更を保存をクリックします。
- 成功: Discordがテスト信号を送信します。エラーなしで保存された場合、Discourseインスタンスは署名を正常に検証しました。
- 失敗: エラーが発生した場合は、Discourse設定に
AI Discord app IDとAI Discord app public keyが正しく保存されていることを確認してください。
5. ボットの招待
- 開発者ポータルで、サイドバーのインストールをクリックします。
- スコープ:
botとapplications.commandsのチェックボックスをオンにします。 - ボットの権限: 次の項目にチェックを入れます。
- メッセージの送信
- リンクの埋め込み
- ファイルの添付
- メッセージ履歴の読み取り
- ページ上部にあるインストールリンクをコピーします。
- このURLをブラウザタブで開き、ボットをサーバーに参加させることを承認します。
6. スラッシュコマンドの登録 (手動API呼び出し)
重要: コマンドのパラメータ名はqueryである必要があります。
Mac / Linux (Bash) の場合
curl -X POST "https://discord.com/api/v10/applications/=ApplicationId=/commands" \
-H "Authorization: Bot =BotToken=" \
-H "Content-Type: application/json" \
-d '{
"name": "ask",
"description": "AIに質問する",
"options": [
{
"name": "query",
"description": "あなたの質問は何ですか?",
"type": 3,
"required": true
}
]
}'
- 成功時の応答: 新しいコマンドのIDを含むJSON応答を受け取るはずです。
- エラー401? 認証ヘッダーでトークンの前に
Bot(スペースあり)という単語を維持していることを確認してください。
7. 検証
- Discordサーバーを開きます。
- テキストチャンネルで
/askと入力します。 - コマンドメニューが表示されるはずです。
/askを選択し、queryフィールドに質問を入力します。 - 期待される動作:
- 即時: ボットが「検索中…」と返信します。
- 数秒後: メッセージがAIの回答で更新されます。
トラブルシューティング
| エラー | 原因 | 解決策 |
|---|---|---|
| Curlで401 Unauthorized | トークンの形式が間違っている | ヘッダーがAuthorization: Bot =BotToken=であることを確認してください。Botタブではなく、一般タブのトークンを使用してください。 |
| Job例外: contextがBotContextのインスタンスである必要があります | ペイロードが間違っている | 最新の状態になっていることを確認してください。これはFIX: Discord Bot crash due to missing BotContext in PersonaReplier by devtekve · Pull Request #36429 · discourse/discourse · GitHub |




