Dify
日本語
日本語
  • 入門
    • Difyへようこそ
      • 特性と技術仕様
      • モデルプロバイダーリスト
    • クラウドサービス
    • コミュニティ版
      • Docker Compose デプロイ
      • ローカルソースコードで起動
      • aaPanelでのデプロイ方法
      • フロントエンドDockerコンテナを単独起動
      • 環境変数の説明
      • よくある質問
    • Dify Premium
    • Dify 教育版
  • マニュアル
    • モデル
      • 新しいプロバイダーの追加
      • 事前定義されたモデルの追加
      • カスタムモデルの追加
      • インタフェース
      • 配置ルール
      • 負荷分散
    • アプリ・オーケストレーション
      • アプリの作成
      • チャットボット
        • 複数モデルのデバッグ
      • エージェント
      • ツールキット
        • コンテンツモデレーション
    • ワークフロー
      • キーコンセプト
      • 変数
      • ノードの説明
        • 開始
        • 終了
        • 回答
        • LLM
        • 知識検索
        • 質問分類
        • 条件分岐
        • コード実行
        • テンプレート
        • テキスト抽出ツール
        • リスト処理
        • 変数集約
        • 変数代入
        • 反復処理(イテレーション)
        • パラメータ抽出
        • HTTPリクエスト
        • エージェント
        • ツール
        • 繰り返し処理(ループ)
      • ショートカットキー
      • オーケストレートノード
      • ファイルアップロード
      • エラー処理
        • 事前定義されたエラー処理ロジック
        • エラータイプの概要
      • 追加機能
      • プレビューとデバッグ
        • プレビューと実行
        • ステップ実行
        • 対話/実行ログ
        • チェックリスト
        • 実行履歴
      • アプリケーション公開
      • JSON形式での出力
      • 変更通知:画像アップロード機能がファイルアップロード機能に統合されました
    • ナレッジベース
      • ナレッジベース作成
        • 1. オンラインデータソースの活用
          • 1.1 Notion からデータをインポート
          • 1.2 Webサイトからデータをインポート
        • 2. チャンクモードの指定
        • 3. インデックス方式と検索オプションの設定
      • ナレッジベースの管理
        • ナレッジベース内ドキュメントの管理
        • APIを活用したナレッジベースのメンテナンス
      • メタデータ
      • アプリ内でのナレッジベース統合
      • リコールテスト/引用帰属
      • ナレッジベースの要求頻度制限
      • 外部ナレッジベースとの接続
      • 外部ナレッジベースAPI
    • ツール
      • クイック統合ツール
      • 高度統合ツール
      • ツールの設定
        • Google
        • Bing
        • SearchApi
        • StableDiffusion
        • Perplexity Search
        • AlphaVantage 株式分析
        • Dall-e
        • Youtube
        • Serper
        • SearXNG
        • SiliconFlow(Flux AI サポート)
        • ComfyUI
    • アプリ公開
      • シングルページWebアプリとして公開
        • Web アプリの設定
        • テキスト生成アプリ
        • 対話型アプリ
      • Webサイトへの埋め込み
      • API基づく開発
      • フロントエンドテンプレートに基づいた再開発
    • アノテーション
      • ログとアノテーション
      • アノテーション返信
    • モニタリング
      • データ分析
      • 外部Opsツール統合
        • LangSmithを統合
        • LangFuseを統合
        • Opikを統合
    • 拡張
      • API 拡張
        • Cloudflare Workers を使用した API ツールのデプロイ
        • コンテンツモデレーション
      • コード拡張
        • 外部データツール
        • コンテンツモデレーション
    • コラボレーション
      • 発見
      • メンバーの招待と管理
    • 管理
      • アプリの管理
      • チームメンバーの管理
      • 個人アカウントの管理
      • サブスクリプション管理
      • バージョン管理
  • ハンドオン工房
    • 初級編
      • ゼロからAI画像生成アプリの構築方法
      • AIエージェントの実践:個人のオンライン旅行アシスタントの構築方法
    • 中級編
      • チャットストリームエージェントを使用した Twitter アカウントの分析方法
      • ファイルアップロードを使用した記事理解アシスタントの構築方法
  • コミュニティ
    • サポートの求め
    • 貢献者ガイド
    • ドキュメントへの貢献
  • プラグイン
    • 機能紹介
    • クイックスタート
      • プラグインのインストールと活用
      • プラグイン開発の入門
        • 開発環境のセットアップ
        • ツール型プラグイン
        • モデル型プラグイン
          • モデルプロバイダーの構築
          • 定義済みモデルの組み込み
          • カスタムモデルの組み込み
        • エージェント戦略プラグイン
        • 拡張機能型プラグイン
        • バンドル
      • プラグインのデバッグ方法
    • プラグイン管理方法
    • スキーマ仕様
      • Manifest(マニフェスト)
      • Endpoint(エンドポイント)
      • Tool(ツール)
      • Agent(エージェント)
      • Model(モデル)
        • モデル設計規則
        • モデルスキーマ
      • 一般的な標準仕様
      • 永続化されたストレージ
      • Difyサービスの逆呼び出し
        • アプリ
        • モデル
        • ツール
        • ノード
    • ベストプラクティス
      • Slack Bot プラグインの開発
      • Dify MCP プラグインガイド:ワンクリックで Zapier に接続してメールを自動送信
    • プラグインの公開
      • プラグインの自動公開
      • Difyマーケットプレイスへの公開
        • プラグイン開発者ガイドライン
        • プラグインのプライバシー保護に関するガイドライン
      • 個人GitHubリポジトリへの公開
      • ローカルでの公開と共有
      • 第三者署名検証のためにプラグインに署名する
    • よくある質問
  • 開発
    • バックエンド
      • DifySandbox
        • 貢献ガイド
    • モデルの統合
      • Hugging Faceのオープンソースモデルを統合
      • Replicateのオープンソースモデルを統合
      • Xinferenceでデプロイしたローカルモデルを統合
      • OpenLLMでデプロイしたローカルモデルを統合
      • LocalAIでデプロイしたローカルモデルを統合
      • Ollamaでデプロイしたローカルモデルを統合
      • LiteLLM Proxyを使用してモデルを統合する
      • GPUStackとの統合によるローカルモデルのデプロイ
      • AWS Bedrock上のモデル(DeepSeek)の接続
    • 移行
      • コミュニティ版を v1.0.0 に移行する
  • もっと読む
    • 活用事例
      • DeepSeek & Dify連携ガイド:多段階推論を活用したAIアプリケーション構築
      • Ollama + DeepSeek + Dify のプライベートデプロイ:あなた自身のAIアシスタントの構築方法
      • あなた専用のQAチャットボットのトレーニング方法
      • コードなしでMidjourney プロンプトボットを作成する方法
      • Notion AI アシスタントを構築する
      • 数分で業務データを持つ公式サイトのAIチャットボットを作成する方法
      • DifyチャットボットをWixサイトに統合する方法
      • AWS Bedrockのナレッジベースに統合する方法
      • Difyで大規模言語モデルの「競技場」を体験する方法:DeepSeek R1 VS o1 を例に
      • Difyスケジューラーの構築
      • DifyクラウドでAI Thesis Slack Botを構築
    • さらに読む
      • LLMOpsとは何ですか?
      • 配列変数とは何ですか?
      • 検索拡張生成(RAG)
        • ハイブリッド検索
        • Rerank
        • リトリーバルモード
      • プロンプトエンジニアリング
      • DifyでJSONスキーマ出力を使用する方法
    • FAQ
      • ローカルデプロイに関するFAQ
      • LLM設定と使用に関するFAQ
      • プラグイン
  • ポリシー
    • オープンソースライセンス
    • ユーザ規約
      • 利用規約
      • プライバシーポリシー
      • 合規性レポートの入手方法
