From 6fbd0828d83dab25119db2e14ceeb2b15adb51dd Mon Sep 17 00:00:00 2001 From: Seaic Mac Murchadha Date: Thu, 10 Sep 2026 21:37:01 +0100 Subject: [PATCH 1/4] Add Foundry Agent Skills step --- .../Agent_Step27_AgentSkills.csproj | 20 +++++ .../Agent_Step27_AgentSkills/Program.cs | 82 +++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Agent_Step27_AgentSkills.csproj create mode 100644 dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Program.cs diff --git a/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Agent_Step27_AgentSkills.csproj b/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Agent_Step27_AgentSkills.csproj new file mode 100644 index 00000000000..6bbb5e7d354 --- /dev/null +++ b/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Agent_Step27_AgentSkills.csproj @@ -0,0 +1,20 @@ + + + + Exe + net10.0 + + enable + enable + + + + + + + + + + + + diff --git a/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Program.cs b/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Program.cs new file mode 100644 index 00000000000..fb6392e4575 --- /dev/null +++ b/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Program.cs @@ -0,0 +1,82 @@ +// Copyright (c) Microsoft. All rights reserved. + +// This sample demonstrates how to use Agent Skills with a FoundryAgent backed by a +// server-side versioned agent. + +using Azure.AI.Projects; +using Azure.AI.Projects.Agents; +using Azure.Identity; +using Microsoft.Agents.AI; +using Microsoft.Agents.AI.Foundry; +using Microsoft.Extensions.AI; + +// --- Configuration --- +string endpoint = Environment.GetEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT") + ?? throw new InvalidOperationException("FOUNDRY_PROJECT_ENDPOINT is not set."); +string deploymentName = Environment.GetEnvironmentVariable("FOUNDRY_MODEL") ?? "gpt-5.4-mini"; + +const string AgentName = "AgentSkillsAgent"; + +// --- Define an Agent Skill --- +var supportSkill = new AgentInlineSkill( + name: "support-policy", + description: "Example support response-time policy.", + instructions: """ + Use this skill when answering questions about support response times or escalation. + + Read the response-times resource before answering the user. + """) + .AddResource( + "response-times", + """ + # Example Support Response Times + + - Severity 1: Initial response within 15 minutes. + - Severity 2: Initial response within 1 hour. + - Severity 3: Initial response within 4 hours. + + These values are illustrative, used only by this sample. + """); + +var skillsProvider = new AgentSkillsProvider(supportSkill); + +// WARNING: DefaultAzureCredential is convenient for development but requires careful consideration in production. +// In production, consider using a specific credential (e.g., ManagedIdentityCredential) to avoid +// latency issues, unintended credential probing, and potential security risks from fallback mechanisms. +AIProjectClient aiProjectClient = new(new Uri(endpoint), new DefaultAzureCredential()); + +// --- Create a server-side versioned Foundry agent --- +ProjectsAgentVersion agentVersion = await aiProjectClient.AgentAdministrationClient.CreateAgentVersionAsync( + AgentName, + new ProjectsAgentVersionCreationOptions( + new DeclarativeAgentDefinition(model: deploymentName) + { + Instructions = "You are a helpful support assistant. Use available skills when relevant.", + })); + +try +{ + FoundryAgent foundryAgent = aiProjectClient.AsAIAgent( + agentVersion, + tools: null, + clientFactory: inner => inner + .AsBuilder() + .UseAIContextProviders(skillsProvider) + .Build()); + + AIAgent agent = foundryAgent + .AsBuilder() + .UseToolApproval(new ToolApprovalAgentOptions + { + AutoApprovalRules = [AgentSkillsProvider.ReadOnlyToolsAutoApprovalRule], + }) + .Build(); + + Console.WriteLine(await agent.RunAsync( + "According to the support policy, how quickly should a Severity 1 incident receive an initial response?")); +} +finally +{ + // Cleanup: deletes the agent and all its versions. + await aiProjectClient.AgentAdministrationClient.DeleteAgentAsync(AgentName); +} From 9c40cc8f4497e48d6b3a95123afc6f18115fc3be Mon Sep 17 00:00:00 2001 From: Seaic Mac Murchadha Date: Thu, 10 Sep 2026 21:53:55 +0100 Subject: [PATCH 2/4] Add documentation for Foundry Agent Skills step --- dotnet/agent-framework-dotnet.slnx | 1 + .../Agent_Step27_AgentSkills/README.md | 30 +++++++++++++++++++ .../AgentProviders/foundry/README.md | 1 + 3 files changed, 32 insertions(+) create mode 100644 dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/README.md diff --git a/dotnet/agent-framework-dotnet.slnx b/dotnet/agent-framework-dotnet.slnx index 6f5fa9d46a6..23358028687 100644 --- a/dotnet/agent-framework-dotnet.slnx +++ b/dotnet/agent-framework-dotnet.slnx @@ -169,6 +169,7 @@ + diff --git a/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/README.md b/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/README.md new file mode 100644 index 00000000000..2fe4e6a0727 --- /dev/null +++ b/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/README.md @@ -0,0 +1,30 @@ +# Foundry Agent Skills + +This sample demonstrates how to use Agent Skills with a `FoundryAgent` backed by a +server-side versioned agent in Microsoft Foundry. + +## What this sample demonstrates + +- Creating a server-side versioned Foundry agent +- Defining an Agent Skill in code with `AgentInlineSkill` +- Injecting `AgentSkillsProvider` through the `clientFactory` +- Auto-approving read-only Agent Skills operations +- Invoking the agent and cleaning up the server-side agent + +## Prerequisites + +- A Microsoft Foundry project +- An authenticated Azure identity (for example, sign in with `az login`) + +Set the following environment variables: + +```powershell +$env:FOUNDRY_PROJECT_ENDPOINT="https://your-foundry-service.services.ai.azure.com/api/projects/your-foundry-project" +$env:FOUNDRY_MODEL="gpt-5.4-mini" +``` + +## Run the sample + +```powershell +dotnet run +``` \ No newline at end of file diff --git a/dotnet/samples/02-agents/AgentProviders/foundry/README.md b/dotnet/samples/02-agents/AgentProviders/foundry/README.md index eaae6be594f..e27fac10b09 100644 --- a/dotnet/samples/02-agents/AgentProviders/foundry/README.md +++ b/dotnet/samples/02-agents/AgentProviders/foundry/README.md @@ -75,6 +75,7 @@ Some samples require extra tool-specific environment variables. See each sample | [Code interpreter file download](./Agent_Step24_CodeInterpreterFileDownload/) | Download container files generated by code interpreter | | [Foundry toolbox via MCP](./Agent_Step25_FoundryToolboxMcp/README.md) | Use a Foundry Toolbox from a non-hosted agent via its MCP endpoint | | [Foundry toolbox MCP skills](./Agent_Step26_FoundryToolboxMcpSkills/README.md) | Use a Foundry Toolbox with MCP-based skills discovery (SEP-2640) via AIContextProviders | +| [Agent Skills](./Agent_Step27_AgentSkills/README.md) | Use Agent Skills with a server-side versioned Foundry agent | ## Running the samples From 91025ee3c1c76b5878fb97299193e761e5f6dac7 Mon Sep 17 00:00:00 2001 From: Seaic Mac Murchadha Date: Thu, 10 Sep 2026 22:01:17 +0100 Subject: [PATCH 3/4] Correct new file formatting --- .../Agent_Step27_AgentSkills/Agent_Step27_AgentSkills.csproj | 2 +- .../foundry/Agent_Step27_AgentSkills/Program.cs | 2 +- .../AgentProviders/foundry/Agent_Step27_AgentSkills/README.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Agent_Step27_AgentSkills.csproj b/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Agent_Step27_AgentSkills.csproj index 6bbb5e7d354..bfc47f94465 100644 --- a/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Agent_Step27_AgentSkills.csproj +++ b/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Agent_Step27_AgentSkills.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Program.cs b/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Program.cs index fb6392e4575..832a2971d6c 100644 --- a/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Program.cs +++ b/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Program.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft. All rights reserved. +// Copyright (c) Microsoft. All rights reserved. // This sample demonstrates how to use Agent Skills with a FoundryAgent backed by a // server-side versioned agent. diff --git a/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/README.md b/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/README.md index 2fe4e6a0727..c013bd2c015 100644 --- a/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/README.md +++ b/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/README.md @@ -1,4 +1,4 @@ -# Foundry Agent Skills +# Foundry Agent Skills This sample demonstrates how to use Agent Skills with a `FoundryAgent` backed by a server-side versioned agent in Microsoft Foundry. @@ -27,4 +27,4 @@ $env:FOUNDRY_MODEL="gpt-5.4-mini" ```powershell dotnet run -``` \ No newline at end of file +``` From 04ceb415fac04c7525d53c3a7121b033fc8fb036 Mon Sep 17 00:00:00 2001 From: Seaic Mac Murchadha Date: Fri, 11 Sep 2026 01:41:22 +0100 Subject: [PATCH 4/4] Use unique agent name for Foundry skills step --- .../foundry/Agent_Step27_AgentSkills/Program.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Program.cs b/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Program.cs index 832a2971d6c..bb21145b522 100644 --- a/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Program.cs +++ b/dotnet/samples/02-agents/AgentProviders/foundry/Agent_Step27_AgentSkills/Program.cs @@ -15,7 +15,7 @@ ?? throw new InvalidOperationException("FOUNDRY_PROJECT_ENDPOINT is not set."); string deploymentName = Environment.GetEnvironmentVariable("FOUNDRY_MODEL") ?? "gpt-5.4-mini"; -const string AgentName = "AgentSkillsAgent"; +string agentName = $"AgentSkillsAgent-{Guid.NewGuid():N}"; // --- Define an Agent Skill --- var supportSkill = new AgentInlineSkill( @@ -47,7 +47,7 @@ Read the response-times resource before answering the user. // --- Create a server-side versioned Foundry agent --- ProjectsAgentVersion agentVersion = await aiProjectClient.AgentAdministrationClient.CreateAgentVersionAsync( - AgentName, + agentName, new ProjectsAgentVersionCreationOptions( new DeclarativeAgentDefinition(model: deploymentName) { @@ -78,5 +78,5 @@ Read the response-times resource before answering the user. finally { // Cleanup: deletes the agent and all its versions. - await aiProjectClient.AgentAdministrationClient.DeleteAgentAsync(AgentName); + await aiProjectClient.AgentAdministrationClient.DeleteAgentAsync(agentName); }