猫型ボット（ChatGPTラスク）をSlackへご招待

ラスクという可愛い猫キャラがいるのでそれをイメージして Slack にボットを入れてみました。

Fefyさんというユーチューバーがラスクのアバターつかって可愛い踊りを見せてくれています。ほんと癒やされます。MASOさんがビートセイバーの素敵な譜面を大量に作ってくれてます。この譜面ほんと可愛いな。最初に腕をブルンブルン回すのが可愛い。ぺろぺろ

<iframe width="560" height="315" src="https://www.youtube.com/embed/iLmShKFOOoo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

３Dモデルはここにあるので買うと良いと思うます。

https://booth.pm/ja/items/2559783

で、ボットです。
会話はこんな。スレッドの内容も把握してくれる感じにしてます。

![2023-03-20_18h23_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33704/8918b957-27fc-c1a8-0f43-aadc3738c887.png)

コードはこんなでメンションすると反応します。

https://github.com/akiraak/rusk-slackbot

```py:
import logging
import os
import openai
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

# export OPENAI_API_KEY=""
# export SLACK_SIGNING_SECRET=""
# export SLACK_BOT_TOKEN="xoxb-"
# export SLACK_APP_TOKEN="xapp-"

openai.api_key = os.environ["OPENAI_API_KEY"]
logging.basicConfig(level=logging.DEBUG)

app = App(token=os.environ["SLACK_BOT_TOKEN"])
slack_client = WebClient(token=os.environ["SLACK_BOT_TOKEN"])

@app.event("app_mention")
def event_test(body, say, logger):
    try:
        #logger.info(body)
        mentioned_ts = body["event"]["ts"]
        channel = body["event"]["channel"]
        thread_ts = body["event"].get("thread_ts", None)
        messages = []

        if thread_ts:
            result = slack_client.conversations_replies(
                channel=channel,
                ts=thread_ts,
            )
            messages = result['messages']

        chat_logs = ""
        for message in messages:
            chat = "USER:{} TEXT:{}\n".format(message['user'], message['text']) 
            chat_logs += chat

        text = body["event"]["text"]
        #logger.info("say {}".format(say))
        prompt = """{}
==== ここからAIの性格 ====
あなたはとてもかわいい猫AIエージェントです。
名前はラスクです。
語尾は２割くらいで「にゃん」になります。
次の会話に答えてあげてください。
USER: TEXT:などは使わなくてよいです。
==== ここから質問 ====
{}
ラスクの答え：
""".format(chat_logs, text)
        prompt = prompt[-2000:]
        prompt = """==== ここからこれまでのチャットログ ====\n""" + prompt
        logger.info(prompt)
        completion = openai.ChatCompletion.create(model="gpt-3.5-turbo",  messages=[{"role": "user", "content": prompt}], temperature=0.7)
        answer = str(completion.choices[0].message.content).replace("\n", "")
        #logger.info(answer)
        say(answer, thread_ts=mentioned_ts)
    except SlackApiError as e:
        logger.info(f"Error: {e}")


if __name__ == "__main__":
    handler = SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"])
    handler.start()
```

Slack アプリを作るときは Socket Mode を有効にしてください。

![2023-03-20_11h18_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33704/516104b5-a740-5f5c-5e95-f1a3c3443b5a.png)

環境変数で各キーを設定します。

```
# export OPENAI_API_KEY=""
# export SLACK_SIGNING_SECRET=""
# export SLACK_BOT_TOKEN="xoxb-"
# export SLACK_APP_TOKEN="xapp-"
```

質問のしかたはこんな。

```py
        prompt = """==== ここからこれまでのチャットログ ====
{}
==== ここからAIの性格 ====
あなたはとてもかわいい猫AIエージェントです。名前はラスクといいます。語尾は２割くらいで「にゃん」になります。次の質問に答えてあげてください。USER: TEXT:などは使わなくてよいです。
==== ここから質問 ====
{}
ラスクの答え：
""".format(chat_logs, text)
```

めっちゃ楽しいので会社のSlackに入れよう！