Exercice : créer un connecteur personnalisé pour votre copilote

Effectué

Contexte

Cet exercice va plus loin que l’exercice Configurer Azure OpenAI Service pour générer des informations sur votre podcast. Vos tâches pour cet exercice consistent à créer une API .NET à l’aide du Kit de développement logiciel (SDK) .NET Azure OpenAI et un connecteur personnalisé depuis Visual Studio.

Définitions

Les sections suivantes fournissent des définitions pour les éléments importants que vous devez connaître pour cet exercice.

.NET

.NET est une plateforme de développement gratuite, multiplateforme et open source permettant de créer de nombreux types d’applications différents. Avec .NET, vous pouvez créer des applications web, mobiles, de bureau, de jeu, IoT (Internet des objets) et d’IA à l’aide de plusieurs langages, éditeurs et bibliothèques.

Pour en savoir plus, consultez Présentation de .NET.

Kit de développement logiciel (SDK) .NET Azure OpenAI

La bibliothèque de client Azure OpenAI pour .NET est une adaptation des API REST d’OpenAI qui fournissent une interface idiomatique et une intégration riche au reste de l’écosystème du Kit de développement logiciel (SDK) Azure. Pouvant se connecter à des ressources Azure OpenAI ou à un point de terminaison d’inférence autre qu’Azure OpenAI, il s’agit d’un excellent choix pour le développement autre qu’Azure OpenAI.

Pour en savoir plus, consultez Bibliothèque de client Azure OpenAI pour .NET.

Microsoft Power Platform

Microsoft Power Platform permet aux organisations de donner aux membres de leur équipe les moyens de créer leurs solutions grâce à un ensemble de services intuitifs low-code ou no-code. Ces services permettent de simplifier le processus de création de solutions. Grâce à Microsoft Power Platform, vous pouvez créer des solutions en quelques jours ou semaines, plutôt qu’en plusieurs mois ou années. Microsoft Power Platform se compose de cinq produits clés : Power Apps, Power Automate, Power BI, Power Virtual Agents et Power Pages.

Pour en savoir plus, consultez Microsoft Power Platform.

Connecteur personnalisé

Microsoft Azure Logic Apps, Microsoft Power Automate et Microsoft Power Apps offrent plus de 1 000 connecteurs pour se connecter à Microsoft et aux services vérifiés. Cependant, vous souhaiterez peut-être communiquer avec des services non disponibles en tant que connecteurs prédéfinis. Les connecteurs personnalisés prennent en charge ce scénario en vous permettant de créer (et même partager) un connecteur avec ses propres déclencheurs et actions.

Pour en savoir plus, consultez Connecteurs personnalisés.

Conditions préalables

Pour cet exercice, veillez à :

Étapes de l’exercice

La vidéo suivante passe en revue les étapes de l’exercice de cette unité.

Configurer des variables d’environnement

Pour configurer des variables d’environnement, procédez comme suit :

  1. Ouvrez une invite de commande, puis exécutez les commandes suivantes une par une :

     setx AZURE_OPENAI_KEY_WE "REPLACE_WITH_YOUR_WEST_EUROPE_KEY_VALUE_HERE"
     setx AZURE_OPENAI_ENDPOINT_WE https://podcastcopilotwe-{your initials}.openai.azure.com/
    

    La commande précédente concerne la clé de ressource et le point de terminaison Europe Ouest.

     setx AZURE_OPENAI_KEY_SC "REPLACE_WITH_YOUR_SWEDEN_CENTRAL_KEY_VALUE_HERE" 
     setx AZURE_OPENAI_ENDPOINT_SC "https://podcastcopilotsc-{your initials}.openai.azure.com/"    
    

    La commande précédente concerne la clé de ressource et le point de terminaison Suède Centre.

    setx BING_SEARCH_KEY "REPLACE_WITH_YOUR_KEY_VALUE_HERE"

    La commande précédente concerne la clé de ressource Recherche Bing.

  2. Après avoir défini les variables d’environnement, fermez l’invite de commande.

Créer un projet d’API web .NET

