You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2025/08/02 18:07:57 UTC
(camel) branch main updated: CAMEL-22311 Add transforms to camel-weaviate and add a weaviate test to camel-langchain4j-embeddings (#18803)
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new ebd2e63c2e1 CAMEL-22311 Add transforms to camel-weaviate and add a weaviate test to camel-langchain4j-embeddings (#18803)
ebd2e63c2e1 is described below
commit ebd2e63c2e1b49d1322f3f548731462aa13af668
Author: Tom Cunningham <tc...@redhat.com>
AuthorDate: Sat Aug 2 14:07:51 2025 -0400
CAMEL-22311 Add transforms to camel-weaviate and add a weaviate test to camel-langchain4j-embeddings (#18803)
---
.../apache/camel/catalog/components/weaviate.json | 4 +-
.../apache/camel/catalog/transformers.properties | 1 +
.../catalog/transformers/weaviate-embeddings.json | 14 ++
.../camel-ai/camel-langchain4j-embeddings/pom.xml | 12 ++
...Chain4jEmbeddingsComponentWeaviateTargetIT.java | 196 +++++++++++++++++++++
.../apache/camel/component/weaviate/weaviate.json | 4 +-
.../org/apache/camel/transformer.properties | 7 +
.../apache/camel/transformer/weaviate-embeddings | 2 +
.../camel/transformer/weaviate-embeddings.json | 14 ++
.../camel/component/weaviate/WeaviateVectorDb.java | 7 +
.../WeaviateEmbeddingsDataTypeTransformer.java | 100 +++++++++++
.../WeaviateVectorDbEndpointBuilderFactory.java | 24 +++
12 files changed, 383 insertions(+), 2 deletions(-)
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/weaviate.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/weaviate.json
index eb63514b7b8..ab0a50c7ca2 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/weaviate.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/weaviate.json
@@ -48,7 +48,9 @@
"CamelWeaviateProperties": { "index": 10, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "HashMap", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Weaviate Object properties", "constantName": "org.apache.camel.component.weaviate.WeaviateVectorDb$Headers#PROPERTIES" },
"CamelWeaviateIndexId": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Index Id", "constantName": "org.apache.camel.component.weaviate.WeaviateVectorDb$Headers#INDEX_ID" },
"CamelWeaviateQueryTopK": { "index": 12, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Query Top K", "constantName": "org.apache.camel.component.weaviate.WeaviateVectorDb$Headers#QUERY_TOP_K" },
- "CamelWeaviateUpdateWithMerge": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "true", "description": "Merges properties into the object", "constantName": "org.apache.camel.component.weaviate.WeaviateVectorDb$Headers#UPDATE_WITH_MERGE" }
+ "CamelWeaviateUpdateWithMerge": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "true", "description": "Merges properties into the object", "constantName": "org.apache.camel.component.weaviate.WeaviateVectorDb$Headers#UPDATE_WITH_MERGE" },
+ "CamelWeaviateKeyName": { "index": 14, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Key Name for Insert\/Upsert operation", "constantName": "org.apache.camel.component.weaviate.WeaviateVectorDb$Headers#KEY_NAME" },
+ "CamelWeaviateKeyValue": { "index": 15, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Key Value for Insert\/Upsert operation", "constantName": "org.apache.camel.component.weaviate.WeaviateVectorDb$Headers#KEY_VALUE" }
},
"properties": {
"collection": { "index": 0, "kind": "path", "displayName": "Collection", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The collection Name" },
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/transformers.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/transformers.properties
index a0de4954cf1..d9a9a5e978b 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/transformers.properties
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/transformers.properties
@@ -40,3 +40,4 @@ qdrant-embeddings
qdrant-rag
slack-application-cloudevents
text-plain
+weaviate-embeddings
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/transformers/weaviate-embeddings.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/transformers/weaviate-embeddings.json
new file mode 100644
index 00000000000..6f0bef95cdc
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/transformers/weaviate-embeddings.json
@@ -0,0 +1,14 @@
+{
+ "transformer": {
+ "kind": "transformer",
+ "name": "weaviate:embeddings",
+ "title": "Weaviate (Embeddings)",
+ "description": "Prepares the message to become an object writable by Weaviate component",
+ "deprecated": false,
+ "javaType": "org.apache.camel.component.weaviate.transform.WeaviateEmbeddingsDataTypeTransformer",
+ "groupId": "org.apache.camel",
+ "artifactId": "camel-weaviate",
+ "version": "4.14.0-SNAPSHOT"
+ }
+}
+
diff --git a/components/camel-ai/camel-langchain4j-embeddings/pom.xml b/components/camel-ai/camel-langchain4j-embeddings/pom.xml
index 7cf5a98627f..7d22fb6d91a 100644
--- a/components/camel-ai/camel-langchain4j-embeddings/pom.xml
+++ b/components/camel-ai/camel-langchain4j-embeddings/pom.xml
@@ -94,6 +94,11 @@
<artifactId>camel-neo4j</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-weaviate</artifactId>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-test-junit5</artifactId>
@@ -152,6 +157,13 @@
<type>test-jar</type>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-infra-weaviate</artifactId>
+ <version>${project.version}</version>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
</dependencies>
</project>
diff --git a/components/camel-ai/camel-langchain4j-embeddings/src/test/java/org/apache/camel/component/langchain4j/embeddings/LangChain4jEmbeddingsComponentWeaviateTargetIT.java b/components/camel-ai/camel-langchain4j-embeddings/src/test/java/org/apache/camel/component/langchain4j/embeddings/LangChain4jEmbeddingsComponentWeaviateTargetIT.java
new file mode 100644
index 00000000000..d89cd9253ac
--- /dev/null
+++ b/components/camel-ai/camel-langchain4j-embeddings/src/test/java/org/apache/camel/component/langchain4j/embeddings/LangChain4jEmbeddingsComponentWeaviateTargetIT.java
@@ -0,0 +1,196 @@
+/*
+ * 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.component.langchain4j.embeddings;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import dev.langchain4j.model.embedding.onnx.allminilml6v2.AllMiniLmL6V2EmbeddingModel;
+import io.weaviate.client.base.Result;
+import io.weaviate.client.v1.data.model.WeaviateObject;
+import io.weaviate.client.v1.schema.model.WeaviateClass;
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.qdrant.QdrantAction;
+import org.apache.camel.component.weaviate.WeaviateVectorDb;
+import org.apache.camel.component.weaviate.WeaviateVectorDbAction;
+import org.apache.camel.component.weaviate.WeaviateVectorDbComponent;
+import org.apache.camel.spi.DataType;
+import org.apache.camel.test.infra.weaviate.services.WeaviateService;
+import org.apache.camel.test.infra.weaviate.services.WeaviateServiceFactory;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+public class LangChain4jEmbeddingsComponentWeaviateTargetIT extends CamelTestSupport {
+ public static final long POINT_ID = 8;
+ public static final String WEAVIATE_URI = "weaviate:embeddings";
+ private static String CREATEID = null;
+
+ @RegisterExtension
+ static WeaviateService WEAVIATE = WeaviateServiceFactory.createSingletonService();
+
+ @Override
+ protected CamelContext createCamelContext() throws Exception {
+ CamelContext context = super.createCamelContext();
+
+ var qc = context.getComponent(WeaviateVectorDb.SCHEME, WeaviateVectorDbComponent.class);
+ qc.getConfiguration().setScheme("http");
+ qc.getConfiguration().setHost(WEAVIATE.getWeaviateEndpointUrl());
+ context.getRegistry().bind("embedding-model", new AllMiniLmL6V2EmbeddingModel());
+
+ return context;
+ }
+
+ @Test
+ @Order(1)
+ public void createCollection() {
+ Exchange result = fluentTemplate.to(WEAVIATE_URI)
+ .withHeader(WeaviateVectorDb.Headers.ACTION, QdrantAction.CREATE_COLLECTION)
+ .withBody(
+ WeaviateClass.builder().className("embeddings").build())
+ .request(Exchange.class);
+
+ assertThat(result).isNotNull();
+ assertThat(result.getException()).isNull();
+ }
+
+ @Test
+ @Order(3)
+ public void create() {
+ HashMap<String, String> map = new HashMap<String, String>();
+ map.put("sky", "blue");
+ map.put("age", "34");
+
+ Exchange result = fluentTemplate.to("direct:in")
+ .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.CREATE)
+ .withBody("hi")
+ .withHeader(WeaviateVectorDb.Headers.COLLECTION_NAME, "embeddings")
+ .withHeader(WeaviateVectorDb.Headers.PROPERTIES, map)
+ .request(Exchange.class);
+
+ assertThat(result).isNotNull();
+ assertThat(result.getException()).isNull();
+ Result<WeaviateObject> res = (Result<WeaviateObject>) result.getIn().getBody();
+ CREATEID = res.getResult().getId();
+ }
+
+ @Test
+ @Order(3)
+ public void updateById() {
+
+ HashMap<String, String> map = new HashMap<String, String>();
+ map.put("dog", "dachshund");
+
+ Exchange result = fluentTemplate.to("direct:up")
+ .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.UPDATE_BY_ID)
+ .withBody("hi")
+ .withHeader(WeaviateVectorDb.Headers.INDEX_ID, CREATEID)
+ .withHeader(WeaviateVectorDb.Headers.COLLECTION_NAME, "embeddings")
+ .withHeader(WeaviateVectorDb.Headers.PROPERTIES, map)
+ .request(Exchange.class);
+
+ assertThat(result).isNotNull();
+ assertThat(result.getException()).isNull();
+ }
+
+ @Test
+ @Order(8)
+ public void querybyid() {
+ Exchange result = fluentTemplate.to(WEAVIATE_URI)
+ .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.QUERY_BY_ID)
+ .withHeader(WeaviateVectorDb.Headers.INDEX_ID, CREATEID)
+ .request(Exchange.class);
+
+ assertThat(result).isNotNull();
+ assertThat(result.getException()).isNull();
+ Result<WeaviateObject> res = (Result<WeaviateObject>) result.getIn().getBody();
+ assertThat(res.hasErrors()).isFalse();
+
+ List<WeaviateObject> list = (List) res.getResult();
+ for (WeaviateObject wo : list) {
+
+ Map<String, Object> map = wo.getProperties();
+ assertThat(map).containsKey("sky");
+ assertThat(map).containsKey("age");
+ assertThat(map).containsKey("dog");
+ }
+ }
+
+ @Test
+ @Order(9)
+ public void query() {
+ Exchange result = fluentTemplate.to("direct:query")
+ .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.QUERY)
+ .withBody("hi")
+ .request(Exchange.class);
+
+ assertThat(result).isNotNull();
+ assertThat(result.getException()).isNull();
+ assertNotNull(result.getIn().getBody());
+ }
+
+ @Override
+ protected RoutesBuilder createRouteBuilder() {
+ return new RouteBuilder() {
+ public void configure() {
+ from("direct:in")
+ .to("langchain4j-embeddings:test")
+ .setHeader(WeaviateVectorDb.Headers.ACTION).constant(WeaviateVectorDbAction.CREATE)
+ // transform data to embed to a vecto embeddings
+ .transform(
+ new DataType("weaviate:embeddings"))
+ .to(WEAVIATE_URI);
+
+ from("direct:up")
+ .to("langchain4j-embeddings:test")
+ // transform prompt into embeddings for search
+ .transform(
+ new DataType("weaviate:embeddings"))
+ .setHeader(WeaviateVectorDb.Headers.ACTION, constant(WeaviateVectorDbAction.UPDATE_BY_ID))
+ .to(WEAVIATE_URI)
+ // decode retrieved embeddings for RAG
+ .transform(
+ new DataType("weaviate:embeddings"));
+
+ from("direct:query")
+ .to("langchain4j-embeddings:test")
+ // transform prompt into embeddings for search
+ .transform(
+ new DataType("weaviate:embeddings"))
+ .setHeader(WeaviateVectorDb.Headers.ACTION, constant(WeaviateVectorDbAction.QUERY))
+ .to(WEAVIATE_URI)
+ // decode retrieved embeddings for RAG
+ .transform(
+ new DataType("weaviate:embeddings"));
+ }
+ };
+ }
+}
diff --git a/components/camel-ai/camel-weaviate/src/generated/resources/META-INF/org/apache/camel/component/weaviate/weaviate.json b/components/camel-ai/camel-weaviate/src/generated/resources/META-INF/org/apache/camel/component/weaviate/weaviate.json
index eb63514b7b8..ab0a50c7ca2 100644
--- a/components/camel-ai/camel-weaviate/src/generated/resources/META-INF/org/apache/camel/component/weaviate/weaviate.json
+++ b/components/camel-ai/camel-weaviate/src/generated/resources/META-INF/org/apache/camel/component/weaviate/weaviate.json
@@ -48,7 +48,9 @@
"CamelWeaviateProperties": { "index": 10, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "HashMap", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Weaviate Object properties", "constantName": "org.apache.camel.component.weaviate.WeaviateVectorDb$Headers#PROPERTIES" },
"CamelWeaviateIndexId": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Index Id", "constantName": "org.apache.camel.component.weaviate.WeaviateVectorDb$Headers#INDEX_ID" },
"CamelWeaviateQueryTopK": { "index": 12, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Query Top K", "constantName": "org.apache.camel.component.weaviate.WeaviateVectorDb$Headers#QUERY_TOP_K" },
- "CamelWeaviateUpdateWithMerge": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "true", "description": "Merges properties into the object", "constantName": "org.apache.camel.component.weaviate.WeaviateVectorDb$Headers#UPDATE_WITH_MERGE" }
+ "CamelWeaviateUpdateWithMerge": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "true", "description": "Merges properties into the object", "constantName": "org.apache.camel.component.weaviate.WeaviateVectorDb$Headers#UPDATE_WITH_MERGE" },
+ "CamelWeaviateKeyName": { "index": 14, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Key Name for Insert\/Upsert operation", "constantName": "org.apache.camel.component.weaviate.WeaviateVectorDb$Headers#KEY_NAME" },
+ "CamelWeaviateKeyValue": { "index": 15, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Key Value for Insert\/Upsert operation", "constantName": "org.apache.camel.component.weaviate.WeaviateVectorDb$Headers#KEY_VALUE" }
},
"properties": {
"collection": { "index": 0, "kind": "path", "displayName": "Collection", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The collection Name" },
diff --git a/components/camel-ai/camel-weaviate/src/generated/resources/META-INF/services/org/apache/camel/transformer.properties b/components/camel-ai/camel-weaviate/src/generated/resources/META-INF/services/org/apache/camel/transformer.properties
new file mode 100644
index 00000000000..2faff48da8b
--- /dev/null
+++ b/components/camel-ai/camel-weaviate/src/generated/resources/META-INF/services/org/apache/camel/transformer.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+transformers=weaviate:embeddings
+groupId=org.apache.camel
+artifactId=camel-weaviate
+version=4.14.0-SNAPSHOT
+projectName=Camel :: AI :: Weaviate
+projectDescription=Camel Weaviate support
diff --git a/components/camel-ai/camel-weaviate/src/generated/resources/META-INF/services/org/apache/camel/transformer/weaviate-embeddings b/components/camel-ai/camel-weaviate/src/generated/resources/META-INF/services/org/apache/camel/transformer/weaviate-embeddings
new file mode 100644
index 00000000000..c1b57cf57f9
--- /dev/null
+++ b/components/camel-ai/camel-weaviate/src/generated/resources/META-INF/services/org/apache/camel/transformer/weaviate-embeddings
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.weaviate.transform.WeaviateEmbeddingsDataTypeTransformer
diff --git a/components/camel-ai/camel-weaviate/src/generated/resources/META-INF/services/org/apache/camel/transformer/weaviate-embeddings.json b/components/camel-ai/camel-weaviate/src/generated/resources/META-INF/services/org/apache/camel/transformer/weaviate-embeddings.json
new file mode 100644
index 00000000000..6f0bef95cdc
--- /dev/null
+++ b/components/camel-ai/camel-weaviate/src/generated/resources/META-INF/services/org/apache/camel/transformer/weaviate-embeddings.json
@@ -0,0 +1,14 @@
+{
+ "transformer": {
+ "kind": "transformer",
+ "name": "weaviate:embeddings",
+ "title": "Weaviate (Embeddings)",
+ "description": "Prepares the message to become an object writable by Weaviate component",
+ "deprecated": false,
+ "javaType": "org.apache.camel.component.weaviate.transform.WeaviateEmbeddingsDataTypeTransformer",
+ "groupId": "org.apache.camel",
+ "artifactId": "camel-weaviate",
+ "version": "4.14.0-SNAPSHOT"
+ }
+}
+
diff --git a/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDb.java b/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDb.java
index 80a7dc6be2d..17a7a8617da 100644
--- a/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDb.java
+++ b/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDb.java
@@ -67,5 +67,12 @@ public class WeaviateVectorDb {
@Metadata(description = "Merges properties into the object", javaType = "Boolean", defaultValue = "true")
public static final String UPDATE_WITH_MERGE = "CamelWeaviateUpdateWithMerge";
+
+ @Metadata(description = "Key Name for Insert/Upsert operation", javaType = "String")
+ public static final String KEY_NAME = "CamelWeaviateKeyName";
+
+ @Metadata(description = "Key Value for Insert/Upsert operation", javaType = "String")
+ public static final String KEY_VALUE = "CamelWeaviateKeyValue";
+
}
}
diff --git a/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/transform/WeaviateEmbeddingsDataTypeTransformer.java b/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/transform/WeaviateEmbeddingsDataTypeTransformer.java
new file mode 100644
index 00000000000..5dbf805997c
--- /dev/null
+++ b/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/transform/WeaviateEmbeddingsDataTypeTransformer.java
@@ -0,0 +1,100 @@
+/*
+ * 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.component.weaviate.transform;
+
+import java.util.HashMap;
+import java.util.List;
+
+import dev.langchain4j.data.embedding.Embedding;
+import dev.langchain4j.data.segment.TextSegment;
+import org.apache.camel.Message;
+import org.apache.camel.ai.CamelLangchain4jAttributes;
+import org.apache.camel.component.weaviate.WeaviateVectorDb;
+import org.apache.camel.component.weaviate.WeaviateVectorDbAction;
+import org.apache.camel.spi.DataType;
+import org.apache.camel.spi.DataTypeTransformer;
+import org.apache.camel.spi.Transformer;
+import org.apache.camel.util.ObjectHelper;
+
+/**
+ * Maps a LangChain4j Embeddings to a Weaviate Create/UpdateByID to write an embeddings vector on a Weaviate Database.
+ */
+@DataTypeTransformer(name = "weaviate:embeddings",
+ description = "Prepares the message to become an object writable by Weaviate component")
+public class WeaviateEmbeddingsDataTypeTransformer extends Transformer {
+
+ @Override
+ public void transform(Message message, DataType fromType, DataType toType) {
+ Embedding embedding = message.getHeader(CamelLangchain4jAttributes.CAMEL_LANGCHAIN4J_EMBEDDING_VECTOR, Embedding.class);
+ String textFieldName = message.getHeader(WeaviateVectorDb.Headers.TEXT_FIELD_NAME, () -> "text", String.class);
+ String vectorFieldName = message.getHeader(WeaviateVectorDb.Headers.VECTOR_FIELD_NAME, () -> "vector", String.class);
+ String collectionName = message.getHeader(WeaviateVectorDb.Headers.COLLECTION_NAME, () -> "embeddings", String.class);
+ String keyName = message.getHeader(WeaviateVectorDb.Headers.KEY_NAME, () -> "id", String.class);
+ Object keyValue = message.getHeader(WeaviateVectorDb.Headers.KEY_VALUE, () -> null);
+ TextSegment text = message.getBody(TextSegment.class);
+ final WeaviateVectorDbAction action = message.getHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.class);
+ switch (action) {
+ case CREATE ->
+ createEmbeddingOperation(message, embedding, vectorFieldName, textFieldName, text, collectionName, keyValue,
+ keyName);
+ case UPDATE_BY_ID ->
+ updateEmbeddingOperation(message, embedding, vectorFieldName, textFieldName, text, collectionName, keyValue,
+ keyName);
+ case QUERY ->
+ queryEmbeddingOperation(message, embedding, vectorFieldName, textFieldName, text, collectionName, keyValue,
+ keyName);
+ default -> throw new IllegalStateException("The only operations supported are create and updatebyid");
+ }
+ }
+
+ private static void createEmbeddingOperation(
+ Message message, Embedding embedding, String vectorFieldName, String textFieldName, TextSegment text,
+ String collectionName, Object keyValue, String keyName) {
+ message.setBody(embedding.vectorAsList(), List.class);
+
+ if (ObjectHelper.isNotEmpty(keyValue) && ObjectHelper.isNotEmpty(keyName)) {
+ HashMap<String, Object> maps = new HashMap<String, Object>();
+ maps.put(keyName, keyValue);
+ message.setHeader(WeaviateVectorDb.Headers.PROPERTIES, maps);
+ }
+ }
+
+ private static void updateEmbeddingOperation(
+ Message message, Embedding embedding, String vectorFieldName, String textFieldName, TextSegment text,
+ String collectionName, Object keyValue, String keyName) {
+ message.setBody(embedding.vectorAsList(), List.class);
+
+ if (ObjectHelper.isNotEmpty(keyValue) && ObjectHelper.isNotEmpty(keyName)) {
+ HashMap<String, Object> maps = new HashMap<String, Object>();
+ maps.put(keyName, keyValue);
+ message.setHeader(WeaviateVectorDb.Headers.PROPERTIES, maps);
+ }
+ }
+
+ private static void queryEmbeddingOperation(
+ Message message, Embedding embedding, String vectorFieldName, String textFieldName, TextSegment text,
+ String collectionName, Object keyValue, String keyName) {
+ message.setBody(embedding.vectorAsList(), List.class);
+
+ if (ObjectHelper.isNotEmpty(keyValue) && ObjectHelper.isNotEmpty(keyName)) {
+ HashMap<String, Object> maps = new HashMap<String, Object>();
+ maps.put(keyName, keyValue);
+ message.setHeader(WeaviateVectorDb.Headers.PROPERTIES, maps);
+ }
+ }
+}
diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/WeaviateVectorDbEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/WeaviateVectorDbEndpointBuilderFactory.java
index 7510b92a6b0..89ce7a17754 100644
--- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/WeaviateVectorDbEndpointBuilderFactory.java
+++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/WeaviateVectorDbEndpointBuilderFactory.java
@@ -439,6 +439,30 @@ public interface WeaviateVectorDbEndpointBuilderFactory {
public String weaviateUpdateWithMerge() {
return "CamelWeaviateUpdateWithMerge";
}
+ /**
+ * Key Name for Insert/Upsert operation.
+ *
+ * The option is a: {@code String} type.
+ *
+ * Group: producer
+ *
+ * @return the name of the header {@code WeaviateKeyName}.
+ */
+ public String weaviateKeyName() {
+ return "CamelWeaviateKeyName";
+ }
+ /**
+ * Key Value for Insert/Upsert operation.
+ *
+ * The option is a: {@code String} type.
+ *
+ * Group: producer
+ *
+ * @return the name of the header {@code WeaviateKeyValue}.
+ */
+ public String weaviateKeyValue() {
+ return "CamelWeaviateKeyValue";
+ }
}
static WeaviateVectorDbEndpointBuilder endpointBuilder(String componentName, String path) {
class WeaviateVectorDbEndpointBuilderImpl extends AbstractEndpointBuilder implements WeaviateVectorDbEndpointBuilder, AdvancedWeaviateVectorDbEndpointBuilder {