Azure OpenAI セキュリティビルディングブロックの使い始め方

この記事では、Azure OpenAI セキュリティ構成要素のサンプルを作成して使用する方法について説明します。 目的は、Azure OpenAI のアカウントを、キーレス認証(Microsoft Entra ID)を使用して Azure OpenAI に対するロールベースのアクセス制御 (RBAC) でプロビジョニングすることを示すことです。 このチャット アプリサンプルには、Azure Developer CLI を使用して、Azure OpenAI リソースをプロビジョニングし、アプリをAzure Container Appsにデプロイするために必要なすべてのインフラストラクチャと構成も含まれています。

この記事の手順に従うことで、次の操作を行います:

  • セキュリティで保護されたチャット アプリを Azure Container Apps に展開します。
  • Azure OpenAI アクセスにはマネージド ID を使用します。
  • OpenAI ライブラリを使用して、Azure OpenAI Large Language Model (LLM) とチャットします。

この記事の完了後、カスタムのコードおよびデータを使用して、新しいプロジェクト用の変更を開始できます。

この記事では、記事内の例とガイダンスの土台として、1 つ以上の AI アプリ テンプレートを使用しています。 AI アプリ テンプレートは、適切にメンテナンスされ、デプロイが容易なリファレンス実装を提供します。これは、高品質な AI アプリの作成を開始するために役立ちます。

アーキテクチャの概要

チャット アプリの単純なアーキテクチャを次の図に示します。 クライアントからバックエンド アプリへのアーキテクチャを示す図。

チャット アプリは、Azure コンテナー アプリとして実行されます。 アプリは、API キーではなく、Microsoft Entra IDを介してマネージド ID を使用して、Azure OpenAI で認証します。 チャット アプリは、Azure OpenAI を使用して、ユーザー メッセージへの応答を生成します。

アプリケーション アーキテクチャは、次のサービスとコンポーネントに依存しています。

  • Azure OpenAI は、ユーザーのクエリの送信先となる AI プロバイダーを表します。
  • Azure Container Apps は、アプリケーションがホストされているコンテナー環境です。
  • マネージド ID は、クラス最高のセキュリティを確保するのに役立ち、開発者がシークレットを安全に管理する必要がなくなります。
  • Bicep ファイル Azure OpenAI、Azure Container Apps、Azure Container Registry、Azure Log Analytics、RBAC ロールなど、Azure リソースをプロビジョニングします。
  • Python Quartopenai パッケージと Responses API を使用してユーザー メッセージへの応答を生成するアプリ。
  • ReadableStreamを介してJSON Linesを使用してバックエンドからの応答をストリーミングする基本的な HTML/JavaScript フロントエンド。
  • Azure.AI.OpenAI NuGet パッケージを使用してユーザー メッセージに応答を生成する Blazor Web アプリ。
  • OpenAI npm パッケージを使用してユーザー メッセージへの応答を生成する TypeScript Web アプリ。

コスト

このサンプルで可能な限り価格を低く保つために、ほとんどのリソースでは Basic 価格レベルまたは従量課金価格レベルが使用されます。 目的の使用法に基づいて、必要に応じてレベルを変更します。 料金の発生を停止するには、記事が完了したらリソースを削除します。

サンプル リポジトリのコストの詳細についてはを参照してください。

サンプル リポジトリのコストの詳細についてはを参照してください。

サンプル リポジトリのコストの詳細についてはを参照してください。

前提条件

開発コンテナー環境は、この記事を完了するために必要なすべての依存関係と共に使用できます。 開発コンテナーは、GitHub Codespaces (ブラウザー) で実行することも、Visual Studio Codeを使用してローカルで実行することもできます。

この記事を使用するには、次の前提条件を満たす必要があります。

開発環境を開く

この記事を完了するために必要なすべての依存関係を含む、構成済みの開発環境をデプロイするには、次の手順に従います。

