Condividi tramite


Inizia con l'elemento costitutivo di sicurezza di Azure OpenAI

Questo articolo mostra come creare e utilizzare il modello di blocco di sicurezza Azure OpenAI. Lo scopo è illustrare il provisioning degli account Azure OpenAI con RBAC (controllo degli accessi basato sul ruolo) per l'autenticazione senza chiave tramite Microsoft Entra ID ad Azure OpenAI. Questo esempio di app chat include anche tutta l'infrastruttura e la configurazione necessarie per effettuare il provisioning delle risorse OpenAI Azure e distribuire l'app in App contenitore di Azure usando l'interfaccia della riga di comando per sviluppatori Azure.

Seguendo le istruzioni riportate in questo articolo, potrai:

  • Distribuire un'app di chat sicura in App contenitore di Azure.
  • Usare l'identità gestita per l'accesso a Azure OpenAI.
  • Chattare con un Azure OpenAI Large Language Model (LLM) usando la libreria OpenAI.

Dopo aver completato questo articolo, è possibile iniziare a modificare il nuovo progetto con il codice e i dati personalizzati.

Nota

Questo articolo usa uno o più modelli di app di intelligenza artificiale come base per gli esempi e le linee guida nell’articolo. I modelli di app di intelligenza artificiale offrono implementazioni di riferimento ben gestite e facili da distribuire per garantire un punto di partenza di alta qualità per le app di intelligenza artificiale.

Panoramica dell'architettura

Un'architettura semplice dell'app di chat è illustrata nel diagramma seguente: Diagramma che mostra l'architettura dal client all'app back-end.

L'app di chat viene eseguita come Azure Container App. L'app usa l'identità gestita tramite Microsoft Entra ID per eseguire l'autenticazione con Azure OpenAI anziché con una chiave API. L'app di chat usa Azure OpenAI per generare risposte ai messaggi utente.

L'architettura dell'applicazione si basa sui servizi e sui componenti seguenti:

  • Azure OpenAI rappresenta il provider di intelligenza artificiale a cui si inviano le query dell'utente.
  • App contenitore di Azure è l'ambiente contenitore in cui è ospitata l'applicazione.
  • L'identità gestita consente di garantire la sicurezza ottimale e di eliminare i requisiti per gli sviluppatori per gestire in modo sicuro un segreto.
  • File Bicep per il provisioning di risorse Azure, inclusi Azure OpenAI, App contenitore di Azure, Registro Azure Container, Log Analytics di Azure e ruoli di controllo degli accessi in base al ruolo (RBAC).
  • Un'app Python Quart che usa il pacchetto openai e l'API Responses per generare risposte ai messaggi utente.
  • Front-end HTML/JavaScript di base che trasmette le risposte dal back-end usando righe JSON su un flusso leggibile.
  • Un'app Web Blazor che utilizza il pacchetto NuGet Azure.AI.OpenAI per generare risposte ai messaggi degli utenti.
  • Un'app Web TypeScript che usa il pacchetto npm OpenAI per generare risposte ai messaggi utente.

Costo

Nel tentativo di mantenere i prezzi il più basso possibile in questo esempio, la maggior parte delle risorse usa un piano tariffario di base o a consumo. Modifica il tuo livello in base al tuo utilizzo previsto. Per evitare di incorrere in costi, elimina le risorse al termine della lettura dell'articolo.

Altre informazioni sul costo nell'esempio di repository.

Altre informazioni sul costo nell'esempio di repository.

Altre informazioni sul costo nell'esempio di repository.

Prerequisiti

Per completare questo articolo è disponibile un ambiente contenitore di sviluppo con tutte le dipendenze necessarie. È possibile eseguire il contenitore di sviluppo in GitHub Codespaces (in un browser) o in locale usando Visual Studio Code.

Per usare questo articolo, è necessario soddisfare i prerequisiti seguenti:

Ambiente di sviluppo aperto

