From 2635a8d73a4b0ece5827d625427555bfef2a7654 Mon Sep 17 00:00:00 2001 From: Caren Date: Wed, 12 Aug 2026 11:26:29 -0700 Subject: [PATCH 1/3] Add snippets for ML Kit Prompt API --- ai/build.gradle.kts | 2 + .../snippets/ai/MLKitPromptAPISnippets.kt | 70 +++++++++++++++++++ gradle/libs.versions.toml | 4 ++ 3 files changed, 76 insertions(+) create mode 100644 ai/src/main/java/com/example/snippets/ai/MLKitPromptAPISnippets.kt diff --git a/ai/build.gradle.kts b/ai/build.gradle.kts index 852e8efc8..033567742 100644 --- a/ai/build.gradle.kts +++ b/ai/build.gradle.kts @@ -67,6 +67,8 @@ dependencies { implementation(libs.firebase.ai) implementation(libs.firebase.ondevice) implementation(libs.guava.android) + implementation(libs.mlkit.genai.prompt) + ksp(libs.genai.schema.compiler) testImplementation(libs.junit) testImplementation(kotlin("test")) androidTestImplementation(libs.androidx.test.ext.junit) diff --git a/ai/src/main/java/com/example/snippets/ai/MLKitPromptAPISnippets.kt b/ai/src/main/java/com/example/snippets/ai/MLKitPromptAPISnippets.kt new file mode 100644 index 000000000..427a1d8e7 --- /dev/null +++ b/ai/src/main/java/com/example/snippets/ai/MLKitPromptAPISnippets.kt @@ -0,0 +1,70 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.google.mlkit.genai.prompt.GenerateContentRequest +import com.google.mlkit.genai.prompt.Generation +import com.google.mlkit.genai.prompt.TextPart +import com.google.mlkit.genai.prompt.generateTypedContentRequest +import com.google.mlkit.genai.schema.annotations.Generable +import com.google.mlkit.genai.schema.annotations.Guide + +val generativeModel = Generation.getClient() + +fun instantiateModel() { +// [START android_snippets_mlkit_instantiate_model] +// Instantiating model in activity, fragment, or ViewModel + val generativeModel = Generation.getClient() + +// When activity, fragment, or ViewModel is destroyed + generativeModel.close() +// [END android_snippets_mlkit_instantiate_model] +} + +class MLKitPromptAPISnippets { + // [START android_snippets_structured_output_before] + suspend fun parseEmail(email:String): String { + val parseEmailPrompt = "Parse this email and return the sender, title, and short summary of the email less than 10 words: " + + val parsedEmail = generativeModel.generateContent(parseEmailPrompt + email) + + return parsedEmail.candidates[0].text + } + // [END android_snippets_structured_output_before] +} + +// [START android_snippets_structured_output_after] +@Generable +data class ParsedEmail( + @Guide(description = "Sender of the email") + var sender: String = "", + + @Guide(description = "Title of the email") + var title: String = "", + + @Guide(description = "Summary of the email less than 10 words") + var summary: String = "" +) + +suspend fun parseEmail(email: String): ParsedEmail? { + val parseEmailPrompt = + "Parse this email: $email" + + val baseRequest = GenerateContentRequest.Builder(TextPart(parseEmailPrompt)).build() + val typedRequest = generateTypedContentRequest(baseRequest, ParsedEmail::class) + val typedResponse = generativeModel.generateContent(typedRequest) + return typedResponse.candidates[0].response +} +// [END android_snippets_structured_output_after] \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 41fcb2866..4b8ac7c0b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -58,6 +58,7 @@ engageCore = "1.6.0" firebase-ai = "17.15.0" firebase-bom = "34.17.0" firebase-ondevice = "16.0.0-beta03" +genaiSchemaCompiler = "1.0.0-alpha1" glance-wear = "1.0.0-alpha12" glide = "1.0.0-beta10" google-ar-core = "1.54.0" @@ -87,6 +88,7 @@ media3Ui = "1.10.1" # @keep minSdk = "36" mlkit-face-detection = "16.1.7" +mlkit-genai-prompt = "1.0.0-beta4" mockitoKotlin = "5.3.1" okHttp = "5.4.0" playServicesFitness = "21.3.0" @@ -289,6 +291,7 @@ engage-core = { module = "com.google.android.engage:engage-core", version.ref = firebase-ai = { module = "com.google.firebase:firebase-ai", version.ref = "firebase-ai" } firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebase-bom" } firebase-ondevice = { module = "com.google.firebase:firebase-ai-ondevice", version.ref = "firebase-ondevice" } +genai-schema-compiler = { module = "com.google.mlkit:genai-schema-compiler", version.ref = "genaiSchemaCompiler" } glance-appwidget-preview = { module = "androidx.glance:glance-appwidget-preview", version.ref = "androidx-glance-appwidget" } glance-preview = { module = "androidx.glance:glance-preview", version.ref = "androidx-glance-appwidget" } glide-compose = { module = "com.github.bumptech.glide:compose", version.ref = "glide" } @@ -316,6 +319,7 @@ kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-t kotlinx-metadata-jvm = { module = "org.jetbrains.kotlin:kotlin-metadata-jvm", version.ref = "kotlin" } kotlinx-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "kotlinxSerialization" } kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerialization" } +mlkit-genai-prompt = { module = "com.google.mlkit:genai-prompt", version.ref = "mlkit-genai-prompt" } mlkit-face-detection = { module = "com.google.mlkit:face-detection", version.ref = "mlkit-face-detection" } mockito-kotlin = { module = "org.mockito.kotlin:mockito-kotlin", version.ref = "mockitoKotlin" } okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okHttp" } From 99f2f7606ead4cdf888ac26a2060180d81c0d4c9 Mon Sep 17 00:00:00 2001 From: Caren Date: Wed, 12 Aug 2026 13:02:43 -0700 Subject: [PATCH 2/3] Fix missing package --- .../main/java/com/example/snippets/ai/MLKitPromptAPISnippets.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/ai/src/main/java/com/example/snippets/ai/MLKitPromptAPISnippets.kt b/ai/src/main/java/com/example/snippets/ai/MLKitPromptAPISnippets.kt index 427a1d8e7..2f61827d9 100644 --- a/ai/src/main/java/com/example/snippets/ai/MLKitPromptAPISnippets.kt +++ b/ai/src/main/java/com/example/snippets/ai/MLKitPromptAPISnippets.kt @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package com.example.snippets.ai; import com.google.mlkit.genai.prompt.GenerateContentRequest import com.google.mlkit.genai.prompt.Generation From 43241bd7a5e4886af2b1a573eb6b7db5430a6551 Mon Sep 17 00:00:00 2001 From: calren <5016806+calren@users.noreply.github.com> Date: Wed, 12 Aug 2026 20:05:17 +0000 Subject: [PATCH 3/3] Apply Spotless --- .../java/com/example/snippets/ai/MLKitPromptAPISnippets.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ai/src/main/java/com/example/snippets/ai/MLKitPromptAPISnippets.kt b/ai/src/main/java/com/example/snippets/ai/MLKitPromptAPISnippets.kt index 2f61827d9..838dabf67 100644 --- a/ai/src/main/java/com/example/snippets/ai/MLKitPromptAPISnippets.kt +++ b/ai/src/main/java/com/example/snippets/ai/MLKitPromptAPISnippets.kt @@ -13,7 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.example.snippets.ai; + +package com.example.snippets.ai import com.google.mlkit.genai.prompt.GenerateContentRequest import com.google.mlkit.genai.prompt.Generation @@ -36,7 +37,7 @@ fun instantiateModel() { class MLKitPromptAPISnippets { // [START android_snippets_structured_output_before] - suspend fun parseEmail(email:String): String { + suspend fun parseEmail(email: String): String { val parseEmailPrompt = "Parse this email and return the sender, title, and short summary of the email less than 10 words: " val parsedEmail = generativeModel.generateContent(parseEmailPrompt + email) @@ -68,4 +69,4 @@ suspend fun parseEmail(email: String): ParsedEmail? { val typedResponse = generativeModel.generateContent(typedRequest) return typedResponse.candidates[0].response } -// [END android_snippets_structured_output_after] \ No newline at end of file +// [END android_snippets_structured_output_after]