Compartir a través de


Seguridad del contenido de Azure AI biblioteca cliente para Python: versión 1.0.0

Seguridad del contenido de Azure AI detecta contenido generado por el usuario y generado por ia perjudicial en aplicaciones y servicios. La seguridad del contenido incluye API de texto e imagen que le permiten detectar material perjudicial:

  • Text Analysis API: examina el texto del contenido sexual, la violencia, el odio y el daño personal con niveles de gravedad múltiple.
  • Image Analysis API: examina imágenes de contenido sexual, violencia, odio y autolesión con niveles de gravedad múltiple.
  • API de administración de listas de bloques de texto: los clasificadores de IA predeterminados son suficientes para la mayoría de las necesidades de seguridad de contenido; Sin embargo, es posible que tenga que pantallar los términos específicos de su caso de uso. Puede crear listas de bloqueados de términos que se usarán con Text API.

Documentación

Hay varias documentación disponibles para ayudarle a empezar

Introducción

Requisitos previos

Instalar el paquete

pip install azure-ai-contentsafety

Autenticar el cliente

Obtención del punto de conexión

Puede encontrar el punto de conexión del recurso de servicio de Seguridad del contenido de Azure AI mediante Azure Portal o la CLI de Azure:

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

Creación de un elemento ContentSafetyClient/BlocklistClient con clave de API

Para usar una clave de API como credential parámetro.

  • Paso 1: Obtención de la clave de API. La clave de API se puede encontrar en Azure Portal o mediante la ejecución del siguiente comando de la CLI de Azure :

    az cognitiveservices account keys list --name "<resource-name>" --resource-group "<resource-group-name>"
    
  • Paso 2: Pase la clave como una cadena a una instancia de 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)
    

Creación de una instancia de ContentSafetyClient/BlocklistClient con credenciales de token de identificador de Microsoft Entra

  • Paso 1: Habilite el identificador de Microsoft Entra para el recurso. Consulte este documento Autenticar con Microsoft Entra id. para conocer los pasos para habilitar Microsoft Entra id. para el recurso.

    Los pasos principales son:

    • Cree un recurso con un subdominio personalizado.
    • Cree una entidad de servicio y asígnele el rol de usuario de Cognitive Services.
  • Paso 2: Establezca los valores del identificador de cliente, el identificador de inquilino y el secreto de cliente de la aplicación de Microsoft Entra como variables de entorno: AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET.

    DefaultAzureCredential usará los valores de estas variables de entorno.

    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)
    

Conceptos clave

Características disponibles

Este servicio dispone de diferentes tipos de análisis. En la tabla siguiente se describen las API que están disponibles en la actualidad.

Característica Descripción
Text Analysis API Examina el texto del contenido sexual, la violencia, el odio y el autolesión con niveles de gravedad múltiple.
API de Análisis de imágenes Examina imágenes de contenido sexual, violencia, odio y autolesión con niveles de gravedad múltiple.
API de administración de listas de bloques de texto Los clasificadores de IA predeterminados son suficientes para la mayoría de las necesidades de seguridad de contenido. Sin embargo, es posible que tenga que pantallar los términos específicos de su caso de uso. Puede crear listas de bloqueados de términos que se usarán con Text API.

Categorías de daños

Content Safety reconoce cuatro categorías distintas de contenido censurable.

Category Descripción
Odio Los daños relacionados con el odio y la equidad hacen referencia a cualquier contenido que ataque o use lenguaje pejorante o discriminatorio con referencia a una persona o grupo de identidad basado en ciertos atributos diferenciadores de estos grupos, incluidos, entre otros, la raza, la nacionalidad, la identidad y la expresión de género, la orientación sexual, la religión, el estado de inmigración, el estado de la capacidad, la apariencia personal y el tamaño del cuerpo.
Sexual El lenguaje sexual describe el lenguaje relacionado con los órganos anatómicos y los genitales, las relaciones románticas, los actos interpretados en términos eróticos o cariñosos, el embarazo, los actos sexuales físicos, incluidos los que se representan como una agresión o un acto sexual forzado contra la voluntad de uno, la prostitución, la pornografía y el abuso.
Violencia La violencia describe el lenguaje relacionado con las acciones físicas destinadas a herir, lesionar, dañar o matar a alguien o algo; describe armas, armas y entidades relacionadas, como fabricantes, asociaciones, legislación, etc.
Autolesiones El autolesión describe el lenguaje relacionado con las acciones físicas destinadas a hacer daño, lesiones, dañar el cuerpo de uno o matarse a sí mismo.

La clasificación puede tener varias etiquetas. Por ejemplo, cuando una muestra de texto pasa a través del modelo de moderación de textos, podría clasificarse como contenido sexual y violencia.

Niveles de gravedad

Cada categoría de daño que el servicio aplica también incluye una clasificación de nivel de gravedad. El nivel de gravedad está pensado para indicar la gravedad de las consecuencias de mostrar el contenido marcado.

Texto: la versión actual del modelo de texto admite la escala de gravedad completa de 0 a 7. De forma predeterminada, la respuesta generará 4 valores: 0, 2, 4 y 6. Cada dos niveles adyacentes se asignan a un único nivel. Los usuarios podrían usar "outputType" en la solicitud y establecerlo como "EightSeverityLevels" para obtener 8 valores en la salida: 0,1,2,3,4,5,6,7. Puede hacer referencia a definiciones de niveles de gravedad de contenido de texto para obtener más información.

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