Powered by GitBook
On this page
  • プロジェクトの背景
  • 事前準備
  • 1. プラグイン開発
  • 2. プラグインのデバッグ
  • 3. プラグインの効果を検証する
  • 4. プラグインのパッケージ化(オプション)
  • 5. プラグインの公開(オプション)
  • 参考資料
  1. プラグイン
  2. ベストプラクティス

Slack Bot プラグインの開発

PreviousベストプラクティスNextDify MCP プラグインガイド:ワンクリックで Zapier に接続してメールを自動送信

Last updated 2 months ago

この記事では、以下の内容を理解できます。

Slack Bot の構築方法を深く理解し、AI を活用した Slack チャットボットを作成して、Slack プラットフォーム上でユーザーの質問にインテリジェントに応答する方法を学びます。

プロジェクトの背景

Dify プラグインエコシステムは、よりシンプルで使いやすいアクセス方法のサポートに注力しています。この記事では、Slack を例に、Slack Bot プラグインの開発方法を詳しく紹介し、チームメンバーが Slack プラットフォーム内で直接 LLM と対話できるようにすることで、AI サービスの利用効率を向上させます。

Dify プラグインエコシステムは、よりシンプルで便利なアクセス方法を提供することを目指しています。この記事では、Slack を例に、Slack Bot プラグインの開発方法を詳しく解説し、チームメンバーが Slack プラットフォームで直接 AI アプリを利用できるようにすることで、業務効率を向上させます。

