From acf8fa47c12adab4dfe1ce7ff65805f5dd622854 Mon Sep 17 00:00:00 2001 From: Roger Barreto <19890735+rogerbarreto@users.noreply.github.com> Date: Fri, 17 Apr 2026 23:34:51 +0100 Subject: [PATCH] Bump Azure.AI.Projects to 2.1.0-alpha; add ToolboxRecord/ToolboxVersion factory overloads + tests --- dotnet/Directory.Packages.props | 2 +- dotnet/nuget.config | 6 ++ .../FoundryAITool.cs | 42 +++++++++--- .../HostedMcpToolboxAIToolTests.cs | 67 +++++++++++++++++++ 4 files changed, 108 insertions(+), 9 deletions(-) diff --git a/dotnet/Directory.Packages.props b/dotnet/Directory.Packages.props index ce1bbffa0a..8b7ef32ccf 100644 --- a/dotnet/Directory.Packages.props +++ b/dotnet/Directory.Packages.props @@ -22,7 +22,7 @@ - + diff --git a/dotnet/nuget.config b/dotnet/nuget.config index 76d943ce16..2316305f8e 100644 --- a/dotnet/nuget.config +++ b/dotnet/nuget.config @@ -3,10 +3,16 @@ + + + + + + \ No newline at end of file diff --git a/dotnet/src/Microsoft.Agents.AI.Foundry/FoundryAITool.cs b/dotnet/src/Microsoft.Agents.AI.Foundry/FoundryAITool.cs index a16b205e4f..d9ecb851e3 100644 --- a/dotnet/src/Microsoft.Agents.AI.Foundry/FoundryAITool.cs +++ b/dotnet/src/Microsoft.Agents.AI.Foundry/FoundryAITool.cs @@ -119,17 +119,43 @@ public static class FoundryAITool /// The Foundry toolbox name. /// Optional pinned toolbox version. When , the project's default version is used. /// An marker backed by . - /// - /// - /// Consumers who already hold a ToolboxRecord or ToolboxVersion from - /// Azure.AI.Projects.Agents can pass record.Name together with - /// record.DefaultVersion (or version.Name/version.Version) to this - /// factory. - /// - /// public static AITool CreateHostedMcpToolbox(string toolboxName, string? version = null) => new HostedMcpToolboxAITool(toolboxName, version); + /// + /// Creates an marker from a retrieved + /// from AIProjectClient. Uses and + /// . + /// + /// The toolbox record. + /// An marker backed by . + public static AITool CreateHostedMcpToolbox(ToolboxRecord toolbox) + { + if (toolbox is null) + { + throw new ArgumentNullException(nameof(toolbox)); + } + + return new HostedMcpToolboxAITool(toolbox.Name, toolbox.DefaultVersion); + } + + /// + /// Creates an marker from a specific + /// retrieved from AIProjectClient. Uses and + /// . + /// + /// The toolbox version. + /// An marker backed by . + public static AITool CreateHostedMcpToolbox(ToolboxVersion toolboxVersion) + { + if (toolboxVersion is null) + { + throw new ArgumentNullException(nameof(toolboxVersion)); + } + + return new HostedMcpToolboxAITool(toolboxVersion.Name, toolboxVersion.Version); + } + // --- OpenAI SDK ResponseTool factories --- /// diff --git a/dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/HostedMcpToolboxAIToolTests.cs b/dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/HostedMcpToolboxAIToolTests.cs index d6fbd53df5..640ef69008 100644 --- a/dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/HostedMcpToolboxAIToolTests.cs +++ b/dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/HostedMcpToolboxAIToolTests.cs @@ -93,4 +93,71 @@ public class HostedMcpToolboxAIToolTests Assert.Equal("my-toolbox", marker.ToolboxName); Assert.Equal("v1", marker.Version); } + + [Fact] + public void FoundryAITool_CreateHostedMcpToolbox_FromToolboxRecord_UsesNameAndDefaultVersion() + { + var record = Azure.AI.Projects.Agents.ProjectsAgentsModelFactory.ToolboxRecord( + id: "tbx-123", + name: "calendar-tools", + defaultVersion: "v2"); + + var tool = FoundryAITool.CreateHostedMcpToolbox(record); + + var marker = Assert.IsType(tool); + Assert.Equal("calendar-tools", marker.ToolboxName); + Assert.Equal("v2", marker.Version); + Assert.Equal("foundry-toolbox://calendar-tools?version=v2", marker.ServerAddress); + } + + [Fact] + public void FoundryAITool_CreateHostedMcpToolbox_FromToolboxRecord_NullDefaultVersionOmitsQuery() + { + var record = Azure.AI.Projects.Agents.ProjectsAgentsModelFactory.ToolboxRecord( + id: "tbx-abc", + name: "finance-tools", + defaultVersion: null); + + var tool = FoundryAITool.CreateHostedMcpToolbox(record); + + var marker = Assert.IsType(tool); + Assert.Equal("finance-tools", marker.ToolboxName); + Assert.Null(marker.Version); + Assert.Equal("foundry-toolbox://finance-tools", marker.ServerAddress); + } + + [Fact] + public void FoundryAITool_CreateHostedMcpToolbox_FromToolboxRecord_Null_Throws() + { + Assert.Throws( + () => FoundryAITool.CreateHostedMcpToolbox((Azure.AI.Projects.Agents.ToolboxRecord)null!)); + } + + [Fact] + public void FoundryAITool_CreateHostedMcpToolbox_FromToolboxVersion_UsesNameAndVersion() + { + var version = Azure.AI.Projects.Agents.ProjectsAgentsModelFactory.ToolboxVersion( + metadata: null, + id: "ver-1", + name: "hr-tools", + version: "2025-09-01", + description: "HR toolbox", + createdAt: DateTimeOffset.UtcNow, + tools: null, + policies: null); + + var tool = FoundryAITool.CreateHostedMcpToolbox(version); + + var marker = Assert.IsType(tool); + Assert.Equal("hr-tools", marker.ToolboxName); + Assert.Equal("2025-09-01", marker.Version); + Assert.Equal("foundry-toolbox://hr-tools?version=2025-09-01", marker.ServerAddress); + } + + [Fact] + public void FoundryAITool_CreateHostedMcpToolbox_FromToolboxVersion_Null_Throws() + { + Assert.Throws( + () => FoundryAITool.CreateHostedMcpToolbox((Azure.AI.Projects.Agents.ToolboxVersion)null!)); + } }