OpenFang マルチチャネルアダプター設定ガイド

約13分で読めます

OpenFangは40種類以上のチャネルアダプターをサポートしています。本記事では、CLI、WhatsApp Business API、Telegram Bot、Discord、Slack Socket Mode、Web Chatウィジェットという6つの主要アダプターの設定方法を詳しく解説します。マルチチャネルの同時実行、コンテキスト共有、セキュリティ強化、状態監視のための包括的なソリューションを提供します。

OpenFang マルチチャネルアダプター設定ガイド:Agentをどこへでも

Slug: openfang-channel-setup-guide カテゴリー: usage-guides (使用ガイド) ターゲットキーワード: OpenFang チャネル設定, OpenFang アダプター, OpenFang WhatsApp Telegram 検索意図: 情報収集(Agentを各プラットフォームに統合したいユーザー向け) 目標文字数: 約1800文字 言語: ja


チャネルアダプターとは?

チャネルアダプター(Channel Adapter)は、OpenFangと外部プラットフォームを繋ぐ架け橋です。各アダプターは、外部プラットフォームからのメッセージをOpenFangが理解できる統一フォーマットに変換し、Agentの応答を各プラットフォームのネイティブフォーマットに戻す役割を担います。

OpenFangの設計哲学は「Agentロジックを一度書けば、40以上のプラットフォームで動作する」というものです。プラットフォームごとにAgentを書き直す必要はありません。対応するチャネルアダプターを設定するだけです。

現在、OpenFangはインスタントメッセンジャー、ソーシャルメディア、コラボレーションツール、メール、カスタムAPIなど、40種類以上のチャネルアダプターをサポートしています。

チャネルアダプターの核心概念

すべてのチャネルアダプターは、以下の設計原則を共有しています:

  • 統一メッセージフォーマット:どのチャネルからのメッセージであっても、標準のOpenFang Messageフォーマットに変換されます。
  • 独立したサンドボックス:各チャネルアダプターは独立したサンドボックスで実行されるため、一つのチャネルの障害が他に影響を与えることはありません。
  • ホットリロード:チャネル設定の追加や変更時に、Agentを再起動する必要はありません。
  • レート制限:プラットフォーム側のAPI制限に抵触しないよう、レート制限機能が組み込まれています。

主要なチャネルアダプターの設定

CLI アダプター

CLIは最も基本的なアダプターで、開発やデバッグ、ローカルでの使用に適しています:

toml
[channels.cli]enabled = truehistory_size = 1000              # 会話履歴の保持件数prompt_style = "rich"            # plain / rich / minimal

CLIアダプターは設定不要ですぐに使用可能です。複数行入力、コマンド補完、構文ハイライトをサポートしています。

WhatsApp アダプター

WhatsAppは世界で最も広く利用されているメッセンジャーの一つです。WhatsApp Business APIを通じて、あなたのAgentはユーザーとWhatsApp上で直接やり取りできます:

toml
[channels.whatsapp]enabled = trueapi_version = "v18.0"phone_number_id = "${WA_PHONE_NUMBER_ID}"access_token = "${WA_ACCESS_TOKEN}"verify_token = "${WA_VERIFY_TOKEN}"[channels.whatsapp.features]media_support = true             # 画像/ファイルの送信をサポートreply_buttons = true             # インタラクティブボタンをサポートmax_message_length = 4096typing_indicator = true          # 「入力中...」を表示