Slack は、豊富な API を備えた自由でオープンなリアルタイムオフィスコミュニプラットフォームです。特に、イベントメカニズムに基づいた Webhook 機能は、簡単に開発を始めることができます。このメカニズムを利用して Slack Bot プラグインを作成します。その原理は以下の図に示すとおりです。

Slack Bot の原理図

混乱を避けるため、以下に概念の説明をします。

  • Slack Bot は、Slack プラットフォーム上のチャットボットであり、仮想的な役割と見なすことができ、チャットを通じてインタラクションできます。

  • Slack Bot プラグイン は、Dify Marketplace のプラグインであり、Dify アプリと Slack プラットフォームを接続するために使用されます。この記事では、主にこのプラグインの開発について説明します。

原理の概要:

  1. Slack Bot にメッセージを送信

    ユーザーが Slack で Bot にメッセージを送信すると、Slack Bot は Dify プラットフォームに Webhook リクエストを送信します。

  2. メッセージを Slack Bot プラグインに転送

    ユーザーが Slack Bot と対話する際、メッセージを Dify アプリに転送する必要があります。メールシステムで受信者のメールアドレスが必要なように、Slack の API を使用して Slack Webhook のアドレスを設定し、それを Slack Bot プラグインに入力して接続を確立します。

  3. プラグインがメッセージを受信した後、特定の Dify アプリに送信

    Slack Bot プラグインは Slack リクエストを処理し、Dify のアプリに送信します。LLM がユーザーの入力を分析し、応答を提供します。

  4. Dify アプリが応答した後、メッセージを Slack Bot に返し、ユーザーに応答

    Slack Bot は Dify アプリからの応答を取得した後、プラグインを介してメッセージを Slack Bot に返します。これにより、ユーザーは Dify アプリと直接やり取りできます。

事前準備

  • Slack App を作成し、OAuth トークンを取得します。

;Webhooks 機能を有効にします。

App を Slack ワークスペースにインストールします。

今後のプラグイン開発に使用する OAuth トークンを取得します。

1. プラグイン開発

プロジェクトの初期化

以下のコマンドを実行して、プラグイン開発プロジェクトを初期化します。

dify plugin init

プロンプトに従い、プロジェクトの基本情報を入力し、extension テンプレートを選択してください。そして、Apps と Endpoints の2つの権限を付与します。

1. 設定フォームの編集

このプラグインでは、どのDifyのAppを使って応答するかを指定する必要があり、さらに、応答時にSlackのAppトークンを使用する必要があるため、プラグインフォームにこれらの2つのフィールドを追加します。

group ディレクトリにあるyamlファイルを編集します。例:group/slack.yaml。フォーム設定ファイルの名前は、プラグイン作成時に入力した基本情報によって決まります。対応するyamlファイルを変更してください。

サンプルコード:

slack.yaml

