# Nano Banana Proで「Unsupported file URI type」? 先にGeminiのファイル経路を直す

> 公開HTTPSや署名付きURLは、対応するGemini APIで画像参照に使えます。「Unsupported file URI type」が出たら、送信先と実際の値を確認し、URL・生バイト・アップロード済みファイルの指定を直してください。

- URL: https://blog.laozhang.ai/ja/posts/nano-banana-pro-unsupported-file-uri-type
- Published: 2026-04-09
- Updated: 2026-10-07
- Author: LaoZhang AI Team (https://blog.laozhang.ai/ja/about)
- Topic: トラブルシューティング
- Tags: Nano Banana Pro, Gemini API, Files API, image_url, ファイル入力

---
Nano Banana Proで「Unsupported file URI type」や「Invalid or unsupported file uri」が出たら、まず**送信先のAPIと、画像の欄に実際に入った値・型**を確認してください。プロンプトの言い換えより先に、画像をどう渡したかを直します。

**公開HTTPS URLや署名付きURLを使っている場合、必ずアップロードし直す必要はありません。** 2026年10月1日更新の[Google公式ファイル入力ガイド](https://ai.google.dev/gemini-api/docs/generate-content/file-input-methods)は、対応する`generateContent`への`file_uri`に外部URLを渡す方法を案内しています。Geminiが処理時に画像を取得できること、URLの期限・権限・MIMEタイプ・モデルの条件を満たすことが必要です。Gemini 2.0系はこの外部URL入力に対応していません。

手元の画像なら、ファイルを読んで`inlineData`へ生バイトのbase64を入れる方法もあります。繰り返し使うならFiles APIにアップロードし、返された`uri`を使います。どの方法でも、**元と同じ画像編集のAPI・モデルで、編集済み画像が返るところまで**確認するのが修正のゴールです。

## エラーの後ろに出た値から、最初の修正を決める

![最終JSONに入った参照の値と型から、未展開式・配列・data URL・ローカルパス・File nameの修正を選ぶ図](https://blog.laozhang.ai/posts/ja/nano-banana-pro-unsupported-file-uri-type/img/uri-routes.webp)



設定画面の値ではなく、HTTP送信直前のJSONを確認します。エラー文に値が含まれる場合も、その文字列を手掛かりにできます。ただし、次の入力すべてが同じエラー文を返すわけではありません。

| 実際に送った画像参照 | 確認・修正すること |
| --- | --- |
| `{{ $json.imageUrls }}`などの式がそのまま残っている | ワークフロー側で式が評価されているか、参照した項目が存在するかを確認し、評価後の文字列を送る |
| `["https://…"]`、オブジェクト、またはそれらを文字列化した値 | `fileUri`は1本のURI文字列にする。複数画像は画像ごとに別の`parts`要素にする |
| `https://…` | 対応するAPIか、画像本体へアクセスできるか、署名の期限が切れていないか、MIMEが合うかを確認する |
| `data:image/png;base64,…` | ネイティブAPIなら`inlineData`へ変更し、`data`には接頭辞を除いたbase64だけを入れる |
| `/tmp/photo.png`、`file:///…`、端末上のパス | パスではなくファイルを読み、`inlineData`またはアップロード後の`uri`を使う |
| `files/…` | Fileの`name`をURIとして渡していないか確認し、アップロード応答の`uri`を使う |
| `gs://bucket/object` | GeminiのGCS登録手順か、Vertex AIの手順かを確認する。ホスト・認証・登録の条件を混ぜない |

ワークフローの式が展開されない例は、[APIYIによる2026年4月8日の解説](https://help.apiyi.com/en/nano-banana-pro-unsupported-file-uri-type-error-fix-en.html)でも報告されています。これは原因を探す手掛かりであり、すべてのn8nや代理APIに共通する再現結果ではありません。項目名が`imageUrls`でも、実際の型が文字列なのか配列なのかは別に確かめます。

JSON化するとき、未定義の値はオブジェクトの項目ごと消えることもあります。「画面にはURLがあるから送信できている」と判断せず、送信後の形を見てください。確認用ログには型、URIの方式、項目の有無などを残し、APIキー、署名付きURLのクエリ、画像のbase64全体は出さないようにします。

## ネイティブGemini APIなら、URLを1本の文字列で渡す

GoogleのネイティブAPIでNano Banana Proを使う場合、現在のモデルIDは`gemini-3-pro-image`です。画像編集も`generateContent`で行えます。[公式画像生成ガイド](https://ai.google.dev/gemini-api/docs/generate-content/image-generation)を確認し、画像説明用のモデルへ変更してエラーだけを消さないようにしてください。

送信先は次の形です。認証は既存のGemini APIキーを`x-goog-api-key`ヘッダーで指定します。

```text
POST https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image:generateContent
Content-Type: application/json
x-goog-api-key: <自分のGemini APIキー>
```

次は画像URLを渡すリクエストの形です。`https://example.com/reference.png`は説明用の置き場所なので、使用が認められ、処理中にGeminiから取得できる実際の画像URLへ置き換えてください。以下のJSONはキャメルケースで統一しています。

```json
{
  "contents": [
    {
      "role": "user",
      "parts": [
        {"text": "この画像の背景を明るい青に変更し、編集後の画像を返してください。"},
        {
          "fileData": {
            "mimeType": "image/png",
            "fileUri": "https://example.com/reference.png"
          }
        }
      ]
    }
  ],
  "generationConfig": {
    "responseModalities": ["TEXT", "IMAGE"]
  }
}
```

`fileUri`は配列ではなく文字列です。2枚を渡すなら、2つの画像`Part`を作ります。1つの`Part`に`text`と`fileData`を同居させたり、ネイティブの`parts`へOpenAI形式の`image_url`を混ぜたりしないでください。[Content・Part・FileDataのAPI仕様](https://ai.google.dev/api/generate-content)で、それぞれの項目を確認できます。

### URLは正しいのに取得できないとき

ブラウザで開けることと、Geminiから画像本体を取得できることは同じではありません。ログイン済みのブラウザだけが見られるページ、画像のプレビューHTML、期限切れの署名付きURLでは、欲しい画像が届かないことがあります。

画像本体のURL、処理が終わるまで有効な期限、必要な読み取り権限、実際の画像に一致する`mimeType`を確認します。PNGなら`image/png`、JPEGなら`image/jpeg`です。拡張子だけを変えても画像の形式は変わりません。非公開画像を使う場合は、承認された範囲の署名付きURLか、後述のバイト入力・アップロードを選び、バケット全体を公開する必要はありません。

公式ガイドの外部URL入力表には100MBという値がありますが、これは**一般の入力方法の条件**です。すべてのNano Banana Pro画像、モデル、代理サービスで100MBを受け付ける保証ではありません。ファイル形式・モデル・トークン処理の制限も確認し、まず小さな参照画像で同じ編集経路を確かめます。[入力方法ごとの公式条件](https://ai.google.dev/gemini-api/docs/generate-content/file-input-methods)を優先してください。

`URL_RETRIEVAL_STATUS_UNSAFE`など、安全上の取得拒否が返る場合は、文字列の整形だけで直す問題ではありません。拒否理由を確認し、アクセス制限や安全上の保護を回避する方法を試さないでください。

## ローカル画像やdata URLは、inlineDataへ直す

ネイティブAPIの`inlineData.data`に入るのは、画像ファイルそのものをbase64にした値です。`data:image/png;base64,`という接頭辞は入れません。ファイルパスをbase64にするのでもありません。

次のPythonコードは、手元のPNGから送信用JSONを作るだけの例です。API呼び出しは行いません。`reference.png`は自分のPNGへ置き換え、生成した`request.json`を前節と同じ`generateContent`に送る構成です。画像がJPEGなら`mimeType`も`image/jpeg`へ変更してください。

```python
import base64
import json
from pathlib import Path

image_bytes = Path("reference.png").read_bytes()
request = {
    "contents": [{
        "role": "user",
        "parts": [
            {"text": "この画像の背景を明るい青に変更し、編集後の画像を返してください。"},
            {"inlineData": {
                "mimeType": "image/png",
                "data": base64.b64encode(image_bytes).decode("ascii"),
            }},
        ],
    }],
    "generationConfig": {"responseModalities": ["TEXT", "IMAGE"]},
}
Path("request.json").write_text(
    json.dumps(request, ensure_ascii=False), encoding="utf-8"
)
```

URLが取得できないときにバイト入力で通るなら、取得経路を切り分ける材料になります。ただし、画像の大きさや形式がモデルの制限を超えていれば、入力方法を変えただけでは解消しません。

## Files APIを使うなら、返されたuriと状態を確認する

画像を複数のリクエストで使う場合は、Files APIにアップロードして参照できます。[Files APIの仕様](https://ai.google.dev/api/files)に従い、アップロード応答のFileオブジェクトから`uri`と`mimeType`を取得してください。Fileの識別名である`name`や、アップロードに使ったローカルパスを`fileUri`へ入れないようにします。

手順は次の順です。

1. 既存のクライアントで、画像本体と正しいMIMEタイプを指定してアップロードします。
2. 返されたFileの`state`を確認します。`PROCESSING`なら`name`で状態を取得し、`ACTIVE`になってから生成に使います。待機には回数や時間の上限を設け、`FAILED`ならエラー内容を確認して止めます。
3. 前掲JSONの画像`Part`を、返された値を使う次の形へ置き換えます。
4. 同じProモデル・同じ編集指示で送信し、画像出力を確認します。

```json
{
  "fileData": {
    "mimeType": "image/png",
    "fileUri": "<アップロード応答のFile.uri>"
  }
}
```

この`fileUri`の例は差し替え用です。山括弧を含めて送信する値ではありません。通常のFiles APIアップロードは48時間保持されるため、以前保存したURIが使えなくなった場合は、Fileの期限と存在を確認します。アップロード自体が成功しても、選択したモデルがそのファイル形式を扱えるという証明にはなりません。[公式のファイル入力方法](https://ai.google.dev/gemini-api/docs/generate-content/file-input-methods)で保持期間とモデル別の条件を照合してください。

## gs://を使う場合は、GCS登録とVertex AIを区別する

Google Developer APIで既存のGCSオブジェクトを使うには、`files.register`という方法があります。`gs://`を任意の`fileUri`へ貼り付けることと、登録手順を済ませることは別です。

登録先は`POST https://generativelanguage.googleapis.com/v1beta/files:register`で、入力は`uris`配列、応答は`files`配列です。例えば登録対象の形は次のようになります。

```json
{"uris": ["gs://your-bucket/reference.png"]}
```

ここでは**APIキーだけでは登録できません**。公式ガイドのGCS登録手順に従い、呼び出し側のOAuth認証・必要な権限、APIとサービスIDの準備、Geminiサービスエージェントが対象バケットを読み取るための権限を確認します。クライアント初期化でAPIキーを要求されても、登録処理の認証とは別です。登録後は返されたFileの`uri`を使い、生成リクエストの認証はその経路の条件に従います。[登録仕様](https://ai.google.dev/api/files)と[権限を含む公式手順](https://ai.google.dev/gemini-api/docs/generate-content/file-input-methods)を併せて確認してください。

GCS登録では画像をFiles APIの保管領域へコピーするわけではなく、登録によるアクセスは最大30日です。元のオブジェクトの読み取り条件も維持する必要があります。通常のアップロードの48時間とは区別してください。

元からVertex AIを使っている場合は、プロジェクト・ロケーションを含む別の送信先と認証の手順を使います。`gs://`という文字列だけを見てGoogle Developer APIとVertex AIを入れ替えると、URI以外の条件まで変わります。2025年の[Google ForumのGCS入力に関する質問](https://discuss.ai.google.dev/t/400-invalid-or-unsupported-file-uri/73951)も、Gemini 2.0とAPIキー・Vertexの区別が背景にある報告です。現在の公開HTTPS対応を否定する根拠にはなりません。

## OpenAI互換APIやComfyでは、そのAPIの形式を保つ

送信先が`/v1beta/openai/`配下なら、ネイティブの`contents`ではなく互換APIの形式を使います。[GoogleのOpenAI互換ガイド](https://ai.google.dev/gemini-api/docs/openai)には、画像理解の入力として次の形が載っています。

```json
{
  "type": "image_url",
  "image_url": {"url": "data:image/png;base64,<画像のbase64>"}
}
```

これは互換APIのメッセージ内に置く画像要素です。この形式ではdata URLの接頭辞を使いますが、ネイティブの`fileUri`や`inlineData.data`へ同じ文字列を移すことはできません。また、**画像理解の例が動くことと、Nano Banana Proで画像編集できることは別**です。互換APIを使い続ける場合は、そのサービスが公開しているモデル・編集操作・画像応答の仕様まで確認してください。

[ComfyのNano Banana Proコード例](https://docs.comfy.org/ja/development/comfy-router/models/google/nano-banana-pro/code)は、`api.comfy.org/v2/models/vertexai/gemini-3-pro-image`と`COMFY_API_KEY`を使う独自のAPIです。日文資料にはURIベースの入力と生バイトの入力が載っていますが、Google Developer APIのホストや認証と置き換えられるわけではありません。Comfyで説明されている`inlineData`の20MB制限、生成画像の署名付きURLの24時間という期限も、そのサービスの条件です。Google Filesの48時間やGCS登録の最大30日と混同しないでください。

一般的な入力スキーマに音声や動画の項目があることも、Proモデルがその入力を処理できる証拠にはなりません。今回直したいのは参照画像を使った画像編集です。選択したモデルの画像入力・出力の説明を基準にします。

SDKや代理サービス経由でのみ失敗する場合は、クライアントがURLを先に取得してバイトへ変換しているか、そのままサーバーへ渡しているかも確認します。2025年の[Vercel AI SDKの報告](https://github.com/vercel/ai/issues/10692)には、その違いが記載されています。ただし、当時のバージョンの報告であり、現在のすべてのラッパーに同じ不具合があるとは言えません。送信先、SDK・ラッパーのバージョン、最終JSONを確認してから、該当する仕様や修正履歴を調べます。

## 修正完了は「画像が返り、編集結果も合う」まで

![画像参照の修正後に、応答・ファイル期限・クライアントの処理を確認するフロー](https://blog.laozhang.ai/posts/ja/nano-banana-pro-unsupported-file-uri-type/img/verify-flow.webp)

最初の再試行では、元のAPI、Proモデル、編集指示を保ち、画像の渡し方だけを変えます。別のモデルで画像の説明文が返ったことを、Proの編集成功として扱わないでください。

ネイティブ`generateContent`なら、`candidates[].content.parts[]`を調べ、画像のMIMEタイプとデータを含む画像要素があるか確認します。`inlineData`で返された画像はbase64を復号して保存し、画像として開けることと、指定した背景の変更などが反映されていることを確認します。画像要素は文章要素と一緒に返ることもあるので、先頭の`parts[0]`だけを見る実装は避けます。[公式の画像編集例](https://ai.google.dev/gemini-api/docs/generate-content/image-generation)も画像要素から結果を取り出しています。

HTTP 200でも文章しかない場合は、まだ目的を達成していません。応答に候補があるか、`finishReason`や`promptFeedback`にブロック理由がないか、アプリが画像要素を捨てていないかを確認します。403の権限、404のモデル、429の上限などへ症状が変わったら、URIの整形を繰り返す段階ではありません。[Gemini画像生成エラーの対処法とAPIエラーコード表](https://blog.laozhang.ai/ja/posts/gemini-image-common-errors-fix)で、そのエラーに合う確認へ進みます。

このページのJSONとbase64の処理は、入力の形を確認するための例です。ここで実APIの画像生成成功率や、実際のアカウント・URLでの動作を検証したものではありません。

## よくある確認

### 公開HTTPS URLなら、そのままfileUriへ入れてよいですか？

対応するネイティブ`generateContent`では使えます。URLが画像本体を返し、Geminiが処理時に取得でき、期限・MIME・モデルなどの条件を満たすことが必要です。Gemini 2.0系は外部URL入力に対応していません。詳しい条件は[現在のGoogle公式ガイド](https://ai.google.dev/gemini-api/docs/generate-content/file-input-methods)を確認してください。

### base64はfileUriとinlineDataのどちらへ入れますか？

ネイティブAPIでは`inlineData.data`へ入れます。`mimeType`も指定し、`data:image/...;base64,`の接頭辞は付けません。OpenAI互換APIの`image_url.url`で使うdata URLは別の形式です。

### 昨日使えたファイルURIが今日は失敗するのはなぜですか？

期限や元ファイルのアクセス条件を確認します。[公式ガイド](https://ai.google.dev/gemini-api/docs/generate-content/file-input-methods)では、通常のFiles APIアップロードは48時間、GCS登録によるアクセスは最大30日です。署名付きURLはそのURLの有効期限に従うため、これらの数字を一律に当てはめないでください。

### URLを配列で持っている場合はどうしますか？

各URLを1本ずつ別の画像`Part`へ入れます。`fileUri`そのものを配列にしたり、配列全体を文字列へ変えたりしません。テンプレート式を使うワークフローなら、送信時に式が評価され、期待したURI文字列になっていることも確認します。

## 参考資料

本文で参照している外部ページを、登場順に並べています。最終更新日：2026-10-07。

- [Google公式ファイル入力ガイド](https://ai.google.dev/gemini-api/docs/generate-content/file-input-methods) (ai.google.dev)
- [APIYIによる2026年4月8日の解説](https://help.apiyi.com/en/nano-banana-pro-unsupported-file-uri-type-error-fix-en.html) (help.apiyi.com)
- [公式画像生成ガイド](https://ai.google.dev/gemini-api/docs/generate-content/image-generation) (ai.google.dev)
- [Content・Part・FileDataのAPI仕様](https://ai.google.dev/api/generate-content) (ai.google.dev)
- [Files APIの仕様](https://ai.google.dev/api/files) (ai.google.dev)
- [Google ForumのGCS入力に関する質問](https://discuss.ai.google.dev/t/400-invalid-or-unsupported-file-uri/73951) (discuss.ai.google.dev)
- [GoogleのOpenAI互換ガイド](https://ai.google.dev/gemini-api/docs/openai) (ai.google.dev)
- [ComfyのNano Banana Proコード例](https://docs.comfy.org/ja/development/comfy-router/models/google/nano-banana-pro/code) (docs.comfy.org)
- [Vercel AI SDKの報告](https://github.com/vercel/ai/issues/10692) (github.com)
