OpenAI APIエラー解決法|ChatCompletion廃止・GPT-4アクセス不可・画像アップロード失敗【2026年版】
このやり方で何ができるか
OpenAI APIを使う開発者がよく直面する問題を解決できます。古い書き方のコードが動かなくなる「ChatCompletion廃止エラー」や「v1/completions誤用エラー」、GPT-4モデルにアクセスできない問題、そしてインポートエラーや画像ファイルを送信する方法です。これらを一つずつ対処することで、APIを使った自動処理(メール文案の生成・資料の要約・画像の説明など)が正常に動くようになります。
準備するもの
- パソコンのターミナル(コマンド入力画面)
- OpenAIアカウント(有料プランに登録済み)
- APIキー(OpenAIの公式サイトから取得)
- Python 3.8以上がインストールされた環境
- テキストエディタ(メモ帳など)
手順
1. インポートエラーの原因を確認する(所要時間:5分)
OpenAI APIの利用を始める際、以下のようなインポートエラーが発生することがあります。
ModuleNotFoundError: No module named 'openai'
AttributeError: module 'openai' has no attribute 'ChatCompletion'
ImportError: cannot import name 'OpenAI' from 'openai'
これらのエラーが出る主な原因は以下の3つです。
- OpenAI Pythonライブラリがインストールされていない
- 古いバージョン(0.x系)がインストールされている
- 新しいAPI形式の使用方法に対応していない
最初にターミナルで、現在インストールされているOpenAIライブラリのバージョンを確認しましょう。
pip show openai
実行結果の例:
Name: openai
Version: 1.3.0
Summary: The official Python library for the OpenAI API
- 出力がない場合:ライブラリがインストールされていません。次のステップに進みます。
- Version が1.0.0以上:新しいAPI形式を使用する必要があります。
- Version が0.x系:古いバージョンです。アップグレードが必要です。
2. OpenAIライブラリをインストール・更新する(所要時間:3分)
インストールされていない場合
pip install openai
古いバージョンをアップグレードする場合
pip install --upgrade openai
環境の問題がある場合(複数のPython環境がある場合)
明示的にPythonのバージョンを指定してインストールします。
python3.10 -m pip install openai
または、仮想環境を使用して環境を分離します。
python3 -m venv openai_env
source openai_env/bin/activate # macOS/Linux
# または
openai_env\Scripts\activate # Windows
pip install openai
更新後、改めてバージョン確認をします。
pip show openai
3. SSL/urllib3エラーへの対応(所要時間:3分)
OpenAI APIへのHTTPS通信時に、以下のようなSSLエラーが発生することがあります。
urllib3.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
ssl.SSLError: [SSL: TLSV1_ALERT_UNKNOWN_CA] tlsv1 alert unknown ca
セキュリティ関連パッケージを最新にアップグレードしてください。
pip install --upgrade requests urllib3 certifi
macOS特有の対応:以下のコマンドでSSL証明書をインストールします。
/Applications/Python\ 3.11/Install\ Certificates.command
※3.11の部分は、使用しているPythonのバージョンに置き換えてください。
プロキシ環境での対応:会社のネットワークなど、HTTPプロキシを経由している場合は環境変数を設定します。
# Linux・macOS の場合
export HTTPS_PROXY=http://proxy.company.com:8080
# Windows PowerShell の場合
$env:HTTPS_PROXY="http://proxy.company.com:8080"
4. コードの書き方を新しい形に変更する(所要時間: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キーを読み込む方法(推奨)もあります。環境変数を設定するにはターミナルで以下のように実行します。
# Linux・macOS の場合
export OPENAI_API_KEY="sk-..."
# Windowsの場合(コマンドプロンプト)
set OPENAI_API_KEY=sk-...
# Windowsの場合(PowerShell)
$env:OPENAI_API_KEY="sk-..."
環境変数を設定した後は、Pythonコード内でAPIキーを明示的に書く必要がなくなります。APIキーが OPENAI_API_KEY という名前の環境変数に設定されていれば、api_key を明示的に渡さなくても自動的に読み込まれます。
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のロール指定 |
| 出力形式 | 文字列 | メッセージオブジェクト |
| サポート状況 | 廃止予定 | 現在推奨・今後の標準 |
また、openai 1.0.0への移行では以下の主な変更点を把握しておくと便利です。
| 項目 | openai 0.x | openai 1.0.0+ |
|---|---|---|
| 初期化 | openai.api_key = "..." | client = openai.OpenAI(api_key="...") |
| API 呼び出し | openai.ChatCompletion.create() | client.chat.completions.create() |
| レスポンスアクセス | response['choices'][0] | response.choices[0] |
| 環境変数 | 自動認識なし | OPENAI_API_KEY で自動認識 |
| エラーハンドリング | openai.error.XXX | openai.APIError など |
| タイムアウト設定 | request_timeout=30 | timeout=30 |
messages 配列内の role には以下の3種類が使えます。
- system:AIの振る舞いを定義する指示(最初に1つだけ配置)
- user:ユーザーからの質問や指示
- assistant:AIの前の応答(会話履歴を含める場合)
5. GPT-4にアクセスできない場合の原因を確認する(所要時間:5分)
GPT-4モデルを使おうとすると「You exceeded your current quota」や「The model ‘gpt-4’ does not exist」というエラーが出ることがあります。これは以下の3つのどれかが原因です。
- アカウントがGPT-4へのアクセス権を持っていない → OpenAIの公式サイトで有料プランが必要です。無料試用版ではGPT-4が使えません。
- APIキーが無効になっている → キーの有効期限を確認し、必要に応じて新しいキーを作成します。OpenAI公式ページ(https://platform.openai.com/account/api-keys)でAPIキーの状態を確認しましょう。
- モデル名が間違っている → 正しい名前は「gpt-4」や「gpt-4-turbo」などです。利用可能なモデルはOpenAI公式ドキュメント(https://platform.openai.com/docs/models)で確認できます。
APIキーの有効性を確認するテストコードを実行します。
from openai import OpenAI, AuthenticationError
try:
client = OpenAI()
# 簡単なAPI呼び出しでキーの有効性を確認
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "テスト"}],
max_tokens=5
)
print("✓ APIキーは有効です")
except AuthenticationError as e:
print(f"✗ APIキーが無効です: {e}")
except Exception as e:
print(f"✗ エラーが発生しました: {e}")
アカウント設定で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)
6. 画像をアップロードして分析させる(所要時間: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)
7. 実際に試してみる(所要時間:5分)
テキストエディタに上の例を貼り付けて、APIキーをあなたのものに変更して保存します。ファイル名を「test.py」として保存しましょう。
ターミナルで以下を実行します。
python test.py
APIへの要求が成功すれば、生成されたテキストが画面に表示されます。
修正後の動作確認には、以下のような簡単なテストコードを使うと便利です。
from openai import OpenAI
def test_openai_connection():
"""OpenAI接続テスト"""
try:
client = OpenAI()
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "こんにちは"}
],
max_tokens=50
)
message = response.choices[0].message.content
print(f"✓ 接続成功: {message}")
return True
except Exception as e:
print(f"✗ エラー: {type(e).__name__}: {e}")
return False
if __name__ == "__main__":
test_openai_connection()
エラーが出ずに応答が返ってくれば、修正は成功しています。
8. つまずきやすいところで確認する(所要時間:5分)
もしエラーが出た場合は、以下をチェックします。
インポートエラー → 「No module named ‘openai’」と出たら、openaiライブラリがインストールされていません。pip install openai で再度インストールします。また、「ImportError: cannot import name ‘OpenAI’」が出る場合は、古いバージョンがインストールされています。pip uninstall openai してから pip install openai>=1.0.0 で再インストールしてください。「AttributeError: module ‘openai’ has no attribute ‘ChatCompletion’」が出た場合も同様に、バージョン1.0以降の新しい書き方に変更してください。
SSL/urllib3エラー → 「urllib3.exceptions.SSLError」が出た場合は、pip install --upgrade certifi requests urllib3 でセキュリティ関連パッケージを更新します。macOSの場合は、/Applications/Python\ 3.11/Install\ Certificates.command でSSL証明書をインストールしてください。プロキシ環境の場合は、環境変数で HTTPS_PROXY を設定します。
APIキーのエラー → 「Authentication failed」と表示される場合は、キーをコピペする際に空白が混じっていないか確認します。OpenAIのサイトから改めてコピーして貼り付けます。環境変数が正しく設定されているかも確認しましょう(import os; print(os.getenv("OPENAI_API_KEY")) で確認できます)。
モデル名のエラー → 「The model does not exist」や「model not found」が出たら、モデル名の綴りを確認します。大文字と小文字が混じっていないか見直します。最新のモデル一覧はOpenAI公式ドキュメントで確認してください。
エンドポイントのエラー → 「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 を指定してください。
レート制限エラー → 「rate limit exceeded」(429エラー)が出た場合はAPIの利用制限に達しています。リクエストの頻度を下げるか、時間をおいてから再試行してください。
ファイルが見つからない → 画像ファイルを使う場合、ファイル名のスペルが完全に一致しているか、ファイルがPythonスクリプトと同じフォルダに入っているか確認します。
レスポンスの取得方法が違う → 新形式ではレスポンスはオブジェクトです。response["choices"][0]["message"]["content"] のような辞書アクセスではなく、response.choices[0].message.content のように属性アクセスを使ってください。「‘ChatCompletion’ object is not subscriptable」や「‘Message’ object is not subscriptable」というエラーが出た場合もこれが原因です。
ストリーミング時のNoneエラー → ストリーミング応答で delta.content が None になることがあります。以下のように条件チェックを入れてください。
# ❌ 危険なコード
for chunk in response:
content = chunk.choices[0].delta.content # None のこともある
print(content, end='')
# ✅ 安全なコード
for chunk in response:
if chunk.choices[0].delta and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end='')
つまずきやすいところ
古い書き方のコードをネットで見つけてコピーしてしまう → 2023年以前の記事には古い「openai.ChatCompletion」や「openai.Completion」の書き方が載っていることが多いです。記事の日付を確認してから試します。
openai パッケージのバージョンを確認しないままコードを書く → openai 0.x系と1.0.0以降では、API形式が全く異なります。必ず pip show openai でバージョンを確認してから、正しいAPI形式を使用してください。
複数のPython環境がある場合に、別環境にインストールしてしまう → pip install がどのPython環境にインストールしているか不明確な場合は、python3.10 -m pip install openai のように明示的にバージョンを指定するか、仮想環境を使用してください。
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 と書いてください。「‘ChatCompletion’ object is not subscriptable」や「‘Message’ object is not subscriptable」というエラーはこれが原因です。
APIキーを誤って公開してしまう → GitHubなどにコードをアップロードする時は、APIキーを環境変数に移してからアップロードします。誤って公開したら、OpenAIのサイトからキーを削除して新しいものを作り直します。
GPT-4が使えるはずなのに「does not exist」と言われる → 無料試用版では使えません。有料プランへのアップグレードが必要です。またはGPT-3.5-turboなどの別のモデルで試してみます。
画像の形式に対応していない → JPG、PNG、GIF、WebPが対応形式です。BMP形式などは変換が必要な場合があります。
トークン数とコストに注意する → v1/chat/completions では、messages 配列全体(systemメッセージ・ユーザーメッセージ双方)がトークン数にカウントされます。不要な会話履歴は削除し、systemメッセージは必要最小限に留めることでコストを抑えられます。
JSON形式のレスポンスをそのまま使おうとする → response_format={"type": "json_object"} を指定しても、response.choices[0].message.content は文字列です。辞書として使うには json.loads() で変換が必要です。
import json
content_str = response.choices[0].message.content
parsed = json.loads(content_str)
慣れてきたら試したいこと
システムメッセージを活用する → messages 配列に role: "system" のメッセージを追加することで、AIの振る舞いを細かく制御できます。例えば「あなたはPythonプログラミングの専門家です」と指定することで、回答の質が向上します。ただし、systemメッセージが長すぎるとトークンコストが増えるため、簡潔に書くのがポイントです。
エラーハンドリングを追加する → APIが失敗した時に自動で再試行したり、分かりやすいエラーメッセージを出すように工夫します。本番環境で使う時は重要です。以下のように指数関数的バックオフを使った再試行が効果的です。
import time
from openai import OpenAI
client = OpenAI()
def call_api_with_retry(max_retries=3):
for attempt in range(max_retries):
try:
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "テスト"}]
)
return response
except Exception as e:
if "429" in str(e) and attempt < max_retries - 1:
wait_time = 2 ** attempt # 1秒、2秒、4秒と指数関数的に増やす
print(f"{wait_time}秒待機してから再試行します...")
time.sleep(wait_time)
else:
raise
result = call_api_with_retry()
print(result.choices[0].message.content)
openai 1.0.0以降では、エラークラスも整理されています。
import openai
client = openai.OpenAI()
try:
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "Hello"}]
)
except openai.RateLimitError:
print("❌ レート制限に達しました。しばらく待ってください。")
except openai.APIConnectionError:
print("❌ API に接続できません。ネットワークを確認してください。")
except openai.APIError as e:
print(f"❌ API エラー: {e}")
複数の画像を一度に分析させる → 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 を使います。複数のAPI呼び出しを並行実行することで高速化できます。
import asyncio
from openai import AsyncOpenAI
async def call_api():
client = AsyncOpenAI(api_key="sk-xxxxxx")
response = await client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "Hello"}]
)
return response.choices[0].message.content
# 複数の API 呼び出しを並行実行
async def main():
tasks = [call_api() for _ in range(5)]
results = await asyncio.gather(*tasks)
print(results)
asyncio.run(main())
複数の回答を一度に取得する → n パラメータを指定することで、異なる回答を複数まとめて取得できます。
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "5つの創造的なアイデアを提案してください"}
],
n=3 # 3つの異なる回答を取得
)
for i, choice in enumerate(response.choices):
---
## あわせて読みたい
- [Claude API「403 Forbidden/PermissionDeniedError」の原因と解決方法【Pythonコード付き】](/code/claude-code-403-forbidden/)
- [Claude Code「Connection timeout」エラーの原因と解決方法|3つの対処法](/code/claude-code-connection-timeout/)
- [Claude Code「command not found」エラーの解決方法【macOS・Windows・WSL完全対応】](/code/claude-code-extension-not-found/)