設定手順:

  1. Meta for Developers でWhatsAppアプリを作成
  2. Phone Number IDとAccess Tokenを取得
  3. Webhook URLを設定(OpenFangサーバーアドレス + /webhook/whatsapp
  4. OpenFangの設定ファイルに上記情報を入力

Telegram アダプター

Telegramは技術コミュニティで最も人気のあるプラットフォームの一つで、設定が簡単でAPIも使いやすいのが特徴です:

toml
[channels.telegram]enabled = truebot_token = "${TELEGRAM_BOT_TOKEN}"allowed_users = []               # 空の場合は全ユーザーがアクセス可能admin_users = ["@your_username"][channels.telegram.features]inline_queries = true            # インラインクエリをサポートmarkdown_support = truefile_upload = truemax_file_size_mb = 50

設定手順:

  1. Telegramで @BotFather にメッセージを送り、Botを作成
  2. Bot Tokenを取得
  3. 設定ファイルにTokenを入力

Discord アダプター

Discordアダプターは、サーバー(Guild)とダイレクトメッセージ(DM)の両方のモードをサポートしています:

toml
[channels.discord]enabled = truebot_token = "${DISCORD_BOT_TOKEN}"application_id = "${DISCORD_APP_ID}"[channels.discord.guilds]server_ids = ["1234567890"]      # 許可するサーバーID[channels.discord.features]slash_commands = true            # スラッシュコマンドをサポートthread_support = true            # スレッドをサポートembed_messages = true            # リッチテキスト埋め込みメッセージ

Slack アダプター

企業でのチームコラボレーションに適しています:

toml
[channels.slack]enabled = truebot_token = "${SLACK_BOT_TOKEN}"signing_secret = "${SLACK_SIGNING_SECRET}"app_token = "${SLACK_APP_TOKEN}"[channels.slack.features]socket_mode = true               # Socket Modeを使用(推奨、公開URL不要)thread_replies = truereaction_feedback = true

SlackではSocket Modeの使用を推奨します。公開Webhook URLの設定が不要なため、イントラネット環境でのデプロイに適しています。

Web Chat アダプター

あなたのWebサイトにOpenFangのチャットウィンドウを埋め込みます:

toml
[channels.webchat]enabled = trueport = 3000cors_origins = ["https://your-site.com"][channels.webchat.ui]theme = "auto"                   # light / dark / autologo_url = "/assets/agent-logo.png"welcome_message = "こんにちは!OpenFang Agentです。何かお手伝いしましょうか?"placeholder = "質問を入力してください..."

設定完了後、Webページに以下を追加してください:

html
<script src="https://your-server:3000/widget.js"></script><script>OpenFangWidget.init({ position: 'bottom-right' })</script>

マルチチャネルの同時実行

OpenFangのアーキテクチャは、マルチチャネルの並行処理をネイティブでサポートしています。Agentのコアは統一された会話状態を維持し、すべてのチャネルでコンテキストを共有します:

toml
# 複数のチャネルを同時に有効化[channels]cli.enabled = truewhatsapp.enabled = truetelegram.enabled = truediscord.enabled = truewebchat.enabled = true[channels.routing]strategy = "context_aware"       # round_robin / context_aware / prioritypreserve_context = true          # ユーザーのチャネル横断的なコンテキスト維持

context_aware ルーティング戦略を使用すると、ユーザーがWhatsAppで会話を開始し、その後Telegramに切り替えても、Agentは以前のコンテキストを自動的に読み込みます。

チャネルのセキュリティ設定

マルチチャネル化は攻撃対象領域の拡大を意味します。OpenFangはきめ細かなチャネルセキュリティ制御を提供します:

toml
[channels.security]per_user_rate_limit = 30         # ユーザーあたり毎分最大30メッセージper_channel_rate_limit = 100     # チャネルあたり毎分最大100メッセージrequire_auth = ["discord", "slack"]public_channels = ["webchat"]authenticated_channels = ["whatsapp", "telegram", "discord", "slack"][channels.security.content_filter]block_urls = falseblock_attachments = falsemax_prompt_length = 4000

重要なセキュリティアドバイス:

  • 公開アクセス可能なチャネル(Web Chat)には厳格なレート制限を適用する
  • 本番環境では、CLI以外のチャネルにはユーザー認証を必須とする
  • チャネルのアクセスログを定期的に監査する

チャネルの状態監視

bash
# すべてのチャネルの状態を確認openfang channels list# 出力例:# Channel        Status    Messages/24h   Errors   Latency# cli            ✅ active       0           0         -# telegram       ✅ active     156          2       120ms# whatsapp       ✅ active      89          0       250ms# discord        ⚠️ degraded    43          5       500ms# webchat        ✅ active      12          0        45ms# 指定したチャネルを再起動openfang channels restart discord# チャネルの詳細ログを確認openfang channels logs telegram --level debug

よくある質問

新しいチャネルを追加するたびにAgentを再起動する必要がありますか?
いいえ。OpenFangはチャネル設定のホットリロードをサポートしています:

``bash
openfang channels reload
``

異なるチャネル間での会話履歴は共有されますか?
デフォルトでは共有されます。同一ユーザーの会話履歴はすべてのチャネル間で共有されるため、チャネルを切り替えてもコンテキストが失われることはありません。チャネルごとに分離したい場合は、preserve_context = false を設定してください。
WhatsAppアダプターにはWhatsApp Businessアカウントが必要ですか?
はい。WhatsAppアダプターはWhatsApp Business Platform APIを使用するため、認証済みのBusinessアカウントが必要です。個人のWhatsAppアカウントではAPI接続はサポートされていません。
カスタムチャネルアダプターを追加するにはどうすればよいですか?
OpenFangはChannel SDKを提供しています。ChannelAdapter トレイトを実装することで、カスタムアダプターを作成できます:

``rust
use openfang::channels::{ChannelAdapter, Message};

struct MyCustomChannel;
impl ChannelAdapter for MyCustomChannel {
async fn receive(&self) -> Vec<Message> { /* ... */ }
async fn send(&self, msg: Message) -> Result<()> { /* ... */ }
}
``

次のステップ