Skip to content

Commit b26b2c6

Browse files
ielatifilayaperumalg
authored andcommitted
Fix MiniMax model auto-configuration
Signed-off-by: Issam El-atif <[email protected]>
1 parent 01082b8 commit b26b2c6

File tree

6 files changed

+69
-51
lines changed

6 files changed

+69
-51
lines changed

auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/main/java/org/springframework/ai/model/minimax/autoconfigure/MiniMaxChatAutoConfiguration.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
3131
import org.springframework.beans.factory.ObjectProvider;
3232
import org.springframework.boot.autoconfigure.AutoConfiguration;
33-
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
3433
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3534
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3635
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -48,15 +47,14 @@
4847
*
4948
* @author Geng Rong
5049
* @author Ilayaperumal Gopinathan
50+
* @author Issam El-atif
5151
*/
5252
@AutoConfiguration(after = { RestClientAutoConfiguration.class, SpringAiRetryAutoConfiguration.class,
5353
ToolCallingAutoConfiguration.class })
5454
@ConditionalOnClass(MiniMaxApi.class)
5555
@EnableConfigurationProperties({ MiniMaxConnectionProperties.class, MiniMaxChatProperties.class })
5656
@ConditionalOnProperty(name = SpringAIModelProperties.CHAT_MODEL, havingValue = SpringAIModels.MINIMAX,
5757
matchIfMissing = true)
58-
@ImportAutoConfiguration(classes = { SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class,
59-
ToolCallingAutoConfiguration.class })
6058
public class MiniMaxChatAutoConfiguration {
6159

6260
@Bean

auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/test/java/org/springframework/ai/model/minimax/autoconfigure/FunctionCallbackInPromptIT.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.springframework.ai.chat.prompt.Prompt;
3333
import org.springframework.ai.minimax.MiniMaxChatModel;
3434
import org.springframework.ai.minimax.MiniMaxChatOptions;
35+
import org.springframework.ai.model.tool.autoconfigure.ToolCallingAutoConfiguration;
3536
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
3637
import org.springframework.ai.tool.function.FunctionToolCallback;
3738
import org.springframework.boot.autoconfigure.AutoConfigurations;
@@ -42,6 +43,7 @@
4243

4344
/**
4445
* @author Geng Rong
46+
* @author Issam El-atif
4547
*/
4648
@EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".*")
4749
public class FunctionCallbackInPromptIT {
@@ -50,8 +52,9 @@ public class FunctionCallbackInPromptIT {
5052

5153
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
5254
.withPropertyValues("spring.ai.minimax.apiKey=" + System.getenv("MINIMAX_API_KEY"))
53-
.withConfiguration(AutoConfigurations.of(SpringAiRetryAutoConfiguration.class,
54-
RestClientAutoConfiguration.class, MiniMaxChatAutoConfiguration.class));
55+
.withConfiguration(
56+
AutoConfigurations.of(SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class,
57+
ToolCallingAutoConfiguration.class, MiniMaxChatAutoConfiguration.class));
5558

5659
@Test
5760
void functionCallTest() {

auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/test/java/org/springframework/ai/model/minimax/autoconfigure/FunctionCallbackWithPlainFunctionBeanIT.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.ai.minimax.MiniMaxChatModel;
3535
import org.springframework.ai.minimax.MiniMaxChatOptions;
3636
import org.springframework.ai.model.tool.ToolCallingChatOptions;
37+
import org.springframework.ai.model.tool.autoconfigure.ToolCallingAutoConfiguration;
3738
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
3839
import org.springframework.boot.autoconfigure.AutoConfigurations;
3940
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
@@ -46,6 +47,7 @@
4647

4748
/**
4849
* @author Geng Rong
50+
* @author Issam El-atif
4951
*/
5052
@EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".*")
5153
class FunctionCallbackWithPlainFunctionBeanIT {
@@ -54,8 +56,9 @@ class FunctionCallbackWithPlainFunctionBeanIT {
5456

5557
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
5658
.withPropertyValues("spring.ai.minimax.apiKey=" + System.getenv("MINIMAX_API_KEY"))
57-
.withConfiguration(AutoConfigurations.of(SpringAiRetryAutoConfiguration.class,
58-
RestClientAutoConfiguration.class, MiniMaxChatAutoConfiguration.class))
59+
.withConfiguration(
60+
AutoConfigurations.of(SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class,
61+
ToolCallingAutoConfiguration.class, MiniMaxChatAutoConfiguration.class))
5962
.withUserConfiguration(Config.class);
6063

6164
// FIXME: multiple function calls may stop prematurely due to model performance

auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/test/java/org/springframework/ai/model/minimax/autoconfigure/MiniMaxAutoConfigurationIT.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.springframework.ai.embedding.EmbeddingResponse;
3232
import org.springframework.ai.minimax.MiniMaxChatModel;
3333
import org.springframework.ai.minimax.MiniMaxEmbeddingModel;
34+
import org.springframework.ai.model.tool.autoconfigure.ToolCallingAutoConfiguration;
3435
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
3536
import org.springframework.boot.autoconfigure.AutoConfigurations;
3637
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
@@ -40,6 +41,7 @@
4041

4142
/**
4243
* @author Geng Rong
44+
* @author Issam El-atif
4345
*/
4446
@EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".*")
4547
public class MiniMaxAutoConfigurationIT {
@@ -51,9 +53,9 @@ public class MiniMaxAutoConfigurationIT {
5153

5254
@Test
5355
void generate() {
54-
this.contextRunner
55-
.withConfiguration(AutoConfigurations.of(SpringAiRetryAutoConfiguration.class,
56-
RestClientAutoConfiguration.class, MiniMaxChatAutoConfiguration.class))
56+
this.contextRunner.withConfiguration(
57+
AutoConfigurations.of(SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class,
58+
ToolCallingAutoConfiguration.class, MiniMaxChatAutoConfiguration.class))
5759
.run(context -> {
5860
MiniMaxChatModel chatModel = context.getBean(MiniMaxChatModel.class);
5961
String response = chatModel.call("Hello");
@@ -64,9 +66,9 @@ void generate() {
6466

6567
@Test
6668
void generateStreaming() {
67-
this.contextRunner
68-
.withConfiguration(AutoConfigurations.of(SpringAiRetryAutoConfiguration.class,
69-
RestClientAutoConfiguration.class, MiniMaxChatAutoConfiguration.class))
69+
this.contextRunner.withConfiguration(
70+
AutoConfigurations.of(SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class,
71+
ToolCallingAutoConfiguration.class, MiniMaxChatAutoConfiguration.class))
7072
.run(context -> {
7173
MiniMaxChatModel chatModel = context.getBean(MiniMaxChatModel.class);
7274
Flux<ChatResponse> responseFlux = chatModel.stream(new Prompt(new UserMessage("Hello")));
@@ -84,8 +86,9 @@ void generateStreaming() {
8486
@Test
8587
void embedding() {
8688
this.contextRunner
87-
.withConfiguration(AutoConfigurations.of(SpringAiRetryAutoConfiguration.class,
88-
RestClientAutoConfiguration.class, MiniMaxEmbeddingAutoConfiguration.class))
89+
.withConfiguration(
90+
AutoConfigurations.of(SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class,
91+
ToolCallingAutoConfiguration.class, MiniMaxEmbeddingAutoConfiguration.class))
8992
.run(context -> {
9093
MiniMaxEmbeddingModel embeddingModel = context.getBean(MiniMaxEmbeddingModel.class);
9194

auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/test/java/org/springframework/ai/model/minimax/autoconfigure/MiniMaxPropertiesTests.java

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.ai.minimax.MiniMaxEmbeddingModel;
2525
import org.springframework.ai.minimax.api.MiniMaxApi;
2626
import org.springframework.ai.model.ModelOptionsUtils;
27+
import org.springframework.ai.model.tool.autoconfigure.ToolCallingAutoConfiguration;
2728
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
2829
import org.springframework.boot.autoconfigure.AutoConfigurations;
2930
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
@@ -36,6 +37,7 @@
3637
* {@link MiniMaxEmbeddingProperties}.
3738
*
3839
* @author Geng Rong
40+
* @author Issam El-atif
3941
*/
4042
public class MiniMaxPropertiesTests {
4143

@@ -49,8 +51,9 @@ public void chatProperties() {
4951
"spring.ai.minimax.chat.options.model=MODEL_XYZ",
5052
"spring.ai.minimax.chat.options.temperature=0.55")
5153
// @formatter:on
52-
.withConfiguration(AutoConfigurations.of(SpringAiRetryAutoConfiguration.class,
53-
RestClientAutoConfiguration.class, MiniMaxChatAutoConfiguration.class))
54+
.withConfiguration(
55+
AutoConfigurations.of(SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class,
56+
ToolCallingAutoConfiguration.class, MiniMaxChatAutoConfiguration.class))
5457
.run(context -> {
5558
var chatProperties = context.getBean(MiniMaxChatProperties.class);
5659
var connectionProperties = context.getBean(MiniMaxConnectionProperties.class);
@@ -78,8 +81,9 @@ public void chatOverrideConnectionProperties() {
7881
"spring.ai.minimax.chat.options.model=MODEL_XYZ",
7982
"spring.ai.minimax.chat.options.temperature=0.55")
8083
// @formatter:on
81-
.withConfiguration(AutoConfigurations.of(SpringAiRetryAutoConfiguration.class,
82-
RestClientAutoConfiguration.class, MiniMaxChatAutoConfiguration.class))
84+
.withConfiguration(
85+
AutoConfigurations.of(SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class,
86+
ToolCallingAutoConfiguration.class, MiniMaxChatAutoConfiguration.class))
8387
.run(context -> {
8488
var chatProperties = context.getBean(MiniMaxChatProperties.class);
8589
var connectionProperties = context.getBean(MiniMaxConnectionProperties.class);
@@ -198,8 +202,9 @@ public void chatOptionsTest() {
198202
"""
199203
)
200204
// @formatter:on
201-
.withConfiguration(AutoConfigurations.of(SpringAiRetryAutoConfiguration.class,
202-
RestClientAutoConfiguration.class, MiniMaxChatAutoConfiguration.class))
205+
.withConfiguration(
206+
AutoConfigurations.of(SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class,
207+
ToolCallingAutoConfiguration.class, MiniMaxChatAutoConfiguration.class))
203208
.run(context -> {
204209
var chatProperties = context.getBean(MiniMaxChatProperties.class);
205210
var connectionProperties = context.getBean(MiniMaxConnectionProperties.class);
@@ -295,17 +300,19 @@ void chatActivation() {
295300
new ApplicationContextRunner()
296301
.withPropertyValues("spring.ai.minimax.api-key=API_KEY", "spring.ai.minimax.base-url=TEST_BASE_URL",
297302
"spring.ai.model.chat=none")
298-
.withConfiguration(AutoConfigurations.of(SpringAiRetryAutoConfiguration.class,
299-
RestClientAutoConfiguration.class, MiniMaxChatAutoConfiguration.class))
303+
.withConfiguration(
304+
AutoConfigurations.of(SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class,
305+
ToolCallingAutoConfiguration.class, MiniMaxChatAutoConfiguration.class))
300306
.run(context -> {
301307
assertThat(context.getBeansOfType(MiniMaxChatProperties.class)).isEmpty();
302308
assertThat(context.getBeansOfType(MiniMaxChatModel.class)).isEmpty();
303309
});
304310

305311
new ApplicationContextRunner()
306312
.withPropertyValues("spring.ai.minimax.api-key=API_KEY", "spring.ai.minimax.base-url=TEST_BASE_URL")
307-
.withConfiguration(AutoConfigurations.of(SpringAiRetryAutoConfiguration.class,
308-
RestClientAutoConfiguration.class, MiniMaxChatAutoConfiguration.class))
313+
.withConfiguration(
314+
AutoConfigurations.of(SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class,
315+
ToolCallingAutoConfiguration.class, MiniMaxChatAutoConfiguration.class))
309316
.run(context -> {
310317
assertThat(context.getBeansOfType(MiniMaxChatProperties.class)).isNotEmpty();
311318
assertThat(context.getBeansOfType(MiniMaxChatModel.class)).isNotEmpty();
@@ -314,8 +321,9 @@ void chatActivation() {
314321
new ApplicationContextRunner()
315322
.withPropertyValues("spring.ai.minimax.api-key=API_KEY", "spring.ai.minimax.base-url=TEST_BASE_URL",
316323
"spring.ai.model.chat=minimax")
317-
.withConfiguration(AutoConfigurations.of(SpringAiRetryAutoConfiguration.class,
318-
RestClientAutoConfiguration.class, MiniMaxChatAutoConfiguration.class))
324+
.withConfiguration(
325+
AutoConfigurations.of(SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class,
326+
ToolCallingAutoConfiguration.class, MiniMaxChatAutoConfiguration.class))
319327
.run(context -> {
320328
assertThat(context.getBeansOfType(MiniMaxChatProperties.class)).isNotEmpty();
321329
assertThat(context.getBeansOfType(MiniMaxChatModel.class)).isNotEmpty();

auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/test/java/org/springframework/ai/model/minimax/autoconfigure/MinimaxModelConfigurationTests.java

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020

2121
import org.springframework.ai.minimax.MiniMaxChatModel;
2222
import org.springframework.ai.minimax.MiniMaxEmbeddingModel;
23+
import org.springframework.ai.model.tool.autoconfigure.ToolCallingAutoConfiguration;
2324
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
2425
import org.springframework.boot.autoconfigure.AutoConfigurations;
26+
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
2527
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2628

2729
import static org.assertj.core.api.Assertions.assertThat;
@@ -30,29 +32,35 @@
3032
* Unit Tests for MiniMax auto-configurations' conditional enabling of models.
3133
*
3234
* @author Ilayaperumal Gopinathan
35+
* @author Issam El-atif
3336
*/
3437
public class MinimaxModelConfigurationTests {
3538

36-
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
37-
.withConfiguration(AutoConfigurations.of(SpringAiRetryAutoConfiguration.class))
39+
private final ApplicationContextRunner chatContextRunner = new ApplicationContextRunner()
40+
.withConfiguration(
41+
AutoConfigurations.of(SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class,
42+
ToolCallingAutoConfiguration.class, MiniMaxChatAutoConfiguration.class))
43+
.withPropertyValues("spring.ai.minimax.api-key=API_KEY", "spring.ai.minimax.base-url=TEST_BASE_URL");
44+
45+
private final ApplicationContextRunner embeddingContextRunner = new ApplicationContextRunner()
46+
.withConfiguration(AutoConfigurations.of(SpringAiRetryAutoConfiguration.class,
47+
RestClientAutoConfiguration.class, MiniMaxEmbeddingAutoConfiguration.class))
3848
.withPropertyValues("spring.ai.minimax.api-key=API_KEY", "spring.ai.minimax.base-url=TEST_BASE_URL");
3949

4050
@Test
4151
void chatModelActivation() {
42-
this.contextRunner.withConfiguration(AutoConfigurations.of(MiniMaxChatAutoConfiguration.class)).run(context -> {
52+
this.chatContextRunner.run(context -> {
4353
assertThat(context.getBeansOfType(MiniMaxChatProperties.class)).isNotEmpty();
4454
assertThat(context.getBeansOfType(MiniMaxChatModel.class)).isNotEmpty();
4555
});
4656

47-
this.contextRunner.withConfiguration(AutoConfigurations.of(MiniMaxChatAutoConfiguration.class))
48-
.withPropertyValues("spring.ai.model.chat=none", "spring.ai.model.embedding=none")
57+
this.chatContextRunner.withPropertyValues("spring.ai.model.chat=none", "spring.ai.model.embedding=none")
4958
.run(context -> {
5059
assertThat(context.getBeansOfType(MiniMaxChatProperties.class)).isEmpty();
5160
assertThat(context.getBeansOfType(MiniMaxChatModel.class)).isEmpty();
5261
});
5362

54-
this.contextRunner.withConfiguration(AutoConfigurations.of(MiniMaxChatAutoConfiguration.class))
55-
.withPropertyValues("spring.ai.model.chat=minimax", "spring.ai.model.embedding=none")
63+
this.chatContextRunner.withPropertyValues("spring.ai.model.chat=minimax", "spring.ai.model.embedding=none")
5664
.run(context -> {
5765
assertThat(context.getBeansOfType(MiniMaxChatProperties.class)).isNotEmpty();
5866
assertThat(context.getBeansOfType(MiniMaxChatModel.class)).isNotEmpty();
@@ -61,25 +69,20 @@ void chatModelActivation() {
6169

6270
@Test
6371
void embeddingModelActivation() {
64-
this.contextRunner.withConfiguration(AutoConfigurations.of(MiniMaxEmbeddingAutoConfiguration.class))
65-
.run(context -> {
66-
assertThat(context.getBeansOfType(MiniMaxEmbeddingModel.class)).isNotEmpty();
67-
assertThat(context.getBeansOfType(MiniMaxEmbeddingProperties.class)).isNotEmpty();
68-
});
72+
this.embeddingContextRunner.run(context -> {
73+
assertThat(context.getBeansOfType(MiniMaxEmbeddingModel.class)).isNotEmpty();
74+
assertThat(context.getBeansOfType(MiniMaxEmbeddingProperties.class)).isNotEmpty();
75+
});
6976

70-
this.contextRunner.withConfiguration(AutoConfigurations.of(MiniMaxEmbeddingAutoConfiguration.class))
71-
.withPropertyValues("spring.ai.model.embedding=none")
72-
.run(context -> {
73-
assertThat(context.getBeansOfType(MiniMaxEmbeddingProperties.class)).isEmpty();
74-
assertThat(context.getBeansOfType(MiniMaxEmbeddingModel.class)).isEmpty();
75-
});
77+
this.embeddingContextRunner.withPropertyValues("spring.ai.model.embedding=none").run(context -> {
78+
assertThat(context.getBeansOfType(MiniMaxEmbeddingProperties.class)).isEmpty();
79+
assertThat(context.getBeansOfType(MiniMaxEmbeddingModel.class)).isEmpty();
80+
});
7681

77-
this.contextRunner.withConfiguration(AutoConfigurations.of(MiniMaxEmbeddingAutoConfiguration.class))
78-
.withPropertyValues("spring.ai.model.embedding=minimax")
79-
.run(context -> {
80-
assertThat(context.getBeansOfType(MiniMaxEmbeddingProperties.class)).isNotEmpty();
81-
assertThat(context.getBeansOfType(MiniMaxEmbeddingModel.class)).isNotEmpty();
82-
});
82+
this.embeddingContextRunner.withPropertyValues("spring.ai.model.embedding=minimax").run(context -> {
83+
assertThat(context.getBeansOfType(MiniMaxEmbeddingProperties.class)).isNotEmpty();
84+
assertThat(context.getBeansOfType(MiniMaxEmbeddingModel.class)).isNotEmpty();
85+
});
8386
}
8487

8588
}

0 commit comments

Comments
 (0)