-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Open
Labels
Description
Relates to this discussion #4548 (comment)
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:
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:
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:
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
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.