mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
Merge branch 'main' into feat/durable_task
This commit is contained in:
@@ -126,6 +126,7 @@ public sealed class A2AAgentTests : IDisposable
|
||||
Assert.Single(result.Messages);
|
||||
Assert.Equal(ChatRole.Assistant, result.Messages[0].Role);
|
||||
Assert.Equal("Hello! How can I help you today?", result.Messages[0].Text);
|
||||
Assert.Equal(ChatFinishReason.Stop, result.FinishReason);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -249,8 +250,7 @@ public sealed class A2AAgentTests : IDisposable
|
||||
Assert.Equal("stream-1", updates[0].MessageId);
|
||||
Assert.Equal(this._agent.Id, updates[0].AgentId);
|
||||
Assert.Equal("stream-1", updates[0].ResponseId);
|
||||
|
||||
Assert.NotNull(updates[0].RawRepresentation);
|
||||
Assert.Equal(ChatFinishReason.Stop, updates[0].FinishReason);
|
||||
Assert.IsType<AgentMessage>(updates[0].RawRepresentation);
|
||||
Assert.Equal("stream-1", ((AgentMessage)updates[0].RawRepresentation!).MessageId);
|
||||
}
|
||||
@@ -501,8 +501,7 @@ public sealed class A2AAgentTests : IDisposable
|
||||
Assert.NotNull(result);
|
||||
Assert.Equal(this._agent.Id, result.AgentId);
|
||||
Assert.Equal("task-789", result.ResponseId);
|
||||
|
||||
Assert.NotNull(result.RawRepresentation);
|
||||
Assert.Null(result.FinishReason);
|
||||
Assert.IsType<AgentTask>(result.RawRepresentation);
|
||||
Assert.Equal("task-789", ((AgentTask)result.RawRepresentation).Id);
|
||||
|
||||
@@ -552,6 +551,15 @@ public sealed class A2AAgentTests : IDisposable
|
||||
{
|
||||
Assert.Null(result.ContinuationToken);
|
||||
}
|
||||
|
||||
if (taskState is TaskState.Completed)
|
||||
{
|
||||
Assert.Equal(ChatFinishReason.Stop, result.FinishReason);
|
||||
}
|
||||
else
|
||||
{
|
||||
Assert.Null(result.FinishReason);
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -661,6 +669,7 @@ public sealed class A2AAgentTests : IDisposable
|
||||
Assert.Equal(MessageId, update0.ResponseId);
|
||||
Assert.Equal(this._agent.Id, update0.AgentId);
|
||||
Assert.Equal(MessageText, update0.Text);
|
||||
Assert.Equal(ChatFinishReason.Stop, update0.FinishReason);
|
||||
Assert.IsType<AgentMessage>(update0.RawRepresentation);
|
||||
Assert.Equal(MessageId, ((AgentMessage)update0.RawRepresentation!).MessageId);
|
||||
}
|
||||
@@ -702,6 +711,7 @@ public sealed class A2AAgentTests : IDisposable
|
||||
Assert.Equal(ChatRole.Assistant, update0.Role);
|
||||
Assert.Equal(TaskId, update0.ResponseId);
|
||||
Assert.Equal(this._agent.Id, update0.AgentId);
|
||||
Assert.Null(update0.FinishReason);
|
||||
Assert.IsType<AgentTask>(update0.RawRepresentation);
|
||||
Assert.Equal(TaskId, ((AgentTask)update0.RawRepresentation!).Id);
|
||||
|
||||
@@ -741,6 +751,7 @@ public sealed class A2AAgentTests : IDisposable
|
||||
Assert.Equal(ChatRole.Assistant, update0.Role);
|
||||
Assert.Equal(TaskId, update0.ResponseId);
|
||||
Assert.Equal(this._agent.Id, update0.AgentId);
|
||||
Assert.Null(update0.FinishReason);
|
||||
Assert.IsType<TaskStatusUpdateEvent>(update0.RawRepresentation);
|
||||
|
||||
// Assert - session should be updated with context and task IDs
|
||||
@@ -784,6 +795,7 @@ public sealed class A2AAgentTests : IDisposable
|
||||
Assert.Equal(ChatRole.Assistant, update0.Role);
|
||||
Assert.Equal(TaskId, update0.ResponseId);
|
||||
Assert.Equal(this._agent.Id, update0.AgentId);
|
||||
Assert.Null(update0.FinishReason);
|
||||
Assert.IsType<TaskArtifactUpdateEvent>(update0.RawRepresentation);
|
||||
|
||||
// Assert - artifact content should be in the update
|
||||
|
||||
@@ -53,6 +53,7 @@ public class AgentResponseTests
|
||||
{
|
||||
AdditionalProperties = [],
|
||||
CreatedAt = new DateTimeOffset(2022, 1, 1, 0, 0, 0, TimeSpan.Zero),
|
||||
FinishReason = ChatFinishReason.ContentFilter,
|
||||
Messages = [new(ChatRole.Assistant, "This is a test message.")],
|
||||
RawRepresentation = new object(),
|
||||
ResponseId = "responseId",
|
||||
@@ -63,6 +64,7 @@ public class AgentResponseTests
|
||||
AgentResponse response = new(chatResponse);
|
||||
Assert.Same(chatResponse.AdditionalProperties, response.AdditionalProperties);
|
||||
Assert.Equal(chatResponse.CreatedAt, response.CreatedAt);
|
||||
Assert.Equal(chatResponse.FinishReason, response.FinishReason);
|
||||
Assert.Same(chatResponse.Messages, response.Messages);
|
||||
Assert.Equal(chatResponse.ResponseId, response.ResponseId);
|
||||
Assert.Same(chatResponse, response.RawRepresentation as ChatResponse);
|
||||
@@ -105,6 +107,10 @@ public class AgentResponseTests
|
||||
Assert.Null(response.ContinuationToken);
|
||||
response.ContinuationToken = ResponseContinuationToken.FromBytes(new byte[] { 1, 2, 3 });
|
||||
Assert.Equivalent(ResponseContinuationToken.FromBytes(new byte[] { 1, 2, 3 }), response.ContinuationToken);
|
||||
|
||||
Assert.Null(response.FinishReason);
|
||||
response.FinishReason = ChatFinishReason.Length;
|
||||
Assert.Equal(ChatFinishReason.Length, response.FinishReason);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -188,6 +194,7 @@ public class AgentResponseTests
|
||||
ResponseId = "12345",
|
||||
CreatedAt = new DateTimeOffset(2024, 11, 10, 9, 20, 0, TimeSpan.Zero),
|
||||
AdditionalProperties = new() { ["key1"] = "value1", ["key2"] = 42 },
|
||||
FinishReason = ChatFinishReason.ContentFilter,
|
||||
Usage = new UsageDetails
|
||||
{
|
||||
TotalTokenCount = 100
|
||||
@@ -205,6 +212,7 @@ public class AgentResponseTests
|
||||
Assert.Equal(new DateTimeOffset(2024, 11, 10, 9, 20, 0, TimeSpan.Zero), update0.CreatedAt);
|
||||
Assert.Equal("customRole", update0.Role?.Value);
|
||||
Assert.Equal("Text", update0.Text);
|
||||
Assert.Equal(ChatFinishReason.ContentFilter, update0.FinishReason);
|
||||
|
||||
AgentResponseUpdate update1 = updates[1];
|
||||
Assert.Equal("value1", update1.AdditionalProperties?["key1"]);
|
||||
|
||||
+4
@@ -334,6 +334,7 @@ public class AgentResponseUpdateExtensionsTests
|
||||
{
|
||||
ResponseId = "test-response-id",
|
||||
CreatedAt = new DateTimeOffset(2024, 1, 1, 12, 0, 0, TimeSpan.Zero),
|
||||
FinishReason = ChatFinishReason.ContentFilter,
|
||||
Usage = new UsageDetails { TotalTokenCount = 50 },
|
||||
AdditionalProperties = new() { ["key"] = "value" },
|
||||
ContinuationToken = ResponseContinuationToken.FromBytes(new byte[] { 1, 2, 3 }),
|
||||
@@ -346,6 +347,7 @@ public class AgentResponseUpdateExtensionsTests
|
||||
Assert.NotNull(result);
|
||||
Assert.Equal("test-response-id", result.ResponseId);
|
||||
Assert.Equal(new DateTimeOffset(2024, 1, 1, 12, 0, 0, TimeSpan.Zero), result.CreatedAt);
|
||||
Assert.Equal(ChatFinishReason.ContentFilter, result.FinishReason);
|
||||
Assert.Same(agentResponse.Messages, result.Messages);
|
||||
Assert.Same(agentResponse, result.RawRepresentation);
|
||||
Assert.Same(agentResponse.Usage, result.Usage);
|
||||
@@ -392,6 +394,7 @@ public class AgentResponseUpdateExtensionsTests
|
||||
ResponseId = "update-id",
|
||||
MessageId = "message-id",
|
||||
CreatedAt = new DateTimeOffset(2024, 1, 1, 12, 0, 0, TimeSpan.Zero),
|
||||
FinishReason = ChatFinishReason.ToolCalls,
|
||||
AdditionalProperties = new() { ["key"] = "value" },
|
||||
ContinuationToken = ResponseContinuationToken.FromBytes(new byte[] { 1, 2, 3 }),
|
||||
};
|
||||
@@ -405,6 +408,7 @@ public class AgentResponseUpdateExtensionsTests
|
||||
Assert.Equal("update-id", result.ResponseId);
|
||||
Assert.Equal("message-id", result.MessageId);
|
||||
Assert.Equal(new DateTimeOffset(2024, 1, 1, 12, 0, 0, TimeSpan.Zero), result.CreatedAt);
|
||||
Assert.Equal(ChatFinishReason.ToolCalls, result.FinishReason);
|
||||
Assert.Equal(ChatRole.Assistant, result.Role);
|
||||
Assert.Same(agentResponseUpdate.Contents, result.Contents);
|
||||
Assert.Same(agentResponseUpdate, result.RawRepresentation);
|
||||
|
||||
@@ -24,6 +24,7 @@ public class AgentResponseUpdateTests
|
||||
Assert.Null(update.CreatedAt);
|
||||
Assert.Equal(string.Empty, update.ToString());
|
||||
Assert.Null(update.ContinuationToken);
|
||||
Assert.Null(update.FinishReason);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -50,6 +51,7 @@ public class AgentResponseUpdateTests
|
||||
Assert.Equal(chatResponseUpdate.AuthorName, response.AuthorName);
|
||||
Assert.Same(chatResponseUpdate.Contents, response.Contents);
|
||||
Assert.Equal(chatResponseUpdate.CreatedAt, response.CreatedAt);
|
||||
Assert.Equal(chatResponseUpdate.FinishReason, response.FinishReason);
|
||||
Assert.Equal(chatResponseUpdate.MessageId, response.MessageId);
|
||||
Assert.Same(chatResponseUpdate, response.RawRepresentation as ChatResponseUpdate);
|
||||
Assert.Equal(chatResponseUpdate.ResponseId, response.ResponseId);
|
||||
@@ -109,6 +111,10 @@ public class AgentResponseUpdateTests
|
||||
Assert.Null(update.ContinuationToken);
|
||||
update.ContinuationToken = ResponseContinuationToken.FromBytes(new byte[] { 1, 2, 3 });
|
||||
Assert.Equivalent(ResponseContinuationToken.FromBytes(new byte[] { 1, 2, 3 }), update.ContinuationToken);
|
||||
|
||||
Assert.Null(update.FinishReason);
|
||||
update.FinishReason = ChatFinishReason.ToolCalls;
|
||||
Assert.Equal(ChatFinishReason.ToolCalls, update.FinishReason);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
||||
@@ -37,5 +37,36 @@ public class MessageMergerTests
|
||||
response.CreatedAt.Should().NotBe(creationTime);
|
||||
response.Messages[0].CreatedAt.Should().Be(creationTime);
|
||||
response.Messages[0].Contents.Should().HaveCount(1);
|
||||
response.FinishReason.Should().BeNull();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Test_MessageMerger_PropagatesFinishReasonFromUpdates()
|
||||
{
|
||||
// Arrange
|
||||
string responseId = Guid.NewGuid().ToString("N");
|
||||
string messageId = Guid.NewGuid().ToString("N");
|
||||
|
||||
MessageMerger merger = new();
|
||||
|
||||
foreach (AgentResponseUpdate update in "Hello".ToAgentRunStream(agentId: TestAgentId1, messageId: messageId, responseId: responseId))
|
||||
{
|
||||
merger.AddUpdate(update);
|
||||
}
|
||||
|
||||
// Add a final update with FinishReason set
|
||||
merger.AddUpdate(new AgentResponseUpdate
|
||||
{
|
||||
ResponseId = responseId,
|
||||
MessageId = messageId,
|
||||
FinishReason = ChatFinishReason.ContentFilter,
|
||||
Role = ChatRole.Assistant,
|
||||
});
|
||||
|
||||
// Act
|
||||
AgentResponse response = merger.ComputeMerged(responseId);
|
||||
|
||||
// Assert - FinishReason from the update should propagate through
|
||||
response.FinishReason.Should().Be(ChatFinishReason.ContentFilter);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user