From 84395c1ecf14e2967dd40ebaa268d14a23c036de Mon Sep 17 00:00:00 2001 From: Clement Escoffier Date: Wed, 2 Oct 2024 14:36:01 +0200 Subject: [PATCH 1/2] Fix ONNX Runtime Execution in Native Executable The ONNX Runtime, which relies on JNI, requires specific configuration for native image compilation due to its unique code structure. This commit adds the necessary JNI configurations to ensure native execution. Additionally, it consolidates the native instructions related to the ONNX Runtime by moving them from being spread across `core` and `base-parsers` to solely within the `core` module. This change reflects the broader applicability of local / in-process embedding models (requiring the ONNX Runtime) beyond RAG use cases. --- .../InProcessEmbeddingProcessor.java | 35 +++++---- .../deployment/OnnxRuntimeProcessor.java | 77 +++++++++++++++++++ .../RequireOnnxRuntimeBuildItem.java | 9 +++ .../items/InProcessEmbeddingBuildItem.java | 10 +++ .../embed-all-minilm-l6-v2/pom.xml | 20 ++--- .../acme/test/InProcessEmbeddingResource.java | 1 + .../base/DocumentSupportProcessor.java | 34 -------- 7 files changed, 126 insertions(+), 60 deletions(-) create mode 100644 core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/OnnxRuntimeProcessor.java create mode 100644 core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/RequireOnnxRuntimeBuildItem.java diff --git a/core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/InProcessEmbeddingProcessor.java b/core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/InProcessEmbeddingProcessor.java index 162838ed5..a4396ad65 100644 --- a/core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/InProcessEmbeddingProcessor.java +++ b/core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/InProcessEmbeddingProcessor.java @@ -23,6 +23,7 @@ import io.quarkus.deployment.annotations.Record; import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem; import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem; +import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem; /** * Generate a local embedding build item for each local embedding model available in the classpath. @@ -82,6 +83,16 @@ public void generateLocalEmbeddingBuildItems(BuildProducer embedding, BuildProducer producer) { + for (InProcessEmbeddingBuildItem item : embedding) { + if (item.requireOnnxRuntime()) { + producer.produce(new RequireOnnxRuntimeBuildItem()); + break; + } + } + } + // Expose a bean for each in process embedding model @BuildStep @Record(ExecutionTime.RUNTIME_INIT) @@ -108,25 +119,23 @@ void exposeInProcessEmbeddingBeans(InProcessEmbeddingRecorder recorder, } } + private void addQualifierIfNecessary(SyntheticBeanBuildItem.ExtendedBeanConfigurator builder, String configName) { + if (!NamedConfigUtil.isDefault(configName)) { + builder.addQualifier(AnnotationInstance.builder(ModelName.class).add("value", configName).build()); + } + } + @BuildStep - void includeInProcessEmbeddingModelsInNativeExecutable( - List inProcessEmbeddingBuildItems, + void configureNativeExecutableForInProcessEmbedding(List embeddings, + BuildProducer classes, BuildProducer resources, BuildProducer reflection) { - for (InProcessEmbeddingBuildItem inProcessEmbeddingBuildItem : inProcessEmbeddingBuildItems) { + for (InProcessEmbeddingBuildItem inProcessEmbeddingBuildItem : embeddings) { + classes.produce(new RuntimeInitializedClassBuildItem(inProcessEmbeddingBuildItem.className())); resources.produce(new NativeImageResourceBuildItem(inProcessEmbeddingBuildItem.onnxModelPath())); resources.produce(new NativeImageResourceBuildItem(inProcessEmbeddingBuildItem.vocabularyPath())); reflection.produce(ReflectiveClassBuildItem.builder(inProcessEmbeddingBuildItem.className()) - .constructors(true) - .fields(true) - .methods(true) - .build()); - } - } - - private void addQualifierIfNecessary(SyntheticBeanBuildItem.ExtendedBeanConfigurator builder, String configName) { - if (!NamedConfigUtil.isDefault(configName)) { - builder.addQualifier(AnnotationInstance.builder(ModelName.class).add("value", configName).build()); + .constructors().fields().methods().build()); } } } diff --git a/core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/OnnxRuntimeProcessor.java b/core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/OnnxRuntimeProcessor.java new file mode 100644 index 000000000..cba597e98 --- /dev/null +++ b/core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/OnnxRuntimeProcessor.java @@ -0,0 +1,77 @@ +package io.quarkiverse.langchain4j.deployment; + +import java.util.List; +import java.util.stream.Stream; + +import io.quarkiverse.langchain4j.deployment.items.InProcessEmbeddingBuildItem; +import io.quarkus.bootstrap.classloading.QuarkusClassLoader; +import io.quarkus.deployment.annotations.BuildProducer; +import io.quarkus.deployment.annotations.BuildStep; +import io.quarkus.deployment.annotations.Consume; +import io.quarkus.deployment.builditem.nativeimage.JniRuntimeAccessBuildItem; +import io.quarkus.deployment.builditem.nativeimage.NativeImageResourcePatternsBuildItem; +import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem; +import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem; +import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedPackageBuildItem; + +/** + * A processor configuring the native image build for the OnnxRuntime. + * Only enabled if the `RequireOnnxRuntimeBuildItem` build item is present. + */ +public class OnnxRuntimeProcessor { + + @BuildStep + @Consume(RequireOnnxRuntimeBuildItem.class) + void onxxRuntimeNative( + BuildProducer nativePatternProducer, + BuildProducer reflectionProducer, + BuildProducer jniProducer) { + List classesInstantiatedFromNative = List.of( + "ai.onnxruntime.TensorInfo", + "ai.onnxruntime.SequenceInfo", + "ai.onnxruntime.MapInfo", + "ai.onnxruntime.OrtException", + "ai.onnxruntime.OnnxSparseTensor"); + + reflectionProducer.produce( + ReflectiveClassBuildItem.builder(classesInstantiatedFromNative.toArray(new String[0])) + .fields().methods().constructors().build()); + + jniProducer.produce( + new JniRuntimeAccessBuildItem(true, true, true, classesInstantiatedFromNative.toArray(new String[0]))); + + // TODO should only select the target architecture's libs + nativePatternProducer + .produce(NativeImageResourcePatternsBuildItem.builder() + .includeGlobs("ai/onnxruntime/native/**", "native/lib/**").build()); + + reflectionProducer + .produce(ReflectiveClassBuildItem.builder("opennlp.tools.sentdetect.SentenceDetectorFactory").build()); + reflectionProducer.produce( + ReflectiveClassBuildItem.builder("ai.onnxruntime.OnnxTensor").methods().fields().constructors().build()); + } + + @BuildStep + @Consume(RequireOnnxRuntimeBuildItem.class) + void onnxRuntimeClasses( + List inProcessEmbeddingBuildItems, + BuildProducer classProducer, + BuildProducer packageProducer) { + Stream.of( + "dev.langchain4j.model.embedding.OnnxBertBiEncoder", + "dev.langchain4j.model.embedding.HuggingFaceTokenizer", + "ai.djl.huggingface.tokenizers.HuggingFaceTokenizer", + "ai.djl.huggingface.tokenizers.jni.TokenizersLibrary", + "ai.djl.huggingface.tokenizers.jni.LibUtils", + "ai.djl.util.Platform", + "ai.onnxruntime.OrtEnvironment", + "ai.onnxruntime.OnnxRuntime", + "ai.onnxruntime.OnnxTensorLike", + "ai.onnxruntime.OrtAllocator", + "ai.onnxruntime.OrtSession$SessionOptions", + "ai.onnxruntime.OrtSession") + .filter(QuarkusClassLoader::isClassPresentAtRuntime) + .map(RuntimeInitializedClassBuildItem::new).forEach(classProducer::produce); + } + +} diff --git a/core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/RequireOnnxRuntimeBuildItem.java b/core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/RequireOnnxRuntimeBuildItem.java new file mode 100644 index 000000000..8f5ce9e8d --- /dev/null +++ b/core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/RequireOnnxRuntimeBuildItem.java @@ -0,0 +1,9 @@ +package io.quarkiverse.langchain4j.deployment; + +import io.quarkus.builder.item.SimpleBuildItem; + +/** + * A build item that is used to require the OnnxRuntime to be built into the native image. + */ +public final class RequireOnnxRuntimeBuildItem extends SimpleBuildItem { +} diff --git a/core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/items/InProcessEmbeddingBuildItem.java b/core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/items/InProcessEmbeddingBuildItem.java index 091ca8641..de0108869 100644 --- a/core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/items/InProcessEmbeddingBuildItem.java +++ b/core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/items/InProcessEmbeddingBuildItem.java @@ -9,12 +9,22 @@ public final class InProcessEmbeddingBuildItem extends MultiBuildItem implements private final String vocabularyPath; private final String className; + private boolean requireOnnxRuntime; public InProcessEmbeddingBuildItem(String modelName, String className, String onnxModelPath, String vocabularyPath) { this.modelName = modelName; this.className = className; this.onnxModelPath = onnxModelPath; this.vocabularyPath = vocabularyPath; + this.requireOnnxRuntime = true; + } + + public boolean requireOnnxRuntime() { + return requireOnnxRuntime; + } + + public void setRequireOnnxRuntime(boolean requireOnnxRuntime) { + this.requireOnnxRuntime = requireOnnxRuntime; } public String modelName() { diff --git a/integration-tests/embed-all-minilm-l6-v2/pom.xml b/integration-tests/embed-all-minilm-l6-v2/pom.xml index 4bbdd9d96..85d6435c6 100644 --- a/integration-tests/embed-all-minilm-l6-v2/pom.xml +++ b/integration-tests/embed-all-minilm-l6-v2/pom.xml @@ -11,23 +11,17 @@ quarkus-langchain4j-integration-test-embed-all-minilm-l6-v2 Quarkus LangChain4j - Integration Tests - embeddings-all-minilm-l6-v2 - - - io.quarkiverse.langchain4j - quarkus-langchain4j-parsers-base - ${project.version} - - + dev.langchain4j langchain4j-embeddings-all-minilm-l6-v2 ${langchain4j-embeddings.version} - - - dev.langchain4j - langchain4j-core - - + + + + io.quarkiverse.langchain4j + quarkus-langchain4j-core + ${project.version} diff --git a/integration-tests/embed-all-minilm-l6-v2/src/main/java/org/acme/test/InProcessEmbeddingResource.java b/integration-tests/embed-all-minilm-l6-v2/src/main/java/org/acme/test/InProcessEmbeddingResource.java index c1fae5b8b..c74b55da0 100644 --- a/integration-tests/embed-all-minilm-l6-v2/src/main/java/org/acme/test/InProcessEmbeddingResource.java +++ b/integration-tests/embed-all-minilm-l6-v2/src/main/java/org/acme/test/InProcessEmbeddingResource.java @@ -18,6 +18,7 @@ public class InProcessEmbeddingResource { @POST public String computeEmbedding(String sentence) { + var r1 = allMiniLmL6V2QuantizedEmbeddingModel.embed(sentence); var r2 = embeddingModel.embed(sentence); diff --git a/rag/parsers-base/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/parsers/base/DocumentSupportProcessor.java b/rag/parsers-base/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/parsers/base/DocumentSupportProcessor.java index 220803741..cb848519a 100644 --- a/rag/parsers-base/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/parsers/base/DocumentSupportProcessor.java +++ b/rag/parsers-base/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/parsers/base/DocumentSupportProcessor.java @@ -12,8 +12,6 @@ import io.quarkus.deployment.annotations.BuildProducer; import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.builditem.LogCategoryBuildItem; -import io.quarkus.deployment.builditem.nativeimage.NativeImageResourcePatternsBuildItem; -import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem; import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem; import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedPackageBuildItem; @@ -23,41 +21,12 @@ */ public class DocumentSupportProcessor { - @BuildStep - void nativeResources( - List inProcessEmbeddingBuildItems, - BuildProducer nativePatternProducer, - BuildProducer reflectionProducer) { - if (!inProcessEmbeddingBuildItems.isEmpty()) { - // TODO: we can do better here and only include the target architecture's libs - nativePatternProducer - .produce(NativeImageResourcePatternsBuildItem.builder() - .includeGlobs("ai/onnxruntime/native/**", "native/lib/**").build()); - - reflectionProducer - .produce(ReflectiveClassBuildItem.builder("opennlp.tools.sentdetect.SentenceDetectorFactory").build()); - reflectionProducer.produce(ReflectiveClassBuildItem.builder("ai.onnxruntime.OnnxTensor").methods(true).build()); - } - } - @BuildStep void runtimeClasses( List inProcessEmbeddingBuildItems, BuildProducer classProducer, BuildProducer packageProducer) { Stream.of( - "dev.langchain4j.model.embedding.OnnxBertBiEncoder", - "dev.langchain4j.model.embedding.HuggingFaceTokenizer", - "ai.djl.huggingface.tokenizers.HuggingFaceTokenizer", - "ai.djl.huggingface.tokenizers.jni.TokenizersLibrary", - "ai.djl.huggingface.tokenizers.jni.LibUtils", - "ai.djl.util.Platform", - "ai.onnxruntime.OrtEnvironment", - "ai.onnxruntime.OnnxRuntime", - "ai.onnxruntime.OnnxTensorLike", - "ai.onnxruntime.OrtAllocator", - "ai.onnxruntime.OrtSession$SessionOptions", - "ai.onnxruntime.OrtSession", "org.apache.fontbox.ttf.RAFDataStream", "org.apache.fontbox.ttf.TTFParser", "org.apache.pdfbox.pdmodel.encrypetion.PublicKeySecurityHandler", @@ -75,9 +44,6 @@ void runtimeClasses( .filter(QuarkusClassLoader::isClassPresentAtRuntime) .map(RuntimeInitializedClassBuildItem::new).forEach(classProducer::produce); - for (InProcessEmbeddingBuildItem inProcessEmbeddingBuildItem : inProcessEmbeddingBuildItems) { - classProducer.produce(new RuntimeInitializedClassBuildItem(inProcessEmbeddingBuildItem.className())); - } classProducer.produce(new RuntimeInitializedClassBuildItem(CompressingQueryTransformer.class.getName())); classProducer.produce(new RuntimeInitializedClassBuildItem(CompressorStreamFactory.class.getName())); classProducer.produce(new RuntimeInitializedClassBuildItem( From ca5e2e64b33a47f1168e2928a36810c1c116028e Mon Sep 17 00:00:00 2001 From: Clement Escoffier Date: Wed, 2 Oct 2024 15:33:47 +0200 Subject: [PATCH 2/2] Update the CI builds to run the in-process embedding models native integration tests - Refactor the in-process embedding models integration tests to run in the native executable - Update the PR and _main_ CI builds to run with more Java versions - Do not skip the in-process embedding models integration tests in the PR build --- .github/workflows/build-pull-request.yml | 35 ++++++------------- .github/workflows/build-push.yml | 6 +--- .../embed-all-minilm-l6-v2-q/pom.xml | 13 +------ .../acme/test/InProcessEmbeddingResource.java | 0 .../src/main/resources/application.properties | 0 .../test/InProcessEmbeddingResourceIT.java | 0 .../test/InProcessEmbeddingResourceTest.java | 0 .../embed-all-minilm-l6-v2/pom.xml | 2 +- .../acme/test/InProcessEmbeddingResource.java | 0 .../src/main/resources/application.properties | 0 .../test/InProcessEmbeddingResourceIT.java | 0 .../test/InProcessEmbeddingResourceTest.java | 0 .../embed-bge-small-en-q/pom.xml | 20 ++++------- .../acme/test/InProcessEmbeddingResource.java | 0 .../src/main/resources/application.properties | 0 .../test/InProcessEmbeddingResourceIT.java | 0 .../test/InProcessEmbeddingResourceTest.java | 0 .../embed-bge-small-en/pom.xml | 20 ++++------- .../acme/test/InProcessEmbeddingResource.java | 0 .../src/main/resources/application.properties | 0 .../test/InProcessEmbeddingResourceIT.java | 0 .../test/InProcessEmbeddingResourceTest.java | 0 .../embed-e5-small-v2-q/pom.xml | 20 ++++------- .../acme/test/InProcessEmbeddingResource.java | 0 .../src/main/resources/application.properties | 0 .../test/InProcessEmbeddingResourceIT.java | 0 .../test/InProcessEmbeddingResourceTest.java | 0 .../embed-e5-small-v2/pom.xml | 20 ++++------- .../acme/test/InProcessEmbeddingResource.java | 0 .../src/main/resources/application.properties | 0 .../test/InProcessEmbeddingResourceIT.java | 0 .../test/InProcessEmbeddingResourceTest.java | 0 .../in-process-embedding-models/pom.xml | 22 ++++++++++++ integration-tests/pom.xml | 7 +--- 34 files changed, 64 insertions(+), 101 deletions(-) rename integration-tests/{ => in-process-embedding-models}/embed-all-minilm-l6-v2-q/pom.xml (88%) rename integration-tests/{ => in-process-embedding-models}/embed-all-minilm-l6-v2-q/src/main/java/org/acme/test/InProcessEmbeddingResource.java (100%) rename integration-tests/{ => in-process-embedding-models}/embed-all-minilm-l6-v2-q/src/main/resources/application.properties (100%) rename integration-tests/{ => in-process-embedding-models}/embed-all-minilm-l6-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java (100%) rename integration-tests/{ => in-process-embedding-models}/embed-all-minilm-l6-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java (100%) rename integration-tests/{ => in-process-embedding-models}/embed-all-minilm-l6-v2/pom.xml (97%) rename integration-tests/{ => in-process-embedding-models}/embed-all-minilm-l6-v2/src/main/java/org/acme/test/InProcessEmbeddingResource.java (100%) rename integration-tests/{ => in-process-embedding-models}/embed-all-minilm-l6-v2/src/main/resources/application.properties (100%) rename integration-tests/{ => in-process-embedding-models}/embed-all-minilm-l6-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java (100%) rename integration-tests/{ => in-process-embedding-models}/embed-all-minilm-l6-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java (100%) rename integration-tests/{ => in-process-embedding-models}/embed-bge-small-en-q/pom.xml (91%) rename integration-tests/{ => in-process-embedding-models}/embed-bge-small-en-q/src/main/java/org/acme/test/InProcessEmbeddingResource.java (100%) rename integration-tests/{ => in-process-embedding-models}/embed-bge-small-en-q/src/main/resources/application.properties (100%) rename integration-tests/{ => in-process-embedding-models}/embed-bge-small-en-q/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java (100%) rename integration-tests/{ => in-process-embedding-models}/embed-bge-small-en-q/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java (100%) rename integration-tests/{ => in-process-embedding-models}/embed-bge-small-en/pom.xml (91%) rename integration-tests/{ => in-process-embedding-models}/embed-bge-small-en/src/main/java/org/acme/test/InProcessEmbeddingResource.java (100%) rename integration-tests/{ => in-process-embedding-models}/embed-bge-small-en/src/main/resources/application.properties (100%) rename integration-tests/{ => in-process-embedding-models}/embed-bge-small-en/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java (100%) rename integration-tests/{ => in-process-embedding-models}/embed-bge-small-en/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java (100%) rename integration-tests/{ => in-process-embedding-models}/embed-e5-small-v2-q/pom.xml (92%) rename integration-tests/{ => in-process-embedding-models}/embed-e5-small-v2-q/src/main/java/org/acme/test/InProcessEmbeddingResource.java (100%) rename integration-tests/{ => in-process-embedding-models}/embed-e5-small-v2-q/src/main/resources/application.properties (100%) rename integration-tests/{ => in-process-embedding-models}/embed-e5-small-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java (100%) rename integration-tests/{ => in-process-embedding-models}/embed-e5-small-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java (100%) rename integration-tests/{ => in-process-embedding-models}/embed-e5-small-v2/pom.xml (92%) rename integration-tests/{ => in-process-embedding-models}/embed-e5-small-v2/src/main/java/org/acme/test/InProcessEmbeddingResource.java (100%) rename integration-tests/{ => in-process-embedding-models}/embed-e5-small-v2/src/main/resources/application.properties (100%) rename integration-tests/{ => in-process-embedding-models}/embed-e5-small-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java (100%) rename integration-tests/{ => in-process-embedding-models}/embed-e5-small-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java (100%) create mode 100644 integration-tests/in-process-embedding-models/pom.xml diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index 8b59658d7..7d817cfe0 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -20,29 +20,21 @@ defaults: shell: bash jobs: + # Build the project, no native tests. build-and-test-jvm: - name: Build on ${{ matrix.os }} - ${{ matrix.java }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest] - java: [17] - runs-on: ${{ matrix.os }} + name: Main Build + runs-on: ubuntu-latest outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - - name: Prepare git - run: git config --global core.autocrlf false - if: startsWith(matrix.os, 'windows') - - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - name: Set up JDK ${{ matrix.java }} + - name: Set up JDK 17 uses: actions/setup-java@v4 with: distribution: temurin - java-version: ${{ matrix.java }} + java-version: 17 cache: 'maven' - name: Build with Maven @@ -65,33 +57,27 @@ jobs: run: | cd integration-tests # skip RAG module as it doesn't have any native-compatible tests now - # skip 'embed' modules (with in-process embeddings) and others that don't work in native - # FIXME: reenable embedding modules, see https://github.com/quarkiverse/quarkus-langchain4j/issues/394 MATRIX='{"testModule":'$( \ find . -mindepth 2 -maxdepth 2 -type f -name 'pom.xml' -exec dirname {} \; \ | sed 's|^\./||' \ | sort -u \ | grep -v rag \ - | grep -v embed \ | grep -v jlama \ | jq -R -s -c 'split("\n")[:-1]' \ )'}' echo "matrix=$MATRIX" >> $GITHUB_OUTPUT + # Test the project with different JDKs. test-jvm-alt: - name: Test on ${{ matrix.os }} - ${{ matrix.java }} strategy: fail-fast: false matrix: os: [ubuntu-latest] - java: [21] + java: [21, 22, 23] + name: Test on ${{ matrix.os }} - ${{ matrix.java }} runs-on: ${{ matrix.os }} steps: - - name: Prepare git - run: git config --global core.autocrlf false - if: startsWith(matrix.os, 'windows') - - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK ${{ matrix.java }} uses: actions/setup-java@v4 @@ -116,7 +102,6 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - name: Set up JDK 17 diff --git a/.github/workflows/build-push.yml b/.github/workflows/build-push.yml index 0a7421652..ef0098df8 100644 --- a/.github/workflows/build-push.yml +++ b/.github/workflows/build-push.yml @@ -28,13 +28,9 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest] - java: [17, 21] + java: [17, 21, 22, 23] runs-on: ${{ matrix.os }} steps: - - name: Prepare git - run: git config --global core.autocrlf false - if: startsWith(matrix.os, 'windows') - - uses: actions/checkout@v3 - name: Set up JDK ${{ matrix.java }} uses: actions/setup-java@v3 diff --git a/integration-tests/embed-all-minilm-l6-v2-q/pom.xml b/integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2-q/pom.xml similarity index 88% rename from integration-tests/embed-all-minilm-l6-v2-q/pom.xml rename to integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2-q/pom.xml index 616d2da9e..10e116b01 100644 --- a/integration-tests/embed-all-minilm-l6-v2-q/pom.xml +++ b/integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2-q/pom.xml @@ -4,7 +4,7 @@ io.quarkiverse.langchain4j - quarkus-langchain4j-integration-tests-parent + quarkus-langchain4j-integration-tests-in-process-embedding-models 999-SNAPSHOT @@ -12,11 +12,6 @@ Quarkus LangChain4j - Integration Tests - embeddings-all-minilm-l6-v2-q - - io.quarkiverse.langchain4j - quarkus-langchain4j-parsers-base - ${project.version} - io.quarkiverse.langchain4j quarkus-langchain4j-core @@ -27,12 +22,6 @@ dev.langchain4j langchain4j-embeddings-all-minilm-l6-v2-q ${langchain4j-embeddings.version} - - - dev.langchain4j - langchain4j-core - - diff --git a/integration-tests/embed-all-minilm-l6-v2-q/src/main/java/org/acme/test/InProcessEmbeddingResource.java b/integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2-q/src/main/java/org/acme/test/InProcessEmbeddingResource.java similarity index 100% rename from integration-tests/embed-all-minilm-l6-v2-q/src/main/java/org/acme/test/InProcessEmbeddingResource.java rename to integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2-q/src/main/java/org/acme/test/InProcessEmbeddingResource.java diff --git a/integration-tests/embed-all-minilm-l6-v2-q/src/main/resources/application.properties b/integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2-q/src/main/resources/application.properties similarity index 100% rename from integration-tests/embed-all-minilm-l6-v2-q/src/main/resources/application.properties rename to integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2-q/src/main/resources/application.properties diff --git a/integration-tests/embed-all-minilm-l6-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java b/integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java similarity index 100% rename from integration-tests/embed-all-minilm-l6-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java rename to integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java diff --git a/integration-tests/embed-all-minilm-l6-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java b/integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java similarity index 100% rename from integration-tests/embed-all-minilm-l6-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java rename to integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java diff --git a/integration-tests/embed-all-minilm-l6-v2/pom.xml b/integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2/pom.xml similarity index 97% rename from integration-tests/embed-all-minilm-l6-v2/pom.xml rename to integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2/pom.xml index 85d6435c6..e15f28b93 100644 --- a/integration-tests/embed-all-minilm-l6-v2/pom.xml +++ b/integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2/pom.xml @@ -4,7 +4,7 @@ io.quarkiverse.langchain4j - quarkus-langchain4j-integration-tests-parent + quarkus-langchain4j-integration-tests-in-process-embedding-models 999-SNAPSHOT diff --git a/integration-tests/embed-all-minilm-l6-v2/src/main/java/org/acme/test/InProcessEmbeddingResource.java b/integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2/src/main/java/org/acme/test/InProcessEmbeddingResource.java similarity index 100% rename from integration-tests/embed-all-minilm-l6-v2/src/main/java/org/acme/test/InProcessEmbeddingResource.java rename to integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2/src/main/java/org/acme/test/InProcessEmbeddingResource.java diff --git a/integration-tests/embed-all-minilm-l6-v2/src/main/resources/application.properties b/integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2/src/main/resources/application.properties similarity index 100% rename from integration-tests/embed-all-minilm-l6-v2/src/main/resources/application.properties rename to integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2/src/main/resources/application.properties diff --git a/integration-tests/embed-all-minilm-l6-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java b/integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java similarity index 100% rename from integration-tests/embed-all-minilm-l6-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java rename to integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java diff --git a/integration-tests/embed-all-minilm-l6-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java b/integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java similarity index 100% rename from integration-tests/embed-all-minilm-l6-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java rename to integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java diff --git a/integration-tests/embed-bge-small-en-q/pom.xml b/integration-tests/in-process-embedding-models/embed-bge-small-en-q/pom.xml similarity index 91% rename from integration-tests/embed-bge-small-en-q/pom.xml rename to integration-tests/in-process-embedding-models/embed-bge-small-en-q/pom.xml index 284cbc2c2..1291ab680 100644 --- a/integration-tests/embed-bge-small-en-q/pom.xml +++ b/integration-tests/in-process-embedding-models/embed-bge-small-en-q/pom.xml @@ -4,7 +4,7 @@ io.quarkiverse.langchain4j - quarkus-langchain4j-integration-tests-parent + quarkus-langchain4j-integration-tests-in-process-embedding-models 999-SNAPSHOT @@ -12,22 +12,16 @@ Quarkus LangChain4j - Integration Tests - embeddings-bge-small-en-q - - io.quarkiverse.langchain4j - quarkus-langchain4j-parsers-base - ${project.version} - - dev.langchain4j langchain4j-embeddings-bge-small-en-q ${langchain4j-embeddings.version} - - - dev.langchain4j - langchain4j-core - - + + + + io.quarkiverse.langchain4j + quarkus-langchain4j-core + ${project.version} diff --git a/integration-tests/embed-bge-small-en-q/src/main/java/org/acme/test/InProcessEmbeddingResource.java b/integration-tests/in-process-embedding-models/embed-bge-small-en-q/src/main/java/org/acme/test/InProcessEmbeddingResource.java similarity index 100% rename from integration-tests/embed-bge-small-en-q/src/main/java/org/acme/test/InProcessEmbeddingResource.java rename to integration-tests/in-process-embedding-models/embed-bge-small-en-q/src/main/java/org/acme/test/InProcessEmbeddingResource.java diff --git a/integration-tests/embed-bge-small-en-q/src/main/resources/application.properties b/integration-tests/in-process-embedding-models/embed-bge-small-en-q/src/main/resources/application.properties similarity index 100% rename from integration-tests/embed-bge-small-en-q/src/main/resources/application.properties rename to integration-tests/in-process-embedding-models/embed-bge-small-en-q/src/main/resources/application.properties diff --git a/integration-tests/embed-bge-small-en-q/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java b/integration-tests/in-process-embedding-models/embed-bge-small-en-q/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java similarity index 100% rename from integration-tests/embed-bge-small-en-q/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java rename to integration-tests/in-process-embedding-models/embed-bge-small-en-q/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java diff --git a/integration-tests/embed-bge-small-en-q/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java b/integration-tests/in-process-embedding-models/embed-bge-small-en-q/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java similarity index 100% rename from integration-tests/embed-bge-small-en-q/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java rename to integration-tests/in-process-embedding-models/embed-bge-small-en-q/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java diff --git a/integration-tests/embed-bge-small-en/pom.xml b/integration-tests/in-process-embedding-models/embed-bge-small-en/pom.xml similarity index 91% rename from integration-tests/embed-bge-small-en/pom.xml rename to integration-tests/in-process-embedding-models/embed-bge-small-en/pom.xml index 98072c1fd..b60da273b 100644 --- a/integration-tests/embed-bge-small-en/pom.xml +++ b/integration-tests/in-process-embedding-models/embed-bge-small-en/pom.xml @@ -4,7 +4,7 @@ io.quarkiverse.langchain4j - quarkus-langchain4j-integration-tests-parent + quarkus-langchain4j-integration-tests-in-process-embedding-models 999-SNAPSHOT @@ -12,22 +12,16 @@ Quarkus LangChain4j - Integration Tests - embeddings-bge-small-en - - io.quarkiverse.langchain4j - quarkus-langchain4j-parsers-base - ${project.version} - - dev.langchain4j langchain4j-embeddings-bge-small-en ${langchain4j-embeddings.version} - - - dev.langchain4j - langchain4j-core - - + + + + io.quarkiverse.langchain4j + quarkus-langchain4j-core + ${project.version} diff --git a/integration-tests/embed-bge-small-en/src/main/java/org/acme/test/InProcessEmbeddingResource.java b/integration-tests/in-process-embedding-models/embed-bge-small-en/src/main/java/org/acme/test/InProcessEmbeddingResource.java similarity index 100% rename from integration-tests/embed-bge-small-en/src/main/java/org/acme/test/InProcessEmbeddingResource.java rename to integration-tests/in-process-embedding-models/embed-bge-small-en/src/main/java/org/acme/test/InProcessEmbeddingResource.java diff --git a/integration-tests/embed-bge-small-en/src/main/resources/application.properties b/integration-tests/in-process-embedding-models/embed-bge-small-en/src/main/resources/application.properties similarity index 100% rename from integration-tests/embed-bge-small-en/src/main/resources/application.properties rename to integration-tests/in-process-embedding-models/embed-bge-small-en/src/main/resources/application.properties diff --git a/integration-tests/embed-bge-small-en/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java b/integration-tests/in-process-embedding-models/embed-bge-small-en/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java similarity index 100% rename from integration-tests/embed-bge-small-en/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java rename to integration-tests/in-process-embedding-models/embed-bge-small-en/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java diff --git a/integration-tests/embed-bge-small-en/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java b/integration-tests/in-process-embedding-models/embed-bge-small-en/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java similarity index 100% rename from integration-tests/embed-bge-small-en/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java rename to integration-tests/in-process-embedding-models/embed-bge-small-en/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java diff --git a/integration-tests/embed-e5-small-v2-q/pom.xml b/integration-tests/in-process-embedding-models/embed-e5-small-v2-q/pom.xml similarity index 92% rename from integration-tests/embed-e5-small-v2-q/pom.xml rename to integration-tests/in-process-embedding-models/embed-e5-small-v2-q/pom.xml index 0b032608d..7a908ab8f 100644 --- a/integration-tests/embed-e5-small-v2-q/pom.xml +++ b/integration-tests/in-process-embedding-models/embed-e5-small-v2-q/pom.xml @@ -4,7 +4,7 @@ io.quarkiverse.langchain4j - quarkus-langchain4j-integration-tests-parent + quarkus-langchain4j-integration-tests-in-process-embedding-models 999-SNAPSHOT @@ -12,22 +12,16 @@ Quarkus LangChain4j - Integration Tests - embeddings-e5-small-v2-q - - io.quarkiverse.langchain4j - quarkus-langchain4j-parsers-base - ${project.version} - - dev.langchain4j langchain4j-embeddings-e5-small-v2-q ${langchain4j-embeddings.version} - - - dev.langchain4j - langchain4j-core - - + + + + io.quarkiverse.langchain4j + quarkus-langchain4j-core + ${project.version} diff --git a/integration-tests/embed-e5-small-v2-q/src/main/java/org/acme/test/InProcessEmbeddingResource.java b/integration-tests/in-process-embedding-models/embed-e5-small-v2-q/src/main/java/org/acme/test/InProcessEmbeddingResource.java similarity index 100% rename from integration-tests/embed-e5-small-v2-q/src/main/java/org/acme/test/InProcessEmbeddingResource.java rename to integration-tests/in-process-embedding-models/embed-e5-small-v2-q/src/main/java/org/acme/test/InProcessEmbeddingResource.java diff --git a/integration-tests/embed-e5-small-v2-q/src/main/resources/application.properties b/integration-tests/in-process-embedding-models/embed-e5-small-v2-q/src/main/resources/application.properties similarity index 100% rename from integration-tests/embed-e5-small-v2-q/src/main/resources/application.properties rename to integration-tests/in-process-embedding-models/embed-e5-small-v2-q/src/main/resources/application.properties diff --git a/integration-tests/embed-e5-small-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java b/integration-tests/in-process-embedding-models/embed-e5-small-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java similarity index 100% rename from integration-tests/embed-e5-small-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java rename to integration-tests/in-process-embedding-models/embed-e5-small-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java diff --git a/integration-tests/embed-e5-small-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java b/integration-tests/in-process-embedding-models/embed-e5-small-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java similarity index 100% rename from integration-tests/embed-e5-small-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java rename to integration-tests/in-process-embedding-models/embed-e5-small-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java diff --git a/integration-tests/embed-e5-small-v2/pom.xml b/integration-tests/in-process-embedding-models/embed-e5-small-v2/pom.xml similarity index 92% rename from integration-tests/embed-e5-small-v2/pom.xml rename to integration-tests/in-process-embedding-models/embed-e5-small-v2/pom.xml index 3b951cb9e..e2195e9a5 100644 --- a/integration-tests/embed-e5-small-v2/pom.xml +++ b/integration-tests/in-process-embedding-models/embed-e5-small-v2/pom.xml @@ -4,7 +4,7 @@ io.quarkiverse.langchain4j - quarkus-langchain4j-integration-tests-parent + quarkus-langchain4j-integration-tests-in-process-embedding-models 999-SNAPSHOT @@ -12,22 +12,16 @@ Quarkus LangChain4j - Integration Tests - embeddings-e5-small-v2 - - io.quarkiverse.langchain4j - quarkus-langchain4j-parsers-base - ${project.version} - - dev.langchain4j langchain4j-embeddings-e5-small-v2 ${langchain4j-embeddings.version} - - - dev.langchain4j - langchain4j-core - - + + + + io.quarkiverse.langchain4j + quarkus-langchain4j-core + ${project.version} diff --git a/integration-tests/embed-e5-small-v2/src/main/java/org/acme/test/InProcessEmbeddingResource.java b/integration-tests/in-process-embedding-models/embed-e5-small-v2/src/main/java/org/acme/test/InProcessEmbeddingResource.java similarity index 100% rename from integration-tests/embed-e5-small-v2/src/main/java/org/acme/test/InProcessEmbeddingResource.java rename to integration-tests/in-process-embedding-models/embed-e5-small-v2/src/main/java/org/acme/test/InProcessEmbeddingResource.java diff --git a/integration-tests/embed-e5-small-v2/src/main/resources/application.properties b/integration-tests/in-process-embedding-models/embed-e5-small-v2/src/main/resources/application.properties similarity index 100% rename from integration-tests/embed-e5-small-v2/src/main/resources/application.properties rename to integration-tests/in-process-embedding-models/embed-e5-small-v2/src/main/resources/application.properties diff --git a/integration-tests/embed-e5-small-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java b/integration-tests/in-process-embedding-models/embed-e5-small-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java similarity index 100% rename from integration-tests/embed-e5-small-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java rename to integration-tests/in-process-embedding-models/embed-e5-small-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java diff --git a/integration-tests/embed-e5-small-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java b/integration-tests/in-process-embedding-models/embed-e5-small-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java similarity index 100% rename from integration-tests/embed-e5-small-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java rename to integration-tests/in-process-embedding-models/embed-e5-small-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceTest.java diff --git a/integration-tests/in-process-embedding-models/pom.xml b/integration-tests/in-process-embedding-models/pom.xml new file mode 100644 index 000000000..483f1d004 --- /dev/null +++ b/integration-tests/in-process-embedding-models/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + + io.quarkiverse.langchain4j + quarkus-langchain4j-integration-tests-parent + 999-SNAPSHOT + + quarkus-langchain4j-integration-tests-in-process-embedding-models + Quarkus LangChain4j - Integration Tests - In Process Embedding Models + pom + + + embed-all-minilm-l6-v2-q + embed-all-minilm-l6-v2 + embed-bge-small-en-q + embed-bge-small-en + embed-e5-small-v2-q + embed-e5-small-v2 + + + diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml index 15f49d92f..b4f09900a 100644 --- a/integration-tests/pom.xml +++ b/integration-tests/pom.xml @@ -22,12 +22,7 @@ mistralai devui devui-multiple-embedding-models - embed-all-minilm-l6-v2-q - embed-all-minilm-l6-v2 - embed-bge-small-en-q - embed-bge-small-en - embed-e5-small-v2-q - embed-e5-small-v2 + in-process-embedding-models rag rag-pgvector rag-pgvector-flyway