1use schemars::JsonSchema;
13use serde::{Deserialize, Serialize};
14
15#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
30#[serde(tag = "type", rename_all = "snake_case")]
31pub enum ContentBlock {
32 Text(TextContent),
36 Image(ImageContent),
40 Audio(AudioContent),
44 ResourceLink(ResourceLink),
48 Resource(EmbeddedResource),
54}
55
56#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
58pub struct TextContent {
59 #[serde(default, skip_serializing_if = "Option::is_none")]
60 pub annotations: Option<Annotations>,
61 pub text: String,
62 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
64 pub meta: Option<serde_json::Value>,
65}
66
67impl<T: Into<String>> From<T> for ContentBlock {
68 fn from(value: T) -> Self {
69 Self::Text(TextContent {
70 annotations: None,
71 text: value.into(),
72 meta: None,
73 })
74 }
75}
76
77#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
79pub struct ImageContent {
80 #[serde(default, skip_serializing_if = "Option::is_none")]
81 pub annotations: Option<Annotations>,
82 pub data: String,
83 #[serde(rename = "mimeType")]
84 pub mime_type: String,
85 #[serde(default, skip_serializing_if = "Option::is_none")]
86 pub uri: Option<String>,
87 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
89 pub meta: Option<serde_json::Value>,
90}
91
92#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
94pub struct AudioContent {
95 #[serde(default, skip_serializing_if = "Option::is_none")]
96 pub annotations: Option<Annotations>,
97 pub data: String,
98 #[serde(rename = "mimeType")]
99 pub mime_type: String,
100 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
102 pub meta: Option<serde_json::Value>,
103}
104
105#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
107pub struct EmbeddedResource {
108 #[serde(default, skip_serializing_if = "Option::is_none")]
109 pub annotations: Option<Annotations>,
110 pub resource: EmbeddedResourceResource,
111 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
113 pub meta: Option<serde_json::Value>,
114}
115
116#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
118#[serde(untagged)]
119pub enum EmbeddedResourceResource {
120 TextResourceContents(TextResourceContents),
121 BlobResourceContents(BlobResourceContents),
122}
123
124#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
126pub struct TextResourceContents {
127 #[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
128 pub mime_type: Option<String>,
129 pub text: String,
130 pub uri: String,
131 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
133 pub meta: Option<serde_json::Value>,
134}
135
136#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
138pub struct BlobResourceContents {
139 pub blob: String,
140 #[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
141 pub mime_type: Option<String>,
142 pub uri: String,
143 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
145 pub meta: Option<serde_json::Value>,
146}
147
148#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
150pub struct ResourceLink {
151 #[serde(default, skip_serializing_if = "Option::is_none")]
152 pub annotations: Option<Annotations>,
153 #[serde(default, skip_serializing_if = "Option::is_none")]
154 pub description: Option<String>,
155 #[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
156 pub mime_type: Option<String>,
157 pub name: String,
158 #[serde(default, skip_serializing_if = "Option::is_none")]
159 pub size: Option<i64>,
160 #[serde(default, skip_serializing_if = "Option::is_none")]
161 pub title: Option<String>,
162 pub uri: String,
163 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
165 pub meta: Option<serde_json::Value>,
166}
167
168#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
170pub struct Annotations {
171 #[serde(default, skip_serializing_if = "Option::is_none")]
172 pub audience: Option<Vec<Role>>,
173 #[serde(
174 rename = "lastModified",
175 default,
176 skip_serializing_if = "Option::is_none"
177 )]
178 pub last_modified: Option<String>,
179 #[serde(default, skip_serializing_if = "Option::is_none")]
180 pub priority: Option<f64>,
181 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
183 pub meta: Option<serde_json::Value>,
184}
185
186#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
188pub enum Role {
189 #[serde(rename = "assistant")]
190 Assistant,
191 #[serde(rename = "user")]
192 User,
193}