AIコーディング 2026.05.16

OpenAI APIエラー解決法|ChatCompletion廃止・GPT-4アクセス不可・画像アップロード失敗【2026年版】

タグ:OpenAI API / ChatGPT / エラー対処 / GPT-4 / 画像アップロード

このやり方で何ができるか

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/completionsv1/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つのどれかが原因です。

  1. アカウントがGPT-4へのアクセス権を持っていない → OpenAIの公式サイトで有料プランが必要です。無料試用版ではGPT-4が使えません。
  2. APIキーが無効になっている → キーの有効期限を確認し、必要に応じて新しいキーを作成します。
  3. モデル名が間違っている → 正しい名前は「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ダッシュボードで使用状況を確認したり、ログを記録する工夫をします。


あわせて読みたい

参考ソース