# Nano Banana Pro пишет «Unsupported file URI type»? Сначала исправьте файловый маршрут Gemini

> При «Unsupported file URI type» сначала проверьте, что реально отправлено в поле ссылки: строка, массив, локальный путь или неподставленная переменная. Native Gemini теперь принимает подходящие HTTPS-ссылки; для локального изображения используйте inlineData или загрузку через Files API.

- URL: https://blog.laozhang.ai/ru/posts/nano-banana-pro-unsupported-file-uri-type
- Published: 2026-04-09
- Updated: 2026-10-07
- Author: LaoZhang AI Team (https://blog.laozhang.ai/ru/about)
- Topic: Устранение ошибок
- Tags: Nano Banana Pro, Gemini API, Files API, fileUri, ошибки изображений

---
При ошибке «Unsupported file URI type» или «Invalid or unsupported file uri» сначала проверьте **реально отправленное значение ссылки и формат запроса**. Если сервер получил `{{ $json.imageUrls }}`, массив, `file:///...` или строку `data:image/...` в native `fileData.fileUri`, исправлять нужно передачу файла. Для локального изображения можно отправить байты через `inlineData` либо загрузить его через Files API и использовать возвращённый `uri`.

При этом обычная HTTPS-ссылка больше не означает автоматически неправильный вход. В актуальном [руководстве Gemini по передаче файлов](https://ai.google.dev/gemini-api/docs/generate-content/file-input-methods), обновлённом 1 октября 2026 года, описаны публичные и подписанные HTTPS-ссылки в `file_uri`. Их принятие зависит от модели, доступности файла, срока действия, MIME и условий конкретного API. Старое правило «native Gemini всегда требует сначала загрузить файл» уже слишком ограничивает выбор.

Ниже речь о передаче исходного изображения в Nano Banana Pro через Gemini API. В текущей [документации генерации изображений](https://ai.google.dev/gemini-api/docs/image-generation) ему соответствует `gemini-3-pro-image`. У посредника могут быть собственные ID и ограничения: проверяйте их отдельно, сохраняя задачу редактирования изображения.

## Маршрут за 30 секунд

Самый полезный первый шаг — посмотреть тело запроса после подстановки переменных и сериализации. Настройка поля в редакторе сценария ещё не доказывает, что сервер получил именно это значение.

| Что оказалось в отправленном поле | Что проверить или изменить | Признак исправления |
| --- | --- | --- |
| `{{ $json.imageUrls }}` или другое выражение шаблона | Вычислить выражение до отправки; проверить имя поля и режим его обработки в вашем инструменте | В JSON находится конкретная строка ссылки, а не текст выражения |
| Массив ссылок либо строка вида `["https://…"]` | Для native `fileData.fileUri` передать одну строку; нескольким изображениям дать отдельные части `parts` | У каждого изображения своё поле `fileUri` строкового типа |
| `/tmp/photo.png`, `file:///…`, `content://…` | Прочитать файл на стороне приложения и отправить байты либо загрузить через Files API | В запросе есть `inlineData` или действующий возвращённый `uri` |
| `data:image/png;base64,…` | Уточнить API: в native `inlineData.data` нужен чистый base64; в совместимом `image_url.url` префикс может быть нужен | Поле соответствует выбранному API и действию |
| HTTPS-ссылка | Проверить, что она ведёт к самому изображению, доступна получателю и не истекла; уточнить поддержку моделью и посредником | Тот же запрос получает исходное изображение и возвращает результат редактирования |
| `gs://bucket/object` | Различить регистрацию GCS в Gemini Developer API и отдельный запрос Vertex AI | Используется способ доступа, документированный для вашего API |

Схему native-запроса определяет [справочник `generateContent`](https://ai.google.dev/api/generate-content): изображения передаются в `contents[].parts[]`, а `fileData.fileUri` — строка. Одна часть содержит один вид данных; текст и изображение оформляйте отдельными частями. Имена `file_data`/`file_uri` в REST-примерах и `fileData`/`fileUri` в схемах или JavaScript нужно сопоставлять с сериализатором вашего клиента. Не переносите `image_url` внутрь native `parts`.

Не всякое неверное поле вызовет дословно ту же ошибку: сохраните HTTP-статус и сообщение, чтобы отличить отказ по ссылке от ошибки структуры JSON.

## Если переменная шаблона не стала ссылкой

Сообщение, в котором после `Unsupported file URI type` видны фигурные скобки и имя переменной, даёт конкретную зацепку: серверу мог уйти текст выражения. Такой случай описан в [материале APIYI](https://help.apiyi.com/ru/nano-banana-pro-unsupported-file-uri-type-error-fix-ru.html). Это пример ошибки в сценарии автоматизации, а не доказательство, что все подобные сбои имеют одну причину.

Проверьте выход предыдущего шага и результат подстановки непосредственно перед HTTP-запросом. Если исходное поле называется `imageUrl`, обращение к `imageUrls` не даст нужной ссылки. Но поведение дальше зависит от инструмента: отсутствующее поле может исчезнуть при сериализации, стать `null` или превратиться в строку после явного преобразования. Нельзя диагностировать этот случай только по тому, как значение выглядело в интерфейсе.

Для native Gemini должно выполняться следующее:

- Значение `fileUri` — непустая строка, а не объект и не массив.
- Строка содержит адрес выбранного изображения, а не выражение, имя поля или JSON со списком адресов.
- Если изображений несколько, каждое помещено в свою часть `parts`.
- После всех преобразований посредника поля всё ещё имеют ожидаемую структуру.

При диагностике записывайте тип значения, наличие поля, схему URI и факт оставшегося шаблона. Не публикуйте API-ключ, полную подписанную ссылку с параметрами или base64 приватного изображения. Для передачи примера в поддержку достаточно обезличенного JSON с сохранёнными типами и структурой.

## Если вы используете native Gemini `file_data`

Для Gemini Developer API адрес генерации имеет вид `POST /v1beta/models/{model}:generateContent`. Это отдельный формат запроса, описанный в [API reference](https://ai.google.dev/api/generate-content). У него есть несколько допустимых способов получить файл; выбирать нужно по тому, где находятся байты изображения и как вы хотите дать к ним доступ.

### Публичная или подписанная HTTPS-ссылка

Если ваш файл уже доступен по подходящему HTTPS-адресу, его можно передать ссылкой. Ниже **пример структуры JSON** для native-запроса; адрес `example.invalid` — заглушка, которую нужно заменить своим допустимым адресом изображения:

```json
{
  "contents": [{
    "role": "user",
    "parts": [
      {"text": "Измени фон этого изображения на светло-серый. Сохрани основной объект."},
      {"fileData": {
        "mimeType": "image/png",
        "fileUri": "https://example.invalid/photo.png"
      }}
    ]
  }],
  "generationConfig": {"responseModalities": ["TEXT", "IMAGE"]}
}
```

Для Nano Banana Pro этот JSON предназначен для `gemini-3-pro-image:generateContent`, при наличии доступа к модели. Сам по себе правильный JSON не подтверждает, что удалённый адрес будет принят.

Проверьте ссылку по [условиям внешних URL Google](https://ai.google.dev/gemini-api/docs/generate-content/file-input-methods): файл должен быть доступен при обработке запроса, а подписанный адрес — иметь необходимые разрешения и не истечь до получения файла. Страница просмотра, требующая входа в аккаунт или cookie браузера, не равна прямой ссылке на изображение. Укажите фактический MIME; расширение `.png` в адресе не делает HTML-страницу изображением.

Если подходящая ссылка отклонена, сохраните сообщение о получении URL. Ошибка `URL_RETRIEVAL_STATUS_UNSAFE` означает отказ по правилам проверки адреса; это не повод обходить защиту. Не делайте приватное хранилище публичным ради проверки. Когда передача файла разрешена, альтернативой может быть отправка локальных байтов или обычная загрузка через Files API.

Руководство также исключает внешние URL для семейства Gemini 2.0. Поэтому старые сообщения об ошибках этих моделей не описывают все возможности нынешнего Nano Banana Pro.

### Локальное изображение: чистый base64 в `inlineData`

Если файл находится у вашего приложения, `inlineData` позволяет передать его без отдельной ссылки. Поле `data` содержит base64 исходных байтов, **без префикса `data:image/png;base64,`**. `mimeType` должен соответствовать содержимому. Это форма `Blob` из [справочника Gemini](https://ai.google.dev/api/generate-content).

Следующий скрипт только собирает тело запроса из локального PNG, JPEG или WebP и сохраняет `request.json`. Он не вызывает API. Сохраните его как `build_request.py` и запустите, например, `python3 build_request.py photo.png image/png`:

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

if len(sys.argv) != 3:
    raise SystemExit("Использование: python3 build_request.py IMAGE MIME")

image_path = Path(sys.argv[1])
mime_type = sys.argv[2]
if mime_type not in {"image/png", "image/jpeg", "image/webp"}:
    raise SystemExit("В этом примере допустимы PNG, JPEG и WebP")

raw = image_path.read_bytes()
if not raw:
    raise SystemExit("Файл пуст")

encoded = base64.b64encode(raw).decode("ascii")
body = {
    "contents": [{
        "role": "user",
        "parts": [
            {"text": "Измени фон на светло-серый. Сохрани основной объект."},
            {"inlineData": {"mimeType": mime_type, "data": encoded}},
        ],
    }],
    "generationConfig": {"responseModalities": ["TEXT", "IMAGE"]},
}
Path("request.json").write_text(
    json.dumps(body, ensure_ascii=False), encoding="utf-8"
)
print("Тело запроса сохранено в request.json")
```

Передайте полученный JSON своим существующим клиентом на тот же native endpoint и с той же Pro-моделью. MIME скрипт берёт из аргумента: он не определяет формат файла и не конвертирует изображение. Локальная проверка JSON и обратного декодирования base64 проверяет сборку данных, но не заменяет ответ модели. Сам `request.json` содержит изображение, поэтому храните его с теми же ограничениями доступа, что и исходник.

### Загруженный файл: используйте `uri`, а не `name`

Если приложение уже загружает изображения через Files API, используйте `uri` из ответа загрузки в `fileData.fileUri`, вместе с фактическим MIME. Поле `name`, например `files/…`, служит идентификатором ресурса для операций с File; не собирайте из него адрес для генерации самостоятельно. Поля и состояния описаны в [Files API reference](https://ai.google.dev/api/files).

Проверьте состояние файла: `ACTIVE` допускает использование, `PROCESSING` требует дождаться окончания обработки, а `FAILED` — разобрать ошибку загрузки. Если обработка действительно нужна, ограничьте ожидание и завершайте его при ошибке; бесконечный повтор того же запроса не исправляет файл.

Обычные загрузки Files API хранятся 48 часов. Если сохранённая ссылка перестала работать, проверьте `expirationTime` и наличие файла, затем при необходимости загрузите исходник заново и сохраните новый `uri`. Действующий File ещё не гарантирует поддержку его формата выбранной моделью. [Условия способов передачи файлов](https://ai.google.dev/gemini-api/docs/generate-content/file-input-methods) различают срок хранения, ограничения передачи и модельные ограничения.

## Если ваш вход — GCS object, public URL или Vertex path

![Подписанный HTTPS, регистрация GCS в Gemini Developer и контракт Vertex используют разные сроки и условия доступа к одному объекту](https://blog.laozhang.ai/posts/ru/nano-banana-pro-unsupported-file-uri-type/img/gcs-https-access.webp)

Для объекта в Google Cloud Storage у Gemini Developer API есть отдельная операция `files.register`. Она принимает список GCS URI и возвращает зарегистрированные File-ресурсы; после регистрации для генерации используйте возвращённый `uri`. Файл при этом не копируется. Одно неудачное включение объекта приводит к ошибке всей регистрации. Это описано в [справочнике регистрации файлов](https://ai.google.dev/api/files).

Регистрация — не запрос с одним API-ключом к любому приватному `gs://`. В [руководстве Google](https://ai.google.dev/gemini-api/docs/generate-content/file-input-methods) указаны OAuth-авторизация вызывающего, его необходимые права и доступ служебного агента Gemini к объектам, включая роль Storage Object Viewer в пределах соответствующего bucket. Используйте уже согласованный в вашем проекте доступ; изменение прав хранилища — отдельная административная задача.

Для зарегистрированного GCS срок доступа может составлять до 30 дней на регистрацию. Это другой срок, чем 48 часов обычной загрузки. Подписанная HTTPS-ссылка на тот же объект — ещё один способ передачи с собственным сроком и условиями, а не синоним зарегистрированного File.

Если ваш запрос уже идёт через Vertex AI, проверяйте его собственные hostname, проект, location, модель и авторизацию. Наличие `gs://` в примере Vertex не означает, что его можно без изменений вставить в Gemini Developer API. И наоборот, ради ошибки URI не требуется переносить приложение с native Gemini на Vertex: сначала исправьте выбранный способ получения файла.

## Если вы используете OpenAI-совместимый `image_url`

На совместимом входе Gemini с базовым адресом `/v1beta/openai/` есть документированный пример передачи изображения в `image_url.url` со строкой `data:image/jpeg;base64,…`. Но это **пример понимания изображения**, а не универсальный контракт редактирования Nano Banana Pro через любой Chat Completions клиент. Форма и отдельные методы генерации приведены в [документации совместимости OpenAI](https://ai.google.dev/gemini-api/docs/openai).

Если ваше приложение действительно использует эту ветку, проверьте и форму поля, и поддержку нужного действия вашей моделью. Не удаляйте префикс из `image_url.url` только потому, что он не нужен в native `inlineData.data`. Не вставляйте `fileData` в совместимый запрос. У посредника с похожим интерфейсом могут быть свои методы редактирования и возвращения изображения.

Ответ с описанием исходной картинки доказывает выполнение задачи понимания изображения. Он не доказывает, что Nano Banana Pro исправно отредактировал её. Если требовалось редактирование, проверяйте документированный метод именно этого API и наличие изображения в результате.

## Как проверить исправление и что подозревать дальше

![Проверка исправления ошибки URI: формат запроса, доступность файла и итоговый результат](https://blog.laozhang.ai/posts/ru/nano-banana-pro-unsupported-file-uri-type/img/verify-flow.webp)

Для проверки возьмите небольшое разрешённое изображение с хорошо различимым объектом и простую задачу, например изменить фон, сохранив объект. Оставьте прежние endpoint, модель, клиент и задачу; измените только способ передачи файла. Если сравниваете URL с inline-вариантом, используйте те же исходные байты.

Проверка проходит на трёх уровнях:

1. **Отправленное тело запроса:** нужное поле присутствует, URI является строкой, выражений шаблона нет, MIME верен, inline base64 декодируется в исходные байты.
2. **Ответ API:** прежняя ошибка URI исчезла; если появилась другая ошибка, сохраните её код и детали, а не продолжайте бесконечно повторять запрос.
3. **Результат задачи:** в `generateContent` есть возвращённая часть изображения, оно открывается и содержит ожидаемое изменение. HTTP 200 или один текстовый ответ не завершают проверку. Формат ответа с изображением показан в [официальных примерах редактирования](https://ai.google.dev/gemini-api/docs/image-generation).

Если inline-вариант работает, а ссылка на тот же файл нет, дальше исследуйте доступность и срок URL, условия его получения, а также преобразования клиента. Если прямой клиент работает, а посредник нет, сравните фактически отправленные поля, версии и настройки. Некоторые SDK получают байты по ссылке сами, другие передают URL дальше: успешный вызов одного клиента ещё не доказывает, что сервер смог скачать этот URL.

Не увеличивайте размер файла ради проверки предела. В общей таблице Google для inline и внешних URL указан предел 100 МБ на запрос или передаваемые данные с оговорками по способу, модели и обработке. Он не гарантирует принятие любого 100-МБ изображения Nano Banana Pro. Например, [документация Comfy Router](https://docs.comfy.org/ja/development/comfy-router/models/google/nano-banana-pro/code) отдельно задаёт 20 МБ для inline и 24 часа для подписанной ссылки на сгенерированный результат. Эти правила принадлежат Comfy, а не обычным Google Files. Не смешивайте срок исходной ссылки, загруженного файла и ссылки на готовую картинку.

Если вместо ошибки URI вы получили отказ в доступе, квоту или блокировку генерации, это следующий этап диагностики. Коды и различия API разобраны в статье [об ошибках генерации изображений Gemini](https://blog.laozhang.ai/ru/posts/gemini-image-common-errors-fix). Проверка, описанная здесь, не требует смены ключа, модели на текстовую или открытия приватного bucket.

## Частые вопросы

### Можно ли передать публичный HTTPS URL прямо в native Gemini?

Да, актуальное [руководство передачи файлов](https://ai.google.dev/gemini-api/docs/generate-content/file-input-methods) предусматривает публичные и подписанные HTTPS-ссылки в `file_uri`. Нужны доступность файла, правильный MIME и поддержка выбранной моделью и API; семейство Gemini 2.0 исключено. Ссылка на страницу, которая открылась в вашем браузере после входа, не доказывает доступность изображения для API.

### Почему `data:image/png;base64,…` вызывает ошибку?

Если такая строка попала в native `fileData.fileUri`, выбран неверный способ передачи. Поместите чистый base64 в `inlineData.data` и задайте `mimeType`. В совместимом `image_url.url` data URL документирован для соответствующего сценария понимания изображения. Это разные поля и действия. Их формы приведены в [native reference](https://ai.google.dev/api/generate-content) и [руководстве совместимости](https://ai.google.dev/gemini-api/docs/openai).

### Нужно ли всегда сначала загружать локальное изображение?

Нет. Локальные байты можно отправить через native `inlineData`. Загрузка через Files API нужна, если вы выбираете повторное использование File-ресурса или другой сценарий, для которого она подходит. Непосредственно переданный путь `/tmp/photo.png` не даёт серверу доступа к вашему диску. [Способы передачи Google](https://ai.google.dev/gemini-api/docs/generate-content/file-input-methods) различают inline и загрузку.

### Почему сохранённый URI вчера работал, а сегодня нет?

Проверьте, какой именно URI сохранён. Обычный загруженный File действует 48 часов, зарегистрированный GCS может давать доступ до 30 дней, а срок подписанной HTTPS-ссылки задаётся отдельно. Сверьте действительность ссылки или File и его состояние; не переносите один срок на все способы передачи. Условия приведены в [руководстве Google](https://ai.google.dev/gemini-api/docs/generate-content/file-input-methods).

### Ошибка исчезла, но модель только описала картинку. Исправление завершено?

Для задачи редактирования — нет. Убедитесь, что остались Pro-модель и нужный метод генерации, затем проверьте наличие и содержимое возвращённого изображения. Текстовое описание и картинка с ожидаемым изменением — разные результаты. [Примеры Nano Banana Pro](https://ai.google.dev/gemini-api/docs/image-generation) показывают именно обработку возвращённых частей изображения.

## Источники

Внешние страницы, на которые ссылается это руководство, в порядке упоминания. Последнее обновление: 2026-10-07.

- [руководстве Gemini по передаче файлов](https://ai.google.dev/gemini-api/docs/generate-content/file-input-methods) (ai.google.dev)
- [документации генерации изображений](https://ai.google.dev/gemini-api/docs/image-generation) (ai.google.dev)
- [справочник generateContent](https://ai.google.dev/api/generate-content) (ai.google.dev)
- [материале APIYI](https://help.apiyi.com/ru/nano-banana-pro-unsupported-file-uri-type-error-fix-ru.html) (help.apiyi.com)
- [Files API reference](https://ai.google.dev/api/files) (ai.google.dev)
- [документации совместимости OpenAI](https://ai.google.dev/gemini-api/docs/openai) (ai.google.dev)
- [документация Comfy Router](https://docs.comfy.org/ja/development/comfy-router/models/google/nano-banana-pro/code) (docs.comfy.org)
