Skip to content

Centralise test auto-configurations for spring-ai-autoconfigure-model-xxx modules #4592

@ielatif

Description

@ielatif

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions