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