Usare le istruzioni seguenti per distribuire un ambiente di sviluppo preconfigurato contenente tutte le dipendenze necessarie per completare questo articolo.

GitHub Codespaces esegue un contenitore di sviluppo gestito da GitHub con Visual Studio Code per web come interfaccia utente. Per l'ambiente di sviluppo più semplice, usare GitHub Codespaces in modo che siano preinstallati gli strumenti di sviluppo e le dipendenze corretti per completare questo articolo.

Importante

Tutti gli account GitHub possono usare Codespaces per un massimo di 60 ore gratuite ogni mese con 2 istanze principali. Per ulteriori informazioni, consulta lo spazio di archiviazione mensile incluso e le ore core di GitHub Codespaces.

Usare la procedura seguente per creare un nuovo GitHub Codespace nel ramo main del repository Azure-Samples/openai-chat-app-quickstart GitHub.

  1. Fare clic con il pulsante destro del mouse sul pulsante seguente e scegliere Apri collegamento in una nuova finestra. Questa azione consente di avere l'ambiente di sviluppo e la documentazione disponibile per la revisione.

  2. Nella pagina Crea spazio codici esaminare e quindi selezionare Crea nuovo spazio di codice

    Screenshot della schermata di conferma prima di creare un nuovo codespace.

  3. Attendere l'avvio del codespace. Questo processo di avvio può richiedere alcuni minuti.

  4. Accedi ad Azure con l'Azure Developer CLI nel terminale in basso nella schermata.

    azd auth login
    
  5. Copia il codice dal terminale e incollalo in un browser. Seguire le istruzioni per eseguire l'autenticazione con l'account Azure.

Le attività rimanenti in questo articolo vengono eseguite nel contesto di questo contenitore di sviluppo.

Usare la procedura seguente per creare un nuovo GitHub Codespace nel ramo main del repository Azure-Samples/openai-chat-app-quickstart-dotnet GitHub.

  1. Fare clic con il pulsante destro del mouse sul pulsante seguente e scegliere Apri collegamento in una nuova finestra. Questa azione consente di avere l'ambiente di sviluppo e la documentazione disponibile per la revisione.

  2. Nella pagina Crea spazio di codice, esaminare e quindi selezionare Crea spazio di codice

    Screenshot della schermata di conferma prima di creare un nuovo codespace.

  3. Attendere l'avvio del codespace. Questo processo di avvio può richiedere alcuni minuti.

  4. Accedi ad Azure con l'Azure Developer CLI nel terminale in basso nella schermata.

    azd auth login
    
  5. Copia il codice dal terminale e incollalo in un browser. Seguire le istruzioni per eseguire l'autenticazione con l'account Azure.

Le attività rimanenti in questo articolo vengono eseguite nel contesto di questo contenitore di sviluppo.

Usare la procedura seguente per creare un nuovo GitHub Codespace nel ramo main del repository Azure-Samples/openai-chat-app-quickstart-javascript GitHub.

  1. Fare clic con il pulsante destro del mouse sul pulsante seguente e scegliere Apri collegamento in una nuova finestra. Questa azione consente di avere l'ambiente di sviluppo e la documentazione disponibile per la revisione.

Apri in GitHub Codespaces

  1. Nella pagina Crea spazio codici esaminare e quindi selezionare Crea nuovo spazio di codice

    Screenshot della schermata di conferma prima di creare un nuovo codespace.

  2. Attendere l'avvio del codespace. Questo processo di avvio può richiedere alcuni minuti.

  3. Accedi ad Azure con l'Azure Developer CLI nel terminale in basso nella schermata.

    azd auth login
    
  4. Copia il codice dal terminale e incollalo in un browser. Seguire le istruzioni per eseguire l'autenticazione con l'account Azure.

Le attività rimanenti in questo articolo vengono eseguite nel contesto di questo contenitore di sviluppo.

Distribuire ed eseguire

