- 
                Notifications
    You must be signed in to change notification settings 
- Fork 2k
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
Tasks
-  add SpringAiTestAutoConfigurationsin spring-ai-test (Add testing utility class SpringAiTestAutoConfigurations #4662)
- refactor spring-ai-autoconfigure-model-zhipuai (Refactor models auto-configurations tests using SpringAiTestAutoConfigurations #4719)
- refactor spring-ai-autoconfigure-model-mistral-ai (Refactor models auto-configurations tests using SpringAiTestAutoConfigurations #4719)
- refactor spring-ai-autoconfigure-model-elevenlabs (Refactor models auto-configurations tests using SpringAiTestAutoConfigurations #4719)
- refactor spring-ai-autoconfigure-model-openai (Refactor models auto-configurations tests using SpringAiTestAutoConfigurations #4719)
- refactor spring-ai-autoconfigure-model-oci-genai (Refactor models auto-configurations tests using SpringAiTestAutoConfigurations #4719)
- refactor spring-ai-autoconfigure-model-google-genai (Refactor models auto-configurations tests using SpringAiTestAutoConfigurations #4719)
- refactor spring-ai-autoconfigure-model-minimax (Refactor models auto-configurations tests using SpringAiTestAutoConfigurations #4719)
- refactor spring-ai-autoconfigure-model-ollama (Refactor models auto-configurations tests using SpringAiTestAutoConfigurations #4719)
- refactor spring-ai-autoconfigure-model-azure-openai (Refactor models auto-configurations tests using SpringAiTestAutoConfigurations #4719)
- refactor spring-ai-autoconfigure-model-anthropic (Refactor models auto-configurations tests using SpringAiTestAutoConfigurations #4719)
- refactor spring-ai-autoconfigure-model-vertex-ai (Refactor models auto-configurations tests using SpringAiTestAutoConfigurations #4719)
- refactor spring-ai-autoconfigure-model-bedrock-ai (Refactor models auto-configurations tests using SpringAiTestAutoConfigurations #4719)
- refactor spring-ai-autoconfigure-model-deepseek (Refactor models auto-configurations tests using SpringAiTestAutoConfigurations #4719)
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.
centrumek