SDK клиента Google AI

Клиентский SDK Google AI позволяет вызывать API Gemini и использовать семейство моделей Gemini непосредственно из приложения Android.

Бесплатный уровень позволяет вам бесплатно экспериментировать. Дополнительную информацию о ценах можно найти в руководстве по ценам .

Архитектура интеграции Google AI
Рисунок 1. Архитектура интеграции Google AI.

Начиная

Прежде чем взаимодействовать с API Gemini непосредственно из вашего приложения, вам необходимо сначала сделать несколько вещей, в том числе ознакомиться с подсказками, а также сгенерировать ключ API и настроить приложение для использования SDK.

Экспериментируйте с подсказками

Начните с прототипирования приглашения в Google AI Studio .

Google AI Studio — это IDE для быстрого проектирования и прототипирования. Он позволяет загружать файлы для тестовых подсказок с текстом и изображениями и сохранять подсказки, чтобы вернуться к ним позже.

Создание подсказки, подходящей для вашего случая использования, — это скорее искусство, чем наука, поэтому экспериментирование имеет решающее значение. Подробнее о подсказках можно узнать в официальной документации Google AI .

Google ИИ-студия
Рисунок 2. Google AI Studio.

Чтобы узнать больше о расширенных возможностях Google AI Studio, ознакомьтесь с кратким руководством по Google AI Studio .

Создайте свой ключ API

Убедившись в ответе, нажмите «Получить ключ API», чтобы сгенерировать ключ API Gemini. Ключ будет включен в ваше приложение, что подходит для экспериментов и создания прототипов, но не рекомендуется для производственных сценариев .

Кроме того, чтобы предотвратить фиксацию вашего ключа API в репозитории исходного кода, используйте плагин Secrets gradle .

Добавьте зависимость Gradle

Добавьте в свое приложение зависимость для клиентского SDK Google AI:

Котлин


dependencies {
  [...]
 implementation("com.google.ai.client.generativeai:generativeai:0.7.0")
}

Ява


dependencies {
  [...]
  implementation("com.google.ai.client.generativeai:generativeai:0.7.0")

  // Required to use `ListenableFuture` from Guava Android for one-shot generation
  implementation("com.google.guava:guava:31.0.1-android")

  // Required to use `Publisher` from Reactive Streams for streaming operations
  implementation("org.reactivestreams:reactive-streams:1.0.4")
}

Создайте GenerativeModel

Начните с создания экземпляра GenerativeModel , предоставив следующее:

  • Название модели : gemini-1.5-flash , gemini-1.5-pro или gemini-1.0-pro
  • Ваш ключ API , сгенерированный с помощью Google AI Studio.

При желании вы можете определить параметры модели и указать значения температуры , topK , topP и максимальных выходных токенов .

Вы также можете определить функции безопасности для следующих тем:

  • HARASSMENT
  • HATE_SPEECH
  • SEXUALLY_EXPLICIT
  • DANGEROUS_CONTENT

Котлин


val model = GenerativeModel(
  model = "gemini-1.5-flash-001",
  apiKey = BuildConfig.apikey,
  generationConfig = generationConfig {
    temperature = 0.15f
    topK = 32
    topP = 1f
    maxOutputTokens = 4096
  },
  safetySettings = listOf(
    SafetySetting(HarmCategory.HARASSMENT, BlockThreshold.MEDIUM_AND_ABOVE),
    SafetySetting(HarmCategory.HATE_SPEECH, BlockThreshold.MEDIUM_AND_ABOVE),
    SafetySetting(HarmCategory.SEXUALLY_EXPLICIT, BlockThreshold.MEDIUM_AND_ABOVE),
    SafetySetting(HarmCategory.DANGEROUS_CONTENT, BlockThreshold.MEDIUM_AND_ABOVE),
  )
)

Ява


GenerationConfig.Builder configBuilder = new GenerationConfig.Builder();
configBuilder.temperature = 0.15f;
configBuilder.topK = 32;
configBuilder.topP = 1f;
configBuilder.maxOutputTokens = 4096;

