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::files::{CreateFileRequest, FileInput, FilePurpose};
100 use crate::types::CreateVectorStoreRequest;
101 use crate::Client;
102
103 #[tokio::test]
104 async fn vector_store_file_creation_and_deletion(
105 ) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
106 let client = Client::new();
107
108 let file_handle = client
110 .files()
111 .create(CreateFileRequest {
112 file: FileInput::from_vec_u8(
113 String::from("meow.txt"),
114 String::from(":3").into_bytes(),
115 ),
116 purpose: FilePurpose::Assistants,
117 expires_after: None,
118 })
119 .await?;
120
121 let vector_store_handle = client
123 .vector_stores()
124 .create(CreateVectorStoreRequest {
125 file_ids: Some(vec![file_handle.id.clone()]),
126 name: None,
127 expires_after: None,
128 chunking_strategy: None,
129 metadata: None,
130 })
131 .await?;
132 let vector_store_file = client
133 .vector_stores()
134 .files(&vector_store_handle.id)
135 .retrieve(&file_handle.id)
136 .await?;
137
138 assert_eq!(vector_store_file.id, file_handle.id);
139 client
141 .vector_stores()
142 .delete(&vector_store_handle.id)
143 .await?;
144
145 client.files().delete(&file_handle.id).await?;
147
148 Ok(())
149 }
150}