From eb5c72102a203d22baac86ed4b7210f6ac9c0d4c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 May 2023 20:13:51 -0700 Subject: [PATCH] - fix image rendering #2 - fix figure rendering #2 - fix figure rendering - remove GIFs - fix figure names - revise readme - add default input configurations - improve documentations and code quanlity - add ipynb link for generating tflite models - add tflite generative ai example PiperOrigin-RevId: 530782147 --- lite/examples/generative_ai/android/README.md | 131 +++ .../android/app/build.gradle.kts | 102 +++ .../generative_ai/android/app/download.gradle | 7 + .../generative_ai/android/app/libs/.gitignore | 1 + .../android/app/libs/build_aar/README.md | 16 + .../android/app/libs/build_aar/build_aar.sh | 28 + .../app/libs/build_aar/tftext-2.12.patch | 61 ++ .../android/app/proguard-rules.pro | 21 + .../android/app/src/main/AndroidManifest.xml | 28 + .../app/src/main/ic_launcher-playstore.png | Bin 0 -> 24646 bytes .../google/tensorflowdemo/DemoApplication.kt | 46 + .../data/autocomplete/AutoCompleteService.kt | 301 +++++++ .../com/google/tensorflowdemo/di/appModule.kt | 36 + .../tensorflowdemo/di/viewmodelModule.kt | 25 + .../google/tensorflowdemo/ui/MainActivity.kt | 105 +++ .../tensorflowdemo/ui/components/HeaderBar.kt | 84 ++ .../autocomplete/AutoCompleteScreen.kt | 285 ++++++ .../autocomplete/AutoCompleteViewModel.kt | 265 ++++++ .../components/AutoCompleteInfo.kt | 57 ++ .../components/AutoCompleteTextField.kt | 132 +++ .../autocomplete/components/TextControlBar.kt | 225 +++++ .../components/WindowSizeSelection.kt | 105 +++ .../google/tensorflowdemo/ui/theme/Color.kt | 31 + .../google/tensorflowdemo/ui/theme/Shape.kt | 26 + .../google/tensorflowdemo/ui/theme/Theme.kt | 43 + .../google/tensorflowdemo/ui/theme/Type.kt | 51 ++ .../google/tensorflowdemo/util/StringExt.kt | 64 ++ .../main/res/drawable/header_background.xml | 812 ++++++++++++++++++ .../res/drawable/ic_launcher_background.xml | 24 + .../res/drawable/ic_launcher_foreground.xml | 49 ++ .../app/src/main/res/font/roboto_bold.ttf | Bin 0 -> 167336 bytes .../app/src/main/res/font/roboto_regular.ttf | Bin 0 -> 168260 bytes .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2551 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4618 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1620 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2829 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3427 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6552 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 5358 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10464 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 7376 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 14938 bytes .../res/values/ic_launcher_background.xml | 4 + .../app/src/main/res/values/strings.xml | 25 + .../app/src/main/res/values/themes.xml | 5 + .../app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 + .../tensorflowdemo/util/StringExtKtTest.kt | 59 ++ .../generative_ai/android/build.gradle.kts | 15 + .../generative_ai/android/figures/fig1.gif | Bin 0 -> 451830 bytes .../generative_ai/android/figures/fig2.gif | Bin 0 -> 1063175 bytes .../generative_ai/android/gradle.properties | 21 + .../android/gradle/libs.versions.toml | 32 + .../gradle/wrapper/gradle-wrapper.properties | 6 + lite/examples/generative_ai/android/gradlew | 185 ++++ .../generative_ai/android/gradlew.bat | 89 ++ .../generative_ai/android/how-to-build.md | 22 + .../generative_ai/android/ml/README.md | 1 + .../generative_ai/android/settings.gradle.kts | 27 + 61 files changed, 3694 insertions(+) create mode 100644 lite/examples/generative_ai/android/README.md create mode 100644 lite/examples/generative_ai/android/app/build.gradle.kts create mode 100644 lite/examples/generative_ai/android/app/download.gradle create mode 100644 lite/examples/generative_ai/android/app/libs/.gitignore create mode 100644 lite/examples/generative_ai/android/app/libs/build_aar/README.md create mode 100755 lite/examples/generative_ai/android/app/libs/build_aar/build_aar.sh create mode 100644 lite/examples/generative_ai/android/app/libs/build_aar/tftext-2.12.patch create mode 100644 lite/examples/generative_ai/android/app/proguard-rules.pro create mode 100644 lite/examples/generative_ai/android/app/src/main/AndroidManifest.xml create mode 100644 lite/examples/generative_ai/android/app/src/main/ic_launcher-playstore.png create mode 100644 lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/DemoApplication.kt create mode 100644 lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/data/autocomplete/AutoCompleteService.kt create mode 100644 lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/di/appModule.kt create mode 100644 lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/di/viewmodelModule.kt create mode 100644 lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/MainActivity.kt create mode 100644 lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/components/HeaderBar.kt create mode 100644 lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/AutoCompleteScreen.kt create mode 100644 lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/AutoCompleteViewModel.kt create mode 100644 lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/components/AutoCompleteInfo.kt create mode 100644 lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/components/AutoCompleteTextField.kt create mode 100644 lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/components/TextControlBar.kt create mode 100644 lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/components/WindowSizeSelection.kt create mode 100644 lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/theme/Color.kt create mode 100644 lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/theme/Shape.kt create mode 100644 lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/theme/Theme.kt create mode 100644 lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/theme/Type.kt create mode 100644 lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/util/StringExt.kt create mode 100644 lite/examples/generative_ai/android/app/src/main/res/drawable/header_background.xml create mode 100644 lite/examples/generative_ai/android/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 lite/examples/generative_ai/android/app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 lite/examples/generative_ai/android/app/src/main/res/font/roboto_bold.ttf create mode 100644 lite/examples/generative_ai/android/app/src/main/res/font/roboto_regular.ttf create mode 100644 lite/examples/generative_ai/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 lite/examples/generative_ai/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 lite/examples/generative_ai/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 lite/examples/generative_ai/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 lite/examples/generative_ai/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 lite/examples/generative_ai/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 lite/examples/generative_ai/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 lite/examples/generative_ai/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 lite/examples/generative_ai/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 lite/examples/generative_ai/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 lite/examples/generative_ai/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 lite/examples/generative_ai/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 lite/examples/generative_ai/android/app/src/main/res/values/ic_launcher_background.xml create mode 100644 lite/examples/generative_ai/android/app/src/main/res/values/strings.xml create mode 100644 lite/examples/generative_ai/android/app/src/main/res/values/themes.xml create mode 100644 lite/examples/generative_ai/android/app/src/main/res/xml/backup_rules.xml create mode 100644 lite/examples/generative_ai/android/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 lite/examples/generative_ai/android/app/src/test/java/com/google/tensorflowdemo/util/StringExtKtTest.kt create mode 100644 lite/examples/generative_ai/android/build.gradle.kts create mode 100644 lite/examples/generative_ai/android/figures/fig1.gif create mode 100644 lite/examples/generative_ai/android/figures/fig2.gif create mode 100644 lite/examples/generative_ai/android/gradle.properties create mode 100644 lite/examples/generative_ai/android/gradle/libs.versions.toml create mode 100644 lite/examples/generative_ai/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 lite/examples/generative_ai/android/gradlew create mode 100644 lite/examples/generative_ai/android/gradlew.bat create mode 100644 lite/examples/generative_ai/android/how-to-build.md create mode 100644 lite/examples/generative_ai/android/ml/README.md create mode 100644 lite/examples/generative_ai/android/settings.gradle.kts diff --git a/lite/examples/generative_ai/android/README.md b/lite/examples/generative_ai/android/README.md new file mode 100644 index 00000000000..116280eef87 --- /dev/null +++ b/lite/examples/generative_ai/android/README.md @@ -0,0 +1,131 @@ +# Generative AI + +## Introduction +Large language models (LLMs) are types of machine learning models that are created based on large bodies of text data to generate various outputs for natural language processing (NLP) tasks, including text generation, question answering, and machine translation. They are based on Transformer architecture and are trained on massive amounts of text data, often involving billions of words. Even LLMs of a smaller scale, such as GPT-2, can perform impressively. Converting TensorFlow models to a lighter, faster, and low-power model allows for us to run generative AI models on-device, with benefits of better user security because data will never leave your device. + + This example shows you how to build an Android app with TensorFlow Lite to run a Keras LLM and provides suggestions for model optimization using quantizing techniques, which otherwise would require a much larger amount of memory and greater computational power to run. + +This example open sourced an Android app framework that any compatible TFLite LLMs can plug into. Here are two demos: +* In Figure 1, we used a Keras GPT-2 model to perform text completion tasks on device. +* In Figure 2, we converted a version of instruction-tuned [PaLM model](https://ai.googleblog.com/2022/04/pathways-language-model-palm-scaling-to.html) (1.5 billion parameters) to TFLite and executed through TFLite runtime. + +

+ +

+Figure 1: Example of running the Keras GPT-2 model (converted from this Codelab) on device to perform text completion on Pixel 7. Demo shows the real latency with no speedup. +

+ +

