API GenAI Rewriting

Avec l'API de réécriture GenAI de ML Kit, vous pouvez aider automatiquement les utilisateurs à réécrire des messages de chat ou de courts contenus dans un style ou un ton différent.

Les utilisateurs peuvent trouver utile de recevoir des suggestions pour réécrire un contenu dans les cas suivants:

  • Restructurer un message pour le rendre plus professionnel lors de la communication avec les personnes concernées
  • Raccourcir un message pour qu'il soit plus adapté à la publication sur les plates-formes de réseaux sociaux
  • Reformuler un message pour les locuteurs non natifs qui cherchent d'autres moyens de communiquer

Capacités clés

L'API de réécriture GenAI de ML Kit peut réécrire de courts contenus dans l'un des styles suivants:

  • Développer: développe le texte saisi avec plus de détails et un langage descriptif.
  • Emojify (Ajouter des emoji) : ajoute des emoji pertinents au texte saisi, ce qui le rend plus expressif et amusant.
  • Raccourcir: condense le texte saisi en une version plus courte, tout en conservant le message principal.
  • Amical: réécrit le texte saisi pour le rendre plus décontracté et accessible, en utilisant un ton conversationnel.
  • Professionnel: réécrit le texte saisi pour le rendre plus formel et professionnel, en utilisant un ton respectueux.
  • Reformuler: réécrit le texte saisi à l'aide de différents mots et structures de phrases, tout en conservant le sens d'origine.

Les requêtes renvoient au moins une suggestion. Si plusieurs suggestions sont renvoyées, les résultats sont triés par ordre de confiance décroissant.

Exemples de résultats

Entrée Style de réécriture Sortie
Voulez-vous nous rencontrer pour en discuter ? Professionnel Aimeriez-vous nous revoir pour en discuter plus en détail ?
J'aimerais vous inviter à une soirée informelle chez moi le samedi soir prochain. Raccourcir Voulez-vous me rejoindre pour un moment informel chez moi ce samedi soir ?
L'événement a bien été effectué Développer L'événement a été un succès retentissant, dépassant toutes nos attentes et s'avérant être un triomphe retentissant.
Prenons un café bientôt Ajouter des emoji Prenons un café ☕ bientôt 👋.
Fournir le rapport d'ici la fin de la journée Amical Pourriez-vous me le partager d'ici la fin de la journée ?
Hey, j'ai besoin de cette chose dès que possible Professionnel Pourriez-vous fournir le document demandé dans les meilleurs délais ?
Le projet est en retard Reformuler Le calendrier du projet doit être ajusté pour respecter le délai initial

Premiers pas

Pour commencer à utiliser l'API de réécriture GenAI, ajoutez cette dépendance au fichier de compilation de votre projet.

implementation("com.google.mlkit:genai-rewriting:1.0.0-beta1")

Ensuite, instanciez le client Rewriter avec les options requises, vérifiez si les fonctionnalités de modèle sur l'appareil requises sont disponibles (et les téléchargez si nécessaire), préparez votre texte d'entrée en tant que requête, exécutez le processus de réécriture pour obtenir des suggestions et libérez les ressources.

Kotlin

val textToRewrite = "The event was successful"

// Define task with selected input and output format
val rewriterOptions = RewriterOptions.builder(context)
    // OutputType can be one of the following: ELABORATE, EMOJIFY, SHORTEN,
    // FRIENDLY, PROFESSIONAL, REPHRASE
    .setOutputType(RewriterOptions.OutputType.ELABORATE)
    // Refer to RewriterOptions.Language for available languages
    .setLanguage(RewriterOptions.Language.ENGLISH)
    .build()
val rewriter = Rewriting.getClient(rewriterOptions)

suspend fun prepareAndStartRewrite() {
    // Check feature availability, status will be one of the following:
    // UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
    val featureStatus = rewriter.checkFeatureStatus().await()

    if (featureStatus == FeatureStatus.DOWNLOADABLE) {
        // Download feature if necessary.
        // If downloadFeature is not called, the first inference request will
        // also trigger the feature to be downloaded if it's not already
        // downloaded.
        rewriter.downloadFeature(object : DownloadCallback {
            override fun onDownloadStarted(bytesToDownload: Long) { }

            override fun onDownloadFailed(e: GenAiException) { }

            override fun onDownloadProgress(totalBytesDownloaded: Long) {}

            override fun onDownloadCompleted() {
                startRewritingRequest(textToRewrite, rewriter)
            }
        })
    } else if (featureStatus == FeatureStatus.DOWNLOADING) {
        // Inference request will automatically run once feature is
        // downloaded.
        // If Gemini Nano is already downloaded on the device, the
        // feature-specific LoRA adapter model will be downloaded
        // quickly. However, if Gemini Nano is not already downloaded,
        // the download process may take longer.
        startRewritingRequest(textToRewrite, rewriter)
    } else if (featureStatus == FeatureStatus.AVAILABLE) {
        startRewritingRequest(textToRewrite, rewriter)
    }
}

suspend fun startRewritingRequest(text: String, rewriter: Rewriter) {
    // Create task request
    val rewritingRequest = RewritingRequest.builder(text).build()

    // Start rewriting request with non-streaming response
    // More than 1 result may be returned. If multiple suggestions are
    // returned, results will be sorted by descending confidence.
    val rewriteResults =
        rewriter.runInference(rewritingRequest).await().results

    // You can also start a streaming request
    // rewriter.runInference(rewritingRequest) { newText ->
    //    // Show new text in UI
    // }
}

// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
rewriter.close()

Java