settings:
  - name: bot_token
    type: secret-input
    required: true
    label:
      en_US: Bot Token
      zh_Hans: Bot Token
      pt_BR: Token do Bot
      ja_JP: Bot Token
    placeholder:
      en_US: Please input your Bot Token
      zh_Hans: 请输入你的 Bot Token
      pt_BR: Por favor, insira seu Token do Bot
      ja_JP: ボットトークンを入力してください
  - name: allow_retry
    type: boolean
    required: false
    label:
      en_US: Allow Retry
      zh_Hans: 允许重试
      pt_BR: Permitir Retentativas
      ja_JP: 再試行を許可
    default: false
  - name: app
    type: app-selector
    required: true
    label:
      en_US: App
      zh_Hans: 应用
      pt_BR: App
      ja_JP: アプリ
    placeholder:
      en_US: the app you want to use to answer Slack messages
      zh_Hans: 你想要用来回答 Slack 消息的应用
      pt_BR: o app que você deseja usar para responder mensagens do Slack
      ja_JP: あなたが Slack メッセージに回答するために使用するアプリ
endpoints:
  - endpoints/slack.yaml

コードデータ構造の説明:

  - name: app
    type: app-selector
    scope: chat
  • type フィールドは、app-selector フィールドとして設定してください。

    これにより、ユーザーはプラグイン利用時に特定の Dify アプリにアクセスし、メッセージ転送を行えるようになります。

  • scope フィールドは、chat フィールドとして設定してください。

    agent、chatbot、chatflow などのタイプのアプリのみが利用可能です。

最後に、endpoints/slack.yaml ファイルのリクエストパスとリクエストメソッドを修正し、method を POST に変更する必要があります。

サンプルコード:

endpoints/slack.yaml

path: "/"
method: "POST"
extra:
  python:
    source: "endpoints/slack.py"

2. 機能コードの編集

endpoints/slack.py ファイルを修正し、以下のコードを追加してください:

import json
import traceback
from typing import Mapping
from werkzeug import Request, Response
from dify_plugin import Endpoint
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError


class SlackEndpoint(Endpoint):
    def _invoke(self, r: Request, values: Mapping, settings: Mapping) -> Response:
        """
        Invokes the endpoint with the given request.
        """
        retry_num = r.headers.get("X-Slack-Retry-Num")
        if (not settings.get("allow_retry") and (r.headers.get("X-Slack-Retry-Reason") == "http_timeout" or ((retry_num is not None and int(retry_num) > 0)))):
            return Response(status=200, response="ok")
        data = r.get_json()

        # Slack URL検証チャレンジを処理する
        if data.get("type") == "url_verification":
            return Response(
                response=json.dumps({"challenge": data.get("challenge")}),
                status=200,
                content_type="application/json"
            )
        
        if (data.get("type") == "event_callback"):
            event = data.get("event")
            if (event.get("type") == "app_mention"):
                message = event.get("text", "")
                if message.startswith("<@"):
                    message = message.split("> ", 1)[1] if "> " in message else message
                    channel = event.get("channel", "")
                    blocks = event.get("blocks", [])
                    blocks[0]["elements"][0]["elements"] = blocks[0].get("elements")[0].get("elements")[1:]
                    token = settings.get("bot_token")
                    client = WebClient(token=token)
                    try: 
                        response = self.session.app.chat.invoke(
                            app_id=settings["app"]["app_id"],
                            query=message,
                            inputs={},
                            response_mode="blocking",
                        )
                        try:
                            blocks[0]["elements"][0]["elements"][0]["text"] = response.get("answer")
                            result = client.chat_postMessage(
                                channel=channel,
                                text=response.get("answer"),
                                blocks=blocks
                            )
                            return Response(
                                status=200,
                                response=json.dumps(result),
                                content_type="application/json"
                            )
                        except SlackApiError as e:
                            raise e
                    except Exception as e:
                        err = traceback.format_exc()
                        return Response(
                            status=200,
                            response="Sorry, I'm having trouble processing your request. Please try again later." + str(err),
                            content_type="text/plain",
                        )
                else:
                    return Response(status=200, response="ok")
            else:
                return Response(status=200, response="ok")
        else:
            return Response(status=200, response="ok")

