Поделиться через


Начало работы со стандартным блоком безопасности Azure OpenAI

В этой статье показано, как создать и использовать стандартный блок безопасности Azure OpenAI. Целью является демонстрация подготовки учетной записи Azure OpenAI с помощью управления доступом на основе ролей (RBAC) для проверки подлинности без ключа (Идентификатор Microsoft Entra) в Azure OpenAI. Этот пример приложения чата также включает всю инфраструктуру и конфигурацию, необходимую для подготовки ресурсов Azure OpenAI и развертывания приложения в приложениях контейнеров Azure с помощью Интерфейса командной строки разработчика Azure.

Следуя инструкциям в этой статье, вы получите следующее:

  • Разверните безопасное приложение чата контейнеров Azure.
  • Используйте управляемое удостоверение для доступа Azure OpenAI.
  • Чат с моделью большого языка Azure OpenAI (LLM) с помощью библиотеки OpenAI.

Завершив эту статью, вы можете начать изменение нового проекта с помощью пользовательского кода и данных.

Примечание.

В этой статье используется один или несколько шаблонов приложений ИИ в качестве основы для примеров и рекомендаций в этой статье. Шаблоны приложений ИИ предоставляют вам хорошо поддерживаемые и простые в развертывании эталонные реализации, которые помогают обеспечить высококачественную отправную точку для приложений ИИ.

Обзор архитектуры

Простая архитектура приложения чата показана на следующей схеме: Схема, показывающая архитектуру от клиента к внутреннему приложению.

Приложение чата запускается как приложение контейнера Azure. Приложение использует управляемое удостоверение с помощью идентификатора Microsoft Entra для проверки подлинности с помощью Azure OpenAI, а не ключа API. Приложение чата использует Azure OpenAI для создания ответов на сообщения пользователей.

Архитектура приложения зависит от следующих служб и компонентов:

  • Протокол чата Microsoft AI предоставляет стандартные контракты API на разных языках и решениях ИИ. Приложение чата соответствует протоколу Microsoft AI Chat, что позволяет приложению оценки выполняться с любым приложением чата, соответствующим протоколу.
  • Python Quart, использующий openai пакет для создания ответов на сообщения пользователей.
  • Базовый интерфейс HTML/JavaScript, который передает ответы из серверной части с помощью строк JSON через readableStream.
  • Веб-приложение Blazor, использующее пакет NuGet Azure.AI.OpenAI для создания ответов на сообщения пользователей.
  • Веб-приложение TypeScript, использующее пакет openai npm для создания ответов на сообщения пользователей.

Себестоимость

При попытке сохранить цены как можно ниже в этом примере, большинство ресурсов используют базовую или ценовую категорию потребления. Измените уровень уровня по мере необходимости на основе предполагаемого использования. Чтобы прекратить сборы, удалите ресурсы, когда вы закончите работу со статьей.

Дополнительные сведения о затратах в примере репозитория.

Дополнительные сведения о затратах в примере репозитория.

Дополнительные сведения о затратах в примере репозитория.

Необходимые компоненты

Среда контейнера разработки доступна со всеми зависимостями, необходимыми для выполнения этой статьи. Контейнер разработки можно запустить в GitHub Codespaces (в браузере) или локально с помощью Visual Studio Code.

Чтобы использовать эту статью, необходимо выполнить следующие предварительные требования:

Открытие среды разработки

Используйте следующие инструкции для развертывания предварительно настроенной среды разработки, содержащей все необходимые зависимости для выполнения этой статьи.

GitHub Codespaces запускает контейнер разработки, управляемый GitHub, с Помощью Visual Studio Code для Интернета в качестве пользовательского интерфейса. Для наиболее простой среды разработки используйте GitHub Codespaces, чтобы у вас были правильные средства разработчика и зависимости, предварительно установленные для выполнения этой статьи.

Внимание

Все учетные записи GitHub могут использовать пространства Кода до 60 часов бесплатно каждый месяц с 2 основными экземплярами. Дополнительные сведения см. в GitHub Codespaces ежемесячно включаемых в хранилище и основные часы.

