Skip to content

Commit 4da6aea

Browse files
committed
Fix ollama auto-configuration
- Related to #4494 Signed-off-by: Daniel Garnier-Moiroux <[email protected]>
1 parent b8dfc09 commit 4da6aea

File tree

14 files changed

+51
-54
lines changed

14 files changed

+51
-54
lines changed

auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/main/java/org/springframework/ai/model/ollama/autoconfigure/OllamaApiAutoConfiguration.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@
2020
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
2121
import org.springframework.beans.factory.ObjectProvider;
2222
import org.springframework.boot.autoconfigure.AutoConfiguration;
23-
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
2423
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2524
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
25+
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
26+
import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration;
2627
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2728
import org.springframework.context.annotation.Bean;
2829
import org.springframework.web.client.ResponseErrorHandler;
@@ -38,10 +39,10 @@
3839
* @author Ilayaperumal Gopinathan
3940
* @since 0.8.0
4041
*/
41-
@AutoConfiguration
42+
@AutoConfiguration(after = { RestClientAutoConfiguration.class, WebClientAutoConfiguration.class,
43+
SpringAiRetryAutoConfiguration.class })
4244
@ConditionalOnClass(OllamaApi.class)
4345
@EnableConfigurationProperties(OllamaConnectionProperties.class)
44-
@ImportAutoConfiguration(classes = { SpringAiRetryAutoConfiguration.class })
4546
public class OllamaApiAutoConfiguration {
4647

4748
@Bean

auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/main/java/org/springframework/ai/model/ollama/autoconfigure/OllamaChatAutoConfiguration.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,10 @@
3131
import org.springframework.ai.ollama.management.PullModelStrategy;
3232
import org.springframework.beans.factory.ObjectProvider;
3333
import org.springframework.boot.autoconfigure.AutoConfiguration;
34-
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
3534
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3635
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3736
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3837
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
39-
import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration;
4038
import org.springframework.boot.context.properties.EnableConfigurationProperties;
4139
import org.springframework.context.annotation.Bean;
4240
import org.springframework.retry.support.RetryTemplate;
@@ -51,13 +49,11 @@
5149
* @author Jonghoon Park
5250
* @since 0.8.0
5351
*/
54-
@AutoConfiguration(after = { RestClientAutoConfiguration.class, ToolCallingAutoConfiguration.class })
52+
@AutoConfiguration(after = { OllamaApiAutoConfiguration.class, ToolCallingAutoConfiguration.class })
5553
@ConditionalOnClass(OllamaChatModel.class)
5654
@ConditionalOnProperty(name = SpringAIModelProperties.CHAT_MODEL, havingValue = SpringAIModels.OLLAMA,
5755
matchIfMissing = true)
5856
@EnableConfigurationProperties({ OllamaChatProperties.class, OllamaInitializationProperties.class })
59-
@ImportAutoConfiguration(classes = { OllamaApiAutoConfiguration.class, RestClientAutoConfiguration.class,
60-
ToolCallingAutoConfiguration.class, WebClientAutoConfiguration.class })
6157
public class OllamaChatAutoConfiguration {
6258

6359
@Bean

auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/main/java/org/springframework/ai/model/ollama/autoconfigure/OllamaEmbeddingAutoConfiguration.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,10 @@
2727
import org.springframework.ai.ollama.management.PullModelStrategy;
2828
import org.springframework.beans.factory.ObjectProvider;
2929
import org.springframework.boot.autoconfigure.AutoConfiguration;
30-
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
3130
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3231
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3332
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3433
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
35-
import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration;
3634
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3735
import org.springframework.context.annotation.Bean;
3836

@@ -45,13 +43,11 @@
4543
* @author Ilayaperumal Gopinathan
4644
* @since 0.8.0
4745
*/
48-
@AutoConfiguration(after = RestClientAutoConfiguration.class)
46+
@AutoConfiguration(after = OllamaApiAutoConfiguration.class)
4947
@ConditionalOnClass(OllamaEmbeddingModel.class)
5048
@ConditionalOnProperty(name = SpringAIModelProperties.EMBEDDING_MODEL, havingValue = SpringAIModels.OLLAMA,
5149
matchIfMissing = true)
5250
@EnableConfigurationProperties({ OllamaEmbeddingProperties.class, OllamaInitializationProperties.class })
53-
@ImportAutoConfiguration(classes = { OllamaApiAutoConfiguration.class, RestClientAutoConfiguration.class,
54-
WebClientAutoConfiguration.class })
5551
public class OllamaEmbeddingAutoConfiguration {
5652

5753
@Bean

auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/test/java/org/springframework/ai/model/ollama/autoconfigure/BaseOllamaIT.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,14 @@
2323
import org.testcontainers.junit.jupiter.Testcontainers;
2424
import org.testcontainers.ollama.OllamaContainer;
2525

26+
import org.springframework.ai.model.tool.autoconfigure.ToolCallingAutoConfiguration;
2627
import org.springframework.ai.ollama.api.OllamaApi;
2728
import org.springframework.ai.ollama.management.ModelManagementOptions;
2829
import org.springframework.ai.ollama.management.OllamaModelManager;
2930
import org.springframework.ai.ollama.management.PullModelStrategy;
31+
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
32+
import org.springframework.boot.autoconfigure.AutoConfigurations;
33+
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
3034
import org.springframework.util.Assert;
3135

3236
@Testcontainers
@@ -112,4 +116,15 @@ private static void ensureModelIsPresent(final OllamaApi ollamaApi, final String
112116
ollamaModelManager.pullModel(model, PullModelStrategy.WHEN_MISSING);
113117
}
114118

119+
public static AutoConfigurations ollamaAutoConfig(Class<?>... additionalAutoConfigurations) {
120+
Class<?>[] dependencies = new Class[] { OllamaApiAutoConfiguration.class, RestClientAutoConfiguration.class,
121+
SpringAiRetryAutoConfiguration.class, ToolCallingAutoConfiguration.class };
122+
Class<?>[] allAutoConfigurations = new Class[dependencies.length + additionalAutoConfigurations.length];
123+
System.arraycopy(dependencies, 0, allAutoConfigurations, 0, dependencies.length);
124+
System.arraycopy(additionalAutoConfigurations, 0, allAutoConfigurations, dependencies.length,
125+
additionalAutoConfigurations.length);
126+
127+
return AutoConfigurations.of(allAutoConfigurations);
128+
}
129+
115130
}

auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/test/java/org/springframework/ai/model/ollama/autoconfigure/OllamaChatAutoConfigurationIT.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.ai.ollama.api.OllamaModel;
3535
import org.springframework.ai.ollama.management.OllamaModelManager;
3636
import org.springframework.boot.autoconfigure.AutoConfigurations;
37+
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
3738
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3839

3940
import static org.assertj.core.api.Assertions.assertThat;
@@ -55,7 +56,7 @@ public class OllamaChatAutoConfigurationIT extends BaseOllamaIT {
5556
"spring.ai.ollama.chat.options.temperature=0.5",
5657
"spring.ai.ollama.chat.options.topK=10")
5758
// @formatter:on
58-
.withConfiguration(AutoConfigurations.of(OllamaChatAutoConfiguration.class));
59+
.withConfiguration(ollamaAutoConfig(OllamaChatAutoConfiguration.class));
5960

6061
private final UserMessage userMessage = new UserMessage("What's the capital of Denmark?");
6162

auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/test/java/org/springframework/ai/model/ollama/autoconfigure/OllamaChatAutoConfigurationTests.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,9 @@
1919
import org.junit.jupiter.api.Test;
2020

2121
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
22-
import org.springframework.boot.autoconfigure.AutoConfigurations;
23-
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
2422
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
25-
2623
import static org.assertj.core.api.Assertions.assertThat;
24+
import static org.springframework.ai.model.ollama.autoconfigure.BaseOllamaIT.ollamaAutoConfig;
2725

2826
/**
2927
* @author Christian Tzolov
@@ -43,8 +41,7 @@ public void propertiesTest() {
4341
"spring.ai.ollama.chat.options.topK=123")
4442
// @formatter:on
4543

46-
.withConfiguration(AutoConfigurations.of(SpringAiRetryAutoConfiguration.class,
47-
RestClientAutoConfiguration.class, OllamaChatAutoConfiguration.class))
44+
.withConfiguration(ollamaAutoConfig(SpringAiRetryAutoConfiguration.class))
4845
.run(context -> {
4946
var chatProperties = context.getBean(OllamaChatProperties.class);
5047
var connectionProperties = context.getBean(OllamaConnectionProperties.class);

auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/test/java/org/springframework/ai/model/ollama/autoconfigure/OllamaEmbeddingAutoConfigurationIT.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,7 @@
2727
import org.springframework.ai.ollama.api.OllamaApi;
2828
import org.springframework.ai.ollama.api.OllamaModel;
2929
import org.springframework.ai.ollama.management.OllamaModelManager;
30-
import org.springframework.boot.autoconfigure.AutoConfigurations;
31-
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
3230
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
33-
3431
import static org.assertj.core.api.Assertions.assertThat;
3532

3633
/**
@@ -45,8 +42,7 @@ public class OllamaEmbeddingAutoConfigurationIT extends BaseOllamaIT {
4542
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
4643
.withPropertyValues("spring.ai.ollama.embedding.options.model=" + MODEL_NAME,
4744
"spring.ai.ollama.base-url=" + getBaseUrl())
48-
.withConfiguration(
49-
AutoConfigurations.of(RestClientAutoConfiguration.class, OllamaEmbeddingAutoConfiguration.class));
45+
.withConfiguration(ollamaAutoConfig(OllamaEmbeddingAutoConfiguration.class));
5046

5147
@BeforeAll
5248
public static void beforeAll() throws IOException, InterruptedException {

auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/test/java/org/springframework/ai/model/ollama/autoconfigure/OllamaEmbeddingAutoConfigurationTests.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
import org.springframework.boot.autoconfigure.AutoConfigurations;
2323
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
2424
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
25-
2625
import static org.assertj.core.api.Assertions.assertThat;
26+
import static org.springframework.ai.model.ollama.autoconfigure.BaseOllamaIT.ollamaAutoConfig;
2727

2828
/**
2929
* @author Christian Tzolov
@@ -42,8 +42,7 @@ public void propertiesTest() {
4242
// @formatter:on
4343
)
4444

45-
.withConfiguration(AutoConfigurations.of(SpringAiRetryAutoConfiguration.class,
46-
RestClientAutoConfiguration.class, OllamaEmbeddingAutoConfiguration.class))
45+
.withConfiguration(ollamaAutoConfig(OllamaEmbeddingAutoConfiguration.class))
4746
.run(context -> {
4847
var embeddingProperties = context.getBean(OllamaEmbeddingProperties.class);
4948
var connectionProperties = context.getBean(OllamaConnectionProperties.class);

auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/test/java/org/springframework/ai/model/ollama/autoconfigure/OllamaModelConfigurationTests.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,9 @@
2020

2121
import org.springframework.ai.ollama.OllamaChatModel;
2222
import org.springframework.ai.ollama.OllamaEmbeddingModel;
23-
import org.springframework.boot.autoconfigure.AutoConfigurations;
2423
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
25-
2624
import static org.assertj.core.api.Assertions.assertThat;
25+
import static org.springframework.ai.model.ollama.autoconfigure.BaseOllamaIT.ollamaAutoConfig;
2726

2827
/**
2928
* Unit Tests for Ollama auto-configurations conditional enabling of models.
@@ -36,19 +35,19 @@ public class OllamaModelConfigurationTests {
3635

3736
@Test
3837
void chatModelActivation() {
39-
this.contextRunner.withConfiguration(AutoConfigurations.of(OllamaChatAutoConfiguration.class)).run(context -> {
38+
this.contextRunner.withConfiguration(ollamaAutoConfig(OllamaChatAutoConfiguration.class)).run(context -> {
4039
assertThat(context.getBeansOfType(OllamaChatProperties.class)).isNotEmpty();
4140
assertThat(context.getBeansOfType(OllamaChatModel.class)).isNotEmpty();
4241
});
4342

44-
this.contextRunner.withConfiguration(AutoConfigurations.of(OllamaChatAutoConfiguration.class))
43+
this.contextRunner.withConfiguration(ollamaAutoConfig(OllamaChatAutoConfiguration.class))
4544
.withPropertyValues("spring.ai.model.chat=none")
4645
.run(context -> {
4746
assertThat(context.getBeansOfType(OllamaChatProperties.class)).isEmpty();
4847
assertThat(context.getBeansOfType(OllamaChatModel.class)).isEmpty();
4948
});
5049

51-
this.contextRunner.withConfiguration(AutoConfigurations.of(OllamaChatAutoConfiguration.class))
50+
this.contextRunner.withConfiguration(ollamaAutoConfig(OllamaChatAutoConfiguration.class))
5251
.withPropertyValues("spring.ai.model.chat=ollama")
5352
.run(context -> {
5453
assertThat(context.getBeansOfType(OllamaChatProperties.class)).isNotEmpty();
@@ -60,20 +59,19 @@ void chatModelActivation() {
6059

6160
@Test
6261
void embeddingModelActivation() {
63-
this.contextRunner.withConfiguration(AutoConfigurations.of(OllamaEmbeddingAutoConfiguration.class))
64-
.run(context -> {
65-
assertThat(context.getBeansOfType(OllamaEmbeddingProperties.class)).isNotEmpty();
66-
assertThat(context.getBeansOfType(OllamaEmbeddingModel.class)).isNotEmpty();
67-
});
62+
this.contextRunner.withConfiguration(ollamaAutoConfig(OllamaEmbeddingAutoConfiguration.class)).run(context -> {
63+
assertThat(context.getBeansOfType(OllamaEmbeddingProperties.class)).isNotEmpty();
64+
assertThat(context.getBeansOfType(OllamaEmbeddingModel.class)).isNotEmpty();
65+
});
6866

69-
this.contextRunner.withConfiguration(AutoConfigurations.of(OllamaEmbeddingAutoConfiguration.class))
67+
this.contextRunner.withConfiguration(ollamaAutoConfig(OllamaEmbeddingAutoConfiguration.class))
7068
.withPropertyValues("spring.ai.model.embedding=none")
7169
.run(context -> {
7270
assertThat(context.getBeansOfType(OllamaEmbeddingProperties.class)).isEmpty();
7371
assertThat(context.getBeansOfType(OllamaEmbeddingModel.class)).isEmpty();
7472
});
7573

76-
this.contextRunner.withConfiguration(AutoConfigurations.of(OllamaEmbeddingAutoConfiguration.class))
74+
this.contextRunner.withConfiguration(ollamaAutoConfig(OllamaEmbeddingAutoConfiguration.class))
7775
.withPropertyValues("spring.ai.model.embedding=ollama")
7876
.run(context -> {
7977
assertThat(context.getBeansOfType(OllamaEmbeddingProperties.class)).isNotEmpty();

auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/test/java/org/springframework/ai/model/ollama/autoconfigure/tool/FunctionCallbackInPromptIT.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,7 @@
3636
import org.springframework.ai.ollama.api.OllamaChatOptions;
3737
import org.springframework.ai.ollama.api.OllamaModel;
3838
import org.springframework.ai.tool.function.FunctionToolCallback;
39-
import org.springframework.boot.autoconfigure.AutoConfigurations;
4039
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
41-
4240
import static org.assertj.core.api.Assertions.assertThat;
4341

4442
public class FunctionCallbackInPromptIT extends BaseOllamaIT {
@@ -54,7 +52,7 @@ public class FunctionCallbackInPromptIT extends BaseOllamaIT {
5452
"spring.ai.ollama.chat.options.temperature=0.5",
5553
"spring.ai.ollama.chat.options.topK=10")
5654
// @formatter:on
57-
.withConfiguration(AutoConfigurations.of(OllamaChatAutoConfiguration.class));
55+
.withConfiguration(ollamaAutoConfig(OllamaChatAutoConfiguration.class));
5856

5957
@BeforeAll
6058
public static void beforeAll() {

0 commit comments

Comments
 (0)