GitHub Codespaces は、GitHubによって管理される開発コンテナーを、ユーザーインターフェースとして Web 版 Visual Studio Code を使用して実行します。 最も簡単な開発環境では、GitHub Codespaces を使用して、この記事を完了するために適切な開発者ツールと依存関係がプレインストールされるようにします。

重要

すべてのGitHub アカウントでは、コア インスタンスが 2 つあり、毎月最大 60 時間無料で Codespaces を使用できます。 詳細については、「GitHub Codespaces の月単位のストレージとコア時間を参照してください。

main GitHub リポジトリの Azure-Samples/openai-chat-app-quickstart ブランチに新しい GitHub Codespace を作成するには、次の手順に従います。

  1. 次のボタンを右クリックし、 [新しいウィンドウでリンクを開く]を選択します。 このアクションを使用すると、開発環境とドキュメントを確認できます。

  2. コードスペースの作成ページで確認し、新しいコースペースを作成を選択します。

    新しい codespace 作成前の確認画面のスクリーンショット。

  3. Codespace が起動するまで待ちます。 この起動プロセスには数分かかることがあります。

  4. 画面の下部にあるターミナルで、Azure Developer CLI を使用してAzureにサインインします。

    azd auth login
    
  5. ターミナルからコードをコピーし、ブラウザーに貼り付けます。 手順に従って、Azure アカウントで認証します。

この記事の残りのタスクは、この開発コンテナーのコンテキストで行われます。

main GitHub リポジトリの Azure-Samples/openai-chat-app-quickstart-dotnet ブランチに新しい GitHub Codespace を作成するには、次の手順に従います。

  1. 次のボタンを右クリックし、 [新しいウィンドウでリンクを開く]を選択します。 このアクションを使用すると、開発環境とドキュメントを確認できます。

  2. コードスペースの作成 ページで、コードスペースを確認して作成を選択します。

    新しい codespace 作成前の確認画面のスクリーンショット。

  3. Codespace が起動するまで待ちます。 この起動プロセスには数分かかることがあります。

  4. 画面の下部にあるターミナルで、Azure Developer CLI を使用してAzureにサインインします。

    azd auth login
    
  5. ターミナルからコードをコピーし、ブラウザーに貼り付けます。 手順に従って、Azure アカウントで認証します。

この記事の残りのタスクは、この開発コンテナーのコンテキストで行われます。

main GitHub リポジトリの Azure-Samples/openai-chat-app-quickstart-javascript ブランチに新しい GitHub Codespace を作成するには、次の手順に従います。

  1. 次のボタンを右クリックし、 [新しいウィンドウでリンクを開く]を選択します。 このアクションを使用すると、開発環境とドキュメントを確認できます。

GitHub Codespacesで開く

  1. コードスペースの作成ページで確認し、新しいコースペースを作成を選択します。

    新しい codespace 作成前の確認画面のスクリーンショット。

  2. Codespace が起動するまで待ちます。 この起動プロセスには数分かかることがあります。

  3. 画面の下部にあるターミナルで、Azure Developer CLI を使用してAzureにサインインします。

    azd auth login
    
  4. ターミナルからコードをコピーし、ブラウザーに貼り付けます。 手順に従って、Azure アカウントで認証します。

この記事の残りのタスクは、この開発コンテナーのコンテキストで行われます。

デプロイして実行する

サンプル リポジトリには、チャット アプリAzureデプロイ用のすべてのコードファイルと構成ファイルが含まれています。 次の手順では、サンプル チャット アプリAzure展開プロセスについて説明します。

チャット アプリを Azure に展開する

重要

このセクションで作成Azureリソースでは、すぐにコストが発生します。 これらのリソースは、完全に実行される前にコマンドを中断した場合でも、コストが発生する可能性があります。

  1. 次の Azure Developer CLI コマンドを実行して、Azureリソースのプロビジョニングとソース コードのデプロイを行います。

    azd up
    
  2. プロンプトに応答するには、次の表を使用します。

    プロンプト 回答
    環境名 常に短くし、小文字を使用します。 自分の名前またはエイリアスを追加します。 たとえば、secure-chat のようにします。 リソース グループ名の一部として使用されます。
    サブスクリプション リソースの作成先となるサブスクリプションを選択します。
    場所 (ホスティング用) リストから、自分に近い場所を選択します。
    場所 (OpenAI モデル用) リストから、自分に近い場所を選択します。 最初の場所と同じ場所を使用できる場合は、その場所を選択します。
  3. アプリがデプロイされるまで待ちます。 通常、デプロイの完了には 5 分から 10 分かかります。