Выполните следующие действия, чтобы создать новое пространство кода GitHub в main ветви Azure-Samples/openai-chat-app-quickstart репозитория GitHub.

  1. Щелкните правой кнопкой мыши следующую кнопку и нажмите кнопку "Открыть ссылку" в новом окне. Это действие позволяет иметь среду разработки и документацию, доступную для проверки.

  2. На странице "Создание пространства кода" просмотрите и выберите "Создать новое пространство кода"

    Снимок экрана подтверждения перед созданием нового пространства кода.

  3. Дождитесь запуска пространства кода. Этот процесс запуска может занять несколько минут.

  4. Войдите в Azure с помощью интерфейса командной строки разработчика Azure в терминале в нижней части экрана.

    azd auth login
    
  5. Скопируйте код из терминала и вставьте его в браузер. Следуйте инструкциям по проверке подлинности с помощью учетной записи Azure.

Остальные задачи в этой статье выполняются в контексте этого контейнера разработки.

Выполните следующие действия, чтобы создать новое пространство кода GitHub в main ветви Azure-Samples/openai-chat-app-quickstart-dotnet репозитория GitHub.

  1. Щелкните правой кнопкой мыши следующую кнопку и нажмите кнопку "Открыть ссылку" в новом окне. Это действие позволяет иметь среду разработки и документацию, доступную для проверки.

  2. На странице "Создание пространства кода" просмотрите и выберите "Создать пространство кода"

    Снимок экрана подтверждения перед созданием нового пространства кода.

  3. Дождитесь запуска пространства кода. Этот процесс запуска может занять несколько минут.

  4. Войдите в Azure с помощью интерфейса командной строки разработчика Azure в терминале в нижней части экрана.

    azd auth login
    
  5. Скопируйте код из терминала и вставьте его в браузер. Следуйте инструкциям по проверке подлинности с помощью учетной записи Azure.

Остальные задачи в этой статье выполняются в контексте этого контейнера разработки.

Выполните следующие действия, чтобы создать новое пространство кода GitHub в main ветви Azure-Samples/openai-chat-app-quickstart-javascript репозитория GitHub.

  1. Щелкните правой кнопкой мыши следующую кнопку и нажмите кнопку "Открыть ссылку" в новом окне. Это действие позволяет иметь среду разработки и документацию, доступную для проверки.

Открытие в GitHub Codespaces

  1. На странице "Создание пространства кода" просмотрите и выберите "Создать новое пространство кода"

    Снимок экрана подтверждения перед созданием нового пространства кода.

  2. Дождитесь запуска пространства кода. Этот процесс запуска может занять несколько минут.

  3. Войдите в Azure с помощью интерфейса командной строки разработчика Azure в терминале в нижней части экрана.

    azd auth login
    
  4. Скопируйте код из терминала и вставьте его в браузер. Следуйте инструкциям по проверке подлинности с помощью учетной записи Azure.

Остальные задачи в этой статье выполняются в контексте этого контейнера разработки.

Развертывание и запуск

Пример репозитория содержит все файлы кода и конфигурации для развертывания приложения чата Azure. Ниже описаны примеры процесса развертывания приложения чата Azure.

Развертывание приложения чата в Azure

Внимание

Ресурсы Azure, созданные в этом разделе, несут немедленные затраты. Эти ресурсы могут начислять затраты, даже если вы прерываете команду до его полного выполнения.

  1. Выполните следующую команду Azure Developer CLI для подготовки ресурсов Azure и развертывания исходного кода:

    azd up
    
  2. Используйте следующую таблицу, чтобы ответить на запросы:

    Prompt Ответ
    Имя среды Сохраните его коротким и строчным регистром. Добавьте имя или псевдоним. Например, secure-chat. Он используется в качестве части имени группы ресурсов.
    Отток подписок Выберите подписку, чтобы создать ресурсы.
    Расположение (для размещения) Выберите расположение рядом с вами из списка.
    Расположение модели OpenAI Выберите расположение рядом с вами из списка. Если то же расположение доступно в качестве первого расположения, выберите это.
  3. Дождитесь развертывания приложения. Развертывание обычно занимает от 5 до 10 минут.

Использование приложения чата для получения вопросов о модели большого языка

  1. Терминал отображает URL-адрес после успешного развертывания приложения.

  2. Выберите этот URL-адрес, чтобы Deploying service web открыть приложение чата в браузере.

    Снимок экрана: приложение чата в браузере с несколькими предложениями для ввода чата и текстового поля чата для ввода вопроса.

  3. В браузере введите такой вопрос, как "Почему управляемое удостоверение лучше, чем ключи?".

  4. Ответ поступает из Azure OpenAI и отображается результат.

