Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se muestra cómo crear y usar el ejemplo de bloque de creación de seguridad de Azure OpenAI. El propósito es demostrar el aprovisionamiento de cuentas de Azure OpenAI con control de acceso basado en roles (RBAC) para autenticación sin claves mediante Microsoft Entra ID en Azure OpenAI. Este ejemplo de aplicación de chat también incluye toda la infraestructura y la configuración necesarias para aprovisionar Azure recursos de OpenAI e implementar la aplicación en Azure Container Apps mediante la CLI para desarrolladores de Azure.
Siguiendo las instrucciones de este artículo, podrá:
- Implemente una aplicación de chat segura en Azure Container Apps.
- Usa la identidad administrada para acceder a Azure OpenAI.
- Chatea con un modelo de lenguaje grande (LLM) de Azure OpenAI mediante la biblioteca OpenAI.
Una vez finalizado este artículo, puede comenzar a modificar el nuevo proyecto con sus datos y código personalizado.
Nota
En este artículo se usan una o varias plantillas de aplicaciones de IA como base para los ejemplos e instrucciones del artículo. Las plantillas de aplicaciones de IA le proporcionan implementaciones de referencia bien mantenidas y fáciles de implementar que le ayudan a garantizar un punto inicial de alta calidad para sus aplicaciones de IA.
Introducción a la arquitectura
En el siguiente diagrama se muestra una arquitectura sencilla de la aplicación de chat:
La aplicación de chat se ejecuta como una aplicación contenedora de Azure. La aplicación usa la identidad administrada a través de Microsoft Entra ID para autenticarse con Azure OpenAI, en lugar de una clave de API. La aplicación de chat usa Azure OpenAI para generar respuestas a los mensajes del usuario.
La arquitectura de la aplicación se basa en los siguientes servicios y componentes:
- Azure OpenAI representa el proveedor de IA al que se envían las consultas del usuario.
- Azure Container Apps es el entorno de contenedor donde se hospeda la aplicación.
- La identidad administrada nos ayuda a garantizar la seguridad de primer nivel y elimina el requisito de que, como desarrollador, deba administrar de forma segura un dato confidencial.
- Bicep archivos para el aprovisionamiento de recursos Azure, incluidos los roles Azure OpenAI, Azure Container Apps, Azure Container Registry, Azure Log Analytics y RBAC.
- Una aplicación Python
Quart que usa el paquete />Responses para generar respuestas a mensajes de usuario. - Un front-end HTML/JavaScript básico que transmite respuestas desde el back-end mediante líneas JSON a través de ReadableStream.
- Una aplicación web Blazor que utiliza el paquete NuGet Azure.AI.OpenAI para generar respuestas a los mensajes de los usuarios.
- Una aplicación web de TypeScript que usa el paquete npm de OpenAI para generar respuestas a los mensajes del usuario.
Costo
Para mantener los precios lo más bajos posibles en este ejemplo, la mayoría de los recursos usan un plan de tarifa básico o de consumo. Modifique el nivel según sea necesario en función del uso previsto. Una vez que haya terminado con el artículo, puede eliminar los recursos para dejar de incurrir en cargos.
Obtenga más información sobre cost en el repositorio de ejemplo.
Obtenga más información sobre cost en el repositorio de ejemplo.
Obtenga más información sobre cost en el repositorio de ejemplo.
Requisitos previos
Hay disponible un entorno contenedor de desarrollo con todas las dependencias necesarias para completar este artículo. Puede ejecutar el contenedor de desarrollo en GitHub Codespaces (en un explorador) o localmente mediante Visual Studio Code.
Para usar este artículo, necesita los siguientes requisitos previos:
Una suscripción Azure: Crear una gratuita
permisos de cuenta Azure: la cuenta de Azure debe tener permisos
Microsoft.Authorization/roleAssignments/write, como Administrador de acceso de usuario o Owner.cuenta de GitHub
Entorno de desarrollo abierto
Siga estas instrucciones para implementar un entorno de desarrollo preconfigurado que contenga todas las dependencias necesarias para completar este artículo.
GitHub Codespaces ejecuta un contenedor de desarrollo administrado por GitHub con Visual Studio Code para web como interfaz de usuario. Para el entorno de desarrollo más sencillo, use GitHub Codespaces para que tenga las herramientas de desarrollo y las dependencias correctas preinstaladas para completar este artículo.
Importante
Todas las cuentas de GitHub pueden usar Codespaces hasta 60 horas gratuitas cada mes con 2 instancias principales. Para obtener más información, consulte almacenamiento incluido mensualmente y horas de núcleo de GitHub Codespaces.
Siga estos pasos para crear un nuevo GitHub Codespace en la rama main del repositorio de Azure-Samples/openai-chat-app-quickstart GitHub.
Haga clic con el botón derecho en el botón siguiente y seleccione Abrir vínculo en la nueva ventana. Esta acción le permite tener el entorno de desarrollo y la documentación disponibles para su revisión.
En la página Crear codespace, revise la información y, después, seleccione Crear nuevo codespace.
Espere a que se inicie Codespace. Este proceso de startup puede tardar unos minutos.
Inicie sesión en Azure con la CLI para desarrolladores de Azure en el terminal situado en la parte inferior de la pantalla.
azd auth loginCopie el código del terminal y péguelo en un navegador. Siga las instrucciones para autenticarse con su cuenta de Azure.
Las tareas restantes de este artículo tienen lugar en el contexto de este contenedor de desarrollo.
Siga estos pasos para crear un nuevo GitHub Codespace en la rama main del repositorio de Azure-Samples/openai-chat-app-quickstart-dotnet GitHub.
Haga clic con el botón derecho en el botón siguiente y seleccione Abrir vínculo en la nueva ventana. Esta acción le permite tener el entorno de desarrollo y la documentación disponibles para su revisión.
En la página Crear codespace, revise la información y, después, seleccione Crear codespace.
Espere a que se inicie Codespace. Este proceso de startup puede tardar unos minutos.
Inicie sesión en Azure con la CLI para desarrolladores de Azure en el terminal situado en la parte inferior de la pantalla.
azd auth loginCopie el código del terminal y péguelo en un navegador. Siga las instrucciones para autenticarse con su cuenta de Azure.
Las tareas restantes de este artículo tienen lugar en el contexto de este contenedor de desarrollo.
Siga estos pasos para crear un nuevo GitHub Codespace en la rama main del repositorio de Azure-Samples/openai-chat-app-quickstart-javascript GitHub.
- Haga clic con el botón derecho en el botón siguiente y seleccione Abrir vínculo en la nueva ventana. Esta acción le permite tener el entorno de desarrollo y la documentación disponibles para su revisión.
En la página Crear codespace, revise la información y, después, seleccione Crear nuevo codespace.
Espere a que se inicie Codespace. Este proceso de startup puede tardar unos minutos.
Inicie sesión en Azure con la CLI para desarrolladores de Azure en el terminal situado en la parte inferior de la pantalla.
azd auth loginCopie el código del terminal y péguelo en un navegador. Siga las instrucciones para autenticarse con su cuenta de Azure.
Las tareas restantes de este artículo tienen lugar en el contexto de este contenedor de desarrollo.
Implementación y ejecución
El repositorio de ejemplo contiene todos los archivos de código y configuración para la implementación en Azure de la app de chat. Los siguientes pasos le guiarán a través del proceso de implementación de la aplicación de chat de ejemplo en Azure.
Implementación de la aplicación de chat en Azure
Importante
Los recursos de Azure creados en esta sección incurren en costos de inmediato. Estos recursos pueden acumular costos incluso si interrumpe el comando antes de que se ejecute por completo.
Ejecute el siguiente comando Azure Developer CLI para el aprovisionamiento de recursos de Azure y la implementación del código fuente:
azd upUse la siguiente tabla para responder a las solicitudes:
Pronto Respuesta Nombre del entorno Hágala corta y en minúsculas. Agregue su nombre o alias. Por ejemplo, secure-chat. Se usa como parte del nombre del grupo de recursos.Suscripción Seleccione la suscripción en la que crear los recursos. Ubicación (para el hospedaje) Seleccione una ubicación cercana en la lista. Localización del modelo OpenAI Seleccione una ubicación cercana en la lista. Si está disponible la misma ubicación que la primera, selecciónela. Espere hasta que se implemente la aplicación. La implementación suele tardar entre 5 y 10 minutos en completarse.
Uso de la aplicación de chat para formular preguntas al modelo de lenguaje grande
El terminal muestra una dirección URL después de una implementación correcta de la aplicación.
Seleccione esa URL etiquetada
Deploying service webpara abrir la aplicación de chat en un navegador.En el explorador, escriba una pregunta como "¿Por qué es mejor la identidad administrada que las claves?".
La respuesta procede de Azure OpenAI y se muestra el resultado.
Exploración del código de ejemplo
Aunque OpenAI y Azure OpenAI Service dependen de una biblioteca cliente común de Python, se necesitan pequeños cambios de código al usar los puntos de conexión de Azure OpenAI. Veamos cómo este ejemplo configura la autenticación sin claves con Microsoft Entra ID y se comunica con Azure OpenAI.
Configurar la autenticación con identidad administrada
En este ejemplo, el archivo src/quartapp/chat.py comienza con la configuración de la autenticación sin claves.
En el fragmento de código siguiente se usa el módulo azure.identity.aio para crear un flujo de autenticación asincrónico Microsoft Entra.
El siguiente fragmento de código usa la variable de entorno AZURE_CLIENT_IDazd para crear una instancia de ManagedIdentityCredential capaz de autenticarse a través de una identidad administrada asignada por el usuario.
user_assigned_managed_identity_credential = ManagedIdentityCredential(client_id=os.getenv("AZURE_CLIENT_ID"))
Nota
Las variables de entorno del recurso azd se aprovisionan durante la implementación de la aplicación azd.
El siguiente fragmento de código usa AZURE_TENANT_IDazd variable de entorno de recursos para crear una instancia de AzureDeveloperCliCredential capaz de autenticarse con el inquilino de Microsoft Entra actual.
azure_dev_cli_credential = AzureDeveloperCliCredential(tenant_id=os.getenv("AZURE_TENANT_ID"), process_timeout=60)
La biblioteca cliente de Azure Identity proporciona credenciales, clases públicas que implementan el protocolo TokenCredential de la biblioteca Azure Core. Una credencial representa un flujo de autenticación distinto para adquirir un token de acceso de Microsoft Entra ID. Estas credenciales se pueden encadenar para formar una secuencia ordenada de mecanismos de autenticación que se van a intentar.
El fragmento de código siguiente crea una ChainedTokenCredential mediante una ManagedIdentityCredential y una AzureDeveloperCliCredential:
- El
ManagedIdentityCredentialse usa para Azure Functions, Azure App Service y Azure Container Apps. Se admite una identidad administrada asignada por el usuario pasando elclient_idaManagedIdentityCredential. - La
AzureDeveloperCliCredentialse usa para el desarrollo local. Se estableció anteriormente en función del inquilino de Microsoft Entra que se va a usar.
azure_credential = ChainedTokenCredential(
user_assigned_managed_identity_credential,
azure_dev_cli_credential
)
Sugerencia
El orden de las credenciales es importante, ya que se usa el primer token de acceso Microsoft Entra válido. Para obtener más información, consulte el artículo Información general sobre ChainedTokenCredential.
El siguiente fragmento de código obtiene el proveedor de tokens de Azure OpenAI según la credencial de Azure seleccionada. Este valor se obtiene llamando a azure.identity.aio.get_bearer_token_provider con dos argumentos:
azure_credential: la instancia deChainedTokenCredentialcreada anteriormente para autenticar la solicitud.https://cognitiveservices.azure.com/.default: Se requiere uno o varios ámbitos de token de portador. En este caso, el punto de conexión Azure Cognitive Services.
token_provider = get_bearer_token_provider(
azure_credential, "https://cognitiveservices.azure.com/.default"
)
Las líneas siguientes comprueban las variables de entorno necesarias AZURE_OPENAI_ENDPOINT y AZURE_OPENAI_CHAT_DEPLOYMENT, dos variables de entorno azd que se establecen durante el aprovisionamiento azd. Si un valor no está presente, se produce un error.
openai_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
if not openai_endpoint:
raise ValueError("AZURE_OPENAI_ENDPOINT is required for Azure OpenAI")
if not os.getenv("AZURE_OPENAI_CHAT_DEPLOYMENT"):
raise ValueError("AZURE_OPENAI_CHAT_DEPLOYMENT is required for Azure OpenAI")
Este fragmento de código inicializa el cliente de OpenAI en el punto de conexión de /openai/v1/ de Azure, pasando el proveedor de tokens como api_key. No api_version es necesario con el endpoint v1.
bp.openai_client = AsyncOpenAI(
base_url=f"{openai_endpoint.rstrip('/')}/openai/v1/",
api_key=token_provider,
)
En la línea siguiente se establece el nombre de implementación del modelo de Azure OpenAI para su uso en llamadas a la API.
bp.openai_model = os.getenv("AZURE_OPENAI_CHAT_DEPLOYMENT")
Nota
OpenAI usa el argumento de palabra clave model para especificar qué modelo se va a usar. Azure OpenAI tiene el concepto de implementaciones de modelos únicas. Al usar Azure OpenAI, model debe hacer referencia al nombre del despliegue subyacente elegido durante la implementación del modelo de Azure OpenAI.
Una vez completada esta función, el cliente está configurado y listo para interactuar correctamente con Azure servicios de OpenAI.
Transmisión de respuestas mediante la API de respuestas de OpenAI
response_stream controla la llamada de streaming de la API de respuestas en la ruta. El frontend envía elementos con forma de Respuestasinput directamente, y el backend los reenvía a responses.stream():
async def response_stream():
try:
async with bp.openai_client.responses.stream(
model=bp.openai_model,
input=request_input,
store=False,
) as openai_stream:
async for event in openai_stream:
yield json.dumps(event.model_dump(), ensure_ascii=False) + "\n"
except Exception as e:
current_app.logger.exception("Responses stream failed")
yield json.dumps({"error": str(e)}, ensure_ascii=False) + "\n"
Exploración del código de ejemplo
Las aplicaciones .NET se basan en la biblioteca cliente Azure.AI.OpenAI para comunicarse con los servicios de Azure OpenAI, que depende de la biblioteca OpenAI. La aplicación de ejemplo configura la autenticación sin claves mediante Microsoft Entra ID para comunicarse con Azure OpenAI.
Configuración de la autenticación y el registro de servicios
En este ejemplo, la autenticación sin claves se configura en el archivo program.cs. El siguiente fragmento de código usa la variable de entorno AZURE_CLIENT_ID establecida por azd para crear una instancia de ManagedIdentityCredential capaz de autenticarse a través de una identidad administrada asignada por el usuario.
var userAssignedIdentityCredential =
new ManagedIdentityCredential(builder.Configuration.GetValue<string>("AZURE_CLIENT_ID"));
Nota
Las variables de entorno del recurso azd se aprovisionan durante la implementación de la aplicación azd.
El siguiente fragmento de código usa la variable de entorno AZURE_TENANT_ID establecida por azd para crear una instancia de AzureDeveloperCliCredential capaz de autenticarse localmente mediante la cuenta que inició sesión en azd.
var azureDevCliCredential = new AzureDeveloperCliCredential(
new AzureDeveloperCliCredentialOptions()
{
TenantId = builder.Configuration.GetValue<string>("AZURE_TENANT_ID")
});
La biblioteca cliente de Azure Identity proporciona clases de credenciales que implementan el protocolo TokenCredential de la biblioteca Azure Core. Una credencial representa un flujo de autenticación distinto para adquirir un token de acceso de Microsoft Entra ID. Estas credenciales se pueden encadenar con ChainedTokenCredential para formar una secuencia ordenada de mecanismos de autenticación que se van a intentar.
El fragmento de código siguiente registra el AzureOpenAIClient para la inyección de dependencias y crea una ChainedTokenCredential mediante una ManagedIdentityCredential y una AzureDeveloperCliCredential:
- El
ManagedIdentityCredentialse usa para Azure Functions, Azure App Service y Azure Container Apps. Se admite una identidad administrada asignada por el usuario utilizando elAZURE_CLIENT_IDque fue proporcionado aManagedIdentityCredential. - La
AzureDeveloperCliCredentialse usa para el desarrollo local. Se estableció previamente en función de la entidad de Microsoft Entra que se está usando.
builder.Services.AddAzureClients(
clientBuilder => {
clientBuilder.AddClient<AzureOpenAIClient, AzureOpenAIClientOptions>((options, _, _)
=> new AzureOpenAIClient(
new Uri(endpoint),
new ChainedTokenCredential(
userAssignedIdentityCredential, azureDevCliCredential), options));
});
Sugerencia
El orden de las credenciales es importante, ya que se usa el primer token de acceso Microsoft Entra válido. Para obtener más información, consulte el artículo Información general sobre ChainedTokenCredential.
Obtención de finalizaciones de chat mediante el cliente de OpenAI de Azure
La aplicación web de Blazor inyecta el AzureOpenAIClient registrado en la parte superior del componente Home.Razor:
@inject AzureOpenAIClient azureOpenAIClient
Cuando el usuario envía el formulario, el AzureOpenAIClient envía su solicitud al modelo de OpenAI para generar una finalización:
ChatClient chatClient = azureOpenAIClient.GetChatClient("gpt-4o-mini");
messages.Add(new UserChatMessage(model.UserMessage));
ChatCompletion completion = await chatClient.CompleteChatAsync(messages);
messages.Add(new SystemChatMessage(completion.Content[0].Text));
Exploración del código de ejemplo
Aunque OpenAI y el servicio Azure OpenAI dependen de una openai (biblioteca cliente común de JavaScript), se necesitan pequeños cambios de código al usar los puntos de conexión de Azure OpenAI. Veamos cómo este ejemplo configura la autenticación sin claves con Microsoft Entra ID y se comunica con Azure OpenAI.
Autenticación sin claves para cada entorno
La biblioteca cliente de Azure Identity proporciona clases de credenciales que implementan el protocolo de Azure Core library TokenCredential. Una credencial representa un flujo de autenticación distinto para adquirir un token de acceso de Microsoft Entra ID. Estas credenciales se pueden encadenar mediante chainedTokenCredential para formar una secuencia ordenada de mecanismos de autenticación que se van a intentar. Esto le permite implementar el mismo código en entornos de producción y desarrollo local.
Configurar la autenticación con identidad administrada
En este ejemplo, el ./src/azure-authentication.ts proporciona varias funciones para proporcionar autenticación sin claves para Azure OpenAI.
La primera función, getChainedCredential(), devuelve la primera credencial Azure válida que se encuentra en la cadena.
function getChainedCredential() {
return new ChainedTokenCredential(
new ManagedIdentityCredential(process.env.AZURE_CLIENT_ID!),
new AzureDeveloperCliCredential({
tenantId: process.env.AZURE_TENANT_ID! ? process.env.AZURE_TENANT_ID! : undefined
})
);
}
- ManagedIdentityCredential se prueba primero. Se configura con la variable de entorno AZURE_CLIENT_ID en tiempo de ejecución de producción y es capaz de autenticarse a través de la identidad administrada asignada por el usuario.
-
AzureDeveloperCliCredential se intenta en segundo lugar. Se configura cuando un desarrollador inicia sesión con la CLI para desarrolladores de Azure mediante
azd auth login.
Sugerencia
El orden de las credenciales es importante, ya que se usa el primer token de acceso Microsoft Entra válido. Para obtener más información, consulte el artículo Información general sobre ChainedTokenCredential.
Obtención del token de portador para OpenAI
La segunda función de ./src/azure-authentication.ts es getTokenProvider(), que devuelve un callback que proporciona un token de portador con alcance en el punto de conexión de Azure Cognitive Services.
function getTokenProvider(): () => Promise<string> {
const credential = getChainedCredential();
const scope = "https://cognitiveservices.azure.com/.default";
return getBearerTokenProvider(credential, scope);
}
El fragmento de código anterior usa getBearerTokenProvider para tomar la credencial y el ámbito, y luego devuelve una devolución de llamada que proporciona un token portador.
Creación de un cliente de OpenAI autenticado Azure
La tercera función de ./src/azure-authentication.ts es getOpenAiClient(), que devuelve el cliente openAI de Azure.
export function getOpenAiClient(): AzureOpenAI | undefined{
try {
if (!process.env.AZURE_OPENAI_ENDPOINT) {
throw new Error("AZURE_OPENAI_ENDPOINT is required for Azure OpenAI");
}
if (!process.env.AZURE_OPENAI_CHAT_DEPLOYMENT) {
throw new Error("AZURE_OPENAI_CHAT_DEPLOYMENT is required for Azure OpenAI");
}
const options = {
azureADTokenProvider: getTokenProvider(),
deployment: process.env.AZURE_OPENAI_CHAT_DEPLOYMENT!,
apiVersion: process.env.AZURE_OPENAI_API_VERSION! || "2024-02-15-preview",
endpoint: process.env.AZURE_OPENAI_ENDPOINT!
}
// Create the Asynchronous Azure OpenAI client
return new AzureOpenAI (options);
} catch (error) {
console.error('Error getting Azure OpenAI client: ', error);
}
}
Este código toma las opciones, incluido el token con ámbito correcto, y crea el cliente de AzureOpenAI.
Transmisión de respuesta de chat con Azure OpenAI
Use el siguiente controlador de rutas fastify en ./src/openai-chat-api.ts para enviar un mensaje a Azure OpenAI y transmitir la respuesta.
import { FastifyReply, FastifyRequest } from 'fastify';
import { AzureOpenAI } from "openai";
import { getOpenAiClient } from './azure-authentication.js';
import { ChatCompletionChunk, ChatCompletionMessageParam } from 'openai/resources/chat/completions';
interface ChatRequestBody {
messages: ChatCompletionMessageParam [];
}
export async function chatRoute (request: FastifyRequest<{ Body: ChatRequestBody }>, reply: FastifyReply) {
const requestMessages: ChatCompletionMessageParam[] = request?.body?.messages;
const openaiClient: AzureOpenAI | undefined = getOpenAiClient();
if (!openaiClient) {
throw new Error("Azure OpenAI client is not configured");
}
const allMessages = [
{ role: "system", content: "You are a helpful assistant."},
...requestMessages
] as ChatCompletionMessageParam [];
const chatCompletionChunks = await openaiClient.chat.completions.create({
// Azure Open AI takes the deployment name as the model name
model: process.env.AZURE_OPENAI_CHAT_DEPLOYMENT_MODEL || "gpt-4o-mini",
messages: allMessages,
stream: true
})
reply.raw.setHeader('Content-Type', 'text/html; charset=utf-8');
reply.raw.setHeader('Cache-Control', 'no-cache');
reply.raw.setHeader('Connection', 'keep-alive');
reply.raw.flushHeaders();
for await (const chunk of chatCompletionChunks as AsyncIterable<ChatCompletionChunk>) {
for (const choice of chunk.choices) {
reply.raw.write(JSON.stringify(choice) + "\n")
}
}
reply.raw.end()
}
La función obtiene la conversación de chat, incluidos los mensajes anteriores, y los envía a Azure OpenAI. A medida que los fragmentos de flujo se devuelven de Azure OpenAI, se envían al cliente.
Otras consideraciones de seguridad
En este artículo se muestra cómo usa el ejemplo ChainedTokenCredential para autenticarse en el servicio OpenAI de Azure.
El ejemplo también tiene un GitHub Action que examina los archivos de infraestructura como código y genera un informe que contiene los problemas detectados. Para garantizar los procedimientos recomendados continuos en su propio repositorio, se recomienda que cualquier persona que cree soluciones basadas en nuestras plantillas asegúrese de que la configuración de examen de secretos GitHub esté habilitada.
Considere otras medidas de seguridad, como:
Restringir el acceso al conjunto adecuado de usuarios de la aplicación utilizando Microsoft Entra.
Proteger la instancia de Azure Container Apps con un firewall o Virtual Network.
Limpieza de recursos
Limpieza de recursos de Azure
Los recursos de Azure creados en este artículo se facturan a su suscripción de Azure. Si no espera necesitar estos recursos en el futuro, elimínelos para evitar incurrir en más gastos.
Para eliminar los recursos de Azure y quitar el código fuente, ejecute el siguiente comando de la CLI para desarrolladores de Azure:
azd down --purge
Limpieza de GitHub Codespaces
Al eliminar el entorno de GitHub Codespaces, se asegura que puedas maximizar la cantidad de horas gratuitas por núcleo disponibles para tu cuenta.
Importante
Para obtener más información sobre los derechos de su cuenta de GitHub, consulte almacenamiento y horas centrales mensuales incluidas en GitHub Codespaces.
Inicie sesión en el panel GitHub Codespaces.
Busque los codespaces que estás ejecutando actualmente desde el repositorio de
Azure-Samples/openai-chat-app-quickstartGitHub.Abra el menú contextual del codespace y, a continuación, seleccione Eliminar.
Inicie sesión en el panel GitHub Codespaces.
Localice sus codespaces que están ejecutándose actualmente desde el repositorio de GitHub
Azure-Samples/openai-chat-app-quickstart-dotnet.Abra el menú contextual del codespace y, a continuación, seleccione Eliminar.
Inicie sesión en el panel GitHub Codespaces.
Localice los Codespaces que se ejecutan actualmente en el repositorio de
Azure-Samples/openai-chat-app-quickstart-javascriptGitHub.Abra el menú contextual del codespace y, a continuación, seleccione Eliminar.
Obtener ayuda
Si no se soluciona el problema, registre su problema en el repositorio Issues.
Pasos siguientes
Si no se soluciona el problema, registre su problema en el repositorio Issues.
Si no se soluciona el problema, registre su problema en el repositorio Issues.