From abc9b60ec9943670a5dbe14d2a06a701b0475481 Mon Sep 17 00:00:00 2001 From: SergeyMenshykh <68852919+SergeyMenshykh@users.noreply.github.com> Date: Fri, 22 May 2026 19:15:06 +0100 Subject: [PATCH] fix: populate MessageId from TaskStatusUpdateEvent.Status.Message (#6043) When A2AAgent receives a TaskStatusUpdateEvent during streaming, ConvertToAgentResponseUpdate now sets AgentResponseUpdate.MessageId from Status.Message.MessageId when the message is present. This fixes the missing message correlation metadata reported in microsoft/agent-framework#4987. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../src/Microsoft.Agents.AI.A2A/A2AAgent.cs | 1 + .../A2AAgentTests.cs | 47 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/dotnet/src/Microsoft.Agents.AI.A2A/A2AAgent.cs b/dotnet/src/Microsoft.Agents.AI.A2A/A2AAgent.cs index 9a42359ffc..77468c4bc4 100644 --- a/dotnet/src/Microsoft.Agents.AI.A2A/A2AAgent.cs +++ b/dotnet/src/Microsoft.Agents.AI.A2A/A2AAgent.cs @@ -474,6 +474,7 @@ public sealed class A2AAgent : AIAgent ResponseId = statusUpdateEvent.TaskId, RawRepresentation = statusUpdateEvent, Role = ChatRole.Assistant, + MessageId = statusUpdateEvent.Status.Message?.MessageId, FinishReason = MapTaskStateToFinishReason(statusUpdateEvent.Status.State), AdditionalProperties = statusUpdateEvent.Metadata?.ToAdditionalProperties() ?? [], Contents = statusUpdateEvent.Status.GetUserInputRequests(), diff --git a/dotnet/tests/Microsoft.Agents.AI.A2A.UnitTests/A2AAgentTests.cs b/dotnet/tests/Microsoft.Agents.AI.A2A.UnitTests/A2AAgentTests.cs index 14553abee9..614d1b4dde 100644 --- a/dotnet/tests/Microsoft.Agents.AI.A2A.UnitTests/A2AAgentTests.cs +++ b/dotnet/tests/Microsoft.Agents.AI.A2A.UnitTests/A2AAgentTests.cs @@ -1124,6 +1124,7 @@ public sealed class A2AAgentTests : IDisposable Assert.Equal(TaskId, update0.ResponseId); Assert.Equal(this._agent.Id, update0.AgentId); Assert.Null(update0.FinishReason); + Assert.Null(update0.MessageId); Assert.IsType(update0.RawRepresentation); // Assert - session should be updated with context and task IDs @@ -1132,6 +1133,50 @@ public sealed class A2AAgentTests : IDisposable Assert.Equal(TaskId, a2aSession.TaskId); } + [Fact] + public async Task RunStreamingAsync_WithTaskStatusUpdateEventAndMessageId_YieldsMessageIdAsync() + { + // Arrange + const string TaskId = "task-status-msg-123"; + const string ContextId = "ctx-status-msg-456"; + const string ExpectedMessageId = "msg-status-789"; + + this._handler.StreamingResponseToReturn = new StreamResponse + { + StatusUpdate = new TaskStatusUpdateEvent + { + TaskId = TaskId, + ContextId = ContextId, + Status = new() + { + State = TaskState.Working, + Message = new Message + { + MessageId = ExpectedMessageId, + Parts = [Part.FromText("Processing your request...")] + } + } + } + }; + + var session = await this._agent.CreateSessionAsync(); + + // Act + var updates = new List(); + await foreach (var update in this._agent.RunStreamingAsync("Check task status", session)) + { + updates.Add(update); + } + + // Assert + Assert.Single(updates); + + var update0 = updates[0]; + Assert.Equal(ExpectedMessageId, update0.MessageId); + Assert.Equal(TaskId, update0.ResponseId); + Assert.IsType(update0.RawRepresentation); + } + [Fact] public async Task RunStreamingAsync_WithInputRequiredStatusUpdate_YieldsStatusContentsAsync() { @@ -1150,6 +1195,7 @@ public sealed class A2AAgentTests : IDisposable State = TaskState.InputRequired, Message = new Message { + MessageId = "input-msg-789", Parts = [Part.FromText("Where would you like to fly?")] } } @@ -1170,6 +1216,7 @@ public sealed class A2AAgentTests : IDisposable var update0 = updates[0]; Assert.Equal(TaskId, update0.ResponseId); + Assert.Equal("input-msg-789", update0.MessageId); Assert.Null(update0.FinishReason); var textContent = Assert.Single(update0.Contents.OfType());