async_openai/
vector_store_files.rs1use serde::Serialize;
2
3use crate::{
4 config::Config,
5 error::OpenAIError,
6 types::{
7 CreateVectorStoreFileRequest, DeleteVectorStoreFileResponse, ListVectorStoreFilesResponse,
8 VectorStoreFileContentResponse, VectorStoreFileObject,
9 },
10 Client,
11};
12
13pub struct VectorStoreFiles<'c, C: Config> {
17 client: &'c Client<C>,
18 pub vector_store_id: String,
19}
20
21impl<'c, C: Config> VectorStoreFiles<'c, C> {
22 pub fn new(client: &'c Client<C>, vector_store_id: &str) -> Self {
23 Self {
24 client,
25 vector_store_id: vector_store_id.into(),
26 }
27 }
28
29 #[crate::byot(T0 = serde::Serialize, R = serde::de::DeserializeOwned)]
31 pub async fn create(
32 &self,
33 request: CreateVectorStoreFileRequest,
34 ) -> Result<VectorStoreFileObject, OpenAIError> {
35 self.client
36 .post(
37 &format!("/vector_stores/{}/files", &self.vector_store_id),
38 request,
39 )
40 .await
41 }
42
43 #[crate::byot(T0 = std::fmt::Display, R = serde::de::DeserializeOwned)]
45 pub async fn retrieve(&self, file_id: &str) -> Result<VectorStoreFileObject, OpenAIError> {
46 self.client
47 .get(&format!(
48 "/vector_stores/{}/files/{file_id}",
49 &self.vector_store_id
50 ))
51 .await
52 }
53
54 #[crate::byot(T0 = std::fmt::Display, R = serde::de::DeserializeOwned)]
56 pub async fn delete(
57 &self,
58 file_id: &str,
59 ) -> Result<DeleteVectorStoreFileResponse, OpenAIError> {
60 self.client
61 .delete(&format!(
62 "/vector_stores/{}/files/{file_id}",
63 &self.vector_store_id
64 ))
65 .await
66 }
67
68 #[crate::byot(T0 = serde::Serialize, R = serde::de::DeserializeOwned)]
70 pub async fn list<Q>(&self, query: &Q) -> Result<ListVectorStoreFilesResponse, OpenAIError>
71 where
72 Q: Serialize + ?Sized,
73 {
74 self.client
75 .get_with_query(
76 &format!("/vector_stores/{}/files", &self.vector_store_id),
77 &query,
78 )
79 .await
80 }
81
82 #[crate::byot(T0 = std::fmt::Display, R = serde::de::DeserializeOwned)]
84 pub async fn retrieve_file_content(
85 &self,
86 file_id: &str,
87 ) -> Result<VectorStoreFileContentResponse, OpenAIError> {
88 self.client
89 .get(&format!(
90 "/vector_stores/{}/files/{file_id}/content",
91 &self.vector_store_id
92 ))
93 .await
94 }
95}
96
97#[cfg(test)]
98mod tests {
99 use crate::types::{CreateFileRequest, CreateVectorStoreRequest, FileInput, FilePurpose};
100 use crate::Client;
101
102 #[tokio::test]
103 async fn vector_store_file_creation_and_deletion(
104 ) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
105 let client = Client::new();
106
107 let file_handle = client
109 .files()
110 .create(CreateFileRequest {
111 file: FileInput::from_vec_u8(
112 String::from("meow.txt"),
113 String::from(":3").into_bytes(),
114 ),
115 purpose: FilePurpose::Assistants,
116 })
117 .await?;
118
119 let vector_store_handle = client
121 .vector_stores()
122 .create(CreateVectorStoreRequest {
123 file_ids: Some(vec![file_handle.id.clone()]),
124 name: None,
125 expires_after: None,
126 chunking_strategy: None,
127 metadata: None,
128 })
129 .await?;
130 let vector_store_file = client
131 .vector_stores()
132 .files(&vector_store_handle.id)
133 .retrieve(&file_handle.id)
134 .await?;
135
136 assert_eq!(vector_store_file.id, file_handle.id);
137 client
139 .vector_stores()
140 .delete(&vector_store_handle.id)
141 .await?;
142
143 client.files().delete(&file_handle.id).await?;
145
146 Ok(())
147 }
148}