Simplified Input Processing
Agency Swarm automatically extracts text content from messages, so your guardrails receive clean text instead of full message objects.Function Signature
Each input guardrail receives three parameters:context: Run context wrapper with access to shared state.agent: The Agent instance receiving the input.user_input: Extracted text content.- Single message: a string containing the message content.
- Multiple consecutive messages: a list of strings, one per message.
GuardrailFunctionOutputwith:tripwire_triggered(bool):Trueif validation failed.output_info(str): Guidance message returned to the caller.
File and image inputs inside messages are not passed to input guardrails.
Input Types
When a user sends multiple messages:Basic Input Guardrail
Practical Example: Filtering Off-Topic Questions
Use input guardrails to keep agents focused on their domain. This example delegates relevance decisions to an evaluator agent:examples/guardrails_input.py.
Non-strict vs Strict Mode
Input guardrails support two modes that control how guidance is delivered. Useraise_input_guardrail_error to control this behavior.
Non-strict Mode (Default)
Setting:raise_input_guardrail_error=False
In non-strict mode, guardrail guidance flows naturally as assistant output:
- Guidance is returned as
final_output(non-streaming) ormessage_output_createdevent (streaming). - No exception is raised.
- Guidance persists as an assistant message with
message_origin="input_guardrail_message".
Strict Mode
Setting:raise_input_guardrail_error=True
In strict mode, guardrail failures abort the turn immediately:
InputGuardrailTripwireTriggeredis raised.- Guidance persists as a system message with
message_origin="input_guardrail_error". - The turn is aborted before the agent processes input.
- The caller must handle the exception.
Strict mode usage example
Strict mode usage example
Comparison Table
| Mode | raise_input_guardrail_error | Caller sees | Persisted entry | Role | Use case |
|---|---|---|---|---|---|
| Non-strict | False (default) | Guardrail text as final_output or streaming event | Assistant message (input_guardrail_message) | assistant | Conversational flows, helpful guidance |
| Strict | True | InputGuardrailTripwireTriggered exception | System message (input_guardrail_error) | system | Hard requirements, compliance, security |
Should I use non-strict or strict mode?
Should I use non-strict or strict mode?
Use non-strict mode when:
- You want a conversational user experience.
- Agents are communicating with each other internally.
- Guardrail feedback is helpful guidance, not a hard block.
- You do not want to write exception handling code.
- You are enforcing non-negotiable requirements.
- Security or compliance rules must block processing.
- You want explicit control over error handling.
- The caller should know immediately that validation failed.
Streaming behavior example
Streaming behavior example
Guardrails in Message History
Each guardrail trigger is recorded in chat history with a guidance entry. Every entry carriesmessage_origin to identify which guardrail fired.
For most use cases, role, content, and message_origin are enough. Additional metadata is mainly for tracing multi-agent runs.
Message Origin Values
input_guardrail_message: Input guardrail in non-strict mode.input_guardrail_error: Input guardrail in strict mode.output_guardrail_error: Output guardrail failure (always a system message).
Persistence Behavior
| Mode | raise_input_guardrail_error | Streaming Event | Persisted Entry |
|---|---|---|---|
| Non-strict | False (default) | message_output_created with guidance text | Assistant message, message_origin="input_guardrail_message" |
| Strict | True | {"type": "error", "content": guidance} | System message, message_origin="input_guardrail_error" |
validation_attempts does not apply to input guardrails. Input guardrails trigger immediately on validation failure.Message History After Guardrails Trip
When an input guardrail trips, agent-to-agent request messages remain in history alongside guardrail guidance. This preserves context so calling agents can adjust their approach. Output guardrail messages also persist in history to guide retry attempts.Example message history entries (illustrative)
Example message history entries (illustrative)
Internal Agent Communication
For many agent-to-agent flows, non-strict mode (raise_input_guardrail_error=False) is easier to work with because guidance is returned inline instead of raising exceptions mid-chain.