Включайте большие файлы в мультимодальные запросы и управляйте файлами с помощью Cloud Storage for Firebase.

Доступно только при использовании API Vertex AI Gemini в качестве поставщика API.

При вызове API Vertex AI Gemini из вашего приложения с использованием SDK Firebase AI Logic вы можете попросить модель Gemini сгенерировать текст на основе мультимодальных входных данных, таких как изображения, PDF-файлы, видео и аудио.

Для нетекстовых частей входных данных (например, медиафайлов) вы можете дополнительно использовать Cloud Storage for Firebase для включения файлов в запрос. Вкратце, вот что вам нужно знать об этой функции:

  • Вы можете использовать Cloud Storage for Firebase с любыми многомодальными запросами (например, для генерации текста и чата), если используете API Vertex AI Gemini . Примеры в этом руководстве демонстрируют базовый ввод текста и изображений.

  • В запросе вы указываете MIME-тип файла и его URL-адрес Cloud Storage for Firebase (который всегда начинается с gs:// ). Эти значения представляют собой метаданные, автоматически присваиваемые любому файлу, загруженному в корзину Cloud Storage .

  • Необходимо использовать поддерживаемый тип файла и URL-адрес .


В этом руководстве описано, как настроить Cloud Storage for Firebase , загрузить файл в корзину Cloud Storage for Firebase из вашего приложения, а затем включить MIME-тип файла и URL-адрес Cloud Storage for Firebase в ваш многомодальный запрос к API Gemini .

Хотите посмотреть примеры кода? Или вы уже настроили Cloud Storage for Firebase и готовы начать использовать его для мультимодальных запросов?

Перейти к примерам кода

Почему стоит использовать Cloud Storage for Firebase для вашего приложения?

Cloud Storage for Firebase использует ту же быструю, безопасную и масштабируемую инфраструктуру, что и Google Cloud Storage для хранения больших двоичных объектов и файлов, а его клиентские SDK специально разработаны для мобильных и веб-приложений.

Для SDK Firebase AI Logic максимальный размер запроса составляет 20 МБ. Если запрос слишком большой, вы получите ошибку HTTP 413. Если размер файла превысит 20 МБ, используйте URL-адрес Cloud Storage for Firebase чтобы включить файл в многомодальный запрос. Однако, если файл небольшой, его часто можно передать напрямую в виде встроенных данных (обратите внимание, что файл, предоставленный в виде встроенных данных, кодируется в base64 во время передачи, что увеличивает размер запроса).

Вот ещё несколько преимуществ использования Cloud Storage for Firebase :

  • Вы можете разрешить конечным пользователям загружать изображения непосредственно из вашего приложения в хранилище Cloud Storage for Firebase , а затем включать эти изображения в ваши мультимодальные запросы, просто указав MIME-тип файла и URL-адрес Cloud Storage for Firebase (который является идентификатором файла).

  • Вы можете сэкономить время и трафик конечных пользователей, если им необходимо предоставить изображения, особенно при плохом или нестабильном качестве сети.

    • Если загрузка или скачивание файла прерывается, SDK Cloud Storage for Firebase автоматически возобновляет операцию с того места, где она была прервана.
    • Один и тот же загруженный файл можно использовать несколько раз, и конечному пользователю не придется загружать его каждый раз, когда он понадобится в вашем приложении (например, в новом мультимодальном запросе).
  • Вы можете ограничить доступ конечных пользователей к файлам, хранящимся в Cloud Storage for Firebase с помощью Firebase Security Rules , которые разрешают загрузку, скачивание или удаление файлов только авторизованным пользователям.

  • Вы можете получить доступ к файлам в своем хранилище через Firebase или Google Cloud , что дает вам возможность выполнять обработку на стороне сервера, например, фильтрацию изображений или перекодирование видео, используя API Google Cloud Storage .

Какие типы файлов и URL-адресов поддерживаются?

Ниже приведены требования к файлам и URL-адресам, необходимые для использования Cloud Storage for Firebase URLs с SDK Firebase AI Logic :

  • Файл должен соответствовать требованиям к входным файлам для многомодальных запросов . Это включает в себя такие требования, как MIME-тип и размер файла.

  • Файл должен храниться в корзине Cloud Storage for Firebase (это означает, что корзина доступна для сервисов Firebase, таких как Firebase Security Rules ). Если вы можете просмотреть свою корзину в консоли Firebase , значит, это корзина Cloud Storage for Firebase .

  • Корзина Cloud Storage for Firebase должна находиться в том же проекте Firebase, в котором вы зарегистрировали свое приложение.

  • URL-адрес Cloud Storage for Firebase в файле должен начинаться с gs:// , именно так формируются все URL-адреса Google Cloud Storage .

  • URL-адрес файла не может быть URL-адресом браузера (например, URL-адресом изображения, найденного в интернете).

Кроме того, Firebase Security Rules для вашего хранилища должны разрешать соответствующий доступ к файлу. Например:

  • Если у вас есть общедоступные правила , то любой пользователь или клиент может получить доступ к файлу.

  • Если у вас есть надёжные правила (настоятельно рекомендуется) , Firebase проверит, имеет ли авторизованный пользователь или клиент достаточный доступ к файлу, прежде чем разрешить выполнение вызова с указанным URL-адресом.

Используйте Cloud Storage for Firebase с помощью Firebase AI Logic.

Доступно только при использовании API Vertex AI Gemini в качестве поставщика API.

Шаг 1 : Настройка Cloud Storage for Firebase

Подробные инструкции по настройке Cloud Storage for Firebase вы найдете в руководстве по началу работы: iOS+ | Android | Web | Flutter | Unity

Вот основные задачи, которые вам предстоит выполнить:

  1. Создайте или импортируйте Cloud Storage for Firebase в свой проект Firebase.

  2. Примените Firebase Security Rules к этому сегменту. Rules помогают защитить ваши файлы, ограничивая доступ только авторизованным конечным пользователям.

  3. Добавьте клиентскую библиотеку Cloud Storage for Firebase в свое приложение.

    Обратите внимание, что вы можете пропустить этот шаг, но в этом случае вам всегда необходимо явно указывать MIME-тип и значение URL в ваших запросах .

Шаг 2 : Загрузите файл в хранилище (bucket).

В документации Cloud Storage вы можете узнать обо всех различных способах загрузки файлов в хранилище. Например, вы можете загружать локальные файлы с устройства конечного пользователя, такие как фотографии и видео с камеры. Подробнее: iOS+ | Android | Web | Flutter | Unity

При загрузке файла в хранилище Cloud Storage автоматически добавляет к нему следующие два параметра. Вам необходимо указать эти значения в запросе (как показано на следующем шаге этого руководства).

  • MIME-тип : Это тип носителя файла (например, image/png ). Мы автоматически попытаемся определить MIME-тип во время загрузки и применим эти метаданные к объекту в хранилище. Однако вы можете указать MIME-тип во время загрузки по желанию.

  • URL-адрес Cloud Storage for Firebase : это уникальный идентификатор файла. URL-адрес должен начинаться с gs:// .

Шаг 3 : Включите MIME-тип файла и URL-адрес в многомодальный запрос.

После того как файл будет сохранен в хранилище, вы можете указать его MIME-тип и URL-адрес в запросе. Обратите внимание, что в этих примерах показан запрос generateContent без потоковой передачи, но вы также можете использовать URL-адреса с потоковой передачей и чатом.

Для включения файла в запрос можно использовать один из следующих вариантов:

Вариант 1: Укажите MIME-тип и URL-адрес, используя ссылку на хранилище.

Прежде чем попробовать этот пример, убедитесь, что вы ознакомились с руководством по началу работы с SDK Firebase AI Logic .

Используйте этот параметр, если вы только что загрузили файл в хранилище и хотите немедленно включить его (через ссылку на хранилище) в запрос. Для вызова требуется указать как MIME-тип, так и URL-адрес Cloud Storage for Firebase .

Быстрый

// Upload an image file using Cloud Storage for Firebase.
let storageRef = Storage.storage().reference(withPath: "images/image.jpg")
guard let imageURL = Bundle.main.url(forResource: "image", withExtension: "jpg") else {
  fatalError("File 'image.jpg' not found in main bundle.")
}
let metadata = try await storageRef.putFileAsync(from: imageURL)

// Get the MIME type and Cloud Storage for Firebase URL.
guard let mimeType = metadata.contentType else {
  fatalError("The MIME type of the uploaded image is nil.")
}
// Construct a URL in the required format.
let storageURL = "gs://\(storageRef.bucket)/\(storageRef.fullPath)"

let prompt = "What's in this picture?"
// Construct the imagePart with the MIME type and the URL.
let imagePart = FileDataPart(uri: storageURL, mimeType: mimeType)

// To generate text output, call generateContent with the prompt and the imagePart.
let result = try await model.generateContent(prompt, imagePart)
if let text = result.text {
  print(text)
}

Kotlin

В Kotlin методы в этом SDK являются функциями приостановки и должны вызываться из области видимости сопрограммы .
// Upload an image file using Cloud Storage for Firebase.
val storageRef = Firebase.storage.reference.child("images/image.jpg")
val fileUri = Uri.fromFile(File("image.jpg"))
try {
    val taskSnapshot = storageRef.putFile(fileUri).await()
    // Get the MIME type and Cloud Storage for Firebase file path.
    val mimeType = taskSnapshot.metadata?.contentType
    val bucket = taskSnapshot.metadata?.bucket
    val filePath = taskSnapshot.metadata?.path

    if (mimeType != null && bucket != null) {
        // Construct a URL in the required format.
        val storageUrl = "gs://$bucket/$filePath"
        // Construct a prompt that includes text, the MIME type, and the URL.
        val prompt = content {
            fileData(mimeType = mimeType, uri = storageUrl)
            text("What's in this picture?")
        }
        // To generate text output, call generateContent with the prompt.
        val response = model.generateContent(prompt)
        println(response.text)
    }
} catch (e: StorageException) {
    // An error occurred while uploading the file.
} catch (e: GoogleGenerativeAIException) {
    // An error occurred while generating text.
}

Java

В Java методы этого SDK возвращают объект ListenableFuture .
// Upload an image file using Cloud Storage for Firebase.
StorageReference storage = FirebaseStorage.getInstance().getReference("images/image.jpg");
Uri fileUri = Uri.fromFile(new File("images/image.jpg"));

storage.putFile(fileUri).addOnSuccessLis>tener(taskSnapshot - {
    // Get the MIME type and Cloud Storage for Firebase file path.
    String mimeType = taskSnapshot.getMetadata().getContentType();
    String bucket = taskSnapshot.getMetadata().getBucket();
    String filePath = taskSnapshot.getMetadata().getPath();

    i&&f (mimeType != null  bucket != null) {
        // Construct a URL in the required format.
        String storageUrl = "gs://" + bucket + "/" + filePath;
        // Create a prompt that includes text, the MIME type, and the URL.
        Content prompt = new Content.Builder()
                .addFileData(storageUrl, mimeType)
                .addText("What's in this picture?")
                .build();

        // To generate text output, call generateContent with the prompt.
        GenerativeModelFutures modelFutures = Genera<tiveModelFutures.from(m>odel);
        ListenableFutureGenerateContentResponse response = modelFutures.generateContent(prompt);
  <>      Futures.addCallback(response, new FutureCallback() {
            @Override
            public void onSuccess(GenerateContentResponse result) {
                String resultText = result.getText();
                System.out.println(resultText);
            }

            @Override
            public void onFailure(@NonNull Throwable t) {
                t.printStackTrace();
            }
 >       }, executor);
    }
}).addOnFailureListener(e - {
    // An error occurred while uploading the file.
    e.printStackTrace();
});

Web

// Upload an image file using Cloud Storage for Firebase.
const storageRef = ref(storage, "image.jpg");
const uploadResult = await uploadBytes(storageRef, file);

// Get the MIME type and Cloud Storage for Firebase URL.
// toString() is the simplest way to construct the Cloud Storage for Firebase URL
// in the required format.
const mimeType = uploadResult.metadata.contentType;
const storageUrl = uploadResult.ref.toString();

// Construct the imagePart with the MIME type and the URL.
const imagePart = { fileData: { mimeType, fileUri: storageUrl }};

// To generate text output, call generateContent with the prompt and imagePart.
const result = await model.generateContent([prompt, imagePart]);
console.log(result.response.text());

Dart

// Upload an image file using Cloud Storage for Firebase.
final storageRef = FirebaseStorage.instance.ref();
final imageRef = storageRef.child("images/image.jpg");
await imageRef.putData(data);

// Get the MIME type and Cloud Storage for Firebase file path.
final metadata = await imageRef.getMetadata();
final mimeType = metadata.contentType;
final bucket = imageRef.bucket;
final fullPath = imageRef.fullPath;

final prompt = TextPart("What's in the picture?");
// Construct a URL in the required format.
final storageUrl = 'gs://$bucket/$fullPath';
// Construct the filePart with the MIME type and the URL.
final filePart = FileData(mimeType, storageUrl);
// To generate text output, call generateContent with the text and the filePart.
final response = await model.generateContent([
  Content.multi([prompt, filePart])
]);
print(response.text);

Единство

var storageRef = FirebaseStorage.DefaultInstance.GetReference("images/image.jpg");
var metadata = await storageRef.PutFileAsync(filePathToJpg);

// Get the MIME type and Cloud Storage for Firebase URL.
var mimeType = metadata.ContentType;
// Construct a URL in the required format.
var storageURL = new Uri($"gs://{storageRef.Bucket}/{storageRef.Path}");

var prompt = ModelContent.Text("What's in this picture?");
// Construct a FileData that explicitly includes the MIME type and
// Cloud Storage for Firebase URL values.
var fileData = ModelContent.FileData(mimeType, storageURL);

// To generate text output, call GenerateContentAsync with the prompt and fileData.
var response = await model.GenerateContentAsync(new [] { prompt, fileData });
UnityEngine.Debug.Log(response.Text ?? "No text in response.");

Вариант 2: Укажите MIME-тип и URL-адрес явно.

Прежде чем попробовать этот пример, убедитесь, что вы ознакомились с руководством по началу работы с SDK Firebase AI Logic .

Используйте этот параметр, если вам известны значения MIME-типа и URL-адреса Cloud Storage for Firebase , и вы хотите явно включить их в многомодальный запрос. Для вызова требуются как MIME-тип, так и URL-адрес.

Быстрый

let prompt = "What's in this picture?"
// Construct an imagePart that explicitly includes the MIME type and
// Cloud Storage for Firebase URL values.
let imagePart = FileDataPart(uri: "gs://bucket-name/path/image.jpg", mimeType: "image/jpeg")

// To generate text output, call generateContent with the prompt and imagePart.
let result = try await model.generateContent(prompt, imagePart)
if let text = result.text {
  print(text)
}

Kotlin

В Kotlin методы в этом SDK являются функциями приостановки и должны вызываться из области видимости сопрограммы .
// Construct a prompt that explicitly includes the MIME type and Cloud Storage for Firebase URL values.
val prompt = content {
    fileData(mimeType = "image/jpeg", uri = "gs://bucket-name/path/image.jpg")
    text("What's in this picture?")
}
// To generate text output, call generateContent with the prompt.
val response = model.generateContent(prompt)
println(response.text)

Java

В Java методы этого SDK возвращают объект ListenableFuture .
// Construct a prompt that explicitly includes the MIME type and Cloud Storage for Firebase URL values.
Content prompt = new Content.Builder()
        .addFilePart("gs://bucket-name/path/image.jpg", "image/jpeg")
        .addText("What's in this picture?")
        .build();

// To generate text output, call generateContent with the prompt
GenerativeModelFutures modelFutures = GenerativeModelFut<ures.from(model);
Liste>nableFutureGenerateContentResponse response = modelFutures.generateContent(prompt);
Futures.addCal<>lback(response, new FutureCallback() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
        System.out.println(resultText);
    }

    @Override
    public void onFailure(@NonNull Throwable t) {
        t.printStackTrace();
    }
}, executor);

