async_openai/
vector_store_files.rs
1use serde::Serialize;
2
3use crate::{
4 config::Config,
5 error::OpenAIError,
6 types::{
7 CreateVectorStoreFileRequest, DeleteVectorStoreFileResponse, ListVectorStoreFilesResponse,
8 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
83#[cfg(test)]
84mod tests {
85 use crate::types::{CreateFileRequest, CreateVectorStoreRequest, FileInput, FilePurpose};
86 use crate::Client;
87
88 #[tokio::test]
89 async fn vector_store_file_creation_and_deletion(
90 ) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
91 let client = Client::new();
92
93 let file_handle = client
95 .files()
96 .create(CreateFileRequest {
97 file: FileInput::from_vec_u8(
98 String::from("meow.txt"),
99 String::from(":3").into_bytes(),
100 ),
101 purpose: FilePurpose::Assistants,
102 })
103 .await?;
104
105 let vector_store_handle = client
107 .vector_stores()
108 .create(CreateVectorStoreRequest {
109 file_ids: Some(vec![file_handle.id.clone()]),
110 name: None,
111 expires_after: None,
112 chunking_strategy: None,
113 metadata: None,
114 })
115 .await?;
116 let vector_store_file = client
117 .vector_stores()
118 .files(&vector_store_handle.id)
119 .retrieve(&file_handle.id)
120 .await?;
121
122 assert_eq!(vector_store_file.id, file_handle.id);
123 client
125 .vector_stores()
126 .delete(&vector_store_handle.id)
127 .await?;
128
129 client.files().delete(&file_handle.id).await?;
131
132 Ok(())
133 }
134}