Skip to main content

[Beta] Guardrail Policies

Use policies to group guardrails and control which ones run for specific teams, keys, or models.

Why use policies?​

  • Enable/disable specific guardrails for teams, keys, or models
  • Group guardrails into a single policy
  • Inherit from existing policies and override what you need

Quick Start​

config.yaml
model_list:
- model_name: gpt-5.6-terra
litellm_params:
model: openai/gpt-5.6-terra

# 1. Define your guardrails
guardrails:
- guardrail_name: pii_masking
litellm_params:
guardrail: presidio
mode: pre_call

- guardrail_name: prompt_injection
litellm_params:
guardrail: lakera
mode: pre_call
api_key: os.environ/LAKERA_API_KEY

# 2. Create a policy
policies:
my-policy:
guardrails:
add:
- pii_masking
- prompt_injection

# 3. Attach the policy
policy_attachments:
- policy: my-policy
scope: "*" # apply to all requests

Response headers show what ran:

x-litellm-applied-policies: my-policy
x-litellm-applied-guardrails: pii_masking,prompt_injection

Add guardrails for a specific team​

Enterprise feature

Team/key-based policy attachment requires a LiteLLM Enterprise license. Start a free 30-day trial or book a demo. See what Enterprise includes.

You have a global baseline, but want to add extra guardrails for a specific team.

config.yaml
policies:
global-baseline:
guardrails:
add:
- pii_masking

finance-team-policy:
inherit: global-baseline
guardrails:
add:
- strict_compliance_check
- audit_logger

policy_attachments:
- policy: global-baseline
scope: "*"

- policy: finance-team-policy
teams:
- finance # team alias from /team/new

Now the finance team gets pii_masking + strict_compliance_check + audit_logger, while everyone else just gets pii_masking.

Remove guardrails for a specific team​

Enterprise feature

Team/key-based policy attachment requires a LiteLLM Enterprise license. Start a free 30-day trial or book a demo. See what Enterprise includes.

You have guardrails running globally, but want to disable some for a specific team (e.g., internal testing).

config.yaml
policies:
global-baseline:
guardrails:
add:
- pii_masking
- prompt_injection

internal-team-policy:
inherit: global-baseline
guardrails:
remove:
- pii_masking # don't need PII masking for internal testing

policy_attachments:
- policy: global-baseline
scope: "*"

- policy: internal-team-policy
teams:
- internal-testing # team alias from /team/new

Now the internal-testing team only gets prompt_injection, while everyone else gets both guardrails.

Inheritance​

Start with a base policy and build on it:

config.yaml
policies:
base:
guardrails:
add:
- pii_masking
- toxicity_filter

strict:
inherit: base
guardrails:
add:
- prompt_injection

relaxed:
inherit: base
guardrails:
remove:
- toxicity_filter

What you get:

  • base → [pii_masking, toxicity_filter]
  • strict → [pii_masking, toxicity_filter, prompt_injection]
  • relaxed → [pii_masking]

Model Conditions​

Run guardrails only for specific models:

config.yaml
policies:
gpt-safety:
guardrails:
add:
- strict_content_filter
condition:
model: "gpt-5.6.*" # regex - matches gpt-5.6-luna, gpt-5.6-terra

bedrock-compliance:
guardrails:
add:
- audit_logger
condition:
model: # exact match list
- bedrock/anthropic.claude-sonnet-5
- bedrock/anthropic.claude-opus-5

Attachments​

Policies don't do anything until you attach them. Attachments tell LiteLLM where to apply each policy.

Global - runs on every request:

config.yaml
policy_attachments:
- policy: default
scope: "*"

Team-specific (uses team alias from /team/new):

config.yaml
policy_attachments:
- policy: hipaa-compliance
teams:
- healthcare-team # team alias
- medical-research # team alias

Key-specific (uses key alias from /key/generate, wildcards supported):

config.yaml
policy_attachments:
- policy: internal-testing
keys:
- "dev-*" # key alias pattern
- "test-*" # key alias pattern

Tag-based (matches keys/teams by metadata tags, wildcards supported):

config.yaml
policy_attachments:
- policy: hipaa-compliance
tags:
- "healthcare"
- "health-*" # wildcard - matches health-team, health-dev, etc.

Tags are read from key and team metadata.tags. For example, a key created with metadata: {"tags": ["healthcare"]} would match the attachment above.

Test Policy Matching​

Debug which policies and guardrails apply for a given context. Use this to verify your policy configuration before deploying.