ArrayList<SafetySetting> safetySettings = new ArrayList();
safetySettings.add(new SafetySetting(HarmCategory.HARASSMENT, BlockThreshold.MEDIUM_AND_ABOVE));
safetySettings.add(new SafetySetting(HarmCategory.HATE_SPEECH, BlockThreshold.MEDIUM_AND_ABOVE));
safetySettings.add(new SafetySetting(HarmCategory.SEXUALLY_EXPLICIT, BlockThreshold.MEDIUM_AND_ABOVE));
safetySettings.add(new SafetySetting(HarmCategory.DANGEROUS_CONTENT, BlockThreshold.MEDIUM_AND_ABOVE));

GenerativeModel gm = new GenerativeModel(
    "gemini-1.5-flash-001",
    BuildConfig.apiKey,
    configBuilder.build(),
    safetySettings
);


Используйте клиентский SDK Google AI в своем приложении.

Теперь, когда у вас есть ключ API и вы настроили свое приложение для использования SDK, вы готовы взаимодействовать с API Gemini.

Создать текст

Чтобы сгенерировать текстовый ответ, вызовите generateContent() с приглашением.

Котлин


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

Ява


// In Java, create a GenerativeModelFutures from the GenerativeModel.
// generateContent() returns a ListenableFuture.
// Learn more:
// https://developer.android.com/develop/background-work/background-tasks/asynchronous/listenablefuture

GenerativeModelFutures model = GenerativeModelFutures.from(gm);

Content content = new Content.Builder()
      .addText("Write a story about a green robot.")
      .build();
Executor executor = // ...

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

Обратите внимание, чтоgenerateContent generateContent() — это функция suspend , которая хорошо интегрируется с существующим кодом Kotlin.

Генерация текста из изображений и других медиафайлов

Вы также можете генерировать текст из приглашения, включающего текст, изображения или другие медиафайлы. Когда вы вызываете generateContent() , вы можете передавать медиафайлы как встроенные данные (как показано в примере ниже).

Котлин


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

Ява


Content content = new Content.Builder()
     .addImage(bitmap)
     .addText("What is the object in this picture?")
     .build();

Executor executor = // ...

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

Многоходовой чат

Вы также можете поддерживать многоходовые разговоры. Инициализируйте чат с помощью функции 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();

// (Optional) create message history
Content.Builder modelContentBuilder = new Content.Builder();
modelContentBuilder.setRole("model");
modelContentBuilder.addText("Great to meet you. What would you like to know?");
Content modelContent = userContentBuilder.build();

List<Content> history = Arrays.asList(userContent, modelContent);

// Initialize the chat
ChatFutures chat = model.startChat(history);

Content.Builder userMessageBuilder = new Content.Builder();
userMessageBuilder.setRole("user");
userMessageBuilder.addText("How many paws are in my house?");
Content userMessage = userMessageBuilder.build();

Executor executor = // ...

ListenableFuture<GenerateContentResponse> response = chat.sendMessage(userMessage);

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

Трансляция ответа

Вы можете добиться более быстрого взаимодействия, не дожидаясь получения всего результата от создания модели, а вместо этого используйте потоковую передачу для обработки частичных результатов. Используйте generateContentStream() для потоковой передачи ответа.

Котлин


someScope.launch {
  var outputContent = ""
  
  generativeModel.generateContentStream(inputContent)
    .collect { response ->
      outputContent += response.text
    }
}

Ява


// In Java, the method generateContentStream() returns a Publisher
// from the Reactive Streams library.
// https://www.reactive-streams.org/

Publisher<GenerateContentResponse> streamingResponse =
    model.generateContentStream(content);

StringBuilder outputContent = new StringBuilder();

streamingResponse.subscribe(new Subscriber<GenerateContentResponse>() {
  @Override
  public void onNext(GenerateContentResponse generateContentResponse) {
    String chunk = generateContentResponse.getText();
    outputContent.append(chunk);
  }

    @Override
    public void onComplete() {
        // ...
    }

    @Override
    public void onError(Throwable t) {
        t.printStackTrace();
    }

    @Override
    public void onSubscribe(Subscription s) {
       s.request(Long.MAX_VALUE);  // Request all messages
 }
});

Android-студия

Android Studio предоставляет дополнительные инструменты, которые помогут вам начать работу.

Следующие шаги