Google AI 客户端 SDK

借助 Google AI 客户端 SDK,您可以直接从 Android 应用调用 Gemini API 并使用 Gemini 系列模型。

您可以利用免费层级免费进行实验。如需了解其他价格详情,请参阅价格指南

Google AI 集成架构
图 1. Google AI 集成架构。

使用入门

在直接从应用与 Gemini API 交互之前,您需要先执行一些操作,包括熟悉提示功能、生成 API 密钥,以及设置应用以使用 SDK。

使用提示进行实验

首先,在 Google AI Studio 中对您的问题进行原型设计。

Google AI Studio 是一个用于提示设计和原型设计的 IDE。您可以通过该工具上传文件,以测试包含文本和图片的提示,并保存提示以供日后再访问。

为您的用例创建合适的提示更像是一门艺术,而不是一门科学,因此实验至关重要。如需详细了解提示,请参阅 Google AI 官方文档

Google AI Studio
图 2. Google AI Studio

如需详细了解 Google AI Studio 的高级功能,请参阅 Google AI Studio 快速入门

生成您的 API 密钥

确定问题提示符合您的要求后,点击获取 API 密钥以生成 Gemini API 密钥。该密钥将与您的应用捆绑在一起,这种做法适用于实验和原型设计,但不建议用于生产环境

此外,为防止 API 密钥提交到源代码代码库,请使用 Secrets Gradle 插件

添加 Gradle 依赖项

将 Google AI 客户端 SDK 的依赖项添加到您的应用:

Kotlin

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

Java

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-flashgemini-1.5-progemini-1.0-pro
  • 您使用 Google AI Studio 生成的 API 密钥

您可以视需要定义模型参数,并为温度topKtopP最大输出词元数提供值。

您还可以为以下主题定义安全功能

  • HARASSMENT
  • HATE_SPEECH
  • SEXUALLY_EXPLICIT
  • DANGEROUS_CONTENT

Kotlin

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

Java

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

在应用中使用 Google AI 客户端 SDK

现在,您已获得 API 密钥并将应用设置为使用 SDK,接下来就可以与 Gemini API 互动了。

生成文本

如需生成文本回答,请使用问题调用 generateContent()

Kotlin

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

Java

// 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() 是一个 suspend 函数,可与现有 Kotlin 代码很好地集成。

从图片和其他媒体内容生成文本

您还可以根据包含文字、图片或其他媒体内容的提示生成文字。调用 generateContent() 时,您可以将媒体作为内嵌数据传递(如以下示例所示)。

Kotlin

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

Java

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() 函数发送聊天消息。

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

// (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() 流式传输响应。

Kotlin

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

Java

// 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 Studio

Android Studio 提供了其他工具来帮助您入门。

  • Gemini API 入门模板:此入门模板可帮助您直接从 Android Studio 创建 API 密钥,并生成一个包含使用 Gemini API 所需 Android 依赖项的项目。
  • 生成式 AI 示例:借助此示例,您可以在 Android Studio 中导入适用于 Android 的 Google AI 客户端 SDK 示例应用。

后续步骤