1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5#[derive(Clone, Debug, Serialize, Deserialize)]
19pub struct CreateMessageRequest {
20 pub role: String,
22
23 pub content: String,
25
26 #[serde(skip_serializing_if = "Option::is_none")]
28 pub file_ids: Option<Vec<String>>,
29
30 #[serde(skip_serializing_if = "Option::is_none")]
32 pub metadata: Option<HashMap<String, String>>,
33}
34
35impl Default for CreateMessageRequest {
36 fn default() -> Self {
37 Self {
38 role: "user".to_string(),
39 content: String::new(),
40 file_ids: None,
41 metadata: None,
42 }
43 }
44}
45
46#[derive(Clone, Debug, Default, Serialize, Deserialize)]
48pub struct ModifyMessageRequest {
49 #[serde(skip_serializing_if = "Option::is_none")]
51 pub metadata: Option<HashMap<String, String>>,
52}
53
54#[derive(Clone, Debug, Serialize, Deserialize)]
56pub struct Message {
57 pub id: String,
59
60 pub object: String,
62
63 pub created_at: i64,
65
66 pub thread_id: String,
68
69 pub role: String,
71
72 pub content: Vec<MessageContent>,
74
75 pub assistant_id: Option<String>,
77
78 pub run_id: Option<String>,
80
81 pub file_ids: Vec<String>,
83
84 pub metadata: HashMap<String, String>,
86}
87
88#[derive(Clone, Debug, Serialize, Deserialize)]
90#[serde(tag = "type")]
91pub enum MessageContent {
92 #[serde(rename = "text")]
93 Text { text: TextContent },
94 #[serde(rename = "image_file")]
95 ImageFile { image_file: ImageFileContent },
96}
97
98#[derive(Clone, Debug, Serialize, Deserialize)]
100pub struct TextContent {
101 pub value: String,
103
104 pub annotations: Vec<Annotation>,
106}
107
108#[derive(Clone, Debug, Serialize, Deserialize)]
110pub struct ImageFileContent {
111 pub file_id: String,
113}
114
115#[derive(Clone, Debug, Serialize, Deserialize)]
117#[serde(tag = "type")]
118pub enum Annotation {
119 #[serde(rename = "file_citation")]
120 FileCitation {
121 text: String,
122 file_citation: FileCitation,
123 start_index: usize,
124 end_index: usize,
125 },
126 #[serde(rename = "file_path")]
127 FilePath {
128 text: String,
129 file_path: FilePathAnnotation,
130 start_index: usize,
131 end_index: usize,
132 },
133}
134
135#[derive(Clone, Debug, Serialize, Deserialize)]
137pub struct FileCitation {
138 pub file_id: String,
140
141 pub quote: String,
143}
144
145#[derive(Clone, Debug, Serialize, Deserialize)]
147pub struct FilePathAnnotation {
148 pub file_id: String,
150}
151
152#[derive(Clone, Debug, Serialize, Deserialize)]
154pub struct ListMessagesResponse {
155 pub object: String,
156 pub data: Vec<Message>,
157 pub first_id: Option<String>,
158 pub last_id: Option<String>,
159 pub has_more: bool,
160}
161
162#[derive(Clone, Debug, Serialize, Deserialize)]
164pub struct MessageFile {
165 pub id: String,
167
168 pub object: String,
170
171 pub created_at: i64,
173
174 pub message_id: String,
176}
177
178#[derive(Clone, Debug, Serialize, Deserialize)]
180pub struct ListMessageFilesResponse {
181 pub object: String,
182 pub data: Vec<MessageFile>,
183 pub first_id: Option<String>,
184 pub last_id: Option<String>,
185 pub has_more: bool,
186}