Il repository di esempio contiene tutto il codice e i file di configurazione per la distribuzione dell'app chat su Azure. La procedura seguente illustra il processo di distribuzione dell'app di chat di esempio su Azure.

Distribuire l'applicazione di chat su Azure

Importante

Le risorse di Azure create in questa sezione comportano dei costi immediati. Queste risorse possono accumulare costi anche se si interrompe il comando prima che venga eseguito completamente.

  1. Esegui il seguente comando della CLI per sviluppatori di Azure per il provisioning delle risorse e la distribuzione del codice sorgente:

    azd up
    
  2. Usare la tabella seguente per rispondere alle richieste:

    Richiesta Risposta
    Nome ambiente Tienila breve e minuscola. Aggiungere il nome o l'alias. Ad esempio: secure-chat. Viene usato come parte del nome del gruppo di risorse.
    Abbonamento Selezionare la sottoscrizione in cui creare le risorse.
    Località (per l'hosting) Seleziona una località vicina dall'elenco.
    Posizione del modello OpenAI Seleziona una località vicina dall'elenco. Se la stessa posizione è disponibile come prima posizione, selezionala.
  3. Attendi la distribuzione dell'app. Il completamento della distribuzione richiede in genere tra 5 e 10 minuti.

Usare l'app chat per porre domande al modello linguistico di grandi dimensioni

  1. Il terminale visualizza un URL dopo la corretta distribuzione dell'applicazione.

  2. Seleziona l'URL etichettato Deploying service web per aprire l'applicazione di chat in un browser.

    Screenshot dell'app di chat nel browser che mostra diversi suggerimenti per l'inserimento in chat e la casella di testo della chat per inserire una domanda.

  3. Nel browser immettere una domanda, ad esempio "Perché l'identità gestita è migliore delle chiavi?".

  4. La risposta proviene da Azure OpenAI e il risultato viene visualizzato.

Esplorazione del codice di esempio

Mentre OpenAI e Servizio Azure OpenAI si basano su una libreria client Python comune, quando si usano gli endpoint di Azure OpenAI sono necessarie piccole modifiche al codice. Vediamo come questo esempio configura l'autenticazione senza chiave con Microsoft Entra ID e comunica con Azure OpenAI.

Configurare l'autenticazione con l'identità gestita

In questo esempio il src/quartapp/chat.py file inizia con la configurazione dell'autenticazione senza chiave.

Il frammento di codice seguente usa il modulo azure.identity.aio per creare un flusso di autenticazione asincrono Microsoft Entra.

Il frammento di codice seguente usa la AZURE_CLIENT_IDazd variabile di ambiente per creare un'istanza managedIdentityCredential in grado di eseguire l'autenticazione tramite l'identità gestita assegnata dall'utente.

user_assigned_managed_identity_credential = ManagedIdentityCredential(client_id=os.getenv("AZURE_CLIENT_ID")) 

Nota

La configurazione delle azd variabili di ambiente delle risorse viene effettuata durante la azd distribuzione dell'applicazione.

Il frammento di codice seguente usa AZURE_TENANT_IDazd variabile di ambiente delle risorse per creare un'istanza di AzureDeveloperCliCredential in grado di eseguire l'autenticazione con il tenant Microsoft Entra corrente.

azure_dev_cli_credential = AzureDeveloperCliCredential(tenant_id=os.getenv("AZURE_TENANT_ID"), process_timeout=60)  

La libreria client Azure Identity fornisce credenziali: classi pubbliche che implementano il protocollo TokenCredential della libreria Azure Core. Una credenziale rappresenta un flusso di autenticazione distinto per l'acquisizione di un token di accesso da Microsoft Entra ID. Queste credenziali si possono concatenare per formare una sequenza ordinata di meccanismi di autenticazione da tentare.

Il frammento di codice seguente crea un ChainedTokenCredential utilizzando un ManagedIdentityCredential e un AzureDeveloperCliCredential:

  • Il ManagedIdentityCredential viene usato per Funzioni di Azure, Servizio app di Azure e App contenitore di Azure. Un'identità gestita assegnata dall'utente è supportata passando client_id a ManagedIdentityCredential.
  • AzureDeveloperCliCredential viene utilizzato per lo sviluppo locale. È stato impostato in precedenza in base al tenant di Microsoft Entra da utilizzare.
azure_credential = ChainedTokenCredential(
    user_assigned_managed_identity_credential,
    azure_dev_cli_credential
)

Suggerimento

L'ordine delle credenziali è importante, perché viene usato il primo token di accesso valido Microsoft Entra. Per ulteriori informazioni, vedere l'articolo Panoramica di ChainedTokenCredential.

Il frammento di codice seguente ottiene il provider di token OpenAI di Azure in base alla credenziale Azure selezionata. Questo valore viene ottenuto chiamando il azure.identity.aio.get_bearer_token_provider con due argomenti:

  • azure_credential ChainedTokenCredential: istanza creata in precedenza per autenticare la richiesta.

  • https://cognitiveservices.azure.com/.default: obbligatorio uno o più ambiti del token portatore. In questo caso, l'endpoint Azure Cognitive Services.

token_provider = get_bearer_token_provider(
    azure_credential, "https://cognitiveservices.azure.com/.default"
)

Le righe seguenti controllano la presenza delle variabili di ambiente necessarie AZURE_OPENAI_ENDPOINT e AZURE_OPENAI_CHAT_DEPLOYMENT, le quali sono impostate durante il provisioning di azdazd. Se un valore non è presente, viene generato un errore.

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")

Questo frammento di codice inizializza il client OpenAI rispetto all'endpoint /openai/v1/ di Azure, passando il provider di token come api_key. Non api_version è necessario con l'endpoint v1:

bp.openai_client = AsyncOpenAI(
    base_url=f"{openai_endpoint.rstrip('/')}/openai/v1/",
    api_key=token_provider,
)

La riga seguente imposta il nome di distribuzione del modello OpenAI Azure da usare nelle chiamate API:

bp.openai_model = os.getenv("AZURE_OPENAI_CHAT_DEPLOYMENT")

Nota

OpenAI usa l'argomento della parola chiave model per specificare il modello da usare. Azure OpenAI ha il concetto di distribuzioni di modelli uniche. Quando si usa Azure OpenAI, model deve fare riferimento al nome della distribuzione sottostante scelto durante la distribuzione del modello OpenAI in Azure.

Al termine di questa funzione, il client è configurato correttamente e pronto per interagire con Azure servizi OpenAI.

Trasmettere risposte usando l'API Risposte OpenAI

response_stream gestisce nella route la chiamata di streaming dell'API Responses. Il frontend invia direttamente gli elementi a forma di risposte input e il backend li inoltra 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"

Esplorare il codice di esempio

Le applicazioni .NET fanno affidamento sulla libreria client Azure.AI.OpenAI per comunicare con i servizi Azure OpenAI, che dipende dalla libreria OpenAI. L'app di esempio configura l'autenticazione senza chiave usando Microsoft Entra ID per comunicare con Azure OpenAI.

Configurare l'autenticazione e la registrazione del servizio

In questo esempio l'autenticazione senza chiave viene configurata nel program.cs file . Il frammento di codice seguente usa la AZURE_CLIENT_ID variabile di ambiente impostata da azd per creare un'istanza managedIdentityCredential in grado di eseguire l'autenticazione tramite l'identità gestita assegnata dall'utente.

var userAssignedIdentityCredential = 
    new ManagedIdentityCredential(builder.Configuration.GetValue<string>("AZURE_CLIENT_ID"));

Nota

La configurazione delle azd variabili di ambiente delle risorse viene effettuata durante la azd distribuzione dell'applicazione.

Il frammento di codice seguente usa la AZURE_TENANT_ID variabile di ambiente impostata da azd per creare un'istanza di AzureDeveloperCliCredential in grado di autenticarsi localmente usando l'account connesso a azd.

var azureDevCliCredential = new AzureDeveloperCliCredential(
    new AzureDeveloperCliCredentialOptions()
    { 
        TenantId = builder.Configuration.GetValue<string>("AZURE_TENANT_ID") 
    });

La libreria client Azure Identity fornisce classi di credenziali che implementano il protocollo TokenCredential della libreria Azure Core. Una credenziale rappresenta un flusso di autenticazione distinto per l'acquisizione di un token di accesso da Microsoft Entra ID. Queste credenziali possono essere concatenate usando ChainedTokenCredential per formare una sequenza ordinata di meccanismi di autenticazione da tentare.

Il frammento di codice seguente registra AzureOpenAIClient per l'iniezione delle dipendenze e crea un nuovo ChainedTokenCredential usando un ManagedIdentityCredential e un AzureDeveloperCliCredential:

  • Il ManagedIdentityCredential viene usato per Funzioni di Azure, Servizio app di Azure e App contenitore di Azure. Un'identità gestita assegnata dall'utente è supportata utilizzando il AZURE_CLIENT_ID fornito a ManagedIdentityCredential.
  • AzureDeveloperCliCredential viene utilizzato per lo sviluppo locale. È stato configurato in precedenza per il tenant di Microsoft Entra da utilizzare.
builder.Services.AddAzureClients(
    clientBuilder => {
        clientBuilder.AddClient<AzureOpenAIClient, AzureOpenAIClientOptions>((options, _, _)
            => new AzureOpenAIClient(
                new Uri(endpoint),
                new ChainedTokenCredential(
                    userAssignedIdentityCredential, azureDevCliCredential), options));
    });

Suggerimento

L'ordine delle credenziali è importante, perché viene usato il primo token di accesso valido Microsoft Entra. Per ulteriori informazioni, vedere l'articolo Panoramica di ChainedTokenCredential.

Ottenere i completamenti della chat usando il client OpenAI Azure

L'app Web Blazor inserisce l'oggetto registrato AzureOpenAIClient nella parte superiore del componente Home.Razor.

@inject AzureOpenAIClient azureOpenAIClient

Quando l'utente invia il modulo, invia AzureOpenAIClient la richiesta al modello OpenAI di generare un completamento:

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));

