Skip to content

Commit 2be102c

Browse files
authored
Merge pull request #747 from teramawi/issue-746
Issue 746 - use temperature and topP 1,0 for azure openai reasoning models
2 parents ac6b4dd + 8711bd0 commit 2be102c

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

src/main/java/com/devoxx/genie/chatmodel/cloud/azureopenai/AzureOpenAIChatModelFactory.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,46 @@
1818

1919
public class AzureOpenAIChatModelFactory implements ChatModelFactory {
2020

21-
private final ModelProvider MODEL_PROVIDER = ModelProvider.AzureOpenAI;;
21+
private final ModelProvider MODEL_PROVIDER = ModelProvider.AzureOpenAI;
2222

2323
@Override
2424
public ChatLanguageModel createChatModel(@NotNull ChatModel chatModel) {
25-
boolean isO1 = chatModel.getModelName().startsWith("o1-");
25+
String modelName = chatModel.getModelName();
26+
27+
boolean isReasoningModel = isReasoningModelWithLimitedParameters(modelName);
2628

2729
final var builder = AzureOpenAiChatModel.builder()
2830
.apiKey(getApiKey(MODEL_PROVIDER))
2931
.deploymentName(DevoxxGenieStateService.getInstance().getAzureOpenAIDeployment())
3032
.maxRetries(chatModel.getMaxRetries())
33+
.temperature(isReasoningModel ? 1.0 : chatModel.getTemperature())
3134
.timeout(Duration.ofSeconds(chatModel.getTimeout()))
32-
.topP(isO1 ? 1.0 : chatModel.getTopP())
35+
.topP(isReasoningModel ? 1.0 : chatModel.getTopP())
3336
.endpoint(DevoxxGenieStateService.getInstance().getAzureOpenAIEndpoint())
3437
.listeners(getListener());
3538

3639
return builder.build();
3740
}
3841

42+
/**
43+
* Returns whether the model is a reasoning model with limited parameter support, in order to provide default
44+
* values instead of given configuration.
45+
* <p>
46+
* @see <a href="https://learn.microsoft.com/en-us/azure/ai-foundry/openai/how-to/reasoning?tabs=python-secure%2Cpy#not-supported">Azure OpenAI reasoning models - parameters not supported</a>
47+
* for details on parameter support for reasoning models.
48+
*
49+
* @param modelName name of the model to check
50+
* @return true if the model name indicates a reasoning model
51+
*/
52+
static boolean isReasoningModelWithLimitedParameters(String modelName) {
53+
boolean isO1 = modelName.startsWith("o1");
54+
boolean isO3 = modelName.startsWith("o3");
55+
boolean isO4 = modelName.startsWith("o4-mini");
56+
boolean isCodex = modelName.equalsIgnoreCase("codex-mini");
57+
58+
return isO1 || isO3 || isO4 || isCodex;
59+
}
60+
3961
@Override
4062
public StreamingChatLanguageModel createStreamingChatModel(@NotNull ChatModel chatModel) {
4163
boolean isO1 = chatModel.getModelName().startsWith("o1-");

src/test/java/com/devoxx/genie/chatmodel/cloud/azureopenai/AzureOpenAiChatModelFactoryTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.devoxx.genie.ui.settings.DevoxxGenieStateService;
77
import com.intellij.openapi.application.ApplicationManager;
88
import com.intellij.testFramework.ServiceContainerUtil;
9+
import dev.langchain4j.model.azure.AzureOpenAiChatModel;
910
import dev.langchain4j.model.chat.ChatLanguageModel;
1011
import org.junit.jupiter.api.BeforeEach;
1112
import org.junit.jupiter.api.Test;
@@ -38,12 +39,13 @@ void createChatModel() {
3839
AzureOpenAIChatModelFactory factory = new AzureOpenAIChatModelFactory();
3940
ChatModel chatModel = new ChatModel();
4041
chatModel.setModelName("gpt-3.5-turbo");
41-
chatModel.setTemperature(0.7);
42+
chatModel.setTemperature(0.6);
4243
chatModel.setMaxTokens(100);
4344

4445
ChatLanguageModel result = factory.createChatModel(chatModel);
4546

46-
assertThat(result).isNotNull();
47+
// cannot verify more because model does not offer more access to data inside
48+
assertThat(result).isInstanceOf(AzureOpenAiChatModel.class);
4749
}
4850

4951
@Test

0 commit comments

Comments
 (0)