API Gemini pour les développeurs

L'API Gemini Developer vous donne accès aux modèles Gemini de Google, ce qui vous permet d'intégrer des fonctionnalités d'IA générative de pointe à vos applications Android, y compris le chat conversationnel, la génération d'images (avec Nano Banana) et la génération de texte basée sur des entrées de texte, d'image, audio et vidéo.

Pour accéder aux modèles Gemini Pro et Flash, vous pouvez utiliser l'API Gemini Developer avec Firebase AI Logic. Cela vous permet de commencer sans avoir à fournir de mode de paiement (comme une carte de crédit) et vous offre un niveau sans frais généreux. Une fois que vous avez validé votre intégration auprès d'un petit nombre d'utilisateurs, vous pouvez passer au niveau payant pour faire évoluer votre application.

Illustration montrant une application Android utilisant le SDK Firebase pour Android pour envoyer des requêtes au backend Firebase dans le cloud. Les requêtes sont routées vers l'API Gemini Developer, qui peut utiliser les modèles Gemini Pro et Flash.
Figure 1. Architecture d'intégration de Firebase AI Logic pour accéder à l' API Gemini Developer.

Premiers pas

Avant d'interagir avec l'API Gemini directement depuis votre application, vous devez effectuer quelques opérations, y compris vous familiariser avec les requêtes, ainsi que configurer Firebase et votre application pour utiliser le SDK.

Testez des requêtes

Tester des requêtes peut vous aider à trouver la meilleure formulation, le meilleur contenu et le101format pour votre application Android. 0Google AI Studio/1 est un environnement de développement intégré (IDE) que vous pouvez utiliser pour prototyper et concevoir des requêtes101pour les cas d'utilisation de votre application.

La création de requêtes efficaces pour votre cas d'utilisation implique de nombreux tests, ce qui est une partie essentielle du processus. Pour en savoir plus sur les requêtes, consultez la documentation Firebase.

Une fois que vous êtes satisfait de votre requête, cliquez sur le bouton <> pour obtenir des extraits de code que vous pouvez ajouter à votre code.

Configurez un projet Firebase et associez votre application à Firebase

Lorsque vous êtes prêt à appeler l'API depuis votre application, suivez les instructions de "l'étape 1" du guide de démarrage de Firebase AI Logic pour configurer Firebase et activer les API et services requis.

Ajouter les dépendances Gradle

Ajoutez les dépendances Gradle suivantes au module de votre application :

Kotlin

dependencies {
  // ... other androidx dependencies

  // Import the BoM for the Firebase platform
  implementation(platform("com.google.firebase:firebase-bom:34.17.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")
}

Java

dependencies {
  // Import the BoM for the Firebase platform
  implementation(platform("com.google.firebase:34.17.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")
}

Configurer le fournisseur de débogage App Check pour le développement local

À partir de début juillet 2026, dans le cadre du workflow de configuration guidée pour AI Logic dans la console Firebase, Firebase App Check sera automatiquement appliqué pour protéger l'API Gemini. Pour le développement local, vous devez configurer le fournisseur de débogage App Check afin de contourner l'attestation tout en maintenant l'application d'App Check.

  1. Dans votre version de débogage, configurez App Check pour qu'il utilise la fabrique de fournisseurs de débogage :

    Kotlin

    Firebase.initialize(context = this)
    Firebase.appCheck.installAppCheckProviderFactory(
        DebugAppCheckProviderFactory.getInstance(),
    )
    

    Java

    FirebaseApp.initializeApp(/*context=*/ this);
    FirebaseAppCheck firebaseAppCheck = FirebaseAppCheck.getInstance();
    firebaseAppCheck.installAppCheckProviderFactory(
            DebugAppCheckProviderFactory.getInstance());
    
  2. Obtenez votre jeton de débogage :

    1. Exécutez votre application dans l'émulateur ou sur votre appareil de test.

    2. Recherchez le jeton de débogage App Check dans vos journaux. Exemple :

      D DebugAppCheckProvider: Enter this debug secret into the allow list
      in the Firebase Console for your project: 123a4567-b89c-12d3-e456-789012345678
      
    3. Copiez le jeton (par exemple, 123a4567-b89c-12d3-e456-789012345678).

  3. Enregistrez votre jeton de débogage auprès d'App Check :

    1. Dans la console Firebase, accédez à l'onglet Sécurité > App Check > Applications.

    2. Recherchez votre application, cliquez sur le menu à développer (), puis sélectionnez Gérer les jetons de débogage.

    3. Suivez les instructions à l'écran pour enregistrer votre jeton de débogage.

Pour en savoir plus sur le fournisseur de débogage (y compris sur la façon d'obtenir un nouveau jeton de débogage), consultez la documentation officielle d'App Check.

Initialiser le modèle génératif

Commencez par instancier un GenerativeModel et spécifiez le nom du modèle :

Kotlin

// Start by instantiating a GenerativeModel and specifying the model name:
val model = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel("gemini-3.5-flash")

Java

GenerativeModel firebaseAI = FirebaseAI.getInstance(GenerativeBackend.googleAI())
        .generativeModel("gemini-3.5-flash");

GenerativeModelFutures model = GenerativeModelFutures.from(firebaseAI);

En savoir plus sur les modèles disponibles pour une utilisation avec l'API Gemini Developer Vous pouvez également en savoir plus sur la configuration des paramètres du modèle.

Interagir avec l'API Gemini Developer depuis votre application

Maintenant que vous avez configuré Firebase et votre application pour utiliser le SDK, vous êtes prêt à interagir avec l'API Gemini Developer depuis votre application.

Générer du texte

Pour générer une réponse textuelle, appelez generateContent() avec votre requête.

Kotlin

scope.launch {
    val response = model.generateContent("Write a story about a magic backpack.")
}

Java

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

Générer du texte à partir d'images et d'autres contenus multimédias

Vous pouvez également générer du texte à partir d'une requête qui inclut du texte, ainsi que des images ou d'autres contenus multimédias. Lorsque vous appelez generateContent(), vous pouvez transmettre le contenu multimédia en tant que données intégrées.

Par exemple, pour utiliser un bitmap, utilisez le type de contenu image :

Kotlin

scope.launch {
    val response = model.generateContent(
        content {
            image(bitmap)
            text("what is the object in the picture?")
        }
    )
}

Java

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

Pour transmettre un fichier audio, utilisez le type de contenu inlineData :

Kotlin

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)
        }
    }
}

