Discord に ChatGPT を住まわせてトークンエンゲル係数を爆上げしてみた

# たまには技術的なことを書くです。
ぜ～んぜん、いいねが付かない しぇいしぇい Qiitaである。
承認欲求を刺激された僕はついに技術的な話を書くことにしたのであった。

:::note warn
Discord の BOTプログラムが構築済みの前提ですた。
:::
1. openaiのPythonパッケージをインストールしますた。
    ~~~
    $ pip3 install openai
    ~~~
1. [OpenAIのWebサイト](https://platform.openai.com/overview)にアクセスし、ユーザーアイコンから[View API keys]を選択しますた。
1. API keys画面にてキーが出来ていない場合は [+ Create new secret key] を押下しませう。
    ![スクリーンショット 2023-04-13 230134.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322151/06932c63-bd8c-fc15-58cc-77adc313a649.jpeg)

    :::note warn
    作った時に鍵の情報がコピーできるのでコピーしませう。
    閉じると再度見ることは出来ないので、削除して作り直しになるます。
    :::

1. 有効なカギがある場合は下図の様に表示されますた。
    ![スクリーンショット 2023-04-13 230334.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322151/c591812a-a98f-710b-3897-4b80af65c75c.jpeg)
1. 使用するChatGPTは3.5を選択しますた。
    ~~~connect.py
            # connected openAI use gpt 3.5
            response = openai.ChatCompletion.create(
                model="gpt-3.5-turbo",
                messages=[
                    {"role":"user", "content" : _prompt},
                ]
            )
    ~~~
1. 今回は /neko と打った時にその直前に入力していた内容をChatGPTに話しかけるプログラムとしますた。
また、Discordのチャンネルも特定のチャンネルのみ発言を拾う様にしますた。
1. 話しかける内容の入れ替えロジックはこんな感じで考えますた。
    ![スクリーンショット 2023-04-14 22.39.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322151/ec459e52-8cbf-89f5-8a93-d3ce8d3b1f65.png)
1. 入れ替えた後にリストを参照するインデックスを変換するので、それはこんな感じで考えますた。
    ![スクリーンショット 2023-04-14 22.39.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322151/2cb28d96-5714-bd82-6a3c-9eb6cf4667f1.png)
1. 動作イメージはこんな感じですた。
    ![スクリーンショット 2023-04-14 222721.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322151/039a959c-bfb3-aec4-3155-ca496a39bb37.jpeg)
![スクリーンショット 2023-04-14 222812.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322151/2aa0df2c-20e1-4a48-5e70-6dfe30c094d7.jpeg)

1. ソースコードはこんな感じですた。
    ~~~main.py
    import discord
    import openai
    
    TOKEN = '[DISCORD_TOKEN]'
    KEY = '[OPENAI_APIKEY]'
    CHANNEL = '[DISCORD_CHANNEL_ID]'
    
    # initialize for discord
    intents = discord.Intents.default()
    intents.message_content = True
    client = discord.Client(intents=intents)
    
    # initialize for openAI
    openai.api_key = KEY
    
    # initialize for logic
    message_list = ['please tell me. you can input some talk with me.', 'empty']
    _counter = 0
    
    # event @ invoke
    @client.event
    async def on_ready():
        print('ログインしますた')
    
    # event @ recv message
    @client.event
    async def on_message(message):
        if message.channel.id == CHANNEL:
            # ignore message by bot
            if message.author.bot:
                return
            global _counter
            if _counter > 0 :
                _counter = 0
            else :
                _counter = _counter + 1
            print(message.content)
            print("_counter : " + str(_counter))
            print(message_list)
            print('------------------')
            message_list[_counter] = message.content
            print(message_list)
            print('access index : ' + str((_counter - 1) * -1))
    
            # if type /neko then throw question to chatGPT.
            if message.content == '/neko' :
                _prompt = message_list[ (_counter - 1) * -1 ] 
                print('prompt : ' + _prompt)
    
                # connected openAI use gpt 3.5
                response = openai.ChatCompletion.create(
                    model="gpt-3.5-turbo",
                    messages=[
                        {"role":"user", "content" : _prompt},
                    ]
                )
                await message.channel.send(response.choices[0]["message"]["content"])
    
    # bot invoke and connect discord server
    client.run(TOKEN)
    ~~~
# 終わりに
次はこの子に性格をつけてもいいんですけど、トークンでお金が掛かるのが非常に二の足を踏みます。
~~湯水のように使えるお金が欲しい~~
まともにPython組んだの初めてですが、人気がある理由が分かりますね。
非常に組みやすい言語ですわ。