From a01e3f14b2a352ca5768945efaad607f8cccfd84 Mon Sep 17 00:00:00 2001 From: alliscode Date: Tue, 21 Apr 2026 11:56:41 -0700 Subject: [PATCH] Split Foundry into stable V1 and preview Hosting package Extract hosted agent functionality from Microsoft.Agents.AI.Foundry into a new Microsoft.Agents.AI.Foundry.Hosting preview package. This resolves NU5104 build errors caused by the stable Foundry package depending on prerelease Azure SDK packages (Azure.AI.AgentServer.Responses, Azure.AI.Projects beta). Changes: - Create Microsoft.Agents.AI.Foundry.Hosting with VersionSuffix=preview, targeting .NET Core only (net8.0/9.0/10.0) - Move all Hosting/ source files to the new project - Move ToolboxRecord/ToolboxVersion overloads to FoundryAIToolExtensions - Revert Azure.AI.Projects to 2.0.0 in Directory.Packages.props; Hosting uses VersionOverride for 2.1.0-beta.1 - Clean V1 Foundry csproj: remove beta deps, ASP.NET Core ref, hosting conditionals - Update 8 hosted agent sample projects to reference Foundry.Hosting - Split unit tests: ToolboxRecord/ToolboxVersion tests moved to Hosting/ - Add Foundry.Hosting to solution file Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- dotnet/Directory.Packages.props | 2 +- dotnet/agent-framework-dotnet.slnx | 1 + .../HostedChatClientAgent.csproj | 2 + .../HostedFoundryAgent.csproj | 2 + .../Hosted-LocalTools/HostedLocalTools.csproj | 4 +- .../Hosted-McpTools/HostedMcpTools.csproj | 4 +- .../Hosted-TextRag/HostedTextRag.csproj | 4 +- .../Hosted-Toolbox/HostedToolbox.csproj | 4 +- .../HostedWorkflowHandoff.csproj | 2 + .../HostedWorkflowSimple.csproj | 4 +- .../AgentFrameworkResponseHandler.cs | 0 .../AgentSessionStore.cs | 0 .../ConsentAwareMcpClientAIFunction.cs | 0 .../FoundryAIToolExtensions.cs | 48 ++++++++++++ .../FoundryToolboxBearerTokenHandler.cs | 0 .../FoundryToolboxOptions.cs | 0 .../FoundryToolboxService.cs | 0 .../InMemoryAgentSessionStore.cs | 0 .../InputConverter.cs | 0 .../McpConsentContext.cs | 0 ...Microsoft.Agents.AI.Foundry.Hosting.csproj | 50 ++++++++++++ .../OutputConverter.cs | 0 .../ServiceCollectionExtensions.cs | 0 .../FoundryAITool.cs | 34 --------- .../Microsoft.Agents.AI.Foundry.csproj | 23 +----- .../HostedMcpToolboxAIToolTests.cs | 67 ---------------- .../Hosting/FoundryAIToolExtensionsTests.cs | 76 +++++++++++++++++++ ...crosoft.Agents.AI.Foundry.UnitTests.csproj | 12 ++- 28 files changed, 208 insertions(+), 131 deletions(-) rename dotnet/src/{Microsoft.Agents.AI.Foundry/Hosting => Microsoft.Agents.AI.Foundry.Hosting}/AgentFrameworkResponseHandler.cs (100%) rename dotnet/src/{Microsoft.Agents.AI.Foundry/Hosting => Microsoft.Agents.AI.Foundry.Hosting}/AgentSessionStore.cs (100%) rename dotnet/src/{Microsoft.Agents.AI.Foundry/Hosting => Microsoft.Agents.AI.Foundry.Hosting}/ConsentAwareMcpClientAIFunction.cs (100%) create mode 100644 dotnet/src/Microsoft.Agents.AI.Foundry.Hosting/FoundryAIToolExtensions.cs rename dotnet/src/{Microsoft.Agents.AI.Foundry/Hosting => Microsoft.Agents.AI.Foundry.Hosting}/FoundryToolboxBearerTokenHandler.cs (100%) rename dotnet/src/{Microsoft.Agents.AI.Foundry/Hosting => Microsoft.Agents.AI.Foundry.Hosting}/FoundryToolboxOptions.cs (100%) rename dotnet/src/{Microsoft.Agents.AI.Foundry/Hosting => Microsoft.Agents.AI.Foundry.Hosting}/FoundryToolboxService.cs (100%) rename dotnet/src/{Microsoft.Agents.AI.Foundry/Hosting => Microsoft.Agents.AI.Foundry.Hosting}/InMemoryAgentSessionStore.cs (100%) rename dotnet/src/{Microsoft.Agents.AI.Foundry/Hosting => Microsoft.Agents.AI.Foundry.Hosting}/InputConverter.cs (100%) rename dotnet/src/{Microsoft.Agents.AI.Foundry/Hosting => Microsoft.Agents.AI.Foundry.Hosting}/McpConsentContext.cs (100%) create mode 100644 dotnet/src/Microsoft.Agents.AI.Foundry.Hosting/Microsoft.Agents.AI.Foundry.Hosting.csproj rename dotnet/src/{Microsoft.Agents.AI.Foundry/Hosting => Microsoft.Agents.AI.Foundry.Hosting}/OutputConverter.cs (100%) rename dotnet/src/{Microsoft.Agents.AI.Foundry/Hosting => Microsoft.Agents.AI.Foundry.Hosting}/ServiceCollectionExtensions.cs (100%) create mode 100644 dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/Hosting/FoundryAIToolExtensionsTests.cs diff --git a/dotnet/Directory.Packages.props b/dotnet/Directory.Packages.props index 40116c26d6..46e0d61924 100644 --- a/dotnet/Directory.Packages.props +++ b/dotnet/Directory.Packages.props @@ -25,7 +25,7 @@ - + diff --git a/dotnet/agent-framework-dotnet.slnx b/dotnet/agent-framework-dotnet.slnx index d7bd80d50e..b3a95ea1f6 100644 --- a/dotnet/agent-framework-dotnet.slnx +++ b/dotnet/agent-framework-dotnet.slnx @@ -542,6 +542,7 @@ + diff --git a/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-ChatClientAgent/HostedChatClientAgent.csproj b/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-ChatClientAgent/HostedChatClientAgent.csproj index b1fe8d3e3c..0bccd317f6 100644 --- a/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-ChatClientAgent/HostedChatClientAgent.csproj +++ b/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-ChatClientAgent/HostedChatClientAgent.csproj @@ -17,11 +17,13 @@ + + + diff --git a/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-McpTools/HostedMcpTools.csproj b/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-McpTools/HostedMcpTools.csproj index 9ce19dd540..359e8a35bb 100644 --- a/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-McpTools/HostedMcpTools.csproj +++ b/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-McpTools/HostedMcpTools.csproj @@ -11,7 +11,7 @@ - + @@ -20,11 +20,13 @@ + diff --git a/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-TextRag/HostedTextRag.csproj b/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-TextRag/HostedTextRag.csproj index 9a22108c7b..ed24c32eea 100644 --- a/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-TextRag/HostedTextRag.csproj +++ b/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-TextRag/HostedTextRag.csproj @@ -11,7 +11,7 @@ - + @@ -19,12 +19,14 @@ + diff --git a/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-Toolbox/HostedToolbox.csproj b/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-Toolbox/HostedToolbox.csproj index 1e3c4e10c2..458518c67b 100644 --- a/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-Toolbox/HostedToolbox.csproj +++ b/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-Toolbox/HostedToolbox.csproj @@ -11,7 +11,7 @@ - + @@ -19,11 +19,13 @@ + diff --git a/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-Workflow-Handoff/HostedWorkflowHandoff.csproj b/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-Workflow-Handoff/HostedWorkflowHandoff.csproj index 625aac0329..d6b68609fb 100644 --- a/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-Workflow-Handoff/HostedWorkflowHandoff.csproj +++ b/dotnet/samples/04-hosting/FoundryHostedAgents/responses/Hosted-Workflow-Handoff/HostedWorkflowHandoff.csproj @@ -23,6 +23,7 @@ + @@ -31,6 +32,7 @@ + @@ -26,6 +27,7 @@ + false + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dotnet/src/Microsoft.Agents.AI.Foundry/Hosting/OutputConverter.cs b/dotnet/src/Microsoft.Agents.AI.Foundry.Hosting/OutputConverter.cs similarity index 100% rename from dotnet/src/Microsoft.Agents.AI.Foundry/Hosting/OutputConverter.cs rename to dotnet/src/Microsoft.Agents.AI.Foundry.Hosting/OutputConverter.cs diff --git a/dotnet/src/Microsoft.Agents.AI.Foundry/Hosting/ServiceCollectionExtensions.cs b/dotnet/src/Microsoft.Agents.AI.Foundry.Hosting/ServiceCollectionExtensions.cs similarity index 100% rename from dotnet/src/Microsoft.Agents.AI.Foundry/Hosting/ServiceCollectionExtensions.cs rename to dotnet/src/Microsoft.Agents.AI.Foundry.Hosting/ServiceCollectionExtensions.cs diff --git a/dotnet/src/Microsoft.Agents.AI.Foundry/FoundryAITool.cs b/dotnet/src/Microsoft.Agents.AI.Foundry/FoundryAITool.cs index d9ecb851e3..a235cef664 100644 --- a/dotnet/src/Microsoft.Agents.AI.Foundry/FoundryAITool.cs +++ b/dotnet/src/Microsoft.Agents.AI.Foundry/FoundryAITool.cs @@ -122,40 +122,6 @@ public static class FoundryAITool 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/src/Microsoft.Agents.AI.Foundry/Microsoft.Agents.AI.Foundry.csproj b/dotnet/src/Microsoft.Agents.AI.Foundry/Microsoft.Agents.AI.Foundry.csproj index 003a50ecf7..d223f25677 100644 --- a/dotnet/src/Microsoft.Agents.AI.Foundry/Microsoft.Agents.AI.Foundry.csproj +++ b/dotnet/src/Microsoft.Agents.AI.Foundry/Microsoft.Agents.AI.Foundry.csproj @@ -3,8 +3,7 @@ true true - $(NoWarn);OPENAI001;MEAI001;NU1903 - false + $(NoWarn);OPENAI001;MEAI001 @@ -21,10 +20,6 @@ true - - - - @@ -34,12 +29,6 @@ - - - - - - @@ -56,11 +45,6 @@ - - - - - Microsoft Agent Framework for Foundry Agents @@ -72,9 +56,4 @@ - - - - - diff --git a/dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/HostedMcpToolboxAIToolTests.cs b/dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/HostedMcpToolboxAIToolTests.cs index 640ef69008..d6fbd53df5 100644 --- a/dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/HostedMcpToolboxAIToolTests.cs +++ b/dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/HostedMcpToolboxAIToolTests.cs @@ -93,71 +93,4 @@ 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!)); - } } diff --git a/dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/Hosting/FoundryAIToolExtensionsTests.cs b/dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/Hosting/FoundryAIToolExtensionsTests.cs new file mode 100644 index 0000000000..f083a9946e --- /dev/null +++ b/dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/Hosting/FoundryAIToolExtensionsTests.cs @@ -0,0 +1,76 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System; +using Microsoft.Agents.AI.Foundry.Hosting; + +namespace Microsoft.Agents.AI.Foundry.UnitTests.Hosting; + +public class FoundryAIToolExtensionsTests +{ + [Fact] + public void CreateHostedMcpToolbox_FromToolboxRecord_UsesNameAndDefaultVersion() + { + var record = Azure.AI.Projects.Agents.ProjectsAgentsModelFactory.ToolboxRecord( + id: "tbx-123", + name: "calendar-tools", + defaultVersion: "v2"); + + var tool = FoundryAIToolExtensions.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 CreateHostedMcpToolbox_FromToolboxRecord_NullDefaultVersionOmitsQuery() + { + var record = Azure.AI.Projects.Agents.ProjectsAgentsModelFactory.ToolboxRecord( + id: "tbx-abc", + name: "finance-tools", + defaultVersion: null); + + var tool = FoundryAIToolExtensions.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 CreateHostedMcpToolbox_FromToolboxRecord_Null_Throws() + { + Assert.Throws( + () => FoundryAIToolExtensions.CreateHostedMcpToolbox((Azure.AI.Projects.Agents.ToolboxRecord)null!)); + } + + [Fact] + public void 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 = FoundryAIToolExtensions.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 CreateHostedMcpToolbox_FromToolboxVersion_Null_Throws() + { + Assert.Throws( + () => FoundryAIToolExtensions.CreateHostedMcpToolbox((Azure.AI.Projects.Agents.ToolboxVersion)null!)); + } +} diff --git a/dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/Microsoft.Agents.AI.Foundry.UnitTests.csproj b/dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/Microsoft.Agents.AI.Foundry.UnitTests.csproj index aa291855d8..2cead6029a 100644 --- a/dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/Microsoft.Agents.AI.Foundry.UnitTests.csproj +++ b/dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/Microsoft.Agents.AI.Foundry.UnitTests.csproj @@ -2,16 +2,20 @@ false - $(NoWarn);NU1605 + $(NoWarn);NU1605;NU1903 - + + + + + @@ -26,6 +30,10 @@ + + + +