J’ai obtenu l’Applied Skills AZ-2005, centré sur Semantic Kernel, le 8 avril 2026. Cinq jours plus tôt, Microsoft publiait la version 1.0 de son successeur. Le calendrier dit l’essentiel de la situation : une partie des applications .NET qui intègrent l’IA aujourd’hui repose sur un framework dont Microsoft a déjà désigné la suite. Ce n’est pas une raison de paniquer ni de tout réécrire. C’est une raison de savoir précisément ce qui change, ce qui reste, et à quel moment agir.

Ce guide s’adresse aux équipes qui ont une application .NET en production, ou en cours de développement, avec du Semantic Kernel dedans. Il est tenu à jour : la date de révision figure en tête de page.

Où en sont les deux frameworks

DateÉvénement
Octobre 2025Agent Framework sort en préversion publique. Microsoft le présente comme la suite de Semantic Kernel et d’AutoGen.
Février 2026Version candidate (release candidate) d’Agent Framework.
3 avril 2026Agent Framework 1.0 : API stables, support long terme, en .NET et en Python.
Septembre 2026Agent Framework publie une version toutes les une à deux semaines (1.23 le 29 septembre). Semantic Kernel continue de publier des versions de maintenance (1.80.1 le 3 septembre).

Deux engagements publics de Microsoft encadrent la suite. Semantic Kernel 1.x reste supporté, avec correction des bugs critiques et des failles de sécurité, pendant au moins un an après la sortie d’Agent Framework de la préversion. Et le développement de nouvelles fonctionnalités se fait désormais principalement dans Agent Framework.

Concrètement : une application Semantic Kernel ne va pas s’arrêter de fonctionner. Elle va cesser de progresser. Le support garanti court au moins jusqu’en avril 2027, et rien ne garantit qu’il aille au-delà.

Ce qui ne bouge pas

C’est la partie que les annonces mettent le moins en avant, et c’est pourtant la plus rassurante pour une application existante.

Votre code métier. Les services, les règles, les validations, les accès aux données en Entity Framework ou en SQL, les contrôles d’habilitation : rien de tout cela ne dépend du framework d’orchestration. Si votre intégration IA a été faite proprement, l’IA appelle votre code métier à travers des fonctions exposées comme outils, et ce code ne change pas.

Les abstractions communes de .NET. Microsoft a sorti de Semantic Kernel les briques de base pour en faire des bibliothèques autonomes de l’écosystème .NET : Microsoft.Extensions.AI (l’interface IChatClient pour parler à un modèle, IEmbeddingGenerator pour les vecteurs) et Microsoft.Extensions.VectorData (collections, enregistrements et recherche vectorielle). Agent Framework repose sur ces deux bibliothèques. Un code qui les utilise déjà ne sera presque pas touché.

Votre couche vectorielle. Pour le RAG, Agent Framework en .NET utilise les implémentations de Microsoft.Extensions.VectorData, et la documentation liste SQL Server parmi les bases disponibles, à côté d’Azure AI Search, PostgreSQL, Qdrant ou Redis. Vos collections, vos modèles d’enregistrement et votre ingestion restent en place. Seul change le branchement de la recherche sur l’agent.

Ce qui change : la table de correspondance

La migration porte sur la couche agent. Le guide officiel de Microsoft la détaille ; voici les correspondances qui comptent en pratique.

Semantic KernelAgent FrameworkCe que ça change
Microsoft.SemanticKernel, Microsoft.SemanticKernel.AgentsMicrosoft.Agents.AI et Microsoft.Extensions.AILes types de messages et de contenus viennent de Microsoft.Extensions.AI.
Un Kernel obligatoire, même videPlus de KernelL’agent se crée directement depuis le client du modèle, avec AsAIAgent(...).
ChatCompletionAgent, AzureAIAgent, OpenAIAssistantAgentUn seul type, ChatClientAgent (exposé comme AIAgent)Tout service qui fournit un IChatClient convient.
[KernelFunction] + plugin ajouté au KernelMéthode ordinaire, [Description] facultatif, passée par AIFunctionFactory.CreateUn seul appel à la création de l’agent. Plus de notion de plugin obligatoire.
AgentThread créé à la main, avec le bon typeAgentSession, créée par l’agent avec CreateSessionAsync()L’appelant n’a plus à connaître le type de fil propre à chaque fournisseur.
InvokeAsync renvoie un flux de messagesRunAsync renvoie un AgentResponseLe texte est dans response.Text, les appels d’outils dans response.Messages.
InvokeStreamingAsyncRunStreamingAsync, qui renvoie des AgentResponseUpdateMême logique de flux, avec plus d’informations par mise à jour.
KernelArguments + PromptExecutionSettingsChatClientAgentRunOptions autour d’un ChatOptionsRéglages du modèle (tokens, température) à un seul endroit.
services.AddKernel() puis un agent qui reçoit le Kernelservices.AddKeyedSingleton<AIAgent>(...)L’injection de dépendances enregistre directement l’agent.
Mémoire et recherche branchées via le KernelFournisseurs de contexte (AIContextProviders), dont TextSearchProvider pour le RAGLa recherche s’exécute avant chaque appel au modèle, ou à la demande comme outil.