Esplorare il codice di esempio

Mentre OpenAI e Servizio Azure OpenAI si basano su un openai (libreria client JavaScript comune), quando si usano gli endpoint OpenAI Azure sono necessarie piccole modifiche al codice. Vediamo come questo esempio configura l'autenticazione senza chiave con Microsoft Entra ID e comunica con Azure OpenAI.

Autenticazione senza chiave per ogni ambiente

La libreria client Azure Identity fornisce classi di credenziali che implementano il protocollo TokenCredential della libreria Azure Core. Una credenziale rappresenta un flusso di autenticazione distinto per l'acquisizione di un token di accesso da Microsoft Entra ID. Queste credenziali possono essere concatenate usando chainedTokenCredential per formare una sequenza ordinata di meccanismi di autenticazione da tentare. In questo modo è possibile distribuire lo stesso codice sia in ambienti di produzione che in ambienti di sviluppo locali.

Configurare l'autenticazione con l'identità gestita

In questo esempio, il ./src/azure-authentication.ts fornisce diverse funzioni per fornire l'autenticazione senza chiave per Azure OpenAI.

La prima funzione, getChainedCredential(), restituisce la prima credenziale valida Azure trovata nella catena.

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 viene tentato per primo. Viene configurato con la variabile di ambiente AZURE_CLIENT_ID nel runtime di produzione ed è in grado di eseguire l'autenticazione tramite l'identità gestita assegnata dall'utente.
  • Il tentativo di AzureDeveloperCliCredential è il secondo. Viene configurato quando uno sviluppatore accede con l'interfaccia della riga di comando di Azure Developer usando azd auth login.

