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")]
31#[schemars(extend("discriminator" = {"propertyName": "type"}))]
32pub enum ContentBlock {
33 Text(TextContent),
38 Image(ImageContent),
42 Audio(AudioContent),
46 ResourceLink(ResourceLink),
50 Resource(EmbeddedResource),
56}
57
58#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
60#[schemars(inline)]
61pub struct TextContent {
62 #[serde(default, skip_serializing_if = "Option::is_none")]
63 pub annotations: Option<Annotations>,
64 pub text: String,
65 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
67 pub meta: Option<serde_json::Value>,
68}
69
70impl<T: Into<String>> From<T> for ContentBlock {
71 fn from(value: T) -> Self {
72 Self::Text(TextContent {
73 annotations: None,
74 text: value.into(),
75 meta: None,
76 })
77 }
78}
79
80#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
82#[schemars(inline)]
83pub struct ImageContent {
84 #[serde(default, skip_serializing_if = "Option::is_none")]
85 pub annotations: Option<Annotations>,
86 pub data: String,
87 #[serde(rename = "mimeType")]
88 pub mime_type: String,
89 #[serde(default, skip_serializing_if = "Option::is_none")]
90 pub uri: Option<String>,
91 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
93 pub meta: Option<serde_json::Value>,
94}
95
96#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
98#[schemars(inline)]
99pub struct AudioContent {
100 #[serde(default, skip_serializing_if = "Option::is_none")]
101 pub annotations: Option<Annotations>,
102 pub data: String,
103 #[serde(rename = "mimeType")]
104 pub mime_type: String,
105 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
107 pub meta: Option<serde_json::Value>,
108}
109
110#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
112#[schemars(inline)]
113pub struct EmbeddedResource {
114 #[serde(default, skip_serializing_if = "Option::is_none")]
115 pub annotations: Option<Annotations>,
116 pub resource: EmbeddedResourceResource,
117 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
119 pub meta: Option<serde_json::Value>,
120}
121
122#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
124#[serde(untagged)]
125pub enum EmbeddedResourceResource {
126 TextResourceContents(TextResourceContents),
127 BlobResourceContents(BlobResourceContents),
128}
129
130#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
132pub struct TextResourceContents {
133 #[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
134 pub mime_type: Option<String>,
135 pub text: String,
136 pub uri: String,
137 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
139 pub meta: Option<serde_json::Value>,
140}
141
142#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
144pub struct BlobResourceContents {
145 pub blob: String,
146 #[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
147 pub mime_type: Option<String>,
148 pub uri: String,
149 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
151 pub meta: Option<serde_json::Value>,
152}
153
154#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
156#[schemars(inline)]
157pub struct ResourceLink {
158 #[serde(default, skip_serializing_if = "Option::is_none")]
159 pub annotations: Option<Annotations>,
160 #[serde(default, skip_serializing_if = "Option::is_none")]
161 pub description: Option<String>,
162 #[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
163 pub mime_type: Option<String>,
164 pub name: String,
165 #[serde(default, skip_serializing_if = "Option::is_none")]
166 pub size: Option<i64>,
167 #[serde(default, skip_serializing_if = "Option::is_none")]
168 pub title: Option<String>,
169 pub uri: String,
170 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
172 pub meta: Option<serde_json::Value>,
173}
174
175#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
177pub struct Annotations {
178 #[serde(default, skip_serializing_if = "Option::is_none")]
179 pub audience: Option<Vec<Role>>,
180 #[serde(
181 rename = "lastModified",
182 default,
183 skip_serializing_if = "Option::is_none"
184 )]
185 pub last_modified: Option<String>,
186 #[serde(default, skip_serializing_if = "Option::is_none")]
187 pub priority: Option<f64>,
188 #[serde(skip_serializing_if = "Option::is_none", rename = "_meta")]
190 pub meta: Option<serde_json::Value>,
191}
192
193#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, JsonSchema)]
195pub enum Role {
196 #[serde(rename = "assistant")]
197 Assistant,
198 #[serde(rename = "user")]
199 User,
200}