Azure OpenAI セキュリティ構成要素の概要
この記事では、Azure OpenAI セキュリティ構成要素のサンプルを作成して使用する方法について説明します。 目的は、Azure OpenAI に対するキーレス (Microsoft Entra ID) 認証のためのロールベースのアクセス制御 (RBAC) を使用した Azure OpenAI アカウントのプロビジョニングを示することです。 このチャット アプリサンプルには、Azure OpenAI リソースをプロビジョニングし、Azure Developer CLI を使用してアプリを Azure Container Apps にデプロイするために必要なすべてのインフラストラクチャと構成も含まれています。
この記事の手順に従うことで、次の操作を行います:
- セキュリティで保護された Azure Container チャット アプリをデプロイします。
- Azure OpenAI アクセスにはマネージド ID を使用します。
- OpenAI ライブラリを使用して、Azure OpenAI Large Language Model (LLM) とチャットします。
この記事の完了後、カスタムのコードおよびデータを使用して、新しいプロジェクト用の変更を開始できます。
Note
この記事では、記事内の例とガイダンスの土台として、1 つ以上の AI アプリ テンプレートを使用しています。 AI アプリ テンプレートは、適切にメンテナンスされ、デプロイが容易なリファレンス実装を提供します。これは、高品質な AI アプリの作成を開始するために役立ちます。
アーキテクチャの概要
チャット アプリは、Azure Container App として実行されます。 アプリは、API キーではなく、Microsoft Entra ID を介してマネージド ID を使用して Azure OpenAI で認証します。 チャット アプリは、Azure OpenAI を使用してユーザー メッセージへの応答を生成します。
アプリケーション アーキテクチャは、次のサービスとコンポーネントに依存しています。
- Azure OpenAI は、ユーザーのクエリを送信する AI プロバイダーを表します。
- Azure Container Apps は、アプリケーションがホストされるコンテナー環境です。
- マネージド ID は、クラス最高のセキュリティを確保するのに役立ち、開発者がシークレットを安全に管理する必要がなくなります。
- Azure OpenAI、Azure Container Apps、Azure Container Registry、Azure Log Analytics、RBAC ロールなど、Azure リソースをプロビジョニングするための Bicep ファイル 。
- Microsoft AI チャット プロトコルは、AI ソリューションと言語全体で標準化された API コントラクトを提供します。 チャット アプリは Microsoft AI チャット プロトコルに準拠しているため、このプロトコルに準拠する任意のチャット アプリに対して評価を実行できます。
openai
パッケージを使用してユーザー メッセージへの応答を生成する Python Quart。- ReadableStreamを介してJSON Linesを使用してバックエンドからの応答をストリーミングする基本的な HTML/JavaScript フロントエンド。
- Azure.AI.OpenAI NuGet パッケージを使用してユーザー メッセージへの応答を生成する Blazor Web アプリ。
- openai npm パッケージを使用してユーザー メッセージへの応答を生成する TypeScript Web アプリ。
コスト
このサンプルで可能な限り価格を低く保つために、ほとんどのリソースでは Basic 価格レベルまたは従量課金価格レベルが使用されます。 目的の使用法に基づいて、必要に応じてレベルを変更します。 料金の発生を停止するには、記事が完了したらリソースを削除します。
サンプル リポジトリでコストの詳細を参照してください。
サンプル リポジトリでコストの詳細を参照してください。
サンプル リポジトリでコストの詳細を参照してください。
前提条件
開発コンテナー環境は、この記事を完了するために必要なすべての依存関係と共に使用できます。 開発コンテナーは、(ブラウザーで) GitHub Codespaces で実行することも、Visual Studio Code を使用してローカルで実行することもできます。
この記事を使用するには、次の前提条件を満たす必要があります。
Azure サブスクリプション - 無料アカウントを作成します
Azure アカウントのアクセス許可 - Azure アカウントには、User Access Administrator Owner などの
Microsoft.Authorization/roleAssignments/write
アクセス許可が必要です。GitHub アカウント
開発環境を開く
この記事を完了するために必要なすべての依存関係を含む、構成済みの開発環境をデプロイするには、次の手順に従います。
GitHub Codespaces は、 Visual Studio Code for the Web をユーザー インターフェイスとして使用して、GitHub によって管理される開発コンテナーを実行します。 最も簡単な開発環境では、GitHub Codespaces を使用して、この記事を完了するために正しい開発者ツールと依存関係がプレインストールされるようにします。
重要
すべての GitHub アカウントでは、2 つのコア インスタンスで毎月最大 60 時間無料で Codespaces を使用できます。 詳細については、「 GitHub Codespaces に月単位で含まれるストレージとコア時間」を参照してください。
Azure-Samples/openai-chat-app-quickstart
GitHub リポジトリの main
ブランチに新しい GitHub Codespace を作成するには、次の手順に従います。
次のボタンを右クリックし、 [新しいウィンドウでリンクを開く]を選択します。 このアクションを使用すると、開発環境とドキュメントを確認できます。
コードスペースの作成 ページで、新しいコード空間確認して選択します。
Codespace が起動するまで待ちます。 この起動プロセスには数分かかることがあります。
画面の下部にあるターミナルで、Azure Developer CLI を使用して Azure にサインインします。
azd auth login
ターミナルからコードをコピーし、ブラウザーに貼り付けます。 手順に従って、Azure アカウントで認証します。
この記事の残りのタスクは、この開発コンテナーのコンテキストで行われます。
Azure-Samples/openai-chat-app-quickstart-dotnet
GitHub リポジトリの main
ブランチに新しい GitHub Codespace を作成するには、次の手順に従います。
次のボタンを右クリックし、 [新しいウィンドウでリンクを開く]を選択します。 このアクションを使用すると、開発環境とドキュメントを確認できます。
コードスペースの作成 ページで、コード空間の作成確認して選択します。
Codespace が起動するまで待ちます。 この起動プロセスには数分かかることがあります。
画面の下部にあるターミナルで、Azure Developer CLI を使用して Azure にサインインします。
azd auth login
ターミナルからコードをコピーし、ブラウザーに貼り付けます。 手順に従って、Azure アカウントで認証します。
この記事の残りのタスクは、この開発コンテナーのコンテキストで行われます。
Azure-Samples/openai-chat-app-quickstart-javascript
GitHub リポジトリの main
ブランチに新しい GitHub Codespace を作成するには、次の手順に従います。
- 次のボタンを右クリックし、 [新しいウィンドウでリンクを開く]を選択します。 このアクションを使用すると、開発環境とドキュメントを確認できます。
コードスペースの作成 ページで、新しいコード空間確認して選択します。
Codespace が起動するまで待ちます。 この起動プロセスには数分かかることがあります。
画面の下部にあるターミナルで、Azure Developer CLI を使用して Azure にサインインします。
azd auth login
ターミナルからコードをコピーし、ブラウザーに貼り付けます。 手順に従って、Azure アカウントで認証します。
この記事の残りのタスクは、この開発コンテナーのコンテキストで行われます。
デプロイして実行する
サンプル リポジトリには、チャット アプリの Azure デプロイ用のすべてのコードと構成ファイルが含まれています。 次の手順では、サンプル チャット アプリの Azure デプロイ プロセスについて説明します。
チャット アプリを Azure にデプロイする
重要
このセクションで作成された Azure リソースでは、すぐにコストが発生します。 これらのリソースは、コマンドが完全に実行される前に中断した場合でも、コストが発生する可能性があります。
Azure リソースのプロビジョニングとソース コードのデプロイに対して、次の Azure Developer CLI コマンドを実行します。
azd up
プロンプトに応答するには、次の表を使用します。
Prompt 回答 環境名 常に短くし、小文字を使用します。 自分の名前またはエイリアスを追加します。 たとえば、 secure-chat
のようにします。 リソース グループ名の一部として使用されます。サブスクリプション リソースの作成先となるサブスクリプションを選択します。 場所 (ホスティング用) リストから、自分に近い場所を選択します。 場所 (OpenAI モデル用) リストから、自分に近い場所を選択します。 最初の場所と同じ場所を使用できる場合は、その場所を選択します。 アプリがデプロイされるまで待ちます。 通常、デプロイの完了には 5 分から 10 分かかります。
チャット アプリを使用して大規模言語モデルに質問する
アプリケーションのデプロイが正常に完了すると、ターミナルに URL が表示されます。
Deploying service web
とラベルの付いたその URL を選択して、ブラウザーでチャット アプリケーションを開きます。ブラウザーで、"マネージド ID がキーよりも優れている理由" などの質問を入力します。
回答は Azure OpenAI に由来し、結果が表示されます。
サンプル コードの探索
OpenAI と Azure OpenAI Service は common Python クライアント ライブラリに依存していますが Azure OpenAI エンドポイントを使用する場合は小さなコード変更が必要です。 このサンプルでは、Microsoft Entra ID を使用してキーレス認証を構成し、Azure OpenAI と通信する方法を見てみましょう。
マネージド ID を使用した認証の構成
このサンプルでは、 src\quartapp\chat.py
ファイルはキーレス認証の構成から始まります。
次のスニペットでは、 azure.identity.aio モジュールを使用して、非同期の Microsoft Entra 認証フローを作成します。
次のコード スニペットでは、 AZURE_CLIENT_ID
azd
環境変数を使用して、ユーザー割り当てマネージド ID を使用して認証できる ManagedIdentityCredential インスタンスを作成します。
user_assigned_managed_identity_credential = ManagedIdentityCredential(client_id=os.getenv("AZURE_CLIENT_ID"))
Note
azd
リソース環境変数は、azd
アプリのデプロイ中にプロビジョニングされます。
次のコード スニペットでは、 AZURE_TENANT_ID
azd
リソース環境変数を使用して、現在の Microsoft Entra テナントで認証できる AzureDeveloperCliCredential インスタンスを作成します。
azure_dev_cli_credential = AzureDeveloperCliCredential(tenant_id=os.getenv("AZURE_TENANT_ID"), process_timeout=60)
Azure Identity クライアント ライブラリは、Azure Core ライブラリの TokenCredential プロトコルを実装する資格情報 (パブリック クラス) を提供します。 資格情報は、Microsoft Entra ID からアクセス トークンを取得するための個別の認証フローを表します。 これらの資格情報を連結することにより、試行される一連の認証メカニズムを順序付けたシーケンスを形成できます。
次のスニペットでは、ManagedIdentityCredential
とAzureDeveloperCliCredential
を使用してChainedTokenCredential
を作成します。
ManagedIdentityCredential
は、Azure Functions と Azure アプリ Service に使用されます。 ユーザー割り当てマネージド ID は、client_id
をManagedIdentityCredential
に渡すことによってサポートされます。AzureDeveloperCliCredential
はローカル開発に使用されます。 以前は、使用する Microsoft Entra テナントに基づいて設定されていました。
azure_credential = ChainedTokenCredential(
user_assigned_managed_identity_credential,
azure_dev_cli_credential
)
ヒント
最初の有効な Microsoft Entra アクセス トークンが使用されるため、資格情報の順序は重要です。 詳細については、 ChainedTokenCredential の概要 記事を参照してください。
次のコード スニペットは、選択した Azure 資格情報に基づいて Azure OpenAI トークン プロバイダーを取得します。 この値は、2 つの引数を使用して azure.identity.aio.get_bearer_token_provider を呼び出すことによって取得されます。
azure_credential
: 要求を認証するために先ほど作成したChainedTokenCredential
インスタンス。https://cognitiveservices.azure.com/.default
: 1 つ以上のベアラー トークン スコープが必要です。 この場合、 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,
)
次の行は、API 呼び出しで使用する Azure OpenAI モデルのデプロイ名を設定します。
bp.openai_model = os.getenv("AZURE_OPENAI_CHATGPT_DEPLOYMENT")
Note
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 Open AI 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 ID を使用してキーレス認証を構成し、Azure OpenAI と通信します。
認証とサービスの登録を構成する
このサンプルでは、キーレス認証は program.cs
ファイルで構成されています。 次のコード スニペットでは、azd
によって設定されたAZURE_CLIENT_ID
環境変数を使用して、ユーザー割り当てマネージド ID を使用して認証できる ManagedIdentityCredential インスタンスを作成します。
var userAssignedIdentityCredential =
new ManagedIdentityCredential(builder.Configuration.GetValue<string>("AZURE_CLIENT_ID"));
Note
azd
リソース環境変数は、azd
アプリのデプロイ中にプロビジョニングされます。
次のコード スニペットでは、azd
によって設定されたAZURE_TENANT_ID
環境変数を使用して、azd
にサインインしたアカウントを使用してローカルで認証できる AzureDeveloperCliCredential インスタンスを作成します。
var azureDevCliCredential = new AzureDeveloperCliCredential(
new AzureDeveloperCliCredentialOptions()
{
TenantId = builder.Configuration.GetValue<string>("AZURE_TENANT_ID")
});
Azure Identity クライアント ライブラリには、Azure Core ライブラリの TokenCredential プロトコルを実装する資格情報クラスが用意されています。 資格情報は、Microsoft Entra ID からアクセス トークンを取得するための個別の認証フローを表します。 これらの資格情報は、 ChainedTokenCredential
を使用して連結して、試行する一連の順序付けされた認証メカニズムを形成できます。
次のスニペットは、依存関係挿入のAzureOpenAIClient
を登録し、ManagedIdentityCredential
とAzureDeveloperCliCredential
を使用してChainedTokenCredential
を作成します。
ManagedIdentityCredential
は、Azure Functions と Azure アプリ Service に使用されます。 ユーザー割り当てマネージド ID は、ManagedIdentityCredential
に提供されたAZURE_CLIENT_ID
を使用してサポートされます。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 の概要 記事を参照してください。
Azure OpenAI クライアントを使用してチャットの完了を取得する
Blazor Web アプリは、登録された 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 Service は openai (一般的な JavaScript クライアント ライブラリ) に依存していますが、Azure OpenAI エンドポイントを使用する場合は小さなコード変更が必要です。 このサンプルでは、Microsoft Entra ID を使用してキーレス認証を構成し、Azure OpenAI と通信する方法を見てみましょう。
各環境のキーレス認証
Azure Identity クライアント ライブラリには、Azure Core ライブラリの TokenCredential プロトコルを実装する資格情報クラスが用意されています。 資格情報は、Microsoft Entra ID からアクセス トークンを取得するための個別の認証フローを表します。 これらの資格情報は、 ChainedTokenCredential
を使用して連結して、試行する一連の順序付けされた認証メカニズムを形成できます。 これにより、運用環境とローカル開発環境の両方に同じコードをデプロイできます。
マネージド ID を使用した認証の構成
このサンプルでは、 ./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環境変数を使用して設定され、ユーザー割り当てマネージド ID を使用して認証できます。
- AzureDeveloperCliCredential が 2 番目に試行されます。 これは、Azure CLI
az login
を使用して開発がサインインするときに設定されます。
ヒント
最初の有効な Microsoft Entra アクセス トークンが使用されるため、資格情報の順序は重要です。 詳細については、 ChainedTokenCredential の概要 記事を参照してください。
OpenAI のベアラー トークンを取得する
./src/azure-authentication.ts
の 2 番目の関数は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
の 3 番目の関数は 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 を使用してチャットの回答をストリーム配信する
./src/openai-chat-api.ts
で次の Fastify ルート ハンドラーを使用して、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 から返されると、クライアントに送信されます。
その他のセキュリティの考慮事項
この記事では、サンプルで Azure OpenAI サービスに対する認証に ChainedTokenCreadential
を使用する方法について説明します。
サンプルには、コードとしてのインフラストラクチャ ファイルをスキャンし、検出された問題を含むレポートを生成する GitHub Action もあります。 独自のリポジトリで継続的なベスト プラクティスを確保するには、テンプレートに基づいてソリューションを作成するすべてのユーザーが、 GitHub シークレット スキャン設定 が有効になっていることを確認することをお勧めします。
次のような他のセキュリティ対策を検討してください。
Microsoft Entra を使用して、適切なアプリ ユーザーのセットへのアクセスを制限します。
ファイアウォール、または Virtual Network を使用した Azure Container Apps インスタンスの保護。
リソースをクリーンアップする
Azure リソースをクリーンアップする
この記事で作成した Azure リソースは、Azure サブスクリプションに課金されます。 今後これらのリソースが必要になるとは思わない場合は、削除して、より多くの料金が発生しないようにします。
次の Azure Developer CLI コマンドを実行して、Azure リソースを削除し、ソース コードを削除します:
azd down --purge
GitHub Codespaces をクリーンアップする
GitHub Codespaces 環境を削除すると、アカウントに対して取得するコアごとの無料時間エンタイトルメントの量を最大化できることが保証されます。
重要
GitHub アカウントのエンタイトルメントの詳細については、「 GitHub Codespaces に月単位で含まれるストレージとコア時間」を参照してください。
GitHub Codespaces ダッシュボード (https://github.com/codespaces) にサインインします。
Azure-Samples/openai-chat-app-quickstart
GitHub リポジトリをソースとして現在実行中の Codespaces を見つけます。codespace のコンテキスト メニューを開いた後に、[削除] を選択します。
GitHub Codespaces ダッシュボード (https://github.com/codespaces) にサインインします。
Azure-Samples/openai-chat-app-quickstart-dotnet
GitHub リポジトリをソースとして現在実行中の Codespaces を見つけます。codespace のコンテキスト メニューを開いた後に、[削除] を選択します。
GitHub Codespaces ダッシュボード (https://github.com/codespaces) にサインインします。
Azure-Samples/openai-chat-app-quickstart-javascript
GitHub リポジトリをソースとして現在実行中の Codespaces を見つけます。codespace のコンテキスト メニューを開いた後に、[削除] を選択します。
ヘルプを取得
問題が解決しない場合は、リポジトリの [問題] にその問題を記録します。
問題が解決しない場合は、リポジトリの [問題] にその問題を記録します。