mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
b0613a8ceb
* Bump Azure.AI.Projects to 2.0.0 GA - Update Azure.AI.Projects from 2.0.0-beta.2 to 2.0.0 in CPM - Update Azure.Identity from 1.19.0 to 1.20.0 (transitive dep) - Update System.ClientModel from 1.9.0 to 1.10.0 (transitive dep) - Rename types per Azure.AI.Projects.Agents 2.0.0 breaking changes: - AgentVersion -> ProjectsAgentVersion - AgentRecord -> ProjectsAgentRecord - AgentDefinition -> ProjectsAgentDefinition - AgentVersionCreationOptions -> ProjectsAgentVersionCreationOptions - PromptAgentDefinition -> DeclarativeAgentDefinition - AgentTool -> ProjectsAgentTool - AgentsClient -> AgentAdministrationClient - .Agents property -> .AgentAdministrationClient - Add using Azure.AI.Projects.Memory namespace (types moved) - Update AGENTS.md with BOM and output capture conventions * Address PR review feedback - Rename AIProjectClient parameter to aiProjectClient in AsChatClientAgent overloads - Fix XML doc: ProjectsAgentTool namespace from Azure.AI.Projects.OpenAI to Azure.AI.Projects.Agents - Rename test method to reflect DeclarativeAgentDefinition terminology
104 lines
5.5 KiB
C#
104 lines
5.5 KiB
C#
// Copyright (c) Microsoft. All rights reserved.
|
|
|
|
// This sample shows how to create and use a simple AI agent with Microsoft Foundry Agents as the backend, that uses a Hosted MCP Tool.
|
|
// In this case the Microsoft Foundry Agents service will invoke any MCP tools as required. MCP tools are not invoked by the Agent Framework.
|
|
// The sample first shows how to use MCP tools with auto approval, and then how to set up a tool that requires approval before it can be invoked and how to approve such a tool.
|
|
|
|
using Azure.AI.Projects;
|
|
using Azure.AI.Projects.Agents;
|
|
using Azure.Identity;
|
|
using Microsoft.Agents.AI;
|
|
using Microsoft.Extensions.AI;
|
|
using OpenAI.Responses;
|
|
|
|
var endpoint = Environment.GetEnvironmentVariable("AZURE_AI_PROJECT_ENDPOINT") ?? throw new InvalidOperationException("AZURE_AI_PROJECT_ENDPOINT is not set.");
|
|
var model = Environment.GetEnvironmentVariable("AZURE_AI_MODEL_DEPLOYMENT_NAME") ?? "gpt-4.1-mini";
|
|
|
|
// Get a client to create/retrieve server side agents with.
|
|
// 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.
|
|
var aiProjectClient = new AIProjectClient(new Uri(endpoint), new DefaultAzureCredential());
|
|
|
|
// **** MCP Tool with Auto Approval ****
|
|
// *************************************
|
|
|
|
// Create an MCP tool definition that the agent can use.
|
|
// In this case we allow the tool to always be called without approval.
|
|
var mcpTool = ResponseTool.CreateMcpTool(
|
|
serverLabel: "microsoft_learn",
|
|
serverUri: new Uri("https://learn.microsoft.com/api/mcp"),
|
|
toolCallApprovalPolicy: new McpToolCallApprovalPolicy(GlobalMcpToolCallApprovalPolicy.NeverRequireApproval));
|
|
|
|
// Create a server side agent with the mcp tool, and expose it as an AIAgent.
|
|
ProjectsAgentVersion agentVersion = await aiProjectClient.AgentAdministrationClient.CreateAgentVersionAsync(
|
|
"MicrosoftLearnAgent",
|
|
new ProjectsAgentVersionCreationOptions(
|
|
new DeclarativeAgentDefinition(model: model)
|
|
{
|
|
Instructions = "You answer questions by searching the Microsoft Learn content only.",
|
|
Tools = { mcpTool }
|
|
}));
|
|
|
|
AIAgent agent = aiProjectClient.AsAIAgent(agentVersion);
|
|
|
|
// You can then invoke the agent like any other AIAgent.
|
|
AgentSession session = await agent.CreateSessionAsync();
|
|
Console.WriteLine(await agent.RunAsync("Please summarize the Azure AI Agent documentation related to MCP Tool calling?", session));
|
|
|
|
// Cleanup for sample purposes.
|
|
aiProjectClient.AgentAdministrationClient.DeleteAgent(agent.Name);
|
|
|
|
// **** MCP Tool with Approval Required ****
|
|
// *****************************************
|
|
|
|
// Create an MCP tool definition that the agent can use.
|
|
// In this case we require approval before the tool can be called.
|
|
var mcpToolWithApproval = ResponseTool.CreateMcpTool(
|
|
serverLabel: "microsoft_learn",
|
|
serverUri: new Uri("https://learn.microsoft.com/api/mcp"),
|
|
allowedTools: new McpToolFilter() { ToolNames = { "microsoft_docs_search" } },
|
|
toolCallApprovalPolicy: new McpToolCallApprovalPolicy(GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval));
|
|
|
|
// Create an agent with the MCP tool that requires approval.
|
|
ProjectsAgentVersion agentVersionWithApproval = await aiProjectClient.AgentAdministrationClient.CreateAgentVersionAsync(
|
|
"MicrosoftLearnAgentWithApproval",
|
|
new ProjectsAgentVersionCreationOptions(
|
|
new DeclarativeAgentDefinition(model: model)
|
|
{
|
|
Instructions = "You answer questions by searching the Microsoft Learn content only.",
|
|
Tools = { mcpToolWithApproval }
|
|
}));
|
|
|
|
AIAgent agentWithRequiredApproval = aiProjectClient.AsAIAgent(agentVersionWithApproval);
|
|
|
|
// You can then invoke the agent like any other AIAgent.
|
|
// For simplicity, we are assuming here that only mcp tool approvals are pending.
|
|
AgentSession sessionWithRequiredApproval = await agentWithRequiredApproval.CreateSessionAsync();
|
|
AgentResponse response = await agentWithRequiredApproval.RunAsync("Please summarize the Azure AI Agent documentation related to MCP Tool calling?", sessionWithRequiredApproval);
|
|
List<ToolApprovalRequestContent> approvalRequests = response.Messages.SelectMany(m => m.Contents).OfType<ToolApprovalRequestContent>().ToList();
|
|
|
|
while (approvalRequests.Count > 0)
|
|
{
|
|
// Ask the user to approve each MCP call request.
|
|
List<ChatMessage> userInputResponses = approvalRequests
|
|
.ConvertAll(approvalRequest =>
|
|
{
|
|
McpServerToolCallContent mcpToolCall = (McpServerToolCallContent)approvalRequest.ToolCall!;
|
|
Console.WriteLine($"""
|
|
The agent would like to invoke the following MCP Tool, please reply Y to approve.
|
|
ServerName: {mcpToolCall.ServerName}
|
|
Name: {mcpToolCall.Name}
|
|
Arguments: {string.Join(", ", mcpToolCall.Arguments?.Select(x => $"{x.Key}: {x.Value}") ?? [])}
|
|
""");
|
|
return new ChatMessage(ChatRole.User, [approvalRequest.CreateResponse(Console.ReadLine()?.Equals("Y", StringComparison.OrdinalIgnoreCase) ?? false)]);
|
|
});
|
|
|
|
// Pass the user input responses back to the agent for further processing.
|
|
response = await agentWithRequiredApproval.RunAsync(userInputResponses, sessionWithRequiredApproval);
|
|
|
|
approvalRequests = response.Messages.SelectMany(m => m.Contents).OfType<ToolApprovalRequestContent>().ToList();
|
|
}
|
|
|
|
Console.WriteLine($"\nAgent: {response}");
|