OpenAI Vision API (GPT-4o) での「Invalid image URL」エラーの修正方法

begin🧠 AI Tools2026-06-29| Python 3.8以上、openai ライブラリ v1.0.0以上、Node.js、または OpenAI Chat Completions 用の任意の HTTP クライアント。

Error Message

openai.BadRequestError: Error code: 400 - {'error': {'message': "Invalid image URL. Only 'data' URLs are supported for this request."}}
#openai#gpt-4-vision#python#apiトラブルシューティング

エラーメッセージ

GPT-4o や GPT-4-vision-preview に画像を送信しようとして問題が発生している場合、コンソールに次のようなエラーが表示されているはずです:

openai.BadRequestError: Error code: 400 - {'error': {'message': "Invalid image URL. Only 'data' URLs are supported for this request."}}

エラーの原因

OpenAI の API は柔軟ですが、ローカル PC 上にあるファイルを自動的に「見つける」ことはできません。主な原因は以下の通りです:

  • ローカルファイルパス: C:\Users\Desktop\image.jpg のようなパスを渡しています。API はリモートサーバー上で動作しているため、ローカルのハードドライブにはアクセスできません。
  • Data URI ヘッダーの欠落: 画像を Base64 に変換したものの、プレフィックス(接頭辞)を忘れています。API が文字列を処理する前に、ファイル形式(JPEG、PNG など)を認識させる必要があります。
  • 無効なウェブリンク: 公開 URL を使用する場合、そのリンクは直接アクセス可能である必要があります。ログインが必要なリンクや、ランディングページにリダイレクトされるリンクの場合、API は失敗します。

解決策:Base64 エンコーディングを使用する

画像を公開済みの S3 バケットなどでホストしたくない場合は、Base64 エンコーディングを使用するのが最善策です。これにより、画像が長いテキスト文字列に変換され、JSON ペイロード内で直接送信できるようになります。

1. 画像を変換する

ローカルファイルをバイナリデータとして読み込み、エンコードします。これにより、生のピクセルデータが標準的なテキスト形式に変換されます。

2. Data URI プレフィックスを追加する

文字列は data:image/jpeg;base64,(または image/png)で始まる必要があります。このヘッダーがないと、OpenAI はデータを画像としてではなく、不完全な URL として処理してしまいます。

実装例 (Python)

import base64
from openai import OpenAI

client = OpenAI()

def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        # Base64にエンコードし、バイト列をUTF-8文字列に変換
        return base64.b64encode(image_file.read()).decode('utf-8')

# ローカルの画像ファイル
image_path = "inventory_photo.jpg"
base64_string = encode_image(image_path)

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "この写真には何が写っていますか?"},
                {
                    "type": "image_url",
                    "image_url": {
                        # f-stringを使用して重要なプレフィックスを追加
                        "url": f"data:image/jpeg;base64,{base64_string}"
                    },
                },
            ],
        }
    ],
    max_tokens=300,
)

print(response.choices[0].message.content)

修正の確認

正しく動作しているか確認するにはどうすればよいでしょうか?まず、ターミナルに 200 OK ステータスが返されるはずです。base64_string を出力した際、ランダムな文字の巨大なブロックが表示されれば成功です。もしファイルパスのように見える場合は、エンコードに失敗しています。最終的に、モデルが 400 エラーを出す代わりに、画像の内容を説明し始めれば完了です。

プロのヒントと予防策

Base64 文字列は非常にデリケートです。コードが依然として失敗する場合、文字列自体が破損しているか、パディングが不足している可能性があります。

私はこうした問題のデバッグによく ToolCraft の Base64 エンコーダー を使用します。手動で画像をアップロードして、生成された文字列と Python スクリプトの結果を比較できます。ブラウザ上で完結するため、画像が外部に漏れる心配もありません。

以下の技術的な制約に注意してください:

  • 33% のサイズ増: Base64 エンコーディングを行うと、ファイルサイズは約 33% 増加します。元の画像が 18MB の場合、エンコード後の文字列は OpenAI の 20MB 制限を超えてしまいます。
  • MIME タイプの正確性: ファイル形式に合わせてプレフィックスを一致させてください。PNG の場合は image/png、WebP の場合は image/webp を使用します。
  • URL の安全性: Base64 の代わりにウェブ URL を使用する場合は、ToolCraft の URL エンコーダー を使用して、リンク内の特殊文字が API リクエストを壊さないようにしてください。

Related Error Notes