Skip to content

Commit 9e0e3cd

Browse files
committed
Fix VertexAI IT autoconfiguration imports
- Create Utility class to expose the static methods for tooling/embedding autoconfigurations - Fix VertexAiModelConfigurationTests and other FunctionCall ITs to use the Utils Signed-off-by: Ilayaperumal Gopinathan <[email protected]>
1 parent d9f5f09 commit 9e0e3cd

File tree

7 files changed

+94
-47
lines changed

7 files changed

+94
-47
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Copyright 2025-2025 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.ai.model.vertexai.autoconfigure;
18+
19+
import org.springframework.ai.model.tool.autoconfigure.ToolCallingAutoConfiguration;
20+
import org.springframework.ai.model.vertexai.autoconfigure.embedding.VertexAiEmbeddingConnectionAutoConfiguration;
21+
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
22+
import org.springframework.boot.autoconfigure.AutoConfigurations;
23+
24+
/**
25+
* Utility class for VertexAI integration tests.
26+
*
27+
* @author Pawel Potaczala
28+
*/
29+
public final class VertexAiITUtil {
30+
31+
private VertexAiITUtil() {
32+
}
33+
34+
public static AutoConfigurations vertexAiToolAutoConfig(Class<?>... additionalAutoConfigurations) {
35+
Class<?>[] dependencies = new Class[] { SpringAiRetryAutoConfiguration.class,
36+
ToolCallingAutoConfiguration.class };
37+
Class<?>[] allAutoConfigurations = new Class[dependencies.length + additionalAutoConfigurations.length];
38+
System.arraycopy(dependencies, 0, allAutoConfigurations, 0, dependencies.length);
39+
System.arraycopy(additionalAutoConfigurations, 0, allAutoConfigurations, dependencies.length,
40+
additionalAutoConfigurations.length);
41+
42+
return AutoConfigurations.of(allAutoConfigurations);
43+
}
44+
45+
public static AutoConfigurations vertexAiEmbeddingAutoConfig(Class<?>... additionalAutoConfigurations) {
46+
Class<?>[] dependencies = new Class[] { SpringAiRetryAutoConfiguration.class,
47+
VertexAiEmbeddingConnectionAutoConfiguration.class };
48+
Class<?>[] allAutoConfigurations = new Class[dependencies.length + additionalAutoConfigurations.length];
49+
System.arraycopy(dependencies, 0, allAutoConfigurations, 0, dependencies.length);
50+
System.arraycopy(additionalAutoConfigurations, 0, allAutoConfigurations, dependencies.length,
51+
additionalAutoConfigurations.length);
52+
53+
return AutoConfigurations.of(allAutoConfigurations);
54+
}
55+
56+
}

auto-configurations/models/spring-ai-autoconfigure-model-vertex-ai/src/test/java/org/springframework/ai/model/vertexai/autoconfigure/embedding/VertexAiTextEmbeddingModelAutoConfigurationIT.java

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,9 @@
2828
import org.springframework.ai.embedding.EmbeddingOptionsBuilder;
2929
import org.springframework.ai.embedding.EmbeddingResponse;
3030
import org.springframework.ai.embedding.EmbeddingResultMetadata;
31-
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
31+
import org.springframework.ai.model.vertexai.autoconfigure.VertexAiITUtil;
3232
import org.springframework.ai.vertexai.embedding.multimodal.VertexAiMultimodalEmbeddingModel;
3333
import org.springframework.ai.vertexai.embedding.text.VertexAiTextEmbeddingModel;
34-
import org.springframework.boot.autoconfigure.AutoConfigurations;
3534
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3635

