Microsoft Agent Framework en .NET : brancher OpenAI sans passer par Azure

16 septembre 2026

J’ai eu le même réflexe que tout le monde : “Agent Framework = Azure OpenAI obligatoire”.
Sauf que quand tu lis le dépôt officiel et la doc Microsoft, tu comprends vite où est la frontière : le framework apporte une structure d’exécution (runtime, types, conventions), et le provider LLM se branche. Microsoft documente explicitement un OpenAI Responses Agent côté .NET, basé sur une clé OpenAI, pas sur Azure.

Donc si tu veux un sample qui prouve le point, il faut faire simple : un binaire .NET, un AIAgent, une exécution RunAsync, et basta.

La forme générale

Le plus important, c’est que le code raconte une histoire claire : ton app appelle le runtime Agent Framework, qui lui délègue à OpenAI via le client « Responses ».

Installons ce qu’il faut

Le repo officiel donne le package de base pour démarrer en .NET (Microsoft.Agents.AI).

Pour l’agent OpenAI “Responses”, la doc indique Microsoft.Agents.AI.OpenAI en prerelease.

dotnet add package Microsoft.Agents.AI
dotnet add package Microsoft.Agents.AI.OpenAI --prerelease
dotnet add package OpenAI

Le sample complet (console + mode interactif)

Dans la doc, la recette est toujours la même : tu crées un OpenAIClient, tu prends le client “Responses”, tu crées ton AIAgent, puis tu exécutes RunAsync.

On garde ça, et on ajoute juste un mini mode interactif pour que le repo soit intéressant à lancer.

using Microsoft.Agents.AI;
using OpenAI;
var apiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY");
if (string.IsNullOrWhiteSpace(apiKey))
{
Console.Error.WriteLine("Il manque OPENAI_API_KEY (variable d’environnement).");
return;
}
var model = Environment.GetEnvironmentVariable("OPENAI_RESPONSES_MODEL_ID")
?? "gpt-4o-mini";
OpenAIClient client = new OpenAIClient(apiKey);
#pragma warning disable OPENAI001 // API d’évaluation (peut évoluer)
var responses = client.GetOpenAIResponseClient(model);
#pragma warning restore OPENAI001
AIAgent assistant = responses.CreateAIAgent(
name: "TechBuddy",
instructions:
"""
Tu es un assistant technique .NET.
Réponds de façon directe, sans blabla.
Donne un exemple de code quand c’est utile.
Si tu fais une hypothèse, annonce-la.
"""
);
Console.WriteLine("TechBuddy prêt. Tape 'exit' pour quitter.\n");
while (true)
{
Console.Write("> ");
var input = Console.ReadLine();
if (string.IsNullOrWhiteSpace(input))
continue;
if (input.Equals("exit", StringComparison.OrdinalIgnoreCase))
break;
var output = await assistant.RunAsync(input);
Console.WriteLine($"\n{output}\n");
}

Ce que j’aime avec ce format, c’est que tu n’es pas en train de “wrapper OpenAI”.
Tu montres clairement : le runtime Agent Framework te donne l’objet conversationnel (AIAgent) et un mode d’exécution (RunAsync) commun aux différents types d’agents.

Ce que fait RunAsync, concrètement

Ça aide souvent à éviter les fantasmes (“c’est un orchestrateur magique !”).
Ici, c’est simple : instructions + message utilisateur → appel Responses → texte de sortie.

Pourquoi ce sample a un intérêt

Tu pourrais appeler OpenAI à la main, évidemment.
Mais le jour où ton “prompt en string” devient un composant qu’on déploie, qu’on teste, qu’on observe et qu’on fait évoluer, tu veux une forme stable. Le dépôt Agent Framework est très explicite : le but est de couvrir le spectre “du simple chat” jusqu’aux workflows d’agents, avec une base .NET/Python unifiée.

Et surtout : tu peux garder ton provider OpenAI aujourd’hui, et changer demain pour Azure OpenAI si ton contexte l’impose. Microsoft documente les deux parcours (OpenAI Responses vs Azure OpenAI Responses).

Et maintenant ?

Une fois que ce socle existe, tu peux ajouter une seule brique à la fois sans transformer l’exemple en cathédrale : un tool call trivial, une mémoire minimaliste, ou un second “assistant” spécialisé. Agent Framework est justement fait pour ça : commencer petit, garder la forme, grandir sans t’enfermer.

Télécharger le sample sur GitHub
https://github.com/xraboteu/microsoft_agent_framework_with_open_ai