Python 用Azure AI Content Safety クライアント ライブラリ - バージョン 1.0.0

Azure AI Content Safetyは、アプリケーションやサービス内の有害なユーザー生成コンテンツと AI 生成コンテンツを検出します。 Content Safety には、有害な素材を検出できるテキスト API と画像 API が含まれています。

  • テキスト分析 API: 複数の重大度レベルで、性的コンテンツ、暴力、憎悪、自傷行為のテキストをスキャンします。
  • 画像分析 API: 複数の重大度レベルで、性的コンテンツ、暴力、憎悪、自傷行為の画像をスキャンします。
  • テキスト ブロックリスト管理 API: 既定の AI 分類子は、ほとんどのコンテンツの安全性のニーズに十分です。ただし、ユース ケースに固有の用語を確認する必要がある場合があります。 Text API で使用する用語のブロックリストを作成できます。

ドキュメント

作業の開始に役立つさまざまなドキュメントが用意されています

作業の開始

前提条件

パッケージをインストールする

pip install azure-ai-contentsafety

クライアントを認証する

エンドポイントを取得する

Azure AI Content Safety サービス リソースのエンドポイントは、Azure Portal または Azure CLI を使用して確認できます。

# Get the endpoint for the Azure AI Content Safety service resource
az cognitiveservices account show --name "resource-name" --resource-group "resource-group-name" --query "properties.endpoint"

API キーを使用して ContentSafetyClient/BlocklistClient を作成する

パラメーターとして API キーを credential 使用するには。

  • 手順 1: API キーを取得します。 API キーは 、Azure Portal で、または次の Azure CLI コマンドを実行して見つけることができます。

    az cognitiveservices account keys list --name "<resource-name>" --resource-group "<resource-group-name>"
    
  • 手順 2: キーを文字列として の AzureKeyCredentialインスタンスに渡します。

    from azure.core.credentials import AzureKeyCredential
    from azure.ai.contentsafety import ContentSafetyClient, BlocklistClient
    
    endpoint = "https://<my-custom-subdomain>.cognitiveservices.azure.com/"
    credential = AzureKeyCredential("<api_key>")
    content_safety_client = ContentSafetyClient(endpoint, credential)
    blocklist_client = BlocklistClient(endpoint, credential)
    

MICROSOFT ENTRA ID トークン資格情報を使用して ContentSafetyClient/BlocklistClient を作成する

  • 手順 1: リソースのMicrosoft Entra ID を有効にします。 リソースのMicrosoft Entra ID を有効にする手順については、このドキュメント「Microsoft Entra ID で認証する」を参照してください。

    主要な手順は次のとおりです。

    • カスタム サブドメインを使用してリソースを作成します。
    • サービス プリンシパルを作成し、Cognitive Services ユーザー ロールを割り当てます。
  • 手順 2: Microsoft Entra アプリケーションのクライアント ID、テナント ID、およびクライアント シークレットの値を環境変数として設定します。 AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_CLIENT_SECRET

    DefaultAzureCredential では、これらの環境変数の値が使用されます。

    from azure.identity import DefaultAzureCredential
    from azure.ai.contentsafety import ContentSafetyClient, BlocklistClient
    
    endpoint = "https://<my-custom-subdomain>.cognitiveservices.azure.com/"
    credential = DefaultAzureCredential()
    content_safety_client = ContentSafetyClient(endpoint, credential)
    blocklist_client = BlocklistClient(endpoint, credential)
    

主要な概念

利用可能な機能

このサービスからは、さまざまな種類の分析を使用できます。 次の表は、現在使用できる API を説明したものです。

機能 説明
テキスト分析 API 複数の重大度レベルで、性的コンテンツ、暴力、憎悪、自傷行為のテキストをスキャンします。
Image Analysis API 複数の重大度レベルで、性的コンテンツ、暴力、憎悪、自傷行為の画像をスキャンします。
テキスト ブロックリスト管理 API 既定の AI 分類子は、ほとんどのコンテンツの安全性のニーズに十分です。 ただし、ユース ケースに固有の用語を確認する必要がある場合があります。 Text API で使用する用語のブロックリストを作成できます。

危害カテゴリ

Content Safety により、不快なコンテンツの 4 つの異なるカテゴリが認識されます。

