Sensitive words guardrail
The sensitive-words guardrail takes a list of literal words and phrases you define on the agent, and redacts every occurrence of them from the agent’s output before the turn is returned. Each match is replaced inline with the literal text[REDACTED] — one marker per match, never a span that swallows
adjacent words.
Redaction is advisory, not blocking: the violation emitted
(sensitive_words_redacted) is LOW severity, so the turn still completes and
the caller gets the answer with the term scrubbed. Use this for terms the
agent must never speak on a customer surface — competitor names, internal
project codenames, unreleased product names — where a hard refusal would be
wrong but a silent scrub is exactly right. When you need a hard block, layer
blocked_topics or the harmful-content filter instead.
The endpoint paths below are relative. Send them against
https://api.orbit.devotel.io/api/v1.
Configure it
Addsensitive_words to the agent’s safety_config on POST /agents or
PUT /agents/:id, alongside the other guardrail fields:
Matching semantics
- Literal matching. Terms are matched as literal text — no regex, no semantic or fuzzy matching. “sales tax” does not match “taxes”, and a term you do not list never fires.
- Case-insensitive. A term matches regardless of case, in any language script (the match is Unicode-aware).
- Whitespace-normalised. Leading and trailing whitespace on each entry is trimmed at compile time, and blank or whitespace-only entries are dropped.
- Bounded matches, not substrings. A term that starts with a letter or
digit only matches at a word edge —
taxesnever clips insidesyntaxes. Terms starting with punctuation match as the literal sequence up to a non-word edge. - Every occurrence redacted. All matches in the output are scrubbed, and the violation reports the match count.
- Per-word severity is not configurable. Every term in the list redacts at LOW severity; there is no per-term block/advisory split.
How it interacts with the other output guards
Sensitive words runs inside the same output-validation pass aspii_redaction, content_filter, and blocked_topics — the checks that scrub
what the agent says back or what a tool returns. It executes after PII
redaction and the profanity filter, and before max_response_length
truncation, so a term near the tail is caught before the output is sliced.
It is distinct from pii_egress: pii_egress scrubs tool call arguments
(the payload the agent sends out through a connector) at the dispatch
boundary, while sensitive_words scrubs the spoken output the customer
reads or hears. The two are independent toggles and commonly both on.
On voice agents the guard runs before text-to-speech, so the redacted output
is what reaches the caller.
Where the violation shows up
Every redaction pushes asensitive_words_redacted violation (LOW severity)
onto the turn, which appears in agent run inspection and rolls into the
Guardrail Effectiveness analytics so you
can see firing rates per agent and per policy. Many matches — especially on
voice traffic — mean the agent freely speaks the term and silently speaks it
redacted; a low-severity violation does not mean the match was harmless.
Worked example
A customer-facing support agent must never name a competitor or expose an internal project codename:blocked_topics (e.g. ["competitor comparisons"]) when
the question itself should get a soft refusal rather than a scrubbed answer.
Related reading
- Creating agents — the full
safety_configfield list and thepii_egresstool-argument guard. - Guardrail effectiveness monitoring — firing rates for this and every other guardrail policy.