Exercice : créer un connecteur personnalisé pour votre copilote
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 à :
télécharger et installer l’édition Visual Studio Community ;
télécharger et installer la version la plus récente de .NET ;
ajouter et configurer un Plan pour développeurs Power Apps : assurez-vous qu’il est défini sur la même adresse e-mail que celle de votre compte Azure.
É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 :
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.
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 :
Ouvrez Visual Studio et cliquez sur Créer un projet.
Recherchez API web et sélectionnez API web ASP.NET Core. Veillez à sélectionner le modèle de projet C#.
Cliquez sur Suivant.
Nommez votre projet PodcastAppAPI, puis cliquez sur Suivant.
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.
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.
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.13Exé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 :
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.
Ajoutez les instructions using suivantes en haut de la classe PodcastCopilot :
using System.Web; using Azure.AI.OpenAI; using Azure; using Newtonsoft.Json.Linq;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));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; }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; }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; }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; }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; }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 :
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 :
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.
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.
Cliquez sur Suivant > Terminer.
Une fois le processus de configuration des dépendances terminé, fermez la fenêtre contextuelle.
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.
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.
Sélectionnez l’opération GenerateSocialMediaPost pour la développer, puis cliquez sur le bouton Essayer.
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.
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.
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.