Изучение примера кода

Хотя служба OpenAI и Azure OpenAI используют общую клиентную библиотеку Python, при использовании конечных точек Azure OpenAI необходимы небольшие изменения кода. Давайте посмотрим, как этот пример настраивает проверку подлинности без ключа с помощью идентификатора Microsoft Entra и взаимодействует с Azure OpenAI.

Настройка проверки подлинности с помощью управляемого удостоверения

В этом примере src\quartapp\chat.py файл начинается с настройки проверки подлинности без ключей.

В следующем фрагменте кода используется модуль azure.identity.aio для создания асинхронного потока проверки подлинности Microsoft Entra.

В следующем фрагменте кода используется AZURE_CLIENT_IDazd переменная среды для создания экземпляра ManagedIdentityCredential , поддерживающего проверку подлинности с помощью управляемого удостоверения, назначаемого пользователем.

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

Примечание.

azd Переменные среды ресурсов подготавливаются во время azd развертывания приложения.

В следующем фрагменте кода используется AZURE_TENANT_IDazd переменная среды ресурсов для создания экземпляра AzureDeveloperCliCredential , который может выполнять проверку подлинности с помощью текущего клиента Microsoft Entra.

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

Клиентская библиотека удостоверений Azure предоставляет учетные данные — общедоступные классы, реализующие протокол TokenCredential библиотеки Azure Core. Учетные данные представляют собой отдельный поток проверки подлинности для получения маркера доступа из идентификатора Microsoft Entra. Эти учетные данные можно объединить в цепочку, чтобы сформировать упорядоченную последовательность механизмов проверки подлинности, которые необходимо предпринять.

Следующий фрагмент кода создает ChainedTokenCredential использование ManagedIdentityCredential и :AzureDeveloperCliCredential

  • Используется ManagedIdentityCredential для Функции Azure и службы приложение Azure. Управляемое удостоверение, назначаемое пользователем, поддерживается путем передачи client_idManagedIdentityCredentialв него.
  • Используется AzureDeveloperCliCredential для локальной разработки. Он был установлен ранее на основе используемого клиента Microsoft Entra.
azure_credential = ChainedTokenCredential(
    user_assigned_managed_identity_credential,
    azure_dev_cli_credential
)

Совет

Порядок учетных данных важен, так как используется первый допустимый маркер доступа Microsoft Entra. Дополнительные сведения см. в статье ChainedTokenCredential Overview .

Следующий фрагмент кода получает поставщик токенов Azure OpenAI на основе выбранных учетных данных Azure. Это значение получается путем вызова azure.identity.aio.get_bearer_token_provider с двумя аргументами:

  • azure_credential ChainedTokenCredential: экземпляр, созданный ранее для проверки подлинности запроса.

  • https://cognitiveservices.azure.com/.default: требуется одна или несколько областей маркера носителя. В этом случае конечная точка Azure Cognitive Services .

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

В следующих строках проверяется наличие обязательных AZURE_OPENAI_ENDPOINT и AZURE_OPENAI_CHATGPT_DEPLOYMENTazd переменных среды ресурсов, которые подготавливаются во время azd развертывания приложения. Ошибка возникает, если значение отсутствует.

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

Этот фрагмент инициализирует клиент Azure OpenAI, задав api_versionazure_endpointпараметры , и 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,
)  

Следующая строка задает имя развертывания модели Azure OpenAI для использования в вызовах API:

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

Примечание.

OpenAI использует аргумент ключевого слова для указания используемой model модели. Azure OpenAI имеет концепцию уникальных развертываний моделей. При использовании Azure OpenAI следует ссылаться на базовое model развертывания, выбранное во время развертывания модели Azure OpenAI.

После завершения этой функции клиент правильно настроен и готов взаимодействовать со службами Azure OpenAI.

Поток ответа с помощью клиента OpenAI и модели

Он response_stream обрабатывает вызов завершения чата в маршруте. В следующем фрагменте кода показано, как openai_client и model используются.

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 OpenAI takes the deployment name as the model name
        model=bp.openai_model,
        messages=all_messages,
        stream=True,
    )

