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 65d98c7e74 Use Infinispan as the embedding store for
langchain4j-embeddingstore-ql4j tests
65d98c7e74 is described below
commit 65d98c7e74bbbe6b5597ca6644b86169683cc2cd
Author: James Netherton <[email protected]>
AuthorDate: Mon Oct 5 13:53:07 2026 +0100
Use Infinispan as the embedding store for langchain4j-embeddingstore-ql4j
tests
---
.../langchain4j-embeddingstore-ql4j/pom.xml | 16 ++--
.../it/Langchain4jEmbeddingstoreQl4jResource.java | 4 +-
.../src/main/resources/application.properties | 6 +-
...Langchain4jInfinispanEmbeddingstoreQl4jIT.java} | 2 +-
...ngchain4jInfinispanEmbeddingstoreQl4jTest.java} | 21 ++---
.../embeddingstore/ql4j/it/QdrantTestResource.java | 105 ---------------------
6 files changed, 27 insertions(+), 127 deletions(-)
diff --git a/integration-tests/langchain4j-embeddingstore-ql4j/pom.xml
b/integration-tests/langchain4j-embeddingstore-ql4j/pom.xml
index ca5cfd25ee..e92d14a4e9 100644
--- a/integration-tests/langchain4j-embeddingstore-ql4j/pom.xml
+++ b/integration-tests/langchain4j-embeddingstore-ql4j/pom.xml
@@ -30,6 +30,15 @@
<name>Camel Quarkus :: Integration Tests :: LangChain4j Embedding Store
QL4J</name>
<description>Integration tests for Camel Quarkus LangChain4j Embedding
Store extension with Quarkus LangChain4j on the classpath</description>
+ <build>
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ </resource>
+ </resources>
+ </build>
+
<dependencyManagement>
<dependencies>
<dependency>
@@ -57,7 +66,7 @@
</dependency>
<dependency>
<groupId>io.quarkiverse.langchain4j</groupId>
- <artifactId>quarkus-langchain4j-qdrant</artifactId>
+ <artifactId>quarkus-langchain4j-infinispan</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
@@ -79,11 +88,6 @@
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>org.testcontainers</groupId>
- <artifactId>testcontainers-qdrant</artifactId>
- <scope>test</scope>
- </dependency>
<dependency>
<groupId>org.awaitility</groupId>
<artifactId>awaitility</artifactId>
diff --git
a/integration-tests/langchain4j-embeddingstore-ql4j/src/main/java/org/apache/camel/quarkus/component/langchain4j/embeddingstore/ql4j/it/Langchain4jEmbeddingstoreQl4jResource.java
b/integration-tests/langchain4j-embeddingstore-ql4j/src/main/java/org/apache/camel/quarkus/component/langchain4j/embeddingstore/ql4j/it/Langchain4jEmbeddingstoreQl4jResource.java
index b14e04459d..4f146c9e70 100644
---
a/integration-tests/langchain4j-embeddingstore-ql4j/src/main/java/org/apache/camel/quarkus/component/langchain4j/embeddingstore/ql4j/it/Langchain4jEmbeddingstoreQl4jResource.java
+++
b/integration-tests/langchain4j-embeddingstore-ql4j/src/main/java/org/apache/camel/quarkus/component/langchain4j/embeddingstore/ql4j/it/Langchain4jEmbeddingstoreQl4jResource.java
@@ -110,7 +110,7 @@ public class Langchain4jEmbeddingstoreQl4jResource {
.request();
}
- @Path("/qdrant/retrieve")
+ @Path("/infinispan/retrieve")
@POST
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.APPLICATION_JSON)
@@ -119,7 +119,7 @@ public class Langchain4jEmbeddingstoreQl4jResource {
return results.stream().map(c -> c.textSegment().text()).toList();
}
- @Path("/qdrant/ingest")
+ @Path("/infinispan/ingest")
@POST
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.TEXT_PLAIN)
diff --git
a/integration-tests/langchain4j-embeddingstore-ql4j/src/main/resources/application.properties
b/integration-tests/langchain4j-embeddingstore-ql4j/src/main/resources/application.properties
index a23f7fddc8..7342849e04 100644
---
a/integration-tests/langchain4j-embeddingstore-ql4j/src/main/resources/application.properties
+++
b/integration-tests/langchain4j-embeddingstore-ql4j/src/main/resources/application.properties
@@ -15,9 +15,11 @@
## limitations under the License.
## ---------------------------------------------------------------------------
-quarkus.devservices.enabled=false
quarkus.langchain4j.devservices.enabled=false
quarkus.langchain4j.ollama.base-url=http://localhost:11434
quarkus.langchain4j.ollama.embedding-model.model-id=nomic-embed-text
quarkus.langchain4j.embedding-model.provider=ollama
-quarkus.langchain4j.qdrant.collection-name=camel-quarkus-ql4j-collection
+quarkus.infinispan-client.devservices.image-name=${infinispan.container.image}
+quarkus.langchain4j.infinispan.cache-name=camel-quarkus-ql4j-embeddings
+# Must match the embedding dimension in the WireMock stubs under
mappings/embeddings/
+quarkus.langchain4j.infinispan.dimension=5
diff --git
a/integration-tests/langchain4j-embeddingstore-ql4j/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddingstore/ql4j/it/Langchain4jQdrantEmbeddingstoreQl4jIT.java
b/integration-tests/langchain4j-embeddingstore-ql4j/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddingstore/ql4j/it/Langchain4jInfinispanEmbeddingstoreQl4jIT.java
similarity index 90%
rename from
integration-tests/langchain4j-embeddingstore-ql4j/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddingstore/ql4j/it/Langchain4jQdrantEmbeddingstoreQl4jIT.java
rename to
integration-tests/langchain4j-embeddingstore-ql4j/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddingstore/ql4j/it/Langchain4jInfinispanEmbeddingstoreQl4jIT.java
index 068f893cb5..2a8fb153f0 100644
---
a/integration-tests/langchain4j-embeddingstore-ql4j/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddingstore/ql4j/it/Langchain4jQdrantEmbeddingstoreQl4jIT.java
+++
b/integration-tests/langchain4j-embeddingstore-ql4j/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddingstore/ql4j/it/Langchain4jInfinispanEmbeddingstoreQl4jIT.java
@@ -19,5 +19,5 @@ package
org.apache.camel.quarkus.component.langchain4j.embeddingstore.ql4j.it;
import io.quarkus.test.junit.QuarkusIntegrationTest;
@QuarkusIntegrationTest
-class Langchain4jQdrantEmbeddingstoreQl4jIT extends
Langchain4jQdrantEmbeddingstoreQl4jTest {
+class Langchain4jInfinispanEmbeddingstoreQl4jIT extends
Langchain4jInfinispanEmbeddingstoreQl4jTest {
}
diff --git
a/integration-tests/langchain4j-embeddingstore-ql4j/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddingstore/ql4j/it/Langchain4jQdrantEmbeddingstoreQl4jTest.java
b/integration-tests/langchain4j-embeddingstore-ql4j/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddingstore/ql4j/it/Langchain4jInfinispanEmbeddingstoreQl4jTest.java
similarity index 85%
rename from
integration-tests/langchain4j-embeddingstore-ql4j/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddingstore/ql4j/it/Langchain4jQdrantEmbeddingstoreQl4jTest.java
rename to
integration-tests/langchain4j-embeddingstore-ql4j/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddingstore/ql4j/it/Langchain4jInfinispanEmbeddingstoreQl4jTest.java
index a7609ad8e6..5357edb861 100644
---
a/integration-tests/langchain4j-embeddingstore-ql4j/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddingstore/ql4j/it/Langchain4jQdrantEmbeddingstoreQl4jTest.java
+++
b/integration-tests/langchain4j-embeddingstore-ql4j/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddingstore/ql4j/it/Langchain4jInfinispanEmbeddingstoreQl4jTest.java
@@ -31,18 +31,17 @@ import static org.hamcrest.Matchers.is;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@QuarkusTestResource(OllamaWireMockTestResource.class)
-@QuarkusTestResource(QdrantTestResource.class)
@QuarkusTest
-class Langchain4jQdrantEmbeddingstoreQl4jTest {
+class Langchain4jInfinispanEmbeddingstoreQl4jTest {
static final String CAMEL_MESSAGE = "Hello Camel Quarkus LangChain4j
Embedding Store";
static final String QL4J_MESSAGE = "Hello from Quarkus LangChain4j direct
ingest";
@Test
- void qdrantEmbeddingstoreQl4jInterop() {
+ void infinispanEmbeddingstoreQl4jInterop() {
// 1. Camel ADD
String id = RestAssured.given()
.body(CAMEL_MESSAGE)
- .post("/langchain4j-embeddingstore/qdrant/add")
+ .post("/langchain4j-embeddingstore/infinispan/add")
.then()
.statusCode(200)
.extract()
@@ -53,7 +52,7 @@ class Langchain4jQdrantEmbeddingstoreQl4jTest {
// 2. Camel SEARCH
RestAssured.given()
.body(CAMEL_MESSAGE)
- .post("/langchain4j-embeddingstore/qdrant/search")
+ .post("/langchain4j-embeddingstore/infinispan/search")
.then()
.statusCode(200)
.body(
@@ -64,7 +63,7 @@ class Langchain4jQdrantEmbeddingstoreQl4jTest {
// 3. QL4J retrieves Camel-written data
RestAssured.given()
.body(CAMEL_MESSAGE)
- .post("/langchain4j-embeddingstore/qdrant/retrieve")
+ .post("/langchain4j-embeddingstore/infinispan/retrieve")
.then()
.statusCode(200)
.body(
@@ -74,7 +73,7 @@ class Langchain4jQdrantEmbeddingstoreQl4jTest {
// 4. QL4J ingests directly (bypassing Camel)
String ql4jId = RestAssured.given()
.body(QL4J_MESSAGE)
- .post("/langchain4j-embeddingstore/qdrant/ingest")
+ .post("/langchain4j-embeddingstore/infinispan/ingest")
.then()
.statusCode(200)
.extract()
@@ -86,7 +85,7 @@ class Langchain4jQdrantEmbeddingstoreQl4jTest {
Awaitility.await().pollInterval(250, TimeUnit.MILLISECONDS).atMost(10,
TimeUnit.SECONDS).untilAsserted(() -> {
RestAssured.given()
.body(QL4J_MESSAGE)
- .post("/langchain4j-embeddingstore/qdrant/search")
+ .post("/langchain4j-embeddingstore/infinispan/search")
.then()
.statusCode(200)
.body(
@@ -97,20 +96,20 @@ class Langchain4jQdrantEmbeddingstoreQl4jTest {
// 6. Camel REMOVE both embeddings with confirmation
RestAssured.given()
.queryParam("embeddingId", id)
- .delete("/langchain4j-embeddingstore/qdrant/remove")
+ .delete("/langchain4j-embeddingstore/infinispan/remove")
.then()
.statusCode(204);
RestAssured.given()
.queryParam("embeddingId", ql4jId)
- .delete("/langchain4j-embeddingstore/qdrant/remove")
+ .delete("/langchain4j-embeddingstore/infinispan/remove")
.then()
.statusCode(204);
Awaitility.await().pollInterval(250, TimeUnit.MILLISECONDS).atMost(10,
TimeUnit.SECONDS).untilAsserted(() -> {
RestAssured.given()
.body(CAMEL_MESSAGE)
- .post("/langchain4j-embeddingstore/qdrant/search")
+ .post("/langchain4j-embeddingstore/infinispan/search")
.then()
.statusCode(200)
.body(
diff --git
a/integration-tests/langchain4j-embeddingstore-ql4j/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddingstore/ql4j/it/QdrantTestResource.java
b/integration-tests/langchain4j-embeddingstore-ql4j/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddingstore/ql4j/it/QdrantTestResource.java
deleted file mode 100644
index fd21a4f68e..0000000000
---
a/integration-tests/langchain4j-embeddingstore-ql4j/src/test/java/org/apache/camel/quarkus/component/langchain4j/embeddingstore/ql4j/it/QdrantTestResource.java
+++ /dev/null
@@ -1,105 +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.langchain4j.embeddingstore.ql4j.it;
-
-import java.io.IOException;
-import java.net.URI;
-import java.net.http.HttpClient;
-import java.net.http.HttpRequest;
-import java.net.http.HttpResponse;
-import java.util.HashMap;
-import java.util.Map;
-
-import io.quarkus.test.common.QuarkusTestResourceLifecycleManager;
-import org.eclipse.microprofile.config.ConfigProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testcontainers.containers.GenericContainer;
-import org.testcontainers.containers.output.Slf4jLogConsumer;
-import org.testcontainers.qdrant.QdrantContainer;
-import org.testcontainers.utility.DockerImageName;
-
-public class QdrantTestResource implements QuarkusTestResourceLifecycleManager
{
- private static final Logger LOG =
LoggerFactory.getLogger(QdrantTestResource.class);
- private static final String QDRANT_IMAGE =
ConfigProvider.getConfig().getValue("qdrant.container.image", String.class);
- private static final int QDRANT_HTTP_PORT = 6333;
- private static final String COLLECTION_NAME =
"camel-quarkus-ql4j-collection";
-
- private GenericContainer<?> qdrantContainer;
-
- @Override
- public Map<String, String> start() {
- Map<String, String> properties = new HashMap<>();
-
- DockerImageName qdrantImageName =
DockerImageName.parse(QDRANT_IMAGE).asCompatibleSubstituteFor("qdrant/qdrant");
- qdrantContainer = new QdrantContainer(qdrantImageName)
- .withLogConsumer(new Slf4jLogConsumer(LOG));
- qdrantContainer.start();
-
- String host = qdrantContainer.getHost();
- Integer httpPort = qdrantContainer.getMappedPort(QDRANT_HTTP_PORT);
-
- createCollection(host, httpPort);
-
- properties.put("quarkus.qdrant.host", host);
- properties.put("quarkus.qdrant.port", httpPort.toString());
-
- LOG.info("Properties: {}", properties);
-
- return properties;
- }
-
- private void createCollection(String host, int port) {
- try {
- HttpClient httpClient = HttpClient.newHttpClient();
- String url = String.format("http://%s:%d/collections/%s", host,
port, COLLECTION_NAME);
- // Vector size must match the embedding dimension in the WireMock
stubs under mappings/embeddings/
- String body = """
- {
- "vectors": {
- "size": 5,
- "distance": "Cosine"
- }
- }
- """;
- HttpRequest request = HttpRequest.newBuilder()
- .uri(URI.create(url))
- .PUT(HttpRequest.BodyPublishers.ofString(body))
- .header("Content-Type", "application/json")
- .build();
- HttpResponse<String> response = httpClient.send(request,
HttpResponse.BodyHandlers.ofString());
- if (response.statusCode() != 200) {
- throw new RuntimeException("Failed to create Qdrant
collection: " + response.body());
- }
- LOG.info("Created Qdrant collection '{}': {}", COLLECTION_NAME,
response.body());
- } catch (IOException | InterruptedException e) {
- throw new RuntimeException("Failed to create Qdrant collection",
e);
- }
- }
-
- @Override
- public void stop() {
- try {
- if (qdrantContainer != null) {
- qdrantContainer.stop();
- }
- } catch (Exception ex) {
- LOG.error("An issue occurred while stopping Qdrant container", ex);
- }
- }
-
-}