Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove embedding model build item #480

Merged
merged 2 commits into from
Apr 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -120,8 +120,7 @@ InProcessEmbeddingBuildItem e5_small_v2() {
@Record(ExecutionTime.RUNTIME_INIT)
void exposeInProcessEmbeddingBeans(InProcessEmbeddingRecorder recorder,
List<InProcessEmbeddingBuildItem> embeddings,
BuildProducer<SyntheticBeanBuildItem> beanProducer,
BuildProducer<EmbeddingModelBuildItem> embeddingModelProducer) {
BuildProducer<SyntheticBeanBuildItem> beanProducer) {

for (InProcessEmbeddingBuildItem embedding : embeddings) {
beanProducer.produce(SyntheticBeanBuildItem
Expand All @@ -133,7 +132,6 @@ void exposeInProcessEmbeddingBeans(InProcessEmbeddingRecorder recorder,
.scope(ApplicationScoped.class)
.supplier(recorder.instantiate(embedding.className()))
.done());
embeddingModelProducer.produce(new EmbeddingModelBuildItem());
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@
import java.util.Optional;

import io.quarkiverse.langchain4j.deployment.DeclarativeAiServiceBuildItem;
import io.quarkiverse.langchain4j.deployment.EmbeddingModelBuildItem;
import io.quarkiverse.langchain4j.deployment.EmbeddingStoreBuildItem;
import io.quarkiverse.langchain4j.deployment.ToolsMetadataBuildItem;
import io.quarkiverse.langchain4j.deployment.items.ChatModelProviderCandidateBuildItem;
import io.quarkiverse.langchain4j.deployment.items.EmbeddingModelProviderCandidateBuildItem;
import io.quarkiverse.langchain4j.deployment.items.InMemoryEmbeddingStoreBuildItem;
import io.quarkiverse.langchain4j.deployment.items.InProcessEmbeddingBuildItem;
import io.quarkiverse.langchain4j.deployment.items.SelectedChatModelProviderBuildItem;
import io.quarkiverse.langchain4j.runtime.devui.ChatJsonRPCService;
import io.quarkiverse.langchain4j.runtime.devui.EmbeddingStoreJsonRPCService;
Expand All @@ -27,7 +28,8 @@ public class LangChain4jDevUIProcessor {
@BuildStep(onlyIf = IsDevelopment.class)
CardPageBuildItem cardPage(List<DeclarativeAiServiceBuildItem> aiServices,
ToolsMetadataBuildItem toolsMetadataBuildItem,
List<EmbeddingModelBuildItem> embeddingModelBuildItem,
List<EmbeddingModelProviderCandidateBuildItem> embeddingModelCandidateBuildItems,
List<InProcessEmbeddingBuildItem> inProcessEmbeddingModelBuildItems,
List<EmbeddingStoreBuildItem> embeddingStoreBuildItem,
List<SelectedChatModelProviderBuildItem> chatModelProviders,
Optional<InMemoryEmbeddingStoreBuildItem> inMemoryEmbeddingStoreBuildItem) {
Expand All @@ -36,9 +38,11 @@ CardPageBuildItem cardPage(List<DeclarativeAiServiceBuildItem> aiServices,
if (toolsMetadataBuildItem != null) {
addToolsPage(card, toolsMetadataBuildItem);
}
// for now, add the embedding store page only if there is a single embedding model and a single embedding store
// if we allow more in the future, we need a way to specify which ones to use for the page
if (embeddingModelBuildItem.size() == 1 &&
// For now, add the embedding store page only if
// - there is at least one embedding model (use the default one if there's more)
// - there is a single embedding store (in case there's more, we need a way to select
// it via a qualifier or something to avoid ambiguity)
if ((!embeddingModelCandidateBuildItems.isEmpty() || !inProcessEmbeddingModelBuildItems.isEmpty()) &&
(embeddingStoreBuildItem.size() == 1 || inMemoryEmbeddingStoreBuildItem.isPresent())) {
addEmbeddingStorePage(card);
}
Expand Down Expand Up @@ -93,11 +97,12 @@ private void addChatPage(CardPageBuildItem card) {

@BuildStep(onlyIf = IsDevelopment.class)
void jsonRpcProviders(BuildProducer<JsonRPCProvidersBuildItem> producers,
List<EmbeddingModelBuildItem> embeddingModelBuildItem,
List<InProcessEmbeddingBuildItem> inProcessEmbeddingModelBuildItems,
List<EmbeddingModelProviderCandidateBuildItem> embeddingModelCandidateBuildItems,
List<EmbeddingStoreBuildItem> embeddingStoreBuildItem,
List<ChatModelProviderCandidateBuildItem> chatModelCandidates,
Optional<InMemoryEmbeddingStoreBuildItem> inMemoryEmbeddingStoreBuildItem) {
if (embeddingModelBuildItem.size() == 1 &&
if ((!embeddingModelCandidateBuildItems.isEmpty() || !inProcessEmbeddingModelBuildItems.isEmpty()) &&
(embeddingStoreBuildItem.size() == 1 || inMemoryEmbeddingStoreBuildItem.isPresent())) {
producers.produce(new JsonRPCProvidersBuildItem(EmbeddingStoreJsonRPCService.class));
}
Expand Down
2 changes: 1 addition & 1 deletion docs/modules/ROOT/pages/includes/attributes.adoc
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
:project-version: 0.11.1
:langchain4j-version: 0.30.0
:examples-dir: ./../examples/
:examples-dir: ./../examples/
64 changes: 64 additions & 0 deletions integration-tests/devui-multiple-embedding-models/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>io.quarkiverse.langchain4j</groupId>
<artifactId>quarkus-langchain4j-integration-tests-parent</artifactId>
<version>999-SNAPSHOT</version>
</parent>
<artifactId>quarkus-langchain4j-integration-test-devui-multiple-embedding-models</artifactId>
<name>Quarkus LangChain4j - Integration Tests - Dev UI - Multiple embedding models</name>
<properties>
<skipITs>true</skipITs>
</properties>
<dependencies>
<!-- The test needs an embedding store and two embedding models -->
<dependency>
<groupId>io.quarkiverse.langchain4j</groupId>
<artifactId>quarkus-langchain4j-chroma</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkiverse.langchain4j</groupId>
<artifactId>quarkus-langchain4j-openai</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-embeddings-all-minilm-l6-v2-q</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-vertx-http-dev-ui-tests</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5-internal</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-vertx-http</artifactId>
</dependency>

<!-- Make sure the deployment artifact is built before executing this module -->
<dependency>
<groupId>io.quarkiverse.langchain4j</groupId>
<artifactId>quarkus-langchain4j-core-deployment</artifactId>
<version>${project.version}</version>
<type>pom</type>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.quarkiverse.langchain4j.test.devui;

import jakarta.inject.Inject;
import jakarta.inject.Singleton;

import dev.langchain4j.model.embedding.EmbeddingModel;
import io.quarkiverse.langchain4j.ModelName;

@Singleton
public class Dummy {

@Inject
@ModelName("model1")
EmbeddingModel embeddingModel1;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package io.quarkiverse.langchain4j.test.devui;

import java.util.Map;

import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.devui.tests.DevUIJsonRPCTest;
import io.quarkus.test.QuarkusDevModeTest;

/**
* Test that when there are two embedding models in an app,
* the Dev UI will deploy the EmbeddingStoreJsonRPCService pick the 'default' embedding model.
*/
public class MultipleEmbeddingModelsDevUITest extends DevUIJsonRPCTest {

@RegisterExtension
static final QuarkusDevModeTest config = new QuarkusDevModeTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addClass(Dummy.class)
.addAsResource(new StringAsset(
"quarkus.langchain4j.model1.embedding-model.provider=openai\n" +
"quarkus.langchain4j.embedding-model.provider=" +
"dev.langchain4j.model.embedding.AllMiniLmL6V2QuantizedEmbeddingModel\n" +
"quarkus.langchain4j.openai.model1.api-key=WRONG\n" +
"quarkus.langchain4j.openai.model1.base-url=http://blabla\n"),
"application.properties"));

public MultipleEmbeddingModelsDevUITest() {
super("io.quarkiverse.langchain4j.quarkus-langchain4j-core");
}

@Test
public void test() throws Exception {
// make sure the AllMiniLmL6V2QuantizedEmbeddingModel is chosen as the embedding model, not OpenAI
// if it was OpenAI, the request would fail
String id = executeJsonRPCMethod(String.class, "add", Map.of(
"text", "Hello world",
"metadata", "k1=v1,k2=v2"));
Assertions.assertNotNull(id);
}

}
1 change: 1 addition & 0 deletions integration-tests/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
<module>multiple-providers</module>
<module>mistralai</module>
<module>devui</module>
<module>devui-multiple-embedding-models</module>
<module>embed-all-minilm-l6-v2-q</module>
<module>embed-all-minilm-l6-v2</module>
<module>embed-bge-small-en-q</module>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
import org.jboss.jandex.AnnotationInstance;

import io.quarkiverse.langchain4j.ModelName;
import io.quarkiverse.langchain4j.deployment.EmbeddingModelBuildItem;
import io.quarkiverse.langchain4j.deployment.items.ChatModelProviderCandidateBuildItem;
import io.quarkiverse.langchain4j.deployment.items.EmbeddingModelProviderCandidateBuildItem;
import io.quarkiverse.langchain4j.deployment.items.SelectedChatModelProviderBuildItem;
Expand Down Expand Up @@ -39,14 +38,12 @@ FeatureBuildItem feature() {
@BuildStep
public void providerCandidates(BuildProducer<ChatModelProviderCandidateBuildItem> chatProducer,
BuildProducer<EmbeddingModelProviderCandidateBuildItem> embeddingProducer,
BuildProducer<EmbeddingModelBuildItem> embeddingModelProducer,
LangChain4jMistralAiBuildConfig config) {
if (config.chatModel().enabled().isEmpty() || config.chatModel().enabled().get()) {
chatProducer.produce(new ChatModelProviderCandidateBuildItem(PROVIDER));
}
if (config.embeddingModel().enabled().isEmpty() || config.embeddingModel().enabled().get()) {
embeddingProducer.produce(new EmbeddingModelProviderCandidateBuildItem(PROVIDER));
embeddingModelProducer.produce(new EmbeddingModelBuildItem());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import org.jboss.jandex.AnnotationInstance;

import io.quarkiverse.langchain4j.ModelName;
import io.quarkiverse.langchain4j.deployment.EmbeddingModelBuildItem;
import io.quarkiverse.langchain4j.deployment.items.ChatModelProviderCandidateBuildItem;
import io.quarkiverse.langchain4j.deployment.items.EmbeddingModelProviderCandidateBuildItem;
import io.quarkiverse.langchain4j.deployment.items.ImageModelProviderCandidateBuildItem;
Expand Down Expand Up @@ -44,8 +43,7 @@ FeatureBuildItem feature() {
}

@BuildStep
public void providerCandidates(BuildProducer<EmbeddingModelBuildItem> embeddingModelProducer,
BuildProducer<ChatModelProviderCandidateBuildItem> chatProducer,
public void providerCandidates(BuildProducer<ChatModelProviderCandidateBuildItem> chatProducer,
BuildProducer<EmbeddingModelProviderCandidateBuildItem> embeddingProducer,
BuildProducer<ModerationModelProviderCandidateBuildItem> moderationProducer,
BuildProducer<ImageModelProviderCandidateBuildItem> imageProducer,
Expand All @@ -55,7 +53,6 @@ public void providerCandidates(BuildProducer<EmbeddingModelBuildItem> embeddingM
}
if (config.embeddingModel().enabled().isEmpty() || config.embeddingModel().enabled().get()) {
embeddingProducer.produce(new EmbeddingModelProviderCandidateBuildItem(PROVIDER));
embeddingModelProducer.produce(new EmbeddingModelBuildItem());
}
if (config.moderationModel().enabled().isEmpty() || config.moderationModel().enabled().get()) {
moderationProducer.produce(new ModerationModelProviderCandidateBuildItem(PROVIDER));
Expand Down
Loading