Votre prochaine tâche consiste à créer un projet d’API web .NET en procédant comme suit :

  1. Ouvrez Visual Studio et cliquez sur Créer un projet.

    Capture d’écran du bouton Créer un projet dans Visual Studio.

  2. Recherchez API web et sélectionnez API web ASP.NET Core. Veillez à sélectionner le modèle de projet C#.

    Capture d’écran du modèle de projet d’API web ASP.NET Core.

  3. Cliquez sur Suivant.

  4. Nommez votre projet PodcastAppAPI, puis cliquez sur Suivant.

  5. Assurez-vous que le champ Infrastructure est défini sur .NET 8, que le champ Type d’authentification est défini sur Aucun et que l’option Configurer pour HTTPS est sélectionnée. Cliquez sur Créer.

    Capture d’écran des paramètres du projet.

  6. Une fois que le système a créé le projet, ouvrez l’Explorateur de solutions, cliquez avec le bouton droit sur le projet PodcastAppAPI pour ouvrir le menu contextuel, puis sélectionnez Ouvrir dans le terminal.

  7. Dans la fenêtre du terminal, exécutez la commande suivante pour installer la version préliminaire du Kit de développement logiciel (SDK) Azure OpenAI :

    dotnet add package Azure.AI.OpenAI --version 1.0.0-beta.13

  8. Exécutez la commande suivante pour installer le package Newtonsoft.Json :

    dotnet add package Newtonsoft.Json --version 13.0.3

Créer la classe PodcastCopilot