チャット アプリを使用して大規模言語モデルに質問する

  1. アプリケーションのデプロイが正常に完了すると、ターミナルに URL が表示されます。

  2. Deploying service web とラベルの付いたその URL を選択して、ブラウザーでチャット アプリケーションを開きます。

    ブラウザーのチャット アプリのスクリーンショット。チャット入力に関するいくつかの提案と、質問を入力するためのチャット テキスト ボックスが表示されています。

  3. ブラウザーで、"マネージド ID がキーよりも優れている理由" などの質問を入力します。

  4. 答えは OpenAI Azureから取得され、結果が表示されます。

サンプル コードの探索

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_IDazd 環境変数を使用して、ユーザー割り当てマネージド ID を使用して認証できる ManagedIdentityCredential インスタンスを作成します。

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

azd リソース環境変数は、azd アプリのデプロイ中にプロビジョニングされます。

次のコード スニペットでは、AZURE_TENANT_IDazd リソース環境変数を使用して、現在のMicrosoft Entra テナントで認証できる AzureDeveloperCliCredential インスタンスを作成します。

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

Azure Identity クライアント ライブラリには、Azure Core ライブラリの TokenCredential プロトコルを実装する credentials パブリック クラスが用意されています。 資格情報は、Microsoft Entra IDからアクセス トークンを取得するための個別の認証フローを表します。 これらの資格情報を連結することにより、試行される一連の認証メカニズムを順序付けたシーケンスを形成できます。

次のスニペットでは、ChainedTokenCredentialManagedIdentityCredentialを使用してAzureDeveloperCliCredentialを作成します。

  • ManagedIdentityCredentialは、Azure Functions、Azure App Service、およびAzure Container Appsに使用されます。 ユーザー割り当てマネージド ID は、 client_idManagedIdentityCredentialに渡すことによってサポートされます。
  • 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_ENDPOINTAZURE_OPENAI_CHAT_DEPLOYMENTazdプロビジョニング中に設定される 2 つの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")

このスニペットは、Azureの /openai/v1/ エンドポイントに対して OpenAI クライアントを初期化し、トークン プロバイダーを api_key として渡します。 v1 エンドポイントで api_version は必要ありません。

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

次の行は、API 呼び出しで使用Azure OpenAI モデルのデプロイ名を設定します。

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

OpenAI では、modelキーワード引数を使って、使用するモデルを指定します。 Azure OpenAI には、unique モデルデプロイという概念があります。 Azure OpenAI を使用する場合、model は、Azure OpenAI モデルのデプロイ時に選択された基になるデプロイ名を参照する必要があります。

この関数が完了すると、クライアントは適切に構成され、Azure OpenAI サービスと対話する準備が整います。

OpenAI Responses API を使用して応答をストリーム配信する

response_streamは、ルート内の Responses API ストリーミング呼び出しを処理します。 フロントエンドは Responses 型の input 項目を直接送信し、バックエンドはそれらを 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 OpenAIサービスと通信するためにAzure.AI.OpenAIクライアントライブラリに依存しています。このクライアントライブラリはOpenAIライブラリに依存しています。 サンプル アプリでは、Microsoft Entra IDを使用してキーレス認証を構成し、Azure OpenAI と通信します。

認証とサービスの登録を構成する

このサンプルでは、キーレス認証は program.cs ファイルで構成されています。 次のコード スニペットでは、AZURE_CLIENT_IDによって設定されたazd環境変数を使用して、ユーザー割り当てマネージド ID を使用して認証できる ManagedIdentityCredential インスタンスを作成します。

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