Web

const prompt = "What's in this picture?";
// Construct an imagePart that explicitly includes the MIME type and Cloud Storage for Firebase URL values.
const imagePart = { fileData: { mimeType: "image/jpeg", fileUri: "gs://bucket-name/path/image.jpg" }};

// To generate text output, call generateContent with the prompt and imagePart.
const result = await model.generateContent([prompt, imagePart]);
console.log(result.response.text());

Dart

final prompt = TextPart("What's in the picture?");
// Construct a filePart that explicitly includes the MIME type and Cloud Storage for Firebase URL values.
final filePart = FileData('image/jpeg', 'gs://bucket-name/path/image.jpg'),
// To generate text output, call generateContent with the prompt and filePart.
final response = await model.generateContent([
  Content.multi([prompt, filePart])
]);
print(response.text);

Единство

var prompt = ModelContent.Text("What's in this picture?");
// Construct a FileData that explicitly includes the MIME type and
// Cloud Storage for Firebase URL values.
var fileData = ModelContent.FileData(
  mimeType: "image/jpeg",
  uri: new Uri("gs://bucket-name/path/image.jpg")
);

// To generate text output, call GenerateContentAsync with the prompt and fileData.
var response = await model.GenerateContentAsync(new [] { prompt, fileData });
UnityEngine.Debug.Log(response.Text ?? "No text in response.");