gnodet commented on code in PR #25273:
URL: https://github.com/apache/camel/pull/25273#discussion_r3690291545


##########
components/camel-ai/camel-langchain4j-embeddingstore/src/main/java/org/apache/camel/component/langchain4j/embeddingstore/LangChain4jEmbeddingStoreProducer.java:
##########
@@ -109,63 +110,145 @@ public void process(Exchange exchange) throws Exception {
     }
 
     /**
-     * Adds an embedding to the store with optional text segment.
+     * Adds embeddings to the store with optional text segments and 
caller-supplied IDs.
      *
      * <p>
-     * Expects the following headers:
+     * Supports both single and batch operations:
+     * </p>
+     *
+     * <p>
+     * <b>Single operation</b> - when the {@code 
CamelLangChain4jEmbeddingsEmbedding} header contains a single
+     * {@link Embedding}:
      * </p>
      * <ul>
-     * <li>{@code CamelLangchain4jEmbeddingEmbedding} - The embedding vector 
(required)</li>
-     * <li>{@code CamelLangchain4jEmbeddingTextSegment} - Associated text 
segment (optional)</li>
+     * <li>With caller-supplied ID header ({@code 
CamelLangchain4jEmbeddingStoreEmbeddingId}): calls
+     * {@code add(id, embedding)}</li>
+     * <li>With text segment header: calls {@code add(embedding, 
textSegment)}</li>
+     * <li>Without text segment: calls {@code add(embedding)}</li>
      * </ul>
      *
      * <p>
-     * Returns the generated embedding ID in the message body.
+     * <b>Batch operation</b> - when the {@code 
CamelLangChain4jEmbeddingsEmbeddings} header contains a
+     * {@code List<Embedding>}:
      * </p>
+     * <ul>
+     * <li>With IDs header ({@code 
CamelLangchain4jEmbeddingStoreEmbeddingIds}) and text segments body: calls
+     * {@code addAll(ids, embeddings, textSegments)}</li>
+     * <li>With text segments body: calls {@code addAll(embeddings, 
textSegments)}</li>
+     * <li>Without text segments: calls {@code addAll(embeddings)}</li>
+     * </ul>
      *
      * @param  exchange  the Camel exchange containing the embedding data
      * @throws Exception if the add operation fails
      */
+    @SuppressWarnings("unchecked")
     private void add(Exchange exchange) throws Exception {
         final Message in = exchange.getMessage();
+        EmbeddingStore<TextSegment> store = 
getEndpoint().getConfiguration().getEmbeddingStore();
+
+        // Check for batch embeddings header first
+        List<Embedding> embeddings = 
in.getHeader(LangChain4jEmbeddingsHeaders.EMBEDDINGS, List.class);
+        if (embeddings != null) {
+            addBatch(in, store, embeddings);
+            return;
+        }
 
+        // Single embedding path
         if (in.getHeader(LangChain4jEmbeddingsHeaders.EMBEDDING) == null) {
             throw new NoSuchHeaderException(
                     "The embedding is a required header for ADD operations", 
exchange,
                     LangChain4jEmbeddingsHeaders.EMBEDDING);
         }
 
         Embedding embedding = 
in.getHeader(LangChain4jEmbeddingsHeaders.EMBEDDING, Embedding.class);
+
+        // Check for caller-supplied ID
+        String callerId = 
in.getHeader(LangChain4jEmbeddingStoreHeaders.EMBEDDING_ID, String.class);
         String id;
 
-        if (in.getHeader(LangChain4jEmbeddingsHeaders.TEXT_SEGMENT) != null) {
+        if (callerId != null) {
+            store.add(callerId, embedding);
+            id = callerId;
+        } else if (in.getHeader(LangChain4jEmbeddingsHeaders.TEXT_SEGMENT) != 
null) {
             TextSegment text = 
in.getHeader(LangChain4jEmbeddingsHeaders.TEXT_SEGMENT, TextSegment.class);

Review Comment:
   _Claude Code on behalf of gnodet_
   
   Fixed in f267c76. When `callerIds != null` but no text segments are 
provided, the code now loops with `add(id, embedding)` for each pair instead of 
falling through to `addAll(embeddings)`. Added a dedicated test 
(`addBatchWithCallerIdsNoTextSegments`) that verifies 2 `add(id, embedding)` 
calls are made and `addAll` is not called.



##########
components/camel-ai/camel-langchain4j-embeddings/src/main/java/org/apache/camel/component/langchain4j/embeddings/LangChain4jEmbeddingsProducer.java:
##########
@@ -55,4 +68,30 @@ public void process(Exchange exchange) throws Exception {
         message.setHeader(LangChain4jEmbeddingsHeaders.TEXT_SEGMENT, in);
         message.setHeader(LangChain4jEmbeddingsHeaders.EMBEDDING, 
result.content());
     }
+
+    private void processBatch(Exchange exchange, EmbeddingModel model, Message 
message, List<Object> bodyList)
+            throws Exception {
+        // Convert each element to TextSegment using the type converter

Review Comment:
   _Claude Code on behalf of gnodet_
   
   Fixed in f267c76. Added `import java.util.ArrayList` and replaced the FQCN 
with `new ArrayList<>(bodyList.size())`.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to