From 650a132ed2f09c92fa1b7948a8bd21e1e4457c60 Mon Sep 17 00:00:00 2001 From: nick863 <30440255+nick863@users.noreply.github.com> Date: Tue, 16 Sep 2025 15:23:11 -0700 Subject: [PATCH 1/2] Fix Message blocks serialization. --- sdk/ai/Azure.AI.Agents.Persistent/assets.json | 2 +- .../src/Custom/ThreadMessages.cs | 2 +- .../tests/AIAgentsTestEnvironment.cs | 1 + .../tests/PersistentAgentsTests.cs | 52 +++++++++++++++++++ 4 files changed, 55 insertions(+), 2 deletions(-) diff --git a/sdk/ai/Azure.AI.Agents.Persistent/assets.json b/sdk/ai/Azure.AI.Agents.Persistent/assets.json index 3fc732e88cda..2a22af89c2b7 100644 --- a/sdk/ai/Azure.AI.Agents.Persistent/assets.json +++ b/sdk/ai/Azure.AI.Agents.Persistent/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "net", "TagPrefix": "net/ai/Azure.AI.Agents.Persistent", - "Tag": "net/ai/Azure.AI.Agents.Persistent_32145de83f" + "Tag": "net/ai/Azure.AI.Agents.Persistent_358ff70ace" } diff --git a/sdk/ai/Azure.AI.Agents.Persistent/src/Custom/ThreadMessages.cs b/sdk/ai/Azure.AI.Agents.Persistent/src/Custom/ThreadMessages.cs index a75a0837b02b..01ff26e4e139 100644 --- a/sdk/ai/Azure.AI.Agents.Persistent/src/Custom/ThreadMessages.cs +++ b/sdk/ai/Azure.AI.Agents.Persistent/src/Custom/ThreadMessages.cs @@ -314,7 +314,7 @@ public virtual Response CreateMessage( } // Now serialize the array of JsonElements into a single BinaryData for the request: - var jsonString = JsonSerializer.Serialize(contentBlocks, JsonElementSerializer.Default.ListJsonElement); + var jsonString = JsonSerializer.Serialize(jsonElements, JsonElementSerializer.Default.ListJsonElement); BinaryData serializedBlocks = BinaryData.FromString(jsonString); return CreateMessage( diff --git a/sdk/ai/Azure.AI.Agents.Persistent/tests/AIAgentsTestEnvironment.cs b/sdk/ai/Azure.AI.Agents.Persistent/tests/AIAgentsTestEnvironment.cs index 120f322fa368..f1a20aeec515 100644 --- a/sdk/ai/Azure.AI.Agents.Persistent/tests/AIAgentsTestEnvironment.cs +++ b/sdk/ai/Azure.AI.Agents.Persistent/tests/AIAgentsTestEnvironment.cs @@ -23,5 +23,6 @@ public class AIAgentsTestEnvironment : TestEnvironment public string DEEP_RESEARCH_MODEL_DEPLOYMENT_NAME => GetRecordedOptionalVariable("DEEP_RESEARCH_MODEL_DEPLOYMENT_NAME"); public string BING_CONFIGURATION_NAME => GetRecordedOptionalVariable("BING_CONFIGURATION_NAME"); public string PLAYWRIGHT_CONNECTION_ID => GetRecordedOptionalVariable("AZURE_PLAYWRIGHT_CONNECTION_ID"); + public string UPLOADED_IMAGE_ID => GetRecordedOptionalVariable("UPLOADED_IMAGE_ID"); } } diff --git a/sdk/ai/Azure.AI.Agents.Persistent/tests/PersistentAgentsTests.cs b/sdk/ai/Azure.AI.Agents.Persistent/tests/PersistentAgentsTests.cs index 92ded03283f4..bdeb8a052588 100644 --- a/sdk/ai/Azure.AI.Agents.Persistent/tests/PersistentAgentsTests.cs +++ b/sdk/ai/Azure.AI.Agents.Persistent/tests/PersistentAgentsTests.cs @@ -2306,6 +2306,58 @@ await ValidateStream( ); } + [RecordedTest] + [TestCase(true, "adani")] + //TODO: The Image URI is not supported, uncomment this text when the ICM 686545924 will be resolved. + //[TestCase(false, "trail")] + public async Task TestImageAsInput(bool useUploaded, string expectedWord) + { + PersistentAgentsClient client = GetClient(); + PersistentAgent agent = await GetAgent( + client: client, + model: "gpt-4o", + instruction: "Analyze images from internally uploaded files." + ); + PersistentAgentThread thread = client.Threads.CreateThread(); + var contentBlocks = new List + { + new MessageInputTextBlock("Here is an uploaded file. Please describe it:"), + }; + if (useUploaded) + { + // Note: To get the Image ID, please upload it using sample "Sample_PersistentAgents_ImageFileInputs." + contentBlocks.Add(new MessageInputImageFileBlock(new MessageImageFileParam(TestEnvironment.UPLOADED_IMAGE_ID))); + } + else + { + string uri = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"; + contentBlocks.Add(new MessageInputImageUriBlock(new MessageImageUriParam(uri))); + } + + PersistentThreadMessage imageMessage = client.Messages.CreateMessage( + threadId: thread.Id, + role: MessageRole.User, + contentBlocks: contentBlocks + ); + ThreadRun run = client.Runs.CreateRun( + threadId: thread.Id, + assistantId: agent.Id + ); + run = await WaitForRun(client, run); + List messages = await client.Messages.GetMessagesAsync(threadId: run.ThreadId).ToListAsync(); + Assert.Greater(messages.Count, 0); + StringBuilder sbResponse = new(); + foreach (PersistentThreadMessage msg in messages) + { + if (msg.Role == MessageRole.Agent) + { + msg.ContentItems.Where(x => x is MessageTextContent).Select(x => ((MessageTextContent)x).Text).Aggregate(sbResponse, (sbResponse, next) => sbResponse.Append(next)); + } + } + string response = sbResponse.ToString().ToLower(); + Assert.That(response.Contains(expectedWord), $"The word {expectedWord} was not found in the response: {response}"); + } + #region Helpers private static async Task ValidateStream( PersistentAgentsClient client, From ce93767a3726ef23e979ab00ca595418c087296f Mon Sep 17 00:00:00 2001 From: nick863 <30440255+nick863@users.noreply.github.com> Date: Tue, 16 Sep 2025 15:57:40 -0700 Subject: [PATCH 2/2] Fix --- sdk/ai/Azure.AI.Agents.Persistent/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/ai/Azure.AI.Agents.Persistent/CHANGELOG.md b/sdk/ai/Azure.AI.Agents.Persistent/CHANGELOG.md index 93a70ec98f6b..d01ea49c7439 100644 --- a/sdk/ai/Azure.AI.Agents.Persistent/CHANGELOG.md +++ b/sdk/ai/Azure.AI.Agents.Persistent/CHANGELOG.md @@ -7,6 +7,7 @@ ### Breaking Changes ### Bugs Fixed +- Fix issue with image block serialization [issue](https://github.com/Azure/azure-sdk-for-net/issues/52571) ### Other Changes