diff --git a/README.md b/README.md index f08fb10e3..43f18f236 100644 --- a/README.md +++ b/README.md @@ -227,10 +227,6 @@ cd graalvm-demos - - polyglot-chat-app
polyglot-chat-app - Demonstrates how to build a polyglot chat application by embedding Python and R into the Java host language
Technologies: Java, GraalPy, FastR, Micronaut - polyglot-debug
polyglot-debug Demonstrates how to debug a polyglot Java and JavaScript application using GraalVM Tools for Java in VS Code
Technologies: Java, JavaScript, Maven, GraalVM Extension Pack diff --git a/polyglot-chat-app/.gitignore b/polyglot-chat-app/.gitignore index c5f0be605..9e462a00c 100644 --- a/polyglot-chat-app/.gitignore +++ b/polyglot-chat-app/.gitignore @@ -12,3 +12,4 @@ out/ .settings .classpath .factorypath +src/main/resources/venv/pyvenv.cfg \ No newline at end of file diff --git a/polyglot-chat-app/README.md b/polyglot-chat-app/README.md index a322464bc..9e2027d80 100644 --- a/polyglot-chat-app/README.md +++ b/polyglot-chat-app/README.md @@ -1,69 +1,84 @@ # Polyglot Chat Application -This example demonstrates how to integrate Python on GraalVM with a Micronaut application. -The application uses the Gradle build tool. - -### Prerequisites -- [Native Image](https://www.graalvm.org/latest/reference-manual/native-image/) -- [Python support](https://www.graalvm.org/latest/reference-manual/python/) +This example demonstrates how to integrate Python in a Micronaut Java application using the Gradle build tool. +The application uses the [Natural Language Toolkit (nltk)](https://www.nltk.org/) module to analyze the sentiment of user input. +The example also shows how to create a native executable from the application using GraalVM. ## Preparation -1. Download the latest GraalPy as described on [https://www.graalvm.org/python/](https://www.graalvm.org/python/). For example on Linux: - ```bash - wget https://github.com/oracle/graalpython/releases/download/graal-23.1.1/graalpy-23.1.1-linux-amd64.tar.gz - tar xzf graalpy-23.1.1-linux-amd64.tar.gz - ``` +1. Download or clone the GraalVM demos repository and navigate into the _polyglot-chat-app_ directory: + ```bash + git clone https://github.com/graalvm/graalvm-demos + ``` + ```bash + cd graalvm-demos/polyglot-chat-app + ``` -2. Install the required packages for this demo into the _resources_ directory: +2. Download and install the latest GraalPy as described in the [Getting Started guide](https://www.graalvm.org/latest/reference-manual/python/#installing-graalpy). For example: + ```bash + pyenv install graalpy-23.1.2 + pyenv shell graalpy-23.1.2 + ``` + +3. Create a virtual environment for the demo in the _resources_ directory, activate it, install the required package, and download a lexicon: + ```bash + graalpy -m venv src/main/resources/venv + ``` + ```bash + source src/main/resources/venv/bin/activate + ``` + ```bash + graalpy -m pip install nltk + ``` ```bash - graalpy-23.1.1-linux-amd64/bin/graalpy -m venv src/main/resources/venv - src/main/resources/venv/bin/graalpy -m pip install nltk + graalpy -c "import nltk; nltk.download('vader_lexicon')" ``` -3. Optional: Download and install GraalVM JDK for Java 21 or later to run Python with runtime compilation and to build a native image. - The demo will work on any OpenJDK distribution, but will be much faster on GraalVM JDK. +4. The demo will work with any OpenJDK distribution, but will be much faster on [GraalVM JDK for Java 21](https://www.graalvm.org/downloads/). -## Building and Running the application: -1. Build application with Gradle: - ```bash - ./gradlew run - ``` +## Building and Running the Application -2. Navigate to http://localhost:12345/#/chat/bob +1. Build and run the application using Gradle: + ```bash + ./gradlew run + ``` + +2. Navigate to [http://localhost:12345/#/chat/bob](http://localhost:12345/#/chat/bob). You can connect from multiple browsers and chat via websockets. - The Python code will load a language model in the background. - Once it is ready, it will analyse the sentiments of all messages and add an emoji to the message to indicate the feelings conveyed. + The Python code loads a language model in the background—this can take up to 5 minutes. + Once it is ready, it analyzes the sentiments of messages and add an emoji to each message to indicate the feelings conveyed. A chat may look like this (newest message at the top): ``` [bob 😀] awesome, GraalVM and GraalPy rock! [bob 🫥] are we done yet? - [bob 💬] still loading the sentiment model I believe + [bob 💬] Joined! ``` -## Building a Native Image +## (Optional) Building a Native Executable + +> Note: this requires [GraalVM JDK for Java 21](https://www.graalvm.org/downloads/) or later. -The application can be AOT compiled using GraalVM Native Image. -The Python code has to be shipped in a _resources_ directory that is kept next to the native executable. +The application can be compiled ahead-of-time to a native executable using GraalVM Native Image. +The Python code must be copied to the _build/_ directory that is kept next to the native executable. -1. Build a native executable with the Micronaut AOT support: +1. Build a native executable using Micronaut AOT support: ```bash ./gradlew nativeCompile ``` -2. Copy the venv into the output _resources_ directory: +2. Copy the _venv_ directory into the output _resources_ directory: ```bash cp -R src/main/resources/venv/ build/native/nativeCompile/resources/python/ ``` 3. Run the native executable: ```bash - build/native/nativeCompile/websocket.chat + ./build/native/nativeCompile/websocket.chat ``` ### Learn More -Learn more about GraalVM polyglot capabilities [here](https://www.graalvm.org/latest/reference-manual/polyglot-programming/). +Learn more about GraalVM polyglot capabilities [here](https://www.graalvm.org/latest/reference-manual/polyglot-programming/). \ No newline at end of file diff --git a/polyglot-chat-app/build.gradle b/polyglot-chat-app/build.gradle index 13ee35663..7e7b05a9f 100644 --- a/polyglot-chat-app/build.gradle +++ b/polyglot-chat-app/build.gradle @@ -31,9 +31,9 @@ dependencies { implementation("jakarta.inject:jakarta.inject-api:2.0.1") - implementation("org.graalvm.sdk:graal-sdk:23.1.1") - implementation("org.graalvm.polyglot:python:23.1.1") - implementation("org.graalvm.sdk:nativeimage:23.1.1") + implementation("org.graalvm.sdk:graal-sdk:23.1.2") + implementation("org.graalvm.polyglot:python:23.1.2") + implementation("org.graalvm.sdk:nativeimage:23.1.2") } @@ -65,7 +65,4 @@ micronaut { deduceEnvironment = true optimizeNetty = true } -} - - - +} \ No newline at end of file diff --git a/polyglot-chat-app/settings.gradle b/polyglot-chat-app/settings.gradle index 58a866b02..3c62226ef 100644 --- a/polyglot-chat-app/settings.gradle +++ b/polyglot-chat-app/settings.gradle @@ -1,3 +1 @@ - rootProject.name="websocket.chat" -