Skip to content

Commit 86f013d

Browse files
devbulchandaniilayaperumalg
authored andcommitted
Fix google genai auto configurations
Signed-off-by: Dev Bulchandani <devbulchandani8@gmail.com>
1 parent 4ad1461 commit 86f013d

File tree

8 files changed

+75
-27
lines changed

8 files changed

+75
-27
lines changed

auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/main/java/org/springframework/ai/model/google/genai/autoconfigure/chat/GoogleGenAiChatAutoConfiguration.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
3535
import org.springframework.beans.factory.ObjectProvider;
3636
import org.springframework.boot.autoconfigure.AutoConfiguration;
37-
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
3837
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3938
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
4039
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -61,7 +60,6 @@
6160
@ConditionalOnProperty(name = SpringAIModelProperties.CHAT_MODEL, havingValue = SpringAIModels.GOOGLE_GEN_AI,
6261
matchIfMissing = true)
6362
@EnableConfigurationProperties({ GoogleGenAiChatProperties.class, GoogleGenAiConnectionProperties.class })
64-
@ImportAutoConfiguration(classes = { SpringAiRetryAutoConfiguration.class, ToolCallingAutoConfiguration.class })
6563
public class GoogleGenAiChatAutoConfiguration {
6664

6765
@Bean

auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/main/java/org/springframework/ai/model/google/genai/autoconfigure/embedding/GoogleGenAiTextEmbeddingAutoConfiguration.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
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,12 @@
4241
* @author Ilayaperumal Gopinathan
4342
* @since 1.1.0
4443
*/
45-
@AutoConfiguration(after = { SpringAiRetryAutoConfiguration.class })
44+
@AutoConfiguration(
45+
after = { SpringAiRetryAutoConfiguration.class, GoogleGenAiEmbeddingConnectionAutoConfiguration.class })
4646
@ConditionalOnClass(GoogleGenAiTextEmbeddingModel.class)
4747
@ConditionalOnProperty(name = SpringAIModelProperties.TEXT_EMBEDDING_MODEL, havingValue = SpringAIModels.GOOGLE_GEN_AI,
4848
matchIfMissing = true)
4949
@EnableConfigurationProperties(GoogleGenAiTextEmbeddingProperties.class)
50-
@ImportAutoConfiguration(
51-
classes = { SpringAiRetryAutoConfiguration.class, GoogleGenAiEmbeddingConnectionAutoConfiguration.class })
5250
public class GoogleGenAiTextEmbeddingAutoConfiguration {
5351

5452
@Bean
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
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.google.genai.autoconfigure;
18+
19+
import java.util.Arrays;
20+
import java.util.stream.Stream;
21+
22+
import org.springframework.ai.model.google.genai.autoconfigure.chat.GoogleGenAiChatAutoConfiguration;
23+
import org.springframework.ai.model.google.genai.autoconfigure.embedding.GoogleGenAiEmbeddingConnectionAutoConfiguration;
24+
import org.springframework.ai.model.google.genai.autoconfigure.embedding.GoogleGenAiTextEmbeddingAutoConfiguration;
25+
import org.springframework.ai.model.tool.autoconfigure.ToolCallingAutoConfiguration;
26+
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
27+
import org.springframework.boot.autoconfigure.AutoConfigurations;
28+
29+
/**
30+
* Base class to provide consistent AutoConfigurations for Google GenAI integration tests.
31+
*/
32+
public abstract class BaseGoogleGenAiIT {
33+
34+
/**
35+
* AutoConfigurations needed for Google GenAI Chat model.
36+
*/
37+
public static AutoConfigurations googleGenAiChatAutoConfig(Class<?>... additional) {
38+
Class<?>[] dependencies = { SpringAiRetryAutoConfiguration.class, ToolCallingAutoConfiguration.class,
39+
GoogleGenAiChatAutoConfiguration.class };
40+
Class<?>[] all = Stream.concat(Arrays.stream(dependencies), Arrays.stream(additional)).toArray(Class<?>[]::new);
41+
return AutoConfigurations.of(all);
42+
}
43+
44+
/**
45+
* AutoConfigurations needed for Google GenAI Text Embedding model.
46+
*/
47+
public static AutoConfigurations googleGenAiEmbeddingAutoConfig(Class<?>... additional) {
48+
Class<?>[] dependencies = { SpringAiRetryAutoConfiguration.class,
49+
GoogleGenAiEmbeddingConnectionAutoConfiguration.class,
50+
GoogleGenAiTextEmbeddingAutoConfiguration.class };
51+
Class<?>[] all = Stream.concat(Arrays.stream(dependencies), Arrays.stream(additional)).toArray(Class<?>[]::new);
52+
return AutoConfigurations.of(all);
53+
}
54+
55+
}

auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/test/java/org/springframework/ai/model/google/genai/autoconfigure/chat/GoogleGenAiCachedContentServiceAutoConfigurationTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222

2323
import org.springframework.ai.google.genai.GoogleGenAiChatModel;
2424
import org.springframework.ai.google.genai.cache.GoogleGenAiCachedContentService;
25+
import org.springframework.ai.model.google.genai.autoconfigure.BaseGoogleGenAiIT;
2526
import org.springframework.ai.model.tool.ToolCallingManager;
26-
import org.springframework.boot.autoconfigure.AutoConfigurations;
2727
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2828
import org.springframework.context.annotation.Bean;
2929
import org.springframework.context.annotation.Configuration;
@@ -40,7 +40,7 @@
4040
public class GoogleGenAiCachedContentServiceAutoConfigurationTests {
4141

4242
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
43-
.withConfiguration(AutoConfigurations.of(GoogleGenAiChatAutoConfiguration.class));
43+
.withConfiguration(BaseGoogleGenAiIT.googleGenAiChatAutoConfig());
4444

4545
@Test
4646
void cachedContentServiceBeanIsCreatedWhenChatModelExists() {

auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/test/java/org/springframework/ai/model/google/genai/autoconfigure/chat/GoogleGenAiChatAutoConfigurationIT.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import org.springframework.ai.chat.model.ChatResponse;
2929
import org.springframework.ai.chat.prompt.Prompt;
3030
import org.springframework.ai.google.genai.GoogleGenAiChatModel;
31-
import org.springframework.boot.autoconfigure.AutoConfigurations;
31+
import org.springframework.ai.model.google.genai.autoconfigure.BaseGoogleGenAiIT;
3232
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3333

3434
import static org.assertj.core.api.Assertions.assertThat;
@@ -49,7 +49,7 @@ public class GoogleGenAiChatAutoConfigurationIT {
4949
void generateWithApiKey() {
5050
ApplicationContextRunner contextRunner = new ApplicationContextRunner()
5151
.withPropertyValues("spring.ai.google.genai.api-key=" + System.getenv("GOOGLE_API_KEY"))
52-
.withConfiguration(AutoConfigurations.of(GoogleGenAiChatAutoConfiguration.class));
52+
.withConfiguration(BaseGoogleGenAiIT.googleGenAiChatAutoConfig());
5353

5454
contextRunner.run(context -> {
5555
GoogleGenAiChatModel chatModel = context.getBean(GoogleGenAiChatModel.class);
@@ -64,7 +64,7 @@ void generateWithApiKey() {
6464
void generateStreamingWithApiKey() {
6565
ApplicationContextRunner contextRunner = new ApplicationContextRunner()
6666
.withPropertyValues("spring.ai.google.genai.api-key=" + System.getenv("GOOGLE_API_KEY"))
67-
.withConfiguration(AutoConfigurations.of(GoogleGenAiChatAutoConfiguration.class));
67+
.withConfiguration(BaseGoogleGenAiIT.googleGenAiChatAutoConfig());
6868

6969
contextRunner.run(context -> {
7070
GoogleGenAiChatModel chatModel = context.getBean(GoogleGenAiChatModel.class);
@@ -87,7 +87,7 @@ void generateWithVertexAi() {
8787
ApplicationContextRunner contextRunner = new ApplicationContextRunner()
8888
.withPropertyValues("spring.ai.google.genai.project-id=" + System.getenv("GOOGLE_CLOUD_PROJECT"),
8989
"spring.ai.google.genai.location=" + System.getenv("GOOGLE_CLOUD_LOCATION"))
90-
.withConfiguration(AutoConfigurations.of(GoogleGenAiChatAutoConfiguration.class));
90+
.withConfiguration(BaseGoogleGenAiIT.googleGenAiChatAutoConfig());
9191

9292
contextRunner.run(context -> {
9393
GoogleGenAiChatModel chatModel = context.getBean(GoogleGenAiChatModel.class);
@@ -104,7 +104,7 @@ void generateStreamingWithVertexAi() {
104104
ApplicationContextRunner contextRunner = new ApplicationContextRunner()
105105
.withPropertyValues("spring.ai.google.genai.project-id=" + System.getenv("GOOGLE_CLOUD_PROJECT"),
106106
"spring.ai.google.genai.location=" + System.getenv("GOOGLE_CLOUD_LOCATION"))
107-
.withConfiguration(AutoConfigurations.of(GoogleGenAiChatAutoConfiguration.class));
107+
.withConfiguration(BaseGoogleGenAiIT.googleGenAiChatAutoConfig());
108108

109109
contextRunner.run(context -> {
110110
GoogleGenAiChatModel chatModel = context.getBean(GoogleGenAiChatModel.class);

auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/test/java/org/springframework/ai/model/google/genai/autoconfigure/chat/GoogleGenAiModelConfigurationTests.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
2121

2222
import org.springframework.ai.google.genai.GoogleGenAiChatModel;
23-
import org.springframework.boot.autoconfigure.AutoConfigurations;
23+
import org.springframework.ai.model.google.genai.autoconfigure.BaseGoogleGenAiIT;
2424
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2525

2626
import static org.assertj.core.api.Assertions.assertThat;
@@ -37,14 +37,14 @@ class GoogleGenAiModelConfigurationTests {
3737
@Test
3838
void chatModelActivationWithApiKey() {
3939

40-
this.contextRunner.withConfiguration(AutoConfigurations.of(GoogleGenAiChatAutoConfiguration.class))
40+
this.contextRunner.withConfiguration(BaseGoogleGenAiIT.googleGenAiChatAutoConfig())
4141
.withPropertyValues("spring.ai.google.genai.api-key=test-key", "spring.ai.model.chat=none")
4242
.run(context -> {
4343
assertThat(context.getBeansOfType(GoogleGenAiChatProperties.class)).isEmpty();
4444
assertThat(context.getBeansOfType(GoogleGenAiChatModel.class)).isEmpty();
4545
});
4646

47-
this.contextRunner.withConfiguration(AutoConfigurations.of(GoogleGenAiChatAutoConfiguration.class))
47+
this.contextRunner.withConfiguration(BaseGoogleGenAiIT.googleGenAiChatAutoConfig())
4848
.withPropertyValues("spring.ai.google.genai.api-key=test-key", "spring.ai.model.chat=google-genai")
4949
.run(context -> {
5050
assertThat(context.getBeansOfType(GoogleGenAiChatProperties.class)).isNotEmpty();
@@ -57,15 +57,15 @@ void chatModelActivationWithApiKey() {
5757
@EnabledIfEnvironmentVariable(named = "GOOGLE_CLOUD_LOCATION", matches = ".*")
5858
void chatModelActivationWithVertexAi() {
5959

60-
this.contextRunner.withConfiguration(AutoConfigurations.of(GoogleGenAiChatAutoConfiguration.class))
60+
this.contextRunner.withConfiguration(BaseGoogleGenAiIT.googleGenAiChatAutoConfig())
6161
.withPropertyValues("spring.ai.google.genai.project-id=test-project",
6262
"spring.ai.google.genai.location=us-central1", "spring.ai.model.chat=none")
6363
.run(context -> {
6464
assertThat(context.getBeansOfType(GoogleGenAiChatProperties.class)).isEmpty();
6565
assertThat(context.getBeansOfType(GoogleGenAiChatModel.class)).isEmpty();
6666
});
6767

68-
this.contextRunner.withConfiguration(AutoConfigurations.of(GoogleGenAiChatAutoConfiguration.class))
68+
this.contextRunner.withConfiguration(BaseGoogleGenAiIT.googleGenAiChatAutoConfig())
6969
.withPropertyValues("spring.ai.google.genai.project-id=test-project",
7070
"spring.ai.google.genai.location=us-central1", "spring.ai.model.chat=google-genai")
7171
.run(context -> {
@@ -78,7 +78,7 @@ void chatModelActivationWithVertexAi() {
7878
void chatModelDefaultActivation() {
7979
// Tests that the model is activated by default when spring.ai.model.chat is not
8080
// set
81-
this.contextRunner.withConfiguration(AutoConfigurations.of(GoogleGenAiChatAutoConfiguration.class))
81+
this.contextRunner.withConfiguration(BaseGoogleGenAiIT.googleGenAiChatAutoConfig())
8282
.withPropertyValues("spring.ai.google.genai.api-key=test-key")
8383
.run(context -> {
8484
assertThat(context.getBeansOfType(GoogleGenAiChatProperties.class)).isNotEmpty();

auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/test/java/org/springframework/ai/model/google/genai/autoconfigure/chat/tool/FunctionCallWithFunctionBeanIT.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,9 @@
2727
import org.springframework.ai.chat.prompt.Prompt;
2828
import org.springframework.ai.google.genai.GoogleGenAiChatModel;
2929
import org.springframework.ai.google.genai.GoogleGenAiChatOptions;
30-
import org.springframework.ai.model.google.genai.autoconfigure.chat.GoogleGenAiChatAutoConfiguration;
30+
import org.springframework.ai.model.google.genai.autoconfigure.BaseGoogleGenAiIT;
3131
import org.springframework.ai.tool.ToolCallback;
3232
import org.springframework.ai.tool.function.FunctionToolCallback;
33-
import org.springframework.boot.autoconfigure.AutoConfigurations;
3433
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
3534
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3635
import org.springframework.context.annotation.Bean;
@@ -52,8 +51,7 @@ public class FunctionCallWithFunctionBeanIT {
5251
void functionCallWithApiKey() {
5352
ApplicationContextRunner contextRunner = new ApplicationContextRunner()
5453
.withPropertyValues("spring.ai.google.genai.api-key=" + System.getenv("GOOGLE_API_KEY"))
55-
.withConfiguration(
56-
AutoConfigurations.of(RestClientAutoConfiguration.class, GoogleGenAiChatAutoConfiguration.class))
54+
.withConfiguration(BaseGoogleGenAiIT.googleGenAiChatAutoConfig(RestClientAutoConfiguration.class))
5755
.withUserConfiguration(FunctionConfiguration.class);
5856

5957
contextRunner.run(context -> {
@@ -83,8 +81,7 @@ void functionCallWithVertexAi() {
8381
ApplicationContextRunner contextRunner = new ApplicationContextRunner()
8482
.withPropertyValues("spring.ai.google.genai.project-id=" + System.getenv("GOOGLE_CLOUD_PROJECT"),
8583
"spring.ai.google.genai.location=" + System.getenv("GOOGLE_CLOUD_LOCATION"))
86-
.withConfiguration(
87-
AutoConfigurations.of(RestClientAutoConfiguration.class, GoogleGenAiChatAutoConfiguration.class))
84+
.withConfiguration(BaseGoogleGenAiIT.googleGenAiChatAutoConfig(RestClientAutoConfiguration.class))
8885
.withUserConfiguration(FunctionConfiguration.class);
8986

9087
contextRunner.run(context -> {

auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/test/java/org/springframework/ai/model/google/genai/autoconfigure/embedding/GoogleGenAiTextEmbeddingAutoConfigurationIT.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import org.springframework.ai.embedding.EmbeddingResponse;
2525
import org.springframework.ai.google.genai.text.GoogleGenAiTextEmbeddingModel;
26+
import org.springframework.ai.model.google.genai.autoconfigure.BaseGoogleGenAiIT;
2627
import org.springframework.boot.autoconfigure.AutoConfigurations;
2728
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2829

@@ -42,8 +43,7 @@ public class GoogleGenAiTextEmbeddingAutoConfigurationIT {
4243
void embeddingWithApiKey() {
4344
ApplicationContextRunner contextRunner = new ApplicationContextRunner()
4445
.withPropertyValues("spring.ai.google.genai.embedding.api-key=" + System.getenv("GOOGLE_API_KEY"))
45-
.withConfiguration(AutoConfigurations.of(GoogleGenAiTextEmbeddingAutoConfiguration.class,
46-
GoogleGenAiEmbeddingConnectionAutoConfiguration.class));
46+
.withConfiguration(BaseGoogleGenAiIT.googleGenAiEmbeddingAutoConfig());
4747

4848
contextRunner.run(context -> {
4949
GoogleGenAiTextEmbeddingModel embeddingModel = context.getBean(GoogleGenAiTextEmbeddingModel.class);

0 commit comments

Comments
 (0)