diff --git a/core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/BeansProcessor.java b/core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/BeansProcessor.java index e7763d46f..da5bf0cb9 100644 --- a/core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/BeansProcessor.java +++ b/core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/BeansProcessor.java @@ -172,9 +172,12 @@ public void handleProviders(BeanDiscoveryFinishedBuildItem beanDiscoveryFinished } // If the Easy RAG extension requested to automatically generate an embedding model... if (requestEmbeddingModels.isEmpty() && autoCreateEmbeddingModelBuildItem.isPresent()) { + // in case multiple embedding model providers are available, + // the user has to specify `quarkus.langchain4j.embedding-model.provider` to choose one + Optional userSelectedProvider = buildConfig.defaultConfig().embeddingModel().provider(); String provider = selectEmbeddingModelProvider(inProcessEmbeddingBuildItems, embeddingCandidateItems, beanDiscoveryFinished.beanStream().withBeanType(EmbeddingModel.class), - Optional.empty(), "EmbeddingModel", "embedding-model"); + userSelectedProvider, "EmbeddingModel", "embedding-model"); selectedEmbeddingProducer .produce(new SelectedEmbeddingModelCandidateBuildItem(provider, NamedConfigUtil.DEFAULT_NAME)); } diff --git a/core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/devui/EmbeddingStoreJsonRPCService.java b/core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/devui/EmbeddingStoreJsonRPCService.java index 150e9d11d..2f8e4c34c 100644 --- a/core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/devui/EmbeddingStoreJsonRPCService.java +++ b/core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/devui/EmbeddingStoreJsonRPCService.java @@ -2,7 +2,9 @@ import java.util.regex.Pattern; -import jakarta.inject.Inject; +import jakarta.enterprise.inject.Default; +import jakarta.enterprise.inject.spi.CDI; +import jakarta.enterprise.util.TypeLiteral; import dev.langchain4j.data.document.Metadata; import dev.langchain4j.data.segment.TextSegment; @@ -14,12 +16,18 @@ public class EmbeddingStoreJsonRPCService { - @Inject EmbeddingStore embeddingStore; - @Inject EmbeddingModel embeddingModel; + public EmbeddingStoreJsonRPCService() { + // if there are more models/stores, try to choose the default + embeddingModel = CDI.current().select(EmbeddingModel.class, new Default.Literal()).get(); + TypeLiteral> embeddingStoreType = new TypeLiteral>() { + }; + embeddingStore = CDI.current().select(embeddingStoreType, new Default.Literal()).get(); + } + private static final Pattern COMMA_OR_NEWLINE = Pattern.compile(",|\\r?\\n"); public String add(String id, String text, String metadata) { diff --git a/embedding-stores/chroma/deployment/src/main/java/io/quarkiverse/langchain4j/chroma/deployment/ChromaProcessor.java b/embedding-stores/chroma/deployment/src/main/java/io/quarkiverse/langchain4j/chroma/deployment/ChromaProcessor.java index 4335a96be..37f977041 100644 --- a/embedding-stores/chroma/deployment/src/main/java/io/quarkiverse/langchain4j/chroma/deployment/ChromaProcessor.java +++ b/embedding-stores/chroma/deployment/src/main/java/io/quarkiverse/langchain4j/chroma/deployment/ChromaProcessor.java @@ -43,7 +43,7 @@ public void createBean( ParameterizedType.create(EmbeddingStore.class, ClassType.create(TextSegment.class))) .defaultBean() .setRuntimeInit() - .defaultBean() + .unremovable() .scope(ApplicationScoped.class) .supplier(recorder.chromaStoreSupplier(config)) .done()); diff --git a/embedding-stores/infinispan/deployment/src/main/java/io/quarkiverse/langchain4j/infinispan/InfinispanEmbeddingStoreProcessor.java b/embedding-stores/infinispan/deployment/src/main/java/io/quarkiverse/langchain4j/infinispan/InfinispanEmbeddingStoreProcessor.java index 7694aed58..c2f87ec7e 100644 --- a/embedding-stores/infinispan/deployment/src/main/java/io/quarkiverse/langchain4j/infinispan/InfinispanEmbeddingStoreProcessor.java +++ b/embedding-stores/infinispan/deployment/src/main/java/io/quarkiverse/langchain4j/infinispan/InfinispanEmbeddingStoreProcessor.java @@ -67,6 +67,7 @@ public void createBean( ParameterizedType.create(EmbeddingStore.class, ClassType.create(TextSegment.class))) .setRuntimeInit() .defaultBean() + .unremovable() .scope(ApplicationScoped.class) .addInjectionPoint(ClassType.create(DotName.createSimple(RemoteCacheManager.class)), infinispanClientQualifier) diff --git a/embedding-stores/milvus/deployment/src/main/java/io/quarkiverse/langchain4j/milvus/MilvusProcessor.java b/embedding-stores/milvus/deployment/src/main/java/io/quarkiverse/langchain4j/milvus/MilvusProcessor.java index e7363284e..9629ef360 100644 --- a/embedding-stores/milvus/deployment/src/main/java/io/quarkiverse/langchain4j/milvus/MilvusProcessor.java +++ b/embedding-stores/milvus/deployment/src/main/java/io/quarkiverse/langchain4j/milvus/MilvusProcessor.java @@ -42,7 +42,7 @@ public void createBean( ParameterizedType.create(EmbeddingStore.class, ClassType.create(TextSegment.class))) .defaultBean() .setRuntimeInit() - .defaultBean() + .unremovable() .scope(ApplicationScoped.class) .supplier(recorder.milvusStoreSupplier(config)) .done()); diff --git a/embedding-stores/neo4j/deployment/src/main/java/io/quarkiverse/langchain4j/neo4j/Neo4jEmbeddingStoreProcessor.java b/embedding-stores/neo4j/deployment/src/main/java/io/quarkiverse/langchain4j/neo4j/Neo4jEmbeddingStoreProcessor.java index adb8a0c4c..7a3d295f0 100644 --- a/embedding-stores/neo4j/deployment/src/main/java/io/quarkiverse/langchain4j/neo4j/Neo4jEmbeddingStoreProcessor.java +++ b/embedding-stores/neo4j/deployment/src/main/java/io/quarkiverse/langchain4j/neo4j/Neo4jEmbeddingStoreProcessor.java @@ -48,7 +48,7 @@ public void createBean( ParameterizedType.create(EmbeddingStore.class, ClassType.create(TextSegment.class))) .defaultBean() .setRuntimeInit() - .defaultBean() + .unremovable() .scope(ApplicationScoped.class) .addInjectionPoint(ClassType.create(DotName.createSimple(Driver.class))) .createWith(recorder.embeddingStoreFunction(config)) diff --git a/embedding-stores/pgvector/deployment/src/main/java/io/quarkiverse/langchain4j/pgvector/deployment/PgVectorEmbeddingStoreProcessor.java b/embedding-stores/pgvector/deployment/src/main/java/io/quarkiverse/langchain4j/pgvector/deployment/PgVectorEmbeddingStoreProcessor.java index f86aab1cd..d6a0a35a0 100644 --- a/embedding-stores/pgvector/deployment/src/main/java/io/quarkiverse/langchain4j/pgvector/deployment/PgVectorEmbeddingStoreProcessor.java +++ b/embedding-stores/pgvector/deployment/src/main/java/io/quarkiverse/langchain4j/pgvector/deployment/PgVectorEmbeddingStoreProcessor.java @@ -67,6 +67,7 @@ public void createBean( ParameterizedType.create(EmbeddingStore.class, ClassType.create(TextSegment.class))) .setRuntimeInit() .defaultBean() + .unremovable() .scope(ApplicationScoped.class) .createWith(recorder.embeddingStoreFunction(config, buildTimeConfig.datasource().orElse(null))) .addInjectionPoint(ClassType.create(DotName.createSimple(AgroalDataSource.class)), datasourceQualifier) diff --git a/embedding-stores/pinecone/deployment/src/main/java/io/quarkiverse/langchain4j/pinecone/PineconeProcessor.java b/embedding-stores/pinecone/deployment/src/main/java/io/quarkiverse/langchain4j/pinecone/PineconeProcessor.java index 49d8e1c87..b4c5e5d14 100644 --- a/embedding-stores/pinecone/deployment/src/main/java/io/quarkiverse/langchain4j/pinecone/PineconeProcessor.java +++ b/embedding-stores/pinecone/deployment/src/main/java/io/quarkiverse/langchain4j/pinecone/PineconeProcessor.java @@ -41,7 +41,7 @@ public void createBean( ParameterizedType.create(EmbeddingStore.class, ClassType.create(TextSegment.class))) .defaultBean() .setRuntimeInit() - .defaultBean() + .unremovable() .scope(ApplicationScoped.class) .supplier(recorder.pineconeStoreSupplier(config)) .done()); diff --git a/embedding-stores/qdrant/deployment/src/main/java/io/quarkiverse/langchain4j/qdrant/QdrantProcessor.java b/embedding-stores/qdrant/deployment/src/main/java/io/quarkiverse/langchain4j/qdrant/QdrantProcessor.java index 597b371f9..d11f5602a 100644 --- a/embedding-stores/qdrant/deployment/src/main/java/io/quarkiverse/langchain4j/qdrant/QdrantProcessor.java +++ b/embedding-stores/qdrant/deployment/src/main/java/io/quarkiverse/langchain4j/qdrant/QdrantProcessor.java @@ -44,7 +44,7 @@ public void createBean( ParameterizedType.create(EmbeddingStore.class, ClassType.create(TextSegment.class))) .defaultBean() .setRuntimeInit() - .defaultBean() + .unremovable() .scope(ApplicationScoped.class) .supplier(recorder.qdrantStoreSupplier(config)) .done()); diff --git a/embedding-stores/redis/deployment/src/main/java/io/quarkiverse/langchain4j/redis/RedisEmbeddingStoreProcessor.java b/embedding-stores/redis/deployment/src/main/java/io/quarkiverse/langchain4j/redis/RedisEmbeddingStoreProcessor.java index a52afe1dc..acdeabaaf 100644 --- a/embedding-stores/redis/deployment/src/main/java/io/quarkiverse/langchain4j/redis/RedisEmbeddingStoreProcessor.java +++ b/embedding-stores/redis/deployment/src/main/java/io/quarkiverse/langchain4j/redis/RedisEmbeddingStoreProcessor.java @@ -63,6 +63,7 @@ public void createBean( ParameterizedType.create(EmbeddingStore.class, ClassType.create(TextSegment.class))) .setRuntimeInit() .defaultBean() + .unremovable() .scope(ApplicationScoped.class) .addInjectionPoint(ClassType.create(DotName.createSimple(ReactiveRedisDataSource.class)), redisClientQualifier)