Introdução ao Building Block de segurança do OpenAI do Azure
Este artigo mostra como criar e usar o exemplo de bloco de construção de segurança do OpenAI do Azure. O objetivo é demonstrar o provisionamento de conta do Azure OpenAI com RBAC (controle de acesso baseado em função) para autenticação sem chave (ID do Microsoft Entra) para o Azure OpenAI. Este exemplo de aplicativo de chat também inclui toda a infraestrutura e configuração necessárias para provisionar recursos do Azure OpenAI e implantar o aplicativo nos Aplicativos de Contêiner do Azure usando a CLI do Desenvolvedor do Azure.
Seguindo as instruções neste artigo, você vai:
- Implante um aplicativo de chat de contêiner do Azure seguro.
- Use a identidade gerenciada para acesso ao OpenAI do Azure.
- Converse com um LLM (Modelo de Linguagem Grande) do OpenAI do Azure usando a biblioteca OpenAI.
Depois de concluir este artigo, você poderá começar a modificar o novo projeto com seu código e seus dados personalizados.
Observação
Este artigo usa um ou mais modelos de aplicativo de IA como base para os exemplos e as diretrizes no artigo. Os modelos de aplicativo de IA fornecem implementações de referência regulares e fáceis de implantar que ajudam a garantir um ponto de partida de alta qualidade para os aplicativos de IA.
Visão geral da arquitetura
Uma arquitetura simples do aplicativo de bate-papo é mostrada no diagrama a seguir:
O aplicativo de chat é executado como um Aplicativo de Contêiner do Azure. O aplicativo usa a identidade gerenciada por meio da ID do Microsoft Entra para autenticar com o Azure OpenAI, em vez de uma chave de API. O aplicativo de chat usa o Azure OpenAI para gerar respostas às mensagens do usuário.
A arquitetura do aplicativo depende dos seguintes serviços e componentes:
- O OpenAI do Azure representa o provedor de IA para o qual enviamos as consultas do usuário.
- Os Aplicativos de Contêiner do Azure são o ambiente de contêiner em que o aplicativo está hospedado.
- A Identidade Gerenciada nos ajuda a garantir a melhor segurança da categoria e elimina a necessidade de você, como desenvolvedor, gerenciar com segurança um segredo.
- Arquivos Bicep para provisionamento de recursos do Azure, incluindo Azure OpenAI, Aplicativos de Contêiner do Azure, Registro de Contêiner do Azure, Azure Log Analytics e funções RBAC.
- O Protocolo de Chat de IA da Microsoft fornece contratos de API padronizados em soluções e linguagens de IA. O aplicativo de chat está em conformidade com o Protocolo de Chat de IA da Microsoft, que permite que o aplicativo de avaliações seja executado em qualquer aplicativo de chat que esteja em conformidade com o protocolo.
- Um Python Quart que usa o
openai
pacote para gerar respostas às mensagens do usuário. - Um front-end HTML / JavaScript básico que transmite respostas do back-end usando JSON Lines em um ReadableStream.
- Um aplicativo Web Blazor que usa o pacote NuGet Azure.AI.OpenAI para gerar respostas às mensagens do usuário.
- Um aplicativo Web TypeScript que usa o pacote openai npm para gerar respostas às mensagens do usuário.
Custo
Em uma tentativa de manter os preços o mais baixo possível neste exemplo, a maioria dos recursos usa um tipo de preço básico ou de consumo. Altere seu nível conforme necessário com base no uso pretendido. Para parar de incorrer em cobranças, exclua os recursos quando terminar o artigo.
Saiba mais sobre o custo no repositório de exemplo.
Saiba mais sobre o custo no repositório de exemplo.
Saiba mais sobre o custo no repositório de exemplo.
Pré-requisitos
Um ambiente de contêiner de desenvolvimento está disponível com todas as dependências necessárias para concluir este artigo. Você pode executar o contêiner de desenvolvimento em Codespaces do GitHub (em um navegador) ou localmente usando o Visual Studio Code.
Para usar este artigo, você precisa cumprir os seguintes pré-requisitos:
Uma assinatura do Azure – crie uma gratuitamente
Permissões de conta do Azure – sua conta do Azure deve ter
Microsoft.Authorization/roleAssignments/write
permissões, como Administrador ou Proprietário de Acesso do Usuário.GitHub
Abrir o ambiente de desenvolvimento
Use as instruções a seguir para implantar um ambiente de desenvolvimento pré-configurado contendo todas as dependências necessárias para concluir este artigo.
O GitHub Codespaces executa um contêiner de desenvolvimento gerenciado pelo GitHub com o Visual Studio Code para Web como interface do usuário. Para o ambiente de desenvolvimento mais simples, use os Codespaces do GitHub para que você tenha as ferramentas e dependências de desenvolvedor corretas pré-instaladas para concluir este artigo.
Importante
Todas as contas do GitHub podem usar Codespaces por até 60 horas gratuitas por mês com 2 instâncias principais. Para saber mais, confira Armazenamento e horas por núcleo incluídos mensalmente no GitHub Codespaces.
Use as etapas a seguir para criar um novo GitHub Codespace no main
branch do Azure-Samples/openai-chat-app-quickstart
repositório GitHub.
Clique com o botão direito do mouse no botão a seguir e selecione Abrir link em uma nova janela. Essa ação permite que você tenha o ambiente de desenvolvimento e a documentação disponíveis para revisão.
Na página Criar codespace , examine e selecione Criar novo codespace
Aguarde até que o codespace seja iniciado. Esse processo de inicialização pode levar alguns minutos.
Entre no Azure com a CLI do Desenvolvedor do Azure no terminal na parte inferior da tela.
azd auth login
Copie o código do terminal e cole-o em um navegador. Siga as instruções para autenticar com sua conta do Azure.
As tarefas restantes neste artigo ocorrem no contexto desse contêiner de desenvolvimento.
Use as etapas a seguir para criar um novo GitHub Codespace no main
branch do Azure-Samples/openai-chat-app-quickstart-dotnet
repositório GitHub.
Clique com o botão direito do mouse no botão a seguir e selecione Abrir link em uma nova janela. Essa ação permite que você tenha o ambiente de desenvolvimento e a documentação disponíveis para revisão.
Na página Criar codespace , examine e selecione Criar codespace
Aguarde até que o codespace seja iniciado. Esse processo de inicialização pode levar alguns minutos.
Entre no Azure com a CLI do Desenvolvedor do Azure no terminal na parte inferior da tela.
azd auth login
Copie o código do terminal e cole-o em um navegador. Siga as instruções para autenticar com sua conta do Azure.
As tarefas restantes neste artigo ocorrem no contexto desse contêiner de desenvolvimento.
Use as etapas a seguir para criar um novo GitHub Codespace no main
branch do Azure-Samples/openai-chat-app-quickstart-javascript
repositório GitHub.
- Clique com o botão direito do mouse no botão a seguir e selecione Abrir link em uma nova janela. Essa ação permite que você tenha o ambiente de desenvolvimento e a documentação disponíveis para revisão.
Na página Criar codespace , examine e selecione Criar novo codespace
Aguarde até que o codespace seja iniciado. Esse processo de inicialização pode levar alguns minutos.
Entre no Azure com a CLI do Desenvolvedor do Azure no terminal na parte inferior da tela.
azd auth login
Copie o código do terminal e cole-o em um navegador. Siga as instruções para autenticar com sua conta do Azure.
As tarefas restantes neste artigo ocorrem no contexto desse contêiner de desenvolvimento.
Implantar e executar
O repositório de exemplo contém todos os arquivos de código e configuração para a implantação do aplicativo de chat do Azure. As etapas a seguir orientam você pelo processo de implantação do aplicativo de chat de exemplo do Azure.
Implantar aplicativo de chat no Azure
Importante
Os recursos do Azure criados nesta seção incorrem em custos imediatos. Esses recursos podem acumular custos mesmo se você interromper o comando antes que ele seja totalmente executado.
Execute o seguinte comando da CLI do Desenvolvedor do Azure para provisionamento de recursos do Azure e implantação de código-fonte:
azd up
Use a seguinte tabela para responder aos prompts:
Prompt Resposta Nome do ambiente Mantenha-o curto e em letras minúsculas. Adicione seu nome ou alias. Por exemplo, secure-chat
. Ele é usado como parte do nome do grupo de recursos.Assinatura Selecione a assinatura para criar os recursos. Localização (para hospedagem) Selecione uma localização perto de você na lista. Localização do modelo OpenAI Selecione uma localização perto de você na lista. Se o mesmo local estiver disponível como seu primeiro local, selecione-o. Aguarde até que o aplicativo seja implantado. A implantação geralmente leva entre 5 e 10 minutos para ser concluída.
Usar o aplicativo de bate-papo para fazer perguntas ao Modelo de Linguagem Grande
O terminal exibe uma URL após a implantação bem-sucedida do aplicativo.
Selecione essa URL rotulada
Deploying service web
para abrir o aplicativo de chat em um navegador.No navegador, insira uma pergunta como "Por que a identidade gerenciada é melhor do que as chaves?".
A resposta vem do Azure OpenAI e o resultado é exibido.
Explorando o código de exemplo
Embora o OpenAI e o Serviço OpenAI do Azure dependam de uma biblioteca de clientes comum do Python, pequenas alterações de código são necessárias ao usar pontos de extremidade do OpenAI do Azure. Vamos ver como este exemplo configura a autenticação sem chave com a ID do Microsoft Entra e se comunica com o Azure OpenAI.
Configurar a autenticação com identidade gerenciada
Neste exemplo, o arquivo começa com a src\quartapp\chat.py
configuração da autenticação sem chave.
O snippet a seguir usa o módulo azure.identity.aio para criar um fluxo de autenticação assíncrono do Microsoft Entra.
O snippet de código a seguir usa a AZURE_CLIENT_ID
azd
variável de ambiente para criar uma instância ManagedIdentityCredential capaz de autenticar por meio da identidade gerenciada atribuída pelo usuário.
user_assigned_managed_identity_credential = ManagedIdentityCredential(client_id=os.getenv("AZURE_CLIENT_ID"))
Observação
As azd
variáveis de ambiente de recursos são provisionadas durante azd
a implantação do aplicativo.
O snippet de código a seguir usa AZURE_TENANT_ID
azd
a variável de ambiente de recurso para criar uma instância AzureDeveloperCliCredential capaz de autenticar com o locatário atual do Microsoft Entra.
azure_dev_cli_credential = AzureDeveloperCliCredential(tenant_id=os.getenv("AZURE_TENANT_ID"), process_timeout=60)
A biblioteca de cliente da Identidade do Azure fornece credenciais, classes públicas que implementam o protocolo TokenCredential da biblioteca do Azure Core. Uma credencial representa um fluxo de autenticação distinto para adquirir um token de acesso do Microsoft Entra ID. Essas credenciais podem ser encadeadas para formar uma sequência ordenada de mecanismos de autenticação a serem tentados.
O snippet a seguir cria um ChainedTokenCredential
using a ManagedIdentityCredential
e an AzureDeveloperCliCredential
:
- O é usado para o Azure Functions e o
ManagedIdentityCredential
Serviço de Aplicativo do Azure. Há suporte para uma identidade gerenciada atribuída pelo usuário passando oclient_id
arquivo paraManagedIdentityCredential
. - O
AzureDeveloperCliCredential
é usado para o desenvolvimento local. Ele foi definido anteriormente com base no locatário do Microsoft Entra a ser usado.
azure_credential = ChainedTokenCredential(
user_assigned_managed_identity_credential,
azure_dev_cli_credential
)
Dica
A ordem das credenciais é importante, pois o primeiro token de acesso válido do Microsoft Entra é usado. Para obter mais informações, confira o artigo Visão geral do ChainedTokenCredential.
O snippet de código a seguir obtém o provedor de token OpenAI do Azure com base na credencial do Azure selecionada. Esse valor é obtido chamando o azure.identity.aio.get_bearer_token_provider com dois argumentos:
azure_credential
: AChainedTokenCredential
instância criada anteriormente para autenticar a solicitação.https://cognitiveservices.azure.com/.default
: Necessário um ou mais escopos de token de portador. Nesse caso, o ponto de extremidade dos Serviços Cognitivos do Azure.
token_provider = get_bearer_token_provider(
azure_credential, "https://cognitiveservices.azure.com/.default"
)
As linhas a seguir verificam as variáveis de ambiente necessárias AZURE_OPENAI_ENDPOINT
e AZURE_OPENAI_CHATGPT_DEPLOYMENT
azd
de recurso, que são provisionadas durante azd
a implantação do aplicativo. Um erro será gerado se um valor não estiver presente.
if not os.getenv("AZURE_OPENAI_ENDPOINT"):
raise ValueError("AZURE_OPENAI_ENDPOINT is required for Azure OpenAI")
if not os.getenv("AZURE_OPENAI_CHATGPT_DEPLOYMENT"):
raise ValueError("AZURE_OPENAI_CHATGPT_DEPLOYMENT is required for Azure OpenAI")
Este snippet inicializa o cliente OpenAI do Azure, definindo os api_version
parâmetros , azure_endpoint
e azure_ad_token_provider
(client_args
):
bp.openai_client = AsyncAzureOpenAI(
api_version=os.getenv("AZURE_OPENAI_API_VERSION") or "2024-02-15-preview",
azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
azure_ad_token_provider=token_provider,
)
A linha a seguir define o nome de implantação do modelo OpenAI do Azure para uso em chamadas à API:
bp.openai_model = os.getenv("AZURE_OPENAI_CHATGPT_DEPLOYMENT")
Observação
O OpenAI usa o argumento palavra-chave model
para especificar qual modelo usar. O Azure OpenAI tem o conceito de implantações de modelo exclusivas. Quando você usa o Azure OpenAI, model
deve se referir ao nome de implantação subjacente escolhido durante a implantação do modelo do Azure OpenAI.
Depois que essa função for concluída, o cliente estará configurado corretamente e pronto para interagir com os serviços OpenAI do Azure.
Fluxo de resposta usando o OpenAI Client e o modelo
O lida response_stream
com a chamada de conclusão do chat na rota. O snippet de código a seguir mostra como openai_client
e model
são usados.
async def response_stream():
# This sends all messages, so API request may exceed token limits
all_messages = [
{"role": "system", "content": "You are a helpful assistant."},
] + request_messages
chat_coroutine = bp.openai_client.chat.completions.create(
# Azure Open AI takes the deployment name as the model name
model=bp.openai_model,
messages=all_messages,
stream=True,
)
Explorar o código de exemplo
Os aplicativos .NET dependem da biblioteca de clientes Azure.AI.OpenAI para se comunicar com os serviços OpenAI do Azure, que dependem da biblioteca OpenAI. O aplicativo de exemplo configura a autenticação sem chave usando a ID do Microsoft Entra para se comunicar com o OpenAI do Azure.
Configurar autenticação e registro de serviço
Neste exemplo, a autenticação sem chave é configurada no program.cs
arquivo. O snippet de código a seguir usa a AZURE_CLIENT_ID
variável de ambiente definida por azd
para criar uma instância ManagedIdentityCredential capaz de autenticar por meio da identidade gerenciada atribuída pelo usuário.
var userAssignedIdentityCredential =
new ManagedIdentityCredential(builder.Configuration.GetValue<string>("AZURE_CLIENT_ID"));
Observação
As azd
variáveis de ambiente de recursos são provisionadas durante azd
a implantação do aplicativo.
O snippet de código a seguir usa a AZURE_TENANT_ID
variável de ambiente definida por azd
para criar uma instância AzureDeveloperCliCredential capaz de autenticar localmente usando a conta conectada ao azd
.
var azureDevCliCredential = new AzureDeveloperCliCredential(
new AzureDeveloperCliCredentialOptions()
{
TenantId = builder.Configuration.GetValue<string>("AZURE_TENANT_ID")
});
A biblioteca de clientes do Azure Identity fornece classes de credenciais que implementam o protocolo TokenCredential da biblioteca do Azure Core. Uma credencial representa um fluxo de autenticação distinto para adquirir um token de acesso do Microsoft Entra ID. Essas credenciais podem ser encadeadas usando ChainedTokenCredential
para formar uma sequência ordenada de mecanismos de autenticação a serem tentados.
O snippet a seguir registra a AzureOpenAIClient
injeção de dependência for e cria um ChainedTokenCredential
using a ManagedIdentityCredential
e an AzureDeveloperCliCredential
:
- O é usado para o Azure Functions e o
ManagedIdentityCredential
Serviço de Aplicativo do Azure. Há suporte para uma identidade gerenciada atribuída pelo usuário usando oAZURE_CLIENT_ID
que foi fornecido aoManagedIdentityCredential
. - O
AzureDeveloperCliCredential
é usado para o desenvolvimento local. Ele foi definido anteriormente com base no locatário do Microsoft Entra a ser usado.
builder.Services.AddAzureClients(
clientBuilder => {
clientBuilder.AddClient<AzureOpenAIClient, AzureOpenAIClientOptions>((options, _, _)
=> new AzureOpenAIClient(
new Uri(endpoint),
new ChainedTokenCredential(
userAssignedIdentityCredential, azureDevCliCredential), options));
});
Dica
A ordem das credenciais é importante, pois o primeiro token de acesso válido do Microsoft Entra é usado. Para obter mais informações, confira o artigo Visão geral do ChainedTokenCredential.
Obter conclusões de chat usando o cliente OpenAI do Azure
O aplicativo Web Blazor injeta o registrado AzureOpenAIClient
na parte superior do Home.Razor
componente:
@inject AzureOpenAIClient azureOpenAIClient
Quando o usuário envia o formulário, ele AzureOpenAIClient
envia seu prompt ao modelo OpenAI para gerar uma conclusão:
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));
Explorar o código de exemplo
Embora o OpenAI e o Azure OpenAI Service dependam de uma openai (biblioteca de cliente JavaScript comum), pequenas alterações de código são necessárias ao usar pontos de extremidade do OpenAI do Azure. Vamos ver como este exemplo configura a autenticação sem chave com a ID do Microsoft Entra e se comunica com o Azure OpenAI.
Autenticação sem chave para cada ambiente
A biblioteca de clientes do Azure Identity fornece classes de credenciais que implementam o protocolo TokenCredential da biblioteca do Azure Core. Uma credencial representa um fluxo de autenticação distinto para adquirir um token de acesso do Microsoft Entra ID. Essas credenciais podem ser encadeadas usando ChainedTokenCredential
para formar uma sequência ordenada de mecanismos de autenticação a serem tentados. Isso permite que você implante o mesmo código em ambientes de produção e desenvolvimento local.
Configurar a autenticação com identidade gerenciada
Neste exemplo, o ./src/azure-authentication.ts
fornece várias funções para fornecer autenticação sem chave para o OpenAI do Azure.
A primeira função, getChainedCredential()
, retorna a primeira credencial válida do Azure encontrada na cadeia.
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 é tentado primeiro. Ele é configurado com a variável de ambiente AZURE_CLIENT_ID no runtime de produção e é capaz de autenticar por meio da identidade gerenciada atribuída pelo usuário.
- AzureDeveloperCliCredential é tentado em segundo lugar. Ele é configurado quando um desenvolvedor entra com a CLI
az login
do Azure.
Dica
A ordem das credenciais é importante, pois o primeiro token de acesso válido do Microsoft Entra é usado. Para obter mais informações, confira o artigo Visão geral do ChainedTokenCredential.
Obter token de portador para OpenAI
A segunda função em ./src/azure-authentication.ts
é getTokenProvider()
, que retorna um retorno de chamada que fornece um token de portador com escopo para o ponto de extremidade dos Serviços Cognitivos do Azure.
function getTokenProvider(): () => Promise<string> {
const credential = getChainedCredential();
const scope = "https://cognitiveservices.azure.com/.default";
return getBearerTokenProvider(credential, scope);
}
O snippet de código anterior usa getBearerTokenProvider
a credencial e o escopo e, em seguida, retorna um retorno de chamada que fornece um token de portador.
Criar cliente OpenAI do Azure autenticado
A terceira função é ./src/azure-authentication.ts
getOpenAiClient()
, que retorna o cliente OpenAI do 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);
}
}
Esse código usa as opções, incluindo o token com escopo correto, e cria o AzureOpenAI
cliente
Transmitir resposta de chat com o OpenAI do Azure
Use o manipulador de rotas do Fastify a seguir para ./src/openai-chat-api.ts
enviar uma mensagem ao OpenAI do Azure e transmitir a resposta.
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()
}
A função obtém a conversa de chat, incluindo todas as mensagens anteriores, e as envia para o Azure OpenAI. À medida que as partes do fluxo são retornadas do Azure OpenAI, elas são enviadas ao cliente.
Outras considerações de segurança
Este artigo demonstra como o exemplo usa ChainedTokenCredential
para autenticação no serviço OpenAI do Azure.
O exemplo também tem uma ação do GitHub que verifica os arquivos de infraestrutura como código e gera um relatório contendo todos os problemas detectados. Para garantir práticas recomendadas contínuas em seu próprio repositório, recomendamos que qualquer pessoa que crie soluções com base em nossos modelos garanta que a configuração de verificação de segredo do GitHub esteja habilitada.
Considere outras medidas de segurança, como:
Restrinja o acesso ao conjunto apropriado de usuários do aplicativo usando o Microsoft Entra.
Protegendo a instância dos Aplicativos de Contêiner do Azure com um firewall e/ou Rede Virtual.
Limpar os recursos
Limpar recursos do Azure
Os recursos do Azure criados neste artigo são cobrados para sua assinatura do Azure. Se você não espera precisar desses recursos no futuro, exclua-os para evitar incorrer em mais encargos.
Para excluir os recursos do Azure e remover o código-fonte, execute o seguinte comando da Azure Developer CLI:
azd down --purge
Limpar GitHub Codespaces
A exclusão do ambiente GitHub Codespaces garante que você possa maximizar a quantidade de horas gratuitas por núcleo que você tem direito na sua conta.
Importante
Para saber mais sobre os direitos da sua conta do GitHub, confira O GitHub Codespaces inclui mensalmente armazenamento e horas de núcleo.
Entre no painel do GitHub Codespaces (https://github.com/codespaces).
Localize seus Codespaces atualmente em execução, originados do repositório
Azure-Samples/openai-chat-app-quickstart
do GitHub.Abra o menu de contexto do codespace e selecione Excluir.
Entre no painel do GitHub Codespaces (https://github.com/codespaces).
Localize seus Codespaces atualmente em execução, originados do repositório
Azure-Samples/openai-chat-app-quickstart-dotnet
do GitHub.Abra o menu de contexto do codespace e selecione Excluir.
Entre no painel do GitHub Codespaces (https://github.com/codespaces).
Localize seus Codespaces atualmente em execução, originados do repositório
Azure-Samples/openai-chat-app-quickstart-javascript
do GitHub.Abra o menu de contexto do codespace e selecione Excluir.
Obter ajuda
Se o problema não for resolvido, registre seu problema nos problemas do repositório.
Próximas etapas
Se o problema não for resolvido, registre seu problema nos problemas do repositório.
Se o problema não for resolvido, registre seu problema nos problemas do repositório.