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
- Se requiere Python 3.7 o posterior para usar este paquete.
- Necesita una suscripción de Azure para usar este paquete.
- Un recurso Seguridad del contenido de Azure AI, si no hay ningún recurso existente, puede crear uno nuevo.
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.
Azure SDK for Python