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

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

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

  • Разверните безопасное приложение чата на Контейнеры приложений Azure.
  • Используйте управляемую идентификацию для доступа к Azure OpenAI.
  • Чат с Azure OpenAI Large Language Model (LLM) с использованием библиотеки OpenAI.

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

Примечание.

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

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

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

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

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

  • Azure OpenAI представляет поставщик ИИ, в который мы отправляем запросы пользователя.
  • Контейнеры приложений Azure — это среда контейнера, в которой размещено приложение.
  • Управляемое удостоверение помогает нам обеспечить передовую безопасность и исключает требование для разработчика безопасно управлять секретом.
  • файлы Bicep для развертывания ресурсов Azure, включая Azure OpenAI, Контейнеры приложений Azure, Реестр контейнеров Azure, Azure Log Analytics и роли RBAC.
  • Приложение Python Quart, использующее пакет openai и API Responses для создания ответов на сообщения пользователей.
  • Базовый интерфейс HTML/JavaScript, который передает ответы из серверной части с помощью строк JSON через readableStream.
  • Веб-приложение Blazor, использующее Azure. AI. OpenAI пакет NuGet для создания ответов на сообщения пользователей.
  • Веб-приложение TypeScript, использующее пакет NPM OpenAI для создания ответов на сообщения пользователей.

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

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

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

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

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

Предварительные требования

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

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

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

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

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

Внимание

Все учетные записи GitHub могут использовать Codespaces до 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 Azure для подготовки ресурсов и развертывания исходного кода:

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

    Подсказка Ответ
    Имя среды Сохраните текст коротким и строчными буквами. Добавьте имя или псевдоним. Например, 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 ID и взаимодействует с 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 ID. Эти учетные данные можно объединить в цепочку, чтобы сформировать упорядоченную последовательность механизмов проверки подлинности, которые необходимо предпринять.

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

  • ManagedIdentityCredential используется для Функции Azure, Служба приложений Azure и Контейнеры приложений Azure. Управляемое удостоверение, назначаемое пользователем, поддерживается передачей client_id в ManagedIdentityCredential.
  • 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_CHAT_DEPLOYMENTдвух azd переменных среды, которые задаются во время azd подготовки. Ошибка возникает, если значение отсутствует.

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

Этот фрагмент кода инициализирует клиент OpenAI для конечной точки Azure /openai/v1/, передавая поставщика токенов в качестве api_key. Нет необходимости в api_version с конечной точкой v1.

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

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

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

Примечание.

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

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

Стриминг ответов с помощью API ответов OpenAI

Элемент response_stream обрабатывает потоковый вызов API ответов в маршруте. Клиентская часть напрямую отправляет элементы типа input Response, а серверная часть перенаправляет их в 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"

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

.NET приложения опираются на клиентскую библиотеку Azure.AI.OpenAI для взаимодействия с Azure OpenAI службами, которая зависит от библиотеки OpenAI. Пример приложения настраивает проверку подлинности без ключа с помощью Microsoft Entra ID для взаимодействия с 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 ID. Эти учетные данные можно объединить, используя ChainedTokenCredential для формирования упорядоченной последовательности механизмов проверки подлинности, которые необходимо попытаться выполнить.

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

  • ManagedIdentityCredential используется для Функции Azure, Служба приложений 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 .

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

Веб-приложение 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 ID и взаимодействует с Azure OpenAI.

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

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

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

В этом примере ./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 с помощью azd auth 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 для принятия учетных данных и области, а затем возвращает обратный вызов, предоставляющий маркер носителя.

Создание клиента OpenAI с аутентификацией Azure

Третья функция в ./src/azure-authentication.tsgetOpenAiClient(), которая возвращает клиент 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);
    }
}

Этот код принимает параметры, включая правильно заданный маркер, и создает этого 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 для проверки подлинности в службе OpenAI Azure.

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

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

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

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

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

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

azd down --purge

Очистка GitHub пространства кода

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

Внимание

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

  1. Войдите на панель мониторинга GitHub Codespaces.

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

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

  1. Войдите на панель мониторинга GitHub Codespaces.

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

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

  1. Войдите на панель мониторинга GitHub Codespaces.

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

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

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

Если проблема не устранена, добавьте вашу проблему в раздел Issues репозитория.

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

Если проблема не устранена, добавьте вашу проблему в раздел Issues репозитория.

Если проблема не устранена, добавьте вашу проблему в раздел Issues репозитория.