azd リソース環境変数は、azd アプリのデプロイ中にプロビジョニングされます。

次のコード スニペットでは、AZURE_TENANT_IDによって設定されたazd環境変数を使用して、にサインインしたアカウントを使用してローカルで認証できる azd インスタンスを作成します。

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

Azure Identity クライアント ライブラリには、Azure Core ライブラリの TokenCredential プロトコルを実装する資格情報クラスが用意されています。 資格情報は、Microsoft Entra IDからアクセス トークンを取得するための個別の認証フローを表します。 これらの資格情報は、 ChainedTokenCredential を使用して連結して、試行する一連の順序付けされた認証メカニズムを形成できます。

次のスニペットは、依存関係挿入のAzureOpenAIClientを登録し、ChainedTokenCredentialManagedIdentityCredentialを使用してAzureDeveloperCliCredentialを作成します。

  • ManagedIdentityCredentialは、Azure Functions、Azure App Service、およびAzure Container Appsに使用されます。 ユーザーが割り当てたマネージド ID は、AZURE_CLIENT_IDManagedIdentityCredentialに提供することでサポートされます。
  • 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 アプリは、登録された AzureOpenAIClientHome.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 番目に試行されます。 これは、開発者が azd auth login を使用して Azure Developer CLI でサインインするときに設定されます。

ヒント

最初の有効な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 ルート ハンドラーを使用して、OpenAI Azureにメッセージを送信し、応答をストリーミングします。

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 に送信します。 ストリーム チャンクは OpenAI Azureから返されるため、クライアントに送信されます。

その他のセキュリティの考慮事項

この記事では、サンプルで ChainedTokenCredential を使用して、Azure OpenAI サービスに対する認証を行う方法について説明します。

サンプルには、コードとしてのインフラストラクチャ ファイルをスキャンし、検出された問題を含むレポートを生成する GitHub Action もあります。 独自のリポジトリで継続的なベスト プラクティスを確保するには、テンプレートに基づいてソリューションを作成するすべてのユーザーが、GitHubシークレット スキャン設定が有効になっていることを確認することをお勧めします。

次のような他のセキュリティ対策を検討してください。

リソースをクリーンアップする

Azure リソースをクリーンアップする

この記事で作成したAzure リソースは、Azure サブスクリプションに課金されます。 今後これらのリソースが必要になるとは思わない場合は、削除して、より多くの料金が発生しないようにします。

Azure リソースを削除し、ソース コードを削除するには、次の Azure Developer CLI コマンドを実行します。

azd down --purge

GitHub Codespaces をクリーンアップする

GitHub Codespaces 環境を削除すると、アカウントに対して取得するコア時間単位の無料エンタイトルメントの量を最大化できます。

重要

GitHub アカウントの権利の詳細については、「GitHub Codespaces の月単位のストレージとコア時間を参照してください。

  1. GitHub Codespaces ダッシュボードにサインインします。

  2. Azure-Samples/openai-chat-app-quickstart GitHub リポジトリから、ユーザーが現在実行中の Codespaces を探します。

  3. codespace のコンテキスト メニューを開いた後に、[削除] を選択します。

  1. GitHub Codespaces ダッシュボードにサインインします。

  2. Azure-Samples/openai-chat-app-quickstart-dotnet GitHub リポジトリから現在実行中の Codespaces を見つけます。

  3. codespace のコンテキスト メニューを開いた後に、[削除] を選択します。

  1. GitHub Codespaces ダッシュボードにサインインします。

  2. 現在実行中の Codespaces を GitHub リポジトリ Azure-Samples/openai-chat-app-quickstart-javascript から探します。

  3. codespace のコンテキスト メニューを開いた後に、[削除] を選択します。

ヘルプを取得

問題が解決しない場合は、リポジトリの Issues に問題を記録します。

次のステップ

Python

問題が解決しない場合は、リポジトリの Issues に問題を記録します。

.NET

問題が解決しない場合は、リポジトリの Issues に問題を記録します。