Gemini Developer API به شما امکان میدهد به مدلهای Gemini از Google دسترسی داشته باشید و ویژگیهای هوش مصنوعی زایای پیشرفته را در برنامههای Android خود بسازید—ازجمله گپ مکالمهای، تولید تصویر (با Nano Banana)، و تولید نوشتار براساس ورودی نوشتار، تصویر، صدا، و ویدیو.
برای دسترسی به مدلهای Gemini Pro و Flash، میتوانید از Gemini Developer API با Firebase AI Logic استفاده کنید. این پلتفرم به شما امکان میدهد بدون نیاز به روش پرداخت (مانند کارت اعتباری) شروع کنید و یک سطح رایگان سخاوتمندانه ارائه میدهد. وقتی ادغام را با پایگاه کاربر کوچکی اعتبارسنجی کردید، میتوانید با ارتقا دادن به سطح پولی، آن را مقیاسبندی کنید.
شروع کردن
قبلاز اینکه مستقیماً از برنامهتان با Gemini API تعامل داشته باشید، باید ابتدا چند کار انجام دهید، ازجمله آشنایی با پیامواره و همچنین راهاندازی Firebase و برنامهتان برای استفاده از کیت توسعه نرمافزار.
آزمایش کردن با پیاموارهها
آزمایش کردن با پیاموارهها میتواند به شما کمک کند بهترین عبارتبندی، محتوا، و قالب را برای برنامه Android خود پیدا کنید. Google AI Studio یک «محیط توسعه یکپارچه» (IDE) است که میتوانید از آن برای نمونهسازی و طراحی پیاموارهها برای موارد استفاده برنامهتان استفاده کنید.
ایجاد پیاموارههای مؤثر برای مورد استفاده شما شامل آزمایشهای گسترده است، که بخش مهمی از این فرایند است. در اسناد Firebase میتوانید درباره پیاموارهنویسی بیشتر بدانید.
وقتی از پیاموارهتان راضی بودید، روی دکمه <> کلیک کنید تا تکهکدهایی را که میتوانید به کدتان اضافه کنید دریافت کنید.
راهاندازی پروژه Firebase و متصل کردن برنامه به Firebase
وقتی آماده شدید که میانای برنامهسازی کاربردی را از برنامهتان فراخوانی کنید، دستورالعملهای «مرحله ۱» در راهنمای شروع به کار Firebase AI Logic را برای راهاندازی Firebase و فعال کردن میاناهای برنامهسازی کاربردی و سرویسهای لازم دنبال کنید.
افزودن وابستگیهای Gradle
وابستگیهای Gradle زیر را به ماژول برنامهتان اضافه کنید:
کاتلین
dependencies {
// ... other androidx dependencies
// Import the BoM for the Firebase platform
implementation(platform("com.google.firebase:firebase-bom:35.1.0"))
// Add the dependencies for the Firebase AI Logic and App Check libraries
// When using the BoM, you don't specify versions in Firebase library dependencies
implementation("com.google.firebase:firebase-ai")
implementation("com.google.firebase:firebase-appcheck-debug")
}
جاوا
dependencies {
// Import the BoM for the Firebase platform
implementation(platform("com.google.firebase:firebase-bom:35.1.0"))
// Add the dependencies for the Firebase AI Logic and App Check libraries
// When using the BoM, you don't specify versions in Firebase library dependencies
implementation("com.google.firebase:firebase-ai")
implementation("com.google.firebase:firebase-appcheck-debug")
// Required for one-shot operations (to use `ListenableFuture` from Guava Android)
implementation("com.google.guava:guava:31.0.1-android")
// Required for streaming operations (to use `Publisher` from Reactive Streams)
implementation("org.reactivestreams:reactive-streams:1.0.4")
}
پیکربندی ارائهدهنده اشکالزدایی «بررسی برنامه» برای توسعه محلی
از اوایل ژوئیه ۲۰۲۶، بهعنوان بخشی از گردش کار راهاندازی راهنماییشده برای AI Logic در کنسول Firebase، «بررسی برنامه Firebase» بهطور خودکار برای محافظت از Gemini API اعمال میشود. برای توسعه محلی، باید ارائهکننده اشکالزدایی «بررسی برنامه» را پیکربندی کنید تا تصدیق را دور بزنید و درعینحال اجرای «بررسی برنامه» را حفظ کنید.
در ساخت اشکالزدایی، «بررسی برنامه» را برای استفاده از کارخانه ارائهکننده اشکالزدایی پیکربندی کنید:
کاتلین
Firebase.initialize(context = this) Firebase.appCheck.installAppCheckProviderFactory( DebugAppCheckProviderFactory.getInstance(), )جاوا
FirebaseApp.initializeApp(/*context=*/ this); FirebaseAppCheck firebaseAppCheck = FirebaseAppCheck.getInstance(); firebaseAppCheck.installAppCheckProviderFactory( DebugAppCheckProviderFactory.getInstance());دریافت کردن کد اشکالزدایی:
برنامهتان را در شبیهساز یا در دستگاه آزمایشیتان اجرا کنید.
در گزارشهایتان، بهدنبال کد تصدیق اشکالزدایی «بررسی برنامه» بگردید. برای مثال:
D DebugAppCheckProvider: Enter this debug secret into the allow list in the Firebase Console for your project: 123a4567-b89c-12d3-e456-789012345678کد را کپی کنید (برای مثال،
123a4567-b89c-12d3-e456-789012345678).
ثبت کردن کد اشکالزدایی با «بررسی برنامه»:
در کنسول Firebase، به Security (امنیت) > App Check (بررسی برنامه) > Apps (برنامهها) بروید.
برنامهتان را پیدا کنید، روی منوِ سرریز () کلیک کنید، و سپس مدیریت کردن کدهای اشکالزدایی را انتخاب کنید.
دستورالعملهای روی صفحه را برای ثبت کردن کد اشکالزدایی دنبال کنید.
برای جزئیات مربوط به ارائهدهنده اشکالزدایی (ازجمله نحوه دریافت یک توکن اشکالزدایی جدید)، اسناد رسمی «بررسی برنامه» را بررسی کنید.
مقداردهی اولیه مدل زایا
با نمونهسازی GenerativeModel و مشخص کردن نام مدل شروع کنید:
کاتلین
// Start by instantiating a GenerativeModel and specifying the model name: val model = Firebase.ai(backend = GenerativeBackend.googleAI()) .generativeModel("gemini-3.5-flash")
جاوا
GenerativeModel firebaseAI = FirebaseAI.getInstance(GenerativeBackend.googleAI()) .generativeModel("gemini-3.5-flash"); GenerativeModelFutures model = GenerativeModelFutures.from(firebaseAI);
درباره مدلهای دردسترس برای استفاده با Gemini Developer API بیشتر بدانید. همچنین میتوانید درباره پیکربندی پارامترهای مدل بیشتر بدانید.
تعامل با Gemini Developer API از برنامهتان
اکنون که Firebase و برنامهتان را برای استفاده از کیت توسعه نرمافزار راهاندازی کردهاید، آمادهاید تا از برنامهتان با Gemini Developer API تعامل برقرار کنید.
تولید نوشتار
برای تولید پاسخ نوشتاری، generateContent() را با پیاموارهتان فراخوانی کنید.
کاتلین
scope.launch { val response = model.generateContent("Write a story about a magic backpack.") }
جاوا
Content prompt = new Content.Builder() .addText("Write a story about a magic backpack.") .build(); ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt); Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() { @Override public void onSuccess(GenerateContentResponse result) { String resultText = result.getText(); } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }, executor);
تولید کردن نوشتار از تصویر و رسانههای دیگر
همچنین میتوانید از پیاموارهای که شامل نوشتار بهعلاوه تصویر یا رسانه دیگری است، نوشتار تولید کنید. وقتی generateContent() را فراخوانی میکنید، میتوانید رسانه را بهعنوان داده درونخطی ارسال کنید.
برای مثال، برای استفاده از نقشه بیتی، از نوع محتوای image استفاده کنید:
کاتلین
scope.launch { val response = model.generateContent( content { image(bitmap) text("what is the object in the picture?") } ) }
جاوا
Content content = new Content.Builder() .addImage(bitmap) .addText("what is the object in the picture?") .build(); ListenableFuture<GenerateContentResponse> response = model.generateContent(content); Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() { @Override public void onSuccess(GenerateContentResponse result) { String resultText = result.getText(); } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }, executor);
برای ارسال فایل صوتی، از نوع محتوای inlineData استفاده کنید:
کاتلین
scope.launch { val contentResolver = applicationContext.contentResolver contentResolver.openInputStream(audioUri).use { stream -> stream?.let { val bytes = it.readBytes() val prompt = content { inlineData(bytes, "audio/mpeg") // Specify the appropriate audio MIME type text("Transcribe this audio recording.") } val response = model.generateContent(prompt) } } }
جاوا
ContentResolver resolver = applicationContext.getContentResolver(); try (InputStream stream = resolver.openInputStream(audioUri)) { File audioFile = new File(new URI(audioUri.toString())); int audioSize = (int) audioFile.length(); byte[] audioBytes = new byte[audioSize]; if (stream != null) { stream.read(audioBytes, 0, audioBytes.length); stream.close(); // Provide a prompt that includes audio specified earlier and text Content prompt = new Content.Builder() .addInlineData(audioBytes, "audio/mpeg") // Specify the appropriate audio MIME type .addText("Transcribe what's said in this audio recording.") .build(); // To generate text output, call `generateContent` with the prompt ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt); Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() { @Override public void onSuccess(GenerateContentResponse result) { String text = result.getText(); Log.d(TAG, (text == null) ? "" : text); } @Override public void onFailure(Throwable t) { Log.e(TAG, "Failed to generate a response", t); } }, executor); } else { Log.e(TAG, "Error getting input stream for file."); // Handle the error appropriately } } catch (IOException e) { Log.e(TAG, "Failed to read the audio file", e); } catch (URISyntaxException e) { Log.e(TAG, "Invalid audio file", e); }
و برای ارائه فایل ویدیویی، همچنان از نوع محتوای inlineData استفاده کنید:
کاتلین
scope.launch { val contentResolver = applicationContext.contentResolver contentResolver.openInputStream(videoUri).use { stream -> stream?.let { val bytes = it.readBytes() val prompt = content { inlineData(bytes, "video/mp4") // Specify the appropriate video MIME type text("Describe the content of this video") } val response = model.generateContent(prompt) } } }
جاوا
ContentResolver resolver = applicationContext.getContentResolver(); try (InputStream stream = resolver.openInputStream(videoUri)) { File videoFile = new File(new URI(videoUri.toString())); int videoSize = (int) videoFile.length(); byte[] videoBytes = new byte[videoSize]; if (stream != null) { stream.read(videoBytes, 0, videoBytes.length); stream.close(); // Provide a prompt that includes video specified earlier and text Content prompt = new Content.Builder() .addInlineData(videoBytes, "video/mp4") .addText("Describe the content of this video") .build(); // To generate text output, call generateContent with the prompt ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt); Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() { @Override public void onSuccess(GenerateContentResponse result) { String resultText = result.getText(); System.out.println(resultText); } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }, executor); } } catch (IOException e) { e.printStackTrace(); } catch (URISyntaxException e) { e.printStackTrace(); }
بهطور مشابه، میتوانید اسناد PDF (application/pdf) و نوشتار ساده (text/plain) را نیز با ارسال نوع MIME مربوطه بهعنوان پارامتر ارسال کنید.
گپ چندنوبتی
همچنین میتوانید از مکالمههای چندنوبتی پشتیبانی کنید. گپی را با تابع
startChat() مقداردهی اولیه کنید. درصورت تمایل میتوانید سابقه پیام را به مدل ارائه دهید. سپس تابع sendMessage() را برای ارسال پیامهای گپ فراخوانی کنید.
کاتلین
val chat = model.startChat( history = listOf( content(role = "user") { text("Hello, I have 2 dogs in my house.") }, content(role = "model") { text("Great to meet you. What would you like to know?") } ) ) scope.launch { val response = chat.sendMessage("How many paws are in my house?") }
جاوا
Content.Builder userContentBuilder = new Content.Builder(); userContentBuilder.setRole("user"); userContentBuilder.addText("Hello, I have 2 dogs in my house."); Content userContent = userContentBuilder.build(); Content.Builder modelContentBuilder = new Content.Builder(); modelContentBuilder.setRole("model"); modelContentBuilder.addText("Great to meet you. What would you like to know?"); Content modelContent = modelContentBuilder.build(); List<Content> history = Arrays.asList(userContent, modelContent); // Initialize the chat ChatFutures chat = model.startChat(history); // Create a new user message Content.Builder messageBuilder = new Content.Builder(); messageBuilder.setRole("user"); messageBuilder.addText("How many paws are in my house?"); Content message = messageBuilder.build(); // Send the message ListenableFuture<GenerateContentResponse> response = chat.sendMessage(message); Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() { @Override public void onSuccess(GenerateContentResponse result) { String resultText = result.getText(); System.out.println(resultText); } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }, executor);
تولید کردن تصویر در Android با Nano Banana
مدلهای Gemini Image (یا همان مدلهای Nano Banana) میتواند با بهرهگیری از دانش جهانی و استدلال، تصاویر را تولید و ویرایش کند. این مدلها تصاویری مرتبط با بافت تولید میکنند و خروجیهای نوشتاری و تصویری را بهطور یکپارچه ترکیب یا درهمتنیده میکنند. این مدلها همچنین میتوانند با دنبالههای نوشتاری طولانی، تصاویر دقیقی تولید کنند و از ویرایش مکالمهای تصویر با حفظ بافت پشتیبانی میکنند.
این راهنما نحوه استفاده از مدلهای Gemini Image (مدلهای Nano Banana) بااستفاده از Firebase AI Logic SDK برای Android را شرح میدهد. جزئیات بیشتر درباره تولید تصویر با Gemini را در اسناد Firebase پیدا کنید.
مقداردهی اولیه مدل زایا
یک GenerativeModel را نمونهسازی کنید و نام مدل Gemini Image (مانند
gemini-3.1-flash-image) را مشخص کنید. سپس، responseModalities را پیکربندی کنید تا هم
TEXT و هم IMAGE را برای تولید نوشتار و تصاویر درهمتنیده دربرگیرد. اگر
TEXT را مستثنی کنید، مدل فقط تصویر برمیگرداند.
کاتلین
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel( modelName = "gemini-3.1-flash-image", // Configure the model to respond with images (required) and text (optional) generationConfig = generationConfig { responseModalities = listOf( ResponseModality.TEXT, ResponseModality.IMAGE ) } )
جاوا
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI()).generativeModel( "gemini-3.1-flash-image", // Configure the model to respond with text and images (required) new GenerationConfig.Builder() .setResponseModalities(Arrays.asList(ResponseModality.TEXT, ResponseModality.IMAGE)) .build() ); GenerativeModelFutures model = GenerativeModelFutures.from(ai);
تولید کردن تصویر (ورودی فقط نوشتاری)
میتوانید با ارائه پیامواره فقط نوشتاری، به مدل Gemini دستور دهید که تصویر تولید کند:
کاتلین
scope.launch { // Provide a text prompt instructing the model to generate an image val prompt = "A hyper realistic picture of a t-rex with a blue bag pack roaming a pre-historic forest." // To generate image output, call `generateContent` with the text input val generatedImageAsBitmap: Bitmap? = model.generateContent(prompt) .candidates.first().content.parts.filterIsInstance<ImagePart>() .firstOrNull()?.image }
جاوا
// Provide a text prompt instructing the model to generate an image Content prompt = new Content.Builder() .addText("Generate an image of the Eiffel Tower with fireworks in the background.") .build(); // To generate an image, call `generateContent` with the text input ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt); Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() { @Override public void onSuccess(GenerateContentResponse result) { // iterate over all the parts in the first candidate in the result object for (Part part : result.getCandidates().get(0).getContent().getParts()) { if (part instanceof ImagePart) { ImagePart imagePart = (ImagePart) part; // The returned image as a bitmap Bitmap generatedImageAsBitmap = imagePart.getImage(); break; } } } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }, executor);
ویرایش تصاویر (ورودی نوشتار و تصویر)
میتوانید از مدل Gemini بخواهید تصاویر موجود را با ارائه نوشتار و یک یا چند تصویر در پیاموارهتان ویرایش کند:
کاتلین
scope.launch { // Provide a text prompt instructing the model to edit the image val prompt = content { image(bitmap) text("Edit this image to make it look like a cartoon") } // To edit the image, call `generateContent` with the prompt (image and text input) val generatedImageAsBitmap: Bitmap? = model.generateContent(prompt) .candidates.first().content.parts.filterIsInstance<ImagePart>().firstOrNull()?.image // Handle the generated text and image }
جاوا
// Provide an image for the model to edit Bitmap bitmap = BitmapFactory.decodeResource(resources, R.drawable.scones); // Provide a text prompt instructing the model to edit the image Content promptcontent = new Content.Builder() .addImage(bitmap) .addText("Edit this image to make it look like a cartoon") .build(); // To edit the image, call `generateContent` with the prompt (image and text input) ListenableFuture<GenerateContentResponse> response = model.generateContent(promptcontent); Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() { @Override public void onSuccess(GenerateContentResponse result) { // iterate over all the parts in the first candidate in the result object for (Part part : result.getCandidates().get(0).getContent().getParts()) { if (part instanceof ImagePart) { ImagePart imagePart = (ImagePart) part; Bitmap generatedImageAsBitmap = imagePart.getImage(); break; } } } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }, executor);
تکرار و ویرایش کردن تصاویر ازطریق گپ چندنوبتی
برای رویکرد مکالمهای در ویرایش تصویر، میتوانید از گپ چندنوبتی استفاده کنید. این کار امکان ارسال درخواستهای بعدی برای بهبود ویرایشها را بدون نیاز به ارسال مجدد تصویر اصلی فراهم میکند.
ابتدا، گپی را با startChat() مقداردهی اولیه کنید و بهصورت اختیاری سابقه پیام را ارائه دهید. سپس، از sendMessage() برای پیامهای بعدی استفاده کنید:
کاتلین
scope.launch { // Create the initial prompt instructing the model to edit the image val prompt = content { image(bitmap) text("Edit this image to make it look like a cartoon") } // Initialize the chat val chat = model.startChat() // To generate an initial response, send a user message with the image and text prompt var response = chat.sendMessage(prompt) // Inspect the returned image var generatedImageAsBitmap: Bitmap? = response .candidates.first().content.parts.filterIsInstance<ImagePart>().firstOrNull()?.image // Follow up requests do not need to specify the image again response = chat.sendMessage("But make it old-school line drawing style") generatedImageAsBitmap = response .candidates.first().content.parts.filterIsInstance<ImagePart>().firstOrNull()?.image }
جاوا
// Provide an image for the model to edit Bitmap bitmap = BitmapFactory.decodeResource(resources, R.drawable.scones); // Initialize the chat ChatFutures chat = model.startChat(); // Create the initial prompt instructing the model to edit the image Content prompt = new Content.Builder() .setRole("user") .addImage(bitmap) .addText("Edit this image to make it look like a cartoon") .build(); // To generate an initial response, send a user message with the image and text prompt ListenableFuture<GenerateContentResponse> response = chat.sendMessage(prompt); // Extract the image from the initial response ListenableFuture<Bitmap> initialRequest = Futures.transform(response, result -> { for (Part part : result.getCandidates().get(0).getContent().getParts()) { if (part instanceof ImagePart) { ImagePart imagePart = (ImagePart) part; return imagePart.getImage(); } } return null; }, executor); // Follow up requests do not need to specify the image again ListenableFuture<GenerateContentResponse> modelResponseFuture = Futures.transformAsync( initialRequest, generatedImage -> { Content followUpPrompt = new Content.Builder() .addText("But make it old-school line drawing style") .build(); return chat.sendMessage(followUpPrompt); }, executor); // Add a final callback to check the reworked image Futures.addCallback(modelResponseFuture, new FutureCallback<GenerateContentResponse>() { @Override public void onSuccess(GenerateContentResponse result) { for (Part part : result.getCandidates().get(0).getContent().getParts()) { if (part instanceof ImagePart) { ImagePart imagePart = (ImagePart) part; Bitmap generatedImageAsBitmap = imagePart.getImage(); break; } } } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }, executor);
ملاحظات و محدودیتها
به ملاحظات و محدودیتهای زیر توجه کنید:
- قالب برونداد: تصاویر بهصورت PNG با حداکثر ابعاد ۱۰۲۴ پیکسل تولید میشوند.
- انواع ورودی: این مدل از ورودیهای صوتی یا ویدیویی برای تولید تصویر پشتیبانی نمیکند.
- پشتیبانی زبانی: برای بهترین عملکرد، از زبانهای زیر استفاده کنید:
انگلیسی (
en)، اسپانیایی مکزیکی (es-mx)، ژاپنی (ja-jp)، چینی سادهشده (zh-cn)، و هندی (hi-in). - مشکلات تولید:
- تولید تصویر ممکن است همیشه فعال نشود و گاهی اوقات منجر به برونداد فقط نوشتاری شود. سعی کنید صریحاً درخواست برونداد تصویری کنید (برای مثال، «تصویری تولید کن»، «همانطور که پیش میروی تصویر ارائه کن»، «تصویر را بهروز کن»).
- ممکن است مدل در میانههای راه تولید را متوقف کند. دوباره امتحان کنید یا پیامواره دیگری را امتحان کنید.
- مدل ممکن است نوشتار را بهصورت تصویر تولید کند. سعی کنید صریحاً خروجی نوشتاری درخواست کنید (برای مثال، «نوشتار روایی همراه با تصویرسازی تولید کن»).
برای جزئیات بیشتر، به اسناد Firebase مراجعه کنید.
مراحل بعدی
پساز راهاندازی برنامهتان، مراحل بعدی زیر را درنظر بگیرید:
- برنامه نمونه Firebase «شروع سریع Android» و کاتالوگ نمونه هوش مصنوعی Android را در GitHub مرور کنید.
- برنامهتان را برای تولید آماده کنید، ازجمله راهاندازی «بررسی برنامه Firebase» برای محافظت از Gemini API دربرابر سوءاستفاده مشتریان غیرمجاز.
- درباره Firebase AI Logic در اسناد Firebase بیشتر بدانید.