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
13/// Vector store files represent files inside a vector store.
14///
15/// Related guide: [File Search](https://platform.openai.com/docs/assistants/tools/file-search)
16pub 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    /// Create a vector store file by attaching a [File](https://platform.openai.com/docs/api-reference/files) to a [vector store](https://platform.openai.com/docs/api-reference/vector-stores/object).
30    #[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    /// Retrieves a vector store file.
44    #[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    /// Delete a vector store file. This will remove the file from the vector store but the file itself will not be deleted. To delete the file, use the [delete file](https://platform.openai.com/docs/api-reference/files/delete) endpoint.
55    #[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    /// Returns a list of vector store files.
69    #[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        // Create a file
94        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        // Create a vector store
106        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        // Delete the vector store
124        client
125            .vector_stores()
126            .delete(&vector_store_handle.id)
127            .await?;
128
129        // Delete the file
130        client.files().delete(&file_handle.id).await?;
131
132        Ok(())
133    }
134}