Skip to content

Commit bee3243

Browse files
committed
feat: allow stream usage to be set for azure openai requests
1 parent 6cfe5e7 commit bee3243

File tree

3 files changed

+39
-28
lines changed

3 files changed

+39
-28
lines changed

models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiChatModel.java

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -29,29 +29,8 @@
2929
import com.azure.ai.openai.OpenAIAsyncClient;
3030
import com.azure.ai.openai.OpenAIClient;
3131
import com.azure.ai.openai.OpenAIClientBuilder;
32-
import com.azure.ai.openai.models.ChatChoice;
33-
import com.azure.ai.openai.models.ChatCompletions;
34-
import com.azure.ai.openai.models.ChatCompletionsFunctionToolCall;
35-
import com.azure.ai.openai.models.ChatCompletionsFunctionToolDefinition;
36-
import com.azure.ai.openai.models.ChatCompletionsFunctionToolDefinitionFunction;
37-
import com.azure.ai.openai.models.ChatCompletionsJsonResponseFormat;
38-
import com.azure.ai.openai.models.ChatCompletionsOptions;
39-
import com.azure.ai.openai.models.ChatCompletionsResponseFormat;
40-
import com.azure.ai.openai.models.ChatCompletionsTextResponseFormat;
41-
import com.azure.ai.openai.models.ChatCompletionsToolCall;
42-
import com.azure.ai.openai.models.ChatCompletionsToolDefinition;
43-
import com.azure.ai.openai.models.ChatMessageContentItem;
44-
import com.azure.ai.openai.models.ChatMessageImageContentItem;
45-
import com.azure.ai.openai.models.ChatMessageImageUrl;
46-
import com.azure.ai.openai.models.ChatMessageTextContentItem;
47-
import com.azure.ai.openai.models.ChatRequestAssistantMessage;
48-
import com.azure.ai.openai.models.ChatRequestMessage;
49-
import com.azure.ai.openai.models.ChatRequestSystemMessage;
50-
import com.azure.ai.openai.models.ChatRequestToolMessage;
51-
import com.azure.ai.openai.models.ChatRequestUserMessage;
52-
import com.azure.ai.openai.models.CompletionsFinishReason;
53-
import com.azure.ai.openai.models.ContentFilterResultsForPrompt;
54-
import com.azure.ai.openai.models.FunctionCall;
32+
import com.azure.ai.openai.implementation.accesshelpers.ChatCompletionsOptionsAccessHelper;
33+
import com.azure.ai.openai.models.*;
5534
import com.azure.core.util.BinaryData;
5635
import io.micrometer.observation.Observation;
5736
import io.micrometer.observation.ObservationRegistry;
@@ -206,7 +185,7 @@ public ChatResponse call(Prompt prompt) {
206185
this.observationRegistry)
207186
.observe(() -> {
208187
ChatCompletionsOptions options = toAzureChatCompletionsOptions(prompt);
209-
options.setStream(false);
188+
ChatCompletionsOptionsAccessHelper.setStream(options, false);
210189

211190
ChatCompletions chatCompletions = this.openAIClient.getChatCompletions(options.getModel(), options);
212191
ChatResponse chatResponse = toChatResponse(chatCompletions);
@@ -230,7 +209,7 @@ public Flux<ChatResponse> stream(Prompt prompt) {
230209

231210
return Flux.deferContextual(contextView -> {
232211
ChatCompletionsOptions options = toAzureChatCompletionsOptions(prompt);
233-
options.setStream(true);
212+
ChatCompletionsOptionsAccessHelper.setStream(options, true);
234213

235214
Flux<ChatCompletions> chatCompletionsStream = this.openAIAsyncClient
236215
.getChatCompletionsStream(options.getModel(), options);
@@ -493,7 +472,16 @@ private ChatCompletionsOptions merge(ChatCompletionsOptions fromAzureOptions,
493472
}
494473

495474
ChatCompletionsOptions mergedAzureOptions = new ChatCompletionsOptions(fromAzureOptions.getMessages());
496-
mergedAzureOptions.setStream(fromAzureOptions.isStream());
475+
476+
ChatCompletionsOptionsAccessHelper.setStream(mergedAzureOptions,
477+
fromAzureOptions.isStream() != null ? fromAzureOptions.isStream() : false);
478+
479+
ChatCompletionsOptionsAccessHelper.setStream(mergedAzureOptions,
480+
fromAzureOptions.isStream() != null ? fromAzureOptions.isStream() : false);
481+
482+
ChatCompletionsOptionsAccessHelper.setStreamOptions(mergedAzureOptions,
483+
fromAzureOptions.getStreamOptions() != null ? fromAzureOptions.getStreamOptions()
484+
: toSpringAiOptions.getStreamOptions());
497485

498486
mergedAzureOptions.setMaxTokens((fromAzureOptions.getMaxTokens() != null) ? fromAzureOptions.getMaxTokens()
499487
: toSpringAiOptions.getMaxTokens());
@@ -640,8 +628,13 @@ private ChatCompletionsOptions merge(AzureOpenAiChatOptions fromSpringAiOptions,
640628
private ChatCompletionsOptions copy(ChatCompletionsOptions fromOptions) {
641629

642630
ChatCompletionsOptions copyOptions = new ChatCompletionsOptions(fromOptions.getMessages());
643-
copyOptions.setStream(fromOptions.isStream());
644631

632+
if (fromOptions.isStream() != null) {
633+
ChatCompletionsOptionsAccessHelper.setStream(copyOptions, fromOptions.isStream());
634+
}
635+
if (fromOptions.getStreamOptions() != null) {
636+
ChatCompletionsOptionsAccessHelper.setStreamOptions(copyOptions, fromOptions.getStreamOptions());
637+
}
645638
if (fromOptions.getMaxTokens() != null) {
646639
copyOptions.setMaxTokens(fromOptions.getMaxTokens());
647640
}

models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiChatOptions.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.Set;
2424

2525
import com.azure.ai.openai.models.AzureChatEnhancementConfiguration;
26+
import com.azure.ai.openai.models.ChatCompletionStreamOptions;
2627
import com.fasterxml.jackson.annotation.JsonIgnore;
2728
import com.fasterxml.jackson.annotation.JsonInclude;
2829
import com.fasterxml.jackson.annotation.JsonInclude.Include;
@@ -193,6 +194,9 @@ public class AzureOpenAiChatOptions implements FunctionCallingOptions {
193194
@JsonIgnore
194195
private AzureChatEnhancementConfiguration enhancements;
195196

197+
@JsonProperty("stream_options")
198+
private ChatCompletionStreamOptions streamOptions;
199+
196200
@JsonIgnore
197201
private Map<String, Object> toolContext;
198202

@@ -219,6 +223,7 @@ public static AzureOpenAiChatOptions fromOptions(AzureOpenAiChatOptions fromOpti
219223
.withTopLogprobs(fromOptions.getTopLogProbs())
220224
.withEnhancements(fromOptions.getEnhancements())
221225
.withToolContext(fromOptions.getToolContext())
226+
.withStreamOptions(fromOptions.getStreamOptions())
222227
.build();
223228
}
224229

@@ -412,6 +417,14 @@ public void setToolContext(Map<String, Object> toolContext) {
412417
this.toolContext = toolContext;
413418
}
414419

420+
public ChatCompletionStreamOptions getStreamOptions() {
421+
return this.streamOptions;
422+
}
423+
424+
public void setStreamOptions(ChatCompletionStreamOptions streamOptions) {
425+
this.streamOptions = streamOptions;
426+
}
427+
415428
@Override
416429
public AzureOpenAiChatOptions copy() {
417430
return fromOptions(this);
@@ -536,6 +549,11 @@ public Builder withToolContext(Map<String, Object> toolContext) {
536549
return this;
537550
}
538551

552+
public Builder withStreamOptions(ChatCompletionStreamOptions streamOptions) {
553+
this.options.streamOptions = streamOptions;
554+
return this;
555+
}
556+
539557
public AzureOpenAiChatOptions build() {
540558
return this.options;
541559
}

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@
174174
<!-- production dependencies -->
175175
<spring-boot.version>3.3.6</spring-boot.version>
176176
<ST4.version>4.3.4</ST4.version>
177-
<azure-open-ai-client.version>1.0.0-beta.12</azure-open-ai-client.version>
177+
<azure-open-ai-client.version>1.0.0-beta.13</azure-open-ai-client.version>
178178
<jtokkit.version>1.1.0</jtokkit.version>
179179
<victools.version>4.31.1</victools.version>
180180

0 commit comments

Comments
 (0)