nemoguardrails.actions.rail_outcome
nemoguardrails.actions.rail_outcome
The engine-neutral outcome of a single rail check.
RailOutcome is the canonical, backend-agnostic verdict a rail produces. It
carries only the DECISION and neutral evidence, never how a consequence is
rendered: which exception to raise, which bot intent or refusal message to
emit, and how to localize it are presentation concerns that each engine (the
Colang flow, IORails) decides for itself from this outcome plus its config.
Fields:
decision: ALLOW / BLOCK / TRANSFORM.reason: optional neutral, human-readable explanation.metadata: neutral evidence the decision is based on (policy violations, categories, scores, or backend-specific details). The top-level mapping is copied at construction and is never load-bearing for the decision itself. Serialization and disclosure are concerns for consumers at their boundaries.transforms: for TRANSFORM, which conversation variables are rewritten and to what. Transform outcomes are non-streaming; streaming output paths treat the check as non-blocking and do not apply the rewrite.failed: the rail raised instead of returning a verdict, so this BLOCK is the engine’s fail-closed envelope rather than the rail’s own decision.
Deliberately NOT here (they are rendering, not decision): exception type, refusal intent/message, language, and Colang event/context-update channels. A BLOCK always means “stop”; there is no soft-block flag.
Module Contents
Classes
Functions
Data
API
Bases: enum.Enum
The three mutually exclusive things a rail can decide.
The engine-neutral verdict of one rail check.
transforms is non-empty if and only if decision is TRANSFORM. Each
engine renders the consequence of a BLOCK its own way; this object does not
encode it.
The single field both engines read to gate; rendering is theirs.
A block the engine synthesized because the rail raised instead of deciding.
A rewrite of a single conversation variable.
Bases: enum.Enum
The conversation variable a transform rewrites.