1use std::collections::HashMap;
12
13use derive_builder::Builder;
14use serde::{Deserialize, Serialize};
15
16use crate::error::OpenAIError;
17
18use super::{ImageDetail, ImageUrl, VideoUrl};
19
20#[derive(Clone, Serialize, Debug, Deserialize, PartialEq, Default)]
21#[serde(rename_all = "lowercase")]
22pub enum MessageRole {
23 #[default]
24 User,
25 Assistant,
26}
27
28#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
29#[serde(rename_all = "snake_case")]
30pub enum MessageStatus {
31 InProgress,
32 Incomplete,
33 Completed,
34}
35
36#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
37#[serde(rename_all = "snake_case")]
38pub enum MessageIncompleteDetailsType {
39 ContentFilter,
40 MaxTokens,
41 RunCancelled,
42 RunExpired,
43 RunFailed,
44}
45
46#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
47pub struct MessageIncompleteDetails {
48 pub reason: MessageIncompleteDetailsType,
50}
51
52#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
54pub struct MessageObject {
55 pub id: String,
57 pub object: String,
59 pub created_at: i32,
61 pub thread_id: String,
63
64 pub status: Option<MessageStatus>,
66
67 pub incomplete_details: Option<MessageIncompleteDetails>,
69
70 pub completed_at: Option<u32>,
72
73 pub incomplete_at: Option<u32>,
75
76 pub role: MessageRole,
78
79 pub content: Vec<MessageContent>,
81
82 pub assistant_id: Option<String>,
84
85 pub run_id: Option<String>,
87
88 pub attachments: Option<Vec<MessageAttachment>>,
90
91 pub metadata: Option<HashMap<String, serde_json::Value>>,
92}
93
94#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
95pub struct MessageAttachment {
96 pub file_id: String,
98 pub tools: Vec<MessageAttachmentTool>,
100}
101
102#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
103#[serde(tag = "type")]
104#[serde(rename_all = "snake_case")]
105pub enum MessageAttachmentTool {
106 CodeInterpreter,
107 FileSearch,
108}
109
110#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
111#[serde(tag = "type")]
112#[serde(rename_all = "snake_case")]
113pub enum MessageContent {
114 Text(MessageContentTextObject),
115 ImageFile(MessageContentImageFileObject),
116 ImageUrl(MessageContentImageUrlObject),
117 VideoUrl(MessageContentVideoUrlObject),
118 Refusal(MessageContentRefusalObject),
119}
120
121#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
122pub struct MessageContentRefusalObject {
123 pub refusal: String,
124}
125
126#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
128pub struct MessageContentTextObject {
129 pub text: TextData,
130}
131
132#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
133pub struct TextData {
134 pub value: String,
136 pub annotations: Vec<MessageContentTextAnnotations>,
137}
138
139#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
140#[serde(tag = "type")]
141#[serde(rename_all = "snake_case")]
142pub enum MessageContentTextAnnotations {
143 FileCitation(MessageContentTextAnnotationsFileCitationObject),
145 FilePath(MessageContentTextAnnotationsFilePathObject),
147}
148
149#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
151pub struct MessageContentTextAnnotationsFileCitationObject {
152 pub text: String,
154 pub file_citation: FileCitation,
155 pub start_index: u32,
156 pub end_index: u32,
157}
158
159#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
160pub struct FileCitation {
161 pub file_id: String,
163 pub quote: Option<String>,
165}
166
167#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
168pub struct MessageContentTextAnnotationsFilePathObject {
169 pub text: String,
171 pub file_path: FilePath,
172 pub start_index: u32,
173 pub end_index: u32,
174}
175
176#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
177pub struct FilePath {
178 pub file_id: String,
180}
181
182#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
184pub struct MessageContentImageFileObject {
185 pub image_file: ImageFile,
186}
187
188#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
189pub struct ImageFile {
190 pub file_id: String,
192 pub detail: Option<ImageDetail>,
194}
195
196#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
198pub struct MessageContentImageUrlObject {
199 pub image_url: ImageUrl,
200}
201
202#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
204pub struct MessageContentVideoUrlObject {
205 pub video_url: VideoUrl,
206}
207
208#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
209pub struct MessageRequestContentTextObject {
210 pub text: String,
212}
213
214#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
215#[serde(untagged)]
216pub enum CreateMessageRequestContent {
217 Content(String),
219 ContentArray(Vec<MessageContentInput>),
221}
222
223#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
224#[serde(tag = "type")]
225#[serde(rename_all = "snake_case")]
226pub enum MessageContentInput {
227 Text(MessageRequestContentTextObject),
228 ImageFile(MessageContentImageFileObject),
229 ImageUrl(MessageContentImageUrlObject),
230 VideoUrl(MessageContentVideoUrlObject),
231}
232#[derive(Clone, Serialize, Default, Debug, Deserialize, Builder, PartialEq)]
233#[builder(name = "CreateMessageRequestArgs")]
234#[builder(pattern = "mutable")]
235#[builder(setter(into, strip_option), default)]
236#[builder(derive(Debug))]
237#[builder(build_fn(error = "OpenAIError"))]
238pub struct CreateMessageRequest {
239 pub role: MessageRole,
243 pub content: CreateMessageRequestContent,
245
246 pub attachments: Option<Vec<MessageAttachment>>,
248
249 #[serde(skip_serializing_if = "Option::is_none")]
250 pub metadata: Option<HashMap<String, serde_json::Value>>,
251}
252
253#[derive(Clone, Serialize, Default, Debug, Deserialize, PartialEq)]
254pub struct ModifyMessageRequest {
255 #[serde(skip_serializing_if = "Option::is_none")]
256 pub metadata: Option<HashMap<String, serde_json::Value>>,
257}
258
259#[derive(Clone, Serialize, Default, Debug, Deserialize, PartialEq)]
260pub struct DeleteMessageResponse {
261 pub id: String,
262 pub deleted: bool,
263 pub object: String,
264}
265
266#[derive(Clone, Serialize, Default, Debug, Deserialize, PartialEq)]
267pub struct ListMessagesResponse {
268 pub object: String,
269 pub data: Vec<MessageObject>,
270 pub first_id: Option<String>,
271 pub last_id: Option<String>,
272 pub has_more: bool,
273}
274
275#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
277pub struct MessageDeltaObject {
278 pub id: String,
280 pub object: String,
282 pub delta: MessageDelta,
284}
285
286#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
287pub struct MessageDelta {
288 pub role: Option<MessageRole>,
290 pub content: Option<Vec<MessageDeltaContent>>,
292}
293
294#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
295#[serde(tag = "type")]
296#[serde(rename_all = "snake_case")]
297pub enum MessageDeltaContent {
298 ImageFile(MessageDeltaContentImageFileObject),
299 ImageUrl(MessageDeltaContentImageUrlObject),
300 VideoUrl(MessageDeltaContentVideoUrlObject),
301 Text(MessageDeltaContentTextObject),
302 Refusal(MessageDeltaContentRefusalObject),
303}
304
305#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
306pub struct MessageDeltaContentRefusalObject {
307 pub index: i32,
309 pub refusal: Option<String>,
310}
311
312#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
314pub struct MessageDeltaContentTextObject {
315 pub index: u32,
317 pub text: Option<MessageDeltaContentText>,
318}
319
320#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
321pub struct MessageDeltaContentText {
322 pub value: Option<String>,
324 pub annotations: Option<Vec<MessageDeltaContentTextAnnotations>>,
325}
326
327#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
328#[serde(tag = "type")]
329#[serde(rename_all = "snake_case")]
330pub enum MessageDeltaContentTextAnnotations {
331 FileCitation(MessageDeltaContentTextAnnotationsFileCitationObject),
332 FilePath(MessageDeltaContentTextAnnotationsFilePathObject),
333}
334
335#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
337pub struct MessageDeltaContentTextAnnotationsFileCitationObject {
338 pub index: u32,
340 pub text: Option<String>,
342 pub file_citation: Option<FileCitation>,
343 pub start_index: Option<u32>,
344 pub end_index: Option<u32>,
345}
346
347#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
349pub struct MessageDeltaContentTextAnnotationsFilePathObject {
350 pub index: u32,
352 pub text: Option<String>,
354 pub file_path: Option<FilePath>,
355 pub start_index: Option<u32>,
356 pub end_index: Option<u32>,
357}
358
359#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
361pub struct MessageDeltaContentImageFileObject {
362 pub index: u32,
364
365 pub image_file: Option<ImageFile>,
366}
367
368#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
369pub struct MessageDeltaContentImageUrlObject {
370 pub index: u32,
372
373 pub image_url: Option<ImageUrl>,
374}
375
376#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
377pub struct MessageDeltaContentVideoUrlObject {
378 pub index: u32,
380
381 pub video_url: Option<VideoUrl>,
382}