👏

discord botにAIのべりすとを使ったコマンドを実装する

2023/10/23に公開

はじめに

ミドラボというコミュニティでゲーム開発を行っています。その中でADV開発におけるシナリオ作成のサポートとして、AIのべりすとを使ったシナリオ作成支援コマンドをdiscordに実装することになりました!

開発環境

  • python 3.10.5
  • AIのべりすと(β2.0)

実装

AIのべりすとへのリクエスト

import json, requests
import os

APIの設定は、[公式サイトのパラメータ](https://ai-novel.com/account_api_help.php)をほぼそのまま使用しています

# novelist AIを扱うクラス
class novelist:

    # 初期化
    def __init__(self):
        self.novelist_key = os.getenv("NOVELIST_AI_KEY")
        self.api_server_url = 'https://api.tringpt.com/'

    # 推論を実行
    async def generate(self, text: str) -> str:
        headers = {'Authorization': 'Bearer {}'.format(self.novelist_key)}

        send_body = {
            'text': text,
            'length': 10,  # 出力するトークン数(1~300) 出力が重いと途中で強制終了する場合があります
            'temperature': 0.7,  # ランダム度(0~2.5) 語彙が単調に感じる場合は上げてみてください
            'top_p': 0.7,  # Top Pサンプリング(0.01~1.0) 1より低いほど確率の低いトークンが除外される。極端に関係のない語彙が出ることを防ぎます
            'rep_pen': 1.15,  # 繰り返しペナルティ(1.0~2.0) 値が高すぎると出力が突飛になりすぎる可能性があります
            'top_k': 140,  # Top Kサンプリング(1~500) 上位nトークンのみを採用する
            'top_a': 0.1,  # Top Aサンプリング(0~1.0) 確率が(一番確率の高いトークン^2 * Top A)以下のトークンを除外
        }

        response = requests.post(self.api_server_url + '/api', headers=headers, json=send_body)
        response_array = json.loads(response.text)

        return response_array['data'][0]

コマンドの実装

discordのスラッシュコマンドは、一定時間以内に返信がないとエラーになるため一度仮の返信を送ってから後から正式な返信を行うようにしています。(1 → 2の順番)

  1. await ctx.response.defer()
  2. await ctx.followup.send(message)
    @com.command(name="novel", description="小説・シナリオ作製サポートコマンド")
    async def novel(
            self,
            ctx: discord.ApplicationContext,
            content: Option(
                str,
                description="小説・シナリオの内容",
            )
    ):

         # 一度「考え中」というレスポンスを返す
         await ctx.response.defer()
        
         result = await self.novelist.generate(content)
         # discordにメッセージを送信します
         try:
             await ctx.followup.send(f"{result}")
         except Exception as e:
             print(f"An error occurred: {e}")
MidraLab(ミドラボ)

Discussion