Java

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);
}

Pour fournir un fichier vidéo, continuez à utiliser le type de contenu inlineData :

Kotlin

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)
        }
    }
}

Java

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();
}

De même, vous pouvez également transmettre des documents PDF (application/pdf) et en texte brut (text/plain) en transmettant leur type MIME respectif en tant que paramètre.

Chat multitour

Vous pouvez également prendre en charge les conversations multitours. Initialisez un chat avec la fonction startChat(). Vous pouvez éventuellement fournir à votre modèle un historique des messages. Appelez ensuite la fonction sendMessage() pour envoyer des messages de chat.

Kotlin

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?")
}

Java

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

Générer des images sur Android avec Nano Banana

Les modèles d'image Gemini (également appelés modèles Nano Banana) peuvent générer et modifier des images en s'appuyant sur des connaissances et un raisonnement mondiaux. Ils génèrent des images contextuellement pertinentes, en mélangeant ou en entrelaçant de manière transparente les sorties de texte et d'image. Ils peuvent également générer des visuels précis avec de longues séquences de texte et prendre en charge la retouche d'images conversationnelle tout en conservant le contexte.

Ce guide explique comment utiliser les modèles d'image Gemini (les modèles Nano Banana) à l'aide du SDK Firebase AI Logic pour Android. Pour en savoir plus sur la génération d'images avec Gemini, consultez la documentation Firebase.

Interface Google AI Studio montrant un champ de saisie de texte avec le prompt &quot;Image hyperréaliste d'un T-Rex avec un sac à dos bleu se promenant dans une forêt préhistorique&quot; et une image générée d'un T-Rex dans une forêt avec un sac à dos bleu.
Figure 2. Utilisez Google AI Studio pour affiner vos requêtes de génération d'images Nano Banana pour votre application Android

Initialiser le modèle génératif

Instanciez un GenerativeModel et spécifiez un nom de modèle d'image Gemini (comme gemini-3.1-flash-image). Configurez ensuite responseModalities pour inclure TEXT et IMAGE afin de générer du texte et des images entrelacés. Si vous excluez TEXT, le modèle ne renverra que des images.

Kotlin

val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
    modelName = "gemini-3.5-flash-image-preview",
    // Configure the model to respond with text and images (required)
    generationConfig = generationConfig {
        responseModalities = listOf(
            ResponseModality.TEXT,
            ResponseModality.IMAGE
        )
    }
)

Java

GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI()).generativeModel(
        "gemini-3.5-flash-image-preview",
        // 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);

Générer des images (entrée de texte uniquement)

Vous pouvez demander à un modèle Gemini de générer des images en fournissant une requête de texte uniquement :

Kotlin

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
}

Java

// 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);

Modifier des images (entrée de texte et d'image)

Vous pouvez demander à un modèle Gemini de modifier des images existantes en fournissant à la fois du texte et une ou plusieurs images dans votre requête :

Kotlin

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
}

Java

// 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);

Itérer et modifier des images via un chat multitour

Pour une approche conversationnelle de la retouche d'images, vous pouvez utiliser un chat multitour. Cela permet d'envoyer des requêtes de suivi pour affiner les modifications sans avoir à renvoyer l'image d'origine.

Commencez par initialiser un chat avec startChat(), en fournissant éventuellement un historique des messages. Utilisez ensuite sendMessage() pour les messages suivants :

Kotlin

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
}

Java

// 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);

Remarques et limites

Tenez compte des remarques et limites suivantes :

  • Format de sortie : les images sont générées au format PNG avec une dimension maximale de 1 024 px.
  • Types d'entrée : le modèle n'accepte pas les entrées audio ou vidéo pour la génération d'images.
  • Langues compatibles : pour des performances optimales, utilisez les langues suivantes : anglais (en), espagnol mexicain (es-mx), japonais (ja-jp), chinois simplifié (zh-cn) et hindi (hi-in).
  • Problèmes de génération:
    • La génération d'images ne se déclenche pas toujours, ce qui entraîne parfois une sortie de texte uniquement. Essayez de demander explicitement des sorties d'image (par exemple, "générer une image", "fournir des images au fur et à mesure", "mettre à jour l'image").
    • Le modèle peut arrêter la génération en cours de route. Réessayez ou essayez une autre requête.
    • Le modèle peut générer du texte sous forme d'image. Essayez de demander explicitement des sorties de texte (par exemple, "générer un texte narratif avec des illustrations").

Pour en savoir plus, consultez la documentation de Firebase.

Étapes suivantes

Après avoir configuré votre application, envisagez les étapes suivantes :