カテゴリ 説明
増悪 憎悪と公平性に関連する害は、人種、民族、国籍、性同一性と表現、性的指向、宗教、移民状態、能力状態、個人の外観、体格など、これらのグループの特定の差別化属性に基づいて、人またはアイデンティティグループを参照して、悲観的または差別的な言葉を攻撃または使用するコンテンツを指します。
性的 性的表現は、解剖学的な臓器や性器、ロマンチックな関係、性的または愛情的な言葉で描かれた行為、妊娠、身体的な性的行為、自分の意志、売春、ポルノ、虐待に対する暴行や強制性的暴力行為として描かれた行為を含む。
暴力 暴力とは、人や何かを傷つけたり、傷つけたり、損害を与えたり、殺したりすることを意図した物理的な行為に関連する言葉を表します。は、武器、銃、およびメーカー、協会、法律などの関連エンティティについて説明します。
自傷行為 自傷行為とは、意図的に身体を傷つけたり、傷つけたり、身体を傷つけたり、自分を殺したりする行為に関連する言葉です。

分類には複数のラベルを付けることができます。 たとえば、テキスト サンプルがテキスト モデレーション モデルを通過すると、性的コンテンツと暴力の両方として分類される可能性があります。

セキュリティ レベル

サービスで適用されるすべての危害カテゴリには、重大度レベルも含まれます。 重大度レベルは、フラグが設定されたコンテンツを表示した結果の重大度を示すためのものです。

テキスト: テキスト モデルの現在のバージョンでは、完全な 0 から 7 の重大度スケールがサポートされています。 既定では、応答は 4 つの値 (0、2、4、6) を出力します。 隣接する 2 つの各レベルは、1 つのレベルにマップされます。 ユーザーは request で "outputType" を使用し、"EightSeverityLevels" として設定して、出力で 0,1,2,3,4,5,6,7 の 8 つの値を取得できます。 詳細については、 テキスト コンテンツの重要度レベルの定義を 参照できます。

  • [0,1] -> 0
  • [2,3] -> 2
  • [4,5] -> 4
  • [6,7] -> 6

イメージ: イメージ モデルの現在のバージョンでは、完全な 0 から 7 の重大度スケールのトリミングされたバージョンがサポートされています。 分類子は重大度 0、2、4、および 6 のみを返します。各 2 つの隣接するレベルは、1 つのレベルにマップされます。 詳細については、 イメージ コンテンツの重大度レベルの定義を 参照できます。

  • [0,1] -> 0
  • [2,3] -> 2
  • [4,5] -> 4
  • [6,7] -> 6

テキスト ブロックリストの管理

テキスト ブロックリストを管理するには、次の操作がサポートされています。

  • ブロックリストを作成または変更する
  • すべてのブロックリストを一覧表示する
  • blocklistName でブロックリストを取得する
  • ブロックリストに blocklistItems を追加する
  • ブロックリストから blocklistItems を削除する
  • ブロックリスト内のすべての blocklistItem を blocklistName で一覧表示する
  • blocklistItemId と blocklistName を使用してブロックリスト内の blocklistItem を取得する
  • ブロックリストとそのすべての blocklistItems を削除する

テキストを分析するときに使用するブロックリストを設定すると、返された応答からブロックリストの一致結果を取得できます。

次のセクションでは、次のような最も一般的な Content Safety サービス タスクをカバーするいくつかのコード スニペットを示します。

ここで使用するデータについては、 サンプル データ を参照してください。 その他のサンプルについては、 サンプルを参照してください。

テキストを分析する

