মাল্টিমোডাল অনুরোধে বড় ফাইল অন্তর্ভুক্ত করা এবং Firebase-এর জন্য Cloud Storage ব্যবহার করে ফাইল ম্যানেজ করা

আপনার API প্রদানকারী হিসেবে Agent Platform Gemini API (formerly Vertex AI) ব্যবহার করলেই শুধুমাত্র উপলভ্য।

Agent Platform Gemini API (formerly Vertex AI) থেকে আপনার অ্যাপে কল করার সময় Firebase AI Logic SDK ব্যবহার করে, আপনি Gemini মডেলকে ছবি, PDF, ভিডিও ও অডিওর মতো মাল্টিমোডাল ইনপুটের উপর ভিত্তি করে টেক্সট জেনারেট করতে প্রম্পট করতে পারেন।

ইনপুটের টেক্সট নয় এমন অংশের (যেমন মিডিয়া ফাইল) জন্য, অনুরোধে ফাইল অন্তর্ভুক্ত করতে আপনি ঐচ্ছিকভাবে Cloud Storage for Firebase ব্যবহার করতে পারেন। মোটামুটিভাবে, এই ফিচার সম্পর্কে আপনার যা জানা প্রয়োজন তা এখানে দেওয়া হল:

  • আপনি Agent Platform Gemini API (formerly Vertex AI) ব্যবহার করলে, যেকোনও মাল্টিমোডাল অনুরোধের (যেমন, টেক্সট জেনারেশন ও চ্যাট, দুটিই) সাথে Cloud Storage for Firebase ব্যবহার করতে পারবেন। এই নির্দেশিকায় দেওয়া উদাহরণ থেকে টেক্সট ও ছবি ইনপুট করার প্রাথমিক ধারণা পাওয়া যায়।

  • আপনি অনুরোধ ইনপুটে ফাইলের MIME ধরন এবং এর Cloud Storage for Firebase URL (যা সবসময় gs:// দিয়ে শুরু হয়) নির্দিষ্ট করেন। এইসব ভ্যালু হল মেটাডেটা যা Cloud Storage বালতিতে আপলোড করা যেকোনও ফাইলে অটোমেটিক অ্যাসাইন করা হয়।

  • আপনাকে কাজ করে এমন ফাইলের ধরন ও URL ব্যবহার করতে হবে।


এই সমাধান নির্দেশিকায় কীভাবে Cloud Storage for Firebase সেট-আপ করতে হয়, আপনার অ্যাপ থেকে Cloud Storage for Firebase বাকেটে ফাইল আপলোড করতে হয় এবং তারপরে Gemini API-কে করা আপনার মাল্টিমোডাল অনুরোধে ফাইলটির MIME টাইপ ও Cloud Storage for Firebase URL অন্তর্ভুক্ত করতে হয় তা বর্ণনা করা হয়েছে।

আপনি কি কোডের উদাহরণ দেখতে চান? অথবা আপনি কি আগে থেকেই Cloud Storage for Firebase সেট-আপ করেছেন এবং আপনার মাল্টিমোডাল অনুরোধের সাথে এটি ব্যবহার করা শুরু করার জন্য প্রস্তুত?

কোডের উদাহরণে যান

আপনার অ্যাপের সাথে Cloud Storage for Firebase কেন ব্যবহার করবেন?

Cloud Storage for Firebase, Google Cloud Storage-এর মতো একই দ্রুত, সুরক্ষিত ও স্কেলেবল ইনফ্রাস্ট্রাকচার ব্যবহার করে, যা ব্লব ও ফাইল স্টোর করতে এবং এর ক্লায়েন্ট SDK বিশেষভাবে মোবাইল ও ওয়েব অ্যাপের জন্য তৈরি করা হয়েছে।

Firebase AI Logic SDK-এর ক্ষেত্রে, সর্বাধিক অনুরোধের সাইজ হল ২০ এমবি। কোনও অনুরোধ খুব বড় হলে, আপনি HTTP 413 সমস্যা দেখতে পাবেন। কোনও ফাইলের সাইজ ২০ এমবির বেশি হলে, আপনার মাল্টিমোডাল অনুরোধে ফাইলটি যোগ করতে Cloud Storage for Firebase URL ব্যবহার করুন। তবে, কোনও ফাইল ছোট হলে, আপনি প্রায়ই এটিকে সরাসরি ইনলাইন ডেটা হিসেবে পাস করতে পারবেন (তবে মনে রাখবেন, ইনলাইন ডেটা হিসেবে দেওয়া ফাইলটি ট্রানজিটে Base64 হিসেবে এনকোড করা হয়, এর ফলে অনুরোধের সাইজ বেড়ে যায়)।

Cloud Storage for Firebase ব্যবহার করার কিছু অতিরিক্ত সুবিধা এখানে দেওয়া হল:

  • আপনি ব্যবহারকারীদের সরাসরি আপনার অ্যাপ থেকে Cloud Storage for Firebase বাকেটে ছবি আপলোড করতে দিতে পারেন এবং তারপরে আপনি ফাইলের MIME টাইপ এবং Cloud Storage for Firebase URL (যা ফাইলের শনাক্তকারী) নির্দিষ্ট করার মাধ্যমে সেইসব ছবিকে আপনার মাল্টিমোডাল প্রম্পটে অন্তর্ভুক্ত করতে পারেন।

  • আপনার এন্ড-ইউজারদের ছবি প্রদান করতে হলে, আপনি তাদের সময় ও ব্যান্ডউইথ বাঁচাতে পারবেন, বিশেষ করে তাদের নেটওয়ার্ক কোয়ালিটি খারাপ বা অনিয়মিত হলে।

    • ফাইল আপলোড বা ডাউনলোড করার সময় বাধা পড়লে, Cloud Storage for Firebase SDK অটোমেটিক সেই জায়গা থেকেই অপারেশন আবার শুরু করে দেয়।
    • আপনার অ্যাপে (যেমন, কোনও নতুন মাল্টিমোডাল অনুরোধে) একই ফাইলের প্রয়োজন হলে, এন্ড-ইউজারকে প্রতিবার একই ফাইল আপলোড করতে হবে না, আপলোড করা একই ফাইল একাধিকবার ব্যবহার করা যাবে।
  • আপনি Firebase Security Rules ব্যবহার করে Cloud Storage for Firebase-এ সেভ করা ফাইলগুলিতে এন্ড-ইউজারের অ্যাক্সেস সীমিত করতে পারবেন, যা শুধুমাত্র কোনও অনুমোদিত ব্যবহারকারীকে ফাইল আপলোড, ডাউনলোড বা মুছে ফেলার অনুমতি দেয়।

  • আপনি Firebase থেকে অথবা Google Cloud, থেকে আপনার বাকেটের ফাইল অ্যাক্সেস করতে পারবেন, যা আপনাকে Google Cloud Storage API ব্যবহার করে ছবি ফিল্টার করা বা ভিডিও ট্রান্সকোডিংয়ের মতো সার্ভার-সাইড প্রসেসিং করার ব্যাপারে নমনীয়তা দেয়।

কোন ধরনের ফাইল ও URL কাজ করে?

আপনি যখন Firebase AI Logic SDK-এর সাথে Cloud Storage for Firebase URL ব্যবহার করতে চান, তখন ফাইল ও URL-এর জন্য এখানে প্রয়োজনীয়তা দেওয়া হল:

  • ফাইলটিকে অবশ্যই মাল্টিমোডাল অনুরোধের জন্য ইনপুট ফাইলের প্রয়োজনীয়তা পূরণ করতে হবে। এর মধ্যে MIME টাইপ ও ফাইলের সাইজের মতো প্রয়োজনীয় বিষয় অন্তর্ভুক্ত।

  • ফাইলটি অবশ্যই Cloud Storage for Firebase বাকেটে স্টোর করতে হবে (এর অর্থ হল, Firebase Security Rules-এর মতো Firebase পরিষেবা এই বাকেট অ্যাক্সেস করতে পারবে)। আপনি যদি Firebase কনসোলে আপনার বাকেট দেখতে পান, তাহলে এটি একটি Cloud Storage for Firebase বাকেট।

  • Cloud Storage for Firebase বাকেটটি অবশ্যই সেই Firebase প্রোজেক্টে থাকতে হবে যেখানে আপনি নিজের অ্যাপ রেজিস্টার করেছেন।

  • ফাইলের Cloud Storage for Firebase URL অবশ্যই gs:// দিয়ে শুরু হতে হবে, এটি হল সেই পদ্ধতি যার মাধ্যমে সব Google Cloud Storage URL তৈরি করা হয়।

  • ফাইলের URL "ব্রাউজার" URL হলে চলবে না (যেমন, ইন্টারনেটে আপনি খুঁজে পেয়েছেন এমন কোনও ছবির URL)।

এছাড়াও, আপনার বাকেটের Firebase Security Rules-কে অবশ্যই ফাইলটিতে উপযুক্ত অ্যাক্সেস দিতে হবে। যেমন:

  • আপনার পাবলিক নিয়ম থাকলে, যেকোনও ব্যবহারকারী বা ক্লায়েন্ট ফাইল অ্যাক্সেস করতে পারবেন।

  • আপনার কাছে শক্তিশালী নিয়ম (খুবই সাজেস্ট করা হয়) থাকলে, Firebase চেক করে দেখবে যে সাইন-ইন করা ব্যবহারকারী বা ক্লায়েন্টের কাছে প্রদান করা URL-এর মাধ্যমে কল করার জন্য পর্যাপ্ত অ্যাক্সেস আছে কিনা।

Firebase AI Logic-এর সাথে Cloud Storage for Firebase URL ব্যবহার করুন

আপনার API প্রদানকারী হিসেবে Agent Platform Gemini API (formerly Vertex AI) ব্যবহার করলেই শুধুমাত্র উপলভ্য।

ধাপ ১: Cloud Storage for Firebase সেট-আপ করুন

Cloud Storage for Firebase সেট-আপ করার বিস্তারিত নির্দেশাবলী আপনি এর 'শুরু করা' গাইড থেকে পেতে পারেন: iOS+ | Android | ওয়েব | Flutter | Unity

আপনাকে যেসব হাই-লেভেল টাস্ক করতে হবে সেগুলি এখানে দেওয়া হল:

  1. আপনার Firebase প্রোজেক্টে Cloud Storage for Firebase বাকেট তৈরি বা ইমপোর্ট করুন।

  2. এই বাকেটে Firebase Security Rules প্রয়োগ করুন। Security Rules অনুমোদিত এন্ড-ইউজারদের অ্যাক্সেস সীমিত করে আপনার ফাইল সুরক্ষিত রাখতে সাহায্য করে।

  3. আপনার অ্যাপে Cloud Storage for Firebase-এর জন্য ক্লায়েন্ট লাইব্রেরি যোগ করুন।

    মনে রাখবেন, আপনি এই টাস্ক এড়িয়ে যেতে পারেন, তবে আপনাকে অবশ্যই সর্বদা আপনার অনুরোধে MIME টাইপ ও URL ভ্যালু স্পষ্টভাবে অন্তর্ভুক্ত করতে হবে।

ধাপ ২: কোনও বাকেটে ফাইল আপলোড করা

Cloud Storage ডকুমেন্টেশনে, আপনি কোনও বাকেটে ফাইল আপলোড করার বিভিন্ন উপায় সম্পর্কে জানতে পারবেন। যেমন, আপনি ব্যবহারকারীর ডিভাইস থেকে লোকাল ফাইল আপলোড করতে পারবেন, যেমন ক্যামেরা থেকে ফটো ও ভিডিও। আরও জানুন: iOS+ | Android | ওয়েব | Flutter | Unity

আপনি কোনও বাকেটে ফাইল আপলোড করলে, Cloud Storage ফাইলটিতে নিম্নলিখিত দুটি তথ্য অটোমেটিক প্রয়োগ করে। আপনাকে অনুরোধে এইসব ভ্যালু যোগ করতে হবে (এই নির্দেশিকার পরবর্তী ধাপে দেখানো হয়েছে)।

  • MIME-এর ধরন: এটি হল ফাইলের মিডিয়ার ধরন (যেমন, image/png)। আপলোড করার সময় আমরা অটোমেটিক MIME-এর ধরন শনাক্ত করার চেষ্টা করব এবং সেই মেটাডেটা, বাকেটের অবজেক্টে প্রয়োগ করব। তবে, আপলোড করার সময় আপনি চাইলে MIME টাইপ উল্লেখ করতে পারেন।

  • Cloud Storage for Firebase URL: এটি ফাইলের অনন্য শনাক্তকারী। URL-এর শুরুতে gs:// থাকতে হবে।

ধাপ ৩: মাল্টিমোডাল অনুরোধে ফাইলের MIME ধরন ও URL যোগ করুন

বাকেটে কোনও ফাইল স্টোর করা হয়ে গেলে, আপনি অনুরোধে সেটির MIME টাইপ ও URL অন্তর্ভুক্ত করতে পারবেন। মনে রাখবেন, এই উদাহরণগুলিতে স্ট্রিম না করা generateContent অনুরোধ দেখানো হয়েছে, তবে আপনি স্ট্রিম ও চ্যাট সহ URL-ও ব্যবহার করতে পারবেন।

অনুরোধে ফাইল যোগ করতে, আপনি নিম্নলিখিত বিকল্পগুলির মধ্যে যেকোনও একটি ব্যবহার করতে পারেন:

বিকল্প ১: স্টোরেজ রেফারেন্স ব্যবহার করে MIME-এর ধরন ও URL যোগ করা

এই উদাহরণটি ব্যবহার করার আগে, নিশ্চিত করুন যে আপনি Firebase AI Logic SDK-এর জন্য শুরু করার নির্দেশিকা সম্পূর্ণ করেছেন।

আপনি যদি এইমাত্র কোনও ফাইল বাকেটে আপলোড করে থাকেন এবং অনুরোধে অবিলম্বে (স্টোরেজ রেফারেন্সের মাধ্যমে) ফাইলটি অন্তর্ভুক্ত করতে চান, তাহলে এই বিকল্পটি ব্যবহার করুন। কলের জন্য MIME-এর ধরন ও Cloud Storage for Firebase URL, দুটিই প্রয়োজন।

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

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).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.");

বিকল্প ২: MIME-এর ধরন ও URL স্পষ্টভাবে উল্লেখ করুন

এই উদাহরণটি ব্যবহার করার আগে, নিশ্চিত করুন যে আপনি Firebase AI Logic SDK-এর জন্য শুরু করার নির্দেশিকা সম্পূর্ণ করেছেন।

আপনি যদি MIME-এর ধরন এবং Cloud Storage for Firebase URL-এর ভ্যালু জানেন এবং আপনি সেগুলি মাল্টিমোডাল অনুরোধে স্পষ্টভাবে অন্তর্ভুক্ত করতে চান, তাহলে এই বিকল্পটি ব্যবহার করুন। কলের জন্য MIME-এর ধরন ও 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

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 = 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.");