From b779f30702931508fd84724fa894571fa8602246 Mon Sep 17 00:00:00 2001 From: walterbvv Date: Thu, 27 Mar 2025 19:37:02 -0600 Subject: [PATCH 01/12] Add Azure Responses Content Image sample with image url and image base64 --- .../AzureResponsesContentImageSample.java | 65 +++++++++++++++++++ .../AzureResponsesContentImageUrlSample.java | 49 ++++++++++++++ .../openai/responses/AzureResponsesTest.java | 45 +++++++++++++ .../responses/AzureResponsesTestBase.java | 29 ++++++++- 4 files changed, 185 insertions(+), 3 deletions(-) create mode 100644 sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageSample.java create mode 100644 sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageUrlSample.java diff --git a/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageSample.java b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageSample.java new file mode 100644 index 000000000000..ab82cef8a851 --- /dev/null +++ b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageSample.java @@ -0,0 +1,65 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.openai.responses; + +import com.azure.ai.openai.responses.models.*; +import com.azure.core.credential.AzureKeyCredential; +import com.azure.core.http.policy.HttpLogDetailLevel; +import com.azure.core.http.policy.HttpLogOptions; +import com.azure.core.util.Configuration; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.Base64; + +import static java.lang.System.exit; + +/** + * This sample demonstrates how to use the Responses Input Content Image to generate text using the Azure OpenAI service. + */ +public class AzureResponsesContentImageSample { + + /** + * Main method to run the sample. + * @param args Command line arguments (not used). + */ + public static void main(String[] args) { + // Create a client + ResponsesClient client = new ResponsesClientBuilder() + .endpoint(Configuration.getGlobalConfiguration().get("AZURE_OPENAI_ENDPOINT")) + .credential(new AzureKeyCredential(Configuration.getGlobalConfiguration().get("AZURE_OPENAI_KEY"))) + .serviceVersion(AzureResponsesServiceVersion.V2024_12_01_PREVIEW) + .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS)) + .buildClient(); + + String base64Image = null; + try { + String fileName = "ms_logo.png"; + byte[] imageBytes = Files.readAllBytes(Paths.get("src/samples/java/com/azure/ai/openai/resources/" + fileName)); + base64Image= Base64.getEncoder().encodeToString(imageBytes); + } catch (IOException e) { + System.out.println("Exception: " + e); + exit(-1); + } + + // Create a request + CreateResponsesRequest request = new CreateResponsesRequest(CreateResponsesRequestModel.GPT_4O_MINI, + Arrays.asList( + new ResponsesSystemMessage(Arrays.asList(new ResponsesInputContentText("You are a helpful assistant that describes images"))), + new ResponsesUserMessage(Arrays.asList( + new ResponsesInputContentText("Please describe this image"), + new ResponsesInputContentImage().setImageUrl("data:image/jpeg;base64," + base64Image))))); + + // Send the request and get the response + ResponsesResponse response = client.createResponse(request); + ResponsesAssistantMessage responseMessage = (ResponsesAssistantMessage) response.getOutput().get(0); + ResponsesOutputContentText outputContent = (ResponsesOutputContentText) responseMessage.getContent().get(0); + + // Print the response + System.out.println("Response: " + response); + System.out.println("Output: " + outputContent.getText()); + } +} diff --git a/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageUrlSample.java b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageUrlSample.java new file mode 100644 index 000000000000..c084b4deb790 --- /dev/null +++ b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageUrlSample.java @@ -0,0 +1,49 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.openai.responses; + +import com.azure.ai.openai.responses.models.*; +import com.azure.core.credential.AzureKeyCredential; +import com.azure.core.http.policy.HttpLogDetailLevel; +import com.azure.core.http.policy.HttpLogOptions; +import com.azure.core.util.Configuration; + +import java.util.Arrays; + +/** + * This sample demonstrates how to use the Responses Input Content Image to generate text using the Azure OpenAI service. + */ +public class AzureResponsesContentImageUrlSample { + + /** + * Main method to run the sample. + * @param args Command line arguments (not used). + */ + public static void main(String[] args) { + // Create a client + ResponsesClient client = new ResponsesClientBuilder() + .endpoint(Configuration.getGlobalConfiguration().get("AZURE_OPENAI_ENDPOINT")) + .credential(new AzureKeyCredential(Configuration.getGlobalConfiguration().get("AZURE_OPENAI_KEY"))) + .serviceVersion(AzureResponsesServiceVersion.V2024_12_01_PREVIEW) + .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS)) + .buildClient(); + + // Create a request + CreateResponsesRequest request = new CreateResponsesRequest(CreateResponsesRequestModel.GPT_4O_MINI, + Arrays.asList( + new ResponsesSystemMessage(Arrays.asList(new ResponsesInputContentText("You are a helpful assistant that describes images"))), + new ResponsesUserMessage(Arrays.asList( + new ResponsesInputContentText("Please describe this image"), + new ResponsesInputContentImage().setImageUrl("https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Microsoft_logo.svg/512px-Microsoft_logo.svg.png"))))); + + // Send the request and get the response + ResponsesResponse response = client.createResponse(request); + ResponsesAssistantMessage responseMessage = (ResponsesAssistantMessage) response.getOutput().get(0); + ResponsesOutputContentText outputContent = (ResponsesOutputContentText) responseMessage.getContent().get(0); + + // Print the response + System.out.println("Response: " + response); + System.out.println("Output: " + outputContent.getText()); + } +} diff --git a/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTest.java b/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTest.java index 463e61da69a4..4ac72907de59 100644 --- a/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTest.java +++ b/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTest.java @@ -14,6 +14,8 @@ import com.azure.ai.openai.responses.models.ResponsesStreamEvent; import com.azure.ai.openai.responses.models.ResponsesStreamEventCompleted; import com.azure.ai.openai.responses.models.ResponsesUserMessage; +import com.azure.ai.openai.responses.models.ResponsesSystemMessage; +import com.azure.ai.openai.responses.models.ResponsesInputContentImage; import com.azure.core.http.HttpClient; import com.azure.core.http.rest.PagedIterable; import com.azure.core.http.rest.RequestOptions; @@ -22,6 +24,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; +import java.io.IOException; import java.util.Arrays; import static com.azure.ai.openai.responses.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS; @@ -144,6 +147,48 @@ public void listInputItems(HttpClient httpClient, AzureResponsesServiceVersion s } } + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.responses.TestUtils#getTestParametersResponses") + public void testResponsesInputContentImageBase64(HttpClient httpClient, AzureResponsesServiceVersion serviceVersion) { + ResponsesClient client = getAzureResponseClient(httpClient, serviceVersion); + + try { + openImageFileBase64Runner((base64Image) -> { + CreateResponsesRequest request = new CreateResponsesRequest(CreateResponsesRequestModel.GPT_4O_MINI, + Arrays.asList( + new ResponsesSystemMessage(Arrays.asList(new ResponsesInputContentText( + "You are a helpful assistant that describes images"))), + new ResponsesUserMessage(Arrays.asList( + new ResponsesInputContentText("Please describe this image"), + new ResponsesInputContentImage().setImageUrl( + "data:image/jpeg;base64," + base64Image))))); + + ResponsesResponse response = client.createResponse(request); + assertImageResponseForAzure(response); + + }); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.responses.TestUtils#getTestParametersResponses") + public void testResponsesInputContentImageUrl(HttpClient httpClient, AzureResponsesServiceVersion serviceVersion) { + ResponsesClient client = getAzureResponseClient(httpClient, serviceVersion); + + CreateResponsesRequest request = new CreateResponsesRequest(CreateResponsesRequestModel.GPT_4O_MINI, + Arrays.asList( + new ResponsesSystemMessage(Arrays.asList(new ResponsesInputContentText( + "You are a helpful assistant that describes images"))), + new ResponsesUserMessage(Arrays.asList( + new ResponsesInputContentText("Please describe this image"), + new ResponsesInputContentImage().setImageUrl("https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Microsoft_logo.svg/512px-Microsoft_logo.svg.png"))))); + + ResponsesResponse response = client.createResponse(request); + assertImageResponseForAzure(response); + } + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @MethodSource("com.azure.ai.openai.responses.TestUtils#getTestParametersResponses") public void listInputItemsDesc(HttpClient httpClient, AzureResponsesServiceVersion serviceVersion) { diff --git a/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTestBase.java b/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTestBase.java index 60a4973960df..34d3a5cb76da 100644 --- a/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTestBase.java +++ b/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTestBase.java @@ -14,6 +14,8 @@ import com.azure.ai.openai.responses.models.ResponsesResponse; import com.azure.ai.openai.responses.models.ResponsesStreamEvent; import com.azure.ai.openai.responses.models.ResponsesUserMessage; +import com.azure.ai.openai.responses.models.ResponsesAssistantMessage; +import com.azure.ai.openai.responses.models.ResponsesOutputContentText; import com.azure.core.credential.AzureKeyCredential; import com.azure.core.credential.KeyCredential; import com.azure.core.http.HttpClient; @@ -28,7 +30,11 @@ import com.azure.core.util.Configuration; import com.azure.core.util.CoreUtils; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.Arrays; +import java.util.Base64; import java.util.function.Consumer; import static com.azure.ai.openai.responses.TestUtils.FAKE_API_KEY; @@ -40,8 +46,10 @@ public class AzureResponsesTestBase extends TestProxyTestBase { + private static final String MS_LOGO_PNG = "ms_logo.png"; + private ResponsesClientBuilder getBuilderForTests(HttpClient httpClient, - AzureResponsesServiceVersion serviceVersion) { + AzureResponsesServiceVersion serviceVersion) { ResponsesClientBuilder builder = new ResponsesClientBuilder() .httpClient(interceptorManager.isPlaybackMode() ? interceptorManager.getPlaybackClient() : httpClient); if (serviceVersion != null) { @@ -103,7 +111,7 @@ ResponsesClient getAzureResponseClient(HttpClient httpClient, AzureResponsesServ } ResponsesAsyncClient getAzureResponseAsyncClient(HttpClient httpClient, - AzureResponsesServiceVersion serviceVersion) { + AzureResponsesServiceVersion serviceVersion) { ResponsesClientBuilder builder = getBuilderForTests(httpClient, serviceVersion).addPolicy( new AddHeadersPolicy(new HttpHeaders().add(HttpHeaderName.fromString("x-ms-enable-preview"), "true"))); @@ -179,7 +187,7 @@ static void getCUARunner(Consumer runner) { = new ResponsesComputerTool(1024, 768, ResponsesComputerToolEnvironment.WINDOWS); CreateResponsesRequest request = new CreateResponsesRequest(CreateResponsesRequestModel.COMPUTER_USE_PREVIEW, Arrays.asList(new ResponsesDeveloperMessage(Arrays.asList(new ResponsesInputContentText( - "Call tools when the user asks to perform computer-related tasks like clicking interface elements."))), + "Call tools when the user asks to perform computer-related tasks like clicking interface elements."))), new ResponsesUserMessage(Arrays.asList(new ResponsesInputContentText("Click on the OK button"))))); request.setTools(Arrays.asList(computerTool)); request.setTruncation(ResponseTruncation.AUTO); @@ -230,4 +238,19 @@ public static void assertResponseItem(ResponsesItem responseItem) { assertNotNull(responseItem.getId()); assertNotNull(responseItem.getType()); } + + public static void openImageFileBase64Runner(Consumer testRunner) throws IOException { + byte[] imageBytes = Files.readAllBytes(Paths.get("src/test/resources/" + MS_LOGO_PNG)); + String base64Image = Base64.getEncoder().encodeToString(imageBytes); + testRunner.accept(base64Image); + } + + static void assertImageResponseForAzure(ResponsesResponse response) { + ResponsesAssistantMessage assistantMessage = (ResponsesAssistantMessage) response.getOutput().get(0); + ResponsesOutputContentText outputContent = (ResponsesOutputContentText) assistantMessage.getContent().get(0); + assertNotNull(assistantMessage); + assertNotNull(outputContent); + assertNotNull(outputContent.getText()); + } + } From d8e9aa42fdae446e5046177ee43892b2b893ea55 Mon Sep 17 00:00:00 2001 From: walterbvv Date: Tue, 1 Apr 2025 08:11:08 -0600 Subject: [PATCH 02/12] Responses Chaining responses sample --- .../responses/ChainingResponsesSample.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/ChainingResponsesSample.java diff --git a/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/ChainingResponsesSample.java b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/ChainingResponsesSample.java new file mode 100644 index 000000000000..c4894e5d5f53 --- /dev/null +++ b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/ChainingResponsesSample.java @@ -0,0 +1,56 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.openai.responses; + +import com.azure.ai.openai.responses.models.*; +import com.azure.core.credential.AzureKeyCredential; +import com.azure.core.http.policy.HttpLogDetailLevel; +import com.azure.core.http.policy.HttpLogOptions; +import com.azure.core.util.Configuration; +import java.util.Arrays; + +/** + * This sample demonstrates how to chain responses together by passing the response.id from the previous response to the previous_response_id parameter to generate text using the Azure OpenAI service. + */ +public class ChainingResponsesSample { + + /** + * Main method to run the sample. + * @param args Command line arguments (not used). + */ + public static void main(String[] args) { + + // Azure OpenAI Responses API is enabled only for api-version 2025-03-01-preview and later + // Create a client + ResponsesClient client = new ResponsesClientBuilder() + .endpoint(Configuration.getGlobalConfiguration().get("AZURE_OPENAI_ENDPOINT")) + .credential(new AzureKeyCredential(Configuration.getGlobalConfiguration().get("AZURE_OPENAI_KEY"))) + .serviceVersion(AzureResponsesServiceVersion.V2025_03_01_PREVIEW) + .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS)) + .buildClient(); + + // First response + CreateResponsesRequest firstRequest = new CreateResponsesRequest( + CreateResponsesRequestModel.GPT_4O_MINI, + Arrays.asList( + new ResponsesUserMessage(Arrays.asList( + new ResponsesInputContentText( "Define and explain the concept of catastrophic forgetting?"))))); + ResponsesResponse firstResponse = client.createResponse(firstRequest); + + // Second response + CreateResponsesRequest secondRequest = new CreateResponsesRequest( + CreateResponsesRequestModel.GPT_4O_MINI, + Arrays.asList( + new ResponsesUserMessage(Arrays.asList( + new ResponsesInputContentText( "Explain this at a level that could be understood by a college freshman"))))); + secondRequest.setPreviousResponseId(firstResponse.getId()); + ResponsesResponse secondResponse = client.createResponse(secondRequest); + + // Print the second response + ResponsesAssistantMessage assistantMessage = (ResponsesAssistantMessage) secondResponse.getOutput().get(0); + ResponsesOutputContentText outputContent = (ResponsesOutputContentText) assistantMessage.getContent().get(0); + System.out.println(outputContent.getText()); + + } +} From de52b940016d73ed04b874ac740440569a8d0b9e Mon Sep 17 00:00:00 2001 From: walterbvv Date: Tue, 1 Apr 2025 11:20:56 -0600 Subject: [PATCH 03/12] Azure OpenAI Responses API is enabled only for api-version 2025-03-01-preview and later --- .../ai/openai/responses/AzureResponsesContentImageSample.java | 2 +- .../openai/responses/AzureResponsesContentImageUrlSample.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageSample.java b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageSample.java index ab82cef8a851..2667cafb4f4d 100644 --- a/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageSample.java +++ b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageSample.java @@ -31,7 +31,7 @@ public static void main(String[] args) { ResponsesClient client = new ResponsesClientBuilder() .endpoint(Configuration.getGlobalConfiguration().get("AZURE_OPENAI_ENDPOINT")) .credential(new AzureKeyCredential(Configuration.getGlobalConfiguration().get("AZURE_OPENAI_KEY"))) - .serviceVersion(AzureResponsesServiceVersion.V2024_12_01_PREVIEW) + .serviceVersion(AzureResponsesServiceVersion.V2025_03_01_PREVIEW) .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS)) .buildClient(); diff --git a/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageUrlSample.java b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageUrlSample.java index c084b4deb790..88e36e6ba921 100644 --- a/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageUrlSample.java +++ b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageUrlSample.java @@ -25,7 +25,7 @@ public static void main(String[] args) { ResponsesClient client = new ResponsesClientBuilder() .endpoint(Configuration.getGlobalConfiguration().get("AZURE_OPENAI_ENDPOINT")) .credential(new AzureKeyCredential(Configuration.getGlobalConfiguration().get("AZURE_OPENAI_KEY"))) - .serviceVersion(AzureResponsesServiceVersion.V2024_12_01_PREVIEW) + .serviceVersion(AzureResponsesServiceVersion.V2025_03_01_PREVIEW) .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS)) .buildClient(); From ec3db9cf326e9f2335605585a1dc7d9b2e8ecfaa Mon Sep 17 00:00:00 2001 From: walterbvv Date: Wed, 2 Apr 2025 23:36:24 -0600 Subject: [PATCH 04/12] No import statements that use the * notation. --- .../responses/AzureResponsesContentImageSample.java | 11 ++++++++++- .../AzureResponsesContentImageUrlSample.java | 11 ++++++++++- .../ai/openai/responses/ChainingResponsesSample.java | 8 +++++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageSample.java b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageSample.java index 2667cafb4f4d..459c8fd552c7 100644 --- a/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageSample.java +++ b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageSample.java @@ -3,7 +3,16 @@ package com.azure.ai.openai.responses; -import com.azure.ai.openai.responses.models.*; + +import com.azure.ai.openai.responses.models.CreateResponsesRequest; +import com.azure.ai.openai.responses.models.CreateResponsesRequestModel; +import com.azure.ai.openai.responses.models.ResponsesInputContentText; +import com.azure.ai.openai.responses.models.ResponsesSystemMessage; +import com.azure.ai.openai.responses.models.ResponsesAssistantMessage; +import com.azure.ai.openai.responses.models.ResponsesUserMessage; +import com.azure.ai.openai.responses.models.ResponsesInputContentImage; +import com.azure.ai.openai.responses.models.ResponsesResponse; +import com.azure.ai.openai.responses.models.ResponsesOutputContentText; import com.azure.core.credential.AzureKeyCredential; import com.azure.core.http.policy.HttpLogDetailLevel; import com.azure.core.http.policy.HttpLogOptions; diff --git a/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageUrlSample.java b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageUrlSample.java index 88e36e6ba921..96fea1a2ac23 100644 --- a/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageUrlSample.java +++ b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageUrlSample.java @@ -3,7 +3,16 @@ package com.azure.ai.openai.responses; -import com.azure.ai.openai.responses.models.*; + +import com.azure.ai.openai.responses.models.CreateResponsesRequest; +import com.azure.ai.openai.responses.models.CreateResponsesRequestModel; +import com.azure.ai.openai.responses.models.ResponsesInputContentText; +import com.azure.ai.openai.responses.models.ResponsesSystemMessage; +import com.azure.ai.openai.responses.models.ResponsesAssistantMessage; +import com.azure.ai.openai.responses.models.ResponsesUserMessage; +import com.azure.ai.openai.responses.models.ResponsesInputContentImage; +import com.azure.ai.openai.responses.models.ResponsesResponse; +import com.azure.ai.openai.responses.models.ResponsesOutputContentText; import com.azure.core.credential.AzureKeyCredential; import com.azure.core.http.policy.HttpLogDetailLevel; import com.azure.core.http.policy.HttpLogOptions; diff --git a/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/ChainingResponsesSample.java b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/ChainingResponsesSample.java index c4894e5d5f53..5290b765a236 100644 --- a/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/ChainingResponsesSample.java +++ b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/ChainingResponsesSample.java @@ -3,7 +3,13 @@ package com.azure.ai.openai.responses; -import com.azure.ai.openai.responses.models.*; +import com.azure.ai.openai.responses.models.CreateResponsesRequest; +import com.azure.ai.openai.responses.models.CreateResponsesRequestModel; +import com.azure.ai.openai.responses.models.ResponsesInputContentText; +import com.azure.ai.openai.responses.models.ResponsesAssistantMessage; +import com.azure.ai.openai.responses.models.ResponsesUserMessage; +import com.azure.ai.openai.responses.models.ResponsesResponse; +import com.azure.ai.openai.responses.models.ResponsesOutputContentText; import com.azure.core.credential.AzureKeyCredential; import com.azure.core.http.policy.HttpLogDetailLevel; import com.azure.core.http.policy.HttpLogOptions; From a1b6dbf52b295747469a69280ee493bffa1424b8 Mon Sep 17 00:00:00 2001 From: walterbvv Date: Thu, 3 Apr 2025 00:19:26 -0600 Subject: [PATCH 05/12] correct indentation --- .../azure/ai/openai/responses/ChainingResponsesSample.java | 4 ++-- .../azure/ai/openai/responses/AzureResponsesTestBase.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/ChainingResponsesSample.java b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/ChainingResponsesSample.java index 5290b765a236..0c920ae27956 100644 --- a/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/ChainingResponsesSample.java +++ b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/ChainingResponsesSample.java @@ -41,7 +41,7 @@ public static void main(String[] args) { CreateResponsesRequestModel.GPT_4O_MINI, Arrays.asList( new ResponsesUserMessage(Arrays.asList( - new ResponsesInputContentText( "Define and explain the concept of catastrophic forgetting?"))))); + new ResponsesInputContentText("Define and explain the concept of catastrophic forgetting?"))))); ResponsesResponse firstResponse = client.createResponse(firstRequest); // Second response @@ -49,7 +49,7 @@ public static void main(String[] args) { CreateResponsesRequestModel.GPT_4O_MINI, Arrays.asList( new ResponsesUserMessage(Arrays.asList( - new ResponsesInputContentText( "Explain this at a level that could be understood by a college freshman"))))); + new ResponsesInputContentText("Explain this at a level that could be understood by a college freshman"))))); secondRequest.setPreviousResponseId(firstResponse.getId()); ResponsesResponse secondResponse = client.createResponse(secondRequest); diff --git a/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTestBase.java b/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTestBase.java index 34d3a5cb76da..0e1bb1d1275d 100644 --- a/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTestBase.java +++ b/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTestBase.java @@ -49,7 +49,7 @@ public class AzureResponsesTestBase extends TestProxyTestBase { private static final String MS_LOGO_PNG = "ms_logo.png"; private ResponsesClientBuilder getBuilderForTests(HttpClient httpClient, - AzureResponsesServiceVersion serviceVersion) { + AzureResponsesServiceVersion serviceVersion) { ResponsesClientBuilder builder = new ResponsesClientBuilder() .httpClient(interceptorManager.isPlaybackMode() ? interceptorManager.getPlaybackClient() : httpClient); if (serviceVersion != null) { @@ -111,7 +111,7 @@ ResponsesClient getAzureResponseClient(HttpClient httpClient, AzureResponsesServ } ResponsesAsyncClient getAzureResponseAsyncClient(HttpClient httpClient, - AzureResponsesServiceVersion serviceVersion) { + AzureResponsesServiceVersion serviceVersion) { ResponsesClientBuilder builder = getBuilderForTests(httpClient, serviceVersion).addPolicy( new AddHeadersPolicy(new HttpHeaders().add(HttpHeaderName.fromString("x-ms-enable-preview"), "true"))); @@ -187,7 +187,7 @@ static void getCUARunner(Consumer runner) { = new ResponsesComputerTool(1024, 768, ResponsesComputerToolEnvironment.WINDOWS); CreateResponsesRequest request = new CreateResponsesRequest(CreateResponsesRequestModel.COMPUTER_USE_PREVIEW, Arrays.asList(new ResponsesDeveloperMessage(Arrays.asList(new ResponsesInputContentText( - "Call tools when the user asks to perform computer-related tasks like clicking interface elements."))), + "Call tools when the user asks to perform computer-related tasks like clicking interface elements."))), new ResponsesUserMessage(Arrays.asList(new ResponsesInputContentText("Click on the OK button"))))); request.setTools(Arrays.asList(computerTool)); request.setTruncation(ResponseTruncation.AUTO); From dc31cd6e206c584cd1abec127fa837adbe5f14b2 Mon Sep 17 00:00:00 2001 From: walterbvv Date: Thu, 3 Apr 2025 00:23:01 -0600 Subject: [PATCH 06/12] replace exit with return --- .../openai/responses/AzureResponsesContentImageSample.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageSample.java b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageSample.java index 459c8fd552c7..ea1819fb3491 100644 --- a/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageSample.java +++ b/sdk/openai/azure-ai-openai/src/samples/java/com/azure/ai/openai/responses/AzureResponsesContentImageSample.java @@ -24,7 +24,6 @@ import java.util.Arrays; import java.util.Base64; -import static java.lang.System.exit; /** * This sample demonstrates how to use the Responses Input Content Image to generate text using the Azure OpenAI service. @@ -48,10 +47,9 @@ public static void main(String[] args) { try { String fileName = "ms_logo.png"; byte[] imageBytes = Files.readAllBytes(Paths.get("src/samples/java/com/azure/ai/openai/resources/" + fileName)); - base64Image= Base64.getEncoder().encodeToString(imageBytes); + base64Image = Base64.getEncoder().encodeToString(imageBytes); } catch (IOException e) { - System.out.println("Exception: " + e); - exit(-1); + return; } // Create a request From 90f4f5380fcc35b3fad814e5b9604f1e2f0b859f Mon Sep 17 00:00:00 2001 From: walterbvv Date: Thu, 3 Apr 2025 00:26:25 -0600 Subject: [PATCH 07/12] Add specific methods assertAssistantMessage and assertOutputContent instead of passing the full response . --- .../azure/ai/openai/responses/AzureResponsesTestBase.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTestBase.java b/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTestBase.java index 0e1bb1d1275d..db455ae7df40 100644 --- a/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTestBase.java +++ b/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTestBase.java @@ -245,10 +245,11 @@ public static void openImageFileBase64Runner(Consumer testRunner) throws testRunner.accept(base64Image); } - static void assertImageResponseForAzure(ResponsesResponse response) { - ResponsesAssistantMessage assistantMessage = (ResponsesAssistantMessage) response.getOutput().get(0); - ResponsesOutputContentText outputContent = (ResponsesOutputContentText) assistantMessage.getContent().get(0); + static void assertAssistantMessage(ResponsesAssistantMessage assistantMessage) { assertNotNull(assistantMessage); + } + + static void assertOutputContentText(ResponsesOutputContentText outputContent) { assertNotNull(outputContent); assertNotNull(outputContent.getText()); } From 91585132501a2e5c3331150474ae29840c6d1bd4 Mon Sep 17 00:00:00 2001 From: walterbvv Date: Thu, 3 Apr 2025 00:33:38 -0600 Subject: [PATCH 08/12] Change testResponsesInputContentimageBase64 method signature to throws IOException --- .../openai/responses/AzureResponsesTest.java | 53 ++++++++++--------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTest.java b/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTest.java index 4ac72907de59..6113f2bfee7b 100644 --- a/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTest.java +++ b/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesTest.java @@ -16,6 +16,9 @@ import com.azure.ai.openai.responses.models.ResponsesUserMessage; import com.azure.ai.openai.responses.models.ResponsesSystemMessage; import com.azure.ai.openai.responses.models.ResponsesInputContentImage; +import com.azure.ai.openai.responses.models.ResponsesAssistantMessage; +import com.azure.ai.openai.responses.models.ResponsesOutputContentText; + import com.azure.core.http.HttpClient; import com.azure.core.http.rest.PagedIterable; import com.azure.core.http.rest.RequestOptions; @@ -149,27 +152,25 @@ public void listInputItems(HttpClient httpClient, AzureResponsesServiceVersion s @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @MethodSource("com.azure.ai.openai.responses.TestUtils#getTestParametersResponses") - public void testResponsesInputContentImageBase64(HttpClient httpClient, AzureResponsesServiceVersion serviceVersion) { + public void testResponsesInputContentImageBase64(HttpClient httpClient, AzureResponsesServiceVersion serviceVersion) + throws IOException { ResponsesClient client = getAzureResponseClient(httpClient, serviceVersion); + openImageFileBase64Runner((base64Image) -> { + CreateResponsesRequest request = new CreateResponsesRequest(CreateResponsesRequestModel.GPT_4O_MINI, + Arrays.asList( + new ResponsesSystemMessage(Arrays + .asList(new ResponsesInputContentText("You are a helpful assistant that describes images"))), + new ResponsesUserMessage(Arrays.asList(new ResponsesInputContentText("Please describe this image"), + new ResponsesInputContentImage().setImageUrl("data:image/jpeg;base64," + base64Image))))); - try { - openImageFileBase64Runner((base64Image) -> { - CreateResponsesRequest request = new CreateResponsesRequest(CreateResponsesRequestModel.GPT_4O_MINI, - Arrays.asList( - new ResponsesSystemMessage(Arrays.asList(new ResponsesInputContentText( - "You are a helpful assistant that describes images"))), - new ResponsesUserMessage(Arrays.asList( - new ResponsesInputContentText("Please describe this image"), - new ResponsesInputContentImage().setImageUrl( - "data:image/jpeg;base64," + base64Image))))); - - ResponsesResponse response = client.createResponse(request); - assertImageResponseForAzure(response); + ResponsesResponse response = client.createResponse(request); + ResponsesAssistantMessage assistantMessage = (ResponsesAssistantMessage) response.getOutput().get(0); + ResponsesOutputContentText outputContent + = (ResponsesOutputContentText) assistantMessage.getContent().get(0); - }); - } catch (IOException e) { - throw new RuntimeException(e); - } + assertAssistantMessage(assistantMessage); + assertOutputContentText(outputContent); + }); } @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @@ -179,14 +180,18 @@ public void testResponsesInputContentImageUrl(HttpClient httpClient, AzureRespon CreateResponsesRequest request = new CreateResponsesRequest(CreateResponsesRequestModel.GPT_4O_MINI, Arrays.asList( - new ResponsesSystemMessage(Arrays.asList(new ResponsesInputContentText( - "You are a helpful assistant that describes images"))), - new ResponsesUserMessage(Arrays.asList( - new ResponsesInputContentText("Please describe this image"), - new ResponsesInputContentImage().setImageUrl("https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Microsoft_logo.svg/512px-Microsoft_logo.svg.png"))))); + new ResponsesSystemMessage( + Arrays.asList(new ResponsesInputContentText("You are a helpful assistant that describes images"))), + new ResponsesUserMessage(Arrays.asList(new ResponsesInputContentText("Please describe this image"), + new ResponsesInputContentImage().setImageUrl( + "https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Microsoft_logo.svg/512px-Microsoft_logo.svg.png"))))); ResponsesResponse response = client.createResponse(request); - assertImageResponseForAzure(response); + ResponsesAssistantMessage assistantMessage = (ResponsesAssistantMessage) response.getOutput().get(0); + ResponsesOutputContentText outputContent = (ResponsesOutputContentText) assistantMessage.getContent().get(0); + + assertAssistantMessage(assistantMessage); + assertOutputContentText(outputContent); } @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) From ba3f10a41dc26a1538b17adaff401497f5190edd Mon Sep 17 00:00:00 2001 From: walterbvv Date: Thu, 3 Apr 2025 00:34:51 -0600 Subject: [PATCH 09/12] Change service version test due Azure OpenAI Responses API is enabled only for api-version 2025-03-01-preview and later --- .../src/test/java/com/azure/ai/openai/responses/TestUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/TestUtils.java b/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/TestUtils.java index 877661c51beb..5f777c04f2ad 100644 --- a/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/TestUtils.java +++ b/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/TestUtils.java @@ -31,7 +31,7 @@ static Stream getTestParametersResponses() { } private static boolean supportsResponses(AzureResponsesServiceVersion serviceVersion) { - return AzureResponsesServiceVersion.V2024_12_01_PREVIEW.equals(serviceVersion); + return AzureResponsesServiceVersion.V2025_03_01_PREVIEW.equals(serviceVersion); } /** From 7c2e1d0f63f7dd54bdd14b7e6bc0a0b6065784ac Mon Sep 17 00:00:00 2001 From: walterbvv Date: Wed, 16 Apr 2025 22:40:13 -0600 Subject: [PATCH 10/12] NonAzure test for InputContentImage --- .../ai/openai/responses/ResponsesTest.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/ResponsesTest.java b/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/ResponsesTest.java index 50e6176041be..bd0fa8e66241 100644 --- a/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/ResponsesTest.java +++ b/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/ResponsesTest.java @@ -8,11 +8,15 @@ import com.azure.ai.openai.responses.models.CreateResponsesRequestModel; import com.azure.ai.openai.responses.models.DeleteResponseResponse; import com.azure.ai.openai.responses.models.ListInputItemsRequestOrder; +import com.azure.ai.openai.responses.models.ResponsesAssistantMessage; +import com.azure.ai.openai.responses.models.ResponsesInputContentImage; import com.azure.ai.openai.responses.models.ResponsesInputContentText; import com.azure.ai.openai.responses.models.ResponsesItem; +import com.azure.ai.openai.responses.models.ResponsesOutputContentText; import com.azure.ai.openai.responses.models.ResponsesResponse; import com.azure.ai.openai.responses.models.ResponsesStreamEvent; import com.azure.ai.openai.responses.models.ResponsesStreamEventCompleted; +import com.azure.ai.openai.responses.models.ResponsesSystemMessage; import com.azure.ai.openai.responses.models.ResponsesUserMessage; import com.azure.core.http.HttpClient; import com.azure.core.http.rest.PagedIterable; @@ -21,6 +25,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; +import java.io.IOException; import java.util.Arrays; import static com.azure.ai.openai.responses.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS; @@ -142,6 +147,47 @@ public void listInputItems(HttpClient httpClient, AzureResponsesServiceVersion s } } + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.responses.TestUtils#getTestParametersResponses") + public void createInputContentImageBase64(HttpClient httpClient, AzureResponsesServiceVersion serviceVersion) throws IOException { + ResponsesClient client = getResponseClient(httpClient); + openImageFileBase64Runner((base64Image) -> { + CreateResponsesRequest request = new CreateResponsesRequest(CreateResponsesRequestModel.GPT_4O_MINI, + Arrays.asList( + new ResponsesSystemMessage(Arrays.asList(new ResponsesInputContentText("You are a helpful assistant that describes images"))), + new ResponsesUserMessage(Arrays.asList( + new ResponsesInputContentText("Please describe this image"), + new ResponsesInputContentImage().setImageUrl("data:image/jpeg;base64," + base64Image))))); + + ResponsesResponse response = client.createResponse(request); + ResponsesAssistantMessage assistantMessage = (ResponsesAssistantMessage) response.getOutput().get(0); + ResponsesOutputContentText outputContent = (ResponsesOutputContentText) assistantMessage.getContent().get(0); + + assertAssistantMessage(assistantMessage); + assertOutputContentText(outputContent); + }); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.responses.TestUtils#getTestParametersResponses") + public void createInputContentImageUrl(HttpClient httpClient, AzureResponsesServiceVersion serviceVersion) { + ResponsesClient client = getResponseClient(httpClient); + + CreateResponsesRequest request = new CreateResponsesRequest(CreateResponsesRequestModel.GPT_4O_MINI, + Arrays.asList( + new ResponsesSystemMessage(Arrays.asList(new ResponsesInputContentText("You are a helpful assistant that describes images"))), + new ResponsesUserMessage(Arrays.asList( + new ResponsesInputContentText("Please describe this image"), + new ResponsesInputContentImage().setImageUrl("https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Microsoft_logo.svg/512px-Microsoft_logo.svg.png"))))); + + ResponsesResponse response = client.createResponse(request); + ResponsesAssistantMessage assistantMessage = (ResponsesAssistantMessage) response.getOutput().get(0); + ResponsesOutputContentText outputContent = (ResponsesOutputContentText) assistantMessage.getContent().get(0); + + assertAssistantMessage(assistantMessage); + assertOutputContentText(outputContent); + } + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @MethodSource("com.azure.ai.openai.responses.TestUtils#getTestParametersResponses") public void listInputItemsDesc(HttpClient httpClient, AzureResponsesServiceVersion serviceVersion) { From a59fa146fe336033e0a1c601af3fb0ce34536544 Mon Sep 17 00:00:00 2001 From: walterbvv Date: Wed, 16 Apr 2025 22:42:33 -0600 Subject: [PATCH 11/12] NonAzure Async test for InputContentImage --- .../openai/responses/ResponsesAsyncTest.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/ResponsesAsyncTest.java b/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/ResponsesAsyncTest.java index 20a81fb10572..70c74be253ea 100644 --- a/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/ResponsesAsyncTest.java +++ b/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/ResponsesAsyncTest.java @@ -7,9 +7,13 @@ import com.azure.ai.openai.responses.models.CreateResponsesRequestIncludable; import com.azure.ai.openai.responses.models.CreateResponsesRequestModel; import com.azure.ai.openai.responses.models.ListInputItemsRequestOrder; +import com.azure.ai.openai.responses.models.ResponsesAssistantMessage; +import com.azure.ai.openai.responses.models.ResponsesInputContentImage; import com.azure.ai.openai.responses.models.ResponsesInputContentText; +import com.azure.ai.openai.responses.models.ResponsesOutputContentText; import com.azure.ai.openai.responses.models.ResponsesResponse; import com.azure.ai.openai.responses.models.ResponsesStreamEventCompleted; +import com.azure.ai.openai.responses.models.ResponsesSystemMessage; import com.azure.ai.openai.responses.models.ResponsesUserMessage; import com.azure.core.http.HttpClient; import com.azure.core.http.rest.RequestOptions; @@ -17,6 +21,7 @@ import org.junit.jupiter.params.provider.MethodSource; import reactor.test.StepVerifier; +import java.io.IOException; import java.util.Arrays; import static com.azure.ai.openai.responses.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS; @@ -138,6 +143,56 @@ public void listInputItems(HttpClient httpClient, AzureResponsesServiceVersion s .verifyComplete(); } + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.responses.TestUtils#getTestParametersResponses") + public void testResponsesInputContentImageBase64(HttpClient httpClient, AzureResponsesServiceVersion serviceVersion) throws IOException { + ResponsesAsyncClient client = getResponseAsyncClient(httpClient); + + openImageFileBase64Runner((base64Image) -> { + CreateResponsesRequest request = new CreateResponsesRequest(CreateResponsesRequestModel.GPT_4O_MINI, + Arrays.asList( + new ResponsesSystemMessage( + Arrays.asList(new ResponsesInputContentText("You are a helpful assistant that describes images"))), + new ResponsesUserMessage(Arrays.asList(new ResponsesInputContentText("Please describe this image"), + new ResponsesInputContentImage().setImageUrl("data:image/jpeg;base64," + base64Image))))); + + StepVerifier.create(client.createResponse(request)) + .assertNext(response -> { + ResponsesAssistantMessage assistantMessage = (ResponsesAssistantMessage) response.getOutput().get(0); + ResponsesOutputContentText outputContent = (ResponsesOutputContentText) assistantMessage.getContent().get(0); + assertAssistantMessage(assistantMessage); + assertOutputContentText(outputContent); + } + ) + .verifyComplete(); + }); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.responses.TestUtils#getTestParametersResponses") + public void testResponsesInputContentImageUrl(HttpClient httpClient, AzureResponsesServiceVersion serviceVersion) { + ResponsesAsyncClient client = getResponseAsyncClient(httpClient); + + CreateResponsesRequest request = new CreateResponsesRequest(CreateResponsesRequestModel.GPT_4O_MINI, + Arrays.asList( + new ResponsesSystemMessage( + Arrays.asList(new ResponsesInputContentText("You are a helpful assistant that describes images"))), + new ResponsesUserMessage(Arrays.asList(new ResponsesInputContentText("Please describe this image"), + new ResponsesInputContentImage().setImageUrl( + "https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Microsoft_logo.svg/512px-Microsoft_logo.svg.png"))))); + + // Now get the response + StepVerifier.create(client.createResponse(request)) + .assertNext(response -> { + ResponsesAssistantMessage assistantMessage = (ResponsesAssistantMessage) response.getOutput().get(0); + ResponsesOutputContentText outputContent = (ResponsesOutputContentText) assistantMessage.getContent().get(0); + assertAssistantMessage(assistantMessage); + assertOutputContentText(outputContent); + } + ) + .verifyComplete(); + } + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @MethodSource("com.azure.ai.openai.responses.TestUtils#getTestParametersResponses") public void listInputItemsDesc(HttpClient httpClient, AzureResponsesServiceVersion serviceVersion) { From 0f5a95bf019f960c70fd74ebe5b51f506d17bb85 Mon Sep 17 00:00:00 2001 From: walterbvv Date: Wed, 16 Apr 2025 22:43:17 -0600 Subject: [PATCH 12/12] Async test for InputContentImage --- .../responses/AzureResponsesAsyncTest.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesAsyncTest.java b/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesAsyncTest.java index acc001376a66..c3c7ab362630 100644 --- a/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesAsyncTest.java +++ b/sdk/openai/azure-ai-openai/src/test/java/com/azure/ai/openai/responses/AzureResponsesAsyncTest.java @@ -7,9 +7,13 @@ import com.azure.ai.openai.responses.models.CreateResponsesRequestIncludable; import com.azure.ai.openai.responses.models.CreateResponsesRequestModel; import com.azure.ai.openai.responses.models.ListInputItemsRequestOrder; +import com.azure.ai.openai.responses.models.ResponsesAssistantMessage; +import com.azure.ai.openai.responses.models.ResponsesInputContentImage; import com.azure.ai.openai.responses.models.ResponsesInputContentText; +import com.azure.ai.openai.responses.models.ResponsesOutputContentText; import com.azure.ai.openai.responses.models.ResponsesResponse; import com.azure.ai.openai.responses.models.ResponsesStreamEventCompleted; +import com.azure.ai.openai.responses.models.ResponsesSystemMessage; import com.azure.ai.openai.responses.models.ResponsesUserMessage; import com.azure.core.http.HttpClient; import com.azure.core.http.rest.RequestOptions; @@ -18,6 +22,7 @@ import org.junit.jupiter.params.provider.MethodSource; import reactor.test.StepVerifier; +import java.io.IOException; import java.util.Arrays; import static com.azure.ai.openai.responses.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS; @@ -140,6 +145,55 @@ public void listInputItems(HttpClient httpClient, AzureResponsesServiceVersion s .verifyComplete(); } + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.responses.TestUtils#getTestParametersResponses") + public void testResponsesInputContentImageBase64(HttpClient httpClient, AzureResponsesServiceVersion serviceVersion) throws IOException { + ResponsesAsyncClient client = getAzureResponseAsyncClient(httpClient, serviceVersion); + + openImageFileBase64Runner((base64Image) -> { + CreateResponsesRequest request = new CreateResponsesRequest(CreateResponsesRequestModel.GPT_4O_MINI, + Arrays.asList( + new ResponsesSystemMessage( + Arrays.asList(new ResponsesInputContentText("You are a helpful assistant that describes images"))), + new ResponsesUserMessage(Arrays.asList(new ResponsesInputContentText("Please describe this image"), + new ResponsesInputContentImage().setImageUrl("data:image/jpeg;base64," + base64Image))))); + + StepVerifier.create(client.createResponse(request)) + .assertNext(response -> { + ResponsesAssistantMessage assistantMessage = (ResponsesAssistantMessage) response.getOutput().get(0); + ResponsesOutputContentText outputContent = (ResponsesOutputContentText) assistantMessage.getContent().get(0); + assertAssistantMessage(assistantMessage); + assertOutputContentText(outputContent); + } + ) + .verifyComplete(); + }); + } + + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.openai.responses.TestUtils#getTestParametersResponses") + public void testResponsesInputContentImageUrl(HttpClient httpClient, AzureResponsesServiceVersion serviceVersion) { + ResponsesAsyncClient client = getAzureResponseAsyncClient(httpClient, serviceVersion); + + CreateResponsesRequest request = new CreateResponsesRequest(CreateResponsesRequestModel.GPT_4O_MINI, + Arrays.asList( + new ResponsesSystemMessage( + Arrays.asList(new ResponsesInputContentText("You are a helpful assistant that describes images"))), + new ResponsesUserMessage(Arrays.asList(new ResponsesInputContentText("Please describe this image"), + new ResponsesInputContentImage().setImageUrl( + "https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Microsoft_logo.svg/512px-Microsoft_logo.svg.png"))))); + + StepVerifier.create(client.createResponse(request)) + .assertNext(response -> { + ResponsesAssistantMessage assistantMessage = (ResponsesAssistantMessage) response.getOutput().get(0); + ResponsesOutputContentText outputContent = (ResponsesOutputContentText) assistantMessage.getContent().get(0); + assertAssistantMessage(assistantMessage); + assertOutputContentText(outputContent); + } + ) + .verifyComplete(); + } + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @MethodSource("com.azure.ai.openai.responses.TestUtils#getTestParametersResponses") public void listInputItemsDesc(HttpClient httpClient, AzureResponsesServiceVersion serviceVersion) {