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

Enable Embedding API in watsonx.ai #508

Merged
merged 1 commit into from
Apr 25, 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
77 changes: 65 additions & 12 deletions docs/modules/ROOT/pages/includes/quarkus-langchain4j-watsonx.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,23 @@ endif::add-copy-button-to-env-var[]
|`true`


a|icon:lock[title=Fixed at build time] [[quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-embedding-model-enabled]]`link:#quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-embedding-model-enabled[quarkus.langchain4j.watsonx.embedding-model.enabled]`


[.description]
--
Whether the embedding model should be enabled

ifdef::add-copy-button-to-env-var[]
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_WATSONX_EMBEDDING_MODEL_ENABLED+++[]
endif::add-copy-button-to-env-var[]
ifndef::add-copy-button-to-env-var[]
Environment variable: `+++QUARKUS_LANGCHAIN4J_WATSONX_EMBEDDING_MODEL_ENABLED+++`
endif::add-copy-button-to-env-var[]
--|boolean
|`true`


a| [[quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-base-url]]`link:#quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-base-url[quarkus.langchain4j.watsonx.base-url]`


Expand All @@ -40,8 +57,7 @@ endif::add-copy-button-to-env-var[]
ifndef::add-copy-button-to-env-var[]
Environment variable: `+++QUARKUS_LANGCHAIN4J_WATSONX_BASE_URL+++`
endif::add-copy-button-to-env-var[]
--|link:https://docs.oracle.com/javase/8/docs/api/java/net/URL.html[URL]

--|string
|`https://dummy.ai/api`