Изучение примера кода

Приложения .NET используют клиентская библиотека Azure.AI.OpenAI для взаимодействия со службами Azure OpenAI, которая зависит от библиотеки OpenAI. Пример приложения настраивает проверку подлинности без ключа с помощью идентификатора Microsoft Entra для взаимодействия с Azure OpenAI.

Настройка проверки подлинности и регистрации служб

В этом примере проверка подлинности без ключа настраивается в program.cs файле. Следующий фрагмент кода использует AZURE_CLIENT_ID переменную среды, azd заданную для создания экземпляра ManagedIdentityCredential , который может выполнять проверку подлинности с помощью управляемого удостоверения, назначаемого пользователем.

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

Примечание.

azd Переменные среды ресурсов подготавливаются во время azd развертывания приложения.

В следующем фрагменте кода используется AZURE_TENANT_ID переменная среды, заданная azd для создания экземпляра AzureDeveloperCliCredential , способного выполнить проверку подлинности локально с помощью учетной записи, вошедшего в azdсистему.

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

Клиентская библиотека удостоверений Azure предоставляет классы учетных данных, реализующие протокол TokenCredential библиотеки Azure Core. Учетные данные представляют собой отдельный поток проверки подлинности для получения маркера доступа из идентификатора Microsoft Entra. Эти учетные данные можно объединить, используя ChainedTokenCredential для формирования упорядоченной последовательности механизмов проверки подлинности, которые необходимо попытаться выполнить.

Следующий фрагмент кода регистрирует AzureOpenAIClient внедрение зависимостей и создает ChainedTokenCredential использование ManagedIdentityCredential и :AzureDeveloperCliCredential

  • Используется ManagedIdentityCredential для Функции Azure и службы приложение Azure. Управляемое удостоверение, назначаемое пользователем, поддерживается с помощью AZURE_CLIENT_ID предоставленного ManagedIdentityCredentialему удостоверения.
  • Используется AzureDeveloperCliCredential для локальной разработки. Он был установлен ранее на основе используемого клиента Microsoft Entra.
builder.Services.AddAzureClients(
    clientBuilder => {
        clientBuilder.AddClient<AzureOpenAIClient, AzureOpenAIClientOptions>((options, _, _)
            => new AzureOpenAIClient(
                new Uri(endpoint),
                new ChainedTokenCredential(
                    userAssignedIdentityCredential, azureDevCliCredential), options));
    });

Совет

Порядок учетных данных важен, так как используется первый допустимый маркер доступа Microsoft Entra. Дополнительные сведения см. в статье ChainedTokenCredential Overview .

Получение завершения чата с помощью клиента Azure OpenAI

Веб-приложение Blazor внедряет зарегистрированные AzureOpenAIClient в верхней части Home.Razor компонента:

@inject AzureOpenAIClient azureOpenAIClient

Когда пользователь отправляет форму, AzureOpenAIClient он отправляет запрос в модель OpenAI, чтобы создать завершение:

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

Изучение примера кода

Хотя служба OpenAI и Azure OpenAI полагаются на openai (общую клиентскую библиотеку JavaScript), при использовании конечных точек Azure OpenAI необходимы небольшие изменения кода. Давайте посмотрим, как этот пример настраивает проверку подлинности без ключа с помощью идентификатора Microsoft Entra и взаимодействует с Azure OpenAI.

Проверка подлинности без ключа для каждой среды

Клиентская библиотека удостоверений Azure предоставляет классы учетных данных, реализующие протокол TokenCredential библиотеки Azure Core. Учетные данные представляют собой отдельный поток проверки подлинности для получения маркера доступа из идентификатора Microsoft Entra. Эти учетные данные можно объединить, используя ChainedTokenCredential для формирования упорядоченной последовательности механизмов проверки подлинности, которые необходимо попытаться выполнить. Это позволяет развертывать один и тот же код в рабочих и локальных средах разработки.

Схема, показывающая два учетных данных в потоке, где сначала выполняется проверка управляемого удостоверения, а затем проверка учетных данных Azure по умолчанию.

Настройка проверки подлинности с помощью управляемого удостоверения

В этом примере ./src/azure-authentication.ts представлено несколько функций для предоставления бессерверной проверки подлинности в Azure OpenAI.

