🚫 Moderation Block

Azure OpenAI content_filter: nondeterministic across deployments

Azure OpenAI’s content_filter applies a severity matrix (hate, violence, sexual, self-harm) plus a jailbreak flag, and it behaves inconsistently: “Good morning” can trip the violence filter, and an identical prompt can be jailbreak-flagged on one deployment but not another. Because filter configuration is per-deployment, the same request succeeds in one place and is blocked in another, which is invisible if you look at any single deployment in isolation.

TL;DR: Azure content filtering is configured per deployment, so the same prompt can pass on one deployment and be blocked on another, sometimes with false positives like “Good morning” tripping a violence flag. The per-deployment blindness hides the inconsistency. Log the filter result and deployment on every call, and compare rates across deployments to see which one misbehaves.

What it looks like

The response carries a content_filter_results block with per-category severities and, for prompt-side blocks, a jailbreak flag:

"content_filter_results": {
  "hate": { "filtered": false, "severity": "safe" },
  "violence": { "filtered": true, "severity": "medium" },
  "jailbreak": { "filtered": true, "detected": true }
}

The same input can produce different results on a different deployment, because each deployment can have its own filter configuration and thresholds.

Why it happens

Azure applies content filtering as a configurable layer attached to each deployment, with severity thresholds per category and separate jailbreak and prompt-shield checks. Two deployments of the same model can carry different configurations, so behavior legitimately differs between them. The classifier is also probabilistic, which produces the false positives (an innocuous greeting flagged for violence) teams find baffling.

Why your monitoring can’t see it

Looking at one deployment, the filtering looks like occasional noise. The real problem, that deployments disagree, is only visible when you compare filter behavior across deployments. Per-deployment dashboards hide exactly the cross-deployment inconsistency that causes the pain, so a request that works in staging fails in one production region and nobody can explain it.

Not to be confused with: a consistent, intended content block. The issue here is inconsistency: the same prompt treated differently across deployments, and false positives on benign content.

How to detect and handle it

1. Log the filter result and the deployment
Capture content_filter_results and the deployment or region on every call. Without the deployment dimension you cannot see the disagreement.
2. Compare rates across deployments
Filter rates that differ between deployments for similar traffic point at configuration drift, not user behavior.
3. Reconcile deployment configuration
Align severity thresholds and jailbreak settings across deployments so behavior is consistent.
4. Handle false positives as a failure path
When benign content is filtered, retry, route to a correctly configured deployment, or surface an honest message.

How Dstl8 detects this

Dstl8 reads the actual content of every log line, not just its status code, so the recurring signature behind these errors is surfaced as a named pattern with its rate over time, instead of scattered across noisy request logs. When the rate spikes after a deploy, a model change, or a proxy change, Möbius flags it and points at the correlated cause.

Related patterns

References

Third-party API behavior, verified July 2026. Providers change this behavior over time; re-checked quarterly.

See which deployment misbehaves, not just that something did.

Dstl8 compares filter behavior across your Azure deployments so configuration drift becomes a visible pattern. Cited to the log line.

Start Free 14-Day Trial →