Ejercicio: Crear un conector personalizado para su copiloto
Información general
Este ejercicio amplía lo visto en el ejercicio Configurar Azure OpenAI Service para generar información sobre su podcast. Las tareas para este ejercicio son crear una API .NET mediante el SDK de Azure OpenAI para .NET y crear un conector personalizado desde Visual Studio.
Definiciones
Las siguientes secciones proporcionan definiciones de elementos importantes que necesita conocer para este ejercicio.
.NET
.NET es una plataforma de desarrollador de código abierto gratuita y multiplataforma para crear muchos tipos diferentes de aplicaciones. Con .NET, puede usar múltiples lenguajes, editores y bibliotecas a fin de crear para la web, dispositivos móviles, ordenadores, juegos, Internet de las cosas (IdC) e IA.
Para obtener más información, consulte Introducción a .NET.
SDK de Azure OpenAI para .NET
La biblioteca cliente de Azure OpenAI para .NET es una adaptación de las API de REST de OpenAI que proporciona una interfaz idiomática y una rica integración con el resto del ecosistema del SDK de Azure. Se puede conectar a los recursos de Azure OpenAI o al punto de conexión de inferencia de Azure OpenAI, así que es una excelente opción para el desarrollo fuera de Azure OpenAI.
Para obtener más información, consulte Biblioteca cliente de Azure OpenAI para .NET.
Microsoft Power Platform
Microsoft Power Platform ayuda a las organizaciones porque les da a los empleados las herramientas necesarias para crear sus propias soluciones a través de un conjunto de servicios intuitivos y sin código o con poco código. Estos servicios ayudan a simplificar el proceso de creación de soluciones. Con Microsoft Power Platform, puede construir soluciones en días o semanas, en lugar de meses o años. Microsoft Power Platform se compone de cinco productos clave: Power Apps, Power Automate, Power BI, Power Virtual Agents y Power Pages.
Para obtener más información, consulte Microsoft Power Platform.
Conector personalizado
Microsoft Azure Logic Apps, Microsoft Power Automate y Microsoft Power Apps ofrecen más de 1000 conectores para conectarse a Microsoft y servicios verificados. Sin embargo, es posible que desee comunicarse con servicios que no están disponibles como conectores prediseñados. Este es el objetivo de los conectores personalizados: le permiten crear, y hasta compartir, un conector con sus propios desencadenadores y acciones.
Para obtener más información, consulte Conectores personalizados.
Requisitos previos
Para este ejercicio, debe hacer lo siguiente:
Descargar e instalar Visual Studio Community Edition.
Descargar e instalar la última versión de .NET.
Agregar y configurar un Plan para desarrolladores de Power Apps. Comprobar que se ha configurado en la misma dirección de correo electrónico que su cuenta de Azure.
Pasos del ejercicio
El siguiente vídeo analiza los pasos para el ejercicio de esta unidad.
Configurar variables de entorno
Para configurar las variables de entorno, siga estos pasos:
Abra un símbolo del sistema y ejecute los siguientes comandos uno a uno:
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/El comando anterior se usaría para la clave y el punto final de recurso de Oeste de Europa.
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/"El comando anterior se usaría para la clave y el punto final de recurso de Centro de Suecia.
setx BING_SEARCH_KEY "REPLACE_WITH_YOUR_KEY_VALUE_HERE"El comando anterior se usaría para la clave y el punto final de recurso de Búsqueda de Bing.
Después de configurar las variables de entorno, cierre el símbolo del sistema.
Crear un nuevo proyecto API web en .NET
La siguiente tarea consiste en crear un nuevo proyecto API web en .NET siguiendo estos pasos:
Abra Visual Studio y seleccione Crear un nuevo proyecto.
Busque API web y seleccione API web principal de ASP.NET. Seleccione la plantilla de proyecto C#.
Seleccione Siguiente.
Póngale al proyecto el nombre PodcastAppAPI y seleccione Siguiente.
Compruebe que el Framework se haya configurado en .NET 8 y el Tipo de autenticación como Ninguno, y que la opción Configurar para HTTPS esté seleccionada. Seleccione Crear.
Cuando el sistema haya creado el proyecto, abra el Explorador de soluciones, haga clic con el botón derecho en el proyecto PodcastAppAPI para abrir el menú contextual y seleccione Abrir en terminal.
En la ventana de terminal, ejecute el siguiente comando para instalar la versión preliminar del SDK de Azure OpenAI:
dotnet add package Azure.AI.OpenAI --version 1.0.0-beta.13Ejecute el siguiente comando para instalar el paquete Newtonsoft.Json:
dotnet add package Newtonsoft.Json --version 13.0.3
Crear la clase PodcastCopilot
Para crear la clase PodcastCopilot, siga estos pasos:
Cuando se complete el comando, agregue una nueva clase al proyecto haciendo clic derecho en el proyecto PodcastAppAPI para abrir el menú contextual. Luego, seleccione Agregar > Clase. Póngale a la clase el nombre PodcastCopilot.
Agregue las siguientes declaraciones using en la parte superior de la clase PodcastCopilot:
using System.Web; using Azure.AI.OpenAI; using Azure; using Newtonsoft.Json.Linq;Dentro de la clase PodcastCopilot, agregue el siguiente código:
//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));Debajo del código anterior, agregue el siguiente código para realizar la transcripción de 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; }Agregue el siguiente código para llevar a cabo la extracción del nombre de invitado:
//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; }Agregue el siguiente código a la clase PodcastCopilot para realizar la extracción de biografía de invitados desde 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; }Agregue el siguiente código para el siguiente paso del proceso PodcastCopilot: crear un comentario en redes sociales.
//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; }Agregue el siguiente código para el siguiente paso del proceso PodcastCopilot: crear una solicitud Dall.E.
//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; }Agregue el siguiente código para el siguiente paso del proceso PodcastCopilot: generar la imagen en redes sociales desde 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(); }
Ya ha creado la clase PodcastCopilot, que contiene los métodos para realizar un proceso que consiste en tomar una URL de podcast y devolver una imagen y publicación en redes sociales para ese podcast. Ahora, ya puede crear la clase SocialMediaPost.
Crear la clase SocialMediaPost
La siguiente tarea consiste en crear la clase SocialMediaPost.
Para empezar, haga clic derecho en el proyecto PodcastAppAPI para abrir el menú contextual. Luego, seleccione Agregar > Clase. Póngale a la clase el nombre SocialMediaPost y agregue el siguiente código a la clase:
```
public class SocialMediaPost
{
public string ImageUrl { get; set; }
public string Blurb { get; set; }
}
```
La clase sería ser similar a lo mostrado en el siguiente ejemplo.
Tras crear la clase SocialMediaPost, puede agregar un método más a la clase PodcastCopilot a fin de devolver un objeto SocialMediaPost.
Actualizar la clase PodcastCopilot
Para actualizar la clase PodcastCopilot, abra la clase PodcastCopilot y agregue el siguiente método en la clase:
```
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;
}
```
Ahora, ya puede actualizar el archivo Program.cs para poder implementar la API Minimal.
Actualizar el archivo Program.cs con la implementación de la API Minimal
La siguiente tarea consiste en actualizar el archivo Program.cs con la implementación de la API Minimal.
Para ello, comience abriendo el archivo Program.cs. Luego, reemplace todo el código de este archivo con el siguiente código:
```
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();
```
Ahora, ya puede convertir su API en un conector personalizado y usarlo en Microsoft Power Platform.
Crear un conector personalizado desde Visual Studio
Siga estos pasos para crear un conector personalizado desde Visual Studio:
En el Explorador de soluciones, haga clic derecho en el nodo Servicios conectados para abrir el menú contextual. Luego, seleccione Agregar > Microsoft Power Platform.
Compruebe que ha iniciado sesión con la misma cuenta que en el Plan para desarrolladores de Power Apps. Luego, en la ventana emergente Conectarse a Microsoft Power Platform, establezca la siguiente configuración.
Entornos de Power Platform: seleccione el entorno que desee.
Soluciones de Power Platform: seleccione la solución que desee.
Conectores personalizados: cree un nuevo conector personalizado y póngale el nombre PodcastCopilot_Connector.
Especificación de OpenAPI: seleccione la opción Generar automáticamente la especificación V2 de OpenAPI.
Seleccionar un túnel de desarrollo público: cree un nuevo túnel de desarrollo y póngale el nombre PodcastCopilot_Tunnel.
Seleccione Siguiente > Finalizar.
Tras completar el proceso de configuración de dependencia, cierre la ventana emergente.
Ejecute la aplicación. Si recibe el siguiente mensaje en la ventana del navegador, seleccione Continuar para conectarse a su túnel de desarrollo.
Tras la conexión del túnel de desarrollo, el sistema muestra una única operación de API que puede probar para determinar si funciona correctamente o no.
Seleccione la operación GenerateSocialMediaPost para expandirla y, luego, seleccione el botón Pruébelo.
Introduzca la URL del episodio de podcast que cargó en Azure Blob Storage en el ejercicio anterior y seleccione Ejecutar.
Si está atento, verá una respuesta de la operación API con una URL de imagen y un comentario de redes sociales que el sistema genera a partir del audio del podcast con Azure OpenAI.
Ya ha creado una API .NET mediante el SDK de Azure OpenAI para .NET, además de un conector personalizado desde Visual Studio. Ahora, puede usar la API en Microsoft Power Platform.
Siguientes pasos
Ha visto cómo crear una API .NET y un conector personalizado relacionado. A continuación, aprenderá a integrar ese conector personalizado en Microsoft Power Platform Tools.