+Figure 2: Example of running a version of [PaLM model](https://ai.googleblog.com/2022/04/pathways-language-model-palm-scaling-to.html) with 1.5 billion parameters. Demo is recorded on Pixel 7 Pro without playback speedup. + + +## Guides +### Step 1. Train a language model using Keras + +For this demonstration, we will use KerasNLP to get the GPT-2 model. KerasNLP is a library that contains state-of-the-art pretrained models for natural language processing tasks, and can support users through their entire development cycle. You can see the list of models available in the [KerasNLP repository](https://github.com/keras-team/keras-nlp/tree/master/keras_nlp/models). The workflows are built from modular components that have state-of-the-art preset weights and architectures when used out-of-the-box and are easily customizable when more control is needed. Creating the GPT-2 model can be done with the following steps: + +```python +gpt2_tokenizer = keras_nlp.models.GPT2Tokenizer.from_preset("gpt2_base_en") + +gpt2_preprocessor = keras_nlp.models.GPT2CausalLMPreprocessor.from_preset( + "gpt2_base_en", + sequence_length=256, + add_end_token=True, +) + +gpt2_lm = keras_nlp.models.GPT2CausalLM.from_preset( + "gpt2_base_en", + preprocessor=gpt2_preprocessor, +) +``` + +You can check out the full GPT-2 model implementation [on GitHub](https://github.com/keras-team/keras-nlp/tree/master/keras_nlp/models/gpt2). + + +### Step 2. Convert a Keras model to a TFLite model + +Start with the `generate()` function from GPT2CausalLM that performs the conversion. Wrap the `generate()` function to create a concrete TensorFlow function: + +```python +@tf.function +def generate(prompt, max_length): + # prompt: input prompt to the LLM in string format + # max_length: the max length of the generated tokens + return gpt2_lm.generate(prompt, max_length) +concrete_func = generate.get_concrete_function(tf.TensorSpec([], tf.string), 100) +``` + +Now define a helper function that will run inference with an input and a TFLite model. TensorFlow text ops are not built-in ops in the TFLite runtime, so you will need to add these custom ops in order for the interpreter to make inference on this model. This helper function accepts an input and a function that performs the conversion, namely the `generator()` function defined above. + +```python +def run_inference(input, generate_tflite): + interp = interpreter.InterpreterWithCustomOps( + model_content=generate_tflite, + custom_op_registerers=tf_text.tflite_registrar.SELECT_TFTEXT_OPS) + interp.get_signature_list() + + generator = interp.get_signature_runner('serving_default') + output = generator(prompt=np.array([input])) +``` + +You can convert the model now: + +```python +gpt2_lm.jit_compile = False +converter = tf.lite.TFLiteConverter.from_concrete_functions( + [concrete_func], + gpt2_lm) + +converter.target_spec.supported_ops = [ + tf.lite.OpsSet.TFLITE_BUILTINS, # enable TFLite ops + tf.lite.OpsSet.SELECT_TF_OPS, # enable TF ops +] +converter.allow_custom_ops = True +converter.target_spec.experimental_select_user_tf_ops = [ + "UnsortedSegmentJoin", + "UpperBound" +] +converter._experimental_guarantee_all_funcs_one_use = True +generate_tflite = converter.convert() +run_inference("I'm enjoying a", generate_tflite) +``` + +### Step 3. Quantization +TensorFlow Lite has implemented an optimization technique called quantization which can reduce model size and accelerate inference. Through the quantization process, 32-bit floats are mapped to smaller 8-bit integers, therefore reducing the model size by a factor of 4 for more efficient execution on modern hardwares. There are several ways to do quantization in TensorFlow. You can visit the [TFLite Model optimization](https://www.tensorflow.org/lite/performance/model_optimization) and [TensorFlow Model Optimization Toolkit](https://www.tensorflow.org/model_optimization) pages for more information. The types of quantizations are explained briefly below. + +Here, you will use the post-training dynamic range quantization on the GPT-2 model by setting the converter optimization flag to tf.lite.Optimize.DEFAULT, and the rest of the conversion process is the same as detailed before. We tested that with this quantization technique the latency is around 6.7 seconds on Pixel 7 with max output length set to 100. + +```python +gpt2_lm.jit_compile = False +converter = tf.lite.TFLiteConverter.from_concrete_functions( + [concrete_func], + gpt2_lm) + +converter.target_spec.supported_ops = [ + tf.lite.OpsSet.TFLITE_BUILTINS, # enable TFLite ops + tf.lite.OpsSet.SELECT_TF_OPS, # enable TF ops +] +converter.allow_custom_ops = True +converter.optimizations = [tf.lite.Optimize.DEFAULT] +converter.target_spec.experimental_select_user_tf_ops = [ + "UnsortedSegmentJoin", + "UpperBound" +] +converter._experimental_guarantee_all_funcs_one_use = True +quant_generate_tflite = converter.convert() +run_inference("I'm enjoying a", quant_generate_tflite) + +with open('quantized_gpt2.tflite', 'wb') as f: + f.write(quant_generate_tflite) +``` + + + +### Step 4. Android App integration + +You can clone this repo and substitute `android/app/src/main/assets/autocomplete.tflite` with your converted `quant_generate_tflite` file. Please refer to [how-to-build.md](https://github.com/tensorflow/examples/blob/master/lite/examples/generative_ai/android/how-to-build.md) to build this Android App. + +## Safety and Responsible AI +As noted in the original [OpenAI GPT-2 announcement](https://openai.com/research/better-language-models), there are [notable caveats and limitations](https://github.com/openai/gpt-2#some-caveats) with the GPT-2 model. In fact, LLMs today generally have some well-known challenges such as hallucinations, fairness, and bias; this is because these models are trained on real-world data, which make them reflect real world issues. +This codelab is created only to demonstrate how to create an app powered by LLMs with TensorFlow tooling. The model produced in this codelab is for educational purposes only and not intended for production usage. +LLM production usage requires thoughtful selection of training datasets and comprehensive safety mitigations. One such functionality offered in this Android app is the profanity filter, which rejects bad user inputs or model outputs. If any inappropriate language is detected, the app will in return reject that action. To learn more about Responsible AI in the context of LLMs, make sure to watch the Safe and Responsible Development with Generative Language Models technical session at Google I/O 2023 and check out the [Responsible AI Toolkit](https://www.tensorflow.org/responsible_ai). diff --git a/lite/examples/generative_ai/android/app/build.gradle.kts b/lite/examples/generative_ai/android/app/build.gradle.kts new file mode 100644 index 00000000000..ed1a8880253 --- /dev/null +++ b/lite/examples/generative_ai/android/app/build.gradle.kts @@ -0,0 +1,102 @@ +@file:Suppress("UnstableApiUsage") + +plugins { + kotlin("android") + id("com.android.application") + id("de.undercouch.download") +} + +ext { + set("AAR_URL", "https://storage.googleapis.com/download.tensorflow.org/models/tflite/generativeai/tensorflow-lite-select-tf-ops.aar") + set("AAR_PATH", "$projectDir/libs/tensorflow-lite-select-tf-ops.aar") +} + +apply { + from("download.gradle") +} + +android { + namespace = "com.google.tensorflowdemo" + compileSdk = 33 + + defaultConfig { + applicationId = "com.google.tensorflowdemo" + minSdk = 24 + targetSdk = 33 + versionCode = 1 + versionName = "1.0" + } + buildFeatures { + compose = true + buildConfig = true + viewBinding = true + } + composeOptions { + kotlinCompilerExtensionVersion = "1.3.2" + } + packagingOptions { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } + buildTypes { + getByName("release") { + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + isDebuggable = false + } + getByName("debug") { + applicationIdSuffix = ".debug" + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + freeCompilerArgs = listOf( + "-P", + "plugin:androidx.compose.compiler.plugins.kotlin:suppressKotlinVersionCompatibilityCheck=1.8.10" + ) + } +} + +dependencies { + implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.aar")))) + + // Compose + implementation(libraries.compose.ui) + implementation(libraries.compose.ui.tooling) + implementation(libraries.compose.ui.tooling.preview) + implementation(libraries.compose.foundation) + implementation(libraries.compose.material) + implementation(libraries.compose.material.icons) + implementation(libraries.compose.activity) + + // Accompanist for Compose + implementation(libraries.accompanist.systemuicontroller) + + // Koin + implementation(libraries.koin.core) + implementation(libraries.koin.android) + implementation(libraries.koin.compose) + + // Lifecycle + implementation(libraries.lifecycle.viewmodel) + implementation(libraries.lifecycle.viewmodel.compose) + implementation(libraries.lifecycle.viewmodel.ktx) + implementation(libraries.lifecycle.runtime.compose) + + // Logging + implementation(libraries.napier) + + // Profanity filter + implementation(libraries.wordfilter) + + // TensorFlow Lite + implementation(libraries.tflite) + + // Unit tests + testImplementation(libraries.junit) +} diff --git a/lite/examples/generative_ai/android/app/download.gradle b/lite/examples/generative_ai/android/app/download.gradle new file mode 100644 index 00000000000..8552a349054 --- /dev/null +++ b/lite/examples/generative_ai/android/app/download.gradle @@ -0,0 +1,7 @@ +task downloadAAR { + download { + src project.ext.AAR_URL + dest project.ext.AAR_PATH + overwrite false + } +} \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/libs/.gitignore b/lite/examples/generative_ai/android/app/libs/.gitignore new file mode 100644 index 00000000000..c5db4891b20 --- /dev/null +++ b/lite/examples/generative_ai/android/app/libs/.gitignore @@ -0,0 +1 @@ +tensorflow-lite-select-tf-ops.aar \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/libs/build_aar/README.md b/lite/examples/generative_ai/android/app/libs/build_aar/README.md new file mode 100644 index 00000000000..cba41f1a308 --- /dev/null +++ b/lite/examples/generative_ai/android/app/libs/build_aar/README.md @@ -0,0 +1,16 @@ +# Build your own aar + +By default the app automatically downloads the needed aar files. But if you want +to build your own, just go ahead and run `./build_aar.sh`. This script will pull +in the necessary ops from [TensorFlow Text](https://www.tensorflow.org/text) and +build the aar for [Select TF operators](https://www.tensorflow.org/lite/guide/ops_select). + +After compilation, a new file `tftext_tflite_flex.aar` is generated. Replace the +one in app/libs/ folder and re-build the app. + +By default, the script builds only for `android_x86_64`. You can change it to +`android_x86`, `android_arm` or `android_arm64`. + +Note that you still need to include the standard `tensorflow-lite` aar in your +gradle file. + diff --git a/lite/examples/generative_ai/android/app/libs/build_aar/build_aar.sh b/lite/examples/generative_ai/android/app/libs/build_aar/build_aar.sh new file mode 100755 index 00000000000..53c08d571da --- /dev/null +++ b/lite/examples/generative_ai/android/app/libs/build_aar/build_aar.sh @@ -0,0 +1,28 @@ +#! /bin/bash + +set -e + +# Clone TensorFlow Text repo +git clone https://github.com/tensorflow/text.git tensorflow_text + +cd tensorflow_text/ +echo 'exports_files(["LICENSE"])' > BUILD + +# Checkout 2.12 branch +git checkout 2.12 + +# Apply tftext-2.12.patch +git apply ../tftext-2.12.patch + +# Run config +./oss_scripts/configure.sh + +# Run bazel build +bazel build -c opt --cxxopt='--std=c++14' --config=monolithic --config=android_x86_64 --experimental_repo_remote_exec //tensorflow_text:tftext_tflite_flex + +if [ $? -eq 0 ]; then + # Print a message + echo "Please find the aar file: tensorflow_text/bazel-bin/tensorflow_text/tftext_tflite_flex.aar" +else + echo "build_aar.sh has failed. Please find the error message above and address it before proceeding." +fi \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/libs/build_aar/tftext-2.12.patch b/lite/examples/generative_ai/android/app/libs/build_aar/tftext-2.12.patch new file mode 100644 index 00000000000..e3edc1c2e47 --- /dev/null +++ b/lite/examples/generative_ai/android/app/libs/build_aar/tftext-2.12.patch @@ -0,0 +1,61 @@ +diff --git a/WORKSPACE b/WORKSPACE +index 28b7ee5..5ad0b55 100644 +--- a/WORKSPACE ++++ b/WORKSPACE +@@ -116,3 +116,10 @@ load("@org_tensorflow//third_party/android:android_configure.bzl", "android_conf + android_configure(name="local_config_android") + load("@local_config_android//:android.bzl", "android_workspace") + android_workspace() ++ ++android_sdk_repository(name = "androidsdk") ++ ++android_ndk_repository( ++ name = "androidndk", ++ api_level = 21, ++) +diff --git a/tensorflow_text/BUILD b/tensorflow_text/BUILD +index 9b5ee5b..880c7c5 100644 +--- a/tensorflow_text/BUILD ++++ b/tensorflow_text/BUILD +@@ -2,6 +2,8 @@ load("//tensorflow_text:tftext.bzl", "py_tf_text_library") + + # [internal] load build_test.bzl + load("@org_tensorflow//tensorflow/lite:build_def.bzl", "tflite_cc_shared_object") ++load("@org_tensorflow//tensorflow/lite/delegates/flex:build_def.bzl", "tflite_flex_android_library") ++load("@org_tensorflow//tensorflow/lite/java:aar_with_jni.bzl", "aar_with_jni") + + # Visibility rules + package( +@@ -61,6 +63,20 @@ tflite_cc_shared_object( + deps = [":ops_lib"], + ) + ++tflite_flex_android_library( ++ name = "tftext_ops", ++ additional_deps = [ ++ "@org_tensorflow//tensorflow/lite/delegates/flex:delegate", ++ ":ops_lib", ++ ], ++ visibility = ["//visibility:public"], ++) ++ ++aar_with_jni( ++ name = "tftext_tflite_flex", ++ android_library = ":tftext_ops", ++) ++ + py_library( + name = "ops", + srcs = [ +diff --git a/tensorflow_text/tftext.bzl b/tensorflow_text/tftext.bzl +index 65430ca..04f68d8 100644 +--- a/tensorflow_text/tftext.bzl ++++ b/tensorflow_text/tftext.bzl +@@ -140,6 +140,7 @@ def tf_cc_library( + deps += select({ + "@org_tensorflow//tensorflow:mobile": [ + "@org_tensorflow//tensorflow/core:portable_tensorflow_lib_lite", ++ "@org_tensorflow//tensorflow/lite/kernels/shim:tf_op_shim", + ], + "//conditions:default": [ + "@local_config_tf//:libtensorflow_framework", diff --git a/lite/examples/generative_ai/android/app/proguard-rules.pro b/lite/examples/generative_ai/android/app/proguard-rules.pro new file mode 100644 index 00000000000..481bb434814 --- /dev/null +++ b/lite/examples/generative_ai/android/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/src/main/AndroidManifest.xml b/lite/examples/generative_ai/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..397bae6ecb1 --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/src/main/ic_launcher-playstore.png b/lite/examples/generative_ai/android/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..3a7167211439643456a80ca0668c55bed13f91cc GIT binary patch literal 24646 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 literal 0 HcmV?d00001 diff --git a/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/DemoApplication.kt b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/DemoApplication.kt new file mode 100644 index 00000000000..81e7f03fe4e --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/DemoApplication.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2023 The TensorFlow Authors. All Rights Reserved. + * + * 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 + * + * http://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. + */ + +package com.google.tensorflowdemo + +import android.app.Application +import com.google.tensorflowdemo.di.appModule +import com.google.tensorflowdemo.di.viewmodelModule +import io.github.aakira.napier.DebugAntilog +import io.github.aakira.napier.Napier +import org.koin.android.ext.koin.androidContext +import org.koin.android.ext.koin.androidLogger +import org.koin.core.context.startKoin + +class DemoApplication : Application() { + + override fun onCreate() { + super.onCreate() + + if (BuildConfig.DEBUG) { + Napier.base(DebugAntilog()) + } + + startKoin { + androidLogger() + androidContext(this@DemoApplication) + modules( + appModule, + viewmodelModule + ) + } + } +} \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/data/autocomplete/AutoCompleteService.kt b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/data/autocomplete/AutoCompleteService.kt new file mode 100644 index 00000000000..8d83a565477 --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/data/autocomplete/AutoCompleteService.kt @@ -0,0 +1,301 @@ +/* + * Copyright 2023 The TensorFlow Authors. All Rights Reserved. + * + * 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 + * + * http://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. + */ + +package com.google.tensorflowdemo.data.autocomplete + +import android.content.Context +import androidx.annotation.WorkerThread +import com.google.tensorflowdemo.data.autocomplete.AutoCompleteService.AutoCompleteInputConfiguration +import com.google.tensorflowdemo.data.autocomplete.AutoCompleteService.AutoCompleteResult +import com.google.tensorflowdemo.data.autocomplete.AutoCompleteService.AutoCompleteServiceError +import com.google.tensorflowdemo.data.autocomplete.AutoCompleteService.InitModelResult +import com.google.tensorflowdemo.util.splitToWords +import com.google.tensorflowdemo.util.trimToMaxWordCount +import com.mediamonks.wordfilter.LanguageChecker +import io.github.aakira.napier.Napier +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import org.tensorflow.lite.Interpreter +import java.io.FileInputStream +import java.io.FileNotFoundException +import java.nio.ByteBuffer +import java.nio.MappedByteBuffer +import java.nio.channels.FileChannel +import kotlin.math.min + +interface AutoCompleteService { + + /** + * Configuration of input for model + */ + val inputConfiguration: AutoCompleteInputConfiguration + + /** + * Boolean indicating whether the model has been initialized successfully + */ + val isInitialized: Boolean + + /** + * Initialize TensorFlow-Lite with app provided model + * @return [InitModelResult.Success] if TFLite was initialized properly, otherwise [InitModelResult.Error] + */ + suspend fun initModel(): InitModelResult + + /** + * Get autocomplete suggestion split into words for the provided [input]. + * If [applyWindow] is true, the last [windowSize] words are taken from [input] and fed into the interpreter. + * @return an instance of [AutoCompleteResult.Error] if something went wrong, or + * an instance of [AutoCompleteResult.Success] with the suggested text, split into words + */ + suspend fun getSuggestion(input: String, applyWindow: Boolean = false, windowSize: Int = 50): AutoCompleteResult + + /** + * Possible errors from [AutoCompleteService] + */ + enum class AutoCompleteServiceError { + MODEL_FILE_NOT_FOUND, + MODEL_NOT_INITIALIZED, + NO_SUGGESTIONS, + BAD_LANGUAGE, + } + + /** + * Result from [AutoCompleteService.getSuggestion] method call + */ + sealed interface AutoCompleteResult { + data class Success(val words: List) : AutoCompleteResult + data class Error(val error: AutoCompleteServiceError) : AutoCompleteResult + } + + /** + * Result from [AutoCompleteService.initModel] method call + */ + sealed interface InitModelResult { + object Success : InitModelResult + data class Error(val error: AutoCompleteServiceError) : InitModelResult + } + + data class AutoCompleteInputConfiguration( + // Minimum number of words to be taken from the end of the input text + val minWordCount: Int = 5, + // Maximum number of words to be taken from the end of the input text + val maxWordCount: Int = 50, + // Initially selected value for number of words to be taken from the end of the input text + val initialWordCount: Int = 20, + ) +} + +class AutoCompleteServiceImpl( + private val context: Context, + private val languageChecker: LanguageChecker, + private val dispatcher: CoroutineDispatcher = Dispatchers.IO +) : AutoCompleteService, AutoCloseable { + + /** + * The values below are used to configure the slider that allows a user to select the number of words to take from the current text + * and use as input for the model to generate new text from. + */ + override val inputConfiguration = AutoCompleteInputConfiguration( + // Minimum number of words to be taken from the end of the input text + minWordCount = 5, + // Maximum number of words to be taken from the end of the input text, limited by what the model allows + maxWordCount = min(50, MAX_INPUT_WORD_COUNT), + // Initially selected value for number of words to be taken from the end of the input text + initialWordCount = 20 + ) + + override var isInitialized: Boolean = false + private set + + private lateinit var interpreter: Interpreter + private val outputBuffer = ByteBuffer.allocateDirect(OUTPUT_BUFFER_SIZE) + + + /** + * Initialize TensorFlow Lite with app provided model + * @return [InitModelResult.Success] if TFLite was initialized properly, otherwise [InitModelResult.Error] + */ + override suspend fun initModel(): InitModelResult { + return withContext(dispatcher) { + // Load model file + val loadResult = loadModelFile(context) + + // Determine if load was successful + if (loadResult.isFailure) { + val exc = loadResult.exceptionOrNull() + return@withContext if (exc is FileNotFoundException) { + InitModelResult.Error(AutoCompleteServiceError.MODEL_FILE_NOT_FOUND) + } else { + InitModelResult.Error(AutoCompleteServiceError.MODEL_NOT_INITIALIZED) + } + } + + // Instantiate interpreter with loaded model + val model = loadResult.getOrNull() + isInitialized = model?.let { + interpreter = Interpreter(it) + true + } ?: false + + if (isInitialized) InitModelResult.Success + else InitModelResult.Error(AutoCompleteServiceError.MODEL_NOT_INITIALIZED) + } + } + + /** + * Get autocomplete suggestion split into words for the provided [input]. + * If [applyWindow] is true, the last [windowSize] words are taken from [input] and fed into the interpreter. + * @return an instance of [AutoCompleteResult.Error] if something went wrong, or + * an instance of [AutoCompleteResult.Success] with the suggested text, split into words + */ + override suspend fun getSuggestion(input: String, applyWindow: Boolean, windowSize: Int) = withContext(dispatcher) { + Napier.d { "[0] Start interpretation" } + Napier.d { "[1] Input text: (${input.length} chars) '$input'" } + + // Check input for bad language + if (languageChecker.containsBadLanguage(input)) { + Napier.w { "[2] Input contains bad language, refused!" } + return@withContext AutoCompleteResult.Error(AutoCompleteServiceError.BAD_LANGUAGE) + } + + // Initialize interpreter if necessary + if (!::interpreter.isInitialized) { + val result = initModel() + if (result is InitModelResult.Error) { + return@withContext AutoCompleteResult.Error(result.error) + } + } + + // Determine maximum number of words to take from input as model input + val maxInputWordCount = if (applyWindow) windowSize else MAX_INPUT_WORD_COUNT + Napier.d { "[2] Trimming input to max $maxInputWordCount words" } + + // Trim input text to maximum number of words + val trimmedInput = input.trimToMaxWordCount(maxInputWordCount) + Napier.d { "[3] Model input: (${trimmedInput.length} chars) '$trimmedInput'" } + + var retryCount = 0 + var containsBadLanguage: Boolean + lateinit var output: String + + // Run generation until it no longer contains bad language or a max number of tries has been exceeded + do { + // Let model generate new text based on windowed input + output = runInterpreterOn(trimmedInput) + + // Check output for bad language + containsBadLanguage = languageChecker.containsBadLanguage(output) + + retryCount++ + } while (containsBadLanguage && retryCount < RETRY_COUNT_ON_BAD_LANGUAGE) + + // Return error if output still contains bad language + if (containsBadLanguage) { + Napier.w { "[4] Output still contains bad language after 3 attempts, refused!" } + + return@withContext AutoCompleteResult.Error(AutoCompleteServiceError.NO_SUGGESTIONS) + } + + Napier.d { "[4] Model output: (${output.length} chars) '$output'" } + + // Check if output size is actually longer than original input text, if not that's an error + if (output.length < trimmedInput.length) { + Napier.w { "[5] NO SUGGESTION: Output length is shorter than trimmed input length, so there was no new text suggested" } + AutoCompleteResult.Error(AutoCompleteServiceError.NO_SUGGESTIONS) + } else { + // Output = input + new text, determine new text by subtracting input + val newText = output.substring(output.indexOf(trimmedInput) + trimmedInput.length) + Napier.d { "[5] New text from interpreter: (${newText.length} chars) '$newText'" } + + // Split new text into words. If there are no words, that's an error, otherwise return the words + val words = newText.splitToWords() + if (words.isEmpty()) { + Napier.w { "[6] NO SUGGESTION: No words found after splitting new text into words" } + AutoCompleteResult.Error(AutoCompleteServiceError.NO_SUGGESTIONS) + } else { + Napier.d { "[6] New text split in words: (${words.size} words) [${words.joinToString()}]" } + AutoCompleteResult.Success(words) + } + } + } + + /** + * Run the previously created [interpreter] on the provided input, which will return with appended generated text + * Note that this method may take quite some time to finish, so call this from a background thread + */ + @WorkerThread + private fun runInterpreterOn(input: String): String { + outputBuffer.clear() + + // Run interpreter, which will generate text into outputBuffer + interpreter.run(input, outputBuffer) + + // Set output buffer limit to current position & position to 0 + outputBuffer.flip() + + // Get bytes from output buffer + val bytes = ByteArray(outputBuffer.remaining()) + outputBuffer.get(bytes) + + outputBuffer.clear() + + // Return bytes converted to String + return String(bytes, Charsets.UTF_8) + } + + /** + * Load TF Lite model file into memory. + * The model file is expected in the `src/main/assets` folder, with name configured in [TFLITE_MODEL] + */ + private fun loadModelFile(context: Context): Result { + try { + val descriptor = context.assets.openFd(TFLITE_MODEL) + + FileInputStream(descriptor.fileDescriptor).use { stream -> + return Result.success( + stream.channel.map( + /* mode = */ FileChannel.MapMode.READ_ONLY, + /* position = */ descriptor.startOffset, + /* size = */ descriptor.declaredLength + ) + ) + } + } catch (e: Exception) { + Napier.e { "Failed to load model: ${e.localizedMessage}" } + + return Result.failure(e) + } + } + + override fun close() { + interpreter.close() + } + + companion object { + // File name of TF Lite model as expected in the assets folder + private const val TFLITE_MODEL = "autocomplete.tflite" + + // Size of output buffer for the model to generate text into + private const val OUTPUT_BUFFER_SIZE = 800 + + // Maximum number of words that can be fed into the model + private const val MAX_INPUT_WORD_COUNT = 1024 + + // Maximum number of attempts to generate text that does not contain bad language + private const val RETRY_COUNT_ON_BAD_LANGUAGE = 3 + } +} \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/di/appModule.kt b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/di/appModule.kt new file mode 100644 index 00000000000..2c8fd544d9d --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/di/appModule.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2023 The TensorFlow Authors. All Rights Reserved. + * + * 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 + * + * http://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. + */ + +package com.google.tensorflowdemo.di + +import com.google.tensorflowdemo.data.autocomplete.AutoCompleteService +import com.google.tensorflowdemo.data.autocomplete.AutoCompleteServiceImpl +import com.mediamonks.wordfilter.LanguageChecker +import com.mediamonks.wordfilter.LanguageCheckerImpl +import org.koin.android.ext.koin.androidContext +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.module + +val appModule = module { + single { + AutoCompleteServiceImpl( + context = androidContext(), + languageChecker = get() + ) + } + + singleOf(::LanguageCheckerImpl) +} diff --git a/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/di/viewmodelModule.kt b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/di/viewmodelModule.kt new file mode 100644 index 00000000000..74ba9da3f9c --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/di/viewmodelModule.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2023 The TensorFlow Authors. All Rights Reserved. + * + * 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 + * + * http://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. + */ + +package com.google.tensorflowdemo.di + +import com.google.tensorflowdemo.ui.screens.autocomplete.AutoCompleteViewModel +import org.koin.androidx.viewmodel.dsl.viewModelOf +import org.koin.dsl.module + +val viewmodelModule = module { + viewModelOf(::AutoCompleteViewModel) +} \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/MainActivity.kt b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/MainActivity.kt new file mode 100644 index 00000000000..16f52285a36 --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/MainActivity.kt @@ -0,0 +1,105 @@ +/* + * Copyright 2023 The TensorFlow Authors. All Rights Reserved. + * + * 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 + * + * http://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. + */ + +package com.google.tensorflowdemo.ui + +import android.annotation.SuppressLint +import android.os.Bundle +import android.widget.Toast +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBars +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.core.view.WindowCompat +import com.google.accompanist.systemuicontroller.rememberSystemUiController +import com.google.tensorflowdemo.R +import com.google.tensorflowdemo.ui.components.HeaderBar +import com.google.tensorflowdemo.ui.screens.autocomplete.AutoCompleteScreen +import com.google.tensorflowdemo.ui.theme.TensorFlowDemoTheme +import com.google.tensorflowdemo.ui.theme.VeryLightGrey + +@OptIn(ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class) +class MainActivity : ComponentActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + WindowCompat.setDecorFitsSystemWindows(window, false) + + setContent { + + val systemUiController = rememberSystemUiController() + DisposableEffect(systemUiController) { + // Update all of the system bar colors to be transparent, and use + // dark icons if we're in light theme + systemUiController.setSystemBarsColor( + color = Color.Transparent, + darkIcons = true + ) + systemUiController.setNavigationBarColor(Color.White) + onDispose {} + } + + TensorFlowDemoTheme { + val insets = WindowInsets.statusBars.asPaddingValues() + val barHeight = 66.dp + + Scaffold( + topBar = { + HeaderBar( + label = stringResource(R.string.header_autocomplete), + textOffset = (insets.calculateTopPadding() / 4), + modifier = Modifier.height(barHeight + insets.calculateTopPadding() / 2) + ) + } + ) { paddings -> + AutoCompleteScreen( + onShowToast = { id -> Toast.makeText(this, id, Toast.LENGTH_SHORT).show() }, + modifier = Modifier.padding( + top = barHeight - 20.dp, + bottom = paddings.calculateBottomPadding() + ) + ) + } + } + } + } +} + +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +@OptIn(ExperimentalMaterial3Api::class) +@Preview +@Composable +fun PreviewMain() { + TensorFlowDemoTheme { + Scaffold { + AutoCompleteScreen(onShowToast = {}, modifier = Modifier.padding(top = 50.dp)) + } + } +} \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/components/HeaderBar.kt b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/components/HeaderBar.kt new file mode 100644 index 00000000000..aadf9725c24 --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/components/HeaderBar.kt @@ -0,0 +1,84 @@ +/* + * Copyright 2023 The TensorFlow Authors. All Rights Reserved. + * + * 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 + * + * http://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. + */ + +package com.google.tensorflowdemo.ui.components + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset +import androidx.compose.material3.Divider +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.FixedScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import com.google.tensorflowdemo.R +import com.google.tensorflowdemo.ui.theme.TensorFlowDemoTheme + +@Composable +fun HeaderBar( + label: String, + textOffset: Dp, + modifier:Modifier = Modifier +) { + Box( + modifier = modifier + .fillMaxWidth() + .background(Color.White) + ) { + Image( + painter = painterResource(id = R.drawable.header_background), + contentDescription = stringResource(R.string.header_background_desc), + contentScale = FixedScale(.47f), + ) + Text( + text = label, + color = MaterialTheme.colorScheme.secondary, + style = MaterialTheme.typography.displayLarge, + modifier = Modifier + .align(Alignment.Center) + .offset(y = textOffset) + ) + Divider( + modifier = Modifier + .fillMaxWidth() + .height(1.dp) + .align(Alignment.BottomStart) + ) + + } +} + +@Preview +@Composable +fun PreviewHeaderBar() { + TensorFlowDemoTheme { + HeaderBar( + label = "Autocomplete", + textOffset = 20.dp + ) + } +} \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/AutoCompleteScreen.kt b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/AutoCompleteScreen.kt new file mode 100644 index 00000000000..d11ac88e83e --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/AutoCompleteScreen.kt @@ -0,0 +1,285 @@ +/* + * Copyright 2023 The TensorFlow Authors. All Rights Reserved. + * + * 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 + * + * http://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. + */ + +package com.google.tensorflowdemo.ui.screens.autocomplete + +import android.content.res.Configuration +import androidx.annotation.StringRes +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ColorScheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.ClipboardManager +import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.platform.LocalLifecycleOwner +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.TextRange +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.lifecycle.repeatOnLifecycle +import com.google.tensorflowdemo.R +import com.google.tensorflowdemo.data.autocomplete.AutoCompleteService.AutoCompleteInputConfiguration +import com.google.tensorflowdemo.data.autocomplete.AutoCompleteService.AutoCompleteServiceError +import com.google.tensorflowdemo.ui.screens.autocomplete.components.AutoCompleteInfo +import com.google.tensorflowdemo.ui.screens.autocomplete.components.AutoCompleteTextField +import com.google.tensorflowdemo.ui.screens.autocomplete.components.TextControlBar +import com.google.tensorflowdemo.ui.screens.autocomplete.components.WindowSizeSelection +import com.google.tensorflowdemo.ui.theme.TensorFlowDemoTheme +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch +import org.koin.androidx.compose.getViewModel + +@OptIn(ExperimentalComposeUiApi::class) +@Composable +fun AutoCompleteScreen( + onShowToast: (Int) -> Unit, + modifier: Modifier = Modifier +) { + val viewmodel = getViewModel() + + val textValue = rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(TextFieldValue(annotatedString = AnnotatedString(""))) } + val barState by viewmodel.textBarState.collectAsState() + val inputFieldEnabled by viewmodel.inputFieldEnabled.collectAsStateWithLifecycle() + val windowSizeConfiguration by remember { mutableStateOf(viewmodel.windowSizeConfiguration) } + val clipboardManager: ClipboardManager = LocalClipboardManager.current + val keyboardController = LocalSoftwareKeyboardController.current + val uriHandler = LocalUriHandler.current + + fun showToast(@StringRes id: Int) { + keyboardController?.hide() + + onShowToast(id) + } + + AutoCompleteScreenContent( + inputValue = textValue.value, + inputEnabled = inputFieldEnabled, + onInputValueChange = { value -> + textValue.value = value + viewmodel.isTextEmpty = value.text.isEmpty() + }, + barState = barState, + inputConfiguration = windowSizeConfiguration, + previousSuggestions = viewmodel.previousSuggestions, + onClear = { + textValue.value = TextFieldValue(AnnotatedString("")) + viewmodel.onClearInput() + }, + onCopy = { + clipboardManager.setText(textValue.value.annotatedString) + + onShowToast(R.string.text_copied) + }, + onGenerate = { viewmodel.onGenerateAutoComplete(textValue.value.text) }, + onRetry = viewmodel::onRetryGenerateAutoComplete, + onAccept = { + viewmodel.onAcceptSuggestion() + textValue.value = TextFieldValue( + text = textValue.value.text, + selection = TextRange(textValue.value.text.length) + ) + }, + onWindowSizeChange = viewmodel::onWindowSizeChange, + onSuggestionsRemoved = viewmodel::removeMissingSuggestions, + onLinkoutSelect = { uriHandler.openUri("https://github.com/keras-team/keras-nlp") }, + modifier = modifier + ) + + val lifecycle = LocalLifecycleOwner.current.lifecycle + val colorScheme = MaterialTheme.colorScheme + + LaunchedEffect(key1 = Unit) { + lifecycle.repeatOnLifecycle(state = Lifecycle.State.STARTED) { + launch { + viewmodel.suggestion.collectLatest { words -> + words?.let { + animateSuggestion(textValue, words, colorScheme) { + viewmodel.onSuggestionReceived() + } + } + } + } + launch { + viewmodel.resetInputText.collectLatest { resetText -> + resetText?.let { text -> + textValue.value = TextFieldValue( + annotatedString = AnnotatedString(text), + selection = TextRange(text.length) + ) + + viewmodel.onResetReceived() + } + } + } + launch { + viewmodel.error.collectLatest { error -> + showToast(getErrorMessage(error)) + } + } + } + } +} + +suspend fun animateSuggestion( + textValueState: MutableState, + words: List, + colorScheme: ColorScheme, + onAnimationComplete: () -> Unit +) { + val builder = AnnotatedString.Builder(textValueState.value.annotatedString) + + val stylePos = builder.pushStyle( + SpanStyle( + color = colorScheme.primary, + fontWeight = FontWeight.Bold + ) + ) + + for (word in words) { + builder.append(word) + + val annotatedString = builder.toAnnotatedString() + textValueState.value = TextFieldValue( + annotatedString = annotatedString, + selection = TextRange(annotatedString.length) + ) + delay(100) + } + + builder.pop(stylePos) + + onAnimationComplete() +} + +@Composable +fun AutoCompleteScreenContent( + inputValue: TextFieldValue, + inputEnabled: Boolean, + onInputValueChange: (TextFieldValue) -> Unit, + barState: TextEditBarState, + previousSuggestions: List, + inputConfiguration: AutoCompleteInputConfiguration, + onClear: () -> Unit, + onCopy: () -> Unit, + onGenerate: () -> Unit, + onRetry: () -> Unit, + onAccept: () -> Unit, + onWindowSizeChange: (Int) -> Unit, + onSuggestionsRemoved: (List) -> Unit, + onLinkoutSelect: () -> Unit, + modifier: Modifier = Modifier +) { + Box( + modifier = modifier + .background(Color.White) + .fillMaxHeight() + ) { + Column(modifier = Modifier.fillMaxHeight()) { + Column( + modifier = modifier + .background(Color.White) + .padding(start = 16.dp, end = 16.dp, top = 20.dp) + ) { + AutoCompleteTextField( + inputValue = inputValue, + inputEnabled = inputEnabled, + previousSuggestions = previousSuggestions, + onInputValueChange = onInputValueChange, + onSuggestionsRemoved = onSuggestionsRemoved, + modifier = Modifier + .fillMaxWidth() + .height(250.dp) + .padding(bottom = 16.dp), + ) + TextControlBar( + state = barState, + onClearClick = onClear, + onGenerateClick = onGenerate, + onCopyClick = onCopy, + onAccept = onAccept, + onRetry = onRetry + ) + } + Spacer(modifier = Modifier.weight(1f)) + WindowSizeSelection( + inputConfiguration = inputConfiguration, + onWindowValueChange = onWindowSizeChange, + modifier = Modifier.padding(bottom = 32.dp, start = 16.dp, end = 16.dp) + ) + AutoCompleteInfo( + onLinkoutSelect = onLinkoutSelect, + modifier = Modifier + .padding(horizontal = 8.dp, vertical = 8.dp) + ) + } + } +} + +private fun getErrorMessage(error: AutoCompleteServiceError) = when (error) { + AutoCompleteServiceError.MODEL_NOT_INITIALIZED -> R.string.error_model_not_initialized + AutoCompleteServiceError.NO_SUGGESTIONS -> R.string.error_no_suggestion_found + AutoCompleteServiceError.MODEL_FILE_NOT_FOUND -> R.string.error_model_not_found + AutoCompleteServiceError.BAD_LANGUAGE -> R.string.error_input_contains_bad_language +} + +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO, showBackground = true) +@Composable +fun PreviewAutoCompleteScreen() { + TensorFlowDemoTheme { + val inputValue by remember { mutableStateOf(TextFieldValue()) } + AutoCompleteScreenContent( + inputValue = inputValue, + onInputValueChange = {}, + inputEnabled = true, + inputConfiguration = AutoCompleteInputConfiguration(), + previousSuggestions = listOf(), + onClear = {}, + onCopy = {}, + onGenerate = {}, + onRetry = {}, + onAccept = {}, + onWindowSizeChange = {}, + onSuggestionsRemoved = {}, + onLinkoutSelect = {}, + barState = initialControlBarState, + ) + } +} \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/AutoCompleteViewModel.kt b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/AutoCompleteViewModel.kt new file mode 100644 index 00000000000..d099d2e4851 --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/AutoCompleteViewModel.kt @@ -0,0 +1,265 @@ +/* + * Copyright 2023 The TensorFlow Authors. All Rights Reserved. + * + * 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 + * + * http://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. + */ + +package com.google.tensorflowdemo.ui.screens.autocomplete + +import androidx.compose.runtime.mutableStateListOf +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.google.tensorflowdemo.data.autocomplete.AutoCompleteService +import com.google.tensorflowdemo.data.autocomplete.AutoCompleteService.AutoCompleteResult +import com.google.tensorflowdemo.data.autocomplete.AutoCompleteService.AutoCompleteServiceError +import com.google.tensorflowdemo.data.autocomplete.AutoCompleteService.InitModelResult +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch + +class AutoCompleteViewModel( + private val autoCompleteService: AutoCompleteService +) : ViewModel() { + + private var currentSuggestionInputText: String = "" + private var currentSuggestionText: String? = null + private var windowSize = 0 + private var initModelError: InitModelResult.Error? = null + private var previousSuggestionsIndex = 0 + private val isGenerating = MutableStateFlow(false) + private val hasGenerated = MutableStateFlow(false) + private val isSuggesting = MutableStateFlow(false) + private val isModelInitialized = MutableStateFlow(false) + + init { + if (!autoCompleteService.isInitialized) { + viewModelScope.launch { + val result = autoCompleteService.initModel() + if (result is InitModelResult.Error) { + initModelError = result + } + isModelInitialized.value = true + } + } else { + isModelInitialized.value = true + } + } + + private val _isTextEmpty = MutableStateFlow(true) + var isTextEmpty: Boolean = true + set(value) { + field = value + _isTextEmpty.value = value + + // Clear previous suggestions if the input text is empty + if (value) { + _previousSuggestions.clear() + } + } + + val windowSizeConfiguration = autoCompleteService.inputConfiguration + + /** + * State flow to reset text to previous value. + * Needs to be acknowledged by calling [onResetReceived] since the previous value can be the same + */ + private val _resetInputText = MutableStateFlow(null) + val resetInputText: StateFlow + get() = _resetInputText + + fun onResetReceived() { + _resetInputText.value = null + } + + /** + * State flow containing most recent suggestion from model, as list of words + * Needs to be acknowledged by calling [onSuggestionReceived] + */ + private val _suggestion = MutableStateFlow?>(null) + val suggestion: StateFlow?> + get() = _suggestion + + /** + * Shared flow exposing errors from autocomplete service + */ + private val _error = MutableSharedFlow() + val error: SharedFlow + get() = _error + + /** + * State flow exposing previously made suggestions + */ + private val _previousSuggestions = mutableStateListOf() + val previousSuggestions: List + get() = _previousSuggestions + + /** + * State flow exposing whether Clear CTA should be enabled + */ + private val clearEnabled = combine(isGenerating, _isTextEmpty) { isGenerating, isEmpty -> + !isGenerating && !isEmpty + } + + /** + * State flow exposing whether Generate CTA should be enabled + */ + private val generateEnabled = combine(isGenerating, _isTextEmpty) { isGenerating, isEmpty -> + !isGenerating && !isEmpty + } + + /** + * State flow exposing whether Copy CTA should be enabled + */ + private val copyEnabled = combine(isGenerating, hasGenerated) { isGenerating, hasGenerated -> + !isGenerating && hasGenerated + } + + /** + * State flow exposing edit bar state for Clear, Generate & Copy CTAs & generation process state + */ + private val editingBarState = combine(clearEnabled, generateEnabled, copyEnabled, isGenerating) { clear, generate, copy, generating -> + TextEditBarState.Editing( + clearEnabled = clear, + generateEnabled = generate, + copyEnabled = copy, + generating = generating, + ) + } + + /** + * State flow exposing edit bar state & whether a suggestion is active + */ + val textBarState = combine(editingBarState, isSuggesting) { editState, suggesting -> + if (suggesting) TextEditBarState.Suggesting + else editState + }.stateIn( + scope = viewModelScope, + started = SharingStarted.Lazily, + initialValue = initialControlBarState + ) + + /** + * State flow exposing whether input by user should be possible + */ + val inputFieldEnabled = combine(isModelInitialized, isGenerating, isSuggesting) { initialized, generating, suggesting -> + initialized && !generating && !suggesting + }.stateIn( + scope = viewModelScope, + started = SharingStarted.Lazily, + initialValue = true + ) + + fun onClearInput() { + isGenerating.value = false + hasGenerated.value = false + _isTextEmpty.value = true + currentSuggestionInputText = "" + + _previousSuggestions.clear() + } + + fun onWindowSizeChange(size: Int) { + windowSize = size + } + + fun onRetryGenerateAutoComplete() { + _resetInputText.value = currentSuggestionInputText + + isSuggesting.value = false + currentSuggestionText = null + + onGenerateAutoComplete(currentSuggestionInputText) + } + + fun onAcceptSuggestion() { + currentSuggestionText?.let { text -> + _previousSuggestions += Suggestion( + text = text, + id = previousSuggestionsIndex++ + ) + } + + isSuggesting.value = false + currentSuggestionText = null + } + + fun removeMissingSuggestions(ids: List) { + for (id in ids) { + _previousSuggestions.removeIf { suggestion -> suggestion.id == id } + } + } + + fun onGenerateAutoComplete(text: String) { + initModelError?.let { error -> + viewModelScope.launch { + _error.emit(error.error) + } + return + } + + currentSuggestionInputText = text + + isGenerating.value = true + + viewModelScope.launch { + when (val result = autoCompleteService.getSuggestion(text, applyWindow = true, windowSize = windowSize)) { + is AutoCompleteResult.Success -> { + _suggestion.value = result.words + currentSuggestionText = result.words.joinToString(separator = "") + } + + is AutoCompleteResult.Error -> { + _error.emit(result.error) + + isGenerating.value = false + } + } + } + } + + fun onSuggestionReceived() { + _suggestion.value = null + + isGenerating.value = false + hasGenerated.value = true + isSuggesting.value = true + } +} + +sealed class TextEditBarState { + data class Editing( + val clearEnabled: Boolean, + val generateEnabled: Boolean, + val copyEnabled: Boolean, + val generating: Boolean, + ) : TextEditBarState() + + object Suggesting : TextEditBarState() +} + +val initialControlBarState: TextEditBarState = TextEditBarState.Editing( + clearEnabled = false, + generateEnabled = false, + copyEnabled = false, + generating = false +) + +data class Suggestion( + val text: String, + val id: Int +) \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/components/AutoCompleteInfo.kt b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/components/AutoCompleteInfo.kt new file mode 100644 index 00000000000..3884e6136b7 --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/components/AutoCompleteInfo.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2023 The TensorFlow Authors. All Rights Reserved. + * + * 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 + * + * http://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. + */ + +package com.google.tensorflowdemo.ui.screens.autocomplete.components + +import android.content.res.Configuration +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import com.google.tensorflowdemo.R +import com.google.tensorflowdemo.ui.theme.TensorFlowDemoTheme + +@Composable +fun AutoCompleteInfo( + onLinkoutSelect: () -> Unit, + modifier: Modifier = Modifier +) { + TextButton( + onClick = onLinkoutSelect, + modifier = modifier.fillMaxWidth() + ) { + Spacer(modifier = Modifier.weight(1f)) + Text( + text = stringResource(R.string.about_title), + style = MaterialTheme.typography.titleSmall, + color = MaterialTheme.colorScheme.tertiary, + ) + Spacer(modifier = Modifier.weight(1f)) + } +} + +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO, showBackground = true) +@Composable +fun PreviewAutCompleteInfo() { + TensorFlowDemoTheme { + AutoCompleteInfo({}) + } +} \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/components/AutoCompleteTextField.kt b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/components/AutoCompleteTextField.kt new file mode 100644 index 00000000000..895fe434871 --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/components/AutoCompleteTextField.kt @@ -0,0 +1,132 @@ +/* + * Copyright 2023 The TensorFlow Authors. All Rights Reserved. + * + * 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 + * + * http://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. + */ + +package com.google.tensorflowdemo.ui.screens.autocomplete.components + +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.ColorScheme +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.input.KeyboardCapitalization +import androidx.compose.ui.text.input.TextFieldValue +import com.google.tensorflowdemo.R +import com.google.tensorflowdemo.ui.screens.autocomplete.Suggestion +import com.google.tensorflowdemo.ui.theme.InactiveOutlinedTextFieldBorder +import com.google.tensorflowdemo.ui.theme.DarkBlue +import com.google.tensorflowdemo.ui.theme.ActiveOutlinedTextFieldBackground +import com.google.tensorflowdemo.ui.theme.InactiveOutlinedTextFieldBackground +import kotlinx.coroutines.launch + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun AutoCompleteTextField( + inputValue: TextFieldValue, + inputEnabled: Boolean, + previousSuggestions: List, + onInputValueChange: (TextFieldValue) -> Unit, + onSuggestionsRemoved: (List) -> Unit, + modifier: Modifier = Modifier +) { + val focusRequester = remember { FocusRequester() } + val scope = rememberCoroutineScope() + val colorScheme = MaterialTheme.colorScheme + + SideEffect { + if (inputEnabled) { + scope.launch { + focusRequester.requestFocus() + } + } + } + + OutlinedTextField( + value = inputValue, + onValueChange = onInputValueChange, + enabled = inputEnabled, + textStyle = MaterialTheme.typography.bodySmall, + shape = MaterialTheme.shapes.medium, + placeholder = { + Text( + text = stringResource(R.string.input_hint), + color = MaterialTheme.colorScheme.tertiary, + modifier = Modifier.alpha(.7f) + ) + }, + colors = TextFieldDefaults.outlinedTextFieldColors( + disabledTextColor = MaterialTheme.colorScheme.onSurface, + unfocusedBorderColor = MaterialTheme.colorScheme.tertiary.copy(alpha = .7f), + disabledBorderColor = InactiveOutlinedTextFieldBorder, + focusedBorderColor = DarkBlue, + containerColor = when { + inputValue.text.isEmpty() -> InactiveOutlinedTextFieldBackground + inputEnabled -> ActiveOutlinedTextFieldBackground + else -> InactiveOutlinedTextFieldBackground + } + ), + keyboardOptions = KeyboardOptions( + capitalization = KeyboardCapitalization.Sentences, + ), + modifier = modifier + .focusRequester(focusRequester) + ) +} + +private fun annotatePreviousSuggestions( + text: AnnotatedString, + suggestions: List, + colorScheme: ColorScheme, + onSuggestionsRemoved: (List) -> Unit +): AnnotatedString { + val removedSuggestionIds = mutableListOf() + + val string = buildAnnotatedString { + append(text) + + for (suggestion in suggestions) { + val index = text.indexOf(suggestion.text) + if (index == -1) { + removedSuggestionIds += suggestion.id + } else { + addStyle( + style = SpanStyle(color = colorScheme.primary), + start = index, + end = index + suggestion.text.length + ) + } + } + } + + if (removedSuggestionIds.isNotEmpty()) { + onSuggestionsRemoved(removedSuggestionIds) + } + + return string +} diff --git a/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/components/TextControlBar.kt b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/components/TextControlBar.kt new file mode 100644 index 00000000000..9f1aeb9fafc --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/components/TextControlBar.kt @@ -0,0 +1,225 @@ +/* + * Copyright 2023 The TensorFlow Authors. All Rights Reserved. + * + * 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 + * + * http://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. + */ + +package com.google.tensorflowdemo.ui.screens.autocomplete.components + +import android.content.res.Configuration.UI_MODE_NIGHT_NO +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Check +import androidx.compose.material.icons.outlined.ContentCopy +import androidx.compose.material.icons.outlined.RestartAlt +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.IconButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.scale +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.google.tensorflowdemo.R +import com.google.tensorflowdemo.ui.screens.autocomplete.TextEditBarState +import com.google.tensorflowdemo.ui.theme.TensorFlowDemoTheme + +@Composable +fun TextControlBar( + state: TextEditBarState, + onClearClick: () -> Unit, + onGenerateClick: () -> Unit, + onCopyClick: () -> Unit, + onRetry: () -> Unit, + onAccept: () -> Unit, + modifier: Modifier = Modifier +) { + when (state) { + is TextEditBarState.Editing -> + TextEditBar( + onClearClick = onClearClick, + onGenerateClick = onGenerateClick, + onCopyClick = onCopyClick, + barState = state, + modifier = modifier + ) + + is TextEditBarState.Suggesting -> + SuggestionControlBar( + onRetry = onRetry, + onAccept = onAccept, + modifier = modifier + ) + } +} + +@Composable +fun TextEditBar( + onClearClick: () -> Unit, + onGenerateClick: () -> Unit, + onCopyClick: () -> Unit, + barState: TextEditBarState.Editing, + modifier: Modifier = Modifier +) { + Row( + modifier = modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + IconButton( + onClick = onClearClick, + enabled = barState.clearEnabled, + colors = IconButtonDefaults.iconButtonColors( + contentColor = MaterialTheme.colorScheme.tertiary + ), + modifier = Modifier.padding(start = 12.dp) + ) { + Icon( + imageVector = Icons.Outlined.RestartAlt, + contentDescription = stringResource(R.string.clear_cta) + ) + } + Spacer(modifier = Modifier.weight(1f)) + OutlinedButton( + onClick = onGenerateClick, + enabled = barState.generateEnabled, + border = if (barState.generateEnabled) { + BorderStroke(1.dp, MaterialTheme.colorScheme.primary) + } else { + BorderStroke(1.dp, MaterialTheme.colorScheme.outline.copy(alpha = .38f)) + }, + colors = ButtonDefaults.outlinedButtonColors( + contentColor = MaterialTheme.colorScheme.tertiary + ), + modifier = Modifier + .height(40.dp) + .width(180.dp) + ) { + if (barState.generating) { + CircularProgressIndicator( + strokeWidth = 2.dp, + modifier = Modifier + .scale(.5f) + .offset(0.dp, (-8).dp) + ) + } else { + Text( + text = stringResource(R.string.generate_cta), + modifier = Modifier.padding(horizontal = 32.dp) + ) + } + } + Spacer(modifier = Modifier.weight(1f)) + IconButton( + onClick = onCopyClick, + enabled = barState.copyEnabled, + colors = IconButtonDefaults.iconButtonColors( + contentColor = MaterialTheme.colorScheme.tertiary + ), + modifier = Modifier.padding(end = 12.dp) + ) { + Icon( + imageVector = Icons.Outlined.ContentCopy, + contentDescription = stringResource(R.string.copy_cta) + ) + } + } +} + +@Composable +fun SuggestionControlBar( + onRetry: () -> Unit, + onAccept: () -> Unit, + modifier: Modifier = Modifier +) { + Row(modifier = modifier.fillMaxWidth()) { + TextButton( + onClick = onRetry, + modifier = Modifier.padding(start = 16.dp) + ) { + Text( + text = stringResource(R.string.reject_suggestion_cta), + color = MaterialTheme.colorScheme.tertiary + ) + } + Spacer(modifier = Modifier.weight(1f)) + OutlinedButton( + onClick = onAccept, + border = BorderStroke(1.dp, MaterialTheme.colorScheme.primary), + modifier = Modifier.padding(end = 12.dp) + ) { + Row { + Icon( + imageVector = Icons.Default.Check, + tint = MaterialTheme.colorScheme.tertiary, + contentDescription = null, + modifier = Modifier + .scale(.8f) + .padding(start = 32.dp) + ) + Text( + text = stringResource(R.string.accept_suggestion_cta), + color = MaterialTheme.colorScheme.tertiary, + modifier = Modifier.padding(start = 8.dp, end = 32.dp, top = 2.dp) + ) + } + + } + } +} + +@Preview(uiMode = UI_MODE_NIGHT_NO, showBackground = true) +@Composable +fun PreviewTextControlBar() { + TensorFlowDemoTheme { + Column { + TextControlBar( + state = TextEditBarState.Editing( + clearEnabled = false, + generateEnabled = true, + copyEnabled = false, + generating = false + ), + onClearClick = {}, + onGenerateClick = {}, + onCopyClick = {}, + onRetry = {}, + onAccept = {} + ) + Spacer(modifier = Modifier.height(8.dp)) + TextControlBar( + state = TextEditBarState.Suggesting, + onClearClick = { }, + onGenerateClick = { }, + onCopyClick = {}, + onRetry = {}, + onAccept = {} + ) + } + } +} \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/components/WindowSizeSelection.kt b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/components/WindowSizeSelection.kt new file mode 100644 index 00000000000..47f98c1bb47 --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/screens/autocomplete/components/WindowSizeSelection.kt @@ -0,0 +1,105 @@ +/* + * Copyright 2023 The TensorFlow Authors. All Rights Reserved. + * + * 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 + * + * http://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. + */ + +package com.google.tensorflowdemo.ui.screens.autocomplete.components + +import android.content.res.Configuration +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Slider +import androidx.compose.material3.SliderDefaults +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.google.tensorflowdemo.R +import com.google.tensorflowdemo.data.autocomplete.AutoCompleteService.AutoCompleteInputConfiguration +import com.google.tensorflowdemo.ui.theme.LightGrey +import com.google.tensorflowdemo.ui.theme.TensorFlowDemoTheme + +@Composable +fun WindowSizeSelection( + inputConfiguration: AutoCompleteInputConfiguration, + onWindowValueChange: (Int) -> Unit, + modifier: Modifier = Modifier +) { + var sliderValue by remember { mutableStateOf(inputConfiguration.initialWordCount) } + + LaunchedEffect(key1 = Unit) { + onWindowValueChange(inputConfiguration.initialWordCount) + } + + Column(modifier = modifier.fillMaxWidth()) { + Text( + text = stringResource(R.string.window_size_slider_label), + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.tertiary, + modifier = Modifier + ) + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .fillMaxWidth() + .height(50.dp) + ) { + Slider( + value = sliderValue.toFloat(), + onValueChange = { value -> + sliderValue = value.toInt() + + onWindowValueChange(sliderValue) + }, + valueRange = inputConfiguration.minWordCount.toFloat()..inputConfiguration.maxWordCount.toFloat(), + steps = 45, + colors = SliderDefaults.colors( + activeTickColor = MaterialTheme.colorScheme.primary, + inactiveTrackColor = LightGrey, + inactiveTickColor = LightGrey + ), + modifier = Modifier.weight(1f) + ) + Text( + text = stringResource(R.string.window_size_wordcount).replace("{count}", sliderValue.toString()), + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.tertiary, + modifier = Modifier.padding(start = 16.dp) + ) + } + } +} + +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO, showBackground = true) +@Composable +fun PreviewWindowSizeSelection() { + TensorFlowDemoTheme { + WindowSizeSelection( + inputConfiguration = AutoCompleteInputConfiguration(), + onWindowValueChange = {} + ) + } +} diff --git a/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/theme/Color.kt b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/theme/Color.kt new file mode 100644 index 00000000000..dde417952b0 --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/theme/Color.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2023 The TensorFlow Authors. All Rights Reserved. + * + * 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 + * + * http://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. + */ + +package com.google.tensorflowdemo.ui.theme + +import androidx.compose.ui.graphics.Color + +val Orange = Color(0xFFFF6F00) +val DarkBlue = Color(0xFF425066) +val DarkGrey = Color(0xFF616161) +val MediumGrey = Color(0xFFCCCCCC) +val LightGrey = Color(0xFFE6E6E6) +val VeryLightGrey = Color(0xFFF8F8F8) +val DarkRed = Color(0xFFBF281B) + +val InactiveOutlinedTextFieldBorder = Color(0xFFD4D7DC) +val InactiveOutlinedTextFieldBackground = Color(0xFFF9F9F9) +val ActiveOutlinedTextFieldBackground = Color(0xFFFFFFFF) \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/theme/Shape.kt b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/theme/Shape.kt new file mode 100644 index 00000000000..16b61d6bce0 --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/theme/Shape.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2023 The TensorFlow Authors. All Rights Reserved. + * + * 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 + * + * http://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. + */ + +package com.google.tensorflowdemo.ui.theme + +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Shapes +import androidx.compose.ui.unit.dp + +val TfDemoShapes = Shapes( + small = RoundedCornerShape(size = 12.dp), + medium = RoundedCornerShape(size = 12.dp) +) \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/theme/Theme.kt b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/theme/Theme.kt new file mode 100644 index 00000000000..c2091639d78 --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/theme/Theme.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2023 The TensorFlow Authors. All Rights Reserved. + * + * 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 + * + * http://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. + */ + +package com.google.tensorflowdemo.ui.theme + +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable + +private val TfDemoColorScheme = lightColorScheme( + primary = Orange, + secondary = DarkBlue, + tertiary = DarkGrey, + surface = VeryLightGrey, + surfaceVariant = LightGrey, + outline = MediumGrey, + error = DarkRed +) + +@Composable +fun TensorFlowDemoTheme( + content: @Composable () -> Unit +) { + MaterialTheme( + colorScheme = TfDemoColorScheme, + typography = TfDemoTypography, + shapes = TfDemoShapes, + content = content + ) +} diff --git a/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/theme/Type.kt b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/theme/Type.kt new file mode 100644 index 00000000000..4ead448519c --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/ui/theme/Type.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2023 The TensorFlow Authors. All Rights Reserved. + * + * 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 + * + * http://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. + */ + +package com.google.tensorflowdemo.ui.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.Font +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.TextUnit +import androidx.compose.ui.unit.TextUnitType +import androidx.compose.ui.unit.sp +import com.google.tensorflowdemo.R + +val TfDemoTypography = Typography( + displayLarge = TextStyle( + fontFamily = FontFamily(Font(R.font.roboto_regular)), + fontSize = 20.sp, + fontWeight = FontWeight.W800, + letterSpacing = TextUnit(.05f, TextUnitType.Em), + background = Color.White + ), + titleSmall = TextStyle( + fontFamily = FontFamily(Font(R.font.roboto_regular)), + fontSize = 14.sp, + fontWeight = FontWeight.W500, + letterSpacing = TextUnit(.1f, TextUnitType.Em), + ), + bodySmall = TextStyle( + fontFamily = FontFamily(Font(R.font.roboto_regular)), + fontSize = 14.sp, + fontWeight = FontWeight.W200, + letterSpacing = TextUnit(.1f, TextUnitType.Em), + lineHeight = 20.sp + ) +) \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/util/StringExt.kt b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/util/StringExt.kt new file mode 100644 index 00000000000..c64bf54ed58 --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/java/com/google/tensorflowdemo/util/StringExt.kt @@ -0,0 +1,64 @@ +/* + * Copyright 2023 The TensorFlow Authors. All Rights Reserved. + * + * 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 + * + * http://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. + */ + +package com.google.tensorflowdemo.util + +fun String.trimToMaxWordCount(count: Int): String { + val allWords = allWords() + val wordCount = allWords.size + if (wordCount < count) return this + + val lastWords = allWords.toMutableList().subList(allWords.size - count, allWords.size) + val lastText = lastWords.joinToString(separator = "") + + var inputIndex = this.length + for (trimmedTextIndex in lastText.length - 1 downTo 0) { + inputIndex-- + val trimmedChar = lastText[trimmedTextIndex] + while (inputIndex >= 0 && this[inputIndex] != trimmedChar) { + inputIndex-- + } + } + return this.substring(inputIndex) +} + +fun String.splitToWords(): List { + val allWords = allWords() + + var index = 0 + val indexList = allWords.mapIndexed { wordIndex, word -> + if (wordIndex == 0) { + index += word.length + 0 + } else { + val ch = word[0] + while (index < length && this[index] != ch) index++ + val outputIndex = index + index += word.length + outputIndex + } + } + + return indexList.mapIndexed { i, wordStartIndex -> + if (i < indexList.size - 1) { + val wordEndIndex = indexList[i + 1] + this.substring(wordStartIndex, wordEndIndex) + } else this.substring(wordStartIndex) + } +} + +private val wordsRegex = """(\b\S+\b)""".toRegex() +fun String.allWords() = wordsRegex.findAll(this).toList().map { it.groupValues.first() } diff --git a/lite/examples/generative_ai/android/app/src/main/res/drawable/header_background.xml b/lite/examples/generative_ai/android/app/src/main/res/drawable/header_background.xml new file mode 100644 index 00000000000..dfb636bd0ca --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/res/drawable/header_background.xml @@ -0,0 +1,812 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lite/examples/generative_ai/android/app/src/main/res/drawable/ic_launcher_background.xml b/lite/examples/generative_ai/android/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000000..7fa8da209db --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + diff --git a/lite/examples/generative_ai/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/lite/examples/generative_ai/android/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 00000000000..f0cc8a153ee --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + diff --git a/lite/examples/generative_ai/android/app/src/main/res/font/roboto_bold.ttf b/lite/examples/generative_ai/android/app/src/main/res/font/roboto_bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..43da14d84ecb949ca5f5e8ecca3a514aa7fe1c7d GIT binary patch literal 167336 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

S&jh1n&JeeMOkU4{=4@cYr6k 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≤FHXCuU9Qce=@vmZ{%9^5??OaVQJ8!4u8-w;yt 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 + + + + \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/lite/examples/generative_ai/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000000..7353dbd1fd8 --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/lite/examples/generative_ai/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..5d738dade889b850c7c438b1adb490a299ef75b1 GIT binary patch literal 2551 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 N002ovPDHLkV1fZ_y;lGL literal 0 HcmV?d00001 diff --git a/lite/examples/generative_ai/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/lite/examples/generative_ai/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..2c5920de0cdeba7f68dd3d6331fc56d2bf79a930 GIT binary patch literal 4618 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 literal 0 HcmV?d00001 diff --git a/lite/examples/generative_ai/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/lite/examples/generative_ai/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..bd9c563a110b4bd16040bff81622e12add649945 GIT binary patch literal 3427 zcmV-p4V?0cP)@RC!_L{-+8(FET&2_FY}>ATPVH{(uC5iP>8?Ex#Wb?=Ns*5Y-!BkE#V3M< zq9Wk~QOg%v7#T%oMW`hX@(>hAK!IU~hrso>zu#p>=KsF~1H(AY|=Pz~Cyr zK7nWuxOVLtFve62kRFIer_()Ys#&*-(M_#Zdp9dJs+i~yE$ zC$OEj0^5BLux}@{nxTyCCaM8SbVb09JPRyIlC#Yd*yn@LoKo>U-9RJ*JX-p8~c)>INRbvX_e2?jr7IfF2iFDSd&(N!??+H?9e~ zzc6zz1GGgb{?ou>B{^Fk#Np&k?A1NQI&&oU0#=qOUf&Ab$AFqbV0-=nY`r8W!3$W? z5lkuTfMqSm-rYltF(t7#u#4&9^{vD`45-FzXD_Cj(UP1kB>v&H&9 z4m%f)Vr+}phLyO!0afQv`~kq$Npd#fuyfu-d?U3Nfo=Pv7{B#lV8yl-pKxshs<7wp zc^=qWNzTUmvFCp(im%5>^{~Gfzs388h)=k#0o63-qxfqiIUnAG;-`TiCKrFS7{BTF zC_at(wilmpO#`&Wz;+D)wn~x{i{hU@BF5KM084!xV?5;XaX3d@I0iRLe8Tk%&|#jx zqaU!9DBubcV(tc3a7c`=zXI%_znOS6>*7~pyp3@!1L`V)CH-A4BoTctiho#)Z>R>g z&(};mieF-zJl_(oV}K6F@Q9#B;*%f5Mq@$w*l4Xal#!0 zEL@Va7R5hjM*OauxhvjX`5n>ZvO`cc4m;aW{KY6{sMN*^%y#mQh~n$YQTzZge$7Lz@!b&L$md^v3j=*8 z!O&4buzvF{sJv1w#F)eR4AA0jz3nAnAt+{u)W)*k0n4R4U%A4?p8qk5AF7C7NfWg7 z!;X?eX&LbRD-$3H?}WyySB3iaa4rKV)l3`+Y!QmNP-Z^clc@70cF&9W}L}1T9dq9k*Y$s)u7$5#yOf|cn z=UZZC$Xaed^2aovi1qE^90pL{zOf&$`I4Ln?8%x`Gw~??4qV~R_YmXHw=aHq#bwxk z~C44))|ZQX5Mi0G6{~%yt^IDE|Tmx*D zBGM`XLqnrb-x1DXz)VR_*=c!<9qjh;9MjvhM>S54B)hQ>xNJk`@?obvjXa1H~4 zB{`-B=qgeCvA||{$Ya8Ak(EQ+5$%gl}-;X~9* zI8?32l#|B#-25U~9+kl73mU>GPWgUIIEMirNODrf14|17c5D@{3x?zGJmmGEUMPP1 z!;UE#$FsPwZ@<3?>O07K=uTM?lL&)xtf$^S#Q(kPKM(Q?giSb4G&XjA0cONG445u; zo&}U0eby=Q3EI0S5oa%s66%zYz_jHsVcKFCHhK#D_w^|-`Gass|LQv&mMri4n8Wc6 zxP%5wlRC$2Tx4mELVMYcIYO3y$PL)CeVyT16jTm)>@Gaa+GKMp%|m?B=QBWMBT_jWMP_0MSX zg?fA7a0X=^m+)L9tn9|U72&4pjeD}{P{ z;7|t8iqh|`8GJ|}2Kr8hk9Hjt;%tR%3)zYc#uhk~0kn`IL5v0vZ@#+#nk?+aSPPwC zQ5(zGB?xu)!l4X^iBA>`pz*mgXRFpQZEhrQqpMrUw#1kW^lu4=u_6)3x_g*$Ud!s#Va<#obYJawmTIk1>`5YYsYS zq4d`0wTY0MS0vQi6Q?x5h+ba@`%=^Seh&3!I#}7gKaD@Ftc*3~jHUnv4G)A7Z_oJE zwjhi+wE+a(4RkUUyl^#7SLytgp3$c#lZ}~_lGL;ee%A!eTFRg6RMy)Qr#HX|_4>r* zgYfd`sr+sjHDNa2>rp=2LyI}u`=OXMaoeD|*}O^i!etCFLRrzo>0$hsk32jTWNglX-?jVh_PrI(VTYMB_Sw&Ty?gMzkd^ zX@C*>mn&1|MDk3Dp6{Xc1Err|X8!Q24?RX)+5m!9xuw69^TU^d^S1ln4sC_Y8{p`u z2K>sH7@)JM0f!D9`U_JHu!!j$5FH);ENN#G19t7&^#or0im?%8!z!&94Ja)wt%`_< zc#5>^t^xG*8#ndq*YCcDhK8TjuQ2Ht(uOqBXf(Nf`}XZg+F|Fl-T*3badGq|Wq0P} z=GXzADV#gShQ%-tx7$uDIR`)e)Nq%J%fXTN8+7OQd84e_EckkZq=yZNjQBh4v zNl6`|H@vzN{4*C97i&q2l$4Ym{rmTSku<_WU*u++Z_+aqa5kB6Ck;@Ge~~7njX|Rx2F+|*C?mSf+uQqoEZ+F@qsSi+`o1i8 zhBSDTG$C#9=i8)Kt!_vmS7}oIP0yY^@9ER0&jY=C_kOTfuU=m62z_?afV3b@4BFVd z=bJ0k2<5jl&QYW83~4}G*hP4?s6{PmQHxsCq88UE{|5|t!e$9?(P;nx002ovPDHLk FV1lk#o__!U literal 0 HcmV?d00001 diff --git a/lite/examples/generative_ai/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/lite/examples/generative_ai/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..381fb7d10bd1526629428af4682b4fd494046af4 GIT binary patch literal 6552 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 KMNUMnLSTaN)Zn!M literal 0 HcmV?d00001 diff --git a/lite/examples/generative_ai/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/lite/examples/generative_ai/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..fa430a9caca12728650ed19b3ec1dd46c8a3ba67 GIT binary patch literal 5358 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 literal 0 HcmV?d00001 diff --git a/lite/examples/generative_ai/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/lite/examples/generative_ai/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..357d0c4f4a192335308fbf024ba6a5d0aa8066fd GIT binary patch literal 7376 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

S-NBR3aJ^TiBbcfzOjxf#j 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 + + #FFFFFF + diff --git a/lite/examples/generative_ai/android/app/src/main/res/values/strings.xml b/lite/examples/generative_ai/android/app/src/main/res/values/strings.xml new file mode 100644 index 00000000000..8d159d33e49 --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/res/values/strings.xml @@ -0,0 +1,25 @@ + + Keras to TFL + + Header background + Autocomplete + + Text copied + Tap to begin typing your story… + Clear + Generate + Copy + New suggestion + Accept + + Apply context window + {count} words + + Powered by KerasNLP and TensorFlow Lite + + + Model not initialized + No suggestions found + The autocomplete.tflite model is missing + Mind your language! + \ No newline at end of file diff --git a/lite/examples/generative_ai/android/app/src/main/res/values/themes.xml b/lite/examples/generative_ai/android/app/src/main/res/values/themes.xml new file mode 100644 index 00000000000..a7aa887e359 --- /dev/null +++ b/lite/examples/generative_ai/android/app/src/main/res/values/themes.xml @@ -0,0 +1,5 @@ + + + +