今更感はありますが、Difyを初めて使ってみたのでその手順を共有します。
今回はlocalhost上にDifyとBoltを立てて、Slack上で動作するChatbotを簡単に作成します。API経由でDifyと連携することで、後からChatbotの挙動を柔軟に変更できる構成を目指します。
前提条件
- Docker環境構築済み
- python環境構築済み
- Slackアカウント作成し、ワークスペース作成済み
Difyの環境構築
Difyのリポジトリをクローンし、Docker Composeを使って起動します。手順はDifyの公式ドキュメントを参考にしています。
git clone https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env
docker compose up -d
これでDifyが起動します。http://localhost/install
にアクセスして初期設定を行ってください。
画面の指示に従ってアカウントを作成し、ログインすると以下の画面が表示されます。
今回はLLMとしてGoogle Geminiを使用します。事前に以下のGemini APIのページからAPIキーを発行しておいてください。
右上のログインユーザー名をクリックし、「設定」>「モデルプロバイダー」を選択すると、以下のダイアログが表示されます。
この画面でGeminiを選択し、取得したAPIキーを登録します。セットアップが完了すると以下のようになります。
Chatbotの作成
テンプレートを使用せず、「最初から作成」をクリックします。
「チャットボット」を選択し、アプリ名と説明を入力して「作成」をクリックします。
作成後、以下の画面が表示されます。
この画面でプロンプトの設定などができますが、今回はとりあえず動作確認を優先するため、細かい設定は省略します。後からワークフローを設定することでカスタマイズが可能です。
また、この管理者ページから、作成したChatbotのログや監視画面で、消費トークン数やリクエストの詳細を確認できます。
DifyのAPIシークレットキーを作成します。画像の赤枠で示した「APIアクセス」をクリックし、画面遷移後右上の「APIキー」ボタンをクリックします。
「新しいシークレットキーを作成」をクリックし、表示されたキーをメモしておきます。このシークレットキーは後ほどSlack Boltの環境変数設定で使用します。
今回は使用しませんが、「公開する」>「アプリを実行」をクリックすると、Chat画面が表示され、簡単に試すことができます。
Slack Appの設定
まずはSlack Appを作成します。https://api.slack.com/apps からワークスペースに新しいAppを作成してください。
Slack Appの作成方法の詳細は、Slack Bolt入門ガイドを参照してください。
Socket Modeを使用するために、以下の権限が必要です。
Bot Token Scopesの追加
- OAuth & Permissions -> Bot Token Scopes -> Add an OAuth Scope
- chat:write
- app_mentions:read
App-Level Tokensの作成
- Basic Information -> App-Level Tokens -> Generate Token and Scopes
- Token Nameに任意のトークン名を入力
- Add Scopeでconnections:writeを追加(ソケットモードに必要)
- Generateボタンでアプリレベルトークンを生成し、メモしておく
Socket Modeの有効化
- Socket Mode -> Connect using Socket Mode -> Enable Socket Modeをオン
イベント取得の設定
- Event Subscriptions -> Enable Eventsをオン
- Subscribe -> Add Bot User Eventでapp_mentionを追加
アプリのワークスペースへのインストールとBot Tokenの取得
- OAuth & Permissions -> Install App to Workspaceでアプリをインストール
- アクセス権限リクエスト画面が表示されるので、許可するをクリック
- Bot User OAuth Access Tokenをメモしておく
ここまでできたら、あとはslack_boltでbotを起動するだけです。今回はローカルの環境で実行します。
Slack Bolt
.env
ファイルを作成し、以下の環境変数を設定します。
DIFY_API_KEY=<Difyで発行したAPIキー>
SLACK_BOT_TOKEN=<xoxbから始まるBot Token>
SLACK_APP_TOKEN=<xappから始まるApp-Level Token>
次に以下のPythonスクリプトを作成します。
import os
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
import requests
from dotenv import load_dotenv
load_dotenv()
app = App(token=os.environ.get("SLACK_BOT_TOKEN"))
# ボットのユーザーIDを取得
bot_user_id = app.client.auth_test()["user_id"]
@app.event("app_mention")
def handle_app_mention(event, say):
print(event)
if event and 'text' in event:
dify_api_key = os.environ["DIFY_API_KEY"]
url = 'http://localhost/v1/chat-messages' # Dify API endpoint
user = event['user']
query = event['text'].replace(f"<@{bot_user_id}>", "").strip() # メンション部分を削除
headers = {
'Authorization': f'Bearer {dify_api_key}',
'Content-Type': 'application/json'
}
data = {
'query': query,
'response_mode': 'blocking',
'user': user,
'conversation_id': '', # 必要に応じて設定
'inputs': {}
}
response = requests.post(url, headers=headers, json=data)
response_data = response.json()
if 'answer' in response_data:
say(response_data['answer'])
else:
say(f"Dify APIからの予期しないレスポンス: {response_data}")
else:
say("メッセージの内容を取得できませんでした。")
if __name__ == "__main__":
SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()
スクリプトを実行後、Slackのチャンネルにアプリを追加し、メンションを付けて質問を送信すると、チャンネルに返答が返ってきます。
Slackの設定などを調べつつ、短時間で作成・利用開始できました!手軽に始められるだけでなく、まだまだ使えていない機能があるので、今後も色々と試してみたいと思います。