1use std::collections::HashMap;
2
3use derive_builder::Builder;
4use serde::{Deserialize, Serialize};
5
6use crate::error::OpenAIError;
7use crate::spec::assistants::{ImageDetail, ImageUrl};
8
9#[derive(Clone, Serialize, Debug, Deserialize, PartialEq, Default)]
10#[serde(rename_all = "lowercase")]
11pub enum MessageRole {
12 #[default]
13 User,
14 Assistant,
15}
16
17#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
18#[serde(rename_all = "snake_case")]
19pub enum MessageStatus {
20 InProgress,
21 Incomplete,
22 Completed,
23}
24
25#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
26#[serde(rename_all = "snake_case")]
27pub enum MessageIncompleteDetailsType {
28 ContentFilter,
29 MaxTokens,
30 RunCancelled,
31 RunExpired,
32 RunFailed,
33}
34
35#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
36pub struct MessageIncompleteDetails {
37 pub reason: MessageIncompleteDetailsType,
39}
40
41#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
43pub struct MessageObject {
44 pub id: String,
46 pub object: String,
48 pub created_at: u64,
50 pub thread_id: String,
52
53 pub status: Option<MessageStatus>,
55
56 pub incomplete_details: Option<MessageIncompleteDetails>,
58
59 pub completed_at: Option<u64>,
61
62 pub incomplete_at: Option<u64>,
64
65 pub role: MessageRole,
67
68 pub content: Vec<MessageContent>,
70
71 pub assistant_id: Option<String>,
73
74 pub run_id: Option<String>,
76
77 pub attachments: Option<Vec<MessageAttachment>>,
79
80 pub metadata: Option<HashMap<String, serde_json::Value>>,
81}
82
83#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
84pub struct MessageAttachment {
85 pub file_id: String,
87 pub tools: Vec<MessageAttachmentTool>,
89}
90
91#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
92#[serde(tag = "type")]
93#[serde(rename_all = "snake_case")]
94pub enum MessageAttachmentTool {
95 CodeInterpreter,
96 FileSearch,
97}
98
99#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
100#[serde(tag = "type")]
101#[serde(rename_all = "snake_case")]
102pub enum MessageContent {
103 Text(MessageContentTextObject),
104 ImageFile(MessageContentImageFileObject),
105 ImageUrl(MessageContentImageUrlObject),
106 Refusal(MessageContentRefusalObject),
107}
108
109#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
110pub struct MessageContentRefusalObject {
111 pub refusal: String,
112}
113
114#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
116pub struct MessageContentTextObject {
117 pub text: TextData,
118}
119
120#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
121pub struct TextData {
122 pub value: String,
124 pub annotations: Vec<MessageContentTextAnnotations>,
125}
126
127#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
128#[serde(tag = "type")]
129#[serde(rename_all = "snake_case")]
130pub enum MessageContentTextAnnotations {
131 FileCitation(MessageContentTextAnnotationsFileCitationObject),
135 FilePath(MessageContentTextAnnotationsFilePathObject),
138}
139
140#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
144pub struct MessageContentTextAnnotationsFileCitationObject {
145 pub text: String,
147 pub file_citation: FileCitation,
148 pub start_index: u32,
149 pub end_index: u32,
150}
151
152#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
153pub struct FileCitation {
154 pub file_id: String,
156 pub quote: Option<String>,
158}
159
160#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
161pub struct MessageContentTextAnnotationsFilePathObject {
162 pub text: String,
164 pub file_path: FilePath,
165 pub start_index: u32,
166 pub end_index: u32,
167}
168
169#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
170pub struct FilePath {
171 pub file_id: String,
173}
174
175#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
177pub struct MessageContentImageFileObject {
178 pub image_file: ImageFile,
179}
180
181#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
182pub struct ImageFile {
183 pub file_id: String,
185 pub detail: Option<ImageDetail>,
188}
189
190#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
192pub struct MessageContentImageUrlObject {
193 pub image_url: ImageUrl,
194}
195
196#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
197pub struct MessageRequestContentTextObject {
198 pub text: String,
200}
201
202#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
203#[serde(untagged)]
204pub enum CreateMessageRequestContent {
205 Content(String),
207 ContentArray(Vec<MessageContentInput>),
209}
210
211#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
212#[serde(tag = "type")]
213#[serde(rename_all = "snake_case")]
214pub enum MessageContentInput {
215 Text(MessageRequestContentTextObject),
216 ImageFile(MessageContentImageFileObject),
217 ImageUrl(MessageContentImageUrlObject),
218}
219#[derive(Clone, Serialize, Default, Debug, Deserialize, Builder, PartialEq)]
220#[builder(name = "CreateMessageRequestArgs")]
221#[builder(pattern = "mutable")]
222#[builder(setter(into, strip_option), default)]
223#[builder(derive(Debug))]
224#[builder(build_fn(error = "OpenAIError"))]
225pub struct CreateMessageRequest {
226 pub role: MessageRole,
232 pub content: CreateMessageRequestContent,
234
235 pub attachments: Option<Vec<MessageAttachment>>,
237
238 #[serde(skip_serializing_if = "Option::is_none")]
239 pub metadata: Option<HashMap<String, serde_json::Value>>,
240}
241
242#[derive(Clone, Serialize, Default, Debug, Deserialize, PartialEq)]
243pub struct ModifyMessageRequest {
244 #[serde(skip_serializing_if = "Option::is_none")]
245 pub metadata: Option<HashMap<String, serde_json::Value>>,
246}
247
248#[derive(Clone, Serialize, Default, Debug, Deserialize, PartialEq)]
249pub struct DeleteMessageResponse {
250 pub id: String,
251 pub deleted: bool,
252 pub object: String,
253}
254
255#[derive(Clone, Serialize, Default, Debug, Deserialize, PartialEq)]
256pub struct ListMessagesResponse {
257 pub object: String,
258 pub data: Vec<MessageObject>,
259 pub first_id: Option<String>,
260 pub last_id: Option<String>,
261 pub has_more: bool,
262}
263
264#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
266pub struct MessageDeltaObject {
267 pub id: String,
269 pub object: String,
271 pub delta: MessageDelta,
273}
274
275#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
276pub struct MessageDelta {
277 pub role: Option<MessageRole>,
279 pub content: Option<Vec<MessageDeltaContent>>,
281}
282
283#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
284#[serde(tag = "type")]
285#[serde(rename_all = "snake_case")]
286pub enum MessageDeltaContent {
287 ImageFile(MessageDeltaContentImageFileObject),
288 ImageUrl(MessageDeltaContentImageUrlObject),
289 Text(MessageDeltaContentTextObject),
290 Refusal(MessageDeltaContentRefusalObject),
291}
292
293#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
294pub struct MessageDeltaContentRefusalObject {
295 pub index: u32,
297 pub refusal: Option<String>,
298}
299
300#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
302pub struct MessageDeltaContentTextObject {
303 pub index: u32,
305 pub text: Option<MessageDeltaContentText>,
306}
307
308#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
309pub struct MessageDeltaContentText {
310 pub value: Option<String>,
312 pub annotations: Option<Vec<MessageDeltaContentTextAnnotations>>,
313}
314
315#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
316#[serde(tag = "type")]
317#[serde(rename_all = "snake_case")]
318pub enum MessageDeltaContentTextAnnotations {
319 FileCitation(MessageDeltaContentTextAnnotationsFileCitationObject),
320 FilePath(MessageDeltaContentTextAnnotationsFilePathObject),
321}
322
323#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
327pub struct MessageDeltaContentTextAnnotationsFileCitationObject {
328 pub index: u32,
330 pub text: Option<String>,
332 pub file_citation: Option<FileCitation>,
333 pub start_index: Option<u32>,
334 pub end_index: Option<u32>,
335}
336
337#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
340pub struct MessageDeltaContentTextAnnotationsFilePathObject {
341 pub index: u32,
343 pub text: Option<String>,
345 pub file_path: Option<FilePath>,
346 pub start_index: Option<u32>,
347 pub end_index: Option<u32>,
348}
349
350#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
352pub struct MessageDeltaContentImageFileObject {
353 pub index: u32,
355
356 pub image_file: Option<ImageFile>,
357}
358
359#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
360pub struct MessageDeltaContentImageUrlObject {
361 pub index: u32,
363
364 pub image_url: Option<ImageUrl>,
365}