JA ▾
API キーを取得

GetAiApiKey本番環境向けAI APIチェックリスト

Discordボット用LLM APIキー:セットアップガイド

DiscordボットにはLLMプロバイダーから3つのものが必要です:OpenAI互換のエンドポイント、APIキー、そして活発なサーバーに適合する制限です。ここでは動作するボット、その設定、およびメッセージ単位の費用を示します。

更新日:

チャットバブルがサーバーラックにリンクされているアイソメトリックイラストレーション。LLM APIを呼び出すDiscordボットを表す

主要ポイント

  1. openaiパッケージを、base URL https://api.getaiapikey.com/v1、モデルuncensoredで使用します。
  2. チャンネルごとに短いローリング履歴を保持します。コンテキストウィンドウは100,000トークンですが、再送信されるたびにコストが増加します。
  3. フルキーは同時8リクエスト、1分あたり300リクエストまで許可するため、実行中の呼び出しを6件程度に制限します。
  4. 1,500入力トークンと200出力トークンのチャット返信には$0.000325かかります。

DiscordボットにおけるLLM APIキーの役割

Discordボット用のLLM APIキーが必要な場合、構成要素は単純です。Discordはボットゲートウェイを通じてメッセージをあなたのコードに配信します。あなたのコードは最近の会話をLLMエンドポイントに送信し、テキストを受け取り、それをチャンネルに投稿します。APIキーは、リクエストがあなたのものであることをLLMプロバイダーに証明し、あなたの残高に請求するために使用されます。

このサービスはOpenAI互換なので、ボットは標準のopenai Pythonパッケージを使用します。ベースURLとモデルID uncensored の2つの設定を変更するだけで、あとは通常のチャット補完となります。新規ユーザーはまず試すことができます:サインアップ後、API キーページ で7日間有効な$0.50の無料トライアルクレジットが利用可能で、クレジットカードは不要です。

まず明確に言っておきます。これはテキストモデルです。画像、音声、動画は生成できず、添付ファイルを自身で読み取ることもできません。ボットはメッセージのテキストを転送できますが、テキスト以外の処理はこのAPIの範囲外です。

コードを書く前に

  1. API キーを取得します。 Googleまたはメールアドレスでログインし、キーページでキーを作成して環境変数に保存してください。
  2. Discordアプリケーションを作成します。 Discordのデベロッパーポータルでボットを追加し、トークンをコピーし、ボットがメッセージテキストを読み取れるようにメッセージコンテンツインテントを有効にします。メッセージの読み取りと送信の権限でサーバーに招待してください。
  3. ライブラリをインストールします。 discord.py と openai が必要です。
python3 -m venv .venv
source .venv/bin/activate
pip install discord.py openai
export API_KEY="your-llm-key"
export DISCORD_TOKEN="your-discord-bot-token"

どちらのシークレットもコミットしないでください。トークンが漏洩した場合は、それぞれのダッシュボードでリセットしてください。LLM側では、別の言語をお使いの場合、クイックスタートドキュメント でcurlとNode.jsでの同じ呼び出し方法が紹介されています。

約50行で動作するボット

このボットは誰かが自分をメンションしたときに返信します。チャンネルごとに最後の20通のメッセージを保持し、ペルソナプロンプトでモデルを呼び出し、長い回答をDiscordの2,000文字のメッセージ制限に合わせて分割します。

import os
import asyncio
from collections import defaultdict, deque

import discord
from openai import AsyncOpenAI, RateLimitError

ai = AsyncOpenAI(
    base_url="https://api.getaiapikey.com/v1",
    api_key=os.environ["API_KEY"],
)

SYSTEM = (
    "You are Mara, the resident storyteller of a community server for adult "
    "fiction writers. Keep replies under 150 words unless asked for more. "
    "Stay in character, write in plain prose, and ask one question at the end."
)

history = defaultdict(lambda: deque(maxlen=20))
gate = asyncio.Semaphore(6)

intents = discord.Intents.default()
intents.message_content = True
bot = discord.Client(intents=intents)