ブロックリストなしでテキストを分析する


    import os
    from azure.ai.contentsafety import ContentSafetyClient
    from azure.ai.contentsafety.models import TextCategory
    from azure.core.credentials import AzureKeyCredential
    from azure.core.exceptions import HttpResponseError
    from azure.ai.contentsafety.models import AnalyzeTextOptions

    key = os.environ["CONTENT_SAFETY_KEY"]
    endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]

    # Create a Content Safety client
    client = ContentSafetyClient(endpoint, AzureKeyCredential(key))

    # Construct a request
    request = AnalyzeTextOptions(text="You are an idiot")

    # Analyze text
    try:
        response = client.analyze_text(request)
    except HttpResponseError as e:
        print("Analyze text failed.")
        if e.error:
            print(f"Error code: {e.error.code}")
            print(f"Error message: {e.error.message}")
            raise
        print(e)
        raise

    hate_result = next(item for item in response.categories_analysis if item.category == TextCategory.HATE)
    self_harm_result = next(item for item in response.categories_analysis if item.category == TextCategory.SELF_HARM)
    sexual_result = next(item for item in response.categories_analysis if item.category == TextCategory.SEXUAL)
    violence_result = next(item for item in response.categories_analysis if item.category == TextCategory.VIOLENCE)

    if hate_result:
        print(f"Hate severity: {hate_result.severity}")
    if self_harm_result:
        print(f"SelfHarm severity: {self_harm_result.severity}")
    if sexual_result:
        print(f"Sexual severity: {sexual_result.severity}")
    if violence_result:
        print(f"Violence severity: {violence_result.severity}")

ブロックリストを使用してテキストを分析する


    import os
    from azure.ai.contentsafety import ContentSafetyClient
    from azure.core.credentials import AzureKeyCredential
    from azure.ai.contentsafety.models import AnalyzeTextOptions
    from azure.core.exceptions import HttpResponseError

    key = os.environ["CONTENT_SAFETY_KEY"]
    endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]

    # Create a Content Safety client
    client = ContentSafetyClient(endpoint, AzureKeyCredential(key))

    blocklist_name = "TestBlocklist"
    input_text = "I h*te you and I want to k*ll you."

    try:
        # After you edit your blocklist, it usually takes effect in 5 minutes, please wait some time before analyzing with blocklist after editing.
        analysis_result = client.analyze_text(
            AnalyzeTextOptions(text=input_text, blocklist_names=[blocklist_name], halt_on_blocklist_hit=False)
        )
        if analysis_result and analysis_result.blocklists_match:
            print("\nBlocklist match results: ")
            for match_result in analysis_result.blocklists_match:
                print(
                    f"BlocklistName: {match_result.blocklist_name}, BlockItemId: {match_result.blocklist_item_id}, "
                    f"BlockItemText: {match_result.blocklist_item_text}"
                )
    except HttpResponseError as e:
        print("\nAnalyze text failed: ")
        if e.error:
            print(f"Error code: {e.error.code}")
            print(f"Error message: {e.error.message}")
            raise
        print(e)
        raise

画像を分析する


    import os
    from azure.ai.contentsafety import ContentSafetyClient
    from azure.ai.contentsafety.models import ImageCategory
    from azure.core.credentials import AzureKeyCredential
    from azure.core.exceptions import HttpResponseError
    from azure.ai.contentsafety.models import AnalyzeImageOptions, ImageData

    key = os.environ["CONTENT_SAFETY_KEY"]
    endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]
    image_path = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "./sample_data/image.jpg"))

    # Create a Content Safety client
    client = ContentSafetyClient(endpoint, AzureKeyCredential(key))

    # Build request
    with open(image_path, "rb") as file:
        request = AnalyzeImageOptions(image=ImageData(content=file.read()))

    # Analyze image
    try:
        response = client.analyze_image(request)
    except HttpResponseError as e:
        print("Analyze image failed.")
        if e.error:
            print(f"Error code: {e.error.code}")
            print(f"Error message: {e.error.message}")
            raise
        print(e)
        raise

    hate_result = next(item for item in response.categories_analysis if item.category == ImageCategory.HATE)
    self_harm_result = next(item for item in response.categories_analysis if item.category == ImageCategory.SELF_HARM)
    sexual_result = next(item for item in response.categories_analysis if item.category == ImageCategory.SEXUAL)
    violence_result = next(item for item in response.categories_analysis if item.category == ImageCategory.VIOLENCE)

    if hate_result:
        print(f"Hate severity: {hate_result.severity}")
    if self_harm_result:
        print(f"SelfHarm severity: {self_harm_result.severity}")
    if sexual_result:
        print(f"Sexual severity: {sexual_result.severity}")
    if violence_result:
        print(f"Violence severity: {violence_result.severity}")

テキスト ブロックリストを管理する

