1use std::collections::HashMap;
2
3use derive_builder::Builder;
4use serde::{Deserialize, Serialize};
5
6use crate::error::OpenAIError;
7
8use super::StaticChunkingStrategy;
9
10#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
11#[builder(name = "CreateVectorStoreRequestBuilder")]
12#[builder(pattern = "mutable")]
13#[builder(setter(into, strip_option), default)]
14#[builder(derive(Debug))]
15#[builder(build_fn(error = "OpenAIError"))]
16pub struct CreateVectorStoreRequest {
17 #[serde(skip_serializing_if = "Option::is_none")]
19 pub file_ids: Option<Vec<String>>,
20 #[serde(skip_serializing_if = "Option::is_none")]
22 pub name: Option<String>,
23
24 #[serde(skip_serializing_if = "Option::is_none")]
26 pub expires_after: Option<VectorStoreExpirationAfter>,
27
28 #[serde(skip_serializing_if = "Option::is_none")]
30 pub chunking_strategy: Option<VectorStoreChunkingStrategy>,
31
32 #[serde(skip_serializing_if = "Option::is_none")]
34 pub metadata: Option<HashMap<String, serde_json::Value>>,
35}
36
37#[derive(Debug, Serialize, Deserialize, Default, Clone, PartialEq)]
38#[serde(tag = "type")]
39pub enum VectorStoreChunkingStrategy {
40 #[default]
42 #[serde(rename = "auto")]
43 Auto,
44 #[serde(rename = "static")]
45 Static {
46 #[serde(rename = "static")]
47 config: StaticChunkingStrategy,
48 },
49}
50
51#[derive(Debug, Serialize, Deserialize, Default, Clone, PartialEq)]
53pub struct VectorStoreExpirationAfter {
54 pub anchor: String,
56 pub days: u16, }
59
60#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
62pub struct VectorStoreObject {
63 pub id: String,
65 pub object: String,
67 pub created_at: u32,
69 pub name: Option<String>,
71 pub usage_bytes: u64,
73 pub file_counts: VectorStoreFileCounts,
74 pub status: VectorStoreStatus,
76 pub expires_after: Option<VectorStoreExpirationAfter>,
77 pub expires_at: Option<u32>,
79 pub last_active_at: Option<u32>,
81
82 pub metadata: Option<HashMap<String, serde_json::Value>>,
84}
85
86#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
87#[serde(rename_all = "snake_case")]
88pub enum VectorStoreStatus {
89 Expired,
90 InProgress,
91 Completed,
92}
93
94#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
95pub struct VectorStoreFileCounts {
96 pub in_progress: u32,
98 pub completed: u32,
100 pub failed: u32,
102 pub cancelled: u32,
104 pub total: u32,
106}
107
108#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
109pub struct ListVectorStoresResponse {
110 pub object: String,
111 pub data: Vec<VectorStoreObject>,
112 pub first_id: Option<String>,
113 pub last_id: Option<String>,
114 pub has_more: bool,
115}
116
117#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
118pub struct DeleteVectorStoreResponse {
119 pub id: String,
120 pub object: String,
121 pub deleted: bool,
122}
123
124#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
125#[builder(name = "UpdateVectorStoreRequestBuilder")]
126#[builder(pattern = "mutable")]
127#[builder(setter(into, strip_option), default)]
128#[builder(derive(Debug))]
129#[builder(build_fn(error = "OpenAIError"))]
130pub struct UpdateVectorStoreRequest {
131 #[serde(skip_serializing_if = "Option::is_none")]
132 pub name: Option<String>,
133 #[serde(skip_serializing_if = "Option::is_none")]
134 pub expires_after: Option<VectorStoreExpirationAfter>,
135 #[serde(skip_serializing_if = "Option::is_none")]
136 pub metadata: Option<HashMap<String, serde_json::Value>>,
137}
138
139#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
140pub struct ListVectorStoreFilesResponse {
141 pub object: String,
142 pub data: Vec<VectorStoreFileObject>,
143 pub first_id: Option<String>,
144 pub last_id: Option<String>,
145 pub has_more: bool,
146}
147
148#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
149pub struct VectorStoreFileObject {
150 pub id: String,
152 pub object: String,
154 pub usage_bytes: u64,
156 pub created_at: u32,
158 pub vector_store_id: String,
160 pub status: VectorStoreFileStatus,
162 pub last_error: Option<VectorStoreFileError>,
164 pub chunking_strategy: Option<VectorStoreFileObjectChunkingStrategy>,
166}
167
168#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
169#[serde(rename_all = "snake_case")]
170pub enum VectorStoreFileStatus {
171 InProgress,
172 Completed,
173 Cancelled,
174 Failed,
175}
176
177#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
178pub struct VectorStoreFileError {
179 pub code: VectorStoreFileErrorCode,
180 pub message: String,
182}
183
184#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
185#[serde(rename_all = "snake_case")]
186pub enum VectorStoreFileErrorCode {
187 ServerError,
188 UnsupportedFile,
189 InvalidFile,
190}
191
192#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
193#[serde(tag = "type")]
194#[serde(rename_all = "lowercase")]
195pub enum VectorStoreFileObjectChunkingStrategy {
196 Other,
198 Static {
199 r#static: StaticChunkingStrategy,
200 },
201}
202
203#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
204#[builder(name = "CreateVectorStoreFileRequestBuilder")]
205#[builder(pattern = "mutable")]
206#[builder(setter(into, strip_option), default)]
207#[builder(derive(Debug))]
208#[builder(build_fn(error = "OpenAIError"))]
209pub struct CreateVectorStoreFileRequest {
210 pub file_id: String,
212 #[serde(skip_serializing_if = "Option::is_none")]
213 pub chunking_strategy: Option<VectorStoreChunkingStrategy>,
214 #[serde(skip_serializing_if = "Option::is_none")]
215 pub attributes: Option<HashMap<String, AttributeValue>>,
216}
217
218#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
219pub struct DeleteVectorStoreFileResponse {
220 pub id: String,
221 pub object: String,
222 pub deleted: bool,
223}
224
225#[derive(Debug, Serialize, Default, Clone, Builder, PartialEq, Deserialize)]
226#[builder(name = "CreateVectorStoreFileBatchRequestBuilder")]
227#[builder(pattern = "mutable")]
228#[builder(setter(into, strip_option), default)]
229#[builder(derive(Debug))]
230#[builder(build_fn(error = "OpenAIError"))]
231pub struct CreateVectorStoreFileBatchRequest {
232 pub file_ids: Vec<String>, pub chunking_strategy: Option<VectorStoreChunkingStrategy>,
235}
236
237#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
238#[serde(rename_all = "snake_case")]
239pub enum VectorStoreFileBatchStatus {
240 InProgress,
241 Completed,
242 Cancelled,
243 Failed,
244}
245
246#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
247pub struct VectorStoreFileBatchCounts {
248 pub in_progress: u32,
250 pub completed: u32,
252 pub failed: u32,
254 pub cancelled: u32,
256 pub total: u32,
258}
259
260#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
262pub struct VectorStoreFileBatchObject {
263 pub id: String,
265 pub object: String,
267 pub created_at: u32,
269 pub vector_store_id: String,
271 pub status: VectorStoreFileBatchStatus,
273 pub file_counts: VectorStoreFileBatchCounts,
274}
275
276#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
278pub struct VectorStoreFileContentResponse {
279 pub object: String,
281
282 pub data: Vec<VectorStoreFileContentObject>,
284
285 pub has_more: bool,
287
288 pub next_page: Option<String>,
290}
291
292#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
294pub struct VectorStoreFileContentObject {
295 #[serde(rename = "type")]
297 pub kind: String,
298
299 pub text: String,
301}
302
303#[derive(Debug, Serialize, Default, Clone, Builder, PartialEq, Deserialize)]
304#[builder(name = "VectorStoreSearchRequestBuilder")]
305#[builder(pattern = "mutable")]
306#[builder(setter(into, strip_option), default)]
307#[builder(derive(Debug))]
308#[builder(build_fn(error = "OpenAIError"))]
309pub struct VectorStoreSearchRequest {
310 pub query: VectorStoreSearchQuery,
312
313 #[serde(skip_serializing_if = "Option::is_none")]
315 pub rewrite_query: Option<bool>,
316
317 #[serde(skip_serializing_if = "Option::is_none")]
319 pub max_num_results: Option<u8>,
320
321 #[serde(skip_serializing_if = "Option::is_none")]
323 pub filters: Option<VectorStoreSearchFilter>,
324
325 #[serde(skip_serializing_if = "Option::is_none")]
327 pub ranking_options: Option<RankingOptions>,
328}
329
330#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
331#[serde(untagged)]
332pub enum VectorStoreSearchQuery {
333 Text(String),
335 Array(Vec<String>),
337}
338
339impl Default for VectorStoreSearchQuery {
340 fn default() -> Self {
341 Self::Text(String::new())
342 }
343}
344
345impl From<String> for VectorStoreSearchQuery {
346 fn from(query: String) -> Self {
347 Self::Text(query)
348 }
349}
350
351impl From<&str> for VectorStoreSearchQuery {
352 fn from(query: &str) -> Self {
353 Self::Text(query.to_string())
354 }
355}
356
357impl From<Vec<String>> for VectorStoreSearchQuery {
358 fn from(query: Vec<String>) -> Self {
359 Self::Array(query)
360 }
361}
362
363#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
364#[serde(untagged)]
365pub enum VectorStoreSearchFilter {
366 Comparison(ComparisonFilter),
367 Compound(CompoundFilter),
368}
369
370impl From<ComparisonFilter> for VectorStoreSearchFilter {
371 fn from(filter: ComparisonFilter) -> Self {
372 Self::Comparison(filter)
373 }
374}
375
376impl From<CompoundFilter> for VectorStoreSearchFilter {
377 fn from(filter: CompoundFilter) -> Self {
378 Self::Compound(filter)
379 }
380}
381
382#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
384pub struct ComparisonFilter {
385 #[serde(rename = "type")]
387 pub kind: ComparisonType,
388
389 pub key: String,
391
392 pub value: AttributeValue,
394}
395
396#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
398#[serde(rename_all = "lowercase")]
399pub enum ComparisonType {
400 Eq,
401 Ne,
402 Gt,
403 Gte,
404 Lt,
405 Lte,
406}
407
408#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
410#[serde(untagged)]
411pub enum AttributeValue {
412 String(String),
413 Number(i64),
414 Boolean(bool),
415}
416
417impl From<String> for AttributeValue {
418 fn from(value: String) -> Self {
419 Self::String(value)
420 }
421}
422
423impl From<i64> for AttributeValue {
424 fn from(value: i64) -> Self {
425 Self::Number(value)
426 }
427}
428
429impl From<bool> for AttributeValue {
430 fn from(value: bool) -> Self {
431 Self::Boolean(value)
432 }
433}
434
435impl From<&str> for AttributeValue {
436 fn from(value: &str) -> Self {
437 Self::String(value.to_string())
438 }
439}
440
441#[derive(Debug, Serialize, Default, Deserialize, Clone, PartialEq)]
443pub struct RankingOptions {
444 #[serde(skip_serializing_if = "Option::is_none")]
445 pub ranker: Option<Ranker>,
446
447 #[serde(skip_serializing_if = "Option::is_none")]
448 pub score_threshold: Option<f32>,
449}
450
451#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
452pub enum Ranker {
453 #[serde(rename = "auto")]
454 Auto,
455 #[serde(rename = "default-2024-11-15")]
456 Default20241115,
457}
458
459#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
461pub struct CompoundFilter {
462 #[serde(rename = "type")]
464 pub kind: CompoundFilterType,
465
466 pub filters: Vec<VectorStoreSearchFilter>,
468}
469
470#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
472#[serde(rename_all = "lowercase")]
473pub enum CompoundFilterType {
474 And,
475 Or,
476}
477
478#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
479pub struct VectorStoreSearchResultsPage {
480 pub object: String,
482
483 pub search_query: Vec<String>,
485
486 pub data: Vec<VectorStoreSearchResultItem>,
488
489 pub has_more: bool,
491
492 pub next_page: Option<String>,
494}
495
496#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
497pub struct VectorStoreSearchResultItem {
498 pub file_id: String,
500
501 pub filename: String,
503
504 pub score: f32, pub attributes: HashMap<String, AttributeValue>,
509
510 pub content: Vec<VectorStoreSearchResultContentObject>,
512}
513
514#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
515pub struct VectorStoreSearchResultContentObject {
516 #[serde(rename = "type")]
518 pub kind: String,
519
520 pub text: String,
522}