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/completions | gpt-3.5-turbo , gpt-4 , gpt-4o 等 |
Completions(従来) | /v1/completions | gpt-3.5-turbo-instruct , davinci-002 等 |
Audioモデル | /v1/audio/transcriptions | whisper-1 等 |
解決策: 正しいエンドポイントとAPIメソッドの使用
以下に各バージョンでの正しい実装方法を示します。
解決方法 1: Python SDK v1.0以降を使用(推奨)
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"))
主な変更点
openai.Completion.create()
→client.chat.completions.create()
に変更prompt
パラメータ →messages
リスト形式に変更response.choices[0].text
→response.choices[0].message.content
に変更- APIキー取得方法改善:
os.getenv()
の直接使用
解決方法 2: モデルを互換性のあるものに変更
チャットエンドポートのリファクタリングが困難な場合、代わりにgpt-3.5-turbo-instruct
(互換モデル)を使用することも可能です:
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
エラーが発生する場合:
# 非推奨
openai.api_key = os.environ.get("OPENAI_API_KEY")
# 推奨
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
ライブラリ互換性問題
ライブラリバージョンの競合が発生する場合:
# 非推奨のバージョンダウングレード
pip install openai==0.28.1
# 代わりに最新版を使用
pip install --upgrade openai
重要注意点
openai
ライブラリの古いバージョン(<1.0
)は非推奨です。2024年現在はバージョン1.xを使用してください
Chatモデル特有のパラメータ構成
チャットモデルではロールベースのメッセージ構築が必須です:
messages = [
{"role": "system", "content": "システム設定(AIの振る舞い指示)"},
{"role": "user", "content": "ユーザーのメッセージ"},
{"role": "assistant", "content": "AIの直前の応答(継続会話用)"}
]
ベストプラクティス
環境変数を確実に設定
bash# .envファイルや実行環境に設定 OPENAI_API_KEY=your_api_key_here DISCORD_BOT_TOKEN=your_bot_token_here
常に最新SDKを利用 古いライブラリはセキュリティリスクが高く予期せぬ動作の原因になります
チャットモデル利用時の効率的なプロンプト設計
pythonmessages = [ {"role": "system", "content": "簡潔な回答をするように指示"}, {"role": "user", "content": "Q: ..."}, {"role": "assistant", "content": "A: ..."} # 会話履歴 ]
参考リソース
問題を適切に解決するためには、チャットモデルと互換性のあるエンドポイントを使用し、正しいSDKバージョンを常に維持することが最も重要です。以上の解決策とベストプラクティスを実装すれば、エラーなくAI搭載Discordボットを運用できます。