String textToRewrite = "The event was successful";

// Define task with required input and output format
RewriterOptions rewriterOptions =
    RewriterOptions.builder(context)
        // OutputType can be one of the following: ELABORATE,
        // EMOJIFY, SHORTEN, FRIENDLY, PROFESSIONAL, REPHRASE
        .setOutputType(RewriterOptions.OutputType.ELABORATE)
        // Refer to RewriterOptions.Language for available
        // languages
        .setLanguage(RewriterOptions.Language.ENGLISH)
        .build();
Rewriter rewriter = Rewriting.getClient(rewriterOptions);

void prepareAndStartRewrite()
    throws ExecutionException, InterruptedException {
    // Check feature availability, status will be one of the
    // following: UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
    try {
        int featureStatus = rewriter.checkFeatureStatus().get();
        if (featureStatus == FeatureStatus.DOWNLOADABLE) {
            // Download feature if necessary.
            // If downloadFeature is not called, the first inference
            // request will also trigger the feature to be downloaded
            // if it's not already downloaded.
            rewriter.downloadFeature(
                new DownloadCallback() {
                    @Override
                    public void onDownloadCompleted() {
                        startRewritingRequest(textToRewrite, rewriter);
                    }

                    @Override
                    public void onDownloadFailed(GenAIException e) {}

                    @Override
                    public void onDownloadProgress(
                        long totalBytesDownloaded) {}

                    @Override
                    public void onDownloadStarted(long bytesDownloaded) {}
                });
        } else if (featureStatus == FeatureStatus.DOWNLOADING) {
            // Inference request will automatically run once feature is
            // downloaded.
            // If Gemini Nano is already downloaded on the device, the
            // feature-specific LoRA adapter model will be downloaded
            // quickly. However, if Gemini Nano is not already downloaded,
            // the download process may take longer.
            startRewritingRequest(textToRewrite, rewriter);
        } else if (featureStatus == FeatureStatus.AVAILABLE) {
            startRewritingRequest(textToRewrite, rewriter);
        }
    } catch (ExecutionException | InterruptedException e) {
        e.printStackTrace();
    }
}

void startRewritingRequest(String text, Rewriter rewriter) {
    // Create task request
    RewritingRequest rewritingRequest =
        RewritingRequest.builder(text).build();

    try {
        // Start rewriting request with non-streaming response
        // More than 1 result may be returned. If multiple
        // suggestions are returned, results will be sorted by
        // descending confidence.
        rewriter.runInference(rewritingRequest).get().getResults();

        // You can also start a streaming request
        // rewriter.runInference(rewritingRequest, newText -> {
        //     // Show new text in UI
        // });
    } catch (ExecutionException | InterruptedException e) {
        e.printStackTrace();
    }
}

// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
rewriter.close();

Fonctionnalités compatibles et limites

L'API GenAI Rewriting est compatible avec les langues suivantes: anglais, coréen, espagnol, français, allemand, italien et japonais. Elles sont définies dans RewriterOptions.Language. La valeur doit comporter moins de 256 jetons.

La disponibilité de la configuration de fonctionnalité spécifique (spécifiée par RewriterOptions) peut varier en fonction de la configuration de l'appareil en question et des modèles téléchargés sur l'appareil.

Le moyen le plus fiable pour les développeurs de s'assurer que la fonctionnalité d'API prévue est compatible avec un appareil avec le RewriterOptions demandé est d'appeler la méthode checkFeatureStatus(). Cette méthode fournit l'état définitif de la disponibilité des fonctionnalités sur l'appareil au moment de l'exécution.

Problèmes de configuration courants

Les API GenAI de ML Kit s'appuient sur l'application Android AICore pour accéder à Gemini Nano. Lorsqu'un appareil vient d'être configuré (y compris réinitialisé) ou que l'application AICore vient d'être réinitialisée (par exemple, en effaçant les données, en désinstallant puis en réinstallant l'application), il est possible qu'elle n'ait pas le temps de terminer l'initialisation (y compris de télécharger les dernières configurations à partir du serveur). Par conséquent, les API ML Kit GenAI risquent de ne pas fonctionner comme prévu. Voici les messages d'erreur de configuration courants que vous pouvez rencontrer et les solutions à appliquer:

Exemple de message d'erreur Comment gérer
Échec d'AICore avec le type d'erreur 4-CONNECTION_ERROR et le code d'erreur 601-BINDING_FAILURE: échec de la liaison du service AICore. Cela peut se produire lorsque vous installez l'application à l'aide des API ML Kit GenAI immédiatement après la configuration de l'appareil ou lorsque AICore est désinstallé après l'installation de votre application. Mettez à jour l'application AICore, puis réinstallez votre application. Le problème devrait être résolu.
Échec d'AICore avec le type d'erreur 3-PREPARATION_ERROR et le code d'erreur 606-FEATURE_NOT_FOUND: la fonctionnalité ... n'est pas disponible. Cela peut se produire lorsque AICore n'a pas terminé de télécharger les dernières configurations. Laissez la connexion réseau active et attendez quelques minutes à quelques heures.

Notez que si le bootloader de l'appareil est déverrouillé, cette erreur s'affiche également. Cette API n'est pas compatible avec les appareils dont le bootloader est déverrouillé.
Échec d'AICore avec le type d'erreur 1-DOWNLOAD_ERROR et le code d'erreur 0-UNKNOWN: la fonctionnalité ... a échoué avec l'état d'échec 0 et l'erreur esz: UNAVAILABLE: Unable to resolve host ... Laissez la connexion réseau active, patientez quelques minutes, puis réessayez.