プラグインのテストを容易にするため、現在はユーザーの入力をそのまま返すだけで、Difyアプリは呼び出さない設定になっています。

2. プラグインのデバッグ

Difyプラットフォームにアクセスし、Difyプラグインのリモートデバッグに必要な接続アドレスとキーを取得します。

プラグインプロジェクトに戻り、.env.exampleファイルをコピーして.envにリネームします。

INSTALL_METHOD=remote
REMOTE_INSTALL_HOST=remote
REMOTE_INSTALL_PORT=5003
REMOTE_INSTALL_KEY=****-****-****-****-****

python -m mainコマンドを実行してプラグインを起動します。プラグインページで、ワークスペースにこのプラグインがインストールされていることを確認できます。他のチームメンバーもこのプラグインを利用できます。

python -m main

プラグインのエンドポイントを設定する

Difyのプラグイン管理ページで、自動インストールされたテストプラグインを見つけます。次に、新しいエンドポイントを作成し、名前、Botトークンを入力し、接続するアプリを選択します。

保存すると、POSTリクエストアドレスが生成されます。

次に、Slack Appの設定を完了する必要があります。

  1. イベントサブスクリプションを有効にする

ここに、上記で生成したプラグインのPOSTリクエストアドレスを貼り付けます。

Slack Appに必要な権限にチェックを入れます。

3. プラグインの効果を検証する

コードでは、self.session.app.chat.invokeを使ってDifyプラットフォーム内のAppを呼び出し、app_idやqueryなどの情報を渡します。そして、レスポンスの内容をSlack Botに返します。python -m mainコマンドを実行してプラグインを再起動し、デバッグを行います。Slack BotがDify Appからの応答メッセージを正しく出力できるか確認します。

4. プラグインのパッケージ化(オプション)

プラグインが正常に動作することを確認したら、次のコマンドラインツールを使ってプラグインをパッケージ化して名前を付けることができます。実行すると、現在のフォルダにslack_bot.difypkgファイルが作成されます。これが最終的なプラグインパッケージです。

# Replace ./slack_bot with your actual plugin project path.

dify plugin package ./slack_bot

おめでとうございます!プラグインの完全な開発、テスト、パッケージ化のプロセスが完了しました。

5. プラグインの公開(オプション)

参考資料

プラグインの詳細については、以下を参照してください。

クイックスタート:

プラグインインターフェースドキュメント:

Dify プラグインスキャフォールディングツール。詳細については、を参照してください。

Python 環境。バージョンは 3.12 以上である必要があります。詳細については、を参照するか、LLM に完全なインストールチュートリアルを問い合わせてください。

プラットフォームにアクセスし、scratch 方式で Slack App を作成し、アプリをデプロイする Slack ワークスペースを選択します。

Slack APIトークン
Webhooks機能を有効にする
ワークスペースにインストール
OAuthトークンを取得

それでは、実際にプラグインのコーディング作業を始めましょう。その前に、 をお読みいただくか、Difyプラグインの開発経験があることをご確認ください。

プラグインからDifyプラットフォームの機能を呼び出す方法については、 を参照してください。

Plugins permission
テストプラグイン
POSTリクエストアドレスの生成

作成したプラグインを にアップロードして公開できます。ただし、公開する前に、プラグインがに準拠しているか確認してください。

Difyプラグインの完全なプロジェクトコードを確認するには、にアクセスしてください。他のプラグインの完全なコードや詳細も確認できます。

開発ツールの初期化
Pythonインストールチュートリアル
Slack API
クイックスタート:Extensionプラグインの開発
逆呼び出し:App
Dify Marketplace リポジトリ
プラグイン公開仕様
Githubコードリポジトリ
拡張タイププラグインの開発
モデルタイププラグインの開発
バンドルタイププラグイン:複数のプラグインをパッケージ化
マニフェスト
エンドポイント
Difyサービスの逆呼び出し
ツール
モデル