En esta página, se describe cómo hacer lo siguiente:
- Configura tu proyecto para usar la API de Prompt
- Proporcionar entrada solo de texto y recibir una respuesta
- Proporcionar una entrada de imagen con una entrada de texto relacionada y recibir una respuesta
Para obtener más detalles sobre la API de Prompt, consulta la documentación de referencia para Kotlin (com.google.mlkit.genai.prompt) y Java (com.google.mlkit.genai.prompt.java, com.google.mlkit.genai.prompt).
[Opcional] Prueba la instrucción con el modelo de Gemma 3n
Antes de la implementación, considera probar tu instrucción en AI Studio con el modelo de Gemma 3n E4B. Se espera que los resultados de Gemma 3n sean muy similares a los de nano-v3.
Configurar proyecto
Agrega la API de ML Kit Prompt como una dependencia en tu configuración de build.gradle:
implementation("com.google.mlkit:genai-prompt:1.0.0-alpha1")
Implementa el modelo generativo
Para implementar el código en tu proyecto, sigue estos pasos:
- Crea un objeto - generativeModel:- Kotlin- // Get a GenerativeModel instance val generativeModel = Generation.getClient()- Java- // Get a GenerativeModel instance GenerativeModelFutures generativeModelFutures = GenerativeModelFutures .from(Generation.INSTANCE.getClient());
- Verifica si Gemini Nano es - AVAILABLE,- DOWNLOADABLEo- UNAVAILABLE. Luego, descarga la función si se puede descargar:- Kotlin- val status = generativeModel.checkStatus() when (status) { FeatureStatus.UNAVAILABLE -> { // Gemini Nano not supported on this device or device hasn't fetched the latest configuration to support it } FeatureStatus.DOWNLOADABLE -> { // Gemini Nano can be downloaded on this device, but is not currently downloaded generativeModel.download().collect { status -> when (status) { is DownloadStatus.DownloadStarted -> Log.d(TAG, "starting download for Gemini Nano") is DownloadStatus.DownloadProgress -> Log.d(TAG, "Nano ${status.totalBytesDownloaded} bytes downloaded") DownloadStatus.DownloadCompleted -> { Log.d(TAG, "Gemini Nano download complete") modelDownloaded = true } is DownloadStatus.DownloadFailed -> { Log.e(TAG, "Nano download failed ${status.e.message}") } } } } FeatureStatus.DOWNLOADING -> { // Gemini Nano currently being downloaded } FeatureStatus.AVAILABLE -> { // Gemini Nano currently downloaded and available to use on this device } }- Java- ListenableFuture<Integer> status = generativeModelFutures.checkStatus(); Futures.addCallback(generativeModelFutures.checkStatus(), new FutureCallback<>() { @Override public void onSuccess(Integer featureStatus) { switch (featureStatus) { case FeatureStatus.AVAILABLE - > { // Gemini Nano currently downloaded and available to use on this device } case FeatureStatus.UNAVAILABLE - > { // Gemini Nano not supported on this device or device hasn't fetched the latest configuration to support it } case FeatureStatus.DOWNLOADING - > { // Gemini Nano currently being downloaded } case FeatureStatus.DOWNLOADABLE - > { generativeModelFutures.download(new DownloadCallback() { @Override public void onDownloadStarted(long l) { Log.d(TAG, "starting download for Gemini Nano"); } @Override public void onDownloadProgress(long l) { Log.d(TAG, "Nano " + l + " bytes downloaded"); } @Override public void onDownloadCompleted() { Log.d(TAG, "Gemini Nano download complete"); } @Override public void onDownloadFailed(@NonNull GenAiException e) { Log.e(TAG, "Nano download failed: " + e.getMessage()); } }); } } } @Override public void onFailure(@NonNull Throwable t) { // Failed to check status } }, ContextCompat.getMainExecutor(context));
Proporciona entrada de solo texto
Kotlin
val response = generativeModel.generateContent("Write a 3 sentence story about a magical dog.")
Java
GenerateContentResponse response = generativeModelFutures.generateContent(
  new GenerateContentRequest.Builder(
    new TextPart("Write a 3 sentence story about a magical dog."))
  .build())
  .get();
También puedes agregar parámetros opcionales:
Kotlin
val response = generativeModel.generateContent(
    generateContentRequest(
        TextPart("Write a 3 sentence story about a magical dog."),
    ) {
        // Optional parameters
        temperature = 0.2f
        topK = 10
        candidateCount = 3
    },
)
Java
GenerateContentRequest.Builder requestBuilder =
        new GenerateContentRequest.Builder(
                new TextPart("Write a 3 sentence story about a magical dog."));
requestBuilder.setTemperature(.2f);
requestBuilder.setTopK(10);
requestBuilder.setCandidateCount(3);
GenerateContentResponse response =
        generativeModelFutures.generateContent(requestBuilder.build()).get();
Para obtener más información sobre los parámetros opcionales, consulta Configuraciones opcionales.
Proporciona entrada multimodal (imagen y texto)
Agrupa una imagen y una entrada de texto en la función generateContentRequest(), con la instrucción de texto como una pregunta o un comando relacionado con la imagen:
Kotlin
val response = generativeModel.generateContent(
    generateContentRequest(ImagePart(bitmap), TextPart(textPrompt)) {
        // optional parameters
        ...
    },
)
Java
GenerateContentResponse response = generativeModelFutures.generateContent(
    new GenerateContentRequest.Builder(
        new ImagePart(bitmap),
        new TextPart("textPrompt"))
    // optional parameters
    .build())
.get();
Procesa el resultado de la inferencia
- Ejecuta la inferencia y recupera el resultado. Puedes esperar el resultado completo o transmitir la respuesta a medida que se genera para los mensajes multimodales y solo de texto. - Esto usa la inferencia sin transmisión, que recupera el resultado completo del modelo de IA antes de devolverlo: 
 - Kotlin- // Call the AI model to generate content and store the complete // in a new variable named 'response' once it's finished val response = generativeModel.generateContent("Write a 3 sentence story about a magical dog")- Java- GenerateContentResponse response = generativeModelFutures.generateContent( new GenerateContentRequest.Builder( new TextPart("Write a 3 sentence story about a magical dog.")) .build()) .get();- Los siguientes fragmentos son ejemplos del uso de la inferencia de transmisión, que recupera el resultado en fragmentos a medida que se genera: 
 - Kotlin- // Streaming inference var fullResponse = "" generativeModel.generateContentStream("Write a 3 sentence story about a magical dog").collect { chunk -> val newChunkReceived = chunk.candidates[0].text print(newChunkReceived) fullResponse += newChunkReceived }- Java- // Streaming inference StringBuilder fullResponse = new StringBuilder(); generativeModelFutures.generateContent(new GenerateContentRequest.Builder( (new TextPart("Write a 3 sentence story about a magical dog"))).build(), chunk -> { Log.d(TAG, chunk); fullResponse.append(chunk); });
Para obtener más información sobre la inferencia de transmisión y la inferencia sin transmisión, consulta Transmisión versus no transmisión.
Optimización de latencia
Para optimizar la primera llamada de inferencia, tu aplicación puede llamar a warmup() de forma opcional. Esto carga Gemini Nano en la memoria y, luego, inicializa los componentes del tiempo de ejecución.
Configuración opcional
Como parte de cada GenerateContentRequest, puedes establecer los siguientes parámetros opcionales:
- temperature: Controla el grado de aleatoriedad en la selección de tokens.
- seed: Permite generar resultados estables y determinísticos.
- topK: Controla la aleatorización y la diversidad en los resultados.
- candidateCount: Solicita la cantidad de respuestas únicas que se devolvieron. Ten en cuenta que la cantidad exacta de respuestas puede no ser la misma que- candidateCount, ya que las respuestas duplicadas se quitan automáticamente.
- maxOutputTokens: Define la cantidad máxima de tokens que se pueden generar en la respuesta.
Para obtener más orientación sobre cómo establecer configuraciones opcionales, consulta GenerateContentRequest.
Funciones admitidas y limitaciones
- La entrada debe tener menos de 4,000 tokens (o aproximadamente 3,000 palabras en inglés). Para obtener más información, consulta la referencia de countTokens.
- Se deben evitar los casos de uso que requieren una respuesta larga (más de 256 tokens).
- AICore aplica una cuota de inferencia por app. Para obtener más información, consulta Cuota por aplicación.
- Se validaron los siguientes idiomas para la API de Prompt:
- Inglés
- Coreano
 
Problemas comunes de configuración
Las APIs de IA generativa de ML Kit dependen de la app de AICore de Android para acceder a Gemini Nano. Cuando se configura un dispositivo (incluido el restablecimiento) o se restablece la app de AICore (p.ej., se borran los datos, se desinstala y se vuelve a instalar), es posible que la app de AICore no tenga tiempo suficiente para finalizar la inicialización (incluida la descarga de las configuraciones más recientes del servidor). Como resultado, es posible que las APIs de IA generativa de ML Kit no funcionen según lo esperado. Estos son los mensajes de error de configuración comunes que puedes ver y cómo controlarlos:
| Ejemplo de mensaje de error | Cómo manejarla | 
| AICore falló con el tipo de error 4-CONNECTION_ERROR y el código de error 601-BINDING_FAILURE: No se pudo vincular el servicio de AICore. | Esto podría ocurrir cuando instalas la app con las APIs de IA generativa de ML Kit inmediatamente después de configurar el dispositivo o cuando se desinstala AICore después de instalar la app. Actualizar la app de AICore y, luego, reinstalar tu app debería solucionar el problema. | 
| AICore falló con el tipo de error 3-PREPARATION_ERROR y el código de error 606-FEATURE_NOT_FOUND: La función … no está disponible. | Esto podría suceder cuando AICore no haya terminado de descargar los parámetros de configuración más recientes. Cuando el dispositivo está conectado a Internet, la actualización suele tardar entre unos minutos y unas horas. Reiniciar el dispositivo puede acelerar la actualización. Ten en cuenta que, si el bootloader del dispositivo está desbloqueado, también verás este error, ya que la API no admite dispositivos con bootloaders desbloqueados. | 
| AICore falló con el tipo de error 1-DOWNLOAD_ERROR y el código de error 0-UNKNOWN: La función … falló con el estado de falla 0 y el error esz: UNAVAILABLE: No se pudo resolver el host … | Mantén la conexión de red, espera unos minutos y vuelve a intentarlo. | 
