holon＋GASで動くslack用GPTbot

https://qiita.com/makotosaekit/items/2e7e6652c903e9662617

上記で公開済みのholon＋GASで動くslack用GPTbotです

https://github.com/ma-saeki/holon-slackbot

* GAS
* SLACKワークスペース
* Openai APIキー

があれば動作します

確か[こちらの記事](https://qiita.com/noritsune/items/17c20dccb0eb00f2622e)を参考にさせてもらいました

# Openai
https://platform.openai.com/settings/organization/api-keys
APIキーを作成します


# GAS
https://script.google.com/home
から新規プロジェクトを作成して、[レポジトリ](https://github.com/ma-saeki/holon-slackbot)から
* main.gs
* utility.gs
* universalMessage.gs
* functionMessage.gs

を配備します

![スクリーンショット 2025-03-16 011223.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760587/dffa8fd7-68dc-4783-ad5a-85bc7cb82f1d.png)

# ライブラリ
![スクリーンショット 2025-03-16 011422.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760587/46fba51d-8101-4289-8e93-5ee334bcc988.png)

下記ライブラリを追加します
"libraryId":
* 1on93YOYfSmV92R5q59NpKmsyWIQD8qnoLYk-gkQBI92C58SPyA2x1-bq
* 1O20VxEbcHIYIrrpe_HeqkiaAXNEjIKcTKe3rLl2r_1KJ6GQ_Ib-xkGJG

# デプロイ
この状態で一度デプロイします

![スクリーンショット 2025-03-16 013043.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760587/900239be-bc8b-4b43-92bd-369ce08f04e0.png)

新しいデプロイ

![スクリーンショット 2025-03-16 013515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760587/215bd617-d013-40b9-9354-b141b470f798.png)

実行すると
https://script.google.com/macros/…
形式でウェブアプリURLが発行されるので、メモしておきます


# SLACK

https://api.slack.com/apps/
からcreate new app → from scratch でアプリを作成します

名前と使用するワークスペースを選択します
![スクリーンショット 2025-03-16 012032.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760587/5b1c6889-0acd-44f2-8c49-64ef4ba8f13a.png)

# app manifest

![スクリーンショット 2025-03-16 012519.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760587/77881208-be13-4e68-8450-dbb5675b4c2a.png)

アプリを作成後、app manifest画面で、以下のjsonを入力し、saveします
equest_url にはGASデプロイ時に発行されたウェブアプリURLを設定します

```json
{
  "display_information": {
    "name": "holon2",
    "description": "holon2",
    "background_color": "#000000"
  },
  "features": {
    "bot_user": {
      "display_name": "holon 2",
      "always_online": true
    }
  },
  "oauth_config": {
    "scopes": {
      "bot": [
        "app_mentions:read",
        "channels:history",
        "channels:join",
        "channels:manage",
        "channels:read",
        "chat:write",
        "commands",
        "emoji:read",
        "files:read",
        "files:write",
        "groups:history",
        "groups:read",
        "groups:write",
        "im:history",
        "im:read",
        "im:write",
        "mpim:history",
        "mpim:read",
        "mpim:write",
        "reactions:read",
        "reactions:write",
        "users:read"
      ]
    }
  },
  "settings": {
    "event_subscriptions": {
      "request_url": "https://script.google.com/macros/s/...",
      "bot_events": [
        "app_mention",
        "channel_created",
        "emoji_changed",
        "message.channels",
        "message.groups",
        "message.im"
      ]
    },
    "org_deploy_enabled": false,
    "socket_mode_enabled": false,
    "token_rotation_enabled": false
  }
}

```

# ワークスペースへのインストール

![スクリーンショット 2025-03-16 014131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760587/a9346afd-748d-42e5-a831-c83a9e2d9995.png)

install app画面で、アプリのワークスペースへのインストールを実行します
インストールすると、Slack Bot User OAuth トークンが発行されます


# GAS - スクリプトプロパティ
![スクリーンショット 2025-03-16 011807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760587/b1bb5272-468d-4a14-998b-51dbc807bb19.png)

GASでスクリプトプロパティを設定します

  - OPENAI_KEY : OpenAI APIキー
  - MAX_TOKENS : OpenAI APIへ投げるときの max_completion_tokens (例:100000)
  - MODEL : OpenAIのモデル指定 (例: o1) 
  - SLACK_TOKEN : Slack Bot User OAuth トークン
  - APP_ID : Slack App ID (slack appのbasic informationで表示される)
  - BOT_DM_CHANNEL_ID ＆ BOT_USER_ID
slack上で、アプリの詳細を選択すると見れる
![スクリーンショット 2025-03-16 015422.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760587/f64e1e6d-a2e0-4919-ac88-2b803069feb0.png)
  - REACTION_NAME : Botが処理中につける[絵文字名](https://qiita.com/yamadashy/items/ae673f2bae8f1525b6af) (例:grey_question) 

# BOTの動作

![スクリーンショット 2025-03-16 020458.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760587/c0d692d5-d761-47c0-9d79-7ccc79188f75.png)

チャンネルに追加後、メンションを使ってスレッドを開始すると、そのスレッド内で応答します。 
一度スレッドで応答した後は、メンションなしでもスレッド上の返信に自動で応答します。 
自分以外のメンションを含むリクエストには応答しません。