1use std::collections::HashMap;
2
3use derive_builder::Builder;
4use serde::{Deserialize, Serialize};
5
6use crate::error::OpenAIError;
7use crate::spec::Metadata;
8use crate::spec::vectorstores::{Filter, StaticChunkingStrategy};
9
10#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
11#[builder(name = "CreateVectorStoreRequestArgs")]
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 #[serde(skip_serializing_if = "Option::is_none")]
25 pub description: Option<String>,
26
27 #[serde(skip_serializing_if = "Option::is_none")]
29 pub expires_after: Option<VectorStoreExpirationAfter>,
30
31 #[serde(skip_serializing_if = "Option::is_none")]
34 pub chunking_strategy: Option<ChunkingStrategyRequestParam>,
35
36 #[serde(skip_serializing_if = "Option::is_none")]
40 pub metadata: Option<Metadata>,
41}
42
43#[derive(Debug, Serialize, Deserialize, Default, Clone, PartialEq)]
44#[serde(tag = "type")]
45pub enum ChunkingStrategyRequestParam {
46 #[default]
49 #[serde(rename = "auto")]
50 Auto,
51 #[serde(rename = "static")]
52 Static {
53 #[serde(rename = "static")]
54 config: StaticChunkingStrategy,
55 },
56}
57
58#[derive(Debug, Serialize, Deserialize, Default, Clone, PartialEq)]
60pub struct VectorStoreExpirationAfter {
61 pub anchor: String,
64 pub days: u16, }
67
68#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
70pub struct VectorStoreObject {
71 pub id: String,
73 pub object: String,
75 pub created_at: u64,
77 pub name: Option<String>,
79 pub usage_bytes: u64,
81 pub file_counts: VectorStoreFileCounts,
82 pub status: VectorStoreStatus,
85 pub expires_after: Option<VectorStoreExpirationAfter>,
86 pub expires_at: Option<u64>,
88 pub last_active_at: Option<u64>,
90
91 pub metadata: Option<Metadata>,
95}
96
97#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
98#[serde(rename_all = "snake_case")]
99pub enum VectorStoreStatus {
100 Expired,
101 InProgress,
102 Completed,
103}
104
105#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
106pub struct VectorStoreFileCounts {
107 pub in_progress: u32,
109 pub completed: u32,
111 pub failed: u32,
113 pub cancelled: u32,
115 pub total: u32,
117}
118
119#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
120pub struct ListVectorStoresResponse {
121 pub object: String,
122 pub data: Vec<VectorStoreObject>,
123 pub first_id: Option<String>,
124 pub last_id: Option<String>,
125 pub has_more: bool,
126}
127
128#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
129pub struct DeleteVectorStoreResponse {
130 pub id: String,
131 pub object: String,
132 pub deleted: bool,
133}
134
135#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
136#[builder(name = "UpdateVectorStoreRequestArgs")]
137#[builder(pattern = "mutable")]
138#[builder(setter(into, strip_option), default)]
139#[builder(derive(Debug))]
140#[builder(build_fn(error = "OpenAIError"))]
141pub struct UpdateVectorStoreRequest {
142 #[serde(skip_serializing_if = "Option::is_none")]
143 pub name: Option<String>,
144 #[serde(skip_serializing_if = "Option::is_none")]
145 pub expires_after: Option<VectorStoreExpirationAfter>,
146 #[serde(skip_serializing_if = "Option::is_none")]
147 pub metadata: Option<Metadata>,
148}
149
150#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
151pub struct ListVectorStoreFilesResponse {
152 pub object: String,
153 pub data: Vec<VectorStoreFileObject>,
154 pub first_id: Option<String>,
155 pub last_id: Option<String>,
156 pub has_more: bool,
157}
158
159#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
160pub struct VectorStoreFileObject {
161 pub id: String,
163 pub object: String,
165 pub usage_bytes: u64,
168 pub created_at: u64,
170 pub vector_store_id: String,
172 pub status: VectorStoreFileStatus,
176 pub last_error: Option<VectorStoreFileError>,
179 pub chunking_strategy: Option<ChunkingStrategyResponse>,
181 pub attributes: Option<VectorStoreFileAttributes>,
186}
187
188#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
189#[serde(rename_all = "snake_case")]
190pub enum VectorStoreFileStatus {
191 InProgress,
192 Completed,
193 Cancelled,
194 Failed,
195}
196
197#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
198pub struct VectorStoreFileError {
199 pub code: VectorStoreFileErrorCode,
200 pub message: String,
202}
203
204#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
205#[serde(rename_all = "snake_case")]
206pub enum VectorStoreFileErrorCode {
207 ServerError,
208 UnsupportedFile,
209 InvalidFile,
210}
211
212#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
213#[serde(tag = "type")]
214#[serde(rename_all = "lowercase")]
215pub enum ChunkingStrategyResponse {
216 #[serde(rename = "other")]
219 Other,
220 #[serde(rename = "static")]
221 Static { r#static: StaticChunkingStrategy },
222}
223
224#[derive(Debug, Serialize, Deserialize, Default, Clone, PartialEq)]
225#[serde(transparent)]
226pub struct VectorStoreFileAttributes(pub HashMap<String, AttributeValue>);
227
228impl From<HashMap<String, AttributeValue>> for VectorStoreFileAttributes {
229 fn from(attributes: HashMap<String, AttributeValue>) -> Self {
230 Self(attributes)
231 }
232}
233
234#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
235#[builder(name = "CreateVectorStoreFileRequestArgs")]
236#[builder(pattern = "mutable")]
237#[builder(setter(into, strip_option), default)]
238#[builder(derive(Debug))]
239#[builder(build_fn(error = "OpenAIError"))]
240pub struct CreateVectorStoreFileRequest {
241 pub file_id: String,
243 #[serde(skip_serializing_if = "Option::is_none")]
244 pub chunking_strategy: Option<ChunkingStrategyRequestParam>,
245 #[serde(skip_serializing_if = "Option::is_none")]
246 pub attributes: Option<VectorStoreFileAttributes>,
247}
248
249#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
250pub struct DeleteVectorStoreFileResponse {
251 pub id: String,
252 pub object: String,
253 pub deleted: bool,
254}
255
256#[derive(Debug, Serialize, Default, Clone, Builder, PartialEq, Deserialize)]
257#[builder(name = "CreateVectorStoreFileBatchRequestArgs")]
258#[builder(pattern = "mutable")]
259#[builder(setter(into, strip_option), default)]
260#[builder(derive(Debug))]
261#[builder(build_fn(error = "OpenAIError"))]
262pub struct CreateVectorStoreFileBatchRequest {
263 #[serde(skip_serializing_if = "Option::is_none")]
268 pub file_ids: Option<Vec<String>>, #[serde(skip_serializing_if = "Option::is_none")]
274 pub files: Option<Vec<CreateVectorStoreFileRequest>>,
275 #[serde(skip_serializing_if = "Option::is_none")]
276 pub chunking_strategy: Option<ChunkingStrategyRequestParam>,
277 #[serde(skip_serializing_if = "Option::is_none")]
282 pub attributes: Option<VectorStoreFileAttributes>,
283}
284
285#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
286#[serde(rename_all = "snake_case")]
287pub enum VectorStoreFileBatchStatus {
288 InProgress,
289 Completed,
290 Cancelled,
291 Failed,
292}
293
294#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
295pub struct VectorStoreFileBatchCounts {
296 pub in_progress: u32,
298 pub completed: u32,
300 pub failed: u32,
302 pub cancelled: u32,
304 pub total: u32,
306}
307
308#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
310pub struct VectorStoreFileBatchObject {
311 pub id: String,
313 pub object: String,
315 pub created_at: u64,
317 pub vector_store_id: String,
319 pub status: VectorStoreFileBatchStatus,
322 pub file_counts: VectorStoreFileBatchCounts,
323}
324
325#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
327pub struct VectorStoreFileContentResponse {
328 pub object: String,
330
331 pub data: Vec<VectorStoreFileContentObject>,
333
334 pub has_more: bool,
336
337 pub next_page: Option<String>,
339}
340
341#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
343pub struct VectorStoreFileContentObject {
344 pub kind: String,
346
347 pub text: String,
349}
350
351#[derive(Debug, Serialize, Default, Clone, Builder, PartialEq, Deserialize)]
352#[builder(name = "VectorStoreSearchRequestArgs")]
353#[builder(pattern = "mutable")]
354#[builder(setter(into, strip_option), default)]
355#[builder(derive(Debug))]
356#[builder(build_fn(error = "OpenAIError"))]
357pub struct VectorStoreSearchRequest {
358 pub query: VectorStoreSearchQuery,
360
361 #[serde(skip_serializing_if = "Option::is_none")]
363 pub rewrite_query: Option<bool>,
364
365 #[serde(skip_serializing_if = "Option::is_none")]
367 pub max_num_results: Option<u8>,
368
369 #[serde(skip_serializing_if = "Option::is_none")]
371 pub filters: Option<Filter>,
372
373 #[serde(skip_serializing_if = "Option::is_none")]
375 pub ranking_options: Option<RankingOptions>,
376}
377
378#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
379#[serde(untagged)]
380pub enum VectorStoreSearchQuery {
381 Text(String),
383 Array(Vec<String>),
385}
386
387impl Default for VectorStoreSearchQuery {
388 fn default() -> Self {
389 Self::Text(String::new())
390 }
391}
392
393impl From<String> for VectorStoreSearchQuery {
394 fn from(query: String) -> Self {
395 Self::Text(query)
396 }
397}
398
399impl From<&str> for VectorStoreSearchQuery {
400 fn from(query: &str) -> Self {
401 Self::Text(query.to_string())
402 }
403}
404
405impl From<Vec<String>> for VectorStoreSearchQuery {
406 fn from(query: Vec<String>) -> Self {
407 Self::Array(query)
408 }
409}
410
411#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
413#[serde(untagged)]
414pub enum AttributeValue {
415 String(String),
416 Number(i64),
417 Boolean(bool),
418}
419
420impl From<String> for AttributeValue {
421 fn from(value: String) -> Self {
422 Self::String(value)
423 }
424}
425
426impl From<i64> for AttributeValue {
427 fn from(value: i64) -> Self {
428 Self::Number(value)
429 }
430}
431
432impl From<bool> for AttributeValue {
433 fn from(value: bool) -> Self {
434 Self::Boolean(value)
435 }
436}
437
438impl From<&str> for AttributeValue {
439 fn from(value: &str) -> Self {
440 Self::String(value.to_string())
441 }
442}
443
444#[derive(Debug, Serialize, Default, Deserialize, Clone, PartialEq)]
446pub struct RankingOptions {
447 #[serde(skip_serializing_if = "Option::is_none")]
448 pub ranker: Option<Ranker>,
449
450 #[serde(skip_serializing_if = "Option::is_none")]
451 pub score_threshold: Option<f32>,
452}
453
454#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
455pub enum Ranker {
456 #[serde(rename = "none")]
458 None,
459 #[serde(rename = "auto")]
460 Auto,
461 #[serde(rename = "default-2024-11-15")]
462 Default20241115,
463}
464
465#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
466pub struct VectorStoreSearchResultsPage {
467 pub object: String,
469
470 pub search_query: Vec<String>,
472
473 pub data: Vec<VectorStoreSearchResultItem>,
475
476 pub has_more: bool,
478
479 pub next_page: Option<String>,
481}
482
483#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
484pub struct VectorStoreSearchResultItem {
485 pub file_id: String,
487
488 pub filename: String,
490
491 pub score: f32, pub attributes: VectorStoreFileAttributes,
496
497 pub content: Vec<VectorStoreSearchResultContentObject>,
499}
500
501#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
502pub struct VectorStoreSearchResultContentObject {
503 pub kind: String,
505
506 pub text: String,
508}
509
510#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
511pub struct UpdateVectorStoreFileAttributesRequest {
512 pub attributes: VectorStoreFileAttributes,
513}