This is an automated email from the ASF dual-hosted git repository.

jamesnetherton pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git


The following commit(s) were added to refs/heads/main by this push:
     new f4d72a51fa Add langchain4j-embeddings native support
f4d72a51fa is described below

commit f4d72a51fa1ef85ef9a7efd027c676d46ed034ca
Author: James Netherton <[email protected]>
AuthorDate: Wed Sep 24 10:40:51 2025 +0100

    Add langchain4j-embeddings native support
    
    Fixes #5973
---
 .../examples/components/langchain4j-embeddings.yml |   6 +-
 .../extensions/langchain4j-embeddings.adoc         |  10 +-
 .../deployment/Langchain4jEmbeddingsProcessor.java |  46 -----
 extensions-jvm/pom.xml                             |   1 -
 .../langchain4j-embeddings/deployment/pom.xml      |   4 +
 .../deployment/Langchain4jEmbeddingsProcessor.java | 215 +++++++++++++++++++++
 .../langchain4j-embeddings/pom.xml                 |   2 +-
 .../langchain4j-embeddings/runtime/pom.xml         |   9 +
 .../main/resources/META-INF/quarkus-extension.yaml |   1 -
 extensions/pom.xml                                 |   1 +
 .../it/Langchain4jEmbeddingsResource.java          |  50 -----
 integration-tests-jvm/pom.xml                      |   1 -
 .../langchain4j-embeddings/pom.xml                 |  52 +++++
 .../it/Langchain4jEmbeddingsResource.java          |  70 +++++++
 .../embeddings/it/Langchain4jEmbeddingsRoutes.java |  19 +-
 .../embeddings/it/Langchain4jEmbeddingsIT.java     |  18 +-
 .../embeddings/it/Langchain4jEmbeddingsTest.java   |  16 +-
 integration-tests/pom.xml                          |   1 +
 poms/bom-test/pom.xml                              |   5 +
 poms/bom/pom.xml                                   |   5 +
 poms/bom/src/main/generated/flattened-full-pom.xml |  10 +-
 .../src/main/generated/flattened-reduced-pom.xml   |   5 +
 .../generated/flattened-reduced-verbose-pom.xml    |   5 +
 tooling/scripts/test-categories.yaml               |   1 +
 24 files changed, 410 insertions(+), 143 deletions(-)

diff --git a/docs/modules/ROOT/examples/components/langchain4j-embeddings.yml 
b/docs/modules/ROOT/examples/components/langchain4j-embeddings.yml
index 1dcccc70e8..e0c17dc6aa 100644
--- a/docs/modules/ROOT/examples/components/langchain4j-embeddings.yml
+++ b/docs/modules/ROOT/examples/components/langchain4j-embeddings.yml
@@ -2,11 +2,11 @@
 # This file was generated by 
camel-quarkus-maven-plugin:update-extension-doc-page
 cqArtifactId: camel-quarkus-langchain4j-embeddings
 cqArtifactIdBase: langchain4j-embeddings
-cqNativeSupported: false
-cqStatus: Preview
+cqNativeSupported: true
+cqStatus: Stable
 cqDeprecated: false
 cqJvmSince: 3.10.0
-cqNativeSince: n/a
+cqNativeSince: 3.29.0
 cqCamelPartName: langchain4j-embeddings
 cqCamelPartTitle: LangChain4j Embeddings
 cqCamelPartDescription: LangChain4j Embeddings
diff --git 
a/docs/modules/ROOT/pages/reference/extensions/langchain4j-embeddings.adoc 
b/docs/modules/ROOT/pages/reference/extensions/langchain4j-embeddings.adoc
index c1f030a018..f1c0722ad1 100644
--- a/docs/modules/ROOT/pages/reference/extensions/langchain4j-embeddings.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/langchain4j-embeddings.adoc
@@ -4,17 +4,17 @@
 = LangChain4j Embeddings
 :linkattrs:
 :cq-artifact-id: camel-quarkus-langchain4j-embeddings
-:cq-native-supported: false
+:cq-native-supported: true
 :cq-status: Preview
 :cq-status-deprecation: Preview
 :cq-description: LangChain4j Embeddings
 :cq-deprecated: false
 :cq-jvm-since: 3.10.0
-:cq-native-since: n/a
+:cq-native-since: 3.29.0
 
 ifeval::[{doc-show-badges} == true]
 [.badges]
-[.badge-key]##JVM since##[.badge-supported]##3.10.0## 
[.badge-key]##Native##[.badge-unsupported]##unsupported##
+[.badge-key]##JVM since##[.badge-supported]##3.10.0## [.badge-key]##Native 
since##[.badge-supported]##3.29.0##
 endif::[]
 
 LangChain4j Embeddings
@@ -29,6 +29,10 @@ Please refer to the above link for usage and configuration 
details.
 [id="extensions-langchain4j-embeddings-maven-coordinates"]
 == Maven coordinates
 
