Relates to this discussion https://github.com/spring-projects/spring-ai/pull/4548#issuecomment-3375834339
Context
After fixing @ImportAutoConfiguration issue in #4494, test auto-configurations are now duplicated for most models. There is some exceptions (VertexAI, Bedrock, ...). This issue aims to centralise test auto-configurations for spring-ai-autoconfigure-model-xxx modules
Current config
Ollama config: ```java public static AutoConfigurations ollamaAutoConfig(Class<?>... additionalAutoConfigurations) { Class<?>[] dependencies = new Class[] { OllamaApiAutoConfiguration.class, RestClientAutoConfiguration.class, SpringAiRetryAutoConfiguration.class, ToolCallingAutoConfiguration.class }; Class<?>[] allAutoConfigurations = new Class[dependencies.length + additionalAutoConfigurations.length]; System.arraycopy(dependencies, 0, allAutoConfigurations, 0, dependencies.length); System.arraycopy(additionalAutoConfigurations, 0, allAutoConfigurations, dependencies.length, additionalAutoConfigurations.length);
return AutoConfigurations.of(allAutoConfigurations);
}
Deepseek config:
```java
public static AutoConfigurations deepSeekAutoConfig(Class<?>... additional) {
Class<?>[] dependencies = { SpringAiRetryAutoConfiguration.class, ToolCallingAutoConfiguration.class,
RestClientAutoConfiguration.class, WebClientAutoConfiguration.class };
Class<?>[] all = Stream.concat(Arrays.stream(dependencies), Arrays.stream(additional)).toArray(Class<?>[]::new);
return AutoConfigurations.of(all);
}
Open AI config: ```java private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY")) .withConfiguration( AutoConfigurations.of(SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class, WebClientAutoConfiguration.class, ToolCallingAutoConfiguration.class));
---
**Refactoring idea**
Centralise test auto-configurations in one place (may be in spring-ai-test).
Something like this
```java
public class SpringAiTestAutoConfigurations {
// Use AnnotationUtils to find all used auto-configurations in AutoConfiguration.after
// then concatenate them with additionalConfigurations
public static AutoConfigurations of(Class<?>... additionalConfigurations) {
Class<?>[] configurations = Arrays.stream(additionalConfigurations)
.map(c -> AnnotationUtils.findAnnotation(c, AutoConfiguration.class))
.filter(Objects::nonNull)
.map(AutoConfiguration::after)
.flatMap(ac -> Stream.concat(Arrays.stream(ac), Arrays.stream(additionalConfigurations)))
.distinct()
.toArray(Class<?>[]::new);
return AutoConfigurations.of(configurations);
}
Then use it like this
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY"),
"spring.ai.openai.chat.options.model=gpt-4o")
.withConfiguration(SpringAiTestAutoConfigurations.of(OpenAiChatAutoConfiguration.class,
ChatClientAutoConfiguration.class));
Should be done after #4494 is closed.
@ilayaperumalg @Kehrlann I'll be happy to submit a PR if you approve the refactoring.
Comment From: ilayaperumalg
@ielatif Thanks for the proposal and it looks good!