OpenAI APIエラー解決法|ChatCompletion廃止・GPT-4アクセス不可・画像アップロード失敗【2026年版】
このやり方で何ができるか
OpenAI APIを使う開発者がよく直面する問題を解決できます。古い書き方のコードが動かなくなる「ChatCompletion廃止エラー」や「v1/completions誤用エラー」、GPT-4モデルにアクセスできない問題、そして画像ファイルを送信する方法です。これらを一つずつ対処することで、APIを使った自動処理(メール文案の生成・資料の要約・画像の説明など)が正常に動くようになります。
準備するもの
- パソコンのターミナル(コマンド入力画面)
- OpenAIアカウント(有料プランに登録済み)
- APIキー(OpenAIの公式サイトから取得)
- Python 3.7以上がインストールされた環境
- テキストエディタ(メモ帳など)
手順
1. エラーの原因を確認する(所要時間:5分)
OpenAI APIは1.0.0以降のバージョンで大きく変わりました。古いコード例のように openai.ChatCompletion.create() という書き方は使えなくなっています。エラーメッセージが「you tried to access openai.ChatCompletion, but this is no longer supported in openai>=1.0.0」と表示される場合、これが原因です。
また、以下のようなエラーが出ることもあります。
Error: This is a chat model and not supported in the v1/completions endpoint
これは、gpt-4やgpt-3.5-turboなどのChatモデルを使っているのに、古い v1/completions エンドポイントでリクエストを送ってしまった場合に出ます。OpenAIのAPIには大きく2つのエンドポイント体系があります。
- v1/completions:廃止予定の古いエンドポイント。従来のテキスト生成モデル(text-davinci-003など)向けで、シンプルなプロンプト入力から次の単語を予測する仕組みです。
- v1/chat/completions:新しいエンドポイント(gpt-4、gpt-3.5-turbo等はこちらのみ対応)。system/user/assistantのロール指定ができ、会話形式に最適化されています。
最初にターミナルで、現在インストールされているOpenAIライブラリのバージョンを確認しましょう。
pip show openai
Version が1.0.0以上なら、コードの書き方を新しい形に変更する必要があります。
2. OpenAIライブラリを最新版に更新する(所要時間:3分)
古いバージョンを使っている場合は、最新版に更新します。
pip install --upgrade openai
更新後、改めてバージョン確認をします。
3. コードの書き方を新しい形に変更する(所要時間:10分)
新しいバージョン(1.0.0以降)では、クライアント(OpenAIに話しかける部品)を作ってから使う形に変わりました。以下が新しい書き方です。
from openai import OpenAI
client = OpenAI(api_key="sk-xxxx") # APIキーを入力
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "こんにちは"}
]
)
print(response.choices[0].message.content)
環境変数からAPIキーを読み込む方法(推奨)もあります。
from openai import OpenAI
# 環境変数 OPENAI_API_KEY からAPIキーを自動取得
client = OpenAI()
古い書き方(使えない):
import openai
openai.api_key = "sk-xxxx"
response = openai.ChatCompletion.create(...) # これはエラーになる
また、v1/completions エンドポイントを直接使っていた古いコードも同様にエラーになります。以下のような Completion.create() の書き方も使えません。
# 間違い:Completionsエンドポイントを使おうとしている
response = openai.Completion.create(
model="gpt-3.5-turbo",
prompt="Hello, how are you?",
max_tokens=100
)
ポイントは、client = OpenAI() で箱を作ってから、client.chat.completions.create() のように使うことです。また、パラメータが prompt から messages(辞書型の配列)に変わり、レスポンスの取得も response.choices[0].text から response.choices[0].message.content に変わっています。
なお、新形式ではレスポンスは辞書ではなくPythonオブジェクトとして返されることに注意してください。
# ❌ NG(辞書アクセス)
content = response["choices"][0]["message"]["content"]
# ✅ OK(属性アクセス)
content = response.choices[0].message.content
エンドポイントとモデルの対応は以下の通りです。
| 項目 | v1/completions | v1/chat/completions |
|---|---|---|
| 対応モデル | text-davinci-003など | gpt-3.5-turbo、gpt-4など |
| 入力形式 | テキスト文字列のみ | メッセージオブジェクトの配列 |
| メッセージ構造 | プロンプト1つ | system/user/assistantのロール指定 |
| 出力形式 | 文字列 | メッセージオブジェクト |
| サポート状況 | 廃止予定 | 現在推奨・今後の標準 |
messages 配列内の role には以下の3種類が使えます。
- system:AIの振る舞いを定義する指示(最初に1つだけ配置)
- user:ユーザーからの質問や指示
- assistant:AIの前の応答(会話履歴を含める場合)
4. GPT-4にアクセスできない場合の原因を確認する(所要時間:5分)
GPT-4モデルを使おうとすると「You exceeded your current quota」や「The model ‘gpt-4’ does not exist」というエラーが出ることがあります。これは以下の3つのどれかが原因です。
- アカウントがGPT-4へのアクセス権を持っていない → OpenAIの公式サイトで有料プランが必要です。無料試用版ではGPT-4が使えません。
- APIキーが無効になっている → キーの有効期限を確認し、必要に応じて新しいキーを作成します。
- モデル名が間違っている → 正しい名前は「gpt-4」や「gpt-4-turbo」などです。
アカウント設定でGPT-4が使える状態なら、コード例を以下のように書きます。
from openai import OpenAI
client = OpenAI(api_key="sk-xxxx")
response = client.chat.completions.create(
model="gpt-4", # GPT-4を指定
messages=[
{"role": "user", "content": "日本語で5行の物語を書いてください"}
]
)
print(response.choices[0].message.content)
5. 画像をアップロードして分析させる(所要時間:15分)
ChatGPTでは画像ファイルをアップロードして内容を説明させることが出来ます。APIでも同じようなことができます。
まず、ファイルを準備します。JPGやPNG形式の画像をパソコンに保存しておきましょう。
次に、以下のようにコードを書きます。ファイルをBase64という形式に変換して、APIに送信するやり方です。
from openai import OpenAI
import base64
client = OpenAI(api_key="sk-xxxx")
# 画像ファイルをBase64に変換
with open("image.jpg", "rb") as f:
image_data = base64.b64encode(f.read()).decode("utf-8")
response = client.chat.completions.create(
model="gpt-4-vision",
messages=[
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{image_data}"
}
},
{
"type": "text",
"text": "この画像に何が写っていますか?日本語で説明してください"
}
]
}
]
)
print(response.choices[0].message.content)
「image.jpg」の部分をあなたの画像ファイルの名前に変えて、実行します。
別のやり方として、すでにネット上にある画像のURLを直接渡すこともできます。
response = client.chat.completions.create(
model="gpt-4-vision",
messages=[
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": "https://example.com/image.jpg"
}
},
{
"type": "text",
"text": "この画像について説明してください"
}
]
}
]
)
print(response.choices[0].message.content)
6. 実際に試してみる(所要時間:5分)
テキストエディタに上の例を貼り付けて、APIキーをあなたのものに変更して保存します。ファイル名を「test.py」として保存しましょう。
ターミナルで以下を実行します。
python test.py
APIへの要求が成功すれば、生成されたテキストが画面に表示されます。
7. つまずきやすいところで確認する(所要時間:5分)
もしエラーが出た場合は、以下をチェックします。
APIキーのエラー → 「Authentication failed」と表示される場合は、キーをコピペする際に空白が混じっていないか確認します。OpenAIのサイトから改めてコピーして貼り付けます。
モデル名のエラー → 「The model does not exist」が出たら、モデル名の綴りを確認します。大文字と小文字が混じっていないか見直します。
エンドポイントのエラー → 「This is a chat model and not supported in the v1/completions endpoint」が出たら、Completion.create() を使っていないか確認します。client.chat.completions.create() に変更し、prompt パラメータを messages 配列に変えます。また、messages 配列には必ず role(system / user / assistant のいずれか)と content を指定してください。
インポートエラー → 「No module named ‘openai’」と出たら、openaiライブラリがインストールされていません。pip install openai で再度インストールします。
ファイルが見つからない → 画像ファイルを使う場合、ファイル名のスペルが完全に一致しているか、ファイルがPythonスクリプトと同じフォルダに入っているか確認します。
レスポンスの取得方法が違う → 新形式ではレスポンスはオブジェクトです。response["choices"][0]["message"]["content"] のような辞書アクセスではなく、response.choices[0].message.content のように属性アクセスを使ってください。
つまずきやすいところ
古い書き方のコードをネットで見つけてコピーしてしまう → 2023年以前の記事には古い「openai.ChatCompletion」や「openai.Completion」の書き方が載っていることが多いです。記事の日付を確認してから試します。
prompt パラメータをそのまま使ってしまう → Chat Completionでは messages 配列を使います。prompt="Hello" ではなく、messages=[{"role": "user", "content": "Hello"}] の形に変えてください。
messages の形式を間違える → messages は辞書のリストである必要があります。文字列をそのまま渡すとエラーになります。また、role の値は system / user / assistant のいずれかのみ有効です。"admin" など不正な値を指定するとエラーになります。
レスポンスを辞書として扱ってしまう → 新形式ではレスポンスはPythonオブジェクトです。response["choices"][0]["message"]["content"] ではなく response.choices[0].message.content と書いてください。
APIキーを誤って公開してしまう → GitHubなどにコードをアップロードする時は、APIキーを環境変数に移してからアップロードします。誤って公開したら、OpenAIのサイトからキーを削除して新しいものを作り直します。
GPT-4が使えるはずなのに「does not exist」と言われる → 無料試用版では使えません。有料プランへのアップグレードが必要です。またはGPT-3.5-turboなどの別のモデルで試してみます。
画像の形式に対応していない → JPG、PNG、GIF、WebPが対応形式です。BMP形式などは変換が必要な場合があります。
トークン数とコストに注意する → v1/chat/completions では、messages 配列全体(systemメッセージ・ユーザーメッセージ双方)がトークン数にカウントされます。不要な会話履歴は削除し、systemメッセージは必要最小限に留めることでコストを抑えられます。
慣れてきたら試したいこと
システムメッセージを活用する → messages 配列に role: "system" のメッセージを追加することで、AIの振る舞いを細かく制御できます。例えば「あなたはPythonプログラミングの専門家です」と指定することで、回答の質が向上します。ただし、systemメッセージが長すぎるとトークンコストが増えるため、簡潔に書くのがポイントです。
エラーハンドリングを追加する → APIが失敗した時に自動で再試行したり、分かりやすいエラーメッセージを出すように工夫します。本番環境で使う時は重要です。
複数の画像を一度に分析させる → messages内に複数の画像を入れて、「これらの画像の共通点は?」といった質問をさせることができます。
会話の記憶を保つ会話を作る → 前回のやり取りをmessagesに入れておくことで、会話の流れを保つことができます。以下のようにクラスを使って管理するとシンプルです。
from openai import OpenAI
class ChatAssistant:
def __init__(self, api_key):
self.client = OpenAI(api_key=api_key)
self.messages = [
{"role": "system", "content": "You are a helpful assistant."}
]
def send_message(self, user_message):
self.messages.append({"role": "user", "content": user_message})
response = self.client.chat.completions.create(
model="gpt-3.5-turbo",
messages=self.messages,
temperature=0.7
)
assistant_response = response.choices[0].message.content
self.messages.append({"role": "assistant", "content": assistant_response})
return assistant_response
ストリーミングでリアルタイム出力する → stream=True を指定することで、生成されたテキストをリアルタイムで受け取れます。
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "長めのテキストを生成して"}],
stream=True
)
for chunk in response:
if chunk.choices[0].delta.content is not None:
print(chunk.choices[0].delta.content, end="")
非同期処理(async/await)に対応させる → 非同期でAPIを呼び出す場合は AsyncOpenAI を使います。
import asyncio
from openai import AsyncOpenAI
async def get_response_async():
client = AsyncOpenAI(api_key="sk-your-api-key")
response = await client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "Hello!"}]
)
return response.choices[0].message.content
answer = asyncio.run(get_response_async())
print(answer)
費用を監視する仕組みを入れる → APIの使用量はお金がかかります。定期的にOpenAIダッシュボードで使用状況を確認したり、ログを記録する工夫をします。
あわせて読みたい
- Claude Code 403 Forbiddenエラー【原因・解決手順】APIキー・権限設定
- claude-3-haiku-20240307エラー解決|新モデルID移行3ステップ
- AIから正確な回答をもらう7つのプロンプト術【Claude・ChatGPT】