Dot.Blog

Consulting DotNet C#, XAML, WinUI, WPF, MAUI, IA

Azure AI - Déployer une API d’IA personnalisée avec Azure Functions

Une fois que vous avez un modèle Azure OpenAI opérationnel, il est souvent pratique de créer une API intermédiaire qui encapsule les appels à ce modèle. Cela facilite la maintenance, la sécurisation et la réutilisation du service dans vos applications clientes.

Cet article détaille comment créer et déployer une API serverless simple avec Azure Functions en C#, qui reçoit une requête, interroge Azure OpenAI, puis renvoie la réponse.

  1. Prérequis
  • Un abonnement Azure actif
  • Une fonction Azure Functions configurée (runtime .NET 7 ou supérieur recommandé)
  • Une ressource Azure OpenAI opérationnelle avec clé d’API
  • Visual Studio 2022 ou Visual Studio Code avec les extensions Azure Functions
  1. Création d’un projet Azure Functions HTTP Trigger

Dans Visual Studio :

  1. Créer un nouveau projet → sélectionnez Azure Functions
  2. Nommer le projet, choisir .NET 7 ou supérieur
  3. Sélectionner le type Trigger HTTP
  4. Autoriser Anonymous ou Function pour l’authentification selon besoin
  1. Implémentation de la fonction C#

Voici un exemple simple d’une fonction qui reçoit un JSON contenant un prompt, appelle Azure OpenAI via HttpClient, et retourne la réponse :

using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;

public class OpenAIProxyFunction
{
    private readonly HttpClient _httpClient;
    private readonly string _azureOpenAiEndpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");
    private readonly string _azureOpenAiApiKey = Environment.GetEnvironmentVariable("AZURE_OPENAI_API_KEY");
    private readonly string _deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT");

    public OpenAIProxyFunction(HttpClient httpClient)
    {
        _httpClient = httpClient;
    }

    [Function("OpenAIProxy")]
    public async Task<HttpResponseData> Run([HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)
    {
        var requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        var jsonDoc = JsonDocument.Parse(requestBody);
        var userMessage = jsonDoc.RootElement.GetProperty("prompt").GetString();

        var apiUrl = $"{_azureOpenAiEndpoint}/openai/deployments/{_deploymentName}/chat/completions?api-version=2024-02-15-preview";

        var payload = new
        {
            messages = new[]
            {
                new { role = "system", content = "Vous êtes un assistant." },
                new { role = "user", content = userMessage }
            },
            temperature = 0.7
        };

        var content = new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json");
        _httpClient.DefaultRequestHeaders.Clear();
        _httpClient.DefaultRequestHeaders.Add("api-key", _azureOpenAiApiKey);
        var response = await _httpClient.PostAsync(apiUrl, content);
        var responseContent = await response.Content.ReadAsStringAsync();
        var res = req.CreateResponse(response.StatusCode);
       res.Headers.Add("Content-Type", "application/json");
        await res.WriteStringAsync(responseContent);

        return res;
    }
}
  1. Configuration des variables d’environnement

Pour sécuriser les informations sensibles, placez dans le fichier local.settings.json ou dans la configuration Azure :

{
  "IsEncrypted": false,
  "Values": {
    "AZURE_OPENAI_ENDPOINT": "https://votre-instance.openai.azure.com",
    "AZURE_OPENAI_API_KEY": "votre-cle-api",
    "AZURE_OPENAI_DEPLOYMENT": "chatbot-deploy",
    "AzureWebJobsStorage": "UseDevelopmentStorage=true"
  }
}
  1. Déploiement sur Azure

Utilisez Visual Studio ou Azure CLI :

  • Visual Studio : clic droit sur le projet → Publier → sélectionner votre abonnement et créer une Function App
  • Azure CLI :

 

func azure functionapp publish <nom-de-votre-function-app>
  1. Tester l’API

Après déploiement, votre API est accessible via une URL publique.

Exemple de requête HTTP POST :

POST https://<votre-function-app>.azurewebsites.net/api/OpenAIProxy
Content-Type: application/json
{
  "prompt": "Peux-tu expliquer Azure Functions ?"
}

Réponse JSON contenant la génération du modèle.

  1. Avantages et bonnes pratiques
  • Centralisation : votre logique d’appel à Azure OpenAI est centralisée et contrôlée
  • Sécurité : clé API protégée côté serveur, pas exposée au client
  • Extensibilité : ajoutez la journalisation, limitation de débit, validation des requêtes
  • Interopérabilité : accessible depuis toute application (web, mobile, desktop)

Conclusion

Créer une API Azure Functions autour d’Azure OpenAI facilite l’intégration dans vos applications et améliore la sécurité et la maintenabilité.

Mais ce n'est qu'un simple scénario de démonstration pour vous aider à comprendre les principes présentés. Il peut même y avoir des cas où la centralisation de la clé API est un inconvénient.Supposons une App MAUI mise sur le Store (Android Play par exemple). Il est fort probable que la gestion des API va poser des problèmes très différents de ceux soulevés en entreprise. Cette dernière a intérêt à utiliser une centralisation des clés API, pour la sécurité notamment, côté coût c'est elle qui paye pour tout le monde donc cela ne pose aucun souci. Mais pour l'App à disposition sur un Store... Soit elle elle intègre un abonnement avec achat in-App ou autre afin de financer le coût de l'IA, soit elle doit offrir à l'utilisateur de saisir sa propre clé, charge à lui de prendre un abonnement Azure AI ou directement OpenAI mais cela lui complique la vie ce qui n'est jamais bon d'un point de vue marketting ...

Bref, Il existe de nombreuses situations différentes et je n'ai pas ici dans cette série de 12 articles sur Azure AI la naïveté de croire que je peux vous apprendre toutes les façons d'aborder cette complexe tâche qu'est l'intégration de l'IA dans vos Apps. Mais j'espère pouvoir participer à votre compréhension des principes essentiels, en misant sur votre intelligence, naturelle celle-là, pour le reste !

Dans le dernier volet de cette série de 12 articles sur Azure AI j'aborderai la question des Bonnes pratiques : sécurité, quotas, versionnement, suivi des coûts pour Azure AI

Stay Tuned !

Faites des heureux, PARTAGEZ l'article !