テキスト ブロックリストを作成または更新する


    import os
    from azure.ai.contentsafety import BlocklistClient
    from azure.ai.contentsafety.models import TextBlocklist
    from azure.core.credentials import AzureKeyCredential
    from azure.core.exceptions import HttpResponseError

    key = os.environ["CONTENT_SAFETY_KEY"]
    endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]

    # Create a Blocklist client
    client = BlocklistClient(endpoint, AzureKeyCredential(key))

    blocklist_name = "TestBlocklist"
    blocklist_description = "Test blocklist management."

    try:
        blocklist = client.create_or_update_text_blocklist(
            blocklist_name=blocklist_name,
            options=TextBlocklist(blocklist_name=blocklist_name, description=blocklist_description),
        )
        if blocklist:
            print("\nBlocklist created or updated: ")
            print(f"Name: {blocklist.blocklist_name}, Description: {blocklist.description}")
    except HttpResponseError as e:
        print("\nCreate or update text blocklist failed: ")
        if e.error:
            print(f"Error code: {e.error.code}")
            print(f"Error message: {e.error.message}")
            raise
        print(e)
        raise

テキスト ブロックリストを一覧表示する


    import os
    from azure.ai.contentsafety import BlocklistClient
    from azure.core.credentials import AzureKeyCredential
    from azure.core.exceptions import HttpResponseError

    key = os.environ["CONTENT_SAFETY_KEY"]
    endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]

    # Create a Blocklist client
    client = BlocklistClient(endpoint, AzureKeyCredential(key))

    try:
        blocklists = client.list_text_blocklists()
        if blocklists:
            print("\nList blocklists: ")
            for blocklist in blocklists:
                print(f"Name: {blocklist.blocklist_name}, Description: {blocklist.description}")
    except HttpResponseError as e:
        print("\nList text blocklists failed: ")
        if e.error:
            print(f"Error code: {e.error.code}")
            print(f"Error message: {e.error.message}")
            raise
        print(e)
        raise

テキスト ブロックリストを取得する


    import os
    from azure.ai.contentsafety import BlocklistClient
    from azure.core.credentials import AzureKeyCredential
    from azure.core.exceptions import HttpResponseError

    key = os.environ["CONTENT_SAFETY_KEY"]
    endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]

    # Create a Blocklist client
    client = BlocklistClient(endpoint, AzureKeyCredential(key))

    blocklist_name = "TestBlocklist"

    try:
        blocklist = client.get_text_blocklist(blocklist_name=blocklist_name)
        if blocklist:
            print("\nGet blocklist: ")
            print(f"Name: {blocklist.blocklist_name}, Description: {blocklist.description}")
    except HttpResponseError as e:
        print("\nGet text blocklist failed: ")
        if e.error:
            print(f"Error code: {e.error.code}")
            print(f"Error message: {e.error.message}")
            raise
        print(e)
        raise

テキスト ブロックリストを削除する


    import os
    from azure.ai.contentsafety import BlocklistClient
    from azure.core.credentials import AzureKeyCredential
    from azure.core.exceptions import HttpResponseError

    key = os.environ["CONTENT_SAFETY_KEY"]
    endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]

    # Create a Blocklist client
    client = BlocklistClient(endpoint, AzureKeyCredential(key))

    blocklist_name = "TestBlocklist"

    try:
        client.delete_text_blocklist(blocklist_name=blocklist_name)
        print(f"\nDeleted blocklist: {blocklist_name}")
    except HttpResponseError as e:
        print("\nDelete blocklist failed:")
        if e.error:
            print(f"Error code: {e.error.code}")
            print(f"Error message: {e.error.message}")
            raise
        print(e)
        raise

blockItems を追加する


    import os
    from azure.ai.contentsafety import BlocklistClient
    from azure.ai.contentsafety.models import AddOrUpdateTextBlocklistItemsOptions, TextBlocklistItem
    from azure.core.credentials import AzureKeyCredential
    from azure.core.exceptions import HttpResponseError

    key = os.environ["CONTENT_SAFETY_KEY"]
    endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]

    # Create a Blocklist client
    client = BlocklistClient(endpoint, AzureKeyCredential(key))

    blocklist_name = "TestBlocklist"
    block_item_text_1 = "k*ll"
    block_item_text_2 = "h*te"

    block_items = [TextBlocklistItem(text=block_item_text_1), TextBlocklistItem(text=block_item_text_2)]
    try:
        result = client.add_or_update_blocklist_items(
            blocklist_name=blocklist_name, options=AddOrUpdateTextBlocklistItemsOptions(blocklist_items=block_items)
        )
        for block_item in result.blocklist_items:
            print(
                f"BlockItemId: {block_item.blocklist_item_id}, Text: {block_item.text}, Description: {block_item.description}"
            )
    except HttpResponseError as e:
        print("\nAdd block items failed: ")
        if e.error:
            print(f"Error code: {e.error.code}")
            print(f"Error message: {e.error.message}")
            raise
        print(e)
        raise

