1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4use crate::aws::{EmptyObject, ImageFormat, Rest, ToolResultStatus, ToolUseType};
5
6use super::ImageSource;
7
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
9#[serde(untagged)]
10#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
11pub enum ContentBlockStart {
12 ToolUse {
13 #[serde(rename = "toolUse")]
14 tool_use: ToolUseBlockStart,
15 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
16 rest: Rest,
17 },
18 ToolResult {
19 #[serde(rename = "toolResult")]
20 tool_result: ToolResultBlockStart,
21 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
22 rest: Rest,
23 },
24 ReasoningContent {
25 #[serde(rename = "reasoningContent")]
26 reasoning_content: EmptyObject,
27 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
28 rest: Rest,
29 },
30 Image {
31 image: ImageBlockStart,
32 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
33 rest: Rest,
34 },
35 Raw(Value),
36}
37
38#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
39#[serde(rename_all = "camelCase")]
40#[derive(gproxy_protocol_macros::WireBuilder)]
41#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
42pub struct ToolUseBlockStart {
43 pub tool_use_id: String,
44 pub name: String,
45 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
46 pub type_: Option<ToolUseType>,
47 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
48 pub rest: Rest,
49}
50
51#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
52#[serde(rename_all = "camelCase")]
53#[derive(gproxy_protocol_macros::WireBuilder)]
54#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
55pub struct ToolResultBlockStart {
56 pub tool_use_id: String,
57 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
58 pub type_: Option<String>,
59 #[serde(skip_serializing_if = "Option::is_none")]
60 pub status: Option<ToolResultStatus>,
61 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
62 pub rest: Rest,
63}
64
65#[derive(
66 Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
67)]
68#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
69pub struct ImageBlockStart {
70 pub format: ImageFormat,
71 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
72 pub rest: Rest,
73}
74
75#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
76#[serde(untagged)]
77#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
78pub enum ContentBlockDelta {
79 Text {
80 text: String,
81 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
82 rest: Rest,
83 },
84 ToolUse {
85 #[serde(rename = "toolUse")]
86 tool_use: ToolUseBlockDelta,
87 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
88 rest: Rest,
89 },
90 ToolResult {
91 #[serde(rename = "toolResult")]
92 tool_result: Vec<ToolResultBlockDelta>,
93 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
94 rest: Rest,
95 },
96 ReasoningContent {
97 #[serde(rename = "reasoningContent")]
98 reasoning_content: ReasoningContentBlockDelta,
99 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
100 rest: Rest,
101 },
102 Image {
103 image: ImageBlockDelta,
104 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
105 rest: Rest,
106 },
107 Raw(Value),
108}
109
110#[derive(
111 Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
112)]
113#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
114pub struct ToolUseBlockDelta {
115 pub input: String,
116 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
117 pub rest: Rest,
118}
119
120#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
121#[serde(untagged)]
122#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
123pub enum ToolResultBlockDelta {
124 Text {
125 text: String,
126 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
127 rest: Rest,
128 },
129 Json {
130 json: Value,
131 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
132 rest: Rest,
133 },
134 Raw(Value),
135}
136
137#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
138#[serde(untagged)]
139#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
140pub enum ReasoningContentBlockDelta {
141 Text {
142 text: String,
143 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
144 rest: Rest,
145 },
146 RedactedContent {
147 #[serde(rename = "redactedContent")]
148 redacted_content: String,
149 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
150 rest: Rest,
151 },
152 Signature {
153 signature: String,
154 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
155 rest: Rest,
156 },
157 Raw(Value),
158}
159
160#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
161#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
162pub struct ImageBlockDelta {
163 #[serde(skip_serializing_if = "Option::is_none")]
164 pub source: Option<ImageSource>,
165 #[serde(skip_serializing_if = "Option::is_none")]
166 pub error: Option<ErrorBlock>,
167 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
168 pub rest: Rest,
169}
170
171#[derive(
173 Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
174)]
175#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
176pub struct ErrorBlock {
177 #[serde(skip_serializing_if = "Option::is_none")]
178 pub message: Option<String>,
179 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
180 pub rest: Rest,
181}