Suggerimento

L'ordine delle credenziali è importante, perché viene usato il primo token di accesso valido Microsoft Entra. Per ulteriori informazioni, vedere l'articolo Panoramica di ChainedTokenCredential.

Ottenere il token Bearer per OpenAI

La seconda funzione in ./src/azure-authentication.ts è getTokenProvider(), che restituisce un callback che fornisce un token di connessione per l'endpoint Azure Cognitive Services.

function getTokenProvider(): () => Promise<string> {
    const credential  = getChainedCredential();
    const scope = "https://cognitiveservices.azure.com/.default";
    return getBearerTokenProvider(credential, scope);
}

Il frammento di codice precedente utilizza getBearerTokenProvider per ottenere le credenziali e l'ambito, quindi restituisce un callback che fornisce un bearer token.

Creare un client OpenAI di Azure autenticato

La terza funzione in ./src/azure-authentication.ts è getOpenAiClient(), che restituisce il client OpenAI 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);
    }
}

Questo codice accetta le opzioni, incluso il token con ambito corretto, e crea il AzureOpenAI client

Rispondere alla chat in streaming con Azure OpenAI

Usare il gestore di route Fastify seguente in ./src/openai-chat-api.ts per inviare un messaggio a Azure OpenAI e trasmettere la risposta.

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 funzione ottiene la conversazione di chat, inclusi i messaggi precedenti e li invia a Azure OpenAI. Man mano che i blocchi di flusso vengono restituiti da Azure OpenAI, vengono inviati al client.