Imagen: la versión actual del modelo de imagen admite la versión recortada de la escala de gravedad completa de 0 a 7. El clasificador solo devuelve severidades 0, 2, 4 y 6; cada dos niveles adyacentes se asignan a un único nivel. Puede consultar las definiciones de niveles de gravedad del contenido de la imagen para obtener más información.

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

Administración de listas de texto en bloques

Se admiten las siguientes operaciones para administrar la lista de bloqueos de texto:

  • Crear o modificar una lista de bloqueados
  • Enumerar todas las listas de bloqueados
  • Obtener una lista de bloqueados por blocklistName
  • Agregar blocklistItems a una lista de bloques
  • Eliminación de blocklistItems de una lista de bloqueados
  • Enumerar todos los objetos blocklistItems en una lista de bloques por blocklistName
  • Obtener un objeto blocklistItem en una lista de bloques por blocklistItemId y blocklistName
  • Eliminar una lista de bloques y todos sus blocklistItems

Puede establecer las listas de bloques que desea usar al analizar texto y, a continuación, obtener el resultado de la coincidencia de la lista de bloques de la respuesta devuelta.

Ejemplos

En la sección siguiente se proporcionan varios fragmentos de código que abarcan algunas de las tareas más comunes del servicio de seguridad de contenido, entre las que se incluyen:

Consulte los datos de ejemplo para los datos que se usan aquí. Para obtener más ejemplos, consulte ejemplos.

Análisis de texto

Análisis de texto sin listas de bloques


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

Análisis de texto con listas de bloques


    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

Analyze Image


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

Administrar lista de bloqueos de texto

Crear o actualizar la lista de bloques de texto


    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

Enumerar listas de texto bloqueados


    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

Obtener lista de bloques de texto


    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

Eliminar lista de bloques de texto


    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

Agregar 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

Enumerar 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

Obtener 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

Quitar 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

Solución de problemas

General

Seguridad del contenido de Azure AI biblioteca cliente generará excepciones definidas en Azure Core. Los códigos de error se definen como se indica a continuación:

Código de error Razones posibles Sugerencias
InvalidRequestBody Uno o varios campos del cuerpo de la solicitud no coinciden con la definición de la API. 1. Compruebe la versión de la API que especificó en la llamada API.
2. Compruebe la definición de la API correspondiente para la versión de la API seleccionada.
InvalidResourceName El nombre de recurso especificado en la dirección URL no cumple los requisitos, como el nombre de la lista de bloqueados, el identificador de término de la lista de bloqueados, etc. 1. Compruebe la versión de la API que especificó en la llamada API.
2. Compruebe si el nombre especificado tiene caracteres no válidos según la definición de la API.
ResourceNotFound Es posible que el recurso especificado en la dirección URL no exista, como el nombre de la lista de bloqueados. 1. Compruebe la versión de la API que especificó en la llamada API.
2. Compruebe la existencia del recurso especificado en la dirección URL.
InternalError Se han activado algunas situaciones inesperadas en el lado servidor. 1. Es posible que quiera reintentar varias veces después de un breve período de tiempo y ver si el problema se produce de nuevo.
2. Póngase en contacto con el Soporte técnico de Azure si este problema persiste.
ServerBusy El lado servidor no puede procesar temporalmente la solicitud. 1. Es posible que quiera reintentar varias veces después de un breve período de tiempo y ver si el problema se produce de nuevo.
2. Póngase en contacto con el Soporte técnico de Azure si este problema persiste.
TooManyRequests El número de RPS ha superado la cuota de la SKU actual. 1. Compruebe la tabla de precios para comprender la cuota de RPS.
2. Póngase en contacto con el Soporte técnico de Azure si necesita más QPS.

Registro

Esta biblioteca usa la biblioteca de registro estándar para el registro.

La información básica sobre las sesiones HTTP (direcciones URL, encabezados, etc.) se registra en el INFO nivel.

El registro de nivel detallado DEBUG , incluidos los cuerpos de solicitud/respuesta y los encabezados no aprobados , se puede habilitar en el cliente o por operación con el argumento de palabra logging_enable clave.

Consulte la documentación completa del registro del SDK con ejemplos aquí.

Configuración opcional

Los argumentos de palabra clave opcionales se pueden pasar en el nivel de cliente y por operación. En la documentación de referencia de azure-core se describen las configuraciones disponibles para reintentos, registro, protocolos de transporte, etc.

Pasos siguientes

Documentación adicional

Para más información sobre la seguridad de contenido de Azure, consulte la Seguridad del contenido de Azure AI en docs.microsoft.com.

Contribuciones

Este proyecto agradece las contribuciones y sugerencias. La mayoría de las contribuciones requieren que acepte un Contrato de licencia para el colaborador (CLA) que declara que tiene el derecho a concedernos y nos concede los derechos para usar su contribución. Para más detalles, visite https://cla.microsoft.com.

Cuando se envía una solicitud de incorporación de cambios, un bot de CLA determinará de forma automática si tiene que aportar un CLA y completar la PR adecuadamente (por ejemplo, la etiqueta, el comentario). Solo siga las instrucciones que le dará el bot. Solo será necesario que lo haga una vez en todos los repositorios con nuestro CLA.

Este proyecto ha adoptado el Código de conducta de Microsoft Open Source. Para obtener más información, vea las preguntas más frecuentes sobre el código de conducta o póngase en contacto con opencode@microsoft.com si tiene preguntas o comentarios.