GEMINI LABEN
NANOLITE — Nano Banana 2 Liteが登場しました。Googleで最も速く、最もコスト効率の高いGemini Imageモデルで、軽量な画像生成を安く回したい用途に向いていますOMNIFLASH — Gemini Omni Flashがpublic previewになりました。ネイティブにマルチモーダルなモデルで、企業や開発者が独自の動的な動画ワークフローを構築できますAGENTS — Managed Agentsが拡張されました。background: trueでサーバー側の非同期実行とポーリング、リモートMCPサーバー連携、対話をまたぐ認証情報のリフレッシュに対応しますMEMORY — Memory BankのIngestEvents APIが一般提供になりました。イベントの取り込みとメモリ生成を分離し、コンテンツを継続的にストリームできますTHROUGHPUT — Provisioned Throughputで、同一モデル・同一リージョンに対して最大7件の保留オーダーを提出できるようになりましたDEPRECATE — 画像生成モデルは8月17日に、Gemini Enterprise Agent PlatformのGrok 4.1系は8月20日に停止される予定ですNANOLITE — Nano Banana 2 Liteが登場しました。Googleで最も速く、最もコスト効率の高いGemini Imageモデルで、軽量な画像生成を安く回したい用途に向いていますOMNIFLASH — Gemini Omni Flashがpublic previewになりました。ネイティブにマルチモーダルなモデルで、企業や開発者が独自の動的な動画ワークフローを構築できますAGENTS — Managed Agentsが拡張されました。background: trueでサーバー側の非同期実行とポーリング、リモートMCPサーバー連携、対話をまたぐ認証情報のリフレッシュに対応しますMEMORY — Memory BankのIngestEvents APIが一般提供になりました。イベントの取り込みとメモリ生成を分離し、コンテンツを継続的にストリームできますTHROUGHPUT — Provisioned Throughputで、同一モデル・同一リージョンに対して最大7件の保留オーダーを提出できるようになりましたDEPRECATE — 画像生成モデルは8月17日に、Gemini Enterprise Agent PlatformのGrok 4.1系は8月20日に停止される予定です
記事一覧/API / SDK
API / SDK/2026-05-31初級

Gemini APIで「Unsupported MIME type」エラーが出るときの原因と対処

画像や音声をGemini APIに渡したときに発生する『Unsupported MIME type』エラーを、MIMEタイプの綴り間違い・octet-stream問題・非対応フォーマットの3つの観点から切り分けて、確実に動くコードで解決します。

troubleshooting57error14fix10mime-typegemini-api279file-api6multimodal24

iPhoneアプリから撮影した写真をGemini APIに送って解析させる機能を作っていたとき、ローカルのテスト画像では通るのに、実機から送られてきた画像だけが 400 INVALID_ARGUMENT. Unsupported MIME type: image/jpg で弾かれる、という現象に半日ほど悩まされました。原因は拍子抜けするほど単純で、アップロード処理が付けていたMIMEタイプの文字列が間違っていただけでした。

2014年からアプリ事業を続けている個人開発者として、マルチモーダルなAPIに画像や音声を渡す場面はここ1〜2年で一気に増えました。その中で Unsupported MIME type は、エラーメッセージのわりに原因が3つに分かれていて、切り分けを知らないと無駄に時間を溶かしやすいエラーです。順番に潰していきます。

まず確認すべきは「綴り」です — image/jpg は存在しません

最も多いのが、MIMEタイプの綴り間違いです。特に image/jpg は、拡張子の .jpg に引きずられて書いてしまいがちですが、正式なMIMEタイプとしては存在しません。JPEGの正しいMIMEタイプは image/jpeg です。

from google import genai
 
client = genai.Client(api_key="YOUR_GEMINI_API_KEY")
 
with open("photo.jpg", "rb") as f:
    image_bytes = f.read()
 
# ❌ これは弾かれる: Unsupported MIME type: image/jpg
response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents=[
        {"inline_data": {"mime_type": "image/jpg", "data": image_bytes}},
        "この画像に写っているものを説明してください",
    ],
)

image/jpgimage/jpeg に直すだけで通ります。

# ✅ 正しい綴り
{"inline_data": {"mime_type": "image/jpeg", "data": image_bytes}}

同様に間違えやすいのが image/jpeg 以外の表記揺れです。Geminiが画像で受け付けるMIMEタイプは、image/pngimage/jpegimage/webpimage/heicimage/heif の5つです。iPhoneの標準フォーマットであるHEIC(image/heic)はそのまま渡せるので、わざわざJPEGに変換する必要はありません。ここは意外と知られていない点だと感じています。

拡張子からMIMEタイプを自前でマッピングしている場合は、Pythonの標準ライブラリに任せたほうが綴りミスを防げます。

import mimetypes
 
mime_type, _ = mimetypes.guess_type("photo.jpg")
print(mime_type)  # image/jpeg (正しい綴りが返る)

File APIで octet-stream になっていないか

2つめの落とし穴は、File API経由でアップロードしたファイルのMIMEタイプが application/octet-stream になっているケースです。これは20MBを超えるファイルや、繰り返し使うファイルをFile APIにアップロードするときに起きます。