@bot.event
async def on_message(message):
    if message.author.bot or bot.user not in message.mentions:
        return

    text = message.clean_content.replace("@" + bot.user.display_name, "").strip()
    if not text:
        return

    log = history[message.channel.id]
    log.append({"role": "user", "content": message.author.display_name + ": " + text})

    async with gate:
        async with message.channel.typing():
            try:
                resp = await ai.chat.completions.create(
                    model="uncensored",
                    messages=[{"role": "system", "content": SYSTEM}, *log],
                    temperature=0.8,
                    max_tokens=500,
                )
            except RateLimitError:
                await message.reply("I am busy right now. Try again in a few seconds.")
                return

    reply = resp.choices[0].message.content or ""
    log.append({"role": "assistant", "content": reply})

    for i in range(0, len(reply), 1900):
        await message.reply(reply[i:i + 1900])


bot.run(os.environ["DISCORD_TOKEN"])

python bot.py で実行し、チャンネルでボットにメンションを付けると、返信が表示されます。リクエストが処理されている間、入力中インジケーターが表示されるため、待ち時間が短く感じられます。

ペルソナを維持するシステムプロンプトの作成

システムプロンプトはチャットボットで最も多くの作業を行います。良いプロンプトは短く具体的です:ボットが誰であるか、返信の長さはどのくらいか、会話がそれたときに何をすべきか。2つのバージョンを比較してください。

弱いプロンプトは「役に立つアシスタントになってください」と言います。より強力なプロンプトは役割、長さの制限、そして習慣を与えます:「あなたはマーラ、物語の語り手です。150語以内で返信してください。場を前に進める質問を1つ添えて終えてください。」2番目のプロンプトは、モデルが十数回のやり取りにわたって頼りにできるものを与え、長さの制限はコストを予測可能に保ちます。

チャットボットの実行からの実用的なポイント:

  • コードが行うように、各ユーザーのターンに話者のプレフィックスを付けます。共有チャンネルでは、そうしないとモデルは人々を区別できません。
  • サーバーのルールをシステムプロンプトに入れます。回避すべきトピックや独自のスタイルなど。モデルは合法的な成人向け利用に対してコンテンツ拒否なしで応答するように調整されているため、必要な制限はモデルではなく、プロンプトとモデレーションから来る必要があります。
  • ペルソナを一定に保ちます。頻繁に変更すると、履歴の古いターンが新しい指示と矛盾します。

コンテキスト、履歴、100,000トークンのウィンドウ

コンテキストウィンドウは100,000トークンで、プロンプトと応答の合計です。20メッセージのローリング履歴ははるかに小さく、これは意図的な設計です。APIはステートレスなので、モデルに見せたい会話全体を各リクエストに含める必要があります。つまり、保持する会話のターンが増えるほど、その後の呼び出しごとにその分が課金されます。

ボットが必要とするメモリ量に応じて履歴の長さを選択します。カジュアルなチャットボットは10〜20通のメッセージで動作します。長時間のロールプレイにはもっと多いものが必要で、その場合、一般的なアプローチは、古いターンをプロンプトの上部近くに保持される短いノートに要約し、元のものを削除することです。履歴が選択したサイズを超えたときに、2番目のモデル呼び出しを使用して要約を書きます。

コードでのようにチャンネルごとの履歴は会話を分離します。チャンネルをまたいでユーザーごとのメモリも欲しい場合は、データベースにノートを保存し、そのユーザーのシステムプロンプトに追加します。これはAPI自体が呼び出し間で何も保持しないため、アプリケーションの役割です。プライバシーについて、このAPIに送信されたプロンプトはトレーニングに使用されないことに注意してください。詳細はプライバシーページ を参照してください。

活発なサーバーでのレート制限

フルキーは8つの同時実行リクエストと1分あたり300リクエストを許可します。トライアルキーは2と60を許可します。静かなサーバーは気づきませんが、人気のあるチャンネルでは一度に多数のメンションが送信されることがあります。

コード内のasyncio.Semaphore(6)はボットを6つの実行中の呼び出しに制限し、8の上限に達しないようにし、同じキーを使用する2番目のスクリプトの余地を残します。トライアルキーの場合、これを2に設定してください。制限を超えた場合、APIはHTTP 429を返します:1分あたりのリクエスト数はrate_limited、一度に多すぎる場合はconcurrencyです。一時的な過負荷もRetry-After: 5付きの429を返します。OpenAIクライアントはデフォルトでこれらの一部を再試行し、上記のコードは再試行が尽きた場合、丁寧なメッセージで応答します。

