Skip to content

Commit e9b06ea

Browse files
committed
fix: omit temperature for search models and add tests
Signed-off-by: LeeJaeHyeok97 <[email protected]>
1 parent 3919204 commit e9b06ea

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

auto-configurations/models/spring-ai-autoconfigure-model-openai/src/main/java/org/springframework/ai/model/openai/autoconfigure/OpenAiChatAutoConfiguration.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.springframework.ai.model.tool.ToolExecutionEligibilityPredicate;
2828
import org.springframework.ai.model.tool.autoconfigure.ToolCallingAutoConfiguration;
2929
import org.springframework.ai.openai.OpenAiChatModel;
30+
import org.springframework.ai.openai.OpenAiChatOptions;
3031
import org.springframework.ai.openai.api.OpenAiApi;
3132
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
3233
import org.springframework.beans.factory.ObjectProvider;
@@ -72,7 +73,18 @@ public OpenAiChatModel openAiChatModel(OpenAiConnectionProperties commonProperti
7273
RetryTemplate retryTemplate, ResponseErrorHandler responseErrorHandler,
7374
ObjectProvider<ObservationRegistry> observationRegistry,
7475
ObjectProvider<ChatModelObservationConvention> observationConvention,
75-
ObjectProvider<ToolExecutionEligibilityPredicate> openAiToolExecutionEligibilityPredicate) {
76+
ObjectProvider<ToolExecutionEligibilityPredicate> openAiToolExecutionEligibilityPredicate,
77+
ObjectProvider<OpenAiChatOptions> userOptionsProvider) {
78+
79+
OpenAiChatOptions defaultOptions = chatProperties.getOptions();
80+
OpenAiChatOptions userOptions = userOptionsProvider.getIfAvailable();
81+
82+
if (defaultOptions.getModel().startsWith("text-search-")) {
83+
defaultOptions.setTemperature(null);
84+
}
85+
else if (userOptions != null && userOptions.getTemperature() != null) {
86+
defaultOptions.setTemperature(userOptions.getTemperature());
87+
}
7688

7789
var openAiApi = openAiApi(chatProperties, commonProperties,
7890
restClientBuilderProvider.getIfAvailable(RestClient::builder),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package org.springframework.ai.model.openai.autoconfigure;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.springframework.ai.chat.prompt.ChatOptions;
5+
import org.springframework.ai.openai.OpenAiChatModel;
6+
import org.springframework.ai.openai.OpenAiChatOptions;
7+
import org.springframework.boot.autoconfigure.AutoConfigurations;
8+
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
9+
import org.springframework.context.annotation.Bean;
10+
import org.springframework.context.annotation.Configuration;
11+
12+
import static org.assertj.core.api.Assertions.assertThat;
13+
14+
class OpenAiChatAutoConfigurationTest {
15+
16+
private final ApplicationContextRunner runner = new ApplicationContextRunner()
17+
.withConfiguration(AutoConfigurations.of(OpenAiChatAutoConfiguration.class))
18+
.withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY"),
19+
"spring.ai.openai.chat.options.temperature=0.8");
20+
21+
@Test
22+
void whenUserDefinesTemperature_thenOverride() {
23+
runner.withUserConfiguration(UserOptionsConfig.class)
24+
.run(context -> {
25+
assertThat(context).hasSingleBean(OpenAiChatModel.class);
26+
ChatOptions opts = context.getBean(OpenAiChatModel.class).getDefaultOptions();
27+
assertThat(opts.getTemperature()).isEqualTo(0.42);
28+
});
29+
}
30+
31+
@Test
32+
void whenNoUserOptions_thenDefaultTemperatureRetained() {
33+
runner.run(context -> {
34+
assertThat(context).hasSingleBean(OpenAiChatModel.class);
35+
ChatOptions opts = context.getBean(OpenAiChatModel.class).getDefaultOptions();
36+
assertThat(opts.getTemperature()).isEqualTo(0.8);
37+
});
38+
}
39+
40+
@Test
41+
void whenSearchModel_thenTemperatureOmitted() {
42+
runner.withPropertyValues("spring.ai.openai.chat.options.model=text-search-abc")
43+
.run(context -> {
44+
assertThat(context).hasSingleBean(OpenAiChatModel.class);
45+
ChatOptions opts = context.getBean(OpenAiChatModel.class).getDefaultOptions();
46+
assertThat(opts.getTemperature()).isNull();
47+
});
48+
}
49+
50+
@Configuration
51+
static class UserOptionsConfig {
52+
@Bean
53+
public OpenAiChatOptions userOptions() {
54+
OpenAiChatOptions openAiChatOptions = new OpenAiChatOptions();
55+
openAiChatOptions.setTemperature(0.42);
56+
return openAiChatOptions;
57+
}
58+
}
59+
}

0 commit comments

Comments
 (0)