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 57af72ce79b4 CAMEL-24366: Add embeddingModel auto-embed to
langchain4j-embeddingstore component
57af72ce79b4 is described below
commit 57af72ce79b401306f7b76193023375a84894ff4
Author: JiriOndrusek <[email protected]>
AuthorDate: Thu Aug 6 16:18:26 2026 +0200
CAMEL-24366: Add embeddingModel auto-embed to langchain4j-embeddingstore
component
Adds an optional embeddingModel property (autowired) to the
langchain4j-embeddingstore
component. When configured, ADD and SEARCH operations accept plain text in
the message
body instead of requiring a pre-computed Embedding header. The existing
CamelLangChain4jEmbeddingsEmbedding header always takes precedence when
present,
preserving backward compatibility.
Closes #25387
Co-Authored-By: Claude Opus 4.6 <[email protected]>
---
.../components/langchain4j-embeddingstore.json | 28 ++--
.../docs/langchain4j-embeddingstore-component.adoc | 49 ++++++-
...ngChain4jEmbeddingStoreComponentConfigurer.java | 8 +-
...ain4jEmbeddingStoreConfigurationConfigurer.java | 6 +
...angChain4jEmbeddingStoreEndpointConfigurer.java | 8 +-
...angChain4jEmbeddingStoreEndpointUriFactory.java | 3 +-
.../embeddingstore/langchain4j-embeddingstore.json | 28 ++--
.../docs/langchain4j-embeddingstore-component.adoc | 49 ++++++-
.../LangChain4jEmbeddingStoreConfiguration.java | 16 ++
.../LangChain4jEmbeddingStoreProducer.java | 56 +++++--
.../LangChain4jEmbeddingStoreAutoEmbedTest.java | 161 +++++++++++++++++++++
.../ROOT/pages/camel-4x-upgrade-guide-4_22.adoc | 7 +
...ain4jEmbeddingstoreComponentBuilderFactory.java | 21 +++
...hain4jEmbeddingStoreEndpointBuilderFactory.java | 38 +++++
14 files changed, 430 insertions(+), 48 deletions(-)
diff --git
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/langchain4j-embeddingstore.json
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/langchain4j-embeddingstore.json
index f28886c6612e..55a9da32fdc3 100644
---
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/langchain4j-embeddingstore.json
+++
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/langchain4j-embeddingstore.json
@@ -26,13 +26,14 @@
"componentProperties": {
"action": { "index": 0, "kind": "property", "displayName": "Action",
"group": "producer", "label": "", "required": false, "type": "enum",
"javaType":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreAction",
"enum": [ "ADD", "REMOVE", "SEARCH" ], "deprecated": false, "autowired":
false, "secret": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configurati [...]
"configuration": { "index": 1, "kind": "property", "displayName":
"Configuration", "group": "producer", "label": "", "required": false, "type":
"object", "javaType":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"deprecated": false, "autowired": false, "secret": false, "description": "The
configuration;" },
- "embeddingStore": { "index": 2, "kind": "property", "displayName":
"Embedding Store", "group": "producer", "label": "", "required": false, "type":
"object", "javaType":
"dev.langchain4j.store.embedding.EmbeddingStore<dev.langchain4j.data.segment.TextSegment>",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret":
false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "config [...]
- "embeddingStoreFactory": { "index": 3, "kind": "property", "displayName":
"Embedding Store Factory", "group": "producer", "label": "", "required": false,
"type": "object", "javaType":
"org.apache.camel.component.langchain4j.embeddingstore.EmbeddingStoreFactory",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret": false,
"configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "conf [...]
- "lazyStartProducer": { "index": 4, "kind": "property", "displayName":
"Lazy Start Producer", "group": "producer", "label": "producer", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Whether the producer should be started lazy (on the first message). By
starting lazy you can use this to allow CamelContext and routes to startup in
situations where a producer may otherwise fail [...]
- "maxResults": { "index": 5, "kind": "property", "displayName": "Max
Results", "group": "producer", "label": "", "required": false, "type":
"integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": 5, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Maximum number of
results to return for SEARCH operation" },
- "minScore": { "index": 6, "kind": "property", "displayName": "Min Score",
"group": "producer", "label": "", "required": false, "type": "number",
"javaType": "java.lang.Double", "deprecated": false, "autowired": false,
"secret": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Minimum similarity
score threshold for SEARCH operation (0.0 to 1.0)" },
- "returnTextContent": { "index": 7, "kind": "property", "displayName":
"Return Text Content", "group": "producer", "label": "", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "When true, SEARCH
returns List with text conte [...]
- "autowiredEnabled": { "index": 8, "kind": "property", "displayName":
"Autowired Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether autowiring is enabled. This is used for automatic autowiring options
(the option must be marked as autowired) by looking up in the registry to find
if there is a single instance of matching t [...]
+ "embeddingModel": { "index": 2, "kind": "property", "displayName":
"Embedding Model", "group": "producer", "label": "", "required": false, "type":
"object", "javaType": "dev.langchain4j.model.embedding.EmbeddingModel",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret": false,
"configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Embedding model [...]
+ "embeddingStore": { "index": 3, "kind": "property", "displayName":
"Embedding Store", "group": "producer", "label": "", "required": false, "type":
"object", "javaType":
"dev.langchain4j.store.embedding.EmbeddingStore<dev.langchain4j.data.segment.TextSegment>",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret":
false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "config [...]
+ "embeddingStoreFactory": { "index": 4, "kind": "property", "displayName":
"Embedding Store Factory", "group": "producer", "label": "", "required": false,
"type": "object", "javaType":
"org.apache.camel.component.langchain4j.embeddingstore.EmbeddingStoreFactory",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret": false,
"configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "conf [...]
+ "lazyStartProducer": { "index": 5, "kind": "property", "displayName":
"Lazy Start Producer", "group": "producer", "label": "producer", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Whether the producer should be started lazy (on the first message). By
starting lazy you can use this to allow CamelContext and routes to startup in
situations where a producer may otherwise fail [...]
+ "maxResults": { "index": 6, "kind": "property", "displayName": "Max
Results", "group": "producer", "label": "", "required": false, "type":
"integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": 5, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Maximum number of
results to return for SEARCH operation" },
+ "minScore": { "index": 7, "kind": "property", "displayName": "Min Score",
"group": "producer", "label": "", "required": false, "type": "number",
"javaType": "java.lang.Double", "deprecated": false, "autowired": false,
"secret": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Minimum similarity
score threshold for SEARCH operation (0.0 to 1.0)" },
+ "returnTextContent": { "index": 8, "kind": "property", "displayName":
"Return Text Content", "group": "producer", "label": "", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "When true, SEARCH
returns List with text conte [...]
+ "autowiredEnabled": { "index": 9, "kind": "property", "displayName":
"Autowired Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether autowiring is enabled. This is used for automatic autowiring options
(the option must be marked as autowired) by looking up in the registry to find
if there is a single instance of matching t [...]
},
"headers": {
"CamelLangchain4jEmbeddingStoreAction": { "index": 0, "kind": "header",
"displayName": "", "group": "producer", "label": "", "required": false,
"javaType": "String", "enum": [ "ADD", "REMOVE", "SEARCH" ], "deprecated":
false, "deprecationNote": "", "autowired": false, "secret": false,
"description": "The action to be performed.", "constantName":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreHeaders#ACTION"
},
@@ -43,11 +44,12 @@
"properties": {
"embeddingStoreId": { "index": 0, "kind": "path", "displayName":
"Embedding Store Id", "group": "producer", "label": "", "required": true,
"type": "string", "javaType": "java.lang.String", "deprecated": false,
"deprecationNote": "", "autowired": false, "secret": false, "description": "The
id of the embedding store" },
"action": { "index": 1, "kind": "parameter", "displayName": "Action",
"group": "producer", "label": "", "required": false, "type": "enum",
"javaType":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreAction",
"enum": [ "ADD", "REMOVE", "SEARCH" ], "deprecated": false, "autowired":
false, "secret": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configurat [...]
- "embeddingStore": { "index": 2, "kind": "parameter", "displayName":
"Embedding Store", "group": "producer", "label": "", "required": false, "type":
"object", "javaType":
"dev.langchain4j.store.embedding.EmbeddingStore<dev.langchain4j.data.segment.TextSegment>",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret":
false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "confi [...]
- "embeddingStoreFactory": { "index": 3, "kind": "parameter", "displayName":
"Embedding Store Factory", "group": "producer", "label": "", "required": false,
"type": "object", "javaType":
"org.apache.camel.component.langchain4j.embeddingstore.EmbeddingStoreFactory",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret": false,
"configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "con [...]
- "maxResults": { "index": 4, "kind": "parameter", "displayName": "Max
Results", "group": "producer", "label": "", "required": false, "type":
"integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": 5, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Maximum number of
results to return for SEARCH operation" },
- "minScore": { "index": 5, "kind": "parameter", "displayName": "Min Score",
"group": "producer", "label": "", "required": false, "type": "number",
"javaType": "java.lang.Double", "deprecated": false, "autowired": false,
"secret": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Minimum similarity
score threshold for SEARCH operation (0.0 to 1.0)" },
- "returnTextContent": { "index": 6, "kind": "parameter", "displayName":
"Return Text Content", "group": "producer", "label": "", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "When true, SEARCH
returns List with text cont [...]
- "lazyStartProducer": { "index": 7, "kind": "parameter", "displayName":
"Lazy Start Producer", "group": "producer (advanced)", "label":
"producer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Whether the producer should be started
lazy (on the first message). By starting lazy you can use this to allow
CamelContext and routes to startup in situations where a produc [...]
+ "embeddingModel": { "index": 2, "kind": "parameter", "displayName":
"Embedding Model", "group": "producer", "label": "", "required": false, "type":
"object", "javaType": "dev.langchain4j.model.embedding.EmbeddingModel",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret": false,
"configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Embedding model [...]
+ "embeddingStore": { "index": 3, "kind": "parameter", "displayName":
"Embedding Store", "group": "producer", "label": "", "required": false, "type":
"object", "javaType":
"dev.langchain4j.store.embedding.EmbeddingStore<dev.langchain4j.data.segment.TextSegment>",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret":
false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "confi [...]
+ "embeddingStoreFactory": { "index": 4, "kind": "parameter", "displayName":
"Embedding Store Factory", "group": "producer", "label": "", "required": false,
"type": "object", "javaType":
"org.apache.camel.component.langchain4j.embeddingstore.EmbeddingStoreFactory",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret": false,
"configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "con [...]
+ "maxResults": { "index": 5, "kind": "parameter", "displayName": "Max
Results", "group": "producer", "label": "", "required": false, "type":
"integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": 5, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Maximum number of
results to return for SEARCH operation" },
+ "minScore": { "index": 6, "kind": "parameter", "displayName": "Min Score",
"group": "producer", "label": "", "required": false, "type": "number",
"javaType": "java.lang.Double", "deprecated": false, "autowired": false,
"secret": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Minimum similarity
score threshold for SEARCH operation (0.0 to 1.0)" },
+ "returnTextContent": { "index": 7, "kind": "parameter", "displayName":
"Return Text Content", "group": "producer", "label": "", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "When true, SEARCH
returns List with text cont [...]
+ "lazyStartProducer": { "index": 8, "kind": "parameter", "displayName":
"Lazy Start Producer", "group": "producer (advanced)", "label":
"producer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Whether the producer should be started
lazy (on the first message). By starting lazy you can use this to allow
CamelContext and routes to startup in situations where a produc [...]
}
}
diff --git
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-embeddingstore-component.adoc
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-embeddingstore-component.adoc
index 942444fb4208..b31d314d4e12 100644
---
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-embeddingstore-component.adoc
+++
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-embeddingstore-component.adoc
@@ -72,9 +72,54 @@ EmbeddingStore<TextSegment> embeddingStore =
PgVectorEmbeddingStore.builder()
context.getRegistry().bind("myEmbeddingStore", embeddingStore);
----
+=== Auto-Embedding with `embeddingModel`
+
+When an `EmbeddingModel` is configured (either explicitly or via autowiring
from the registry), the ADD and SEARCH operations can accept plain text in the
message body instead of requiring a pre-computed embedding in the
`CamelLangChain4jEmbeddingsEmbedding` header. The component will automatically
compute the embedding from the body text.
+
+If the `CamelLangChain4jEmbeddingsEmbedding` header is present, it always
takes precedence over auto-embedding.
+
+[tabs]
+====
+Java::
++
+[source,java]
+----
+from("direct:store")
+ .to("langchain4j-embeddingstore:myStore?action=ADD");
+
+from("direct:search")
+
.to("langchain4j-embeddingstore:myStore?action=SEARCH&returnTextContent=true");
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+ from:
+ uri: direct:store
+ steps:
+ - to:
+ uri: langchain4j-embeddingstore:myStore
+ parameters:
+ action: ADD
+- route:
+ from:
+ uri: direct:search
+ steps:
+ - to:
+ uri: langchain4j-embeddingstore:myStore
+ parameters:
+ action: SEARCH
+ returnTextContent: true
+----
+====
+
+This eliminates the need for a separate `langchain4j-embeddings:embed` step in
the route.
+
=== Storing Embeddings (ADD Operation)
-Store embeddings with optional text segments:
+Store embeddings with optional text segments. Without `embeddingModel`, a
pre-computed embedding must be provided via the `langchain4j-embeddings`
component:
[tabs]
====
@@ -108,7 +153,7 @@ The response body contains the generated embedding ID.
=== Searching Embeddings (SEARCH Operation)
-Perform similarity search to find relevant content:
+Perform similarity search to find relevant content. Without `embeddingModel`,
a pre-computed query embedding must be provided:
[tabs]
====
diff --git
a/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreComponentConfigurer.java
b/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreComponentConfigurer.java
index e9514aede8b5..ba983442b2c2 100644
---
a/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreComponentConfigurer.java
+++
b/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreComponentConfigurer.java
@@ -34,6 +34,8 @@ public class LangChain4jEmbeddingStoreComponentConfigurer
extends PropertyConfig
case "autowiredenabled":
case "autowiredEnabled":
target.setAutowiredEnabled(property(camelContext, boolean.class, value));
return true;
case "configuration": target.setConfiguration(property(camelContext,
org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration.class,
value)); return true;
+ case "embeddingmodel":
+ case "embeddingModel":
getOrCreateConfiguration(target).setEmbeddingModel(property(camelContext,
dev.langchain4j.model.embedding.EmbeddingModel.class, value)); return true;
case "embeddingstore":
case "embeddingStore":
getOrCreateConfiguration(target).setEmbeddingStore(property(camelContext,
dev.langchain4j.store.embedding.EmbeddingStore.class, value)); return true;
case "embeddingstorefactory":
@@ -52,7 +54,7 @@ public class LangChain4jEmbeddingStoreComponentConfigurer
extends PropertyConfig
@Override
public String[] getAutowiredNames() {
- return new String[]{"embeddingStore", "embeddingStoreFactory"};
+ return new String[]{"embeddingModel", "embeddingStore",
"embeddingStoreFactory"};
}
@Override
@@ -62,6 +64,8 @@ public class LangChain4jEmbeddingStoreComponentConfigurer
extends PropertyConfig
case "autowiredenabled":
case "autowiredEnabled": return boolean.class;
case "configuration": return
org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration.class;
+ case "embeddingmodel":
+ case "embeddingModel": return
dev.langchain4j.model.embedding.EmbeddingModel.class;
case "embeddingstore":
case "embeddingStore": return
dev.langchain4j.store.embedding.EmbeddingStore.class;
case "embeddingstorefactory":
@@ -86,6 +90,8 @@ public class LangChain4jEmbeddingStoreComponentConfigurer
extends PropertyConfig
case "autowiredenabled":
case "autowiredEnabled": return target.isAutowiredEnabled();
case "configuration": return target.getConfiguration();
+ case "embeddingmodel":
+ case "embeddingModel": return
getOrCreateConfiguration(target).getEmbeddingModel();
case "embeddingstore":
case "embeddingStore": return
getOrCreateConfiguration(target).getEmbeddingStore();
case "embeddingstorefactory":
diff --git
a/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreConfigurationConfigurer.java
b/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreConfigurationConfigurer.java
index 23be327bc30e..a58d71e7a312 100644
---
a/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreConfigurationConfigurer.java
+++
b/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreConfigurationConfigurer.java
@@ -24,6 +24,8 @@ public class LangChain4jEmbeddingStoreConfigurationConfigurer
extends org.apache
org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration
target =
(org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration)
obj;
switch (ignoreCase ? name.toLowerCase() : name) {
case "action": target.setAction(property(camelContext,
org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreAction.class,
value)); return true;
+ case "embeddingmodel":
+ case "embeddingModel": target.setEmbeddingModel(property(camelContext,
dev.langchain4j.model.embedding.EmbeddingModel.class, value)); return true;
case "embeddingstore":
case "embeddingStore": target.setEmbeddingStore(property(camelContext,
dev.langchain4j.store.embedding.EmbeddingStore.class, value)); return true;
case "embeddingstorefactory":
@@ -42,6 +44,8 @@ public class LangChain4jEmbeddingStoreConfigurationConfigurer
extends org.apache
public Class<?> getOptionType(String name, boolean ignoreCase) {
switch (ignoreCase ? name.toLowerCase() : name) {
case "action": return
org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreAction.class;
+ case "embeddingmodel":
+ case "embeddingModel": return
dev.langchain4j.model.embedding.EmbeddingModel.class;
case "embeddingstore":
case "embeddingStore": return
dev.langchain4j.store.embedding.EmbeddingStore.class;
case "embeddingstorefactory":
@@ -61,6 +65,8 @@ public class LangChain4jEmbeddingStoreConfigurationConfigurer
extends org.apache
org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration
target =
(org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration)
obj;
switch (ignoreCase ? name.toLowerCase() : name) {
case "action": return target.getAction();
+ case "embeddingmodel":
+ case "embeddingModel": return target.getEmbeddingModel();
case "embeddingstore":
case "embeddingStore": return target.getEmbeddingStore();
case "embeddingstorefactory":
diff --git
a/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreEndpointConfigurer.java
b/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreEndpointConfigurer.java
index f90f9ac8fc73..4b07c809994e 100644
---
a/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreEndpointConfigurer.java
+++
b/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreEndpointConfigurer.java
@@ -24,6 +24,8 @@ public class LangChain4jEmbeddingStoreEndpointConfigurer
extends PropertyConfigu
LangChain4jEmbeddingStoreEndpoint target =
(LangChain4jEmbeddingStoreEndpoint) obj;
switch (ignoreCase ? name.toLowerCase() : name) {
case "action":
target.getConfiguration().setAction(property(camelContext,
org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreAction.class,
value)); return true;
+ case "embeddingmodel":
+ case "embeddingModel":
target.getConfiguration().setEmbeddingModel(property(camelContext,
dev.langchain4j.model.embedding.EmbeddingModel.class, value)); return true;
case "embeddingstore":
case "embeddingStore":
target.getConfiguration().setEmbeddingStore(property(camelContext,
dev.langchain4j.store.embedding.EmbeddingStore.class, value)); return true;
case "embeddingstorefactory":
@@ -42,13 +44,15 @@ public class LangChain4jEmbeddingStoreEndpointConfigurer
extends PropertyConfigu
@Override
public String[] getAutowiredNames() {
- return new String[]{"embeddingStore", "embeddingStoreFactory"};
+ return new String[]{"embeddingModel", "embeddingStore",
"embeddingStoreFactory"};
}
@Override
public Class<?> getOptionType(String name, boolean ignoreCase) {
switch (ignoreCase ? name.toLowerCase() : name) {
case "action": return
org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreAction.class;
+ case "embeddingmodel":
+ case "embeddingModel": return
dev.langchain4j.model.embedding.EmbeddingModel.class;
case "embeddingstore":
case "embeddingStore": return
dev.langchain4j.store.embedding.EmbeddingStore.class;
case "embeddingstorefactory":
@@ -70,6 +74,8 @@ public class LangChain4jEmbeddingStoreEndpointConfigurer
extends PropertyConfigu
LangChain4jEmbeddingStoreEndpoint target =
(LangChain4jEmbeddingStoreEndpoint) obj;
switch (ignoreCase ? name.toLowerCase() : name) {
case "action": return target.getConfiguration().getAction();
+ case "embeddingmodel":
+ case "embeddingModel": return
target.getConfiguration().getEmbeddingModel();
case "embeddingstore":
case "embeddingStore": return
target.getConfiguration().getEmbeddingStore();
case "embeddingstorefactory":
diff --git
a/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreEndpointUriFactory.java
b/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreEndpointUriFactory.java
index 5de9516ea1dd..c989552b3154 100644
---
a/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreEndpointUriFactory.java
+++
b/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreEndpointUriFactory.java
@@ -24,8 +24,9 @@ public class LangChain4jEmbeddingStoreEndpointUriFactory
extends org.apache.came
private static final Set<String> ENDPOINT_IDENTITY_PROPERTY_NAMES;
private static final Map<String, String> MULTI_VALUE_PREFIXES;
static {
- Set<String> props = new HashSet<>(8);
+ Set<String> props = new HashSet<>(9);
props.add("action");
+ props.add("embeddingModel");
props.add("embeddingStore");
props.add("embeddingStoreFactory");
props.add("embeddingStoreId");
diff --git
a/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/resources/META-INF/org/apache/camel/component/langchain4j/embeddingstore/langchain4j-embeddingstore.json
b/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/resources/META-INF/org/apache/camel/component/langchain4j/embeddingstore/langchain4j-embeddingstore.json
index f28886c6612e..55a9da32fdc3 100644
---
a/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/resources/META-INF/org/apache/camel/component/langchain4j/embeddingstore/langchain4j-embeddingstore.json
+++
b/components/camel-ai/camel-langchain4j-embeddingstore/src/generated/resources/META-INF/org/apache/camel/component/langchain4j/embeddingstore/langchain4j-embeddingstore.json
@@ -26,13 +26,14 @@
"componentProperties": {
"action": { "index": 0, "kind": "property", "displayName": "Action",
"group": "producer", "label": "", "required": false, "type": "enum",
"javaType":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreAction",
"enum": [ "ADD", "REMOVE", "SEARCH" ], "deprecated": false, "autowired":
false, "secret": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configurati [...]
"configuration": { "index": 1, "kind": "property", "displayName":
"Configuration", "group": "producer", "label": "", "required": false, "type":
"object", "javaType":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"deprecated": false, "autowired": false, "secret": false, "description": "The
configuration;" },
- "embeddingStore": { "index": 2, "kind": "property", "displayName":
"Embedding Store", "group": "producer", "label": "", "required": false, "type":
"object", "javaType":
"dev.langchain4j.store.embedding.EmbeddingStore<dev.langchain4j.data.segment.TextSegment>",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret":
false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "config [...]
- "embeddingStoreFactory": { "index": 3, "kind": "property", "displayName":
"Embedding Store Factory", "group": "producer", "label": "", "required": false,
"type": "object", "javaType":
"org.apache.camel.component.langchain4j.embeddingstore.EmbeddingStoreFactory",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret": false,
"configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "conf [...]
- "lazyStartProducer": { "index": 4, "kind": "property", "displayName":
"Lazy Start Producer", "group": "producer", "label": "producer", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Whether the producer should be started lazy (on the first message). By
starting lazy you can use this to allow CamelContext and routes to startup in
situations where a producer may otherwise fail [...]
- "maxResults": { "index": 5, "kind": "property", "displayName": "Max
Results", "group": "producer", "label": "", "required": false, "type":
"integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": 5, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Maximum number of
results to return for SEARCH operation" },
- "minScore": { "index": 6, "kind": "property", "displayName": "Min Score",
"group": "producer", "label": "", "required": false, "type": "number",
"javaType": "java.lang.Double", "deprecated": false, "autowired": false,
"secret": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Minimum similarity
score threshold for SEARCH operation (0.0 to 1.0)" },
- "returnTextContent": { "index": 7, "kind": "property", "displayName":
"Return Text Content", "group": "producer", "label": "", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "When true, SEARCH
returns List with text conte [...]
- "autowiredEnabled": { "index": 8, "kind": "property", "displayName":
"Autowired Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether autowiring is enabled. This is used for automatic autowiring options
(the option must be marked as autowired) by looking up in the registry to find
if there is a single instance of matching t [...]
+ "embeddingModel": { "index": 2, "kind": "property", "displayName":
"Embedding Model", "group": "producer", "label": "", "required": false, "type":
"object", "javaType": "dev.langchain4j.model.embedding.EmbeddingModel",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret": false,
"configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Embedding model [...]
+ "embeddingStore": { "index": 3, "kind": "property", "displayName":
"Embedding Store", "group": "producer", "label": "", "required": false, "type":
"object", "javaType":
"dev.langchain4j.store.embedding.EmbeddingStore<dev.langchain4j.data.segment.TextSegment>",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret":
false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "config [...]
+ "embeddingStoreFactory": { "index": 4, "kind": "property", "displayName":
"Embedding Store Factory", "group": "producer", "label": "", "required": false,
"type": "object", "javaType":
"org.apache.camel.component.langchain4j.embeddingstore.EmbeddingStoreFactory",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret": false,
"configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "conf [...]
+ "lazyStartProducer": { "index": 5, "kind": "property", "displayName":
"Lazy Start Producer", "group": "producer", "label": "producer", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Whether the producer should be started lazy (on the first message). By
starting lazy you can use this to allow CamelContext and routes to startup in
situations where a producer may otherwise fail [...]
+ "maxResults": { "index": 6, "kind": "property", "displayName": "Max
Results", "group": "producer", "label": "", "required": false, "type":
"integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": 5, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Maximum number of
results to return for SEARCH operation" },
+ "minScore": { "index": 7, "kind": "property", "displayName": "Min Score",
"group": "producer", "label": "", "required": false, "type": "number",
"javaType": "java.lang.Double", "deprecated": false, "autowired": false,
"secret": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Minimum similarity
score threshold for SEARCH operation (0.0 to 1.0)" },
+ "returnTextContent": { "index": 8, "kind": "property", "displayName":
"Return Text Content", "group": "producer", "label": "", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "When true, SEARCH
returns List with text conte [...]
+ "autowiredEnabled": { "index": 9, "kind": "property", "displayName":
"Autowired Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether autowiring is enabled. This is used for automatic autowiring options
(the option must be marked as autowired) by looking up in the registry to find
if there is a single instance of matching t [...]
},
"headers": {
"CamelLangchain4jEmbeddingStoreAction": { "index": 0, "kind": "header",
"displayName": "", "group": "producer", "label": "", "required": false,
"javaType": "String", "enum": [ "ADD", "REMOVE", "SEARCH" ], "deprecated":
false, "deprecationNote": "", "autowired": false, "secret": false,
"description": "The action to be performed.", "constantName":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreHeaders#ACTION"
},
@@ -43,11 +44,12 @@
"properties": {
"embeddingStoreId": { "index": 0, "kind": "path", "displayName":
"Embedding Store Id", "group": "producer", "label": "", "required": true,
"type": "string", "javaType": "java.lang.String", "deprecated": false,
"deprecationNote": "", "autowired": false, "secret": false, "description": "The
id of the embedding store" },
"action": { "index": 1, "kind": "parameter", "displayName": "Action",
"group": "producer", "label": "", "required": false, "type": "enum",
"javaType":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreAction",
"enum": [ "ADD", "REMOVE", "SEARCH" ], "deprecated": false, "autowired":
false, "secret": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configurat [...]
- "embeddingStore": { "index": 2, "kind": "parameter", "displayName":
"Embedding Store", "group": "producer", "label": "", "required": false, "type":
"object", "javaType":
"dev.langchain4j.store.embedding.EmbeddingStore<dev.langchain4j.data.segment.TextSegment>",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret":
false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "confi [...]
- "embeddingStoreFactory": { "index": 3, "kind": "parameter", "displayName":
"Embedding Store Factory", "group": "producer", "label": "", "required": false,
"type": "object", "javaType":
"org.apache.camel.component.langchain4j.embeddingstore.EmbeddingStoreFactory",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret": false,
"configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "con [...]
- "maxResults": { "index": 4, "kind": "parameter", "displayName": "Max
Results", "group": "producer", "label": "", "required": false, "type":
"integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": 5, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Maximum number of
results to return for SEARCH operation" },
- "minScore": { "index": 5, "kind": "parameter", "displayName": "Min Score",
"group": "producer", "label": "", "required": false, "type": "number",
"javaType": "java.lang.Double", "deprecated": false, "autowired": false,
"secret": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Minimum similarity
score threshold for SEARCH operation (0.0 to 1.0)" },
- "returnTextContent": { "index": 6, "kind": "parameter", "displayName":
"Return Text Content", "group": "producer", "label": "", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "When true, SEARCH
returns List with text cont [...]
- "lazyStartProducer": { "index": 7, "kind": "parameter", "displayName":
"Lazy Start Producer", "group": "producer (advanced)", "label":
"producer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Whether the producer should be started
lazy (on the first message). By starting lazy you can use this to allow
CamelContext and routes to startup in situations where a produc [...]
+ "embeddingModel": { "index": 2, "kind": "parameter", "displayName":
"Embedding Model", "group": "producer", "label": "", "required": false, "type":
"object", "javaType": "dev.langchain4j.model.embedding.EmbeddingModel",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret": false,
"configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Embedding model [...]
+ "embeddingStore": { "index": 3, "kind": "parameter", "displayName":
"Embedding Store", "group": "producer", "label": "", "required": false, "type":
"object", "javaType":
"dev.langchain4j.store.embedding.EmbeddingStore<dev.langchain4j.data.segment.TextSegment>",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret":
false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "confi [...]
+ "embeddingStoreFactory": { "index": 4, "kind": "parameter", "displayName":
"Embedding Store Factory", "group": "producer", "label": "", "required": false,
"type": "object", "javaType":
"org.apache.camel.component.langchain4j.embeddingstore.EmbeddingStoreFactory",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret": false,
"configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "con [...]
+ "maxResults": { "index": 5, "kind": "parameter", "displayName": "Max
Results", "group": "producer", "label": "", "required": false, "type":
"integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": 5, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Maximum number of
results to return for SEARCH operation" },
+ "minScore": { "index": 6, "kind": "parameter", "displayName": "Min Score",
"group": "producer", "label": "", "required": false, "type": "number",
"javaType": "java.lang.Double", "deprecated": false, "autowired": false,
"secret": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "Minimum similarity
score threshold for SEARCH operation (0.0 to 1.0)" },
+ "returnTextContent": { "index": 7, "kind": "parameter", "displayName":
"Return Text Content", "group": "producer", "label": "", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": false, "configurationClass":
"org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration",
"configurationField": "configuration", "description": "When true, SEARCH
returns List with text cont [...]
+ "lazyStartProducer": { "index": 8, "kind": "parameter", "displayName":
"Lazy Start Producer", "group": "producer (advanced)", "label":
"producer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Whether the producer should be started
lazy (on the first message). By starting lazy you can use this to allow
CamelContext and routes to startup in situations where a produc [...]
}
}
diff --git
a/components/camel-ai/camel-langchain4j-embeddingstore/src/main/docs/langchain4j-embeddingstore-component.adoc
b/components/camel-ai/camel-langchain4j-embeddingstore/src/main/docs/langchain4j-embeddingstore-component.adoc
index 942444fb4208..b31d314d4e12 100644
---
a/components/camel-ai/camel-langchain4j-embeddingstore/src/main/docs/langchain4j-embeddingstore-component.adoc
+++
b/components/camel-ai/camel-langchain4j-embeddingstore/src/main/docs/langchain4j-embeddingstore-component.adoc
@@ -72,9 +72,54 @@ EmbeddingStore<TextSegment> embeddingStore =
PgVectorEmbeddingStore.builder()
context.getRegistry().bind("myEmbeddingStore", embeddingStore);
----
+=== Auto-Embedding with `embeddingModel`
+
+When an `EmbeddingModel` is configured (either explicitly or via autowiring
from the registry), the ADD and SEARCH operations can accept plain text in the
message body instead of requiring a pre-computed embedding in the
`CamelLangChain4jEmbeddingsEmbedding` header. The component will automatically
compute the embedding from the body text.
+
+If the `CamelLangChain4jEmbeddingsEmbedding` header is present, it always
takes precedence over auto-embedding.
+
+[tabs]
+====
+Java::
++
+[source,java]
+----
+from("direct:store")
+ .to("langchain4j-embeddingstore:myStore?action=ADD");
+
+from("direct:search")
+
.to("langchain4j-embeddingstore:myStore?action=SEARCH&returnTextContent=true");
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+ from:
+ uri: direct:store
+ steps:
+ - to:
+ uri: langchain4j-embeddingstore:myStore
+ parameters:
+ action: ADD
+- route:
+ from:
+ uri: direct:search
+ steps:
+ - to:
+ uri: langchain4j-embeddingstore:myStore
+ parameters:
+ action: SEARCH
+ returnTextContent: true
+----
+====
+
+This eliminates the need for a separate `langchain4j-embeddings:embed` step in
the route.
+
=== Storing Embeddings (ADD Operation)
-Store embeddings with optional text segments:
+Store embeddings with optional text segments. Without `embeddingModel`, a
pre-computed embedding must be provided via the `langchain4j-embeddings`
component:
[tabs]
====
@@ -108,7 +153,7 @@ The response body contains the generated embedding ID.
=== Searching Embeddings (SEARCH Operation)
-Perform similarity search to find relevant content:
+Perform similarity search to find relevant content. Without `embeddingModel`,
a pre-computed query embedding must be provided:
[tabs]
====
diff --git
a/components/camel-ai/camel-langchain4j-embeddingstore/src/main/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreConfiguration.java
b/components/camel-ai/camel-langchain4j-embeddingstore/src/main/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreConfiguration.java
index 632fc43f5e2c..201fda42c1f3 100644
---
a/components/camel-ai/camel-langchain4j-embeddingstore/src/main/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreConfiguration.java
+++
b/components/camel-ai/camel-langchain4j-embeddingstore/src/main/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreConfiguration.java
@@ -17,6 +17,7 @@
package org.apache.camel.component.langchain4j.embeddingstore;
import dev.langchain4j.data.segment.TextSegment;
+import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.store.embedding.EmbeddingStore;
import org.apache.camel.RuntimeCamelException;
import org.apache.camel.spi.Configurer;
@@ -64,6 +65,13 @@ public class LangChain4jEmbeddingStoreConfiguration
implements Cloneable {
defaultValue = "false")
private boolean returnTextContent = false;
+ @UriParam(description = "Embedding model for auto-computing embeddings
from message body text. "
+ + "When set, ADD and SEARCH operations can accept
plain text body instead of requiring "
+ + "a pre-computed embedding in the
CamelLangChain4jEmbeddingsEmbedding header. "
+ + "The header always takes precedence when
present.")
+ @Metadata(autowired = true)
+ private EmbeddingModel embeddingModel;
+
public EmbeddingStore<TextSegment> getEmbeddingStore() {
return embeddingStore;
}
@@ -120,6 +128,14 @@ public class LangChain4jEmbeddingStoreConfiguration
implements Cloneable {
this.returnTextContent = returnTextContent;
}
+ public EmbeddingModel getEmbeddingModel() {
+ return embeddingModel;
+ }
+
+ public void setEmbeddingModel(EmbeddingModel embeddingModel) {
+ this.embeddingModel = embeddingModel;
+ }
+
// ************************
//
// Clone
diff --git
a/components/camel-ai/camel-langchain4j-embeddingstore/src/main/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreProducer.java
b/components/camel-ai/camel-langchain4j-embeddingstore/src/main/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreProducer.java
index 257583509ed9..94d00b908083 100644
---
a/components/camel-ai/camel-langchain4j-embeddingstore/src/main/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreProducer.java
+++
b/components/camel-ai/camel-langchain4j-embeddingstore/src/main/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreProducer.java
@@ -127,26 +127,18 @@ public class LangChain4jEmbeddingStoreProducer extends
DefaultProducer {
* @throws Exception if the add operation fails
*/
private void add(Exchange exchange) throws Exception {
- final Message in = exchange.getMessage();
+ LangChain4jEmbeddingStoreConfiguration config =
getEndpoint().getConfiguration();
- if (in.getHeader(LangChain4jEmbeddingsHeaders.EMBEDDING) == null) {
- throw new NoSuchHeaderException(
- "The embedding is a required header for ADD operations",
exchange,
- LangChain4jEmbeddingsHeaders.EMBEDDING);
- }
+ EmbeddingResult resolved = resolveEmbedding(exchange);
- Embedding embedding =
in.getHeader(LangChain4jEmbeddingsHeaders.EMBEDDING, Embedding.class);
String id;
-
- if (in.getHeader(LangChain4jEmbeddingsHeaders.TEXT_SEGMENT) != null) {
- TextSegment text =
in.getHeader(LangChain4jEmbeddingsHeaders.TEXT_SEGMENT, TextSegment.class);
- id =
getEndpoint().getConfiguration().getEmbeddingStore().add(embedding, text);
+ if (resolved.textSegment() != null) {
+ id = config.getEmbeddingStore().add(resolved.embedding(),
resolved.textSegment());
} else {
- id =
getEndpoint().getConfiguration().getEmbeddingStore().add(embedding);
+ id = config.getEmbeddingStore().add(resolved.embedding());
}
- Message out = exchange.getMessage();
- out.setBody(id);
+ exchange.getMessage().setBody(id);
}
/**
@@ -192,7 +184,7 @@ public class LangChain4jEmbeddingStoreProducer extends
DefaultProducer {
final Message in = exchange.getMessage();
LangChain4jEmbeddingStoreConfiguration config =
getEndpoint().getConfiguration();
- Embedding embedding =
in.getHeader(LangChain4jEmbeddingsHeaders.EMBEDDING, Embedding.class);
+ Embedding embedding = resolveEmbedding(exchange).embedding();
// Get maxResults from header, fallback to endpoint config
Integer maxResults =
in.getHeader(LangChain4jEmbeddingStoreHeaders.MAX_RESULTS, Integer.class);
@@ -236,6 +228,40 @@ public class LangChain4jEmbeddingStoreProducer extends
DefaultProducer {
}
}
+ private EmbeddingResult resolveEmbedding(Exchange exchange) throws
NoSuchHeaderException {
+ final Message in = exchange.getMessage();
+ LangChain4jEmbeddingStoreConfiguration config =
getEndpoint().getConfiguration();
+
+ Embedding embedding =
in.getHeader(LangChain4jEmbeddingsHeaders.EMBEDDING, Embedding.class);
+ TextSegment textSegment =
in.getHeader(LangChain4jEmbeddingsHeaders.TEXT_SEGMENT, TextSegment.class);
+
+ if (embedding == null && config.getEmbeddingModel() != null) {
+ String text = in.getBody(String.class);
+ if (text == null) {
+ throw new IllegalArgumentException(
+ "Message body cannot be converted to String for
auto-embedding. "
+ + "Either set the body to a
text value or provide a pre-computed embedding via the "
+ +
LangChain4jEmbeddingsHeaders.EMBEDDING + " header.");
+ }
+ if (textSegment == null) {
+ textSegment = TextSegment.from(text);
+ }
+ embedding =
config.getEmbeddingModel().embed(textSegment).content();
+ }
+
+ if (embedding == null) {
+ throw new NoSuchHeaderException(
+ "The embedding is a required header (or configure
embeddingModel for auto-embedding)",
+ exchange,
+ LangChain4jEmbeddingsHeaders.EMBEDDING);
+ }
+
+ return new EmbeddingResult(embedding, textSegment);
+ }
+
+ private record EmbeddingResult(Embedding embedding, TextSegment
textSegment) {
+ }
+
private CamelContext getCamelContext() {
return getEndpoint().getCamelContext();
}
diff --git
a/components/camel-ai/camel-langchain4j-embeddingstore/src/test/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreAutoEmbedTest.java
b/components/camel-ai/camel-langchain4j-embeddingstore/src/test/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreAutoEmbedTest.java
new file mode 100644
index 000000000000..0f5adf0b96ee
--- /dev/null
+++
b/components/camel-ai/camel-langchain4j-embeddingstore/src/test/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreAutoEmbedTest.java
@@ -0,0 +1,161 @@
+/*
+ * 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.embeddingstore;
+
+import java.util.List;
+
+import dev.langchain4j.data.embedding.Embedding;
+import dev.langchain4j.data.segment.TextSegment;
+import dev.langchain4j.model.embedding.EmbeddingModel;
+import
dev.langchain4j.model.embedding.onnx.allminilml6v2.AllMiniLmL6V2EmbeddingModel;
+import dev.langchain4j.store.embedding.EmbeddingSearchRequest;
+import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.NoSuchHeaderException;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import
org.apache.camel.component.langchain4j.embeddings.LangChain4jEmbeddingsHeaders;
+import org.apache.camel.test.junit6.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class LangChain4jEmbeddingStoreAutoEmbedTest extends CamelTestSupport {
+
+ private final EmbeddingModel embeddingModel = new
AllMiniLmL6V2EmbeddingModel();
+ private final InMemoryEmbeddingStore<TextSegment> embeddingStore = new
InMemoryEmbeddingStore<>();
+
+ @Override
+ protected CamelContext createCamelContext() throws Exception {
+ CamelContext context = super.createCamelContext();
+
+ LangChain4jEmbeddingStoreComponent component
+ = context.getComponent(LangChain4jEmbeddingStore.SCHEME,
LangChain4jEmbeddingStoreComponent.class);
+ component.getConfiguration().setEmbeddingStore(embeddingStore);
+ component.getConfiguration().setEmbeddingModel(embeddingModel);
+
+ LangChain4jEmbeddingStoreComponent noModelComponent = new
LangChain4jEmbeddingStoreComponent();
+ noModelComponent.getConfiguration().setEmbeddingStore(new
InMemoryEmbeddingStore<>());
+ context.addComponent("no-model-store", noModelComponent);
+
+ return context;
+ }
+
+ @Override
+ protected RoutesBuilder createRouteBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:add")
+ .to("langchain4j-embeddingstore:test?action=ADD");
+
+ from("direct:search")
+
.to("langchain4j-embeddingstore:test?action=SEARCH&returnTextContent=true");
+
+ from("direct:add-no-model")
+ .to("no-model-store:test?action=ADD");
+ }
+ };
+ }
+
+ @Test
+ void addWithAutoEmbed() {
+ fluentTemplate.to("direct:add")
+ .withBody("I like football.")
+ .send();
+
+ List<String> results = fluentTemplate.to("direct:search")
+ .withBody("sports")
+ .request(List.class);
+
+ assertThat(results).hasSize(1);
+ assertThat(results.get(0)).isEqualTo("I like football.");
+ }
+
+ @Test
+ void addWithExplicitHeaderTakesPrecedence() {
+ TextSegment segment = TextSegment.from("I like football.");
+ Embedding precomputed = embeddingModel.embed(segment).content();
+
+ fluentTemplate.to("direct:add")
+ .withBody("this body text should be ignored")
+ .withHeader(LangChain4jEmbeddingsHeaders.EMBEDDING,
precomputed)
+ .withHeader(LangChain4jEmbeddingsHeaders.TEXT_SEGMENT, segment)
+ .send();
+
+ List<String> results = fluentTemplate.to("direct:search")
+ .withBody("sports")
+ .request(List.class);
+
+ assertThat(results).hasSize(1);
+ assertThat(results.get(0)).isEqualTo("I like football.");
+ }
+
+ @Test
+ void addWithoutModelOrHeaderFails() {
+ Exchange result = fluentTemplate.to("direct:add-no-model")
+ .withBody("some text")
+ .send();
+
+ assertThat(result.getException())
+ .isInstanceOf(NoSuchHeaderException.class)
+ .hasMessageContaining("embeddingModel");
+ }
+
+ @Test
+ void addWithNullBodyAndAutoEmbedFails() {
+ Exchange result = fluentTemplate.to("direct:add")
+ .withBody(null)
+ .send();
+
+ assertThat(result.getException())
+ .isInstanceOf(IllegalArgumentException.class)
+ .hasMessageContaining("body cannot be converted to String");
+ }
+
+ @Test
+ void addWithTextSegmentHeaderPreservedDuringAutoEmbed() {
+ TextSegment headerSegment = TextSegment.from("XYZZY-marker-42");
+
+ fluentTemplate.to("direct:add")
+ .withBody("I like football.")
+ .withHeader(LangChain4jEmbeddingsHeaders.TEXT_SEGMENT,
headerSegment)
+ .send();
+
+ Embedding queryEmbedding =
embeddingModel.embed("XYZZY-marker-42").content();
+ var matches = embeddingStore.search(
+
EmbeddingSearchRequest.builder().queryEmbedding(queryEmbedding).maxResults(1).build()).matches();
+
+ assertThat(matches).hasSize(1);
+
assertThat(matches.get(0).embedded().text()).isEqualTo("XYZZY-marker-42");
+ }
+
+ @Test
+ void searchWithAutoEmbed() {
+ TextSegment segment = TextSegment.from("Apache Camel is a powerful
integration framework");
+ Embedding embedding = embeddingModel.embed(segment).content();
+ embeddingStore.add(embedding, segment);
+
+ List<String> results = fluentTemplate.to("direct:search")
+ .withBody("integration framework")
+ .request(List.class);
+
+ assertThat(results).isNotEmpty();
+ assertThat(results.get(0)).contains("Apache Camel");
+ }
+}
diff --git
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_22.adoc
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_22.adoc
index f4a459dd7e75..9f97f2aa2135 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_22.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_22.adoc
@@ -364,6 +364,13 @@ If your code reads tool-related headers from the calling
exchange after agent in
you will need to adjust it. The agent's `Result<String>` (and the new
`CamelLangChain4jAgentToolExecutions`
header) is the intended way to observe tool execution results.
+=== camel-langchain4j-embeddingstore
+
+A new `embeddingModel` option has been added. It is autowired, so if an
`EmbeddingModel` bean is present
+in the registry it will be automatically picked up. When set, ADD and SEARCH
operations can accept plain
+text in the message body instead of requiring a pre-computed embedding in the
+`CamelLangChain4jEmbeddingsEmbedding` header. The header always takes
precedence when present.
+
=== camel-langchain4j-chat
The helper classes `OpenAiChatLanguageModelBuilder` and
`HugginFaceChatLanguageModelBuilder` have been removed.
diff --git
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Langchain4jEmbeddingstoreComponentBuilderFactory.java
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Langchain4jEmbeddingstoreComponentBuilderFactory.java
index 7fbc06641102..5e7a48329cdb 100644
---
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Langchain4jEmbeddingstoreComponentBuilderFactory.java
+++
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Langchain4jEmbeddingstoreComponentBuilderFactory.java
@@ -82,6 +82,26 @@ public interface
Langchain4jEmbeddingstoreComponentBuilderFactory {
return this;
}
+ /**
+ * Embedding model for auto-computing embeddings from message body
text.
+ * When set, ADD and SEARCH operations can accept plain text body
+ * instead of requiring a pre-computed embedding in the
+ * CamelLangChain4jEmbeddingsEmbedding header. The header always takes
+ * precedence when present.
+ *
+ * The option is a:
+ *
<code>dev.langchain4j.model.embedding.EmbeddingModel</code> type.
+ *
+ * Group: producer
+ *
+ * @param embeddingModel the value to set
+ * @return the dsl builder
+ */
+ default Langchain4jEmbeddingstoreComponentBuilder
embeddingModel(dev.langchain4j.model.embedding.EmbeddingModel embeddingModel) {
+ doSetProperty("embeddingModel", embeddingModel);
+ return this;
+ }
+
/**
* Direct embedding store instance for vector operations.
*
@@ -233,6 +253,7 @@ public interface
Langchain4jEmbeddingstoreComponentBuilderFactory {
switch (name) {
case "action":
getOrCreateConfiguration((LangChain4jEmbeddingStoreComponent)
component).setAction((org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreAction)
value); return true;
case "configuration": ((LangChain4jEmbeddingStoreComponent)
component).setConfiguration((org.apache.camel.component.langchain4j.embeddingstore.LangChain4jEmbeddingStoreConfiguration)
value); return true;
+ case "embeddingModel":
getOrCreateConfiguration((LangChain4jEmbeddingStoreComponent)
component).setEmbeddingModel((dev.langchain4j.model.embedding.EmbeddingModel)
value); return true;
case "embeddingStore":
getOrCreateConfiguration((LangChain4jEmbeddingStoreComponent)
component).setEmbeddingStore((dev.langchain4j.store.embedding.EmbeddingStore)
value); return true;
case "embeddingStoreFactory":
getOrCreateConfiguration((LangChain4jEmbeddingStoreComponent)
component).setEmbeddingStoreFactory((org.apache.camel.component.langchain4j.embeddingstore.EmbeddingStoreFactory)
value); return true;
case "lazyStartProducer": ((LangChain4jEmbeddingStoreComponent)
component).setLazyStartProducer((boolean) value); return true;
diff --git
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/LangChain4jEmbeddingStoreEndpointBuilderFactory.java
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/LangChain4jEmbeddingStoreEndpointBuilderFactory.java
index 83fa51517d6f..b1f863714ebf 100644
---
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/LangChain4jEmbeddingStoreEndpointBuilderFactory.java
+++
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/LangChain4jEmbeddingStoreEndpointBuilderFactory.java
@@ -74,6 +74,44 @@ public interface
LangChain4jEmbeddingStoreEndpointBuilderFactory {
doSetProperty("action", action);
return this;
}
+ /**
+ * Embedding model for auto-computing embeddings from message body
text.
+ * When set, ADD and SEARCH operations can accept plain text body
+ * instead of requiring a pre-computed embedding in the
+ * CamelLangChain4jEmbeddingsEmbedding header. The header always takes
+ * precedence when present.
+ *
+ * The option is a:
+ * <code>dev.langchain4j.model.embedding.EmbeddingModel</code> type.
+ *
+ * Group: producer
+ *
+ * @param embeddingModel the value to set
+ * @return the dsl builder
+ */
+ default LangChain4jEmbeddingStoreEndpointBuilder
embeddingModel(dev.langchain4j.model.embedding.EmbeddingModel embeddingModel) {
+ doSetProperty("embeddingModel", embeddingModel);
+ return this;
+ }
+ /**
+ * Embedding model for auto-computing embeddings from message body
text.
+ * When set, ADD and SEARCH operations can accept plain text body
+ * instead of requiring a pre-computed embedding in the
+ * CamelLangChain4jEmbeddingsEmbedding header. The header always takes
+ * precedence when present.
+ *
+ * The option will be converted to a
+ * <code>dev.langchain4j.model.embedding.EmbeddingModel</code> type.
+ *
+ * Group: producer
+ *
+ * @param embeddingModel the value to set
+ * @return the dsl builder
+ */
+ default LangChain4jEmbeddingStoreEndpointBuilder embeddingModel(String
embeddingModel) {
+ doSetProperty("embeddingModel", embeddingModel);
+ return this;
+ }
/**
* Direct embedding store instance for vector operations.
*