blockItems を一覧表示する


    import os
    from azure.ai.contentsafety import BlocklistClient
    from azure.core.credentials import AzureKeyCredential
    from azure.core.exceptions import HttpResponseError

    key = os.environ["CONTENT_SAFETY_KEY"]
    endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]

    # Create a Blocklist client
    client = BlocklistClient(endpoint, AzureKeyCredential(key))

    blocklist_name = "TestBlocklist"

    try:
        block_items = client.list_text_blocklist_items(blocklist_name=blocklist_name)
        if block_items:
            print("\nList block items: ")
            for block_item in block_items:
                print(
                    f"BlockItemId: {block_item.blocklist_item_id}, Text: {block_item.text}, "
                    f"Description: {block_item.description}"
                )
    except HttpResponseError as e:
        print("\nList block items failed: ")
        if e.error:
            print(f"Error code: {e.error.code}")
            print(f"Error message: {e.error.message}")
            raise
        print(e)
        raise

get blockItem


    import os
    from azure.ai.contentsafety import BlocklistClient
    from azure.core.credentials import AzureKeyCredential
    from azure.ai.contentsafety.models import TextBlocklistItem, AddOrUpdateTextBlocklistItemsOptions
    from azure.core.exceptions import HttpResponseError

    key = os.environ["CONTENT_SAFETY_KEY"]
    endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]

    # Create a Blocklist client
    client = BlocklistClient(endpoint, AzureKeyCredential(key))

    blocklist_name = "TestBlocklist"
    block_item_text_1 = "k*ll"

    try:
        # Add a blockItem
        add_result = client.add_or_update_blocklist_items(
            blocklist_name=blocklist_name,
            options=AddOrUpdateTextBlocklistItemsOptions(blocklist_items=[TextBlocklistItem(text=block_item_text_1)]),
        )
        if not add_result or not add_result.blocklist_items or len(add_result.blocklist_items) <= 0:
            raise RuntimeError("BlockItem not created.")
        block_item_id = add_result.blocklist_items[0].blocklist_item_id

        # Get this blockItem by blockItemId
        block_item = client.get_text_blocklist_item(blocklist_name=blocklist_name, blocklist_item_id=block_item_id)
        print("\nGet blockitem: ")
        print(
            f"BlockItemId: {block_item.blocklist_item_id}, Text: {block_item.text}, Description: {block_item.description}"
        )
    except HttpResponseError as e:
        print("\nGet block item failed: ")
        if e.error:
            print(f"Error code: {e.error.code}")
            print(f"Error message: {e.error.message}")
            raise
        print(e)
        raise

blockItems を削除する


    import os
    from azure.ai.contentsafety import BlocklistClient
    from azure.core.credentials import AzureKeyCredential
    from azure.ai.contentsafety.models import (
        TextBlocklistItem,
        AddOrUpdateTextBlocklistItemsOptions,
        RemoveTextBlocklistItemsOptions,
    )
    from azure.core.exceptions import HttpResponseError

    key = os.environ["CONTENT_SAFETY_KEY"]
    endpoint = os.environ["CONTENT_SAFETY_ENDPOINT"]

    # Create a Blocklist client
    client = BlocklistClient(endpoint, AzureKeyCredential(key))

    blocklist_name = "TestBlocklist"
    block_item_text_1 = "k*ll"

    try:
        # Add a blockItem
        add_result = client.add_or_update_blocklist_items(
            blocklist_name=blocklist_name,
            options=AddOrUpdateTextBlocklistItemsOptions(blocklist_items=[TextBlocklistItem(text=block_item_text_1)]),
        )
        if not add_result or not add_result.blocklist_items or len(add_result.blocklist_items) <= 0:
            raise RuntimeError("BlockItem not created.")
        block_item_id = add_result.blocklist_items[0].blocklist_item_id

        # Remove this blockItem by blockItemId
        client.remove_blocklist_items(
            blocklist_name=blocklist_name, options=RemoveTextBlocklistItemsOptions(blocklist_item_ids=[block_item_id])
        )
        print(f"\nRemoved blockItem: {add_result.blocklist_items[0].blocklist_item_id}")
    except HttpResponseError as e:
        print("\nRemove block item failed: ")
        if e.error:
            print(f"Error code: {e.error.code}")
            print(f"Error message: {e.error.message}")
            raise
        print(e)
        raise