+https://{link-quarkus-code-generator}/?extension-search=camel-quarkus-langchain4j-embeddings[Create
 a new project with this extension on {link-quarkus-code-generator}, 
window="_blank"]
+
+Or add the coordinates to your existing project:
+
 [source,xml]
 ----
 <dependency>
diff --git 
a/extensions-jvm/langchain4j-embeddings/deployment/src/main/java/org/apache/camel/quarkus/component/langchain/embeddings/deployment/Langchain4jEmbeddingsProcessor.java
 
b/extensions-jvm/langchain4j-embeddings/deployment/src/main/java/org/apache/camel/quarkus/component/langchain/embeddings/deployment/Langchain4jEmbeddingsProcessor.java
deleted file mode 100644
index 664a026253..0000000000
--- 
a/extensions-jvm/langchain4j-embeddings/deployment/src/main/java/org/apache/camel/quarkus/component/langchain/embeddings/deployment/Langchain4jEmbeddingsProcessor.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.camel.quarkus.component.langchain.embeddings.deployment;
-
-import io.quarkus.deployment.annotations.BuildStep;
-import io.quarkus.deployment.annotations.ExecutionTime;
-import io.quarkus.deployment.annotations.Record;
-import io.quarkus.deployment.builditem.FeatureBuildItem;
-import io.quarkus.deployment.pkg.steps.NativeOrNativeSourcesBuild;
-import org.apache.camel.quarkus.core.JvmOnlyRecorder;
-import org.jboss.logging.Logger;
-
-class Langchain4jEmbeddingsProcessor {
-
-    private static final Logger LOG = 
Logger.getLogger(Langchain4jEmbeddingsProcessor.class);
-    private static final String FEATURE = "camel-langchain4j-embeddings";
-
-    @BuildStep
-    FeatureBuildItem feature() {
-        return new FeatureBuildItem(FEATURE);
-    }
-
-    /**
-     * Remove this once this extension starts supporting the native mode.
-     */
-    @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class)
-    @Record(value = ExecutionTime.RUNTIME_INIT)
-    void warnJvmInNative(JvmOnlyRecorder recorder) {
-        JvmOnlyRecorder.warnJvmInNative(LOG, FEATURE); // warn at build time
-        recorder.warnJvmInNative(FEATURE); // warn at runtime
-    }
-}
diff --git a/extensions-jvm/pom.xml b/extensions-jvm/pom.xml
index 667c20ee95..0c1511b83f 100644
--- a/extensions-jvm/pom.xml
+++ b/extensions-jvm/pom.xml
@@ -73,7 +73,6 @@
         <module>jooq</module>
         <module>json-patch</module>
         <module>jsonapi</module>
-        <module>langchain4j-embeddings</module>
         <module>ldif</module>
         <module>lucene</module>
         <module>milvus</module>
diff --git a/extensions-jvm/langchain4j-embeddings/deployment/pom.xml 
b/extensions/langchain4j-embeddings/deployment/pom.xml
similarity index 93%
rename from extensions-jvm/langchain4j-embeddings/deployment/pom.xml
rename to extensions/langchain4j-embeddings/deployment/pom.xml
index fe5cc8d382..a8eeb5b9b1 100644
--- a/extensions-jvm/langchain4j-embeddings/deployment/pom.xml
+++ b/extensions/langchain4j-embeddings/deployment/pom.xml
@@ -34,6 +34,10 @@
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-core-deployment</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            
<artifactId>camel-quarkus-support-langchain4j-deployment</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-langchain4j-embeddings</artifactId>
diff --git 
a/extensions/langchain4j-embeddings/deployment/src/main/java/org/apache/camel/quarkus/component/langchain/embeddings/deployment/Langchain4jEmbeddingsProcessor.java
 
