strands_agents/types/
guardrails.rs

1//! Guardrail type definitions for content safety.
2
3use serde::{Deserialize, Serialize};
4
5/// Guardrail configuration for model invocations.
6#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
7#[serde(rename_all = "camelCase")]
8pub struct GuardrailConfig {
9    pub guardrail_identifier: String,
10    pub guardrail_version: String,
11    #[serde(skip_serializing_if = "Option::is_none")]
12    pub trace: Option<GuardrailTrace>,
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub stream_processing_mode: Option<String>,
15}
16
17/// Trace level for guardrail processing.
18#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
19#[serde(rename_all = "lowercase")]
20pub enum GuardrailTrace {
21    Enabled,
22    Disabled,
23}
24
25/// Guardrail assessment result.
26#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
27#[serde(rename_all = "camelCase")]
28pub struct GuardrailAssessment {
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub topic_policy: Option<GuardrailTopicPolicyAssessment>,
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub content_policy: Option<GuardrailContentPolicyAssessment>,
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub word_policy: Option<GuardrailWordPolicyAssessment>,
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub sensitive_information_policy: Option<GuardrailSensitiveInformationPolicyAssessment>,
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub contextual_grounding_policy: Option<GuardrailContextualGroundingPolicyAssessment>,
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub invocation_metrics: Option<GuardrailInvocationMetrics>,
41}
42
43/// Topic policy assessment.
44#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
45pub struct GuardrailTopicPolicyAssessment {
46    pub topics: Vec<GuardrailTopic>,
47}
48
49/// A topic identified by guardrails.
50#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
51pub struct GuardrailTopic {
52    pub name: String,
53    #[serde(rename = "type")]
54    pub topic_type: String,
55    pub action: String,
56}
57
58/// Content policy assessment.
59#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
60pub struct GuardrailContentPolicyAssessment {
61    pub filters: Vec<GuardrailContentFilter>,
62}
63
64/// A content filter result.
65#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
66pub struct GuardrailContentFilter {
67    #[serde(rename = "type")]
68    pub filter_type: String,
69    pub confidence: String,
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub filter_strength: Option<String>,
72    pub action: String,
73}
74
75/// Word policy assessment.
76#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
77#[serde(rename_all = "camelCase")]
78pub struct GuardrailWordPolicyAssessment {
79    #[serde(skip_serializing_if = "Option::is_none")]
80    pub custom_words: Option<Vec<GuardrailCustomWord>>,
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub managed_word_lists: Option<Vec<GuardrailManagedWord>>,
83}
84
85/// A custom word matched by guardrails.
86#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
87pub struct GuardrailCustomWord {
88    #[serde(rename = "match")]
89    pub word_match: String,
90    pub action: String,
91}
92
93/// A managed word matched by guardrails.
94#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
95pub struct GuardrailManagedWord {
96    #[serde(rename = "match")]
97    pub word_match: String,
98    #[serde(rename = "type")]
99    pub word_type: String,
100    pub action: String,
101}
102
103/// Sensitive information policy assessment.
104#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
105#[serde(rename_all = "camelCase")]
106pub struct GuardrailSensitiveInformationPolicyAssessment {
107    #[serde(skip_serializing_if = "Option::is_none")]
108    pub pii_entities: Option<Vec<GuardrailPiiEntity>>,
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub regexes: Option<Vec<GuardrailRegex>>,
111}
112
113/// A PII entity detected by guardrails.
114#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
115pub struct GuardrailPiiEntity {
116    #[serde(rename = "match")]
117    pub entity_match: String,
118    #[serde(rename = "type")]
119    pub entity_type: String,
120    pub action: String,
121}
122
123/// A regex match by guardrails.
124#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
125pub struct GuardrailRegex {
126    pub name: String,
127    #[serde(rename = "match")]
128    pub regex_match: String,
129    pub regex: String,
130    pub action: String,
131}
132
133/// Contextual grounding policy assessment.
134#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
135pub struct GuardrailContextualGroundingPolicyAssessment {
136    pub filters: Vec<GuardrailGroundingFilter>,
137}
138
139/// A grounding filter result.
140#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
141pub struct GuardrailGroundingFilter {
142    #[serde(rename = "type")]
143    pub filter_type: String,
144    pub threshold: f64,
145    pub score: f64,
146    pub action: String,
147}
148
149/// Guardrail invocation metrics.
150#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
151#[serde(rename_all = "camelCase")]
152pub struct GuardrailInvocationMetrics {
153    pub guardrail_processing_latency: u64,
154    pub usage: GuardrailUsage,
155    #[serde(skip_serializing_if = "Option::is_none")]
156    pub guardrail_coverage: Option<GuardrailCoverage>,
157}
158
159/// Guardrail token usage.
160#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
161#[serde(rename_all = "camelCase")]
162pub struct GuardrailUsage {
163    pub topic_policy_units: u32,
164    pub content_policy_units: u32,
165    pub word_policy_units: u32,
166    pub sensitive_information_policy_units: u32,
167    pub sensitive_information_policy_free_units: u32,
168    pub contextual_grounding_policy_units: u32,
169}
170
171/// Guardrail coverage information.
172#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
173#[serde(rename_all = "camelCase")]
174pub struct GuardrailCoverage {
175    #[serde(skip_serializing_if = "Option::is_none")]
176    pub text_characters: Option<GuardrailTextCharactersCoverage>,
177    #[serde(skip_serializing_if = "Option::is_none")]
178    pub images: Option<GuardrailImageCoverage>,
179}
180
181/// Text characters coverage.
182#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
183pub struct GuardrailTextCharactersCoverage {
184    pub guarded: u32,
185    pub total: u32,
186}
187
188/// Image coverage.
189#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
190pub struct GuardrailImageCoverage {
191    pub guarded: u32,
192    pub total: u32,
193}
194