This is an automated email from the ASF dual-hosted git repository. acosentino 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 cde8d2521cd CAMEL-21012 - camel-milvus: action name mismatch with embeddings (#15041) cde8d2521cd is described below commit cde8d2521cd106841779d8afc6b5cd6126517d48 Author: Andrea Cosentino <anco...@gmail.com> AuthorDate: Wed Aug 7 14:36:46 2024 +0200 CAMEL-21012 - camel-milvus: action name mismatch with embeddings (#15041) * CAMEL-21012 - camel-milvus: action name mismatch with embeddings Signed-off-by: Andrea Cosentino <anco...@gmail.com> * CAMEL-21012 - camel-milvus: action name mismatch with embeddings Signed-off-by: Andrea Cosentino <anco...@gmail.com> --------- Signed-off-by: Andrea Cosentino <anco...@gmail.com> --- .../apache/camel/catalog/components/milvus.json | 4 +- ...ngChain4jEmbeddingsComponentMilvusTargetIT.java | 23 ++++++++++- .../org/apache/camel/component/milvus/milvus.json | 4 +- .../org/apache/camel/component/milvus/Milvus.java | 6 +++ .../MilvusEmbeddingsDataTypeTransformer.java | 46 ++++++++++++++++++++++ .../endpoint/dsl/MilvusEndpointBuilderFactory.java | 24 +++++++++++ 6 files changed, 104 insertions(+), 3 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/milvus.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/milvus.json index 6405557553d..b0fdb0f3bd5 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/milvus.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/milvus.json @@ -37,7 +37,9 @@ "CamelMilvusOperationStatusValue": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Operation Status Value.", "constantName": "org.apache.camel.component.milvus.Milvus$Headers#OPERATION_STATUS_VALUE" }, "CamelMilvusTextFieldName": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Text Field Name for Insert\/Upsert operation", "constantName": "org.apache.camel.component.milvus.Milvus$Headers#TEXT_FIELD_NAME" }, "CamelMilvusVectorFieldName": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Vector Field Name for Insert\/Upsert operation", "constantName": "org.apache.camel.component.milvus.Milvus$Headers#VECTOR_FIELD_NAME" }, - "CamelMilvusCollectionName": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Collection Name for Insert\/Upsert operation", "constantName": "org.apache.camel.component.milvus.Milvus$Headers#COLLECTION_NAME" } + "CamelMilvusCollectionName": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Collection Name for Insert\/Upsert operation", "constantName": "org.apache.camel.component.milvus.Milvus$Headers#COLLECTION_NAME" }, + "CamelMilvusKeyName": { "index": 6, "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.milvus.Milvus$Headers#KEY_NAME" }, + "CamelMilvusKeyValue": { "index": 7, "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.milvus.Milvus$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-langchain4j-embeddings/src/test/java/org/apache/camel/component/langchain4j/embeddings/LangChain4jEmbeddingsComponentMilvusTargetIT.java b/components/camel-ai/camel-langchain4j-embeddings/src/test/java/org/apache/camel/component/langchain4j/embeddings/LangChain4jEmbeddingsComponentMilvusTargetIT.java index 28811aa4faa..3baf991111e 100644 --- a/components/camel-ai/camel-langchain4j-embeddings/src/test/java/org/apache/camel/component/langchain4j/embeddings/LangChain4jEmbeddingsComponentMilvusTargetIT.java +++ b/components/camel-ai/camel-langchain4j-embeddings/src/test/java/org/apache/camel/component/langchain4j/embeddings/LangChain4jEmbeddingsComponentMilvusTargetIT.java @@ -80,7 +80,6 @@ public class LangChain4jEmbeddingsComponentMilvusTargetIT extends CamelTestSuppo .withDescription("user identification") .withDataType(DataType.Int64) .withPrimaryKey(true) - .withAutoID(true) .build(); FieldType fieldType2 = FieldType.newBuilder() @@ -171,6 +170,18 @@ public class LangChain4jEmbeddingsComponentMilvusTargetIT extends CamelTestSuppo c -> assertThat(c.rowRecords.size() == 1)); } + @Test + @Order(4) + public void upsert() { + + Exchange result = fluentTemplate.to("direct:up") + .withBody("hello") + .request(Exchange.class); + + assertThat(result).isNotNull(); + assertThat(result.getException()).isNull(); + } + @Override protected RoutesBuilder createRouteBuilder() { return new RouteBuilder() { @@ -178,6 +189,16 @@ public class LangChain4jEmbeddingsComponentMilvusTargetIT extends CamelTestSuppo from("direct:in") .to("langchain4j-embeddings:test") .setHeader(Milvus.Headers.ACTION).constant(MilvusAction.INSERT) + .setHeader(Milvus.Headers.KEY_NAME).constant("userID") + .setHeader(Milvus.Headers.KEY_VALUE).constant(Long.valueOf("3")) + .transform(new org.apache.camel.spi.DataType("milvus:embeddings")) + .to(MILVUS_URI); + + from("direct:up") + .to("langchain4j-embeddings:test") + .setHeader(Milvus.Headers.ACTION).constant(MilvusAction.UPSERT) + .setHeader(Milvus.Headers.KEY_NAME).constant("userID") + .setHeader(Milvus.Headers.KEY_VALUE).constant(Long.valueOf("3")) .transform(new org.apache.camel.spi.DataType("milvus:embeddings")) .to(MILVUS_URI); } diff --git a/components/camel-ai/camel-milvus/src/generated/resources/META-INF/org/apache/camel/component/milvus/milvus.json b/components/camel-ai/camel-milvus/src/generated/resources/META-INF/org/apache/camel/component/milvus/milvus.json index 6405557553d..b0fdb0f3bd5 100644 --- a/components/camel-ai/camel-milvus/src/generated/resources/META-INF/org/apache/camel/component/milvus/milvus.json +++ b/components/camel-ai/camel-milvus/src/generated/resources/META-INF/org/apache/camel/component/milvus/milvus.json @@ -37,7 +37,9 @@ "CamelMilvusOperationStatusValue": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Operation Status Value.", "constantName": "org.apache.camel.component.milvus.Milvus$Headers#OPERATION_STATUS_VALUE" }, "CamelMilvusTextFieldName": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Text Field Name for Insert\/Upsert operation", "constantName": "org.apache.camel.component.milvus.Milvus$Headers#TEXT_FIELD_NAME" }, "CamelMilvusVectorFieldName": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Vector Field Name for Insert\/Upsert operation", "constantName": "org.apache.camel.component.milvus.Milvus$Headers#VECTOR_FIELD_NAME" }, - "CamelMilvusCollectionName": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Collection Name for Insert\/Upsert operation", "constantName": "org.apache.camel.component.milvus.Milvus$Headers#COLLECTION_NAME" } + "CamelMilvusCollectionName": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Collection Name for Insert\/Upsert operation", "constantName": "org.apache.camel.component.milvus.Milvus$Headers#COLLECTION_NAME" }, + "CamelMilvusKeyName": { "index": 6, "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.milvus.Milvus$Headers#KEY_NAME" }, + "CamelMilvusKeyValue": { "index": 7, "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.milvus.Milvus$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-milvus/src/main/java/org/apache/camel/component/milvus/Milvus.java b/components/camel-ai/camel-milvus/src/main/java/org/apache/camel/component/milvus/Milvus.java index 0a5a2fe1f83..defaf5cd3ec 100644 --- a/components/camel-ai/camel-milvus/src/main/java/org/apache/camel/component/milvus/Milvus.java +++ b/components/camel-ai/camel-milvus/src/main/java/org/apache/camel/component/milvus/Milvus.java @@ -43,5 +43,11 @@ public class Milvus { @Metadata(description = "Collection Name for Insert/Upsert operation", javaType = "String") public static final String COLLECTION_NAME = "CamelMilvusCollectionName"; + + @Metadata(description = "Key Name for Insert/Upsert operation", javaType = "String") + public static final String KEY_NAME = "CamelMilvusKeyName"; + + @Metadata(description = "Key Value for Insert/Upsert operation", javaType = "String") + public static final String KEY_VALUE = "CamelMilvusKeyValue"; } } diff --git a/components/camel-ai/camel-milvus/src/main/java/org/apache/camel/component/milvus/transform/MilvusEmbeddingsDataTypeTransformer.java b/components/camel-ai/camel-milvus/src/main/java/org/apache/camel/component/milvus/transform/MilvusEmbeddingsDataTypeTransformer.java index 5cd64f1c3b4..f1debf059b0 100644 --- a/components/camel-ai/camel-milvus/src/main/java/org/apache/camel/component/milvus/transform/MilvusEmbeddingsDataTypeTransformer.java +++ b/components/camel-ai/camel-milvus/src/main/java/org/apache/camel/component/milvus/transform/MilvusEmbeddingsDataTypeTransformer.java @@ -24,12 +24,15 @@ import java.util.List; import dev.langchain4j.data.embedding.Embedding; import dev.langchain4j.data.segment.TextSegment; import io.milvus.param.dml.InsertParam; +import io.milvus.param.dml.UpsertParam; import org.apache.camel.Message; import org.apache.camel.ai.CamelLangchain4jAttributes; import org.apache.camel.component.milvus.Milvus; +import org.apache.camel.component.milvus.MilvusAction; 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 Milvus InsertParam/Upsert Param to write an embeddings vector on a Milvus @@ -45,13 +48,34 @@ public class MilvusEmbeddingsDataTypeTransformer extends Transformer { String textFieldName = message.getHeader(Milvus.Headers.TEXT_FIELD_NAME, () -> "text", String.class); String vectorFieldName = message.getHeader(Milvus.Headers.VECTOR_FIELD_NAME, () -> "vector", String.class); String collectionName = message.getHeader(Milvus.Headers.COLLECTION_NAME, () -> "embeddings", String.class); + String keyName = message.getHeader(Milvus.Headers.KEY_NAME, () -> "id", String.class); + Object keyValue = message.getHeader(Milvus.Headers.KEY_VALUE, () -> null); TextSegment text = message.getBody(TextSegment.class); + final MilvusAction action = message.getHeader(Milvus.Headers.ACTION, MilvusAction.class); + switch (action) { + case INSERT -> insertEmbeddingOperation(message, embedding, vectorFieldName, textFieldName, text, collectionName, + keyValue, keyName); + case UPSERT -> upsertEmbeddingOperation(message, embedding, vectorFieldName, textFieldName, text, collectionName, + keyValue, keyName); + default -> throw new IllegalStateException("The only operations supported are insert and upsert"); + } + } + + private static void insertEmbeddingOperation( + Message message, Embedding embedding, String vectorFieldName, String textFieldName, TextSegment text, + String collectionName, Object keyValue, String keyName) { List<InsertParam.Field> fields = new ArrayList<>(); ArrayList list = new ArrayList<>(); list.add(embedding.vectorAsList()); fields.add(new InsertParam.Field(vectorFieldName, list)); fields.add(new InsertParam.Field(textFieldName, Collections.singletonList(text.text()))); + if (ObjectHelper.isNotEmpty(keyValue) && ObjectHelper.isNotEmpty(keyName)) { + ArrayList keyValues = new ArrayList<>(); + keyValues.add(keyValue); + fields.add(new InsertParam.Field(keyName, keyValues)); + } + InsertParam insertParam = InsertParam.newBuilder() .withCollectionName(collectionName) .withFields(fields) @@ -59,4 +83,26 @@ public class MilvusEmbeddingsDataTypeTransformer extends Transformer { message.setBody(insertParam); } + + private static void upsertEmbeddingOperation( + Message message, Embedding embedding, String vectorFieldName, String textFieldName, TextSegment text, + String collectionName, Object keyValue, String keyName) { + List<InsertParam.Field> fields = new ArrayList<>(); + ArrayList list = new ArrayList<>(); + list.add(embedding.vectorAsList()); + fields.add(new UpsertParam.Field(vectorFieldName, list)); + fields.add(new UpsertParam.Field(textFieldName, Collections.singletonList(text.text()))); + if (ObjectHelper.isNotEmpty(keyValue) && ObjectHelper.isNotEmpty(keyName)) { + ArrayList keyValues = new ArrayList<>(); + keyValues.add(keyValue); + fields.add(new UpsertParam.Field(keyName, keyValues)); + } + + UpsertParam upsertParam = UpsertParam.newBuilder() + .withCollectionName(collectionName) + .withFields(fields) + .build(); + + message.setBody(upsertParam); + } } diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/MilvusEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/MilvusEndpointBuilderFactory.java index 2e3b76f8266..cc09b81be7b 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/MilvusEndpointBuilderFactory.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/MilvusEndpointBuilderFactory.java @@ -329,6 +329,30 @@ public interface MilvusEndpointBuilderFactory { public String milvusCollectionName() { return "CamelMilvusCollectionName"; } + /** + * Key Name for Insert/Upsert operation. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code MilvusKeyName}. + */ + public String milvusKeyName() { + return "CamelMilvusKeyName"; + } + /** + * Key Value for Insert/Upsert operation. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code MilvusKeyValue}. + */ + public String milvusKeyValue() { + return "CamelMilvusKeyValue"; + } } static MilvusEndpointBuilder endpointBuilder(String componentName, String path) { class MilvusEndpointBuilderImpl extends AbstractEndpointBuilder implements MilvusEndpointBuilder, AdvancedMilvusEndpointBuilder {