Difyワークフローを繋ぐSlackBotをgoで作った話
はじめに
このブログは GMOペパボ エンジニア Advent Calendar 2024 🎄 の23日目の記事です。
22日目はharachanさんのsqlcの未使用クエリを削除するコマンドを作った話でした!
harachanさんと同じチームで働いている新米エンジニアの僕ですが、確かに未使用クエリがあって、grepするときに嫌な気持ちになることがあるなぁと思いました。harachanさんは落ちてるゴミを捨てるタイプの立派な方なので、sqlも掃除してくれたんだろうなぁと思ってます!
あらすじ
みなさん、Difyはご存知ですか?
Difyは、直感的なインターフェースを通じてAIアプリケーションを簡単に開発できるオープンソースのプラットフォームです。GPT-4やClaude 3などの最新のAIモデルを統合し、RAG(Retrieval-Augmented Generation)エンジンを搭載することで、幅広い分野で高性能なAIアプリケーションの開発を可能にしています。弊社では自社のDifyワークスペースをホストして全パートナーで利用しています!
詳しくは僕のアドカレの記事を見てください!
DifyとSlackBotの連携
Difyのみでも、他のアプリケーションと連携することで様々なことができます。しかし、社内のパートナーと話を重ねていくと、SlackBotとDifyを連携をして使うと業務の効率化が捗るなぁということが明らかになってきました。そこから、SlackBotと連携しようと考えました。
しかし、goで、SlackBotを、Difyと、いい感じに繋げた記事がぱっと見で探せなかったです。そのため、本記事でまとめて解説することにしました!特にDify側は簡単にAPIについての情報にアクセスできたのですが、Slackが若干苦戦したので丁寧に説明しています!
ブランチ
本当はOSSっぽく読み出せたり、英語で説明したり、ロゴを描いたりしたかったんですが、アドカレ公開日に間に合わなかったのでそのまま載せます。
使った技術
go
slack-go
Slack APIのSocket Mode
Slack APIでの作業
注:バージョンアップなどで変わることがあります。本実装は2024/12/23で確認されています。
アプリを作成する
Slack APIの管理ページにアクセスし、新しいアプリを作成します。「Create New App」を押下してください。
こんな感じの画面になります
設定する
上記の設定画面で、以下の手順を踏みましょう
1. Socket Modeを有効化する
- Slackアプリの管理ページに移動します。
- 左側のタブから "Socket Mode" を選択します。
- "Enable Socket Mode" をONにします。
- トークンの作成画面が表示されるので、トークン名を入力して "Create" をクリックします。
- 作成したトークンをコピーしておきます。
- このトークンを環境変数
SLACK_APP_TOKEN
に設定します。
2. Basic InformationでApp-Level Tokenを作成する
- 左側のタブから "Basic Information" を選択します。
- 下の "App-Level Tokens" セクションに移動します。
-
"Create App-Level Token" をクリックし、以下を入力します:
-
Token Name:任意の名前を入力します(例:
MyAppToken
)。 -
Scopes:
connections:write
を選択します。
-
Token Name:任意の名前を入力します(例:
- トークンを作成後、コピーして環境変数
SLACK_APP_TOKEN
に設定します。
3. OAuth & PermissionsでBOT_USER_OAUTH_TOKENを取得する
- 左側のタブから "OAuth & Permissions" を選択します。
-
Scopes セクションに移動し、以下の権限を追加します:
chat:write
app_mentions:read
- 必要に応じて他のスコープを追加します。
- 上部の Install App to Workspace をクリックし、アプリをインストールします。
- インストール完了後、表示された Bot User OAuth Token をコピーします。
- このトークンを環境変数
SLACK_BOT_TOKEN
に設定します。
- このトークンを環境変数
4. .envファイルの作成(プロジェクトのコード上での話です)
- プロジェクトのルートディレクトリに移動します。
-
.env_example
ファイルをコピーして.env
ファイルを作成します:
cp .env_example .env
- .env ファイルを開き、以下のようにトークンを設定します:
SLACK_APP_TOKEN=your_app_level_token
SLACK_BOT_TOKEN=your_bot_user_oauth_token
5. Event Subscriptionでbotイベントを設定する
- 左側のタブから "Event Subscriptions" を選択します。
- "Enable Events" をONにします。
- Subscribe to bot events セクションに移動し、"Add Bot User Event" をクリックします。
- イベントリストから "app_mention" を選択します。
- 設定を保存します。
6. App Homeで名前を設定する
- 左側のタブから "App Home" を選択します。
-
"App Display Name" と "Bot Name" を設定します。
-
App Display Name:アプリの表示名(例:
MySlackApp
) -
Bot Name:ボットの名前(例:
MyBot
)
-
App Display Name:アプリの表示名(例:
- 設定を保存します。
まとめのSlack api settings
App-Level Tokens
connections:write
authorizations:read
Socket Mode
On
OAuth & Permissions
app_mentions:read
channels:join
chat:write
Event Subscriptions
On
- Subscribe to bot events
app_mention
Difyでの作業
Difyの右上の「公開する」ボタンがあるので、そこを開いてAPIリファレンスを開きましょう。
そこにAPIの説明がかかれていたり、APIキーが取れるようになっています。また、DifyでのAPIのやり方が説明されています。
プロジェクト上(コード上)の設定
.env_exambleにあるように.envファイルを作成して
SLACK_APP_TOKEN= Socket ModeのToken(xapp-***)
SLACK_BOT_TOKEN= Bot User OAuth Token(xoxb-***)
DIFY_API_KEY= Dify API Key
DIFY_API_URL= Dify API URL
のとおりにTokenなどを入れてください。
それで
go run main.go
で起動します。
できてないところ
- wipなんですが、dockerによるイメージ化や、applyするためのmanifestを書いているところです。
- ライブラリっぽく呼び出すことで、プロダクトコードで雑に使えるようにしたいです。
- goに不慣れなのでちょっとコードがよくないところがありそうです。PRを立ててもらえると嬉しいです。
おわりに
もっと汎用化してから世界に公開したかったですが、23日の24:15になってしまったのでこれでリリースにします。もっといい感じになったら加筆しますね!
あしたは24日、yoshidaさんのテックカンファレンスのスタッフ体験記の記事です!
テックカンファレンスのスタッフの方にはいつも感謝しています。どんな話か楽しみで寝れないです!
Discussion