エラーメッセージ
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 リクエストを壊さないようにしてください。

