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"); + } + }