1use std::collections::HashMap;
12
13use derive_builder::Builder;
14use serde::{Deserialize, Serialize};
15
16use crate::error::OpenAIError;
17
18use super::{ImageDetail, ImageUrl};
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 Refusal(MessageContentRefusalObject),
118}
119
120#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
121pub struct MessageContentRefusalObject {
122 pub refusal: String,
123}
124
125#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
127pub struct MessageContentTextObject {
128 pub text: TextData,
129}
130
131#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
132pub struct TextData {
133 pub value: String,
135 pub annotations: Vec<MessageContentTextAnnotations>,
136}
137
138#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
139#[serde(tag = "type")]
140#[serde(rename_all = "snake_case")]
141pub enum MessageContentTextAnnotations {
142 FileCitation(MessageContentTextAnnotationsFileCitationObject),
144 FilePath(MessageContentTextAnnotationsFilePathObject),
146}
147
148#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
150pub struct MessageContentTextAnnotationsFileCitationObject {
151 pub text: String,
153 pub file_citation: FileCitation,
154 pub start_index: u32,
155 pub end_index: u32,
156}
157
158#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
159pub struct FileCitation {
160 pub file_id: String,
162 pub quote: Option<String>,
164}
165
166#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
167pub struct MessageContentTextAnnotationsFilePathObject {
168 pub text: String,
170 pub file_path: FilePath,
171 pub start_index: u32,
172 pub end_index: u32,
173}
174
175#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
176pub struct FilePath {
177 pub file_id: String,
179}
180
181#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
183pub struct MessageContentImageFileObject {
184 pub image_file: ImageFile,
185}
186
187#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
188pub struct ImageFile {
189 pub file_id: String,
191 pub detail: Option<ImageDetail>,
193}
194
195#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
197pub struct MessageContentImageUrlObject {
198 pub image_url: ImageUrl,
199}
200
201#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
202pub struct MessageRequestContentTextObject {
203 pub text: String,
205}
206
207#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
208#[serde(untagged)]
209pub enum CreateMessageRequestContent {
210 Content(String),
212 ContentArray(Vec<MessageContentInput>),
214}
215
216#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
217#[serde(tag = "type")]
218#[serde(rename_all = "snake_case")]
219pub enum MessageContentInput {
220 Text(MessageRequestContentTextObject),
221 ImageFile(MessageContentImageFileObject),
222 ImageUrl(MessageContentImageUrlObject),
223}
224#[derive(Clone, Serialize, Default, Debug, Deserialize, Builder, PartialEq)]
225#[builder(name = "CreateMessageRequestArgs")]
226#[builder(pattern = "mutable")]
227#[builder(setter(into, strip_option), default)]
228#[builder(derive(Debug))]
229#[builder(build_fn(error = "OpenAIError"))]
230pub struct CreateMessageRequest {
231 pub role: MessageRole,
235 pub content: CreateMessageRequestContent,
237
238 pub attachments: Option<Vec<MessageAttachment>>,
240
241 #[serde(skip_serializing_if = "Option::is_none")]
242 pub metadata: Option<HashMap<String, serde_json::Value>>,
243}
244
245#[derive(Clone, Serialize, Default, Debug, Deserialize, PartialEq)]
246pub struct ModifyMessageRequest {
247 #[serde(skip_serializing_if = "Option::is_none")]
248 pub metadata: Option<HashMap<String, serde_json::Value>>,
249}
250
251#[derive(Clone, Serialize, Default, Debug, Deserialize, PartialEq)]
252pub struct DeleteMessageResponse {
253 pub id: String,
254 pub deleted: bool,
255 pub object: String,
256}
257
258#[derive(Clone, Serialize, Default, Debug, Deserialize, PartialEq)]
259pub struct ListMessagesResponse {
260 pub object: String,
261 pub data: Vec<MessageObject>,
262 pub first_id: Option<String>,
263 pub last_id: Option<String>,
264 pub has_more: bool,
265}
266
267#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
269pub struct MessageDeltaObject {
270 pub id: String,
272 pub object: String,
274 pub delta: MessageDelta,
276}
277
278#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
279pub struct MessageDelta {
280 pub role: Option<MessageRole>,
282 pub content: Option<Vec<MessageDeltaContent>>,
284}
285
286#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
287#[serde(tag = "type")]
288#[serde(rename_all = "snake_case")]
289pub enum MessageDeltaContent {
290 ImageFile(MessageDeltaContentImageFileObject),
291 ImageUrl(MessageDeltaContentImageUrlObject),
292 Text(MessageDeltaContentTextObject),
293 Refusal(MessageDeltaContentRefusalObject),
294}
295
296#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
297pub struct MessageDeltaContentRefusalObject {
298 pub index: i32,
300 pub refusal: Option<String>,
301}
302
303#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
305pub struct MessageDeltaContentTextObject {
306 pub index: u32,
308 pub text: Option<MessageDeltaContentText>,
309}
310
311#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
312pub struct MessageDeltaContentText {
313 pub value: Option<String>,
315 pub annotations: Option<Vec<MessageDeltaContentTextAnnotations>>,
316}
317
318#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
319#[serde(tag = "type")]
320#[serde(rename_all = "snake_case")]
321pub enum MessageDeltaContentTextAnnotations {
322 FileCitation(MessageDeltaContentTextAnnotationsFileCitationObject),
323 FilePath(MessageDeltaContentTextAnnotationsFilePathObject),
324}
325
326#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
328pub struct MessageDeltaContentTextAnnotationsFileCitationObject {
329 pub index: u32,
331 pub text: Option<String>,
333 pub file_citation: Option<FileCitation>,
334 pub start_index: Option<u32>,
335 pub end_index: Option<u32>,
336}
337
338#[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}