- Azure AI Content Safety REST SDK for TypeScript
- Analyze text and images for harmful content with customizable blocklists.
- Installation
- npm
- install
- @azure-rest/ai-content-safety @azure/identity @azure/core-auth
- Environment Variables
- CONTENT_SAFETY_ENDPOINT
- =
- https://
- <
- resource
- >
- .cognitiveservices.azure.com
- CONTENT_SAFETY_KEY
- =
- <
- api-key
- >
- Authentication
- Important
-
- This is a REST client.
- ContentSafetyClient
- is a
- function
- , not a class.
- API Key
- import
- ContentSafetyClient
- from
- "@azure-rest/ai-content-safety"
- ;
- import
- {
- AzureKeyCredential
- }
- from
- "@azure/core-auth"
- ;
- const
- client
- =
- ContentSafetyClient
- (
- process
- .
- env
- .
- CONTENT_SAFETY_ENDPOINT
- !
- ,
- new
- AzureKeyCredential
- (
- process
- .
- env
- .
- CONTENT_SAFETY_KEY
- !
- )
- )
- ;
- DefaultAzureCredential
- import
- ContentSafetyClient
- from
- "@azure-rest/ai-content-safety"
- ;
- import
- {
- DefaultAzureCredential
- }
- from
- "@azure/identity"
- ;
- const
- client
- =
- ContentSafetyClient
- (
- process
- .
- env
- .
- CONTENT_SAFETY_ENDPOINT
- !
- ,
- new
- DefaultAzureCredential
- (
- )
- )
- ;
- Analyze Text
- import
- ContentSafetyClient
- ,
- {
- isUnexpected
- }
- from
- "@azure-rest/ai-content-safety"
- ;
- const
- result
- =
- await
- client
- .
- path
- (
- "/text:analyze"
- )
- .
- post
- (
- {
- body
- :
- {
- text
- :
- "Text content to analyze"
- ,
- categories
- :
- [
- "Hate"
- ,
- "Sexual"
- ,
- "Violence"
- ,
- "SelfHarm"
- ]
- ,
- outputType
- :
- "FourSeverityLevels"
- // or "EightSeverityLevels"
- }
- }
- )
- ;
- if
- (
- isUnexpected
- (
- result
- )
- )
- {
- throw
- result
- .
- body
- ;
- }
- for
- (
- const
- analysis
- of
- result
- .
- body
- .
- categoriesAnalysis
- )
- {
- console
- .
- log
- (
- `
- ${
- analysis
- .
- category
- }
-
- severity
- ${
- analysis
- .
- severity
- }
- `
- )
- ;
- }
- Analyze Image
- Base64 Content
- import
- {
- readFileSync
- }
- from
- "node:fs"
- ;
- const
- imageBuffer
- =
- readFileSync
- (
- "./image.png"
- )
- ;
- const
- base64Image
- =
- imageBuffer
- .
- toString
- (
- "base64"
- )
- ;
- const
- result
- =
- await
- client
- .
- path
- (
- "/image:analyze"
- )
- .
- post
- (
- {
- body
- :
- {
- image
- :
- {
- content
- :
- base64Image
- }
- }
- }
- )
- ;
- if
- (
- isUnexpected
- (
- result
- )
- )
- {
- throw
- result
- .
- body
- ;
- }
- for
- (
- const
- analysis
- of
- result
- .
- body
- .
- categoriesAnalysis
- )
- {
- console
- .
- log
- (
- `
- ${
- analysis
- .
- category
- }
-
- severity
- ${
- analysis
- .
- severity
- }
- `
- )
- ;
- }
- Blob URL
- const
- result
- =
- await
- client
- .
- path
- (
- "/image:analyze"
- )
- .
- post
- (
- {
- body
- :
- {
- image
- :
- {
- blobUrl
- :
- "https://storage.blob.core.windows.net/container/image.png"
- }
- }
- }
- )
- ;
- Blocklist Management
- Create Blocklist
- const
- result
- =
- await
- client
- .
- path
- (
- "/text/blocklists/{blocklistName}"
- ,
- "my-blocklist"
- )
- .
- patch
- (
- {
- contentType
- :
- "application/merge-patch+json"
- ,
- body
- :
- {
- description
- :
- "Custom blocklist for prohibited terms"
- }
- }
- )
- ;
- if
- (
- isUnexpected
- (
- result
- )
- )
- {
- throw
- result
- .
- body
- ;
- }
- console
- .
- log
- (
- `
- Created:
- ${
- result
- .
- body
- .
- blocklistName
- }
- `
- )
- ;
- Add Items to Blocklist
- const
- result
- =
- await
- client
- .
- path
- (
- "/text/blocklists/{blocklistName}:addOrUpdateBlocklistItems"
- ,
- "my-blocklist"
- )
- .
- post
- (
- {
- body
- :
- {
- blocklistItems
- :
- [
- {
- text
- :
- "prohibited-term-1"
- ,
- description
- :
- "First blocked term"
- }
- ,
- {
- text
- :
- "prohibited-term-2"
- ,
- description
- :
- "Second blocked term"
- }
- ]
- }
- }
- )
- ;
- if
- (
- isUnexpected
- (
- result
- )
- )
- {
- throw
- result
- .
- body
- ;
- }
- for
- (
- const
- item
- of
- result
- .
- body
- .
- blocklistItems
- ??
- [
- ]
- )
- {
- console
- .
- log
- (
- `
- Added:
- ${
- item
- .
- blocklistItemId
- }
- `
- )
- ;
- }
- Analyze with Blocklist
- const
- result
- =
- await
- client
- .
- path
- (
- "/text:analyze"
- )
- .
- post
- (
- {
- body
- :
- {
- text
- :
- "Text that might contain blocked terms"
- ,
- blocklistNames
- :
- [
- "my-blocklist"
- ]
- ,
- haltOnBlocklistHit
- :
- false
- }
- }
- )
- ;
- if
- (
- isUnexpected
- (
- result
- )
- )
- {
- throw
- result
- .
- body
- ;
- }
- // Check blocklist matches
- if
- (
- result
- .
- body
- .
- blocklistsMatch
- )
- {
- for
- (
- const
- match
- of
- result
- .
- body
- .
- blocklistsMatch
- )
- {
- console
- .
- log
- (
- `
- Blocked: "
- ${
- match
- .
- blocklistItemText
- }
- " from
- ${
- match
- .
- blocklistName
- }
- `
- )
- ;
- }
- }
- List Blocklists
- const
- result
- =
- await
- client
- .
- path
- (
- "/text/blocklists"
- )
- .
- get
- (
- )
- ;
- if
- (
- isUnexpected
- (
- result
- )
- )
- {
- throw
- result
- .
- body
- ;
- }
- for
- (
- const
- blocklist
- of
- result
- .
- body
- .
- value
- ??
- [
- ]
- )
- {
- console
- .
- log
- (
- `
- ${
- blocklist
- .
- blocklistName
- }
- :
- ${
- blocklist
- .
- description
- }
- `
- )
- ;
- }
- Delete Blocklist
- await
- client
- .
- path
- (
- "/text/blocklists/{blocklistName}"
- ,
- "my-blocklist"
- )
- .
- delete
- (
- )
- ;
- Harm Categories
- Category
- API Term
- Description
- Hate and Fairness
- Hate
- Discriminatory language targeting identity groups
- Sexual
- Sexual
- Sexual content, nudity, pornography
- Violence
- Violence
- Physical harm, weapons, terrorism
- Self-Harm
- SelfHarm
- Self-injury, suicide, eating disorders
- Severity Levels
- Level
- Risk
- Recommended Action
- 0
- Safe
- Allow
- 2
- Low
- Review or allow with warning
- 4
- Medium
- Block or require human review
- 6
- High
- Block immediately
- Output Types
- :
- FourSeverityLevels
- (default): Returns 0, 2, 4, 6
- EightSeverityLevels
- Returns 0-7
Content Moderation Helper
import
ContentSafetyClient
,
{
isUnexpected
,
TextCategoriesAnalysisOutput
}
from
"@azure-rest/ai-content-safety"
;
interface
ModerationResult
{
isAllowed
:
boolean
;
flaggedCategories
:
string
[
]
;
maxSeverity
:
number
;
blocklistMatches
:
string
[
]
;
}
async
function
moderateContent
(
client
:
ReturnType
<
typeof
ContentSafetyClient
, text : string , maxAllowedSeverity = 2 , blocklistNames : string [ ] = [ ] ) : Promise < ModerationResult
{ const result = await client . path ( "/text:analyze" ) . post ( { body : { text , blocklistNames , haltOnBlocklistHit : false } } ) ; if ( isUnexpected ( result ) ) { throw result . body ; } const flaggedCategories = result . body . categoriesAnalysis . filter ( c => ( c . severity ?? 0 )
maxAllowedSeverity ) . map ( c => c . category ! ) ; const maxSeverity = Math . max ( ... result . body . categoriesAnalysis . map ( c => c . severity ?? 0 ) ) ; const blocklistMatches = ( result . body . blocklistsMatch ?? [ ] ) . map ( m => m . blocklistItemText ! ) ; return { isAllowed : flaggedCategories . length === 0 && blocklistMatches . length === 0 , flaggedCategories , maxSeverity , blocklistMatches } ; } API Endpoints Operation Method Path Analyze Text POST /text:analyze Analyze Image POST /image:analyze Create/Update Blocklist PATCH /text/blocklists/{blocklistName} List Blocklists GET /text/blocklists Delete Blocklist DELETE /text/blocklists/{blocklistName} Add Blocklist Items POST /text/blocklists/{blocklistName}:addOrUpdateBlocklistItems List Blocklist Items GET /text/blocklists/{blocklistName}/blocklistItems Remove Blocklist Items POST /text/blocklists/{blocklistName}:removeBlocklistItems Key Types import ContentSafetyClient , { isUnexpected , AnalyzeTextParameters , AnalyzeImageParameters , TextCategoriesAnalysisOutput , ImageCategoriesAnalysisOutput , TextBlocklist , TextBlocklistItem } from "@azure-rest/ai-content-safety" ; Best Practices Always use isUnexpected() - Type guard for error handling Set appropriate thresholds - Different categories may need different severity thresholds Use blocklists for domain-specific terms - Supplement AI detection with custom rules Log moderation decisions - Keep audit trail for compliance Handle edge cases - Empty text, very long text, unsupported image formats When to Use This skill is applicable to execute the workflow or actions described in the overview.
azure-ai-contentsafety-ts
安装
npx skills add https://github.com/sickn33/antigravity-awesome-skills --skill azure-ai-contentsafety-ts