agent_client_protocol_schema/
content.rs1use 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)]
58#[schemars(inline)]
59pub struct TextContent {
60 #[serde(default, skip_serializing_if = "Option::is_none")]
61 pub annotations: Option<Annotations>,
62 pub text: String,
63 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
65 pub meta: Option<serde_json::Value>,
66}
67
68impl<T: Into<String>> From<T> for ContentBlock {
69 fn from(value: T) -> Self {
70 Self::Text(TextContent {
71 annotations: None,
72 text: value.into(),
73 meta: None,
74 })
75 }
76}
77
78#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
80#[schemars(inline)]
81pub struct ImageContent {
82 #[serde(default, skip_serializing_if = "Option::is_none")]
83 pub annotations: Option<Annotations>,
84 pub data: String,
85 #[serde(rename = "mimeType")]
86 pub mime_type: String,
87 #[serde(default, skip_serializing_if = "Option::is_none")]
88 pub uri: Option<String>,
89 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
91 pub meta: Option<serde_json::Value>,
92}
93
94#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
96#[schemars(inline)]
97pub struct AudioContent {
98 #[serde(default, skip_serializing_if = "Option::is_none")]
99 pub annotations: Option<Annotations>,
100 pub data: String,
101 #[serde(rename = "mimeType")]
102 pub mime_type: String,
103 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
105 pub meta: Option<serde_json::Value>,
106}
107
108#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
110#[schemars(inline)]
111pub struct EmbeddedResource {
112 #[serde(default, skip_serializing_if = "Option::is_none")]
113 pub annotations: Option<Annotations>,
114 pub resource: EmbeddedResourceResource,
115 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
117 pub meta: Option<serde_json::Value>,
118}
119
120#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
122#[serde(untagged)]
123pub enum EmbeddedResourceResource {
124 TextResourceContents(TextResourceContents),
125 BlobResourceContents(BlobResourceContents),
126}
127
128#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
130pub struct TextResourceContents {
131 #[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
132 pub mime_type: Option<String>,
133 pub text: String,
134 pub uri: String,
135 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
137 pub meta: Option<serde_json::Value>,
138}
139
140#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
142pub struct BlobResourceContents {
143 pub blob: String,
144 #[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
145 pub mime_type: Option<String>,
146 pub uri: String,
147 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
149 pub meta: Option<serde_json::Value>,
150}
151
152#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
154#[schemars(inline)]
155pub struct ResourceLink {
156 #[serde(default, skip_serializing_if = "Option::is_none")]
157 pub annotations: Option<Annotations>,
158 #[serde(default, skip_serializing_if = "Option::is_none")]
159 pub description: Option<String>,
160 #[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
161 pub mime_type: Option<String>,
162 pub name: String,
163 #[serde(default, skip_serializing_if = "Option::is_none")]
164 pub size: Option<i64>,
165 #[serde(default, skip_serializing_if = "Option::is_none")]
166 pub title: Option<String>,
167 pub uri: String,
168 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
170 pub meta: Option<serde_json::Value>,
171}
172
173#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
175pub struct Annotations {
176 #[serde(default, skip_serializing_if = "Option::is_none")]
177 pub audience: Option<Vec<Role>>,
178 #[serde(
179 rename = "lastModified",
180 default,
181 skip_serializing_if = "Option::is_none"
182 )]
183 pub last_modified: Option<String>,
184 #[serde(default, skip_serializing_if = "Option::is_none")]
185 pub priority: Option<f64>,
186 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
188 pub meta: Option<serde_json::Value>,
189}
190
191#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, JsonSchema)]
193pub enum Role {
194 #[serde(rename = "assistant")]
195 Assistant,
196 #[serde(rename = "user")]
197 User,
198}