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}
63
64impl<T: Into<String>> From<T> for ContentBlock {
65 fn from(value: T) -> Self {
66 Self::Text(TextContent {
67 annotations: None,
68 text: value.into(),
69 })
70 }
71}
72
73#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
75pub struct ImageContent {
76 #[serde(default, skip_serializing_if = "Option::is_none")]
77 pub annotations: Option<Annotations>,
78 pub data: String,
79 #[serde(rename = "mimeType")]
80 pub mime_type: String,
81 #[serde(default, skip_serializing_if = "Option::is_none")]
82 pub uri: Option<String>,
83}
84
85#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
87pub struct AudioContent {
88 #[serde(default, skip_serializing_if = "Option::is_none")]
89 pub annotations: Option<Annotations>,
90 pub data: String,
91 #[serde(rename = "mimeType")]
92 pub mime_type: String,
93}
94
95#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
97pub struct EmbeddedResource {
98 #[serde(default, skip_serializing_if = "Option::is_none")]
99 pub annotations: Option<Annotations>,
100 pub resource: EmbeddedResourceResource,
101}
102
103#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
105#[serde(untagged)]
106pub enum EmbeddedResourceResource {
107 TextResourceContents(TextResourceContents),
108 BlobResourceContents(BlobResourceContents),
109}
110
111#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
113pub struct TextResourceContents {
114 #[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
115 pub mime_type: Option<String>,
116 pub text: String,
117 pub uri: String,
118}
119
120#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
122pub struct BlobResourceContents {
123 pub blob: String,
124 #[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
125 pub mime_type: Option<String>,
126 pub uri: String,
127}
128
129#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
131pub struct ResourceLink {
132 #[serde(default, skip_serializing_if = "Option::is_none")]
133 pub annotations: Option<Annotations>,
134 #[serde(default, skip_serializing_if = "Option::is_none")]
135 pub description: Option<String>,
136 #[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
137 pub mime_type: Option<String>,
138 pub name: String,
139 #[serde(default, skip_serializing_if = "Option::is_none")]
140 pub size: Option<i64>,
141 #[serde(default, skip_serializing_if = "Option::is_none")]
142 pub title: Option<String>,
143 pub uri: String,
144}
145
146#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
148pub struct Annotations {
149 #[serde(default, skip_serializing_if = "Option::is_none")]
150 pub audience: Option<Vec<Role>>,
151 #[serde(
152 rename = "lastModified",
153 default,
154 skip_serializing_if = "Option::is_none"
155 )]
156 pub last_modified: Option<String>,
157 #[serde(default, skip_serializing_if = "Option::is_none")]
158 pub priority: Option<f64>,
159}
160
161#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
163pub enum Role {
164 #[serde(rename = "assistant")]
165 Assistant,
166 #[serde(rename = "user")]
167 User,
168}