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        VectorStoreFileContentResponse, 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    /// Retrieve the parsed contents of a vector store file.
83    #[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        // Create a file
108        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        // Create a vector store
120        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        // Delete the vector store
138        client
139            .vector_stores()
140            .delete(&vector_store_handle.id)
141            .await?;
142
143        // Delete the file
144        client.files().delete(&file_handle.id).await?;
145
146        Ok(())
147    }
148}