async_openai/
vector_store_files.rs

1use 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
14/// Vector store files represent files inside a vector store.
15///
16/// Related guide: [File Search](https://platform.openai.com/docs/assistants/tools/file-search)
17pub 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    /// 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).
31    #[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    /// Retrieves a vector store file.
45    #[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    /// 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.
56    #[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    /// Returns a list of vector store files.
70    #[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    /// Update attributes on a vector store file.
84    #[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    /// Retrieve the parsed contents of a vector store file.
99    #[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        // Create a file
125        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        // Create a vector store
138        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        // Delete the vector store
157        client
158            .vector_stores()
159            .delete(&vector_store_handle.id)
160            .await?;
161
162        // Delete the file
163        client.files().delete(&file_handle.id).await?;
164
165        Ok(())
166    }
167}