Skip to content

Commit d9f5f09

Browse files
centrumekilayaperumalg
authored andcommitted
Fix VertexAI auto-configuration
Signed-off-by: Pawel Potaczala <30981922+centrumek@users.noreply.github.com>
1 parent 087393b commit d9f5f09

File tree

5 files changed

+40
-23
lines changed

5 files changed

+40
-23
lines changed

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import org.springframework.ai.vertexai.embedding.VertexAiEmbeddingConnectionDetails;
2727
import org.springframework.ai.vertexai.embedding.multimodal.VertexAiMultimodalEmbeddingModel;
2828
import org.springframework.boot.autoconfigure.AutoConfiguration;
29-
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
3029
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3130
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3231
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -41,13 +40,11 @@
4140
* @author Ilayaperumal Gopinathan
4241
* @since 1.0.0
4342
*/
44-
@AutoConfiguration(after = { SpringAiRetryAutoConfiguration.class })
43+
@AutoConfiguration(after = { SpringAiRetryAutoConfiguration.class, VertexAiEmbeddingConnectionAutoConfiguration.class })
4544
@ConditionalOnClass({ VertexAI.class, VertexAiMultimodalEmbeddingModel.class })
4645
@ConditionalOnProperty(name = SpringAIModelProperties.MULTI_MODAL_EMBEDDING_MODEL,
4746
havingValue = SpringAIModels.VERTEX_AI, matchIfMissing = true)
4847
@EnableConfigurationProperties(VertexAiMultimodalEmbeddingProperties.class)
49-
@ImportAutoConfiguration(
50-
classes = { SpringAiRetryAutoConfiguration.class, VertexAiEmbeddingConnectionAutoConfiguration.class })
5148
public class VertexAiMultiModalEmbeddingAutoConfiguration {
5249

5350
@Bean

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import org.springframework.ai.vertexai.embedding.text.VertexAiTextEmbeddingModel;
2727
import org.springframework.beans.factory.ObjectProvider;
2828
import org.springframework.boot.autoconfigure.AutoConfiguration;
29-
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
3029
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3130
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3231
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -42,13 +41,11 @@
4241
* @author Ilayaperumal Gopinathan
4342
* @since 1.0.0
4443
*/
45-
@AutoConfiguration(after = { SpringAiRetryAutoConfiguration.class })
44+
@AutoConfiguration(after = { SpringAiRetryAutoConfiguration.class, VertexAiEmbeddingConnectionAutoConfiguration.class })
4645
@ConditionalOnClass(VertexAiTextEmbeddingModel.class)
4746
@ConditionalOnProperty(name = SpringAIModelProperties.TEXT_EMBEDDING_MODEL, havingValue = SpringAIModels.VERTEX_AI,
4847
matchIfMissing = true)
4948
@EnableConfigurationProperties(VertexAiTextEmbeddingProperties.class)
50-
@ImportAutoConfiguration(
51-
classes = { SpringAiRetryAutoConfiguration.class, VertexAiEmbeddingConnectionAutoConfiguration.class })
5249
public class VertexAiTextEmbeddingAutoConfiguration {
5350

5451
@Bean

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel;
3434
import org.springframework.beans.factory.ObjectProvider;
3535
import org.springframework.boot.autoconfigure.AutoConfiguration;
36-
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
3736
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3837
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3938
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -59,7 +58,6 @@
5958
@ConditionalOnProperty(name = SpringAIModelProperties.CHAT_MODEL, havingValue = SpringAIModels.VERTEX_AI,
6059
matchIfMissing = true)
6160
@EnableConfigurationProperties({ VertexAiGeminiChatProperties.class, VertexAiGeminiConnectionProperties.class })
62-
@ImportAutoConfiguration(classes = { SpringAiRetryAutoConfiguration.class, ToolCallingAutoConfiguration.class })
6361
public class VertexAiGeminiChatAutoConfiguration {
6462

6563
@Bean

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

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
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;
3132
import org.springframework.ai.vertexai.embedding.multimodal.VertexAiMultimodalEmbeddingModel;
3233
import org.springframework.ai.vertexai.embedding.text.VertexAiTextEmbeddingModel;
3334
import org.springframework.boot.autoconfigure.AutoConfigurations;
@@ -52,12 +53,13 @@ public class VertexAiTextEmbeddingModelAutoConfigurationIT {
5253

5354
@Test
5455
public void textEmbedding() {
55-
this.contextRunner.withConfiguration(AutoConfigurations.of(VertexAiTextEmbeddingAutoConfiguration.class))
56+
this.contextRunner.withConfiguration(vertexAiAutoConfig(VertexAiTextEmbeddingAutoConfiguration.class))
5657
.run(context -> {
5758
var connectionProperties = context.getBean(VertexAiEmbeddingConnectionProperties.class);
5859
var textEmbeddingProperties = context.getBean(VertexAiTextEmbeddingProperties.class);
5960

6061
assertThat(connectionProperties).isNotNull();
62+
assertThat(textEmbeddingProperties).isNotNull();
6163

6264
VertexAiTextEmbeddingModel embeddingModel = context.getBean(VertexAiTextEmbeddingModel.class);
6365
assertThat(embeddingModel).isInstanceOf(VertexAiTextEmbeddingModel.class);
@@ -71,21 +73,21 @@ public void textEmbedding() {
7173

7274
@Test
7375
void textEmbeddingActivation() {
74-
this.contextRunner.withConfiguration(AutoConfigurations.of(VertexAiTextEmbeddingAutoConfiguration.class))
76+
this.contextRunner.withConfiguration(vertexAiAutoConfig(VertexAiTextEmbeddingAutoConfiguration.class))
7577
.withPropertyValues("spring.ai.model.embedding.text=none")
7678
.run(context -> {
7779
assertThat(context.getBeansOfType(VertexAiTextEmbeddingProperties.class)).isEmpty();
7880
assertThat(context.getBeansOfType(VertexAiTextEmbeddingModel.class)).isEmpty();
7981
});
8082

81-
this.contextRunner.withConfiguration(AutoConfigurations.of(VertexAiTextEmbeddingAutoConfiguration.class))
83+
this.contextRunner.withConfiguration(vertexAiAutoConfig(VertexAiTextEmbeddingAutoConfiguration.class))
8284
.withPropertyValues("spring.ai.model.embedding.text=vertexai")
8385
.run(context -> {
8486
assertThat(context.getBeansOfType(VertexAiTextEmbeddingProperties.class)).isNotEmpty();
8587
assertThat(context.getBeansOfType(VertexAiTextEmbeddingModel.class)).isNotEmpty();
8688
});
8789

88-
this.contextRunner.withConfiguration(AutoConfigurations.of(VertexAiTextEmbeddingAutoConfiguration.class))
90+
this.contextRunner.withConfiguration(vertexAiAutoConfig(VertexAiTextEmbeddingAutoConfiguration.class))
8991
.run(context -> {
9092
assertThat(context.getBeansOfType(VertexAiTextEmbeddingProperties.class)).isNotEmpty();
9193
assertThat(context.getBeansOfType(VertexAiTextEmbeddingModel.class)).isNotEmpty();
@@ -95,12 +97,13 @@ void textEmbeddingActivation() {
9597

9698
@Test
9799
public void multimodalEmbedding() {
98-
this.contextRunner.withConfiguration(AutoConfigurations.of(VertexAiMultiModalEmbeddingAutoConfiguration.class))
100+
this.contextRunner.withConfiguration(vertexAiAutoConfig(VertexAiMultiModalEmbeddingAutoConfiguration.class))
99101
.run(context -> {
100102
var connectionProperties = context.getBean(VertexAiEmbeddingConnectionProperties.class);
101103
var multimodalEmbeddingProperties = context.getBean(VertexAiMultimodalEmbeddingProperties.class);
102104

103105
assertThat(connectionProperties).isNotNull();
106+
assertThat(multimodalEmbeddingProperties).isNotNull();
104107

105108
VertexAiMultimodalEmbeddingModel multiModelEmbeddingModel = context
106109
.getBean(VertexAiMultimodalEmbeddingModel.class);
@@ -129,26 +132,37 @@ public void multimodalEmbedding() {
129132

130133
@Test
131134
void multimodalEmbeddingActivation() {
132-
this.contextRunner.withConfiguration(AutoConfigurations.of(VertexAiMultiModalEmbeddingAutoConfiguration.class))
135+
this.contextRunner.withConfiguration(vertexAiAutoConfig(VertexAiMultiModalEmbeddingAutoConfiguration.class))
133136
.withPropertyValues("spring.ai.model.embedding.multimodal=none")
134137
.run(context -> {
135138
assertThat(context.getBeansOfType(VertexAiMultimodalEmbeddingProperties.class)).isEmpty();
136139
assertThat(context.getBeansOfType(VertexAiMultimodalEmbeddingModel.class)).isEmpty();
137140
});
138141

139-
this.contextRunner.withConfiguration(AutoConfigurations.of(VertexAiMultiModalEmbeddingAutoConfiguration.class))
142+
this.contextRunner.withConfiguration(vertexAiAutoConfig(VertexAiMultiModalEmbeddingAutoConfiguration.class))
140143
.withPropertyValues("spring.ai.model.embedding.multimodal=vertexai")
141144
.run(context -> {
142145
assertThat(context.getBeansOfType(VertexAiMultimodalEmbeddingProperties.class)).isNotEmpty();
143146
assertThat(context.getBeansOfType(VertexAiMultimodalEmbeddingModel.class)).isNotEmpty();
144147
});
145148

146-
this.contextRunner.withConfiguration(AutoConfigurations.of(VertexAiMultiModalEmbeddingAutoConfiguration.class))
149+
this.contextRunner.withConfiguration(vertexAiAutoConfig(VertexAiMultiModalEmbeddingAutoConfiguration.class))
147150
.run(context -> {
148151
assertThat(context.getBeansOfType(VertexAiMultimodalEmbeddingProperties.class)).isNotEmpty();
149152
assertThat(context.getBeansOfType(VertexAiMultimodalEmbeddingModel.class)).isNotEmpty();
150153
});
151154

152155
}
153156

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+
154168
}

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

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

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

19-
import java.util.stream.Collectors;
20-
2119
import org.apache.commons.logging.Log;
2220
import org.apache.commons.logging.LogFactory;
2321
import org.junit.jupiter.api.Test;
2422
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
25-
import reactor.core.publisher.Flux;
26-
2723
import org.springframework.ai.chat.messages.UserMessage;
2824
import org.springframework.ai.chat.model.ChatResponse;
2925
import org.springframework.ai.chat.prompt.Prompt;
26+
import org.springframework.ai.model.tool.autoconfigure.ToolCallingAutoConfiguration;
27+
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
3028
import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel;
3129
import org.springframework.boot.autoconfigure.AutoConfigurations;
3230
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
31+
import reactor.core.publisher.Flux;
32+
33+
import java.util.stream.Collectors;
3334

3435
import static org.assertj.core.api.Assertions.assertThat;
3536

@@ -42,7 +43,7 @@ public class VertexAiGeminiChatAutoConfigurationIT {
4243
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
4344
.withPropertyValues("spring.ai.vertex.ai.gemini.project-id=" + System.getenv("VERTEX_AI_GEMINI_PROJECT_ID"),
4445
"spring.ai.vertex.ai.gemini.location=" + System.getenv("VERTEX_AI_GEMINI_LOCATION"))
45-
.withConfiguration(AutoConfigurations.of(VertexAiGeminiChatAutoConfiguration.class));
46+
.withConfiguration(vertexAiAutoConfig(VertexAiGeminiChatAutoConfiguration.class));
4647

4748
@Test
4849
void generate() {
@@ -70,4 +71,14 @@ void generateStreaming() {
7071
});
7172
}
7273

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+
7384
}

0 commit comments

Comments
 (0)