From c790d6c14732452d7c3d9dcbccd3ec68ac0ca4d5 Mon Sep 17 00:00:00 2001 From: lambochen Date: Thu, 29 May 2025 22:26:58 +0800 Subject: [PATCH] fix: OpenAiChatOptions support transfer webSearchOptions Unit test to veriy OpenAiChatOptions.fromOptions.webSearchOptions Fixes: 3377 Signed-off-by: lambochen (cherry picked from commit 4621c812cc3cad11f0508d0e56a1e7dd70f610c4) --- .../ai/openai/OpenAiChatOptions.java | 2 ++ .../ai/openai/OpenAiChatOptionsTests.java | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatOptions.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatOptions.java index a1a9fede7..afbbd803e 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatOptions.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatOptions.java @@ -49,6 +49,7 @@ import org.springframework.util.Assert; * @author Mariusz Bernacki * @author Thomas Vitale * @author Ilayaperumal Gopinathan + * @author lambochen * @since 0.8.0 */ @JsonInclude(Include.NON_NULL) @@ -266,6 +267,7 @@ public class OpenAiChatOptions implements ToolCallingChatOptions { .store(fromOptions.getStore()) .metadata(fromOptions.getMetadata()) .reasoningEffort(fromOptions.getReasoningEffort()) + .webSearchOptions(fromOptions.getWebSearchOptions()) .build(); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/OpenAiChatOptionsTests.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/OpenAiChatOptionsTests.java index d09808f1a..70b7f1fad 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/OpenAiChatOptionsTests.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/OpenAiChatOptionsTests.java @@ -30,6 +30,7 @@ import org.springframework.ai.openai.api.ResponseFormat; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.ai.openai.api.OpenAiApi.ChatCompletionRequest.AudioParameters.Voice.ALLOY; +import static org.springframework.ai.openai.api.OpenAiApi.ChatCompletionRequest.WebSearchOptions.SearchContextSize.MEDIUM; /** * Tests for {@link OpenAiChatOptions}. @@ -259,4 +260,24 @@ class OpenAiChatOptionsTests { assertThat(options.getStopSequences()).isNull(); } + @Test + void testFromOptions_webSearchOptions() { + var chatOptions = OpenAiChatOptions.builder() + .webSearchOptions(new OpenAiApi.ChatCompletionRequest.WebSearchOptions(MEDIUM, + new OpenAiApi.ChatCompletionRequest.WebSearchOptions.UserLocation("type", + new OpenAiApi.ChatCompletionRequest.WebSearchOptions.UserLocation.Approximate("beijing", + "china", "region", "UTC+8")))) + .build(); + var target = OpenAiChatOptions.fromOptions(chatOptions); + assertThat(target.getWebSearchOptions()).isNotNull(); + assertThat(target.getWebSearchOptions().searchContextSize()).isEqualTo(MEDIUM); + assertThat(target.getWebSearchOptions().userLocation()).isNotNull(); + assertThat(target.getWebSearchOptions().userLocation().type()).isEqualTo("type"); + assertThat(target.getWebSearchOptions().userLocation().approximate()).isNotNull(); + assertThat(target.getWebSearchOptions().userLocation().approximate().city()).isEqualTo("beijing"); + assertThat(target.getWebSearchOptions().userLocation().approximate().country()).isEqualTo("china"); + assertThat(target.getWebSearchOptions().userLocation().approximate().region()).isEqualTo("region"); + assertThat(target.getWebSearchOptions().userLocation().approximate().timezone()).isEqualTo("UTC+8"); + } + }