1use crate::client::OpenAI;
4use crate::interfaces::files;
5use crate::shared::response_wrapper::OpenAIResponse;
6use reqwest::multipart::Form;
7
8pub struct Files<'a> {
9 openai: &'a OpenAI,
10}
11
12impl<'a> Files<'a> {
13 pub fn new(openai: &'a OpenAI) -> Self {
14 Self { openai }
15 }
16 pub async fn list(&self) -> OpenAIResponse<files::FileListResponse> {
18 self.openai.get("/files", &()).await
19 }
20
21 pub async fn upload(
25 &self,
26 req: &files::UploadFileRequest,
27 ) -> OpenAIResponse<files::FileResponse> {
28 let file_part = reqwest::multipart::Part::stream(req.file.buffer.clone())
29 .file_name(req.file.filename.clone())
30 .mime_str("application/octet-stream")
31 .unwrap();
32
33 let form = Form::new()
34 .part("file", file_part)
35 .text("purpose", req.purpose.to_string());
36
37 self.openai.post_form("/files", form).await
38 }
39
40 pub async fn delete(&self, file_id: &str) -> OpenAIResponse<files::DeleteFileResponse> {
46 self.openai.delete(&format!("/files/{file_id}"), &()).await
47 }
48
49 pub async fn retrieve(&self, file_id: &str) -> OpenAIResponse<files::FileResponse> {
55 self.openai.get(&format!("/files/{file_id}"), &()).await
56 }
57
58 pub async fn retrieve_content(&self, file_id: &str) -> OpenAIResponse<String> {
66 self.openai
67 .get(&format!("/files/{file_id}/content"), &())
68 .await
69 }
70}