トラブルシューティング

全般

クライアント ライブラリAzure AI Content Safety、Azure Core で定義されている例外が発生します。 エラー コードは次のように定義されます。

エラー コード 考えられる原因 推奨事項
InvalidRequestBody 要求本文の 1 つ以上のフィールドが API 定義と一致しません。 1. API 呼び出しで指定した API バージョンを確認します。
2. 選択した API バージョンに対応する API 定義を確認します。
InvalidResourceName URL で指定したリソース名が、ブロックリスト名、ブロックリスト用語 ID などの要件を満たしていません。 1. API 呼び出しで指定した API バージョンを確認します。
2. API 定義に従って、指定された名前に無効な文字があるかどうかを確認します。
ResourceNotFound URL で指定したリソース (ブロックリスト名など) が、存在しない可能性があります。 1. API 呼び出しで指定した API バージョンを確認します。
2. URL に指定したリソースの存在をダブルチェックします。
InternalError サーバー側で予期しない状況がいくつかトリガーされました。 1. しばらくしてから数回再試行し、問題が再度発生するかどうかを確認します。
2. この問題が解決しない場合は、Azure サポートにお問い合わせください。
ServerBusy サーバー側で要求を一時的に処理できません。 1. しばらくしてから数回再試行し、問題が再度発生するかどうかを確認します。
2. この問題が解決しない場合は、Azure サポートにお問い合わせください。
TooManyRequests 現在の RPS が現在の SKU のクォータを超えました。 1. 価格テーブルを確認して、RPS クォータを把握します。
2. QPS の追加が必要な場合は、Azure サポートにお問い合わせください。

ログの記録

このライブラリでは、ログ記録に標準 のログ ライブラリが使用されます。

HTTP セッション (URL、ヘッダーなど) に関する基本情報は、レベルで INFO ログに記録されます。

要求/応答本文や未処理ヘッダーなど、詳細なDEBUGレベルのログ記録は、クライアントで有効にすることも、キーワード (keyword)引数を使用してlogging_enable操作ごとに有効にすることもできます。

SDK ログに関する完全なドキュメントと例 については、こちらを参照してください

オプションの構成

省略可能なキーワード (keyword)引数は、クライアントと操作ごとのレベルで渡すことができます。 azure-core リファレンス ドキュメント では、再試行、ログ記録、トランスポート プロトコルなどの使用可能な構成について説明しています。

次の手順

その他のドキュメント

Azure Content Safety の詳細なドキュメントについては、docs.microsoft.com に関するAzure AI Content Safetyを参照してください。

共同作成

このプロジェクトでは、共同作成と提案を歓迎しています。 ほとんどの共同作成では、共同作成者使用許諾契約書 (CLA) にご同意いただき、ご自身の共同作成内容を使用する権利を Microsoft に供与する権利をお持ちであり、かつ実際に供与することを宣言していただく必要があります。 詳細については、 https://cla.microsoft.com を参照してください。

pull request を送信すると、CLA を提供して PR (ラベル、コメントなど) を適宜装飾する必要があるかどうかを CLA ボットが自動的に決定します。 ボットによって提供される手順にそのまま従ってください。 この操作は、Microsoft の CLA を使用するすべてのリポジトリについて、1 回だけ行う必要があります。

このプロジェクトでは、Microsoft オープン ソースの倫理規定を採用しています。 詳細については、「倫理規定の FAQ」をご覧ください。追加の質問やコメントがある場合は opencode@microsoft.com にお問い合わせください。