🍣

Difyワークフローを繋ぐSlackBotをgoで作った話

2024/12/24に公開

はじめに

このブログは 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ワークスペースをホストして全パートナーで利用しています!
詳しくは僕のアドカレの記事を見てください!
https://developers.gmo.jp/technology/59393/

DifyとSlackBotの連携

Difyのみでも、他のアプリケーションと連携することで様々なことができます。しかし、社内のパートナーと話を重ねていくと、SlackBotとDifyを連携をして使うと業務の効率化が捗るなぁということが明らかになってきました。そこから、SlackBotと連携しようと考えました。

しかし、goで、SlackBotを、Difyと、いい感じに繋げた記事がぱっと見で探せなかったです。そのため、本記事でまとめて解説することにしました!特にDify側は簡単にAPIについての情報にアクセスできたのですが、Slackが若干苦戦したので丁寧に説明しています!

ブランチ

https://github.com/t-daisuke/slackbot-dify-connection

本当はOSSっぽく読み出せたり、英語で説明したり、ロゴを描いたりしたかったんですが、アドカレ公開日に間に合わなかったのでそのまま載せます。

使った技術

go
slack-go
Slack APIのSocket Mode

Slack APIでの作業

注:バージョンアップなどで変わることがあります。本実装は2024/12/23で確認されています。

アプリを作成する

Slack APIの管理ページにアクセスし、新しいアプリを作成します。「Create New App」を押下してください。

こんな感じの画面になります

設定する

上記の設定画面で、以下の手順を踏みましょう

1. Socket Modeを有効化する

  1. Slackアプリの管理ページに移動します。
  2. 左側のタブから "Socket Mode" を選択します。
  3. "Enable Socket Mode" をONにします。
  4. トークンの作成画面が表示されるので、トークン名を入力して "Create" をクリックします。
    • 作成したトークンをコピーしておきます。
    • このトークンを環境変数 SLACK_APP_TOKEN に設定します。

2. Basic InformationでApp-Level Tokenを作成する

  1. 左側のタブから "Basic Information" を選択します。
  2. 下の "App-Level Tokens" セクションに移動します。
  3. "Create App-Level Token" をクリックし、以下を入力します:
    • Token Name:任意の名前を入力します(例: MyAppToken)。
    • Scopesconnections:write を選択します。
  4. トークンを作成後、コピーして環境変数 SLACK_APP_TOKEN に設定します。

3. OAuth & PermissionsでBOT_USER_OAUTH_TOKENを取得する

  1. 左側のタブから "OAuth & Permissions" を選択します。
  2. Scopes セクションに移動し、以下の権限を追加します:
    • chat:write
    • app_mentions:read
    • 必要に応じて他のスコープを追加します。
  3. 上部の Install App to Workspace をクリックし、アプリをインストールします。
  4. インストール完了後、表示された Bot User OAuth Token をコピーします。
    • このトークンを環境変数 SLACK_BOT_TOKEN に設定します。

4. .envファイルの作成(プロジェクトのコード上での話です)

  1. プロジェクトのルートディレクトリに移動します。
  2. .env_example ファイルをコピーして .env ファイルを作成します:
cp .env_example .env
  1. .env ファイルを開き、以下のようにトークンを設定します:
SLACK_APP_TOKEN=your_app_level_token
SLACK_BOT_TOKEN=your_bot_user_oauth_token

5. Event Subscriptionでbotイベントを設定する

  1. 左側のタブから "Event Subscriptions" を選択します。
  2. "Enable Events" をONにします。
  3. Subscribe to bot events セクションに移動し、"Add Bot User Event" をクリックします。
  4. イベントリストから "app_mention" を選択します。
  5. 設定を保存します。

6. App Homeで名前を設定する

  1. 左側のタブから "App Home" を選択します。
  2. "App Display Name""Bot Name" を設定します。
    • App Display Name:アプリの表示名(例: MySlackApp
    • Bot Name:ボットの名前(例: MyBot
  3. 設定を保存します。

まとめの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のやり方が説明されています。

プロジェクト上(コード上)の設定

https://github.com/t-daisuke/slackbot-dify-connection?tab=readme-ov-file
こちらを持ってきてください。
.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