Skip to main content

systemprompt_models/a2a/
message.rs

1use serde::{Deserialize, Serialize};
2use systemprompt_identifiers::{ContextId, MessageId, TaskId};
3
4#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
5pub struct Message {
6    pub role: String,
7    pub parts: Vec<Part>,
8    #[serde(rename = "messageId")]
9    pub id: MessageId,
10    #[serde(rename = "taskId")]
11    pub task_id: Option<TaskId>,
12    #[serde(rename = "contextId")]
13    pub context_id: ContextId,
14    #[serde(rename = "kind")]
15    pub kind: String,
16    pub metadata: Option<serde_json::Value>,
17    pub extensions: Option<Vec<String>>,
18    #[serde(rename = "referenceTaskIds")]
19    pub reference_task_ids: Option<Vec<TaskId>>,
20}
21
22#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
23#[serde(rename_all = "lowercase")]
24pub enum MessageRole {
25    User,
26    Agent,
27}
28
29#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
30#[serde(tag = "kind")]
31pub enum Part {
32    #[serde(rename = "text")]
33    Text(TextPart),
34    #[serde(rename = "data")]
35    Data(DataPart),
36    #[serde(rename = "file")]
37    File(FilePart),
38}
39
40#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
41pub struct TextPart {
42    pub text: String,
43}
44
45#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
46pub struct DataPart {
47    pub data: serde_json::Map<String, serde_json::Value>,
48}
49
50#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
51pub struct FilePart {
52    pub file: FileWithBytes,
53}
54
55#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
56pub struct FileWithBytes {
57    pub name: Option<String>,
58    #[serde(rename = "mimeType")]
59    pub mime_type: Option<String>,
60    pub bytes: String,
61}