Pour créer la classe PodcastCopilot, procédez comme suit :

  1. Une fois la commande terminée, ajoutez une nouvelle classe au projet en cliquant avec le bouton droit sur le projet PodcastAppAPI pour ouvrir le menu contextuel. Ensuite, sélectionnez Ajouter > Classe. Nommez la classe PodcastCopilot.

    Capture d’écran de l’ajout d’une nouvelle classe au projet.

  2. Ajoutez les instructions using suivantes en haut de la classe PodcastCopilot :

     using System.Web;
     using Azure.AI.OpenAI;
     using Azure;    
     using Newtonsoft.Json.Linq;
    
  3. Dans la classe PodcastCopilot, ajoutez le code suivant :

     //Initializing the Endpoints and Keys
     static string endpointWE = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT_WE");
     static string keyWE = Environment.GetEnvironmentVariable("AZURE_OPENAI_KEY_WE");
    
     static string endpointSC = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT_SC");
     static string keySC = Environment.GetEnvironmentVariable("AZURE_OPENAI_KEY_SC");
    
     static string bingSearchUrl = "https://api.bing.microsoft.com/v7.0/search";
     static string bingSearchKey = Environment.GetEnvironmentVariable("BING_SEARCH_KEY");
    
     //Instantiate OpenAI Client for Whisper and GPT-3
     static OpenAIClient clientWE = new OpenAIClient(
         new Uri(endpointWE), 
         new AzureKeyCredential(keyWE));
    
     //Instantiate OpenAI Client for Dall.E 3
     static OpenAIClient clientSC = new OpenAIClient(
         new Uri(endpointSC), 
         new AzureKeyCredential(keySC));
    
  4. Sous le code précédent, ajoutez le code suivant pour exécuter la Transcription audio :

     //Get Audio Transcription
     public static async Task<string> GetTranscription(string podcastUrl)
     {
         var decodededUrl = HttpUtility.UrlDecode(podcastUrl);
    
         HttpClient httpClient = new HttpClient();
         Stream audioStreamFromBlob = await httpClient.GetStreamAsync(decodededUrl);
    
         var transcriptionOptions = new AudioTranscriptionOptions()
         {
             DeploymentName = "whisper",
             AudioData = BinaryData.FromStream(audioStreamFromBlob),
             ResponseFormat = AudioTranscriptionFormat.Verbose,
             Filename = "file.mp3"
         };
    
         Response<AudioTranscription> transcriptionResponse = await clientWE.GetAudioTranscriptionAsync(
             transcriptionOptions);
         AudioTranscription transcription = transcriptionResponse.Value;
    
         return transcription.Text;
     }
    
  5. Ajoutez le code suivant pour exécuter l’Extraction de nom d’invité :

     //Get Audio Transcription
     public static async Task<string> GetTranscription(string podcastUrl)
     {
         var decodededUrl = HttpUtility.UrlDecode(podcastUrl);
    
         HttpClient httpClient = new HttpClient();
         Stream audioStreamFromBlob = await httpClient.GetStreamAsync(decodededUrl);
    
         var transcriptionOptions = new AudioTranscriptionOptions()
         {
             DeploymentName = "whisper",
             AudioData = BinaryData.FromStream(audioStreamFromBlob),
             ResponseFormat = AudioTranscriptionFormat.Verbose,
             Filename = "file.mp3"
         };
    
         Response<AudioTranscription> transcriptionResponse = await clientWE.GetAudioTranscriptionAsync(
             transcriptionOptions);
         AudioTranscription transcription = transcriptionResponse.Value;
    
         return transcription.Text;
     }
    
  6. Ajoutez le code suivant à la classe PodcastCopilot pour exécuter l’Extraction de biographie d’invité depuis Bing :

     //Get Guest Bio from Bing
     public static async Task<string> GetGuestBio(string guestName)
     {
         var client = new HttpClient();
    
         client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", bingSearchKey);
    
         HttpResponseMessage response = await client.GetAsync($"{bingSearchUrl}?q={guestName}");
    
         string responseBody = await response.Content.ReadAsStringAsync();
    
         // Parse responseBody as JSON and extract the bio.
         JObject searchResults = JObject.Parse(responseBody);
         var bio = searchResults["webPages"]["value"][0]["snippet"].ToString();
    
         return bio;
     }
    
  7. Ajoutez le code suivant pour exécuter la prochaine étape du processus PodcastCopilot : Créer un texte de réseau social.

     //Create Social Media Blurb
     public static async Task<string> GetSocialMediaBlurb(string transcription, string bio)
     {
         var completionOptions = new ChatCompletionsOptions()
         {
             DeploymentName = "gpt35turbo",
             Messages =
             {
                 new ChatRequestSystemMessage(
                     @"You are a helpful large language model that can create a 
                     LinkedIn promo blurb for episodes of the podcast 
                     Behind the Tech, when given transcripts of the podcasts.
                     The Behind the Tech podcast is hosted by Kevin Scott.\n"
                 ),
                 new ChatRequestUserMessage(
                     @"Create a short summary of this podcast episode 
                     that would be appropriate to post on LinkedIn to    
                     promote the podcast episode. The post should be 
                     from the first-person perspective of Kevin Scott, 
                     who hosts the podcast.\n" +
                     $"Here is the transcript of the podcast episode: {transcription} \n" +
                     $"Here is the bio of the guest: {bio} \n"
                 )
             },
             Temperature = (float)0.7
         };
    
         Response<ChatCompletions> completionsResponse = await clientWE.GetChatCompletionsAsync(
             completionOptions);
         ChatCompletions completion = completionsResponse.Value;
    
         return completion.Choices[0].Message.Content;
     }
    
  8. Ajoutez le code suivant pour exécuter la prochaine étape du processus PodcastCopilot : Créer une invite Dall.E prompt.

     //Generate a Dall-E prompt
     public static async Task<string> GetDallEPrompt(string socialBlurb)
     {
         var completionOptions = new ChatCompletionsOptions()
         {
             DeploymentName = "gpt35turbo",
             Messages =
         {
             new ChatRequestSystemMessage(
                 @"You are a helpful large language model that generates 
                 DALL-E prompts, that when given to the DALL-E model can 
                 generate beautiful high-quality images to use in social 
                 media posts about a podcast on technology. Good DALL-E 
                 prompts will contain mention of related objects, and 
                 will not contain people or words. Good DALL-E prompts 
                 should include a reference to podcasting along with 
                 items from the domain of the podcast guest.\n"
             ),
             new ChatRequestUserMessage(
                 $@"Create a DALL-E prompt to create an image to post along 
                 with this social media text: {socialBlurb}"
             )
         },
             Temperature = (float)0.7
         };
    
         Response<ChatCompletions> completionsResponse = await clientWE.GetChatCompletionsAsync(
         completionOptions);
    
         ChatCompletions completion = completionsResponse.Value;
    
         return completion.Choices[0].Message.Content;
     }
    
  9. Ajoutez le code suivant pour exécuter la prochaine étape du processus PodcastCopilot : Générer l’image de réseau social depuis Dall.E.

     //Create social media image with a Dall-E
     public static async Task<string> GetImage(string prompt)
     {
         var generationOptions = new ImageGenerationOptions()
         {
             Prompt = prompt + ", high-quality digital art",
             ImageCount = 1,
             Size = ImageSize.Size1024x1024,
             Style = ImageGenerationStyle.Vivid,
             Quality = ImageGenerationQuality.Hd,
             DeploymentName = "dalle3",
             User = "1",
         };
    
         Response<ImageGenerations> imageGenerations =
             await clientSC.GetImageGenerationsAsync(generationOptions);
    
         return imageGenerations.Value.Data[0].Url.ToString();
     }
    

Vous venez de créer la classe PodcastCopilot, qui comporte les méthodes permettant d’exécuter le processus qui prend une URL de podcast et renvoie une publication et une image de réseau social pour ce podcast. Vous êtes maintenant prêt à créer la classe SocialMediaPost.

Créer la classe SocialMediaPost

Votre prochaine tâche consiste à créer la classe SocialMediaPost.

Commencez par cliquer avec le bouton droit sur le projet PodcastAppAPI pour ouvrir le menu contextuel. Ensuite, sélectionnez Ajouter > Classe. Nommez la classe SocialMediaPost, puis ajoutez le code suivant à la classe :

