Bug description
The Assert.notNull
checks in AzureOpenAiChatOptions.Builder.with*
methods make the options actually mandatory. AzureOpenAiChatOptions.fromOptions
is called from AzureOpenAiChatModel.getDefaultOptions
. When the AzureOpenAiChatModel.defaultOption
attribute doesn't have all the checked fields set (e.g. seed, enhancements), there will be an exception when AzureOpenAiChatModel.getDefaultOptions
. This will cause, for example, ChatClient.create
to fail. This happens even when the AzureOpenAiChatModel( OpenAIClient microsoftOpenAiClient)
constructor is used.
New options introduced by the fix of https://github.com/spring-projects/spring-ai/issues/889 are the one causing this.
Environment 1.0.0-SNAPSHOT
Steps to reproduce
call ChatClient.create(new AzureOpenAiChatModel(microsoftOpenAiClient))
and it will throw an exception:
Caused by: java.lang.IllegalArgumentException: responseFormat must not be null
at org.springframework.util.Assert.notNull(Assert.java:172) ~[spring-core-6.1.13.jar:6.1.13]
at org.springframework.ai.azure.openai.AzureOpenAiChatOptions$Builder.withSeed(AzureOpenAiChatOptions.java:297) ~[spring-ai-azure-openai-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT]
at org.springframework.ai.azure.openai.AzureOpenAiChatOptions.fromOptions(AzureOpenAiChatOptions.java:525) ~[spring-ai-azure-openai-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT]
at org.springframework.ai.azure.openai.AzureOpenAiChatModel.getDefaultOptions(AzureOpenAiChatModel.java:143) ~[spring-ai-azure-openai-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT]
at org.springframework.ai.azure.openai.AzureOpenAiChatModel.getDefaultOptions(AzureOpenAiChatModel.java:100) ~[spring-ai-azure-openai-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT]
at org.springframework.ai.chat.client.DefaultChatClient$DefaultChatClientRequestSpec.<init>(DefaultChatClient.java:722) ~[spring-ai-core-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT]
at org.springframework.ai.chat.client.DefaultChatClientBuilder.<init>(DefaultChatClientBuilder.java:62) ~[spring-ai-core-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT]
at org.springframework.ai.chat.client.ChatClient.builder(ChatClient.java:72) ~[spring-ai-core-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT]
at org.springframework.ai.chat.client.ChatClient.create(ChatClient.java:63) ~[spring-ai-core-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT]
at org.springframework.ai.chat.client.ChatClient.create(ChatClient.java:58) ~[spring-ai-core-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT]
at org.springframework.ai.chat.client.ChatClient.create(ChatClient.java:54) ~[spring-ai-core-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT]
Expected behavior
No null checks should be enforced for non mandatory options.
Since we would anyhow ignore null options with @JsonInclude(Include.NON_NULL)
on AzureOpenAiChatOptions
, there is no added value for having those checks on .with* methods.
Minimal Complete Reproducible example
@Test
void fromOptionsCheckWithNullValuesExpectSuccess() {
var sourceOptions = AzureOpenAiChatOptions.builder().withMaxTokens(100).withPresencePenalty(0.5).build();
var targetOptions = AzureOpenAiChatOptions.fromOptions(sourceOptions);
assertThat(targetOptions.getMaxTokens()).isEqualTo(100);
assertThat(targetOptions.getPresencePenalty()).isEqualTo(0.5);
assertThat(targetOptions.getFrequencyPenalty()).isNull();
assertThat(targetOptions.getResponseFormat()).isNull();
assertThat(targetOptions.getSeed()).isNull();
}
Comment From: pradu3
PR proposed with fixes: https://github.com/spring-projects/spring-ai/pull/1418
Comment From: pradu3
obsolete, replaced by reopening of https://github.com/spring-projects/spring-ai/issues/889