1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
use serde::{Serialize, de::DeserializeOwned};
use serde_json::{Value, json};
use super::{ConverseResponse, ImageBlockDelta};
#[test]
fn converse_trace_and_image_error_round_trip_open_extensions() {
round_trip::<ConverseResponse>(json!({
"output": {"message": {"role": "assistant", "content": []}},
"stopReason": "end_turn",
"usage": {"inputTokens": 2, "outputTokens": 1, "totalTokens": 3},
"metrics": {"latencyMs": 7},
"trace": {
"guardrail": {
"inputAssessment": {
"content-1": {
"automatedReasoningPolicy": {
"findings": [
{
"valid": {
"claimsTrueScenario": {
"statements": [{
"logic": "claim_1",
"naturalLanguage": "the claim",
"statementExtension": true
}],
"scenarioExtension": "kept"
},
"logicWarning": {"type": "FUTURE_WARNING"},
"supportingRules": [{
"identifier": "rule-1",
"policyVersionArn": "arn:aws:bedrock:rule-1"
}],
"findingExtension": 1
},
"unionExtension": "kept"
},
{"futureFinding": {"shape": 1}}
],
"policyExtension": false
},
"contentPolicy": {
"filters": [{
"action": "BLOCKED",
"confidence": "HIGH",
"type": "FUTURE_FILTER",
"filterExtension": [1, 2]
}]
},
"assessmentExtension": null
}
},
"guardrailExtension": {"nested": true}
},
"promptRouter": {
"invokedModelId": "router-model",
"routerExtension": "kept"
},
"traceExtension": 9
},
"responseExtension": "kept"
}));
round_trip::<ImageBlockDelta>(json!({
"error": {
"message": "image generation failed",
"errorExtension": {"code": "future"}
},
"deltaExtension": true
}));
}
fn round_trip<T>(wire: Value)
where
T: DeserializeOwned + Serialize,
{
let decoded = serde_json::from_value::<T>(wire.clone()).expect("decode AWS wire value");
assert_eq!(
serde_json::to_value(decoded).expect("encode AWS wire value"),
wire
);
}