Skip to content

Commit aef3964

Browse files
committed
Fix ollama auto-configuration
- Related to #4494 Signed-off-by: Daniel Garnier-Moiroux <git@garnier.wf>
1 parent b8dfc09 commit aef3964

File tree

14 files changed

+46
-54
lines changed

14 files changed

+46
-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 & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,9 @@
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;
38-
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
39-
import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration;
4037
import org.springframework.boot.context.properties.EnableConfigurationProperties;
4138
import org.springframework.context.annotation.Bean;
4239
import org.springframework.retry.support.RetryTemplate;
@@ -51,13 +48,11 @@
5148
* @author Jonghoon Park
5249
* @since 0.8.0
5350
*/
54-
@AutoConfiguration(after = { RestClientAutoConfiguration.class, ToolCallingAutoConfiguration.class })
51+
@AutoConfiguration(after = { OllamaApiAutoConfiguration.class, ToolCallingAutoConfiguration.class })
5552
@ConditionalOnClass(OllamaChatModel.class)
5653
@ConditionalOnProperty(name = SpringAIModelProperties.CHAT_MODEL, havingValue = SpringAIModels.OLLAMA,
5754
matchIfMissing = true)
5855
@EnableConfigurationProperties({ OllamaChatProperties.class, OllamaInitializationProperties.class })
59-
@ImportAutoConfiguration(classes = { OllamaApiAutoConfiguration.class, RestClientAutoConfiguration.class,
60-
ToolCallingAutoConfiguration.class, WebClientAutoConfiguration.class })
6156
public class OllamaChatAutoConfiguration {
6257

6358
@Bean

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

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,9 @@
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;
34-
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
35-
import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration;
3633
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3734
import org.springframework.context.annotation.Bean;
3835

@@ -45,13 +42,11 @@
4542
* @author Ilayaperumal Gopinathan
4643
* @since 0.8.0
4744
*/
48-
@AutoConfiguration(after = RestClientAutoConfiguration.class)
45+
@AutoConfiguration(after = OllamaApiAutoConfiguration.class)
4946
@ConditionalOnClass(OllamaEmbeddingModel.class)
5047
@ConditionalOnProperty(name = SpringAIModelProperties.EMBEDDING_MODEL, havingValue = SpringAIModels.OLLAMA,
5148
matchIfMissing = true)
5249
@EnableConfigurationProperties({ OllamaEmbeddingProperties.class, OllamaInitializationProperties.class })
53-
@ImportAutoConfiguration(classes = { OllamaApiAutoConfiguration.class, RestClientAutoConfiguration.class,
54-
WebClientAutoConfiguration.class })
5550
public class OllamaEmbeddingAutoConfiguration {
5651

5752
@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: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import org.springframework.ai.ollama.api.OllamaApi;
3434
import org.springframework.ai.ollama.api.OllamaModel;
3535
import org.springframework.ai.ollama.management.OllamaModelManager;
36-
import org.springframework.boot.autoconfigure.AutoConfigurations;
3736
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3837

3938
import static org.assertj.core.api.Assertions.assertThat;
@@ -55,7 +54,7 @@ public class OllamaChatAutoConfigurationIT extends BaseOllamaIT {
5554
"spring.ai.ollama.chat.options.temperature=0.5",
5655
"spring.ai.ollama.chat.options.topK=10")
5756
// @formatter:on
58-
.withConfiguration(AutoConfigurations.of(OllamaChatAutoConfiguration.class));
57+
.withConfiguration(ollamaAutoConfig(OllamaChatAutoConfiguration.class));
5958

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

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@
1818

1919
import org.junit.jupiter.api.Test;
2020

21-
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
22-
import org.springframework.boot.autoconfigure.AutoConfigurations;
23-
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
2421
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2522

2623
import static org.assertj.core.api.Assertions.assertThat;
@@ -43,8 +40,7 @@ public void propertiesTest() {
4340
"spring.ai.ollama.chat.options.topK=123")
4441
// @formatter:on
4542

46-
.withConfiguration(AutoConfigurations.of(SpringAiRetryAutoConfiguration.class,
47-
RestClientAutoConfiguration.class, OllamaChatAutoConfiguration.class))
43+
.withConfiguration(BaseOllamaIT.ollamaAutoConfig(OllamaChatAutoConfiguration.class))
4844
.run(context -> {
4945
var chatProperties = context.getBean(OllamaChatProperties.class);
5046
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 & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@
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;
3331

3432
import static org.assertj.core.api.Assertions.assertThat;
@@ -45,8 +43,7 @@ public class OllamaEmbeddingAutoConfigurationIT extends BaseOllamaIT {
4543
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
4644
.withPropertyValues("spring.ai.ollama.embedding.options.model=" + MODEL_NAME,
4745
"spring.ai.ollama.base-url=" + getBaseUrl())
48-
.withConfiguration(
49-
AutoConfigurations.of(RestClientAutoConfiguration.class, OllamaEmbeddingAutoConfiguration.class));
46+
.withConfiguration(ollamaAutoConfig(OllamaEmbeddingAutoConfiguration.class));
5047

5148
@BeforeAll
5249
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: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@
1818

1919
import org.junit.jupiter.api.Test;
2020

21-
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
22-
import org.springframework.boot.autoconfigure.AutoConfigurations;
23-
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
2421
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2522

2623
import static org.assertj.core.api.Assertions.assertThat;
@@ -42,8 +39,7 @@ public void propertiesTest() {
4239
// @formatter:on
4340
)
4441

45-
.withConfiguration(AutoConfigurations.of(SpringAiRetryAutoConfiguration.class,
46-
RestClientAutoConfiguration.class, OllamaEmbeddingAutoConfiguration.class))
42+
.withConfiguration(BaseOllamaIT.ollamaAutoConfig(OllamaEmbeddingAutoConfiguration.class))
4743
.run(context -> {
4844
var embeddingProperties = context.getBean(OllamaEmbeddingProperties.class);
4945
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 & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
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;
2524

2625
import static org.assertj.core.api.Assertions.assertThat;
@@ -36,19 +35,20 @@ public class OllamaModelConfigurationTests {
3635

3736
@Test
3837
void chatModelActivation() {
39-
this.contextRunner.withConfiguration(AutoConfigurations.of(OllamaChatAutoConfiguration.class)).run(context -> {
40-
assertThat(context.getBeansOfType(OllamaChatProperties.class)).isNotEmpty();
41-
assertThat(context.getBeansOfType(OllamaChatModel.class)).isNotEmpty();
42-
});
38+
this.contextRunner.withConfiguration(BaseOllamaIT.ollamaAutoConfig(OllamaChatAutoConfiguration.class))
39+
.run(context -> {
40+
assertThat(context.getBeansOfType(OllamaChatProperties.class)).isNotEmpty();
41+
assertThat(context.getBeansOfType(OllamaChatModel.class)).isNotEmpty();
42+
});
4343

44-
this.contextRunner.withConfiguration(AutoConfigurations.of(OllamaChatAutoConfiguration.class))
44+
this.contextRunner.withConfiguration(BaseOllamaIT.ollamaAutoConfig(OllamaChatAutoConfiguration.class))
4545
.withPropertyValues("spring.ai.model.chat=none")
4646
.run(context -> {
4747
assertThat(context.getBeansOfType(OllamaChatProperties.class)).isEmpty();
4848
assertThat(context.getBeansOfType(OllamaChatModel.class)).isEmpty();
4949
});
5050

51-
this.contextRunner.withConfiguration(AutoConfigurations.of(OllamaChatAutoConfiguration.class))
51+
this.contextRunner.withConfiguration(BaseOllamaIT.ollamaAutoConfig(OllamaChatAutoConfiguration.class))
5252
.withPropertyValues("spring.ai.model.chat=ollama")
5353
.run(context -> {
5454
assertThat(context.getBeansOfType(OllamaChatProperties.class)).isNotEmpty();
@@ -60,20 +60,20 @@ void chatModelActivation() {
6060

6161
@Test
6262
void embeddingModelActivation() {
63-
this.contextRunner.withConfiguration(AutoConfigurations.of(OllamaEmbeddingAutoConfiguration.class))
63+
this.contextRunner.withConfiguration(BaseOllamaIT.ollamaAutoConfig(OllamaEmbeddingAutoConfiguration.class))
6464
.run(context -> {
6565
assertThat(context.getBeansOfType(OllamaEmbeddingProperties.class)).isNotEmpty();
6666
assertThat(context.getBeansOfType(OllamaEmbeddingModel.class)).isNotEmpty();
6767
});
6868

69-
this.contextRunner.withConfiguration(AutoConfigurations.of(OllamaEmbeddingAutoConfiguration.class))
69+
this.contextRunner.withConfiguration(BaseOllamaIT.ollamaAutoConfig(OllamaEmbeddingAutoConfiguration.class))
7070
.withPropertyValues("spring.ai.model.embedding=none")
7171
.run(context -> {
7272
assertThat(context.getBeansOfType(OllamaEmbeddingProperties.class)).isEmpty();
7373
assertThat(context.getBeansOfType(OllamaEmbeddingModel.class)).isEmpty();
7474
});
7575

76-
this.contextRunner.withConfiguration(AutoConfigurations.of(OllamaEmbeddingAutoConfiguration.class))
76+
this.contextRunner.withConfiguration(BaseOllamaIT.ollamaAutoConfig(OllamaEmbeddingAutoConfiguration.class))
7777
.withPropertyValues("spring.ai.model.embedding=ollama")
7878
.run(context -> {
7979
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 & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
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;
4140

4241
import static org.assertj.core.api.Assertions.assertThat;
@@ -54,7 +53,7 @@ public class FunctionCallbackInPromptIT extends BaseOllamaIT {
5453
"spring.ai.ollama.chat.options.temperature=0.5",
5554
"spring.ai.ollama.chat.options.topK=10")
5655
// @formatter:on
57-
.withConfiguration(AutoConfigurations.of(OllamaChatAutoConfiguration.class));
56+
.withConfiguration(ollamaAutoConfig(OllamaChatAutoConfiguration.class));
5857

5958
@BeforeAll
6059
public static void beforeAll() {

0 commit comments

Comments
 (0)