ストリーミングには注意が必要です。トークンが到着するたびにDiscordメッセージを編集すると、リクエストはストリームが終了するまでその同時実行スロットを保持し、Discordはメッセージの編集速度に制限を設けます。ほとんどのボットにとって、完全な回答後の単一の返信の方が単純で信頼性が高いです。

Discordボットの実行コスト

料金は前払いクレジットから、入力トークン100万あたり$0.15、出力トークン100万あたり$0.50です。まず1回の返信の計算をします。システムプロンプトと20通の履歴が1,500入力トークンになり、回答が200トークンであると仮定します。

  • 入力:1,500 / 1,000,000 x $0.15 = $0.000225
  • 出力:200 / 1,000,000 x $0.50 = $0.0001
  • 合計:返信あたり$0.000325、つまり1,000回の返信で$0.325

次に、より重いケース:3,000入力と300出力トークン:$0.00045 + $0.00015 = 返信あたり$0.0006、または1,000回の返信で$0.60。1日あたり500回の返信があるサーバーは、そのサイズで1日あたり約$0.30、30日間で約$9を費やします。

最小のチャージ額は$20($500までの任意の整数金額)で、$50からは5%、$100からは10%、$200からは15%のボーナスが付きます。クレジットは期限切れにならず、失敗または拒否されたリクエストは課金されません。カード(Visa、Mastercard、Apple Pay、Google Pay)または暗号資産(TRC20上のUSDT、Base上のUSDC)でお支払いください。詳細は料金ページ をご覧ください。

成人向けコミュニティのルールと安全性

このモデルは法的に問題のない成人向け利用に対応しており、絶対的な制限として未成年者を含む性的コンテンツは常に禁止されています。サーバーが大人向けのフィクションやロールプレイをホストする場合、大人に限定してください:Discordの独自の設定でチャンネルを制限し、チャンネルのトピックでルールを明記し、モデレーションを行ってください。モデルが何を書くかに関係なく、これはボットに適用されるため、開始前にDiscordの現在の開発者向けおよびコミュニティ向けポリシーをお読みください。

リクエストIDをログに記録します。すべてのAPIレスポンスには X-Request-Id が含まれており、特定の呼び出しについて support に連絡する際に役立ちます。X-Balance-USD ヘッダーにより、クレジット残高が少なくなった際に、ボットが管理者チャンネルで警告を表示できるため、通知なしに沈黙することがありません。

質問と回答

DiscordボットからAPIを呼び出すにはどのライブラリを使いますか?

AsyncOpenAI付きのopenai Pythonパッケージを使用し、base_urlをhttps://api.getaiapikey.com/v1に設定してモデルuncensoredを使用します。OpenAI互換のクライアントはすべて同じように動作します。

ボットを有料なしでテストできますか?

はい。新しいユーザーはAPIキーページでワンクリックで$0.50のトライアルクレジットを取得できます。有効期限は7日で、クレジットカードの登録は不要です。トライアルキーでは同時リクエストが2件、1分あたり60件のリクエストが可能です。

ボットはどのくらいのメッセージを記憶できますか?

コンテキストウィンドウは100,000トークンですが、送信する履歴の量はご自身で選択できます。コストを抑えるため、ほとんどのボットはチャンネルごとに10〜20件のメッセージのみを保持します。

ボットは画像を読み取ったり、音声で返信できますか?

いいえ。このAPIはテキストのみを扱い、画像、音声、動画の生成や埋め込みベクトル生成はサポートしていません。

多くの人が同時にボットにメンションするとどうなりますか?

同時8件または1分あたり300件を超える追加リクエストにはHTTP 429が返されます。ボットにセマフォやキューを実装し、これらの制限を下回るようにしてください。

キーはフォーム 1 つで手に入ります

アカウントを作成し、キーをコピーし、ベースURLを変更します。これでセットアップは完了です。