Altre considerazioni sulla sicurezza

Questo articolo illustra come l'esempio usa ChainedTokenCredential per l'autenticazione nel servizio OpenAI Azure.

L'esempio include anche un GitHub Action che analizza i file di infrastruttura come codice e genera un report contenente eventuali problemi rilevati. Per garantire l'adozione continua delle migliori pratiche nel proprio repository, consigliamo a chiunque crei soluzioni basate sui nostri modelli di verificare che l'impostazione di scansione dei segreti GitHub sia attivata.

Prendere in considerazione altre misure di sicurezza, ad esempio:

Pulire le risorse

Pulire le risorse Azure

Le risorse di Azure create in questo articolo vengono fatturate al tuo abbonamento Azure. Se prevedi che queste risorse non ti servano in futuro, eliminale per evitare di incorrere in costi aggiuntivi.

Per eliminare le risorse Azure e rimuovere il codice sorgente, eseguire il comando della Azure Developer CLI seguente:

azd down --purge

Riordinare GitHub Codespaces

L'eliminazione dell'ambiente GitHub Codespaces garantisce che sia possibile massimizzare la quantità di ore gratuite per core che si ottiene per l'account.

Importante

Per ulteriori informazioni sui diritti del tuo account GitHub, consulta Archiviazione mensile inclusa e ore core di GitHub Codespaces.

  1. Accedere al dashboard GitHub Codespaces.

  2. Trova i tuoi Codespaces attualmente in esecuzione originati dal repository Azure-Samples/openai-chat-app-quickstart GitHub.

  3. Aprire il menu di scelta rapida per il codespace e selezionare Elimina.

  1. Accedere al dashboard GitHub Codespaces.

  2. Trova i tuoi Codespaces attualmente in esecuzione originati dal repository Azure-Samples/openai-chat-app-quickstart-dotnet GitHub.

  3. Aprire il menu di scelta rapida per il codespace e selezionare Elimina.

  1. Accedere al dashboard GitHub Codespaces.

  2. Trova i tuoi Codespaces attualmente in esecuzione originati dal repository Azure-Samples/openai-chat-app-quickstart-javascript GitHub.

  3. Aprire il menu di scelta rapida per il codespace e selezionare Elimina.

Come ottenere assistenza

Se il problema non viene risolto, registrare il problema nel Issues del repository.

Passaggi successivi

Se il problema non viene risolto, registrare il problema nel Issues del repository.

Se il problema non viene risolto, registrare il problema nel Issues del repository.