b/extensions/langchain4j-embeddings/deployment/src/main/java/org/apache/camel/quarkus/component/langchain/embeddings/deployment/Langchain4jEmbeddingsProcessor.java
new file mode 100644
index 0000000000..f2284d8505
--- /dev/null
+++ 
b/extensions/langchain4j-embeddings/deployment/src/main/java/org/apache/camel/quarkus/component/langchain/embeddings/deployment/Langchain4jEmbeddingsProcessor.java
@@ -0,0 +1,215 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.camel.quarkus.component.langchain.embeddings.deployment;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.stream.Stream;
+
+import ai.djl.util.NativeResource;
+import dev.langchain4j.model.embedding.onnx.AbstractInProcessEmbeddingModel;
+import io.quarkus.bootstrap.classloading.QuarkusClassLoader;
+import io.quarkus.bootstrap.model.ApplicationModel;
+import io.quarkus.deployment.annotations.BuildProducer;
+import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
+import io.quarkus.deployment.builditem.FeatureBuildItem;
+import io.quarkus.deployment.builditem.IndexDependencyBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.JniRuntimeAccessBuildItem;
+import 
io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
+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.pkg.builditem.CurateOutcomeBuildItem;
+import io.quarkus.deployment.pkg.steps.NativeOrNativeSourcesBuild;
+import io.quarkus.maven.dependency.ResolvedDependency;
+import io.smallrye.common.os.OS;
+import org.apache.camel.util.ObjectHelper;
+import org.jboss.jandex.IndexView;
+
+class Langchain4jEmbeddingsProcessor {
+    private static final String FEATURE = "camel-langchain4j-embeddings";
+
+    @BuildStep
+    FeatureBuildItem feature() {
+        return new FeatureBuildItem(FEATURE);
+    }
+
+    @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class)
+    void indexDependencies(
+            CurateOutcomeBuildItem curateOutcome,
+            BuildProducer<IndexDependencyBuildItem> indexDependency) {
+
+        ApplicationModel applicationModel = 
curateOutcome.getApplicationModel();
+        for (ResolvedDependency dependency : 
applicationModel.getDependencies()) {
+            String groupId = dependency.getGroupId();
+            String artifactId = dependency.getArtifactId();
+
+            // Index ai.djl dependencies
+            if (groupId.startsWith("ai.djl")) {
+                indexDependency.produce(new IndexDependencyBuildItem(groupId, 
artifactId));
+            }
+        }
+    }
+
+    @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class)
+    void nativeImageResources(
+            CurateOutcomeBuildItem curateOutcome,
+            BuildProducer<NativeImageResourcePatternsBuildItem> 
nativeImageResourcePattern,
+            BuildProducer<NativeImageResourceBuildItem> nativeImageResource) {
+
+        // The supported platforms for native binaries within 
ai.djl.huggingface:tokenizers & com.microsoft.onnxruntime:onnxruntime
+        String os = switch (OS.current()) {
+        case LINUX -> "linux";
+        case WINDOWS -> "win";
+        case MAC -> "osx";
+        default -> null;
+        };
+
+        // Search for native binaries for the target platform and add them to 
the native image
+        String osArch = System.getProperty("os.arch");
+        if (ObjectHelper.isNotEmpty(os)) {
+            Stream.of(AI_LIBRARY.values()).forEach(aiLibrary -> {
+                try {
+                    String binaryPath = aiLibrary.getBinaryPath(os);
+                    Enumeration<URL> resources = Thread.currentThread()
+                            .getContextClassLoader()
+                            .getResources(binaryPath);
+                    if (resources.hasMoreElements()) {
+                        nativeImageResourcePattern
+                                
.produce(NativeImageResourcePatternsBuildItem.builder()
+                                        .includeGlobs(binaryPath + 
"/**").build());
+                    } else {
+                        throw new RuntimeException(
+                                "Failed to find required native binaries on 
classpath at %s".formatted(binaryPath));
+                    }
+                } catch (IOException e) {
+                    throw new RuntimeException(e);
+                }
+            });
+        } else {
+            throw new RuntimeException("%s does not support platform 
%s-%s".formatted(FEATURE, os, osArch));
+        }
+
+        nativeImageResource.produce(new 
NativeImageResourceBuildItem("native/lib/tokenizers.properties"));
+
+        for (ResolvedDependency dependency : 
curateOutcome.getApplicationModel().getDependencies()) {
+            String artifactId = dependency.getArtifactId();
+
+            // Native image resources for embeddings tokenizer metadata
+            String prefix = "langchain4j-embeddings-";
+            if (artifactId.startsWith(prefix)) {
+                String embeddingLibType = 
artifactId.substring(prefix.length());
+                nativeImageResource.produce(new 
NativeImageResourceBuildItem(embeddingLibType + ".onnx"));
+                nativeImageResource.produce(new 
NativeImageResourceBuildItem(embeddingLibType + "-tokenizer.json"));
+            }
+        }
+    }
+
+    @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class)
+    void jniRuntimeSupport(
+            BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
+            BuildProducer<JniRuntimeAccessBuildItem> jniRuntimeAccess) {
+
+        String[] jniReflectiveClasses = new String[] {
+                "ai.onnxruntime.TensorInfo",
+                "ai.onnxruntime.SequenceInfo",
+                "ai.onnxruntime.MapInfo",
+                "ai.onnxruntime.OrtException",
+                "ai.onnxruntime.OnnxSparseTensor",
+                "ai.djl.huggingface.tokenizers.jni.CharSpan",
+                "[Lai.djl.huggingface.tokenizers.jni.CharSpan;",
+                "[Lai.onnxruntime.OnnxValue;",
+                "[Ljava.lang.String;",
+                "ai.onnxruntime.OnnxTensor",
+                "ai.onnxruntime.OnnxValue",
+                "ai.onnxruntime.TensorInfo",
+                "ai.onnxruntime.OnnxTensor",
+                "java.lang.Boolean",
+                "java.lang.String"
+        };
+
+        reflectiveClass.produce(
+                ReflectiveClassBuildItem.builder(jniReflectiveClasses)
+                        .fields()
+                        .methods()
+                        .build());
+
+        jniRuntimeAccess.produce(
+                new JniRuntimeAccessBuildItem(true, true, true, 
jniReflectiveClasses));
+
+        
reflectiveClass.produce(ReflectiveClassBuildItem.builder("opennlp.tools.sentdetect.SentenceDetectorFactory").build());
+    }
+
+    @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class)
+    void runtimeInitializedClasses(
+            CombinedIndexBuildItem combinedIndex,
+            BuildProducer<RuntimeInitializedClassBuildItem> 
runtimeInitializedClass) {
+
+        IndexView index = combinedIndex.getIndex();
+
+        // Due to JNI usage the following types must be initialized at runtime
+        index.getAllKnownSubclasses(AbstractInProcessEmbeddingModel.class)
+                .stream()
+                .map(classInfo -> classInfo.name().toString())
+                .map(RuntimeInitializedClassBuildItem::new)
+                .forEach(runtimeInitializedClass::produce);
+
+        index.getAllKnownSubclasses(NativeResource.class)
+                .stream()
+                .map(classInfo -> classInfo.name().toString())
+                .map(RuntimeInitializedClassBuildItem::new)
+                .forEach(runtimeInitializedClass::produce);
+
+        Stream.of("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.OrtSession$SessionOptions")
+                .filter(QuarkusClassLoader::isClassPresentAtRuntime)
+                .map(RuntimeInitializedClassBuildItem::new)
+                .forEach(runtimeInitializedClass::produce);
+    }
+
+    enum AI_LIBRARY {
+        AI_DJL_HUGGINGFACE_TOKENIZERS("ai/onnxruntime/native/%s-%s", "x64"),
+        COM_MICROSOFT_ONNXRUNTIME("native/lib/%s-%s/cpu", "x86_64");
+
+        private final String binaryPathTemplate;
+        private final String x86Arch;
+
+        AI_LIBRARY(String binaryPathTemplate, String x86Arch) {
+            this.binaryPathTemplate = binaryPathTemplate;
+            this.x86Arch = x86Arch;
+        }
+
+        public String getBinaryPath(String os) {
+            return binaryPathTemplate.formatted(os, getBinaryArch());
+        }
+
+        public String getBinaryArch() {
+            String arch = System.getProperty("os.arch");
+            if (arch.equals("amd64")) {
+                return this.x86Arch;
+            }
+            return arch;
+        }
+    }
+}
diff --git a/extensions-jvm/langchain4j-embeddings/pom.xml 
b/extensions/langchain4j-embeddings/pom.xml
similarity index 96%
rename from extensions-jvm/langchain4j-embeddings/pom.xml
rename to extensions/langchain4j-embeddings/pom.xml
index 68f248644c..62820157be 100644
--- a/extensions-jvm/langchain4j-embeddings/pom.xml
+++ b/extensions/langchain4j-embeddings/pom.xml
@@ -21,7 +21,7 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.camel.quarkus</groupId>
-        <artifactId>camel-quarkus-extensions-jvm</artifactId>
+        <artifactId>camel-quarkus-extensions</artifactId>
         <version>3.29.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