client.files.upload() は、ファイルの拡張子や中身からMIMEタイプを推測しますが、推測に失敗すると application/octet-stream(汎用バイナリ)として登録されます。そのまま generate_content に渡すと、octet-streamは解析対象として非対応のため弾かれます。

アップロード直後にMIMEタイプを確認すると、推測が外れているかどうかがすぐ分かります。

uploaded = client.files.upload(file="recording.m4a")
print(uploaded.mime_type)  # application/octet-stream だと危険信号

対策は、アップロード時にMIMEタイプを明示的に指定することです。新しい google-genai SDKでは config で渡せます。

from google.genai import types
 
uploaded = client.files.upload(
    file="recording.m4a",
    config=types.UploadFileConfig(mime_type="audio/mp4"),
)
print(uploaded.mime_type)  # audio/mp4
 
response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents=[uploaded, "この音声を文字起こししてください"],
)

拡張子に頼らず、自分が何を送っているかを毎回明示する。これだけでoctet-stream由来のエラーはほぼ消えます。

それでも弾かれるなら、フォーマット自体が非対応です

綴りも合っている、MIMEタイプも明示している、それでも Unsupported MIME type が出る場合は、そのフォーマットをGeminiが本当にサポートしていない可能性が高いです。

特に音声と動画はモデルやエンドポイントによって対応範囲が変わります。よく問題になるのが、iPhoneのボイスメモが出力する .m4a です。これはコンテナとしては audio/mp4 で受け付けられますが、audio/m4aaudio/x-m4a という非標準の表記で送ると弾かれます。確実に通したいときは、対応が安定している形式に変換してしまうのが早いです。

# ffmpegでm4aをmp3に変換してから渡す
import subprocess
 
subprocess.run([
    "ffmpeg", "-i", "voice.m4a", "-acodec", "libmp3lame", "voice.mp3"
], check=True)
 
uploaded = client.files.upload(
    file="voice.mp3",
    config=types.UploadFileConfig(mime_type="audio/mp3"),
)

現時点でGeminiが受け付ける主なMIMEタイプは、画像が image/pngimage/jpegimage/webpimage/heicimage/heif、音声が audio/wavaudio/mp3audio/aiffaudio/aacaudio/oggaudio/flac、ドキュメントが application/pdf とプレーンテキスト系です。実装前に、自分が扱うファイル形式がこのリストに入っているかを一度確認しておくと、後から慌てずに済みます。仕様は更新されることがあるので、公式のファイルプロンプトのドキュメントで最新の対応表を確認する習慣をつけておくと安心です。

再発させないための一工夫

このエラーは、ユーザーがどんなファイルを送ってくるか分からない本番環境でこそ起きます。累計5,000万ダウンロードを超えるアプリ事業を続けてきて痛感したのは、ローカルで想定したフォーマットと、世界中の実機から実際に飛んでくるフォーマットは別物だということです。私の場合、アプリ側でアップロードを受け付ける時点で、許可するMIMEタイプをホワイトリストで弾くようにしてからは、APIまで到達する前に問題のあるファイルを止められるようになりました。サーバー側のログにもMIMEタイプを残しておくと、後から「どの形式で詰まったか」を集計でき、対応形式を増やす判断の材料になります。

SUPPORTED_IMAGE = {"image/png", "image/jpeg", "image/webp", "image/heic", "image/heif"}
 
def validate_image(mime_type: str) -> None:
    if mime_type not in SUPPORTED_IMAGE:
        raise ValueError(
            f"未対応の画像形式です: {mime_type}. "
            f"対応形式: {', '.join(sorted(SUPPORTED_IMAGE))}"
        )

エラーメッセージを「Gemini APIが拒否した」ではなく「この形式は未対応です」とユーザーの言葉に翻訳して返せると、サポート対応もぐっと楽になります。

まず試すなら、いま手元で Unsupported MIME type を出しているコードのMIMEタイプ文字列を print してみてください。image/jpgapplication/octet-stream が出ていれば、原因はこの記事のどれかに当てはまるはずです。同じところで詰まっている方の手がかりになれば嬉しいです。

シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

API / SDK2026-05-30
Gemini 2.5 Pro で thinkingBudget を 0 にすると INVALID_ARGUMENT になる原因と対処
Gemini 2.5 Pro で thinkingBudget を 0 にすると 400 INVALID_ARGUMENT が返る原因を、モデルごとの思考予算レンジの違いから解説します。Pro でレイテンシを抑える正しい書き方と Flash への切り替え判断を Python・JavaScript のコード付きで紹介します。
API / SDK2026-04-14
Veo API で動画生成がうまくいかないとき — エラーと詰まりポイントの完全対処法
Veo API の動画生成でよく起きるエラーを徹底解説。ポーリング実装の落とし穴、セーフティフィルター拒否、クォータ超過、動画ファイル取得失敗など、実際に詰まりやすいポイントと解決策をコード付きで紹介します。
API / SDK2026-04-10
Gemini APIのJSON出力・構造化出力が正しく返らない原因と対処法
Gemini APIのJSON Modeや構造化出力で不正なJSON・スキーマ違反・途中切れが発生する原因を分析し、具体的な解決手順をコード例付きで解説します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →