| Dostępne tylko wtedy, gdy jako dostawcę interfejsu API używasz Agent Platform Gemini API (formerly Vertex AI). |
Podczas wywoływania Agent Platform Gemini API (formerly Vertex AI) z aplikacji za pomocą pakietu SDK Firebase AI Logic możesz poprosić model Gemini o wygenerowanie tekstu na podstawie danych wejściowych w różnych formatach, takich jak obrazy, pliki PDF, filmy i dźwięk.
W przypadku części wejściowych, które nie są tekstem (np. plików multimedialnych), możesz opcjonalnie użyć znaku Cloud Storage for Firebase, aby dołączyć pliki do żądania. Oto najważniejsze informacje o tej funkcji:
Możesz używać Cloud Storage for Firebase w przypadku dowolnego żądania multimodalnego (np. generowania tekstu i czatu), jeśli korzystasz z Agent Platform Gemini API (formerly Vertex AI). Przykłady w tym przewodniku pokazują podstawowe dane wejściowe w postaci tekstu i obrazu.
W danych wejściowych żądania określasz typ MIME pliku i jego Cloud Storage for Firebase adres URL (który zawsze zaczyna się od
gs://). Te wartości to metadane automatycznie przypisywane do każdego pliku przesłanego do zasobnika Cloud Storage.Musisz użyć obsługiwanego typu pliku i adresu URL.
Z tego przewodnika dowiesz się, jak skonfigurować Cloud Storage for Firebase, przesłać plik do zasobnika Cloud Storage for Firebase z aplikacji, a następnie uwzględnić typ MIME pliku i jego adres URL Cloud Storage for Firebase w żądaniu multimodalnym wysyłanym do Gemini API.
Chcesz zobaczyć przykłady kodu? A może masz już skonfigurowany Cloud Storage for Firebase i chcesz zacząć używać go w przypadku zapytań multimodalnych?
Dlaczego warto korzystać z Cloud Storage for Firebase w aplikacji?
Cloud Storage for Firebase korzysta z tej samej szybkiej, bezpiecznej i skalowalnej infrastruktury co Google Cloud Storage do przechowywania obiektów binarnych i plików, a jego pakiety SDK klienta są specjalnie zaprojektowane z myślą o aplikacjach mobilnych i internetowych.
W przypadku pakietów SDK Firebase AI Logic maksymalny rozmiar żądania wynosi 20 MB. Jeśli żądanie jest zbyt duże, otrzymasz błąd HTTP 413. Jeśli rozmiar pliku spowoduje, że łączny rozmiar żądania przekroczy 20 MB, użyj adresu URL Cloud Storage for Firebase, aby uwzględnić plik w żądaniu multimodalnym. Jeśli jednak plik jest mały, możesz go często przekazać bezpośrednio jako dane wbudowane (pamiętaj jednak, że plik przekazywany jako dane wbudowane jest kodowany w formacie base64 w trakcie przesyłania, co zwiększa rozmiar żądania).
Oto dodatkowe korzyści z używania Cloud Storage for Firebase:
Użytkownicy mogą przesyłać obrazy bezpośrednio z Twojej aplikacji do Cloud Storage for Firebasezasobnika, a następnie możesz uwzględniać te obrazy w promptach multimodalnych, podając tylko typ MIME pliku i Cloud Storage for Firebaseadres URL (który jest identyfikatorem pliku).
Możesz zaoszczędzić czas i przepustowość użytkowników, którzy muszą przesyłać obrazy, zwłaszcza jeśli mają słabe lub niestabilne połączenie sieciowe.
- Jeśli przesyłanie lub pobieranie pliku zostanie przerwane, Cloud Storage for Firebasepakiety SDK automatycznie wznowią operację w miejscu, w którym została przerwana.
- Ten sam przesłany plik może być używany wielokrotnie bez konieczności ponownego przesyłania go przez użytkownika za każdym razem, gdy jest potrzebny w aplikacji (np. w nowym żądaniu multimodalnym).
Możesz ograniczyć dostęp użytkowników do plików przechowywanych w usłudze Cloud Storage for Firebase, korzystając z Firebase Security Rules, które umożliwiają tylko autoryzowanemu użytkownikowi przesyłanie, pobieranie i usuwanie plików.
Dostęp do plików w zasobniku możesz uzyskać z Firebase lub z Google Cloud, co daje Ci elastyczność w zakresie przetwarzania po stronie serwera, np. filtrowania obrazów lub transkodowania filmów za pomocą interfejsów API Google Cloud Storage.
Jakie typy plików i adresów URL są obsługiwane?
Oto wymagania dotyczące plików i adresów URL, gdy chcesz używać Cloud Storage for Firebaseadresów URL z pakietami Firebase AI Logic SDK:
Plik musi spełniać wymagania dotyczące plików wejściowych w przypadku żądań multimodalnych. Obejmuje to wymagania dotyczące typu MIME i rozmiaru pliku.
Plik musi być przechowywany w zasobniku Cloud Storage for Firebase (co oznacza, że zasobnik jest dostępny dla usług Firebase, takich jak Firebase Security Rules). Jeśli możesz wyświetlić zasobnik w Firebase konsoli, oznacza to, że jest to zasobnik Cloud Storage for Firebase.
Zasobnik Cloud Storage for Firebase musi znajdować się w tym samym projekcie w Firebase, w którym zarejestrowano aplikację.
Adres URL pliku Cloud Storage for Firebase musi zaczynać się od
gs://, czyli tak, jak wszystkie adresy URL Google Cloud Storage.Adres URL pliku nie może być adresem URL „przeglądarki” (np. adresem URL obrazu znalezionego w internecie).
Firebase Security Rules zasobnika musi też umożliwiać odpowiedni dostęp do pliku. Przykład:
Jeśli masz reguły publiczne, każdy użytkownik lub klient może uzyskać dostęp do pliku.
Jeśli masz zaawansowane reguły (zdecydowanie zalecane), Firebase sprawdzi, czy zalogowany użytkownik lub klient ma wystarczający dostęp do pliku, zanim zezwoli na wykonanie połączenia z podanym adresem URL.
Używanie adresów URL Cloud Storage for Firebase w przypadku Firebase AI Logic
| Dostępne tylko wtedy, gdy jako dostawcę interfejsu API używasz Agent Platform Gemini API (formerly Vertex AI). |
Krok 1. Skonfiguruj Cloud Storage for Firebase
Szczegółowe instrukcje konfigurowania Cloud Storage for Firebase znajdziesz w przewodniku dla początkujących:iOS+ | Android | Web | Flutter | Unity
Oto ogólne zadania, które musisz wykonać:
Utwórz lub zaimportuj Cloud Storage for Firebase zasobnik w projekcie Firebase.
Zastosuj Firebase Security Rules do tego zasobnika. Security Rules pomagać w zabezpieczaniu plików przez ograniczanie dostępu do nich tylko do autoryzowanych użytkowników.
Dodaj do aplikacji bibliotekę klienta Cloud Storage for Firebase.
Pamiętaj, że możesz pominąć to zadanie, ale wtedy musisz zawsze jawnie uwzględniać w swoich żądaniach typ MIME i wartości adresu URL.
Krok 2. Prześlij plik do zasobnika
W Cloud Storagedokumentacji znajdziesz wszystkie sposoby przesyłania plików do zasobnika. Możesz na przykład przesyłać lokalne pliki z urządzenia użytkownika, takie jak zdjęcia i filmy z aparatu. Więcej informacji:iOS+ | Android | internet | Flutter | Unity
Gdy przesyłasz plik do zasobnika, Cloud Storage automatycznie stosuje do niego te 2 informacje: Musisz uwzględnić te wartości w żądaniu (jak pokazano w następnym kroku tego przewodnika).
Typ MIME: typ pliku (np.
image/png). Podczas przesyłania automatycznie wykrywamy typ MIME i stosujemy te metadane do obiektu w zasobniku. Podczas przesyłania możesz jednak opcjonalnie określić typ MIME.Cloud Storage for Firebase URL: unikalny identyfikator pliku. Adres URL musi zaczynać się od
gs://.
Krok 3. W żądaniu multimodalnym podaj typ MIME i adres URL pliku.
Gdy plik jest przechowywany w zasobniku, możesz w żądaniu podać jego typ MIME i adres URL. Pamiętaj, że w tych przykładach pokazano żądanie generateContent
bez strumieniowania, ale możesz też używać adresów URL ze strumieniowaniem i czatem.
Aby dołączyć plik do prośby, możesz użyć jednej z tych opcji:
Opcja 1. Dołącz typ MIME i adres URL za pomocą odwołania do usługi Storage
Opcja 2. Jawne podanie typu MIME i adresu URL
Opcja 1. Uwzględnij typ MIME i adres URL za pomocą odwołania do usługi Storage
| Zanim wypróbujesz ten przykład, zapoznaj się z przewodnikiem dla początkujących dotyczącym pakietów Firebase AI Logic SDK. |
Użyj tej opcji, jeśli plik został właśnie przesłany do zasobnika i chcesz go od razu uwzględnić w żądaniu (za pomocą odwołania do Storage). Wywołanie wymaga zarówno typu MIME, jak i adresu URL Cloud Storage for Firebase.
Swift
// 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
W przypadku języka Kotlin metody w tym pakiecie SDK są funkcjami zawieszania i muszą być wywoływane w zakresie współprogramu.// 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
W przypadku języka Java metody w tym pakiecie SDK zwracają wartość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).addOnSuccessListener(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();
if (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 = GenerativeModelFutures.from(model);
ListenableFuture<GenerateContentResponse> 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);
Unity
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.");
Opcja 2. Jawne podanie typu MIME i adresu URL
| Zanim wypróbujesz ten przykład, zapoznaj się z przewodnikiem dla początkujących dotyczącym pakietów Firebase AI Logic SDK. |
Użyj tej opcji, jeśli znasz wartości typu MIME i Cloud Storage for Firebase adresu URL i chcesz je wyraźnie uwzględnić w żądaniu multimodalnym. Wywołanie wymaga zarówno typu MIME, jak i adresu URL.
Swift
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
W przypadku języka Kotlin metody w tym pakiecie SDK są funkcjami zawieszania i muszą być wywoływane w zakresie współprogramu.// 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
W przypadku języka Java metody w tym pakiecie SDK zwracają wartość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 = GenerativeModelFutures.from(model);
ListenableFuture<GenerateContentResponse> 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);
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);
Unity
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.");