Files
T
Roger BarretoandCopilot fdc6e68f58 .Net: Semantic Kernel -> Agent Framework - Migration/Samples Update (AF 1.0 Compatible) (#13852)
## Description

Updates the SK → Agent Framework migration document, samples, and bridge
code from AF preview (`1.0.0-preview.251009.1`) to GA (`1.0.0`).

### Breaking changes addressed

| Preview API | AF 1.0 GA | Scope |
|---|---|---|
| `AgentThread` | `AgentSession` | Core type rename |
| `GetNewThread()` | `CreateSessionAsync()` | Now async |
| `AgentRunResponse` | `AgentResponse` | Return type rename |
| `AgentRunResponseUpdate` | `AgentResponseUpdate` | Streaming type
rename |
| `CreateAIAgent()` | `AsAIAgent()` | Extension method rename |
| `AssistantClient.CreateAIAgentAsync()` | **Removed** | Redirect to
Responses API |
| `PersistentAgentsClient` | **Obsolete** | Use `AIProjectClient` via
`Microsoft.Agents.AI.Foundry` |
| `Microsoft.Agents.AI.AzureAI` | `Microsoft.Agents.AI.Foundry` |
Package rename |
| `InProcessExecution.StreamAsync` | `RunStreamingAsync` | Workflow API
|
| `AgentRunUpdateEvent` | `AgentResponseUpdateEvent` | Workflow event |
| `AIAgent.Id` (virtual) | `IdCore` (protected virtual) | Override
pattern |

### Additional discoveries
- `using OpenAI.Chat;` required for `ChatClient.AsAIAgent()` extension
to resolve
- `using OpenAI.Responses;` required for `ResponsesClient.AsAIAgent()`
extension to resolve

### What changed

**Package versions** (`dotnet/Directory.Packages.props`)
- AF packages updated to `1.0.0`
- `Microsoft.Agents.AI.AzureAI` → `Microsoft.Agents.AI.Foundry`

**Bridge code** (`dotnet/src/Agents/Abstractions/AIAgent/`)
- `SemanticKernelAIAgent.cs`: New `Core` method overrides
(`CreateSessionCoreAsync`, `RunCoreAsync`, etc.)
- `SemanticKernelAIAgentThread` → `SemanticKernelAIAgentSession`
(extends `AgentSession`)

**31 migration samples** (all compile ✅)
- OpenAI/AzureOpenAI: `AsAIAgent`, `CreateSessionAsync`, `using
OpenAI.Chat;`
- Assistants (8): AF sections rewritten to Responses API
- Responses (8): Direct `ResponsesClient.AsAIAgent()`
- Foundry (4): `AIProjectClient.AsAIAgent()` via
`Microsoft.Agents.AI.Foundry`
- Orchestrations (3): `RunStreamingAsync`, `AgentResponseUpdateEvent`

**Migration document**
(`.github/upgrades/prompts/SemanticKernelToAgentFramework.md`)
- All AF preview API references updated to 1.0 GA patterns

**Unit/integration tests** (~15 files)
- Mechanical renames for `AgentSession`, `AgentResponse`,
`CreateSessionAsync`

### Validation

8 standalone console programs were created and executed against AF 1.0.0
NuGet packages with real API keys, validating all migration patterns
end-to-end:
1. OpenAI Basics (ChatClient → AsAIAgent, CreateSessionAsync,
Run/RunStreaming)
2. OpenAI ToolCall (AIFunctionFactory.Create, tool invocation)
3. OpenAI DI (ServiceProvider registration)
4. OpenAI Responses (ResponsesClient.AsAIAgent)
5. Azure AI Foundry (AIProjectClient.AsAIAgent)
6. Workflows Handoff (HandoffWorkflowBuilder,
InProcessExecution.RunStreamingAsync)
7. Session Lifecycle (Create, Serialize, Deserialize, multi-turn)
8. Assistants Migration Path (Responses API as replacement)

---------

Co-authored-by: Copilot <[email protected]>
2026-05-12 14:49:47 +00:00

67 lines
2.8 KiB
C#

// Copyright (c) Microsoft. All rights reserved.
// This sample demonstrates how to use an Agent with function tools provided via an OpenAPI spec with both Semantic Kernel and Agent Framework.
using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.Plugins.OpenApi;
using OpenAI.Chat;
var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT") ?? throw new InvalidOperationException("AZURE_OPENAI_ENDPOINT is not set.");
var deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_NAME") ?? "gpt-4o-mini";
await SKAgent();
await AFAgent();
async Task SKAgent()
{
Console.WriteLine("\n=== SK Agent ===\n");
// Create a kernel with an Azure OpenAI chat client.
var kernel = Kernel.CreateBuilder().AddAzureOpenAIChatClient(deploymentName, endpoint, new AzureCliCredential()).Build();
// Load the OpenAPI Spec from a file.
var plugin = await kernel.ImportPluginFromOpenApiAsync("github", "OpenAPISpec.json");
// Create the agent, and provide the kernel with the OpenAPI function tools to the agent.
var agent = new ChatCompletionAgent()
{
Kernel = kernel,
Instructions = "You are a helpful assistant",
Arguments = new KernelArguments(new PromptExecutionSettings() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() }),
};
// Run the agent with the OpenAPI function tools.
await foreach (var result in agent.InvokeAsync("Please list the names, colors and descriptions of all the labels available in the microsoft/agent-framework repository on github."))
{
Console.WriteLine(result.Message);
}
}
async Task AFAgent()
{
Console.WriteLine("\n=== AF Agent ===\n");
// Load the OpenAPI Spec from a file.
KernelPlugin plugin = await OpenApiKernelPluginFactory.CreateFromOpenApiAsync("github", "OpenAPISpec.json");
// Convert the Semantic Kernel plugin to Agent Framework function tools.
// This requires a dummy Kernel instance, since KernelFunctions cannot execute without one.
Kernel kernel = new();
List<AITool> tools = plugin.Select(x => x.WithKernel(kernel)).Cast<AITool>().ToList();
// Create the chat client and agent, and provide the OpenAPI function tools to the agent.
AIAgent agent = new AzureOpenAIClient(
new Uri(endpoint),
new AzureCliCredential())
.GetChatClient(deploymentName)
.AsAIAgent(instructions: "You are a helpful assistant", tools: tools);
// Run the agent with the OpenAPI function tools.
Console.WriteLine(await agent.RunAsync("Please list the names, colors and descriptions of all the labels available in the microsoft/agent-framework repository on github."));
}