À cela s’ajoutent des briques qu’Agent Framework apporte en version stable : des workflows à base de graphe pour enchaîner agents et fonctions de façon déterministe, la reprise sur point de contrôle pour les traitements longs, la validation humaine en cours de route, le middleware pour intercepter les appels, et l’observabilité par OpenTelemetry.

Le même agent, avant et après

Prenons un cas simple et courant : un assistant de support qui répond aux questions sur les commandes en appelant le référentiel de commandes de l’application. Le code métier, IOrderRepository, existe déjà et ne change pas.

Avec Semantic Kernel :

using System.ComponentModel;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;

public sealed class OrderTools(IOrderRepository orders)
{
    [KernelFunction, Description("Returns the current status of a customer order.")]
    public async Task<string> GetOrderStatusAsync(
        [Description("The order number, for example CMD-2026-0142.")] string orderNumber)
        => (await orders.FindAsync(orderNumber))?.Status ?? "unknown order";
}

// The kernel carries the model connector and the plugins.
Kernel kernel = Kernel.CreateBuilder()
    .AddAzureOpenAIChatCompletion(deploymentName, endpoint, credential)
    .Build();
kernel.Plugins.AddFromObject(new OrderTools(orders), "Orders");

ChatCompletionAgent agent = new()
{
    Name = "Support",
    Instructions = "Answer questions about customer orders. Never guess a status: call the tool.",
    Kernel = kernel,
    Arguments = new KernelArguments(new PromptExecutionSettings
    {
        FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(),
    }),
};

AgentThread thread = new ChatHistoryAgentThread();
await foreach (AgentResponseItem<ChatMessageContent> item in agent.InvokeAsync(question, thread))
{
    Console.WriteLine(item.Message.Content);
}

Avec Agent Framework :

using System.ComponentModel;
using Azure.AI.OpenAI;
using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;
using OpenAI.Chat; // AsAIAgent on the OpenAI ChatClient (package Microsoft.Agents.AI.OpenAI)

public sealed class OrderTools(IOrderRepository orders)
{
    // No framework attribute: a plain method, described for the model.
    [Description("Returns the current status of a customer order.")]
    public async Task<string> GetOrderStatusAsync(
        [Description("The order number, for example CMD-2026-0142.")] string orderNumber)
        => (await orders.FindAsync(orderNumber))?.Status ?? "unknown order";
}

var tools = new OrderTools(orders);

// No kernel: the agent is created from the chat client, tools included.
AIAgent agent = new AzureOpenAIClient(endpoint, credential)
    .GetChatClient(deploymentName)
    .AsAIAgent(
        instructions: "Answer questions about customer orders. Never guess a status: call the tool.",
        tools: [AIFunctionFactory.Create(tools.GetOrderStatusAsync)]);

AgentSession session = await agent.CreateSessionAsync();
AgentResponse response = await agent.RunAsync(question, session);
Console.WriteLine(response.Text);

Trois observations. La méthode métier est identique à un attribut près. Le code d’assemblage perd un tiers de ses lignes, parce que le Kernel et le plugin disparaissent. Et l’appel au modèle ne passe plus par un type d’agent propre au fournisseur : changer d’Azure OpenAI vers un autre fournisseur compatible ne touche que la ligne qui crée le client.

Côté injection de dépendances, l’enregistrement devient :

builder.Services.AddKeyedSingleton<AIAgent>("support", (sp, _) =>
    sp.GetRequiredService<IChatClient>().AsAIAgent(
        instructions: "Answer questions about customer orders. Never guess a status: call the tool.",
        tools: [AIFunctionFactory.Create(sp.GetRequiredService<OrderTools>().GetOrderStatusAsync)]));

Et le RAG ?

Si votre application interroge des documents métier, la recherche se branche désormais comme un fournisseur de contexte. TextSearchProvider prend une fonction de recherche, qui peut s’appuyer sur votre collection Microsoft.Extensions.VectorData existante, et l’exécute avant chaque appel au modèle ou l’expose comme outil que le modèle appelle à la demande :

