1use std::collections::HashMap;
12
13use derive_builder::Builder;
14use serde::{Deserialize, Serialize};
15
16use crate::error::OpenAIError;
17
18use super::{AudioUrl, 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 AudioUrl(MessageContentAudioUrlObject),
119 Refusal(MessageContentRefusalObject),
120}
121
122#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
123pub struct MessageContentRefusalObject {
124 pub refusal: String,
125}
126
127#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
129pub struct MessageContentTextObject {
130 pub text: TextData,
131}
132
133#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
134pub struct TextData {
135 pub value: String,
137 pub annotations: Vec<MessageContentTextAnnotations>,
138}
139
140#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
141#[serde(tag = "type")]
142#[serde(rename_all = "snake_case")]
143pub enum MessageContentTextAnnotations {
144 FileCitation(MessageContentTextAnnotationsFileCitationObject),
146 FilePath(MessageContentTextAnnotationsFilePathObject),
148}
149
150#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
152pub struct MessageContentTextAnnotationsFileCitationObject {
153 pub text: String,
155 pub file_citation: FileCitation,
156 pub start_index: u32,
157 pub end_index: u32,
158}
159
160#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
161pub struct FileCitation {
162 pub file_id: String,
164 pub quote: Option<String>,
166}
167
168#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
169pub struct MessageContentTextAnnotationsFilePathObject {
170 pub text: String,
172 pub file_path: FilePath,
173 pub start_index: u32,
174 pub end_index: u32,
175}
176
177#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
178pub struct FilePath {
179 pub file_id: String,
181}
182
183#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
185pub struct MessageContentImageFileObject {
186 pub image_file: ImageFile,
187}
188
189#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
190pub struct ImageFile {
191 pub file_id: String,
193 pub detail: Option<ImageDetail>,
195}
196
197#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
199pub struct MessageContentImageUrlObject {
200 pub image_url: ImageUrl,
201}
202
203#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
205pub struct MessageContentVideoUrlObject {
206 pub video_url: VideoUrl,
207}
208
209#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
210pub struct MessageContentAudioUrlObject {
211 pub audio_url: AudioUrl,
212}
213
214#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
215pub struct MessageRequestContentTextObject {
216 pub text: String,
218}
219
220#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
221#[serde(untagged)]
222pub enum CreateMessageRequestContent {
223 Content(String),
225 ContentArray(Vec<MessageContentInput>),
227}
228
229#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
230#[serde(tag = "type")]
231#[serde(rename_all = "snake_case")]
232pub enum MessageContentInput {
233 Text(MessageRequestContentTextObject),
234 ImageFile(MessageContentImageFileObject),
235 ImageUrl(MessageContentImageUrlObject),
236 VideoUrl(MessageContentVideoUrlObject),
237 AudioUrl(MessageContentAudioUrlObject),
238}
239#[derive(Clone, Serialize, Default, Debug, Deserialize, Builder, PartialEq)]
240#[builder(name = "CreateMessageRequestArgs")]
241#[builder(pattern = "mutable")]
242#[builder(setter(into, strip_option), default)]
243#[builder(derive(Debug))]
244#[builder(build_fn(error = "OpenAIError"))]
245pub struct CreateMessageRequest {
246 pub role: MessageRole,
250 pub content: CreateMessageRequestContent,
252
253 pub attachments: Option<Vec<MessageAttachment>>,
255
256 #[serde(skip_serializing_if = "Option::is_none")]
257 pub metadata: Option<HashMap<String, serde_json::Value>>,
258}
259
260#[derive(Clone, Serialize, Default, Debug, Deserialize, PartialEq)]
261pub struct ModifyMessageRequest {
262 #[serde(skip_serializing_if = "Option::is_none")]
263 pub metadata: Option<HashMap<String, serde_json::Value>>,
264}
265
266#[derive(Clone, Serialize, Default, Debug, Deserialize, PartialEq)]
267pub struct DeleteMessageResponse {
268 pub id: String,
269 pub deleted: bool,
270 pub object: String,
271}
272
273#[derive(Clone, Serialize, Default, Debug, Deserialize, PartialEq)]
274pub struct ListMessagesResponse {
275 pub object: String,
276 pub data: Vec<MessageObject>,
277 pub first_id: Option<String>,
278 pub last_id: Option<String>,
279 pub has_more: bool,
280}
281
282#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
284pub struct MessageDeltaObject {
285 pub id: String,
287 pub object: String,
289 pub delta: MessageDelta,
291}
292
293#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
294pub struct MessageDelta {
295 pub role: Option<MessageRole>,
297 pub content: Option<Vec<MessageDeltaContent>>,
299}
300
301#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
302#[serde(tag = "type")]
303#[serde(rename_all = "snake_case")]
304pub enum MessageDeltaContent {
305 ImageFile(MessageDeltaContentImageFileObject),
306 ImageUrl(MessageDeltaContentImageUrlObject),
307 VideoUrl(MessageDeltaContentVideoUrlObject),
308 AudioUrl(MessageDeltaContentAudioUrlObject),
309 Text(MessageDeltaContentTextObject),
310 Refusal(MessageDeltaContentRefusalObject),
311}
312
313#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
314pub struct MessageDeltaContentRefusalObject {
315 pub index: i32,
317 pub refusal: Option<String>,
318}
319
320#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
322pub struct MessageDeltaContentTextObject {
323 pub index: u32,
325 pub text: Option<MessageDeltaContentText>,
326}
327
328#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
329pub struct MessageDeltaContentText {
330 pub value: Option<String>,
332 pub annotations: Option<Vec<MessageDeltaContentTextAnnotations>>,
333}
334
335#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
336#[serde(tag = "type")]
337#[serde(rename_all = "snake_case")]
338pub enum MessageDeltaContentTextAnnotations {
339 FileCitation(MessageDeltaContentTextAnnotationsFileCitationObject),
340 FilePath(MessageDeltaContentTextAnnotationsFilePathObject),
341}
342
343#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
345pub struct MessageDeltaContentTextAnnotationsFileCitationObject {
346 pub index: u32,
348 pub text: Option<String>,
350 pub file_citation: Option<FileCitation>,
351 pub start_index: Option<u32>,
352 pub end_index: Option<u32>,
353}
354
355#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
357pub struct MessageDeltaContentTextAnnotationsFilePathObject {
358 pub index: u32,
360 pub text: Option<String>,
362 pub file_path: Option<FilePath>,
363 pub start_index: Option<u32>,
364 pub end_index: Option<u32>,
365}
366
367#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
369pub struct MessageDeltaContentImageFileObject {
370 pub index: u32,
372
373 pub image_file: Option<ImageFile>,
374}
375
376#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
377pub struct MessageDeltaContentImageUrlObject {
378 pub index: u32,
380
381 pub image_url: Option<ImageUrl>,
382}
383
384#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
385pub struct MessageDeltaContentVideoUrlObject {
386 pub index: u32,
388
389 pub video_url: Option<VideoUrl>,
390}
391
392#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
393pub struct MessageDeltaContentAudioUrlObject {
394 pub index: u32,
396
397 pub audio_url: Option<AudioUrl>,
398}