From ca51f90f895a2d27ded0de89a875e07aae48b0a8 Mon Sep 17 00:00:00 2001 From: Chris Rickman Date: Tue, 23 Dec 2025 12:59:35 -0800 Subject: [PATCH] Repro test --- .../OpenAIResponsesChatClient.cs | 1 + .../OpenAIResponseClientTests.cs | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/src/Libraries/Microsoft.Extensions.AI.OpenAI/OpenAIResponsesChatClient.cs b/src/Libraries/Microsoft.Extensions.AI.OpenAI/OpenAIResponsesChatClient.cs index b9aca3161a0..006a762c27d 100644 --- a/src/Libraries/Microsoft.Extensions.AI.OpenAI/OpenAIResponsesChatClient.cs +++ b/src/Libraries/Microsoft.Extensions.AI.OpenAI/OpenAIResponsesChatClient.cs @@ -1196,6 +1196,7 @@ private static List ToAIContents(IEnumerable con !string.IsNullOrWhiteSpace(part.InputImageFileId) ? new HostedFileContent(part.InputImageFileId) { MediaType = "image/*" } : !string.IsNullOrWhiteSpace(part.InputFileId) ? new HostedFileContent(part.InputFileId) { Name = part.InputFilename } : part.InputFileBytes is not null ? new DataContent(part.InputFileBytes, part.InputFileBytesMediaType ?? "application/octet-stream") { Name = part.InputFilename } : + //// MISSING: (part.InputImageUrl ? "http:"? : "data:") : null; break; diff --git a/test/Libraries/Microsoft.Extensions.AI.OpenAI.Tests/OpenAIResponseClientTests.cs b/test/Libraries/Microsoft.Extensions.AI.OpenAI.Tests/OpenAIResponseClientTests.cs index c84eba42fa1..904e6f3badb 100644 --- a/test/Libraries/Microsoft.Extensions.AI.OpenAI.Tests/OpenAIResponseClientTests.cs +++ b/test/Libraries/Microsoft.Extensions.AI.OpenAI.Tests/OpenAIResponseClientTests.cs @@ -5545,6 +5545,50 @@ static bool HasCorrectImageData(AIContent o, int index) Assert.Equal("img_call_ghi789", toolCall.ImageId); } + [Fact] + public void AsChatMessage_FromMessageResponseItemWithImageUrl() + { + ResponseItem messageItem = + ResponseItem.CreateUserMessageItem( + [ + ResponseContentPart.CreateInputTextPart("Test message"), + ResponseContentPart.CreateInputImagePart(new Uri("https://example.com/image.png")), + ]); + + IEnumerable messageItems = [messageItem]; + + var chatMessages = messageItems.AsChatMessages(); + ChatMessage chatMessage = Assert.Single(chatMessages); + Assert.Equal(ChatRole.User, chatMessage.Role); + Assert.Equal(2, chatMessage.Contents.Count); + TextContent textContent = Assert.IsType(chatMessage.Contents[0]); + Assert.Equal("Test message", textContent.Text); + UriContent uriContent = Assert.IsType(chatMessage.Contents[1]); + Assert.Equal("https://example.com/image.png", uriContent.Uri.ToString()); + } + + [Fact] + public void AsChatMessage_FromMessageResponseItemWithImageContent() + { + ResponseItem messageItem = + ResponseItem.CreateUserMessageItem( + [ + ResponseContentPart.CreateInputTextPart("Test message"), + ResponseContentPart.CreateInputImagePart(BinaryData.FromBytes(Encoding.UTF8.GetBytes("image data")), "image/png"), + ]); + + IEnumerable messageItems = [messageItem]; + + var chatMessages = messageItems.AsChatMessages(); + ChatMessage chatMessage = Assert.Single(chatMessages); + Assert.Equal(ChatRole.User, chatMessage.Role); + Assert.Equal(2, chatMessage.Contents.Count); + TextContent textContent = Assert.IsType(chatMessage.Contents[0]); + Assert.Equal("Test message", textContent.Text); + UriContent uriContent = Assert.IsType(chatMessage.Contents[1]); + Assert.Equal($"data:image/png;base64,{Convert.ToBase64String(Encoding.UTF8.GetBytes("image data"))}", uriContent.Uri.ToString()); + } + private static IChatClient CreateResponseClient(HttpClient httpClient, string modelId) => new OpenAIClient( new ApiKeyCredential("apikey"),