মাল্টিমোডাল অনুরোধে বড় ফাইলগুলি অন্তর্ভুক্ত করুন এবং ফায়ারবেসের জন্য ক্লাউড স্টোরেজ ব্যবহার করে ফাইলগুলি পরিচালনা করুন

শুধুমাত্র আপনার API প্রদানকারী হিসেবে Vertex AI Gemini API ব্যবহার করলেই এটি উপলব্ধ।

Firebase AI Logic SDK ব্যবহার করে আপনার অ্যাপ থেকে Vertex AI Gemini API কল করার সময়, আপনি একটি Gemini মডেলকে ছবি, PDF, ভিডিও এবং অডিওর মতো মাল্টিমোডাল ইনপুটের উপর ভিত্তি করে টেক্সট তৈরি করতে অনুরোধ করতে পারেন।

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

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

  • অনুরোধ ইনপুটে আপনি ফাইলের MIME ধরণ এবং Cloud Storage for Firebase (যা সর্বদা 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-এর জন্য, সর্বাধিক অনুরোধের আকার হল 20 MB। যদি কোনও অনুরোধ খুব বড় হয় তবে আপনি একটি HTTP 413 ত্রুটি পাবেন। যদি কোনও ফাইলের আকার মোট অনুরোধের আকার 20 MB ছাড়িয়ে যায়, তাহলে আপনার মাল্টিমোডাল অনুরোধে ফাইলটি অন্তর্ভুক্ত করতে Cloud Storage for Firebase URL ব্যবহার করুন। তবে, যদি কোনও ফাইল ছোট হয়, তাহলে আপনি প্রায়শই এটি সরাসরি ইনলাইন ডেটা হিসাবে পাস করতে পারেন (তবে মনে রাখবেন যে ইনলাইন ডেটা হিসাবে সরবরাহ করা একটি ফাইল ট্রানজিটে base64-এ এনকোড করা হয়, যা অনুরোধের আকার বৃদ্ধি করে)।

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

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

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

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

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

কোন ধরণের ফাইল এবং URL সমর্থিত?

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

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

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

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

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

  • ফাইলের URL "ব্রাউজার" URL হতে পারে না (উদাহরণস্বরূপ, ইন্টারনেটে পাওয়া কোনও ছবির URL)।

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

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

  • যদি আপনার কাছে দৃঢ় নিয়ম থাকে (জোরালোভাবে সুপারিশ করা হয়) , তাহলে Firebase পরীক্ষা করবে যে সাইন ইন করা ব্যবহারকারী বা ক্লায়েন্টের ফাইলটিতে পর্যাপ্ত অ্যাক্সেস আছে কিনা, প্রদত্ত URL দিয়ে কলটি করার অনুমতি দেওয়ার আগে।

Firebase AI Logic ব্যবহার করে Cloud Storage for Firebase ব্যবহার করুন

শুধুমাত্র আপনার API প্রদানকারী হিসেবে Vertex AI Gemini API ব্যবহার করলেই এটি উপলব্ধ।

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

Cloud Storage for Firebase সেট আপ করার বিস্তারিত নির্দেশাবলী আপনি এর শুরু করার নির্দেশিকাতে পেতে পারেন: iOS+ | Android | Web | Flutter | Unity

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

  1. আপনার Firebase প্রকল্পে Cloud Storage for Firebase তৈরি বা আমদানি করুন।

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

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

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

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

Cloud Storage ডকুমেন্টেশনে, আপনি বাকেটে ফাইল আপলোড করার বিভিন্ন উপায় শিখতে পারবেন। উদাহরণস্বরূপ, আপনি শেষ ব্যবহারকারীর ডিভাইস থেকে স্থানীয় ফাইল আপলোড করতে পারেন, যেমন ক্যামেরা থেকে ছবি এবং ভিডিও। আরও জানুন: iOS+ | অ্যান্ড্রয়েড | ওয়েব | ফ্লাটার | ইউনিটি

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

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

  • Cloud Storage for Firebase : এটি ফাইলের জন্য একটি অনন্য শনাক্তকারী। URL টি gs:// দিয়ে শুরু হওয়া উচিত।

ধাপ ৩ : একটি মাল্টিমোডাল অনুরোধে ফাইলের MIME ধরণ এবং URL অন্তর্ভুক্ত করুন

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

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

বিকল্প ১: স্টোরেজ রেফারেন্স ব্যবহার করে MIME টাইপ এবং URL অন্তর্ভুক্ত করুন

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

যদি আপনি ফাইলটি বাকেটে আপলোড করে থাকেন এবং আপনি অবিলম্বে ফাইলটি (স্টোরেজ রেফারেন্সের মাধ্যমে) অনুরোধে অন্তর্ভুক্ত করতে চান তবে এই বিকল্পটি ব্যবহার করুন। কলটির জন্য MIME টাইপ এবং 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

কোটলিনের জন্য, এই SDK-এর পদ্ধতিগুলি হল সাসপেন্ড ফাংশন এবং এগুলিকে একটি Coroutine স্কোপ থেকে কল করতে হবে।
// 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

জাভার জন্য, এই 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);

ঐক্য

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

কোটলিনের জন্য, এই SDK-এর পদ্ধতিগুলি হল সাসপেন্ড ফাংশন এবং এগুলিকে একটি Coroutine স্কোপ থেকে কল করতে হবে।
// 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

জাভার জন্য, এই 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);

ঐক্য

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