mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
60af59ba8b
* adds devui integration and samples
* adds unit tests for devui integration
* fix: correct formatting of copyright notice in unit test files
* fixes formatting issues
* fixes build for net8 target
* fixes formatting errors on test apphost
* adds copyright notice to multiple files and removes unnecessary using directives
* Update dotnet/aspire-integration/Aspire.Hosting.AgentFramework.DevUI/DevUIAggregatorHostedService.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update dotnet/aspire-integration/Aspire.Hosting.AgentFramework.DevUI/DevUIAggregatorHostedService.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update dotnet/tests/Aspire.Hosting.AgentFramework.DevUI.UnitTests/Aspire.Hosting.AgentFramework.DevUI.UnitTests.csproj
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update dotnet/samples/DevUIIntegration/DevUIIntegration.AppHost/DevUIIntegration.AppHost.csproj
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update dotnet/aspire-integration/Aspire.Hosting.AgentFramework.DevUI/DevUIAggregatorHostedService.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Refactor project files to use TargetFrameworks instead of TargetFramework for multi-targeting support; add optional port property to DevUIResource class.
* Add unit tests for DevUIAggregatorHostedService; refactor project files for TargetFrameworks support
* Refactor project files to use TargetFrameworks for multi-targeting support in DevUIIntegration samples
* Remove unnecessary using directive for Aspire.Hosting in DevUIAggregatorHostedServiceTests
* merge
* fixes Conversation routing for non-first backends
* add documentation for devui integration sample
* update project references in solution file for improved integration
* fixes package versions post merge
* move Aspire.Hosting.AgentFramework.DevUI to dotnet/src
Move the project from aspire-integration/ to src/ to be consistent
with the location of all other projects in the repo.
* move DevUI sample to samples/05-end-to-end/DevUIAspireIntegration
Move the sample from samples/DevUIIntegration/ to
samples/05-end-to-end/DevUIAspireIntegration/ to match the location
of other end-to-end samples.
* remove unnecessary net472 framework condition from sample csproj files
These projects only target net10.0, so the
Condition="'$(TargetFramework)' != 'net472'" on ItemGroup is unnecessary.
* update sample model name from gpt-4.1 to gpt-5.4
Use a more up-to-date model name in the DevUI integration samples.
* Revert "remove unnecessary net472 framework condition from sample csproj files"
This reverts commit 08cf41253b.
* fix: use TargetFrameworks to override multi-targeting from Directory.Build.props
The parent Directory.Build.props sets TargetFrameworks to net10.0;net472,
which overrides the singular TargetFramework in each csproj. Use the plural
TargetFrameworks property set to net10.0 only to properly override it, and
remove the now-unnecessary net472 condition on ItemGroup.
* fixes aspire config
* fix: update Microsoft.Extensions packages to version 10.0.1
* Address Copilot review feedback on DevUI Aspire integration
- Fix request body dropping in ProxyConversationsAsync: always read the
body when ContentLength > 0 before routing, then pass it through to
all proxy calls (previously null was passed when backend was resolved
from query param or conversation map)
- Fix resource leak: dispose aggregator on startup failure in catch block
- Fix XML docs: accurately describe embedded resource serving behavior
- Remove reflection from DevUIResourceTests (InternalsVisibleTo already set)
- Make sensitive telemetry conditional on Development environment in samples
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: update chat client version to gpt41 in both EditorAgent and WriterAgent
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Roger Barreto <19890735+rogerbarreto@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
168 lines
4.9 KiB
C#
168 lines
4.9 KiB
C#
// Copyright (c) Microsoft. All rights reserved.
|
|
|
|
using System;
|
|
using Aspire.Hosting.ApplicationModel;
|
|
using Moq;
|
|
|
|
namespace Aspire.Hosting.AgentFramework.DevUI.UnitTests;
|
|
|
|
/// <summary>
|
|
/// Unit tests for the <see cref="AgentServiceAnnotation"/> class.
|
|
/// </summary>
|
|
public class AgentServiceAnnotationTests
|
|
{
|
|
#region Constructor Validation Tests
|
|
|
|
/// <summary>
|
|
/// Verifies that passing null for agentService throws ArgumentNullException.
|
|
/// </summary>
|
|
[Fact]
|
|
public void Constructor_NullAgentService_ThrowsArgumentNullException()
|
|
{
|
|
// Act & Assert
|
|
Assert.Throws<ArgumentNullException>(() => new AgentServiceAnnotation(null!));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Verifies that a valid agentService can be used to create the annotation.
|
|
/// </summary>
|
|
[Fact]
|
|
public void Constructor_ValidAgentService_CreatesAnnotation()
|
|
{
|
|
// Arrange
|
|
var mockResource = new Mock<IResource>();
|
|
mockResource.Setup(r => r.Name).Returns("test-service");
|
|
|
|
// Act
|
|
var annotation = new AgentServiceAnnotation(mockResource.Object);
|
|
|
|
// Assert
|
|
Assert.NotNull(annotation);
|
|
Assert.Same(mockResource.Object, annotation.AgentService);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Property Tests
|
|
|
|
/// <summary>
|
|
/// Verifies that AgentService property returns the value passed to constructor.
|
|
/// </summary>
|
|
[Fact]
|
|
public void AgentService_ReturnsConstructorValue()
|
|
{
|
|
// Arrange
|
|
var mockResource = new Mock<IResource>();
|
|
mockResource.Setup(r => r.Name).Returns("my-service");
|
|
|
|
// Act
|
|
var annotation = new AgentServiceAnnotation(mockResource.Object);
|
|
|
|
// Assert
|
|
Assert.Same(mockResource.Object, annotation.AgentService);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Verifies that EntityIdPrefix returns null when not specified.
|
|
/// </summary>
|
|
[Fact]
|
|
public void EntityIdPrefix_NotSpecified_ReturnsNull()
|
|
{
|
|
// Arrange
|
|
var mockResource = new Mock<IResource>();
|
|
mockResource.Setup(r => r.Name).Returns("test-service");
|
|
|
|
// Act
|
|
var annotation = new AgentServiceAnnotation(mockResource.Object);
|
|
|
|
// Assert
|
|
Assert.Null(annotation.EntityIdPrefix);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Verifies that EntityIdPrefix returns the value passed to constructor.
|
|
/// </summary>
|
|
[Fact]
|
|
public void EntityIdPrefix_Specified_ReturnsValue()
|
|
{
|
|
// Arrange
|
|
var mockResource = new Mock<IResource>();
|
|
mockResource.Setup(r => r.Name).Returns("test-service");
|
|
|
|
// Act
|
|
var annotation = new AgentServiceAnnotation(mockResource.Object, entityIdPrefix: "custom-prefix");
|
|
|
|
// Assert
|
|
Assert.Equal("custom-prefix", annotation.EntityIdPrefix);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Verifies that Agents returns empty collection when not specified.
|
|
/// </summary>
|
|
[Fact]
|
|
public void Agents_NotSpecified_ReturnsEmptyCollection()
|
|
{
|
|
// Arrange
|
|
var mockResource = new Mock<IResource>();
|
|
mockResource.Setup(r => r.Name).Returns("test-service");
|
|
|
|
// Act
|
|
var annotation = new AgentServiceAnnotation(mockResource.Object);
|
|
|
|
// Assert
|
|
Assert.NotNull(annotation.Agents);
|
|
Assert.Empty(annotation.Agents);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Verifies that Agents returns the list passed to constructor.
|
|
/// </summary>
|
|
[Fact]
|
|
public void Agents_Specified_ReturnsValue()
|
|
{
|
|
// Arrange
|
|
var mockResource = new Mock<IResource>();
|
|
mockResource.Setup(r => r.Name).Returns("test-service");
|
|
var agents = new[] { new AgentEntityInfo("agent1"), new AgentEntityInfo("agent2") };
|
|
|
|
// Act
|
|
var annotation = new AgentServiceAnnotation(mockResource.Object, agents: agents);
|
|
|
|
// Assert
|
|
Assert.Equal(2, annotation.Agents.Count);
|
|
Assert.Equal("agent1", annotation.Agents[0].Id);
|
|
Assert.Equal("agent2", annotation.Agents[1].Id);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Full Constructor Tests
|
|
|
|
/// <summary>
|
|
/// Verifies that all constructor parameters are correctly stored.
|
|
/// </summary>
|
|
[Fact]
|
|
public void Constructor_AllParameters_SetsAllProperties()
|
|
{
|
|
// Arrange
|
|
var mockResource = new Mock<IResource>();
|
|
mockResource.Setup(r => r.Name).Returns("full-service");
|
|
var agents = new[] { new AgentEntityInfo("writer", "Writes stories") };
|
|
|
|
// Act
|
|
var annotation = new AgentServiceAnnotation(
|
|
mockResource.Object,
|
|
entityIdPrefix: "writer-backend",
|
|
agents: agents);
|
|
|
|
// Assert
|
|
Assert.Same(mockResource.Object, annotation.AgentService);
|
|
Assert.Equal("writer-backend", annotation.EntityIdPrefix);
|
|
Assert.Single(annotation.Agents);
|
|
Assert.Equal("writer", annotation.Agents[0].Id);
|
|
Assert.Equal("Writes stories", annotation.Agents[0].Description);
|
|
}
|
|
|
|
#endregion
|
|
}
|