AIAgent agent = chatClient.AsAIAgent(new ChatClientAgentOptions
{
    ChatOptions = new() { Instructions = "Answer from the provided documents and cite them." },
    AIContextProviders = [new TextSearchProvider(SearchDocumentsAsync, new TextSearchProviderOptions
    {
        SearchTime = TextSearchProviderOptions.TextSearchBehavior.BeforeAIInvoke,
    })],
});

La fonction SearchDocumentsAsync est celle que vous écrivez au-dessus de votre base : c’est là que restent le découpage métier des documents et le filtrage par habilitation, deux décisions que je détaille dans le guide RAG sur SQL Server 2025. Le framework change, ces deux décisions ne changent pas.

Que faire, selon votre situation

SituationRecommandation
Nouveau projet .NET avec de l’IAPartir sur Agent Framework. La version 1.0 est stable, c’est là que les nouveautés arrivent, et démarrer sur Semantic Kernel en 2026 revient à programmer une migration.
Application en production qui utilise Semantic Kernel pour des appels au modèle et quelques fonctions, et qui fonctionneNe rien casser. Inscrire la migration au prochain chantier qui touche la couche IA, et au plus tard avant avril 2027.
Application qui utilise les agents de Semantic Kernel (ChatCompletionAgent, AzureAIAgent) ou de l’orchestration multi-agentsMigrer en priorité : c’est la partie qui change le plus, et celle où Agent Framework apporte le plus (workflows, points de contrôle, validation humaine).
Application dont la couche IA est dispersée dans le code, sans interfaceCommencer par isoler l’IA derrière une interface de votre domaine. La migration devient alors un changement d’infrastructure, pas une réécriture.
Traitement qui pourrait être une fonction déterministeNe pas en faire un agent. Microsoft le recommande lui-même dans sa documentation : si une fonction suffit à la tâche, écrivez la fonction.

Le dernier point n’est pas un détail. Une migration est une bonne occasion de retirer de l’IA là où elle n’apporte rien : un calcul, un contrôle de format ou une règle de gestion n’ont rien à faire dans un agent. C’est le principe que je décris dans l’IA propose, le déterministe dispose : le modèle propose, une couche déterministe valide.

Checklist de migration

  1. Inventorier. Lister tous les usages de Microsoft.SemanticKernel dans la solution et les classer : connecteurs de modèle, plugins et fonctions, agents, mémoire et recherche, filtres, modèles de prompt.
  2. Isoler. Si ce n’est pas déjà fait, placer l’IA derrière une interface de votre domaine (par exemple IOrderAssistant), implémentée dans la couche infrastructure. C’est le même principe que l’extraction documentaire interchangeable que j’utilise en mission : le métier dépend d’un contrat, pas d’un framework.
  3. Figer un jeu de référence. Avant de toucher au code, enregistrer une trentaine de questions réelles avec les réponses et les appels d’outils attendus. C’est lui qui dira si la migration a changé un comportement.
  4. Basculer les outils. Retirer [KernelFunction], garder [Description], passer les méthodes par AIFunctionFactory.Create.
  5. Basculer les agents. Remplacer la création du Kernel et de l’agent par AsAIAgent(...), les AgentThread par AgentSession, InvokeAsync par RunAsync.
  6. Reprendre les filtres. Ce que faisaient les filtres de Semantic Kernel (journalisation, contrôle des appels de fonction, masquage de données) se reporte sur le middleware d’Agent Framework.
  7. Rebrancher la recherche. Garder la collection vectorielle, remplacer le branchement par un TextSearchProvider ou un outil de recherche.
  8. Comparer. Rejouer le jeu de référence, comparer réponses et appels d’outils, activer la télémétrie OpenTelemetry avant la mise en production.

Pour une application où l’IA est bien isolée, les étapes 4 à 7 tiennent dans un seul lot de travail. Pour une application où elle est dispersée, l’étape 2 est le vrai chantier, et c’est un chantier utile même sans migration.

Pour aller plus loin

Le guide de migration de Microsoft couvre aussi les cas propres à Azure AI Foundry et aux assistants OpenAI hébergés, que ce guide laisse de côté. Si votre application .NET intègre l’IA et que vous voulez savoir ce que la migration représente chez vous, c’est exactement le périmètre de l’intégration IA dans les applications .NET.

Sources et références

Agent FrameworkSemantic Kernel.NETMigrationAgents IA

À lire aussi

Aller plus loin

Votre application .NET repose sur Semantic Kernel et vous voulez savoir quoi migrer, et quand ?

Pour les ETI et les éditeurs dont le SI vit en .NET et SQL Server : l'IA développée dans votre applicatif (extraction documentaire, agents, classification) avec vos règles métier, votre architecture, votre code. Pas un outil de plus à côté du SI : une capacité nouvelle dedans. Je travaille dans votre repo, avec vos développeurs, aux standards de votre équipe.

Parlons de votre SI →