Skip to main content
skill

azure-ai-contentsafety-py — Claude Code skill: analyze and install

This skill guides Python projects through Azure AI Content Safety for checking text and images. Use it when an app needs harmful-content moderation.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add microsoft/skills --skill azure-ai-contentsafety-py -a claude-code
Open on GitHub

What azure-ai-contentsafety-py does

The skill covers Azure AI Content Safety SDK for Python. With ContentSafetyClient, an application can send text or image data for analysis and inspect returned harm categories with severity values. Image input can come from a local file encoded as Base64 or from a URL.

The included patterns use DefaultAzureCredential, analyze_text, and analyze_image. They also show BlocklistClient for creating a text blocklist, adding terms, and testing matches during analysis. The text examples use HATE, SELF_HARM, SEXUAL, and VIOLENCE categories, with default severity values 0, 2, 4, and 6.

Install azure-ai-contentsafety before using the examples and set CONTENT_SAFETY_ENDPOINT. The legacy key path requires CONTENT_SAFETY_KEY; production use of DefaultAzureCredential sets AZURE_TOKEN_CREDENTIALS=prod. Without CONTENT_SAFETY_ENDPOINT, the client cannot be created.

What it helps with

  • screen user text for harmful content
  • inspect images from a file or URL
  • report severity for selected harm categories
  • create a list of terms to block
  • halt analysis when a blocklist match appears

Example prompts for the agent

  • Set up Azure AI Content Safety for this Python project and add text analysis with ContentSafetyClient.
  • Show how to analyze image.jpg and print each returned category with its severity.
  • Configure BlocklistClient for my-blocklist, then test text with halt_on_blocklist_hit=True.

How to install azure-ai-contentsafety-py

1Skills CLI (Vercel)

npx skills add microsoft/skills --skill azure-ai-contentsafety-py -a claude-code

2Manually: put the files in place

~/.claude/skills/azure-ai-contentsafety-py/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/azure-ai-contentsafety-py/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about azure-ai-contentsafety-py

How do I install azure-ai-contentsafety-py in Claude Code?

Run npx skills add microsoft/skills --skill azure-ai-contentsafety-py -a claude-code, then use ~/.claude/skills/azure-ai-contentsafety-py/SKILL.md.

What does azure-ai-contentsafety-py do?

It helps use the Azure AI Content Safety SDK for Python to inspect text and images, read severity results, and manage text blocklists.

What is required for Azure AI Content Safety authentication?

The preferred path uses DefaultAzureCredential with CONTENT_SAFETY_ENDPOINT; production setups also set AZURE_TOKEN_CREDENTIALS=prod. Existing keyed deployments can use CONTENT_SAFETY_KEY with AzureKeyCredential.

Source text

SKILL.md · MIT
---
name: azure-ai-contentsafety-py
description: |
  Azure AI Content Safety SDK for Python. Use for detecting harmful content in text and images with multi-severity classification.
  Triggers: "azure-ai-contentsafety", "ContentSafetyClient", "content moderation", "harmful content", "text analysis", "image analysis".
license: MIT
metadata:
  author: Microsoft
  version: "1.0.0"
  package: azure-ai-contentsafety
---

# 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

## Reference Files

| File | Contents |
|------|----------|
| [references/capabilities.md](references/capabilities.md) | Additional non-hero capabilities, operation-group coverage, and production checklists. |
| [references/non-hero-scenarios.md](references/non-hero-scenarios.md) | Dedicated non-hero examples for secondary/advanced scenarios. |

© Microsoft · MIT · microsoft/skills

Similar skills

All skills for AI and ML →

From the same set143

The whole set →
azure-ai-vision-imageanalysis-py This skill guides Python work with Azure AI Vision Image Analysis, from OCR and object detection to captions and smart crops. Use it when building image-understanding features. 2installs azure-ai-translation-text-py A skill covering the Azure AI Translator Python SDK: text translation, transliteration, language detection and dictionary lookups. Useful when an app has to translate strings at runtime. 2installs azure-ai-transcription-py This skill guides Python development with Azure AI Transcription for batch jobs and live speech recognition. Use it when an app needs speaker labels or timestamps alongside the transcript. 2installs azure-ai-textanalytics-py A skill that wires Azure AI Language into your Python code: sentiment, entities, key phrases, language detection, PII, and healthcare NLP. 2installs azure-servicebus-dotnet Get .NET guidance for Azure Service Bus, from sending and receiving messages to background processing and dead-letter queues. 2installs azure-ai-openai-dotnet This skill guides .NET work with Azure OpenAI and OpenAI services, covering chat, embeddings, image generation, transcription, and assistants. 2installs azure-upgrade Assesses and automates moving Azure workloads between plans, tiers and SKUs, and modernizes legacy Azure SDK dependencies in source code. 1installs azure-quotas Checks Azure limits, current usage, and available capacity by region. Use it to validate a deployment plan or investigate a quota error. 1installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor