azure-ai-contentsafety-py
microsoft/skills
Detecte conteúdos prejudiciais gerados por usuários e por IA, tanto em texto quanto em imagens, usando o SDK do Azure AI Content Safety para Python.
...Expandir tudoSDK do Azure AI para Segurança de Conteúdo em Python
Detecte conteúdo prejudicial gerado por usuários e pela IA em aplicativos.
Instalação
pip install azure-ai-contentsafety
Variáveis de ambiente
CONTENT_SAFETY_ENDPOINT=https://.cognitiveservices.azure.com # Obrigatório para todos os métodos de autenticação
AZURE_TOKEN_CREDENTIALS=prod # Necessário apenas se DefaultAzureCredential for usado em produção
CONTENT_SAFETY_KEY= # Necessário apenas para o caminho de autenticação por chave de API legada abaixo
Autenticação e ciclo de vida
🔑 Duas regras se aplicam a todos os exemplos de código abaixo:
- Dê preferência
ao DefaultAzureCredential. Ele funciona localmente (Azure CLI / VS Code / Developer CLI) e no Azure (identidade gerenciada, identidade de carga de trabalho) sem alteração no código. Evite strings de conexão, contas e chaves de API — elas contornam a auditoria e a rotação do Entra.
- Desenvolvimento local:
o DefaultAzureCredentialfunciona como está.- Produção: defina
AZURE_TOKEN_CREDENTIALS=prod(ouAZURE_TOKEN_CREDENTIALS=) para restringir a cadeia de credenciais a credenciais seguras para produção.- Envolva cada cliente em um gerenciador de contexto para que transportes HTTP, sockets e caches de tokens sejam liberados de forma determinística:
- Sincrônica:
com(...) como cliente: - Assíncrono:
async come(...) como cliente: async com DefaultAzureCredential() como credencial:(deazure.identity.aio)Os trechos de código podem abreviar essa configuração, mas o código de produção deve sempre seguir ambas as regras.
import os
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
from azure.ai.contentsafety import ContentSafetyClient
from azure.ai.contentsafety.models import AnalyzeTextOptions
# Desenvolvimento local: DefaultAzureCredential. Produção: defina AZURE_TOKEN_CREDENTIALS=prod ou AZURE_TOKEN_CREDENTIALS=
credential = DefaultAzureCredential(require_envvar=True)
# Ou use uma credencial específica diretamente em produção:
# Consulte https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()
with ContentSafetyClient(
endpoint=os.environ["CONTENT_SAFETY_ENDPOINT"],
credential=credential,
) as client:
response = client.analyze_text(AnalyzeTextOptions(text="Hello, world!"))
Legado: Chave de API (implantações existentes com chave)
O código novo deve usar o `DefaultAzureCredential` acima. Use `AzureKeyCredential` somente se você tiver uma implantação com chave existente que ainda não tenha sido migrada para o Entra ID — por exemplo, ambientes regulamentados que ainda estejam concluindo sua implantação do Entra.
import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.contentsafety import ContentSafetyClient
from azure.ai.contentsafety.models import AnalyzeTextOptions
with ContentSafetyClient(
endpoint=os.environ["CONTENT_SAFETY_ENDPOINT"],
credential=AzureKeyCredential(os.environ["CONTENT_SAFETY_KEY"]),
) as client:
response = client.analyze_text(AnalyzeTextOptions(text="Olá, mundo!"))
O BlocklistClient aceita a mesma AzureKeyCredential caso você também precise gerenciar listas de bloqueio com uma chave.
Analisar texto
from azure.ai.contentsafety import ContentSafetyClient
from azure.ai.contentsafety.models import AnalyzeTextOptions, TextCategory
from azure.identity import DefaultAzureCredential
com ContentSafetyClient(endpoint, DefaultAzureCredential()) como client:
request = AnalyzeTextOptions(text="Seu conteúdo de texto a ser analisado")
response = client.analyze_text(request)
# Verificar cada categoria
for category in [TextCategory.HATE, TextCategory.SELF_HARM,
TextCategory.SEXUAL, TextCategory.VIOLENCE]:
result = next((r for r in response.categories_analysis
if r.category == category), None)
if result:
print(f"{category}: gravidade {result.severity}")
Analisar imagem
from azure.ai.contentsafety import ContentSafetyClient
from azure.ai.contentsafety.models import AnalyzeImageOptions, ImageData
from azure.identity import DefaultAzureCredential
import base64
with ContentSafetyClient(endpoint, DefaultAzureCredential()) as client:
# A partir de um arquivo
with open("image.jpg", "rb") as f:
image_data = base64.b64encode(f.read()).decode("utf-8")
request = AnalyzeImageOptions(
image=ImageData(content=image_data)
)
response = client.analyze_image(request)
for result in response.categories_analysis:
print(f"{result.category}: gravidade {result.severity}")
Imagem a partir de URL
from azure.ai.contentsafety.models import AnalyzeImageOptions, ImageData
request = AnalyzeImageOptions(
image=ImageData(blob_url="https://example.com/image.jpg")
)
response = client.analyze_image(request)
Gerenciamento da lista de bloqueio de textos
Criação de lista de bloqueio
from azure.ai.contentsafety import BlocklistClient
from azure.ai.contentsafety.models import TextBlocklist
from azure.identity import DefaultAzureCredential
with BlocklistClient(endpoint, DefaultAzureCredential()) as blocklist_client:
lista_de_bloqueio = TextBlocklist(
nome_da_lista_de_bloqueio="minha-lista-de-bloqueio",
descrição="Termos personalizados a serem bloqueados"
)
result = blocklist_client.create_or_update_text_blocklist(
blocklist_name="my-blocklist",
options=blocklist
)
Adicionar itens à lista de bloqueio
from azure.ai.contentsafety.models import AddOrUpdateTextBlocklistItemsOptions, TextBlocklistItem
itens = AddOrUpdateTextBlocklistItemsOptions(
itensDaListaDeBloqueio=[
TextBlocklistItem(texto="termo-bloqueado-1"),
TextBlocklistItem(texto="termo-bloqueado-2")
]
)
result = blocklist_client.add_or_update_blocklist_items(
blocklist_name="my-blocklist",
options=items
)
Analisar com a lista de bloqueios
from azure.ai.contentsafety.models import AnalyzeTextOptions
solicitação = AnalyzeTextOptions(
texto="Texto contendo termo-bloqueado-1",
nomes_da_lista_de_bloqueio=["minha-lista-de-bloqueio"],
interromper_ao_encontrar_na_lista_de_bloqueio=True
)
response = client.analyze_text(request)
if response.blocklists_match:
for match in response.blocklists_match:
print(f"Bloqueado: {match.blocklist_item_text}")
Níveis de gravidade
A análise de texto retorna 4 níveis de gravidade (0, 2, 4, 6) por padrão. Para 8 níveis (0 a 7):
from azure.ai.contentsafety.models import AnalyzeTextOptions, AnalyzeTextOutputType
request = AnalyzeTextOptions(
text="Seu texto",
output_type=AnalyzeTextOutputType.EIGHT_SEVERITY_LEVELS
)
Categorias de dano
| Categoria | Descrição |
|---|---|
Ódio |
Ataques baseados na identidade (raça, religião, gênero etc.) |
Sexual |
Conteúdo sexual, relacionamentos, anatomia |
Violência |
Danos físicos, armas, ferimentos |
Autolesão |
Autolesão, suicídio, distúrbios alimentares |
Escala de gravidade
| Nível | Intervalo de texto | Intervalo de imagens | Significado |
|---|---|---|---|
| 0 | Seguro | Seguro | Sem conteúdo prejudicial |
| 2 | Baixo | Baixo | Referências moderadas |
| 4 | Médio | Médio | Conteúdo moderado |
| 6 | Alto | Alto | Conteúdo grave |
Tipos de clientes
| Cliente | Finalidade |
|---|---|
ConteúdoSegurançaCliente |
Analisar textos e imagens |
Cliente de lista de bloqueio |
Gerenciar listas de bloqueio personalizadas |
Práticas recomendadas
- Escolha entre síncrono OU assíncrono e mantenha a consistência. Não misture clientes síncronos
do azure.ai.contentsafetycom clientes assíncronosdo azure.ai.contentsafety.aiono mesmo caminho de chamada. Escolha um modo por módulo. - Sempre use gerenciadores de contexto para clientes e credenciais assíncronas. Envolva cada cliente
com ContentSafetyClient(...) como cliente:(sincrônico) ouassíncrono com ContentSafetyClient(...) como cliente:(assíncrono). Parao DefaultAzureCredentialassíncrono doazure.identity.aio, use também“async” com “credential:”para que os tokens e transportes sejam liberados. - Use listas de bloqueio para termos específicos de domínio
- Defina limites de gravidade adequados ao seu caso de uso
- Lide com várias categorias — o conteúdo pode ser prejudicial de várias maneiras
- Use `halt_on_blocklist_hit ` para rejeição imediata
- Registre os resultados da análise para fins de auditoria e melhoria
- Considere o modo de 8 níveis de gravidade para um controle mais refinado
- Faça a pré-moderação dos resultados da IA antes de exibi-los aos usuários
---
name: azure-ai-contentsafety-py
description: Detect harmful user-generated and AI-generated content in text and images using Azure AI Content Safety SDK for Python.
license: MIT
---
# Azure AI Content Safety SDK for Python
Detect harmful user-generated and AI-generated content in applications.
## Installation
```bash
pip install azure-ai-contentsafety
```
## Environment Variables
```bash
CONTENT_SAFETY_ENDPOINT=https://<resource>.cognitiveservices.azure.com # Required for all auth methods
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
CONTENT_SAFETY_KEY=<your-api-key> # Only required for the legacy API-key auth path below
```
## Authentication & Lifecycle
> **🔑 Two rules apply to every code sample below:**
>
> 1. **Prefer `DefaultAzureCredential`.** It works locally (Azure CLI / VS Code / Developer CLI) and in Azure (managed identity, workload identity) with no code change. Avoid connection strings, account/API keys — they bypass Entra audit and rotation.
> - Local dev: `DefaultAzureCredential` works as-is.
> - Production: set `AZURE_TOKEN_CREDENTIALS=prod` (or `AZURE_TOKEN_CREDENTIALS=<specific_credential>`) to constrain the credential chain to production-safe credentials.
> 2. **Wrap every client in a context manager** so HTTP transports, sockets, and token caches are released deterministically:
> - Sync: `with <Client>(...) as client:`
> - Async: `async with <Client>(...) as client:` **and** `async with DefaultAzureCredential() as credential:` (from `azure.identity.aio`)
>
> Snippets may abbreviate this setup, but production code should always follow both rules.
```python
import os
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
from azure.ai.contentsafety import ContentSafetyClient
from azure.ai.contentsafety.models import AnalyzeTextOptions
# Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
credential = DefaultAzureCredential(require_envvar=True)
# Or use a specific credential directly in production:
# See https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()
with ContentSafetyClient(
endpoint=os.environ["CONTENT_SAFETY_ENDPOINT"],
credential=credential,
) as client:
response = client.analyze_text(AnalyzeTextOptions(text="Hello, world!"))
```
### Legacy: API Key (existing keyed deployments)
New code should use `DefaultAzureCredential` above. Use `AzureKeyCredential` only if you have an existing keyed deployment that hasn't been migrated to Entra ID yet — for example, regulated environments still completing their Entra rollout.
```python
import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.contentsafety import ContentSafetyClient
from azure.ai.contentsafety.models import AnalyzeTextOptions
with ContentSafetyClient(
endpoint=os.environ["CONTENT_SAFETY_ENDPOINT"],
credential=AzureKeyCredential(os.environ["CONTENT_SAFETY_KEY"]),
) as client:
response = client.analyze_text(AnalyzeTextOptions(text="Hello, world!"))
```
The `BlocklistClient` accepts the same `AzureKeyCredential` if you also need to manage blocklists with a key.
## Analyze Text
```python
from azure.ai.contentsafety import ContentSafetyClient
from azure.ai.contentsafety.models import AnalyzeTextOptions, TextCategory
from azure.identity import DefaultAzureCredential
with ContentSafetyClient(endpoint, DefaultAzureCredential()) as client:
request = AnalyzeTextOptions(text="Your text content to analyze")
response = client.analyze_text(request)
# Check each category
for category in [TextCategory.HATE, TextCategory.SELF_HARM,
TextCategory.SEXUAL, TextCategory.VIOLENCE]:
result = next((r for r in response.categories_analysis
if r.category == category), None)
if result:
print(f"{category}: severity {result.severity}")
```
## Analyze Image
```python
from azure.ai.contentsafety import ContentSafetyClient
from azure.ai.contentsafety.models import AnalyzeImageOptions, ImageData
from azure.identity import DefaultAzureCredential
import base64
with ContentSafetyClient(endpoint, DefaultAzureCredential()) as client:
# From file
with open("image.jpg", "rb") as f:
image_data = base64.b64encode(f.read()).decode("utf-8")
request = AnalyzeImageOptions(
image=ImageData(content=image_data)
)
response = client.analyze_image(request)
for result in response.categories_analysis:
print(f"{result.category}: severity {result.severity}")
```
### Image from URL
```python
from azure.ai.contentsafety.models import AnalyzeImageOptions, ImageData
request = AnalyzeImageOptions(
image=ImageData(blob_url="https://example.com/image.jpg")
)
response = client.analyze_image(request)
```
## Text Blocklist Management
### Create Blocklist
```python
from azure.ai.contentsafety import BlocklistClient
from azure.ai.contentsafety.models import TextBlocklist
from azure.identity import DefaultAzureCredential
with BlocklistClient(endpoint, DefaultAzureCredential()) as blocklist_client:
blocklist = TextBlocklist(
blocklist_name="my-blocklist",
description="Custom terms to block"
)
result = blocklist_client.create_or_update_text_blocklist(
blocklist_name="my-blocklist",
options=blocklist
)
```
### Add Block Items
```python
from azure.ai.contentsafety.models import AddOrUpdateTextBlocklistItemsOptions, TextBlocklistItem
items = AddOrUpdateTextBlocklistItemsOptions(
blocklist_items=[
TextBlocklistItem(text="blocked-term-1"),
TextBlocklistItem(text="blocked-term-2")
]
)
result = blocklist_client.add_or_update_blocklist_items(
blocklist_name="my-blocklist",
options=items
)
```
### Analyze with Blocklist
```python
from azure.ai.contentsafety.models import AnalyzeTextOptions
request = AnalyzeTextOptions(
text="Text containing blocked-term-1",
blocklist_names=["my-blocklist"],
halt_on_blocklist_hit=True
)
response = client.analyze_text(request)
if response.blocklists_match:
for match in response.blocklists_match:
print(f"Blocked: {match.blocklist_item_text}")
```
## Severity Levels
Text analysis returns 4 severity levels (0, 2, 4, 6) by default. For 8 levels (0-7):
```python
from azure.ai.contentsafety.models import AnalyzeTextOptions, AnalyzeTextOutputType
request = AnalyzeTextOptions(
text="Your text",
output_type=AnalyzeTextOutputType.EIGHT_SEVERITY_LEVELS
)
```
## Harm Categories
| Category | Description |
|----------|-------------|
| `Hate` | Attacks based on identity (race, religion, gender, etc.) |
| `Sexual` | Sexual content, relationships, anatomy |
| `Violence` | Physical harm, weapons, injury |
| `SelfHarm` | Self-injury, suicide, eating disorders |
## Severity Scale
| Level | Text Range | Image Range | Meaning |
|-------|------------|-------------|---------|
| 0 | Safe | Safe | No harmful content |
| 2 | Low | Low | Mild references |
| 4 | Medium | Medium | Moderate content |
| 6 | High | High | Severe content |
## Client Types
| Client | Purpose |
|--------|---------|
| `ContentSafetyClient` | Analyze text and images |
| `BlocklistClient` | Manage custom blocklists |
## Best Practices
1. **Pick sync OR async and stay consistent.** Do not mix `azure.ai.contentsafety` sync clients with `azure.ai.contentsafety.aio` async clients in the same call path. Choose one mode per module.
2. **Always use context managers for clients and async credentials.** Wrap every client in `with ContentSafetyClient(...) as client:` (sync) or `async with ContentSafetyClient(...) as client:` (async). For async `DefaultAzureCredential` from `azure.identity.aio`, also use `async with credential:` so tokens and transports are cleaned up.
3. **Use blocklists** for domain-specific terms
4. **Set severity thresholds** appropriate for your use case
5. **Handle multiple categories** — content can be harmful in multiple ways
6. **Use halt_on_blocklist_hit** for immediate rejection
7. **Log analysis results** for audit and improvement
8. **Consider 8-severity mode** for finer-grained control
9. **Pre-moderate AI outputs** before showing to users
Todos os arquivos
0 arquivosInstalar azure-ai-contentsafety-py
Baixe e descompacte os arquivos de habilidades no diretório .claude/skills/.
Baixar ZIPClone o repositório e copie os arquivos da habilidade para o seu projeto.
git clone https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-python/skills/azure-ai-contentsafety-py # Copy SKILL.md to your .claude/skills/ directory
Copiar





Lar
