Начало работы со стандартным блоком безопасности 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 для создания ответов на сообщения пользователей.
Архитектура приложения зависит от следующих служб и компонентов:
- Azure OpenAI представляет поставщик ИИ , в который мы отправляем запросы пользователя.
- Приложения контейнеров Azure — это среда контейнера , в которой размещено приложение.
- Управляемое удостоверение помогает нам обеспечить безопасность в классе и исключить требование, необходимое для разработчика для безопасного управления секретом.
- Файлы Bicep для подготовки ресурсов Azure, включая Azure OpenAI, приложения контейнеров Azure, Реестр контейнеров Azure, Azure Log Analytics и роли RBAC.
- Протокол чата 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.
Чтобы использовать эту статью, необходимо выполнить следующие предварительные требования:
подписка Azure — создайте бесплатную учетную запись.
Разрешения учетной записи Azure. У вашей учетной записи Azure должны быть
Microsoft.Authorization/roleAssignments/write
разрешения, такие как администратор доступа пользователей или владелец.учетная запись GitHub;
Открытие среды разработки
Используйте следующие инструкции для развертывания предварительно настроенной среды разработки, содержащей все необходимые зависимости для выполнения этой статьи.
GitHub Codespaces запускает контейнер разработки, управляемый GitHub, с Помощью Visual Studio Code для Интернета в качестве пользовательского интерфейса. Для наиболее простой среды разработки используйте GitHub Codespaces, чтобы у вас были правильные средства разработчика и зависимости, предварительно установленные для выполнения этой статьи.
Внимание
Все учетные записи GitHub могут использовать пространства Кода до 60 часов бесплатно каждый месяц с 2 основными экземплярами. Дополнительные сведения см. в GitHub Codespaces ежемесячно включаемых в хранилище и основные часы.
Выполните следующие действия, чтобы создать новое пространство кода GitHub в main
ветви Azure-Samples/openai-chat-app-quickstart
репозитория GitHub.
Щелкните правой кнопкой мыши следующую кнопку и нажмите кнопку "Открыть ссылку" в новом окне. Это действие позволяет иметь среду разработки и документацию, доступную для проверки.
На странице "Создание пространства кода" просмотрите и выберите "Создать новое пространство кода"
Дождитесь запуска пространства кода. Этот процесс запуска может занять несколько минут.
Войдите в Azure с помощью интерфейса командной строки разработчика Azure в терминале в нижней части экрана.
azd auth login
Скопируйте код из терминала и вставьте его в браузер. Следуйте инструкциям по проверке подлинности с помощью учетной записи Azure.
Остальные задачи в этой статье выполняются в контексте этого контейнера разработки.
Выполните следующие действия, чтобы создать новое пространство кода GitHub в main
ветви Azure-Samples/openai-chat-app-quickstart-dotnet
репозитория GitHub.
Щелкните правой кнопкой мыши следующую кнопку и нажмите кнопку "Открыть ссылку" в новом окне. Это действие позволяет иметь среду разработки и документацию, доступную для проверки.
На странице "Создание пространства кода" просмотрите и выберите "Создать пространство кода"
Дождитесь запуска пространства кода. Этот процесс запуска может занять несколько минут.
Войдите в Azure с помощью интерфейса командной строки разработчика Azure в терминале в нижней части экрана.
azd auth login
Скопируйте код из терминала и вставьте его в браузер. Следуйте инструкциям по проверке подлинности с помощью учетной записи Azure.
Остальные задачи в этой статье выполняются в контексте этого контейнера разработки.
Выполните следующие действия, чтобы создать новое пространство кода GitHub в main
ветви Azure-Samples/openai-chat-app-quickstart-javascript
репозитория GitHub.
- Щелкните правой кнопкой мыши следующую кнопку и нажмите кнопку "Открыть ссылку" в новом окне. Это действие позволяет иметь среду разработки и документацию, доступную для проверки.
На странице "Создание пространства кода" просмотрите и выберите "Создать новое пространство кода"
Дождитесь запуска пространства кода. Этот процесс запуска может занять несколько минут.
Войдите в Azure с помощью интерфейса командной строки разработчика Azure в терминале в нижней части экрана.
azd auth login
Скопируйте код из терминала и вставьте его в браузер. Следуйте инструкциям по проверке подлинности с помощью учетной записи Azure.
Остальные задачи в этой статье выполняются в контексте этого контейнера разработки.
Развертывание и запуск
Пример репозитория содержит все файлы кода и конфигурации для развертывания приложения чата Azure. Ниже описаны примеры процесса развертывания приложения чата Azure.
Развертывание приложения чата в Azure
Внимание
Ресурсы Azure, созданные в этом разделе, несут немедленные затраты. Эти ресурсы могут начислять затраты, даже если вы прерываете команду до его полного выполнения.
Выполните следующую команду Azure Developer CLI для подготовки ресурсов Azure и развертывания исходного кода:
azd up
Используйте следующую таблицу, чтобы ответить на запросы:
Prompt Ответ Имя среды Сохраните его коротким и строчным регистром. Добавьте имя или псевдоним. Например, secure-chat
. Он используется в качестве части имени группы ресурсов.Отток подписок Выберите подписку, чтобы создать ресурсы. Расположение (для размещения) Выберите расположение рядом с вами из списка. Расположение модели OpenAI Выберите расположение рядом с вами из списка. Если то же расположение доступно в качестве первого расположения, выберите это. Дождитесь развертывания приложения. Развертывание обычно занимает от 5 до 10 минут.
Использование приложения чата для получения вопросов о модели большого языка
Терминал отображает URL-адрес после успешного развертывания приложения.
Выберите этот URL-адрес, чтобы
Deploying service web
открыть приложение чата в браузере.В браузере введите такой вопрос, как "Почему управляемое удостоверение лучше, чем ключи?".
Ответ поступает из Azure OpenAI и отображается результат.
Изучение примера кода
Хотя служба OpenAI и Azure OpenAI используют общую клиентную библиотеку Python, при использовании конечных точек Azure OpenAI необходимы небольшие изменения кода. Давайте посмотрим, как этот пример настраивает проверку подлинности без ключа с помощью идентификатора Microsoft Entra и взаимодействует с Azure OpenAI.
Настройка проверки подлинности с помощью управляемого удостоверения
В этом примере src\quartapp\chat.py
файл начинается с настройки проверки подлинности без ключей.
В следующем фрагменте кода используется модуль azure.identity.aio для создания асинхронного потока проверки подлинности Microsoft Entra.
В следующем фрагменте кода используется AZURE_CLIENT_ID
azd
переменная среды для создания экземпляра ManagedIdentityCredential , поддерживающего проверку подлинности с помощью управляемого удостоверения, назначаемого пользователем.
user_assigned_managed_identity_credential = ManagedIdentityCredential(client_id=os.getenv("AZURE_CLIENT_ID"))
Примечание.
azd
Переменные среды ресурсов подготавливаются во время azd
развертывания приложения.
В следующем фрагменте кода используется AZURE_TENANT_ID
azd
переменная среды ресурсов для создания экземпляра 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_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_CHATGPT_DEPLOYMENT
azd
переменных среды ресурсов, которые подготавливаются во время 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_version
azure_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
для формирования упорядоченной последовательности механизмов проверки подлинности, которые необходимо попытаться выполнить. Это позволяет развертывать один и тот же код в рабочих и локальных средах разработки.
Настройка проверки подлинности с помощью управляемого удостоверения
В этом примере ./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.
Рассмотрите другие меры безопасности, такие как:
Ограничить доступ к соответствующему набору пользователей приложений с помощью Microsoft Entra.
Защита экземпляра приложений контейнеров Azure с помощью брандмауэра и/или виртуальная сеть.
Очистка ресурсов
Очистка ресурсов Azure
Ресурсы Azure, созданные в этой статье, выставляются в подписку Azure. Если вы не ожидаете, что эти ресурсы потребуются в будущем, удалите их, чтобы избежать дополнительных расходов.
Чтобы удалить ресурсы Azure и удалить исходный код, выполните следующую команду Azure Developer CLI:
azd down --purge
Очистка GitHub Codespaces
Удаление среды GitHub Codespaces гарантирует, что вы можете максимально увеличить объем бесплатных прав на базовые часы, которые вы получаете для вашей учетной записи.
Внимание
Дополнительные сведения о правах учетной записи GitHub см . в GitHub Codespaces ежемесячно включено в хранилище и основные часы.
Войдите на панель мониторинга GitHub Codespaces (https://github.com/codespaces).
Найдите текущие запущенные пространства Codespaces, полученные из
Azure-Samples/openai-chat-app-quickstart
репозитория GitHub.Откройте контекстное меню для пространства кода и нажмите кнопку "Удалить".
Войдите на панель мониторинга GitHub Codespaces (https://github.com/codespaces).
Найдите текущие запущенные пространства Codespaces, полученные из
Azure-Samples/openai-chat-app-quickstart-dotnet
репозитория GitHub.Откройте контекстное меню для пространства кода и нажмите кнопку "Удалить".
Войдите на панель мониторинга GitHub Codespaces (https://github.com/codespaces).
Найдите текущие запущенные пространства Codespaces, полученные из
Azure-Samples/openai-chat-app-quickstart-javascript
репозитория GitHub.Откройте контекстное меню для пространства кода и нажмите кнопку "Удалить".