Skip to content

OpenAI APIエラー「チャットモデル完了エンドポイントが不正」の解決法

問題: チャットモデルと非互換エンドポイントを使用した際のエラー

OpenAI APIでgpt-3.5-turboなどのチャットモデルを使用する際、以下のエラーが発生します:

openai.error.InvalidRequestError: This is a chat model and not supported in the v1/completions endpoint. Did you mean to use v1/chat/completions?

このエラーは、チャットモデル専用エンドポイントを使用すべき箇所で、古い互換性のないエンドポイント(/v1/completions)を使用している場合に発生します。

根本的な原因

OpenAI APIはモデルの種類ごとに異なるエンドポイントを要求します:

モデルタイプ対応エンドポイント代表的なモデル
Chatモデル/v1/chat/completionsgpt-3.5-turbo, gpt-4, gpt-4o
Completions(従来)/v1/completionsgpt-3.5-turbo-instruct, davinci-002
Audioモデル/v1/audio/transcriptionswhisper-1

解決策: 正しいエンドポイントとAPIメソッドの使用

以下に各バージョンでの正しい実装方法を示します。

解決方法 1: Python SDK v1.0以降を使用(推奨)

python
import discord
from openai import OpenAI  # 明示的なOpenAIクライアントをインポート
import os

# 環境変数からAPIキーを取得
client_openai = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

# Discordクライアント設定
intents = discord.Intents.default()
intents.message_content = True  # メッセージ内容を受信するために必要
client_discord = discord.Client(intents=intents)

async def generate_response(message):
    # チャット形式のメッセージリストを作成
    messages = [
        {"role": "system", "content": "あなたは役立つアシスタントです"},
        {"role": "user", "content": f"{message.author.name}: {message.content}"}
    ]
    
    # 正しいchat.completionsエンドポイントを使用
    response = client_openai.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=messages,  # キー名をpromptからmessagesに変更
        max_tokens=1024,
        temperature=0.5
    )
    
    # 応答内容の取得方法変更
    return response.choices[0].message.content.strip()

@client_discord.event
async def on_ready():
    print(f"ログイン完了: {client_discord.user}")

@client_discord.event
async def on_message(message):
    if message.author == client_discord.user:
        return

    response = await generate_response(message)
    await message.channel.send(response)

# Discordトークンは環境変数から取得推奨
client_discord.run(os.getenv("DISCORD_BOT_TOKEN"))

主な変更点

  1. openai.Completion.create()client.chat.completions.create()に変更
  2. promptパラメータ → messagesリスト形式に変更
  3. response.choices[0].textresponse.choices[0].message.contentに変更
  4. APIキー取得方法改善: os.getenv()の直接使用

解決方法 2: モデルを互換性のあるものに変更

チャットエンドポートのリファクタリングが困難な場合、代わりにgpt-3.5-turbo-instruct(互換モデル)を使用することも可能です:

python
response = client_openai.completions.create(
    model="gpt-3.5-turbo-instruct",  # 互換モデルに変更
    prompt=f"{message.author.name}: {message.content}\nAI:",
    max_tokens=1024,
    temperature=0.5
)

よくある落とし穴とその解決策

APIキーの取得方法の問題

No API key providedエラーが発生する場合:

python
# 非推奨
openai.api_key = os.environ.get("OPENAI_API_KEY")

# 推奨
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

ライブラリ互換性問題

ライブラリバージョンの競合が発生する場合:

bash
# 非推奨のバージョンダウングレード
pip install openai==0.28.1

# 代わりに最新版を使用
pip install --upgrade openai

重要注意点

openaiライブラリの古いバージョン(<1.0)は非推奨です。2024年現在はバージョン1.xを使用してください

Chatモデル特有のパラメータ構成

チャットモデルではロールベースのメッセージ構築が必須です:

python
messages = [
    {"role": "system", "content": "システム設定(AIの振る舞い指示)"},
    {"role": "user", "content": "ユーザーのメッセージ"},
    {"role": "assistant", "content": "AIの直前の応答(継続会話用)"}
]

ベストプラクティス

  1. 環境変数を確実に設定

    bash
    # .envファイルや実行環境に設定
    OPENAI_API_KEY=your_api_key_here
    DISCORD_BOT_TOKEN=your_bot_token_here
  2. 常に最新SDKを利用 古いライブラリはセキュリティリスクが高く予期せぬ動作の原因になります

  3. チャットモデル利用時の効率的なプロンプト設計

    python
    messages = [
        {"role": "system", "content": "簡潔な回答をするように指示"},
        {"role": "user", "content": "Q: ..."},
        {"role": "assistant", "content": "A: ..."}  # 会話履歴
    ]

参考リソース

問題を適切に解決するためには、チャットモデルと互換性のあるエンドポイントを使用し、正しいSDKバージョンを常に維持することが最も重要です。以上の解決策とベストプラクティスを実装すれば、エラーなくAI搭載Discordボットを運用できます。