😃

ChatGPTのSlackアプリをBolt (renderホスティング)で作成

2022/12/18に公開

はじめに

ChatGPT (OpenAI )と通信するSlackアプリを用意してみました。
ChatGPTとしてのAPIは公開されていないようなので、OpenAIで用意されているGPT-3.5のモデルを使用しました。

ChatGPT FAQ | OpenAI Help Center

How can I implement this? Is there any implementation guide for this?
ChatGPT is being made available as a research preview so we can learn about its strengths and weaknesses. It is not available in the API.

ChatGPTのAPIは公開されていないとのこと。
Githubには、ChatGPTとのやり取りをヘッドレスブラウザで再現するツールが多く公開されていますが、一旦OpenAIで触ってみます。

Slackアプリ構成

バックエンド : Boltアプリ

  • Slackアプリ開発で一般的なBoltJSを使用
  • OpenAIのAPIとやり取りします。

言語モデル(OpenAI) : text-davinci-003

  • Models referred to as "GPT 3.5"
  • ChatGPTはGPT-3.5モデルとのことなので、GPT-3.5のモデルで使用されているtext-davinci-003を使用しました。

ホスティング先 : render

  • Boltアプリのホスティング先は、GithubからCDしやすそうなrender.comにしてみました。
  • freeプランがあります。

Slackアプリの作成

アプリ名はSlackGPTにしてみました。

Scopesの設定

  • app_mentions:read
  • chat:write
  • im:write

Redirect URLsの設定

SlackアプリをOAuthでインストールために以下のURLを設定

Redirect URL

  • https://{BoltアプリのURL}/slack/redirect

※デフォルトのパスは/slack/oauth_redirectですが、
後述するBoltアプリのリダイレクトURLのパスを/slack/redirectに変更すると、Slackアプリの設定でも/slack/redirectに変更する必要がありました。

イベントの設定

Slackからのメンションを受信するため、app_mentionイベントを設定します。
Event Subscriptionsの項目で設定します。

Request URL

  • https://{BoltアプリのURL}/slack/events

Subscribe to bot events

  • app_mention追加

参考
https://api.slack.com/apis/connections/events-api#the-events-api__subscribing-to-event-types

Boltアプリ (バックエンド)

ソース

ソースの内容は以下

サーバーを起動し動作するか確認しておきます。

npm i
node index.js

renderにBoltアプリをデプロイ

Githubと連携

Web ServicesからNodeアプリケーションを作成します。
GithubのBoltプロジェクトを選択し、連携します。

環境変数の設定

HOST_URL : BoltアプリのURL
OPENAI_API_KEY : OpenAIのAPIキー
SLACK_CLIENT_ID : App CredentialsのClient ID
SLACK_CLIENT_SECRET : App CredentialsのClient Secret
SLACK_SIGNING_SECRET: App CredentialsのSigning Secret

※HOST_URLはカスタムドメインを使用しない場合、先にデプロイしてみてURLを確認。

デプロイ設定

Build & Deploy

Build Command
npm i
Start Command
node index.js

ヘルスチェック

Health Check Path
/health-check
※ヘルスチェックを設定しておかないと、デプロイが失敗します。

ポート補足

※サーバーが開いているポートは意識する必要はないようです。
renderが自動的に開かれているポートを認識するようです。

参考
https://community.render.com/t/how-ports-and-https-are-handled-for-docker-deploy/363

デプロイ

上記まで設定したらデプロイします。
AutoDeploy設定が有効になっていると、
Githubリポジトリのデプロイ対象ブランチにコミットするたびに、自動的にデプロイされます。

注意点
Render.comのコンソールに、Deploying..と表示されたまま、失敗することがあります。
其の際はもう一度、「Manual Deploy」から再度デプロイしなおします。
この現象はfreeプラン限定で発生するのかもしれません。

終わりに

以下のURLを叩くとSlackアプリをインストールできました。
https://{BoltアプリのURL}/slack/install

Slackアプリ作成時に設定したワークスペースのみにインストールできます。
Embeddable Slack Buttonでは(reason: slack_oauth_missing_state)が出てインストールできませんでした。
公開しないのであれば、OAuth設定はせず、Installed App Settingsから直接インストールで良いと思います。

また、render.comは簡単にCD環境が用意できて便利でした。
簡単な構成のアプリケーションでしたらrender.com良さそうです。

Discussion