diff --git a/extensions-jvm/langchain4j-embeddings/runtime/pom.xml 
b/extensions/langchain4j-embeddings/runtime/pom.xml
similarity index 88%
rename from extensions-jvm/langchain4j-embeddings/runtime/pom.xml
rename to extensions/langchain4j-embeddings/runtime/pom.xml
index 8a265ead44..843e7c95e7 100644
--- a/extensions-jvm/langchain4j-embeddings/runtime/pom.xml
+++ b/extensions/langchain4j-embeddings/runtime/pom.xml
@@ -33,6 +33,7 @@
     <properties>
         <camel.quarkus.jvmSince>3.10.0</camel.quarkus.jvmSince>
         <quarkus.metadata.status>preview</quarkus.metadata.status>
+        <camel.quarkus.nativeSince>3.29.0</camel.quarkus.nativeSince>
     </properties>
 
     <dependencies>
@@ -40,10 +41,18 @@
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-support-langchain4j</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-langchain4j-embeddings</artifactId>
         </dependency>
+        <dependency>
+            <groupId>dev.langchain4j</groupId>
+            <artifactId>langchain4j-embeddings</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
diff --git 
a/extensions-jvm/langchain4j-embeddings/runtime/src/main/resources/META-INF/quarkus-extension.yaml
 
b/extensions/langchain4j-embeddings/runtime/src/main/resources/META-INF/quarkus-extension.yaml
similarity index 98%
rename from 
extensions-jvm/langchain4j-embeddings/runtime/src/main/resources/META-INF/quarkus-extension.yaml
rename to 
extensions/langchain4j-embeddings/runtime/src/main/resources/META-INF/quarkus-extension.yaml
index 36ef1fea9d..6b3beeaaf1 100644
--- 
a/extensions-jvm/langchain4j-embeddings/runtime/src/main/resources/META-INF/quarkus-extension.yaml
+++ 
b/extensions/langchain4j-embeddings/runtime/src/main/resources/META-INF/quarkus-extension.yaml
@@ -26,7 +26,6 @@ description: "LangChain4j Embeddings"
 metadata:
   icon-url: 
