1use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
8pub enum Role {
9 #[serde(rename = "ROLE_USER")]
11 User,
12 #[serde(rename = "ROLE_AGENT")]
14 Agent,
15 #[serde(rename = "ROLE_UNSPECIFIED")]
17 Unspecified,
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
24pub struct Part {
25 #[serde(skip_serializing_if = "Option::is_none")]
27 pub text: Option<String>,
28 #[serde(skip_serializing_if = "Option::is_none")]
30 pub raw: Option<String>,
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub url: Option<String>,
34 #[serde(skip_serializing_if = "Option::is_none")]
36 pub data: Option<serde_json::Value>,
37 #[serde(skip_serializing_if = "Option::is_none", rename = "mediaType")]
39 pub media_type: Option<String>,
40 #[serde(skip_serializing_if = "Option::is_none")]
42 pub filename: Option<String>,
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub metadata: Option<HashMap<String, serde_json::Value>>,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
50pub struct Message {
51 #[serde(rename = "messageId")]
53 pub message_id: String,
54 pub role: Role,
56 pub parts: Vec<Part>,
58 #[serde(rename = "contextId", skip_serializing_if = "Option::is_none")]
60 pub context_id: Option<String>,
61 #[serde(rename = "taskId", skip_serializing_if = "Option::is_none")]
63 pub task_id: Option<String>,
64 #[serde(rename = "referenceTaskIds", skip_serializing_if = "Option::is_none")]
66 pub reference_task_ids: Option<Vec<String>>,
67 #[serde(skip_serializing_if = "Option::is_none")]
69 pub metadata: Option<HashMap<String, serde_json::Value>>,
70 #[serde(skip_serializing_if = "Option::is_none")]
72 pub extensions: Option<Vec<String>>,
73}
74
75impl Message {
76 pub fn user_text(text: impl Into<String>) -> Self {
78 Self {
79 message_id: uuid::Uuid::new_v4().to_string(),
80 role: Role::User,
81 parts: vec![Part {
82 text: Some(text.into()),
83 raw: None,
84 url: None,
85 data: None,
86 media_type: None,
87 filename: None,
88 metadata: None,
89 }],
90 context_id: None,
91 task_id: None,
92 reference_task_ids: None,
93 metadata: None,
94 extensions: None,
95 }
96 }
97
98 pub fn agent_text(text: impl Into<String>) -> Self {
100 let mut msg = Self::user_text(text);
101 msg.role = Role::Agent;
102 msg
103 }
104}
105
106#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
108pub struct Artifact {
109 #[serde(rename = "artifactId")]
111 pub artifact_id: String,
112 #[serde(skip_serializing_if = "Option::is_none")]
114 pub name: Option<String>,
115 #[serde(skip_serializing_if = "Option::is_none")]
117 pub description: Option<String>,
118 pub parts: Vec<Part>,
120 #[serde(skip_serializing_if = "Option::is_none")]
122 pub metadata: Option<HashMap<String, serde_json::Value>>,
123 #[serde(skip_serializing_if = "Option::is_none")]
125 pub extensions: Option<Vec<String>>,
126}