На этой странице описывается, как сделать следующее:
- Настройте свой проект для использования Prompt API
- Введите только текстовый ввод и получите ответ
- Предоставьте входные данные изображения с соответствующим текстовым вводом и получите ответ.
Более подробную информацию о Prompt API см. в справочной документации по Kotlin ( com.google.mlkit.genai.prompt ) и Java ( com.google.mlkit.genai.prompt.java , com.google.mlkit.genai.prompt ).
[Необязательно] Тестовая подсказка с моделью Gemma 3n
 Перед реализацией рекомендуем протестировать подсказку в AI Studio с помощью модели Gemma 3n E4B . Ожидается, что результаты Gemma 3n будут очень похожи на результаты nano-v3 .
Настроить проект
 Добавьте API-интерфейс ML Kit Prompt в качестве зависимости в конфигурацию build.gradle :
implementation("com.google.mlkit:genai-prompt:1.0.0-alpha1")
Реализовать генеративную модель
Чтобы внедрить код в свой проект, выполните следующие действия:
- Создайте объект - generativeModel:- Котлин- // Get a GenerativeModel instance val generativeModel = Generation.getClient()- Ява- // Get a GenerativeModel instance GenerativeModelFutures generativeModelFutures = GenerativeModelFutures .from(Generation.INSTANCE.getClient());
- Проверьте - AVAILABLE,- DOWNLOADABLEили- UNAVAILABLE. Затем загрузите функцию, если она доступна для скачивания:- Котлин- 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 } }- Ява- 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));
Предоставить только текстовый ввод
Котлин
val response = generativeModel.generateContent("Write a 3 sentence story about a magical dog.")
Ява
GenerateContentResponse response = generativeModelFutures.generateContent(
  new GenerateContentRequest.Builder(
    new TextPart("Write a 3 sentence story about a magical dog."))
  .build())
  .get();
В качестве альтернативы можно добавить необязательные параметры:
Котлин
val response = generativeModel.generateContent(
    generateContentRequest(
        TextPart("Write a 3 sentence story about a magical dog."),
    ) {
        // Optional parameters
        temperature = 0.2f
        topK = 10
        candidateCount = 3
    },
)
Ява
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();
Дополнительную информацию о дополнительных параметрах см. в разделе Дополнительные конфигурации .
Обеспечить многомодальный (изображение и текст) ввод
 Объедините изображение и текстовое поле в функции generateContentRequest() , при этом текстовое приглашение должно быть вопросом или командой, относящейся к изображению: 
Котлин
val response = generativeModel.generateContent(
    generateContentRequest(ImagePart(bitmap), TextPart(textPrompt)) {
        // optional parameters
        ...
    },
)
Ява
GenerateContentResponse response = generativeModelFutures.generateContent(
    new GenerateContentRequest.Builder(
        new ImagePart(bitmap),
        new TextPart("textPrompt"))
    // optional parameters
    .build())
.get();
Результат процесса вывода
- Запустите вывод и получите результат. Вы можете дождаться полного результата или транслировать ответ по мере его формирования как для текстовых, так и для мультимодальных запросов. - При этом используется непотоковый вывод, который извлекает весь результат из модели ИИ перед возвратом результата: 
 - Котлин- // 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")- Ява- GenerateContentResponse response = generativeModelFutures.generateContent( new GenerateContentRequest.Builder( new TextPart("Write a 3 sentence story about a magical dog.")) .build()) .get();- В следующих фрагментах приведены примеры использования потокового вывода, который извлекает результат порциями по мере его генерации: 
 - Котлин- // 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 }- Ява- // 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); });
Дополнительную информацию о потоковом и непотоковом выводе см. в разделе Потоковая передача и непотоковая передача .
Оптимизация задержки
 Для оптимизации первого вызова вывода ваше приложение может дополнительно вызвать warmup() . Это загрузит Gemini Nano в память и инициализирует компоненты среды выполнения.
Дополнительные конфигурации
 В рамках каждого GenerateContentRequest вы можете задать следующие необязательные параметры:
-  temperature: контролирует степень случайности выбора токенов.
-  seed: позволяет генерировать стабильные и детерминированные результаты.
-  topK: контролирует случайность и разнообразие результатов.
-  candidateCount: запрашивает количество возвращенных уникальных ответов. Обратите внимание, что точное количество ответов может не совпадать сcandidateCountпоскольку дублирующиеся ответы автоматически удаляются.
-  maxOutputTokens: определяет максимальное количество токенов, которые могут быть сгенерированы в ответе.
 Дополнительные рекомендации по настройке дополнительных конфигураций см. в разделе GenerateContentRequest .
Поддерживаемые функции и ограничения
-  Ввод должен содержать не более 4000 токенов (или примерно 3000 английских слов). Подробнее см. в справочнике countTokens.
- Следует избегать случаев, требующих длинного вывода (более 256 токенов).
- AICore устанавливает квоту вывода для каждого приложения. Подробнее см. в разделе «Квота для каждого приложения» .
-  Для Prompt API проверены следующие языки:- Английский
- корейский
 
Распространенные проблемы с настройкой
API ML Kit GenAI используют приложение Android AICore для доступа к Gemini Nano. Если устройство только что настроено (включая сброс настроек) или приложение AICore только что сброшено (например, для удаления данных, удаления и последующей переустановки), приложению AICore может не хватить времени для завершения инициализации (включая загрузку последних конфигураций с сервера). В результате API ML Kit GenAI могут работать некорректно. Ниже приведены распространённые сообщения об ошибках настройки и способы их устранения:
| Пример сообщения об ошибке | Как обращаться | 
| Произошла ошибка AICore с типом ошибки 4-CONNECTION_ERROR и кодом ошибки 601-BINDING_FAILURE: Службе AICore не удалось выполнить привязку. | Это может произойти, если вы устанавливаете приложение с помощью API GenAI из ML Kit сразу после настройки устройства или если AICore удаляется после установки приложения. Обновление AICore и его переустановка должны исправить проблему. | 
| Произошла ошибка AICore с типом ошибки 3-PREPARATION_ERROR и кодом ошибки 606-FEATURE_NOT_FOUND: Функция ... недоступна. | Это может произойти, если AICore не завершил загрузку последних конфигураций. При подключении устройства к интернету обновление обычно занимает от нескольких минут до нескольких часов. Перезапуск устройства может ускорить обновление. Обратите внимание: если загрузчик устройства разблокирован, вы также увидите эту ошибку — этот API не поддерживает устройства с разблокированными загрузчиками. | 
| Ошибка AICore: тип ошибки 1-DOWNLOAD_ERROR и код ошибки 0-UNKNOWN: Функция ... завершилась неудачей со статусом ошибки 0 и ошибкой esz: UNAVAILABLE: Не удалось разрешить хост ... | Сохраните сетевое подключение, подождите несколько минут и повторите попытку. | 