```
public class SocialMediaPost
{
    public string ImageUrl { get; set; }
    public string Blurb { get; set; }
}
```

La classe devrait ressembler à l’exemple suivant :

Capture d’écran de la classe SocialMediaPost.

Maintenant que vous avez créé la classe SocialMediaPost, vous pouvez ajouter une méthode supplémentaire à la classe PodcastCopilot pour renvoyer un objet SocialMediaPost.

Mettre à jour la classe PodcastCopilot

Pour mettre à jour la classe PodcastCopilot, ouvrez la classe PodcastCopilot et ajoutez la méthode suivante à la classe :

```
public static async Task<SocialMediaPost> GenerateSocialMediaPost(string podcastUrl)
{
    var transcription = await GetTranscription(podcastUrl);
    var guestName = await GetGuestName(transcription);
    var guestBio = await GetGuestBio(guestName);
    var generatedBlurb = await GetSocialMediaBlurb(transcription, guestBio);
    var dallePrompt = await GetDallEPrompt(generatedBlurb);
    var generatedImage = await GetImage(dallePrompt);

    var socialMediaPost = new SocialMediaPost()
    {
        ImageUrl = generatedImage,
        Blurb = generatedBlurb
    };

    return socialMediaPost;
}
```

Vous êtes maintenant prêt à mettre à jour le fichier Program.cs afin de pouvoir implémenter l’API Minimal.

Mettre à jour le fichier Program.cs avec l’implémentation de l’API Minimal

Votre prochaine tâche consiste à mettre à jour le fichier Program.cs avec l’implémentation de l’API Minimal.

Pour ce faire, commencez par ouvrir le fichier Program.cs. Ensuite, remplacez tout le code de ce fichier par le code suivant :

```
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

//Implement Minimal APIs

app.Run();
```

Vous êtes maintenant prêt à transformer votre API en connecteur personnalisé afin de pouvoir l’utiliser dans Microsoft Power Platform.

Créer un connecteur personnalisé depuis Visual Studio

Pour créer un connecteur personnalisé depuis Visual Studio, procédez comme suit :

  1. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le nœud Services connectés pour ouvrir le menu contextuel. Ensuite, sélectionnez Ajouter > Microsoft Power Platform.

    Capture d’écran de l’ajout d’un nouveau service connecté.

  2. Veillez à être connecté avec le même compte que celui de votre Plan pour développeurs Power Apps. Ensuite, dans la fenêtre contextuelle Se connecter à Microsoft Power Platform, configurez les paramètres suivants :

    • Environnements Power Platform : sélectionnez un environnement de votre choix.

    • Solutions Power Platform : sélectionnez une solution de votre choix.

    • Connecteurs personnalisés : créez un connecteur personnalisé et nommez-le PodcastCopilot_Connector.

    • Spécification OpenAPI : sélectionnez l’option Générer automatiquement la spécification OpenAPI V2.

    • Sélectionner un tunnel de dév. public : créez un tunnel de dév. et nommez-le PodcastCopilot_Tunnel.

  3. Cliquez sur Suivant > Terminer.

    Capture d’écran de la configuration d’un service connecté.

  4. Une fois le processus de configuration des dépendances terminé, fermez la fenêtre contextuelle.

  5. Exécutez l’application. Si vous recevez le message suivant dans la fenêtre du navigateur, cliquez sur Continuer pour vous connecter à votre tunnel de développeur.

    Capture d’écran du message sur la connexion au tunnel de développeur et du bouton Continuer.

    Une fois le tunnel de développeur connecté, le système affiche une opération d’API unique que vous pouvez tester pour déterminer si elle fonctionne correctement ou non.

  6. Sélectionnez l’opération GenerateSocialMediaPost pour la développer, puis cliquez sur le bouton Essayer.

    Capture d’écran de l’opération Essayer.

  7. Saisissez l’URL de l’épisode de podcast que vous avez chargé sur Stockage Blob Azure dans l’exercice précédent, puis cliquez sur Exécuter.

  8. Recherchez une réponse de l’opération d’API qui représente une URL d’image et un texte de réseau social que le système génère à partir du son du podcast avec Azure OpenAI.

    Capture d’écran de la réponse de l’opération d’API.

Vous venez de créer une API .NET à l’aide du Kit de développement logiciel (SDK) .NET Azure OpenAI et un connecteur personnalisé depuis Visual Studio. À présent, vous pouvez utiliser l’API dans Microsoft Power Platform.

Étapes suivantes

Vous avez découvert comment créer une API .NET et un connecteur personnalisé associé. Ensuite, vous allez découvrir comment intégrer ce connecteur personnalisé aux outils Microsoft Power Platform.