Supported providers: {@code openai}, {@code azure_openai}, {@code bedrock} - *
Planned: {@code vertex_ai} + *
Supported providers: {@code openai}, {@code azure_openai}, {@code bedrock}, {@code vertex_ai} + *
Note: {@code vertex_ai} supports chat only; embeddings and image are not available via LangChain4J.
*/
public class LangChain4jModelFactory {
@@ -54,7 +56,8 @@ public static ChatModel buildChatModel(final ProviderConfig config) {
return build(config, "chat",
LangChain4jModelFactory::buildOpenAiChatModel,
LangChain4jModelFactory::buildAzureOpenAiChatModel,
- LangChain4jModelFactory::buildBedrockChatModel);
+ LangChain4jModelFactory::buildBedrockChatModel,
+ LangChain4jModelFactory::buildVertexAiChatModel);
}
/**
@@ -68,7 +71,8 @@ public static StreamingChatModel buildStreamingChatModel(final ProviderConfig co
return build(config, "chat",
LangChain4jModelFactory::buildOpenAiStreamingChatModel,
LangChain4jModelFactory::buildAzureOpenAiStreamingChatModel,
- LangChain4jModelFactory::buildBedrockStreamingChatModel);
+ LangChain4jModelFactory::buildBedrockStreamingChatModel,
+ LangChain4jModelFactory::buildVertexAiStreamingChatModel);
}
/**
@@ -82,7 +86,8 @@ public static EmbeddingModel buildEmbeddingModel(final ProviderConfig config) {
return build(config, "embeddings",
LangChain4jModelFactory::buildOpenAiEmbeddingModel,
LangChain4jModelFactory::buildAzureOpenAiEmbeddingModel,
- LangChain4jModelFactory::buildBedrockEmbeddingModel);
+ LangChain4jModelFactory::buildBedrockEmbeddingModel,
+ LangChain4jModelFactory::buildVertexAiEmbeddingModel);
}
/**
@@ -96,14 +101,16 @@ public static ImageModel buildImageModel(final ProviderConfig config) {
return build(config, "image",
LangChain4jModelFactory::buildOpenAiImageModel,
LangChain4jModelFactory::buildAzureOpenAiImageModel,
- LangChain4jModelFactory::buildBedrockImageModel);
+ LangChain4jModelFactory::buildBedrockImageModel,
+ LangChain4jModelFactory::buildVertexAiImageModel);
}
private static Google Vertex AI:
+ * Google Vertex AI (chat only — embeddings and image not supported via LangChain4J):
* Auth is handled automatically via Application Default Credentials (ADC).
+ * No API key is required.
*/
@Value.Immutable
@JsonSerialize(as = ImmutableProviderConfig.class)
diff --git a/dotCMS/src/test/java/com/dotcms/ai/client/langchain4j/LangChain4jModelFactoryTest.java b/dotCMS/src/test/java/com/dotcms/ai/client/langchain4j/LangChain4jModelFactoryTest.java
index c78d5dbff55..64b25b37698 100644
--- a/dotCMS/src/test/java/com/dotcms/ai/client/langchain4j/LangChain4jModelFactoryTest.java
+++ b/dotCMS/src/test/java/com/dotcms/ai/client/langchain4j/LangChain4jModelFactoryTest.java
@@ -82,6 +82,26 @@ public void test_buildChatModel_bedrock_missingRegion_throws() {
assertThrows(IllegalArgumentException.class, () -> LangChain4jModelFactory.buildChatModel(config));
}
+ @Test
+ public void test_buildChatModel_vertexAi_missingProjectId_throws() {
+ final ProviderConfig config = ImmutableProviderConfig.builder()
+ .provider("vertex_ai")
+ .model("gemini-1.5-pro")
+ .location("us-central1")
+ .build();
+ assertThrows(IllegalArgumentException.class, () -> LangChain4jModelFactory.buildChatModel(config));
+ }
+
+ @Test
+ public void test_buildChatModel_vertexAi_missingLocation_throws() {
+ final ProviderConfig config = ImmutableProviderConfig.builder()
+ .provider("vertex_ai")
+ .model("gemini-1.5-pro")
+ .projectId("my-gcp-project")
+ .build();
+ assertThrows(IllegalArgumentException.class, () -> LangChain4jModelFactory.buildChatModel(config));
+ }
+
@Test
public void test_buildChatModel_unknownProvider_throws() {
final ProviderConfig config = ImmutableProviderConfig.builder()
@@ -121,6 +141,12 @@ public void test_buildEmbeddingModel_bedrock_cohere_returnsModel() {
assertNotNull(model);
}
+ @Test
+ public void test_buildEmbeddingModel_vertexAi_throws() {
+ assertThrows(UnsupportedOperationException.class,
+ () -> LangChain4jModelFactory.buildEmbeddingModel(vertexAiConfig("text-embedding-004")));
+ }
+
@Test
public void test_buildEmbeddingModel_unknownProvider_throws() {
final ProviderConfig config = ImmutableProviderConfig.builder()
@@ -154,6 +180,12 @@ public void test_buildImageModel_bedrock_throws() {
() -> LangChain4jModelFactory.buildImageModel(bedrockConfig("stability.stable-diffusion-xl-v1")));
}
+ @Test
+ public void test_buildImageModel_vertexAi_throws() {
+ assertThrows(UnsupportedOperationException.class,
+ () -> LangChain4jModelFactory.buildImageModel(vertexAiConfig("imagen-3.0")));
+ }
+
@Test
public void test_buildImageModel_unknownProvider_throws() {
final ProviderConfig config = ImmutableProviderConfig.builder()
@@ -172,6 +204,15 @@ private static ProviderConfig openAiConfig(final String model) {
.build();
}
+ private static ProviderConfig vertexAiConfig(final String model) {
+ return ImmutableProviderConfig.builder()
+ .provider("vertex_ai")
+ .model(model)
+ .projectId("my-gcp-project")
+ .location("us-central1")
+ .build();
+ }
+
private static ProviderConfig bedrockConfig(final String model) {
return ImmutableProviderConfig.builder()
.provider("bedrock")
- *
+ *