"https://raw.githubusercontent.com/apache/camel-website/main/antora-ui-camel/src/img/logo-d.svg";
   sponsor: "Apache Software Foundation"
-  unlisted: true
   guide: 
"https://camel.apache.org/camel-quarkus/latest/reference/extensions/langchain4j-embeddings.html";
   categories:
   - "integration"
diff --git a/extensions/pom.xml b/extensions/pom.xml
index a9035486da..8389d55286 100644
--- a/extensions/pom.xml
+++ b/extensions/pom.xml
@@ -174,6 +174,7 @@
         <module>kudu</module>
         <module>langchain4j-agent</module>
         <module>langchain4j-chat</module>
+        <module>langchain4j-embeddings</module>
         <module>langchain4j-tokenizer</module>
         <module>langchain4j-tools</module>
         <module>langchain4j-web-search</module>
diff --git 
a/integration-tests-jvm/langchain4j-embeddings/src/main/java/org/apache/camel/quarkus/component/langchain/embeddings/it/Langchain4jEmbeddingsResource.java
 
b/integration-tests-jvm/langchain4j-embeddings/src/main/java/org/apache/camel/quarkus/component/langchain/embeddings/it/Langchain4jEmbeddingsResource.java
deleted file mode 100644
index b33ff04c7c..0000000000
--- 
a/integration-tests-jvm/langchain4j-embeddings/src/main/java/org/apache/camel/quarkus/component/langchain/embeddings/it/Langchain4jEmbeddingsResource.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.camel.quarkus.component.langchain.embeddings.it;
-
-import jakarta.enterprise.context.ApplicationScoped;
-import jakarta.inject.Inject;
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-import org.apache.camel.CamelContext;
-import org.jboss.logging.Logger;
-
-@Path("/langchain4j-embeddings")
-@ApplicationScoped
-public class Langchain4jEmbeddingsResource {
-
-    private static final Logger LOG = 
Logger.getLogger(Langchain4jEmbeddingsResource.class);
-
-    private static final String COMPONENT_LANGCHAIN_EMBEDDINGS = 
"langchain4j-embeddings";
-    @Inject
-    CamelContext context;
-
-    @Path("/load/component/langchain4j-embeddings")
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    public Response loadComponentLangchai4jEmbeddings() throws Exception {
-        /* This is an autogenerated test */
-        if (context.getComponent(COMPONENT_LANGCHAIN_EMBEDDINGS) != null) {
-            return Response.ok().build();
-        }
-        LOG.warnf("Could not load [%s] from the Camel context", 
COMPONENT_LANGCHAIN_EMBEDDINGS);
-        return Response.status(500, COMPONENT_LANGCHAIN_EMBEDDINGS + " could 
not be loaded from the Camel context").build();
-    }
-}
diff --git a/integration-tests-jvm/pom.xml b/integration-tests-jvm/pom.xml
index 48bddf0df7..298e30fa37 100644
--- a/integration-tests-jvm/pom.xml
+++ b/integration-tests-jvm/pom.xml
@@ -72,7 +72,6 @@
         <module>jooq</module>
         <module>json-patch</module>
         <module>jsonapi</module>
-        <module>langchain4j-embeddings</module>
         <module>ldif</module>
         <module>lucene</module>
         <module>main-devmode</module>
diff --git a/integration-tests-jvm/langchain4j-embeddings/pom.xml 
b/integration-tests/langchain4j-embeddings/pom.xml
similarity index 63%
rename from integration-tests-jvm/langchain4j-embeddings/pom.xml
rename to integration-tests/langchain4j-embeddings/pom.xml
index 34b1546f85..387fc98aa8 100644
--- a/integration-tests-jvm/langchain4j-embeddings/pom.xml
+++ b/integration-tests/langchain4j-embeddings/pom.xml
@@ -31,6 +31,10 @@
     <description>Integration tests for Camel Quarkus LangChain4j Embeddings 
extension</description>
 
     <dependencies>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-direct</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-langchain4j-embeddings</artifactId>
@@ -39,6 +43,14 @@
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-resteasy</artifactId>
         </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-resteasy-jackson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>dev.langchain4j</groupId>
+            <artifactId>langchain4j-embeddings-all-minilm-l6-v2</artifactId>
+        </dependency>
 
         <!-- test dependencies -->
         <dependency>
@@ -63,6 +75,19 @@
             </activation>
             <dependencies>
                 <!-- The following dependencies guarantee that this module is 
built after them. You can update them by running `mvn process-resources 
-Pformat -N` from the source tree root directory -->
+                <dependency>
+                    <groupId>org.apache.camel.quarkus</groupId>
+                    <artifactId>camel-quarkus-direct-deployment</artifactId>
+                    <version>${project.version}</version>
+                    <type>pom</type>
+                    <scope>test</scope>
+                    <exclusions>
+                        <exclusion>
+                            <groupId>*</groupId>
+                            <artifactId>*</artifactId>
+                        </exclusion>
+                    </exclusions>
+                </dependency>
                 <dependency>
                     <groupId>org.apache.camel.quarkus</groupId>
                     
<artifactId>camel-quarkus-langchain4j-embeddings-deployment</artifactId>
@@ -78,5 +103,32 @@
                 </dependency>
             </dependencies>
         </profile>
+        <profile>
+            <id>native</id>
+            <activation>
+                <property>
+                    <name>native</name>
+                </property>
+            </activation>
+            <properties>
+                <quarkus.native.enabled>true</quarkus.native.enabled>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-failsafe-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <goal>integration-test</goal>
+                                    <goal>verify</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
     </profiles>
 </project>
diff --git 
a/integration-tests/langchain4j-embeddings/src/main/java/org/apache/camel/quarkus/component/langchain/embeddings/it/Langchain4jEmbeddingsResource.java
 
b/integration-tests/langchain4j-embeddings/src/main/java/org/apache/camel/quarkus/component/langchain/embeddings/it/Langchain4jEmbeddingsResource.java
new file mode 100644
index 0000000000..96e9036519
--- /dev/null
+++ 
b/integration-tests/langchain4j-embeddings/src/main/java/org/apache/camel/quarkus/component/langchain/embeddings/it/Langchain4jEmbeddingsResource.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.camel.quarkus.component.langchain.embeddings.it;
+
+import dev.langchain4j.data.embedding.Embedding;
+import dev.langchain4j.model.embedding.EmbeddingModel;
+import 
dev.langchain4j.model.embedding.onnx.allminilml6v2.AllMiniLmL6V2EmbeddingModel;
+import io.quarkus.vertx.http.runtime.devmode.Json;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.langchain4j.embeddings.LangChain4jEmbeddings;
+import org.apache.camel.support.LRUCacheFactory;
+
+@Path("/langchain4j-embeddings")
+@ApplicationScoped
+public class Langchain4jEmbeddingsResource {
+    @Inject
+    ProducerTemplate producerTemplate;
+
+    @jakarta.enterprise.inject.Produces
+    EmbeddingModel embeddingModel() {
+        return new AllMiniLmL6V2EmbeddingModel();
+    }
+
+    @Path("/create")
+    @POST
+    @Consumes(MediaType.TEXT_PLAIN)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response createEmbedding(String text) throws Exception {
+        try {
+            Exchange result = producerTemplate.request("direct:start", e -> 
e.getMessage().setBody(text));
+            Message message = result.getMessage();
+
+            Embedding embedding = 
message.getHeader(LangChain4jEmbeddings.Headers.VECTOR, Embedding.class);
+            Integer inputTokenLength = 
message.getHeader(LangChain4jEmbeddings.Headers.INPUT_TOKEN_COUNT, 
Integer.class);
+
+            return Response.ok()
+                    .entity(Json.object()
+                            .put("vectorLength", embedding.vector().length)
+                            .put("inputTokenLength", inputTokenLength)
+                            .build())
+                    .build();
+        } finally {
+            LRUCacheFactory.setLRUCacheFactory(null);
+        }
+    }
+}
diff --git 
a/integration-tests-jvm/langchain4j-embeddings/src/test/java/org/apache/camel/quarkus/component/langchain/embeddings/it/Langchain4jEmbeddingsTest.java
 
b/integration-tests/langchain4j-embeddings/src/main/java/org/apache/camel/quarkus/component/langchain/embeddings/it/Langchain4jEmbeddingsRoutes.java
similarity index 68%
copy from 
integration-tests-jvm/langchain4j-embeddings/src/test/java/org/apache/camel/quarkus/component/langchain/embeddings/it/Langchain4jEmbeddingsTest.java
copy to 
integration-tests/langchain4j-embeddings/src/main/java/org/apache/camel/quarkus/component/langchain/embeddings/it/Langchain4jEmbeddingsRoutes.java
index 9cb65825ad..988bac0a33 100644
--- 
a/integration-tests-jvm/langchain4j-embeddings/src/test/java/org/apache/camel/quarkus/component/langchain/embeddings/it/Langchain4jEmbeddingsTest.java
+++ 
b/integration-tests/langchain4j-embeddings/src/main/java/org/apache/camel/quarkus/component/langchain/embeddings/it/Langchain4jEmbeddingsRoutes.java
@@ -16,19 +16,12 @@
  */
 package org.apache.camel.quarkus.component.langchain.embeddings.it;
 
-import io.quarkus.test.junit.QuarkusTest;
-import io.restassured.RestAssured;
-import org.junit.jupiter.api.Test;
+import org.apache.camel.builder.RouteBuilder;
 
-@QuarkusTest
-class Langchain4jEmbeddingsTest {
-
-    @Test
-    public void loadComponentLangchainEmbeddings() {
-        /* A simple autogenerated test */
-        
RestAssured.get("/langchain4j-embeddings/load/component/langchain4j-embeddings")
-                .then()
-                .statusCode(200);
+public class Langchain4jEmbeddingsRoutes extends RouteBuilder {
+    @Override
+    public void configure() throws Exception {
+        from("direct:start")
+                .to("langchain4j-embeddings:create-from-text");
     }
-
 }
diff --git 
a/integration-tests-jvm/langchain4j-embeddings/src/test/java/org/apache/camel/quarkus/component/langchain/embeddings/it/Langchain4jEmbeddingsTest.java
 
b/integration-tests/langchain4j-embeddings/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddings/it/Langchain4jEmbeddingsIT.java
similarity index 62%
copy from 
integration-tests-jvm/langchain4j-embeddings/src/test/java/org/apache/camel/quarkus/component/langchain/embeddings/it/Langchain4jEmbeddingsTest.java
copy to 
integration-tests/langchain4j-embeddings/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddings/it/Langchain4jEmbeddingsIT.java
index 9cb65825ad..75494a0eeb 100644
--- 
a/integration-tests-jvm/langchain4j-embeddings/src/test/java/org/apache/camel/quarkus/component/langchain/embeddings/it/Langchain4jEmbeddingsTest.java
+++ 
b/integration-tests/langchain4j-embeddings/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddings/it/Langchain4jEmbeddingsIT.java
@@ -14,21 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.langchain.embeddings.it;
+package org.apache.camel.quarkus.component.langchain4j.embeddings.it;
 
-import io.quarkus.test.junit.QuarkusTest;
-import io.restassured.RestAssured;
-import org.junit.jupiter.api.Test;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
 
-@QuarkusTest
-class Langchain4jEmbeddingsTest {
-
-    @Test
-    public void loadComponentLangchainEmbeddings() {
-        /* A simple autogenerated test */
-        
RestAssured.get("/langchain4j-embeddings/load/component/langchain4j-embeddings")
-                .then()
-                .statusCode(200);
-    }
+@QuarkusIntegrationTest
+class Langchain4jEmbeddingsIT extends Langchain4jEmbeddingsTest {
 
 }
diff --git 
a/integration-tests-jvm/langchain4j-embeddings/src/test/java/org/apache/camel/quarkus/component/langchain/embeddings/it/Langchain4jEmbeddingsTest.java
 
b/integration-tests/langchain4j-embeddings/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddings/it/Langchain4jEmbeddingsTest.java
similarity index 70%
rename from 
integration-tests-jvm/langchain4j-embeddings/src/test/java/org/apache/camel/quarkus/component/langchain/embeddings/it/Langchain4jEmbeddingsTest.java
rename to 
integration-tests/langchain4j-embeddings/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddings/it/Langchain4jEmbeddingsTest.java
index 9cb65825ad..20d6550bf2 100644
--- 
a/integration-tests-jvm/langchain4j-embeddings/src/test/java/org/apache/camel/quarkus/component/langchain/embeddings/it/Langchain4jEmbeddingsTest.java
+++ 
b/integration-tests/langchain4j-embeddings/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddings/it/Langchain4jEmbeddingsTest.java
@@ -14,21 +14,27 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.langchain.embeddings.it;
+package org.apache.camel.quarkus.component.langchain4j.embeddings.it;
 
 import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.RestAssured;
 import org.junit.jupiter.api.Test;
 
+import static org.hamcrest.Matchers.is;
+
 @QuarkusTest
 class Langchain4jEmbeddingsTest {
 
     @Test
-    public void loadComponentLangchainEmbeddings() {
-        /* A simple autogenerated test */
-        
RestAssured.get("/langchain4j-embeddings/load/component/langchain4j-embeddings")
+    void createTextEmbeddings() {
+        RestAssured.given()
+                .body("Hello World")
+                .post("/langchain4j-embeddings/create")
                 .then()
-                .statusCode(200);
+                .statusCode(200)
+                .body(
+                        "vectorLength", is(384),
+                        "inputTokenLength", is(2));
     }
 
 }
diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index d87afb693e..43941ac58a 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -150,6 +150,7 @@
         <module>kudu</module>
         <module>langchain4j-agent</module>
         <module>langchain4j-chat</module>
+        <module>langchain4j-embeddings</module>
         <module>langchain4j-tokenizer</module>
         <module>langchain4j-tools</module>
         <module>langchain4j-web-search</module>
diff --git a/poms/bom-test/pom.xml b/poms/bom-test/pom.xml
index deb93d11a8..19fd770cf5 100644
--- a/poms/bom-test/pom.xml
+++ b/poms/bom-test/pom.xml
@@ -63,6 +63,11 @@
                 <scope>import</scope>
             </dependency>
 
+            <dependency>
+                <groupId>dev.langchain4j</groupId>
+                
<artifactId>langchain4j-embeddings-all-minilm-l6-v2</artifactId>
+                <version>${langchain4j-beta.version}</version>
+            </dependency>
             <dependency>
                 <groupId>dev.langchain4j</groupId>
                 <artifactId>langchain4j-ollama</artifactId>
diff --git a/poms/bom/pom.xml b/poms/bom/pom.xml
index 12d92d2709..ed67ceb179 100644
--- a/poms/bom/pom.xml
+++ b/poms/bom/pom.xml
@@ -7208,6 +7208,11 @@
                 <artifactId>commons-validator</artifactId>
                 <version>${commons-validator.version}</version>
             </dependency>
+            <dependency>
+                <groupId>dev.langchain4j</groupId>
+                <artifactId>langchain4j-embeddings</artifactId>
+                <version>${langchain4j-beta.version}</version>
+            </dependency>
             <dependency>
                 <groupId>io.dropwizard.metrics</groupId>
                 <artifactId>dropwizard-core</artifactId>
diff --git a/poms/bom/src/main/generated/flattened-full-pom.xml 
b/poms/bom/src/main/generated/flattened-full-pom.xml
index 8e5adcfc7a..fbf1172895 100644
--- a/poms/bom/src/main/generated/flattened-full-pom.xml
+++ b/poms/bom/src/main/generated/flattened-full-pom.xml
@@ -7094,6 +7094,11 @@
         <artifactId>commons-validator</artifactId><!-- 
org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
         <version>1.10.0</version><!-- 
org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
       </dependency>
+      <dependency>
+        <groupId>dev.langchain4j</groupId><!-- 
org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
+        <artifactId>langchain4j-embeddings</artifactId><!-- 
org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
+        <version>1.5.0-beta11</version><!-- 
org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
+      </dependency>
       <dependency>
         <groupId>io.dropwizard.metrics</groupId><!-- 
org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
         <artifactId>dropwizard-core</artifactId><!-- 
org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
@@ -23618,11 +23623,6 @@
         <artifactId>langchain4j-oracle</artifactId><!-- 
dev.langchain4j:langchain4j-bom:1.5.0 -->
         <version>1.5.0-beta11</version><!-- 
dev.langchain4j:langchain4j-bom:1.5.0 -->
       </dependency>
-      <dependency>
-        <groupId>dev.langchain4j</groupId><!-- 
dev.langchain4j:langchain4j-bom:1.5.0 -->
-        <artifactId>langchain4j-embeddings</artifactId><!-- 
dev.langchain4j:langchain4j-bom:1.5.0 -->
-        <version>1.5.0-beta11</version><!-- 
dev.langchain4j:langchain4j-bom:1.5.0 -->
-      </dependency>
       <dependency>
         <groupId>dev.langchain4j</groupId><!-- 
dev.langchain4j:langchain4j-bom:1.5.0 -->
         <artifactId>langchain4j-embeddings-all-minilm-l6-v2</artifactId><!-- 
dev.langchain4j:langchain4j-bom:1.5.0 -->
diff --git a/poms/bom/src/main/generated/flattened-reduced-pom.xml 
b/poms/bom/src/main/generated/flattened-reduced-pom.xml
index ae2cd165f7..225314142c 100644
--- a/poms/bom/src/main/generated/flattened-reduced-pom.xml
+++ b/poms/bom/src/main/generated/flattened-reduced-pom.xml
@@ -7069,6 +7069,11 @@
         <artifactId>commons-validator</artifactId>
         <version>1.10.0</version>
       </dependency>
+      <dependency>
+        <groupId>dev.langchain4j</groupId>
+        <artifactId>langchain4j-embeddings</artifactId>
+        <version>1.5.0-beta11</version>
+      </dependency>
       <dependency>
         <groupId>io.minio</groupId>
         <artifactId>minio</artifactId>
diff --git a/poms/bom/src/main/generated/flattened-reduced-verbose-pom.xml 
b/poms/bom/src/main/generated/flattened-reduced-verbose-pom.xml
index d0d475aed8..260a18f8cd 100644
--- a/poms/bom/src/main/generated/flattened-reduced-verbose-pom.xml
+++ b/poms/bom/src/main/generated/flattened-reduced-verbose-pom.xml
@@ -7069,6 +7069,11 @@
         <artifactId>commons-validator</artifactId><!-- 
org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
         <version>1.10.0</version><!-- 
org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
       </dependency>
+      <dependency>
+        <groupId>dev.langchain4j</groupId><!-- 
org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
+        <artifactId>langchain4j-embeddings</artifactId><!-- 
org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
+        <version>1.5.0-beta11</version><!-- 
org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
+      </dependency>
       <dependency>
         <groupId>io.minio</groupId><!-- 
org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
         <artifactId>minio</artifactId><!-- 
org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
diff --git a/tooling/scripts/test-categories.yaml 
b/tooling/scripts/test-categories.yaml
index 9d6d72d07a..e396635b00 100644
--- a/tooling/scripts/test-categories.yaml
+++ b/tooling/scripts/test-categories.yaml
@@ -126,6 +126,7 @@ group-07:
   - geocoder
   - jslt
   - ldap
+  - langchain4j-embeddings
   - lumberjack
   - ognl
   - olingo4


Reply via email to