3736
import static org.assertj.core.api.Assertions.assertThat;
@@ -53,7 +52,8 @@ public class VertexAiTextEmbeddingModelAutoConfigurationIT {
5352

5453
@Test
5554
public void textEmbedding() {
56-
this.contextRunner.withConfiguration(vertexAiAutoConfig(VertexAiTextEmbeddingAutoConfiguration.class))
55+
this.contextRunner
56+
.withConfiguration(VertexAiITUtil.vertexAiEmbeddingAutoConfig(VertexAiTextEmbeddingAutoConfiguration.class))
5757
.run(context -> {
5858
var connectionProperties = context.getBean(VertexAiEmbeddingConnectionProperties.class);
5959
var textEmbeddingProperties = context.getBean(VertexAiTextEmbeddingProperties.class);
@@ -73,21 +73,24 @@ public void textEmbedding() {
7373

7474
@Test
7575
void textEmbeddingActivation() {
76-
this.contextRunner.withConfiguration(vertexAiAutoConfig(VertexAiTextEmbeddingAutoConfiguration.class))
76+
this.contextRunner
77+
.withConfiguration(VertexAiITUtil.vertexAiEmbeddingAutoConfig(VertexAiTextEmbeddingAutoConfiguration.class))
7778
.withPropertyValues("spring.ai.model.embedding.text=none")
7879
.run(context -> {
7980
assertThat(context.getBeansOfType(VertexAiTextEmbeddingProperties.class)).isEmpty();
8081
assertThat(context.getBeansOfType(VertexAiTextEmbeddingModel.class)).isEmpty();
8182
});
8283

83-
this.contextRunner.withConfiguration(vertexAiAutoConfig(VertexAiTextEmbeddingAutoConfiguration.class))
84+
this.contextRunner
85+
.withConfiguration(VertexAiITUtil.vertexAiEmbeddingAutoConfig(VertexAiTextEmbeddingAutoConfiguration.class))
8486
.withPropertyValues("spring.ai.model.embedding.text=vertexai")
8587
.run(context -> {
8688
assertThat(context.getBeansOfType(VertexAiTextEmbeddingProperties.class)).isNotEmpty();
8789
assertThat(context.getBeansOfType(VertexAiTextEmbeddingModel.class)).isNotEmpty();
8890
});
8991

90-
this.contextRunner.withConfiguration(vertexAiAutoConfig(VertexAiTextEmbeddingAutoConfiguration.class))
92+
this.contextRunner
93+
.withConfiguration(VertexAiITUtil.vertexAiEmbeddingAutoConfig(VertexAiTextEmbeddingAutoConfiguration.class))
9194
.run(context -> {
9295
assertThat(context.getBeansOfType(VertexAiTextEmbeddingProperties.class)).isNotEmpty();
9396
assertThat(context.getBeansOfType(VertexAiTextEmbeddingModel.class)).isNotEmpty();
@@ -97,7 +100,9 @@ void textEmbeddingActivation() {
97100

98101
@Test
99102
public void multimodalEmbedding() {
100-
this.contextRunner.withConfiguration(vertexAiAutoConfig(VertexAiMultiModalEmbeddingAutoConfiguration.class))
103+
this.contextRunner
104+
.withConfiguration(
105+
VertexAiITUtil.vertexAiEmbeddingAutoConfig(VertexAiMultiModalEmbeddingAutoConfiguration.class))
101106
.run(context -> {
102107
var connectionProperties = context.getBean(VertexAiEmbeddingConnectionProperties.class);
103108
var multimodalEmbeddingProperties = context.getBean(VertexAiMultimodalEmbeddingProperties.class);
@@ -132,37 +137,32 @@ public void multimodalEmbedding() {
132137

133138
@Test
134139
void multimodalEmbeddingActivation() {
135-
this.contextRunner.withConfiguration(vertexAiAutoConfig(VertexAiMultiModalEmbeddingAutoConfiguration.class))
140+
this.contextRunner
141+
.withConfiguration(
142+
VertexAiITUtil.vertexAiEmbeddingAutoConfig(VertexAiMultiModalEmbeddingAutoConfiguration.class))
136143
.withPropertyValues("spring.ai.model.embedding.multimodal=none")
137144
.run(context -> {
138145
assertThat(context.getBeansOfType(VertexAiMultimodalEmbeddingProperties.class)).isEmpty();
139146
assertThat(context.getBeansOfType(VertexAiMultimodalEmbeddingModel.class)).isEmpty();
140147
});
141148

142-
this.contextRunner.withConfiguration(vertexAiAutoConfig(VertexAiMultiModalEmbeddingAutoConfiguration.class))
149+
this.contextRunner
150+
.withConfiguration(
151+
VertexAiITUtil.vertexAiEmbeddingAutoConfig(VertexAiMultiModalEmbeddingAutoConfiguration.class))
143152
.withPropertyValues("spring.ai.model.embedding.multimodal=vertexai")
144153
.run(context -> {
145154
assertThat(context.getBeansOfType(VertexAiMultimodalEmbeddingProperties.class)).isNotEmpty();
146155
assertThat(context.getBeansOfType(VertexAiMultimodalEmbeddingModel.class)).isNotEmpty();
147156
});
148157

149-
this.contextRunner.withConfiguration(vertexAiAutoConfig(VertexAiMultiModalEmbeddingAutoConfiguration.class))
158+
this.contextRunner
159+
.withConfiguration(
160+
VertexAiITUtil.vertexAiEmbeddingAutoConfig(VertexAiMultiModalEmbeddingAutoConfiguration.class))
150161
.run(context -> {
151162
assertThat(context.getBeansOfType(VertexAiMultimodalEmbeddingProperties.class)).isNotEmpty();
152163
assertThat(context.getBeansOfType(VertexAiMultimodalEmbeddingModel.class)).isNotEmpty();
153164
});
154165

155166
}
156167

157-
private static AutoConfigurations vertexAiAutoConfig(Class<?>... additionalAutoConfigurations) {
158-
Class<?>[] dependencies = new Class[] { SpringAiRetryAutoConfiguration.class,
159-
VertexAiEmbeddingConnectionAutoConfiguration.class };
160-
Class<?>[] allAutoConfigurations = new Class[dependencies.length + additionalAutoConfigurations.length];
161-
System.arraycopy(dependencies, 0, allAutoConfigurations, 0, dependencies.length);
162-
System.arraycopy(additionalAutoConfigurations, 0, allAutoConfigurations, dependencies.length,
163-
additionalAutoConfigurations.length);
164-
165-
return AutoConfigurations.of(allAutoConfigurations);
166-
}
167-
168168
}

auto-configurations/models/spring-ai-autoconfigure-model-vertex-ai/src/test/java/org/springframework/ai/model/vertexai/autoconfigure/gemini/VertexAiGeminiChatAutoConfigurationIT.java

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,20 @@
1616

1717
package org.springframework.ai.model.vertexai.autoconfigure.gemini;
1818

19+
import java.util.stream.Collectors;
20+
1921
import org.apache.commons.logging.Log;
2022
import org.apache.commons.logging.LogFactory;
2123
import org.junit.jupiter.api.Test;
2224
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
25+
import reactor.core.publisher.Flux;
26+
2327
import org.springframework.ai.chat.messages.UserMessage;
2428
import org.springframework.ai.chat.model.ChatResponse;
2529
import org.springframework.ai.chat.prompt.Prompt;
26-
import org.springframework.ai.model.tool.autoconfigure.ToolCallingAutoConfiguration;
27-
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
30+
import org.springframework.ai.model.vertexai.autoconfigure.VertexAiITUtil;
2831
import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel;
29-
import org.springframework.boot.autoconfigure.AutoConfigurations;
3032
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
31-
import reactor.core.publisher.Flux;
32-
33-
import java.util.stream.Collectors;
3433

3534
import static org.assertj.core.api.Assertions.assertThat;
3635

@@ -43,7 +42,7 @@ public class VertexAiGeminiChatAutoConfigurationIT {
4342
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
4443
.withPropertyValues("spring.ai.vertex.ai.gemini.project-id=" + System.getenv("VERTEX_AI_GEMINI_PROJECT_ID"),
4544
"spring.ai.vertex.ai.gemini.location=" + System.getenv("VERTEX_AI_GEMINI_LOCATION"))
46-
.withConfiguration(vertexAiAutoConfig(VertexAiGeminiChatAutoConfiguration.class));
45+
.withConfiguration(VertexAiITUtil.vertexAiToolAutoConfig(VertexAiGeminiChatAutoConfiguration.class));
4746

4847
@Test
4948
void generate() {
@@ -71,14 +70,4 @@ void generateStreaming() {
7170
});
7271
}
7372

74-
private static AutoConfigurations vertexAiAutoConfig(Class<?>... additionalAutoConfigurations) {
75-
Class<?>[] dependencies = new Class[] { SpringAiRetryAutoConfiguration.class, ToolCallingAutoConfiguration.class};
76-
Class<?>[] allAutoConfigurations = new Class[dependencies.length + additionalAutoConfigurations.length];
77-
System.arraycopy(dependencies, 0, allAutoConfigurations, 0, dependencies.length);
78-
System.arraycopy(additionalAutoConfigurations, 0, allAutoConfigurations, dependencies.length,
79-
additionalAutoConfigurations.length);
80-
81-
return AutoConfigurations.of(allAutoConfigurations);
82-
}
83-
8473
}

auto-configurations/models/spring-ai-autoconfigure-model-vertex-ai/src/test/java/org/springframework/ai/model/vertexai/autoconfigure/gemini/VertexAiModelConfigurationTests.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
import org.junit.jupiter.api.Test;
2020
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
2121

22+
import org.springframework.ai.model.vertexai.autoconfigure.VertexAiITUtil;
2223
import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel;
23-
import org.springframework.boot.autoconfigure.AutoConfigurations;
2424
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2525

2626
import static org.assertj.core.api.Assertions.assertThat;
@@ -41,14 +41,16 @@ public class VertexAiModelConfigurationTests {
4141
@Test
4242
void chatModelActivation() {
4343

44-
this.contextRunner.withConfiguration(AutoConfigurations.of(VertexAiGeminiChatAutoConfiguration.class))
44+
this.contextRunner
45+
.withConfiguration(VertexAiITUtil.vertexAiToolAutoConfig(VertexAiGeminiChatAutoConfiguration.class))
4546
.withPropertyValues("spring.ai.model.chat=none")
4647
.run(context -> {
4748
assertThat(context.getBeansOfType(VertexAiGeminiChatProperties.class)).isEmpty();
4849
assertThat(context.getBeansOfType(VertexAiGeminiChatModel.class)).isEmpty();
4950
});
5051

51-
this.contextRunner.withConfiguration(AutoConfigurations.of(VertexAiGeminiChatAutoConfiguration.class))
52+
this.contextRunner
53+
.withConfiguration(VertexAiITUtil.vertexAiToolAutoConfig(VertexAiGeminiChatAutoConfiguration.class))
5254
.withPropertyValues("spring.ai.model.chat=vertexai")
5355
.run(context -> {
5456
assertThat(context.getBeansOfType(VertexAiGeminiChatProperties.class)).isNotEmpty();

auto-configurations/models/spring-ai-autoconfigure-model-vertex-ai/src/test/java/org/springframework/ai/model/vertexai/autoconfigure/gemini/tool/FunctionCallWithFunctionBeanIT.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@
2828
import org.springframework.ai.chat.model.ChatResponse;
2929
import org.springframework.ai.chat.prompt.Prompt;
3030
import org.springframework.ai.model.tool.ToolCallingChatOptions;
31+
import org.springframework.ai.model.vertexai.autoconfigure.VertexAiITUtil;
3132
import org.springframework.ai.model.vertexai.autoconfigure.gemini.VertexAiGeminiChatAutoConfiguration;
3233
import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel;
3334
import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatOptions;
34-
import org.springframework.boot.autoconfigure.AutoConfigurations;
3535
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3636
import org.springframework.context.annotation.Bean;
3737
import org.springframework.context.annotation.Configuration;
@@ -49,7 +49,7 @@ class FunctionCallWithFunctionBeanIT {
4949
.withPropertyValues("spring.ai.vertex.ai.gemini.project-id=" + System.getenv("VERTEX_AI_GEMINI_PROJECT_ID"),
5050
"spring.ai.vertex.ai.gemini.location=" + System.getenv("VERTEX_AI_GEMINI_LOCATION"))
5151

52-
.withConfiguration(AutoConfigurations.of(VertexAiGeminiChatAutoConfiguration.class))
52+
.withConfiguration(VertexAiITUtil.vertexAiToolAutoConfig(VertexAiGeminiChatAutoConfiguration.class))
5353
.withUserConfiguration(Config.class);
5454

5555
@Test

auto-configurations/models/spring-ai-autoconfigure-model-vertex-ai/src/test/java/org/springframework/ai/model/vertexai/autoconfigure/gemini/tool/FunctionCallWithFunctionWrapperIT.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@
2626
import org.springframework.ai.chat.messages.UserMessage;
2727
import org.springframework.ai.chat.model.ChatResponse;
2828
import org.springframework.ai.chat.prompt.Prompt;
29+
import org.springframework.ai.model.vertexai.autoconfigure.VertexAiITUtil;
2930
import org.springframework.ai.model.vertexai.autoconfigure.gemini.VertexAiGeminiChatAutoConfiguration;
3031
import org.springframework.ai.tool.ToolCallback;
3132
import org.springframework.ai.tool.function.FunctionToolCallback;
3233
import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel;
3334
import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatOptions;
34-
import org.springframework.boot.autoconfigure.AutoConfigurations;
3535
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3636
import org.springframework.context.annotation.Bean;
3737
import org.springframework.context.annotation.Configuration;
@@ -47,7 +47,7 @@ public class FunctionCallWithFunctionWrapperIT {
4747
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
4848
.withPropertyValues("spring.ai.vertex.ai.gemini.project-id=" + System.getenv("VERTEX_AI_GEMINI_PROJECT_ID"),
4949
"spring.ai.vertex.ai.gemini.location=" + System.getenv("VERTEX_AI_GEMINI_LOCATION"))
50-
.withConfiguration(AutoConfigurations.of(VertexAiGeminiChatAutoConfiguration.class))
50+
.withConfiguration(VertexAiITUtil.vertexAiToolAutoConfig(VertexAiGeminiChatAutoConfiguration.class))
5151
.withUserConfiguration(Config.class);
5252

5353
@Test

auto-configurations/models/spring-ai-autoconfigure-model-vertex-ai/src/test/java/org/springframework/ai/model/vertexai/autoconfigure/gemini/tool/FunctionCallWithPromptFunctionIT.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@
2626
import org.springframework.ai.chat.messages.UserMessage;
2727
import org.springframework.ai.chat.model.ChatResponse;
2828
import org.springframework.ai.chat.prompt.Prompt;
29+
import org.springframework.ai.model.vertexai.autoconfigure.VertexAiITUtil;
2930
import org.springframework.ai.model.vertexai.autoconfigure.gemini.VertexAiGeminiChatAutoConfiguration;
3031
import org.springframework.ai.tool.function.FunctionToolCallback;
3132
import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel;
3233
import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatOptions;
33-
import org.springframework.boot.autoconfigure.AutoConfigurations;
3434
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3535

3636
import static org.assertj.core.api.Assertions.assertThat;
@@ -44,7 +44,7 @@ public class FunctionCallWithPromptFunctionIT {
4444
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
4545
.withPropertyValues("spring.ai.vertex.ai.gemini.project-id=" + System.getenv("VERTEX_AI_GEMINI_PROJECT_ID"),
4646
"spring.ai.vertex.ai.gemini.location=" + System.getenv("VERTEX_AI_GEMINI_LOCATION"))
47-
.withConfiguration(AutoConfigurations.of(VertexAiGeminiChatAutoConfiguration.class));
47+
.withConfiguration(VertexAiITUtil.vertexAiToolAutoConfig(VertexAiGeminiChatAutoConfiguration.class));
4848

4949
@Test
5050
void functionCallTest() {

0 commit comments

Comments
 (0)