Bon, le diner et ses boissons du 1er janvier doit être digéré alors passons aux choses sérieuses ! Beaucoup de développeurs utilisent des bibliothèques comme OpenAI.NET pour accéder à l’API d’OpenAI. Pourtant, il est souvent plus judicieux — notamment dans des environnements industriels, allégés ou sensibles — d’appeler directement l’API via HTTP.
Dans cet article, nous verrons comment et pourquoi appeler l’API OpenAI depuis C# sans SDK.
🎯 Pourquoi se passer de SDK ?
- Contrôle complet sur les appels, formats, erreurs
- Réduction des dépendances dans une appli embarquée
- Meilleure traçabilité (logs, retries, timeouts)
- Facilité de mise à jour face aux évolutions de l’API
- Compatibilité AOT (ex. MAUI ou .NET natif)
🔐 Prérequis
- Obtenir une clé API OpenAI
- Activer les modèles souhaités dans votre compte (gpt-4, embeddings, etc.)
🔧 Exemple : appel à l’API Chat Completions
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new("Bearer", "votre_clef_api");
var body = new
{
model = "gpt-4",
messages = new[]
{
new { role = "system", content = "Tu es un assistant C#." },
new { role = "user", content = "Explique Span<T> simplement." }
},
temperature = 0.7
};
var json = JsonSerializer.Serialize(body);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync("https://api.openai.com/v1/chat/completions", content);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Résultat brut : JSON contenant la réponse dans choices[0].message.content
📦 Exemple : appel à l’API d’embedding
var payload = new
{
model = "text-embedding-3-small",
input = "Le chat dort sur le canapé"
};
var req = new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json");
var resp = await httpClient.PostAsync("https://api.openai.com/v1/embeddings", req);
var bodyText = await resp.Content.ReadAsStringAsync();
var jsonDoc = JsonDocument.Parse(bodyText);
var vector = jsonDoc.RootElement.GetProperty("data")[0].GetProperty("embedding");
✅ Conseils pratiques
- Utiliser System.Text.Json pour la rapidité
- Créer des méthodes réutilisables avec HttpClientFactory
- Ajouter une couche de retry en cas d’erreur temporaire
- Toujours fixer un timeout raisonnable
- Journaliser la requête et la réponse pour débogage
🧩 Comparatif avec un SDK C#
|
Aspect
|
SDK tiers (ex: OpenAI.NET)
|
Appel HTTP manuel
|
|
Dépendance externe
|
Oui
|
Non
|
|
Contrôle fin des requêtes
|
Limité
|
Total
|
|
Facilité d’usage
|
Haute
|
Moyenne
|
|
Personnalisation
|
Moyenne
|
Élevée
|
|
Maintenance API
|
Externe (lib)
|
Interne (au code)
|
|
AOT et trimming
|
Parfois problématiques
|
Optimisé
|
🔚 Conclusion
Dans de nombreux projets .NET modernes, se passer de SDK pour interagir avec OpenAI offre plus de contrôle, de stabilité et de performance. Cette approche convient particulièrement aux solutions desktop, embarquées, offline-friendly ou fortement personnalisées.
On n'oubliera pas pour autant les solutions comme Azure AI qui offrent d'autres avantages pour accéder aux LLM comme OpenAI ni même aux librairies Microsoft permettant de créer une abstraction entre l'App et le LLM appelé. Mais cela est une autre histoire pour d'autres billets déjà publiés ou à venir !
Stay Tuned !