Первая функция getChainedCredential()возвращает первые допустимые учетные данные Azure, найденные в цепочке.

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 . Она настроена с помощью переменной среды AZURE_CLIENT_ID в рабочей среде выполнения и может выполнять проверку подлинности с помощью управляемого удостоверения, назначаемого пользователем.
  • AzureDeveloperCliCredential выполняется второй попыткой. Она настраивается при входе в систему с помощью Azure CLI az login.

Совет

Порядок учетных данных важен, так как используется первый допустимый маркер доступа Microsoft Entra. Дополнительные сведения см. в статье ChainedTokenCredential Overview .

Получение маркера носителя для OpenAI

Вторая функция состоит в ./src/azure-authentication.ts том getTokenProvider(), что возвращает обратный вызов, предоставляющий маркер носителя, ограниченный конечной точкой Azure Cognitive Services .

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

Предыдущий фрагмент кода используется getBearerTokenProvider для принятия учетных данных и области, а затем возвращает обратный вызов, предоставляющий маркер носителя.

Создание клиента Azure OpenAI с проверкой подлинности

Третья функция ./src/azure-authentication.ts — это getOpenAiClient()функция, которая возвращает клиент Azure OpenAI.

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

Этот код принимает параметры, включая правильно заданный маркер, и создает AzureOpenAI клиент.

Потоковая передача ответа чата с помощью Azure OpenAI

Используйте следующий обработчик маршрутов Fastify для отправки сообщения в ./src/openai-chat-api.ts Azure OpenAI и потоковой передачи ответа.

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

}

Функция получает беседу чата, включая любые предыдущие сообщения, и отправляет их в Azure OpenAI. Так как блоки потоков возвращаются из Azure OpenAI, они отправляются клиенту.

Прочие вопросы по безопасности

В этой статье показано, как пример используется ChainedTokenCredential для проверки подлинности в службе Azure OpenAI.

В примере также есть действие GitHub , которое сканирует файлы инфраструктуры как кода и создает отчет, содержащий обнаруженные проблемы. Чтобы обеспечить продолжение рекомендаций в собственном репозитории, мы рекомендуем всем пользователям создавать решения на основе наших шаблонов, чтобы включить параметр проверки секрета GitHub.

Рассмотрите другие меры безопасности, такие как:

Очистка ресурсов

Очистка ресурсов Azure

Ресурсы Azure, созданные в этой статье, выставляются в подписку Azure. Если вы не ожидаете, что эти ресурсы потребуются в будущем, удалите их, чтобы избежать дополнительных расходов.

Чтобы удалить ресурсы Azure и удалить исходный код, выполните следующую команду Azure Developer CLI:

azd down --purge

Очистка GitHub Codespaces

Удаление среды GitHub Codespaces гарантирует, что вы можете максимально увеличить объем бесплатных прав на базовые часы, которые вы получаете для вашей учетной записи.

Внимание

Дополнительные сведения о правах учетной записи GitHub см . в GitHub Codespaces ежемесячно включено в хранилище и основные часы.

  1. Войдите на панель мониторинга GitHub Codespaces (https://github.com/codespaces).

  2. Найдите текущие запущенные пространства Codespaces, полученные из Azure-Samples/openai-chat-app-quickstart репозитория GitHub.

  3. Откройте контекстное меню для пространства кода и нажмите кнопку "Удалить".

  1. Войдите на панель мониторинга GitHub Codespaces (https://github.com/codespaces).

  2. Найдите текущие запущенные пространства Codespaces, полученные из Azure-Samples/openai-chat-app-quickstart-dotnet репозитория GitHub.

  3. Откройте контекстное меню для пространства кода и нажмите кнопку "Удалить".

  1. Войдите на панель мониторинга GitHub Codespaces (https://github.com/codespaces).

  2. Найдите текущие запущенные пространства Codespaces, полученные из Azure-Samples/openai-chat-app-quickstart-javascript репозитория GitHub.

  3. Откройте контекстное меню для пространства кода и нажмите кнопку "Удалить".

Получить помощь

Если проблема не устранена, зайдите в журнал проблемы репозитория.

Следующие шаги

Если проблема не устранена, зайдите в журнал проблемы репозитория.

Если проблема не устранена, зайдите в журнал проблемы репозитория.