Expand Down Expand Up @@ -85,7 +101,7 @@ a| [[quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-version]]`link:#qua

[.description]
--
Version to use
The version date for the API of the form YYYY-MM-DD

ifdef::add-copy-button-to-env-var[]
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_WATSONX_VERSION+++[]
Expand All @@ -94,7 +110,7 @@ ifndef::add-copy-button-to-env-var[]
Environment variable: `+++QUARKUS_LANGCHAIN4J_WATSONX_VERSION+++`
endif::add-copy-button-to-env-var[]
--|string
|`2023-05-29`
|`2024-03-14`


a| [[quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-project-id]]`link:#quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-project-id[quarkus.langchain4j.watsonx.project-id]`
Expand Down Expand Up @@ -223,7 +239,9 @@ a| [[quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-chat-model-model-id

[.description]
--
Model to use
Model to use.

For a complete list of models, visit: `https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html?context=wx`

ifdef::add-copy-button-to-env-var[]
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_WATSONX_CHAT_MODEL_MODEL_ID+++[]
Expand All @@ -232,7 +250,7 @@ ifndef::add-copy-button-to-env-var[]
Environment variable: `+++QUARKUS_LANGCHAIN4J_WATSONX_CHAT_MODEL_MODEL_ID+++`
endif::add-copy-button-to-env-var[]
--|string
|`ibm/granite-13b-chat-v2`
|`ibm/granite-20b-multilingual`


a| [[quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-chat-model-decoding-method]]`link:#quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-chat-model-decoding-method[quarkus.langchain4j.watsonx.chat-model.decoding-method]`
Expand Down Expand Up @@ -390,6 +408,23 @@ endif::add-copy-button-to-env-var[]
|


a| [[quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-embedding-model-model-id]]`link:#quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-embedding-model-model-id[quarkus.langchain4j.watsonx.embedding-model.model-id]`


[.description]
--
Model to use

ifdef::add-copy-button-to-env-var[]
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_WATSONX_EMBEDDING_MODEL_MODEL_ID+++[]
endif::add-copy-button-to-env-var[]
ifndef::add-copy-button-to-env-var[]
Environment variable: `+++QUARKUS_LANGCHAIN4J_WATSONX_EMBEDDING_MODEL_MODEL_ID+++`
endif::add-copy-button-to-env-var[]
--|string
|`ibm/slate-125m-english-rtrvr`


h|[[quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-named-config-named-model-config]]link:#quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-named-config-named-model-config[Named model config]

h|Type
Expand All @@ -408,8 +443,7 @@ endif::add-copy-button-to-env-var[]
ifndef::add-copy-button-to-env-var[]
Environment variable: `+++QUARKUS_LANGCHAIN4J_WATSONX__MODEL_NAME__BASE_URL+++`
endif::add-copy-button-to-env-var[]
--|link:https://docs.oracle.com/javase/8/docs/api/java/net/URL.html[URL]

--|string
|`https://dummy.ai/api`


Expand Down Expand Up @@ -453,7 +487,7 @@ a| [[quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-model-name-version]

[.description]
--
Version to use
The version date for the API of the form YYYY-MM-DD

ifdef::add-copy-button-to-env-var[]
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_WATSONX__MODEL_NAME__VERSION+++[]
Expand All @@ -462,7 +496,7 @@ ifndef::add-copy-button-to-env-var[]
Environment variable: `+++QUARKUS_LANGCHAIN4J_WATSONX__MODEL_NAME__VERSION+++`
endif::add-copy-button-to-env-var[]
--|string
|`2023-05-29`
|`2024-03-14`


a| [[quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-model-name-project-id]]`link:#quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-model-name-project-id[quarkus.langchain4j.watsonx."model-name".project-id]`
Expand Down Expand Up @@ -591,7 +625,9 @@ a| [[quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-model-name-chat-mod

[.description]
--
Model to use
Model to use.

For a complete list of models, visit: `https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html?context=wx`

ifdef::add-copy-button-to-env-var[]
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_WATSONX__MODEL_NAME__CHAT_MODEL_MODEL_ID+++[]
Expand All @@ -600,7 +636,7 @@ ifndef::add-copy-button-to-env-var[]
Environment variable: `+++QUARKUS_LANGCHAIN4J_WATSONX__MODEL_NAME__CHAT_MODEL_MODEL_ID+++`
endif::add-copy-button-to-env-var[]
--|string
|`ibm/granite-13b-chat-v2`
|`ibm/granite-20b-multilingual`


a| [[quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-model-name-chat-model-decoding-method]]`link:#quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-model-name-chat-model-decoding-method[quarkus.langchain4j.watsonx."model-name".chat-model.decoding-method]`
Expand Down Expand Up @@ -757,6 +793,23 @@ endif::add-copy-button-to-env-var[]
--|double
|


a| [[quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-model-name-embedding-model-model-id]]`link:#quarkus-langchain4j-watsonx_quarkus-langchain4j-watsonx-model-name-embedding-model-model-id[quarkus.langchain4j.watsonx."model-name".embedding-model.model-id]`


[.description]
--
Model to use

ifdef::add-copy-button-to-env-var[]
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_WATSONX__MODEL_NAME__EMBEDDING_MODEL_MODEL_ID+++[]
endif::add-copy-button-to-env-var[]
ifndef::add-copy-button-to-env-var[]
Environment variable: `+++QUARKUS_LANGCHAIN4J_WATSONX__MODEL_NAME__EMBEDDING_MODEL_MODEL_ID+++`
endif::add-copy-button-to-env-var[]
--|string
|`ibm/slate-125m-english-rtrvr`

|===
ifndef::no-duration-note[]
[NOTE]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.quarkiverse.langchain4j.watsonx.deployment;

import java.util.Optional;

import io.quarkus.runtime.annotations.ConfigDocDefault;
import io.quarkus.runtime.annotations.ConfigGroup;

@ConfigGroup
public interface EmbeddingModelBuildConfig {

/**
* Whether the embedding model should be enabled
*/
@ConfigDocDefault("true")
Optional<Boolean> enabled();
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,9 @@ public interface LangChain4jWatsonBuildConfig {
* Chat model related settings
*/
ChatModelBuildConfig chatModel();

/**
* Embedding model related settings
*/
EmbeddingModelBuildConfig embeddingModel();
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.quarkiverse.langchain4j.watsonx.deployment;

import static io.quarkiverse.langchain4j.deployment.LangChain4jDotNames.CHAT_MODEL;
import static io.quarkiverse.langchain4j.deployment.LangChain4jDotNames.EMBEDDING_MODEL;
import static io.quarkiverse.langchain4j.deployment.LangChain4jDotNames.STREAMING_CHAT_MODEL;

import java.util.List;
Expand All @@ -11,7 +12,9 @@

import io.quarkiverse.langchain4j.ModelName;
import io.quarkiverse.langchain4j.deployment.items.ChatModelProviderCandidateBuildItem;
import io.quarkiverse.langchain4j.deployment.items.EmbeddingModelProviderCandidateBuildItem;
import io.quarkiverse.langchain4j.deployment.items.SelectedChatModelProviderBuildItem;
import io.quarkiverse.langchain4j.deployment.items.SelectedEmbeddingModelCandidateBuildItem;
import io.quarkiverse.langchain4j.runtime.NamedModelUtil;
import io.quarkiverse.langchain4j.watsonx.runtime.WatsonxRecorder;
import io.quarkiverse.langchain4j.watsonx.runtime.config.LangChain4jWatsonxConfig;
Expand All @@ -22,7 +25,7 @@
import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.FeatureBuildItem;

public class WatsonProcessor {
public class WatsonxProcessor {

private static final String FEATURE = "langchain4j-watsonx";
private static final String PROVIDER = "watsonx";
Expand All @@ -34,41 +37,59 @@ FeatureBuildItem feature() {

@BuildStep
public void providerCandidates(BuildProducer<ChatModelProviderCandidateBuildItem> chatProducer,
BuildProducer<EmbeddingModelProviderCandidateBuildItem> embeddingProducer,
LangChain4jWatsonBuildConfig 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));
}
}

@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
@BuildStep
@Record(ExecutionTime.RUNTIME_INIT)
void generateBeans(WatsonxRecorder recorder,
void generateBeans(WatsonxRecorder recorder, LangChain4jWatsonxConfig config,
List<SelectedChatModelProviderBuildItem> selectedChatItem,
LangChain4jWatsonxConfig config,
List<SelectedEmbeddingModelCandidateBuildItem> selectedEmbedding,
BuildProducer<SyntheticBeanBuildItem> beanProducer) {

for (var selected : selectedChatItem) {
if (PROVIDER.equals(selected.getProvider())) {
String modelName = selected.getModelName();
var builder = SyntheticBeanBuildItem

var chatBuilder = SyntheticBeanBuildItem
.configure(CHAT_MODEL)
.setRuntimeInit()
.defaultBean()
.scope(ApplicationScoped.class)
.supplier(recorder.chatModel(config, modelName));
addQualifierIfNecessary(builder, modelName);
beanProducer.produce(builder.done());
addQualifierIfNecessary(chatBuilder, modelName);
beanProducer.produce(chatBuilder.done());

var streamingBuilder = SyntheticBeanBuildItem
.configure(STREAMING_CHAT_MODEL)
.setRuntimeInit()
.defaultBean()
.scope(ApplicationScoped.class)
.supplier(recorder.streamingChatModel(config, modelName));
addQualifierIfNecessary(streamingBuilder, modelName);
beanProducer.produce(streamingBuilder.done());
}
}

for (var selected : selectedEmbedding) {
if (PROVIDER.equals(selected.getProvider())) {
String modelName = selected.getModelName();
var builder = SyntheticBeanBuildItem
.configure(STREAMING_CHAT_MODEL)
.configure(EMBEDDING_MODEL)
.setRuntimeInit()
.defaultBean()
.unremovable()
.scope(ApplicationScoped.class)
.supplier(recorder.streamingChatModel(config, modelName));
.supplier(recorder.embeddingModel(config, modelName));
addQualifierIfNecessary(builder, modelName);
beanProducer.produce(builder.done());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ void chat() throws Exception {
.response(WireMockUtil.BEARER_TOKEN, new Date())
.build();

mockServers.mockWatsonBuilder(200)
mockServers.mockWatsonxBuilder(WireMockUtil.URL_WATSONX_CHAT_API, 200)
.body(mapper.writeValueAsString(body))
.response("""
{
Expand Down
Loading
Loading