Go to Policies > Test tab. Enter a team alias, key alias, model, or tags and click Test to see which policies match and what guardrails would be applied.

Policy Execution Order​

When several policies match one request, LiteLLM runs them from the broadest attachment to the narrowest: scope: "*" first, then teams, then keys, then tags, then models. An attachment that combines several of these is ranked by its narrowest one and after the single-constraint attachments in that tier (models: [gpt-4o] before teams: [finance], models: [gpt-4o]). Attachments that still tie keep their config.yaml order, followed by attachments created through the API or UI, newest first. Policies passed in the request body ("policies": [...]) run after every attachment match, in the order given. Across tiers, the order does not depend on how attachments are listed in config.yaml or on which proxy worker handles the request.

This is the order pipelines execute in, so a global blocking policy always rejects a request before a model-scoped one gets to run. It is also the order of x-litellm-applied-policies and of matched_policies in /policies/resolve and the Policy Simulator. When the same policy is attached at more than one matching scope, it runs once, ranked by whichever of its attachments sorts first, and matched_via reports that attachment (scope:* rather than model:gpt-4o when neither has a priority).

To override the tier order, set an optional integer priority on an attachment. Attachments with a priority run before every attachment without one, lowest value first, and fall back to the tier order above when two share the same value. Attachments without a priority behave exactly as before, so existing configs do not change. Here model-policy runs before tag-policy even though tags is the broader tier:

config.yaml
policy_attachments:
- policy: model-policy
models: [gpt-4o]
priority: 1
- policy: tag-policy
tags: [production]
priority: 2

The same field is accepted by POST /policies/attachments, returned from GET /policies/attachments/list, and shown as a sortable Priority column and an optional Priority input in the Admin UI Attachments tab. Values must fit a signed 32-bit integer (-2147483648 to 2147483647).

config.yaml
policy_attachments:
- policy: model-policy
models: [gpt-4o]
- policy: team-policy
teams: [finance]
- policy: global-policy
scope: "*"

A gpt-4o request from a finance key runs global-policy, then team-policy, then model-policy, and returns x-litellm-applied-policies: global-policy,team-policy,model-policy.

Policy Flow Builder​

For conditional execution (e.g., run a second guardrail only if the first fails), use the Policy Flow Builder to define pipelines with per-step pass, fail, and optional error actions (on_pass, on_fail, on_error).

Config Reference​

policies​

policies:
<policy-name>:
description: ...
inherit: ...
guardrails:
add: [...]
remove: [...]
condition:
model: ...
pipeline: ... # optional; see Policy Flow Builder
FieldTypeDescription
descriptionstringOptional. What this policy does.
inheritstringOptional. Parent policy to inherit guardrails from.
guardrails.addlist[string]Guardrails to enable.
guardrails.removelist[string]Guardrails to disable (useful with inheritance).
condition.modelstring or list[string]Optional. Only apply when model matches. Supports regex.
pipelineobjectOptional. Ordered guardrail execution with per-step actions (on_pass, on_fail, optional on_error). See Policy Flow Builder.

policy_attachments​

policy_attachments:
- policy: ...
scope: ...
teams: [...]
keys: [...]
models: [...]
tags: [...]
priority: ...
FieldTypeDescription
policystringRequired. Name of the policy to attach.
scopestringUse "*" to apply globally.
teamslist[string]Team aliases (from /team/new). Supports * wildcard.
keyslist[string]Key aliases (from /key/generate). Supports * wildcard.
modelslist[string]Model names. Supports * wildcard.
tagslist[string]Tag patterns (from key/team metadata.tags). Supports * wildcard.
priorityintegerOptional. Lower values run first. Attachments with a priority run before those without one; ties fall back to the tier order.

Response Headers​

HeaderDescription
x-litellm-applied-policiesPolicies that matched this request
x-litellm-applied-guardrailsGuardrails that actually ran
x-litellm-policy-sourcesWhy each policy matched (e.g., hipaa=tag:healthcare; baseline=scope:*)

How it works​

Example config:

config.yaml
policies:
base:
guardrails:
add: [pii_masking]

finance-policy:
inherit: base
guardrails:
add: [audit_logger]

policy_attachments:
- policy: base
scope: "*"
- policy: finance-policy
teams: [finance]
  1. Request comes in with team_alias='finance'
  2. Matches base (via scope: "*") and finance-policy (via teams: [finance])
  3. Resolves guardrails: base adds pii_masking, finance-policy inherits and adds audit_logger
  4. Final guardrails: pii_masking, audit_logger