use std::collections::HashMap;
use derive_builder::Builder;
use serde::{Deserialize, Serialize};
use crate::error::OpenAIError;
use crate::spec::Metadata;
use crate::spec::vectorstores::{Filter, StaticChunkingStrategy};
#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
#[builder(name = "CreateVectorStoreRequestArgs")]
#[builder(pattern = "mutable")]
#[builder(setter(into, strip_option), default)]
#[builder(derive(Debug))]
#[builder(build_fn(error = "OpenAIError"))]
pub struct CreateVectorStoreRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub file_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expires_after: Option<VectorStoreExpirationAfter>,
#[serde(skip_serializing_if = "Option::is_none")]
pub chunking_strategy: Option<ChunkingStrategyRequestParam>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
}
#[derive(Debug, Serialize, Deserialize, Default, Clone, PartialEq)]
#[serde(tag = "type")]
pub enum ChunkingStrategyRequestParam {
#[default]
#[serde(rename = "auto")]
Auto,
#[serde(rename = "static")]
Static {
#[serde(rename = "static")]
config: StaticChunkingStrategy,
},
}
#[derive(Debug, Serialize, Deserialize, Default, Clone, PartialEq)]
pub struct VectorStoreExpirationAfter {
pub anchor: String,
pub days: u16, }
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
pub struct VectorStoreObject {
pub id: String,
pub object: String,
pub created_at: u64,
pub name: Option<String>,
pub usage_bytes: u64,
pub file_counts: VectorStoreFileCounts,
pub status: VectorStoreStatus,
pub expires_after: Option<VectorStoreExpirationAfter>,
pub expires_at: Option<u64>,
pub last_active_at: Option<u64>,
pub metadata: Option<Metadata>,
}
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum VectorStoreStatus {
Expired,
InProgress,
Completed,
}
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
pub struct VectorStoreFileCounts {
pub in_progress: u32,
pub completed: u32,
pub failed: u32,
pub cancelled: u32,
pub total: u32,
}
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
pub struct ListVectorStoresResponse {
pub object: String,
pub data: Vec<VectorStoreObject>,
pub first_id: Option<String>,
pub last_id: Option<String>,
pub has_more: bool,
}
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
pub struct DeleteVectorStoreResponse {
pub id: String,
pub object: String,
pub deleted: bool,
}
#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
#[builder(name = "UpdateVectorStoreRequestArgs")]
#[builder(pattern = "mutable")]
#[builder(setter(into, strip_option), default)]
#[builder(derive(Debug))]
#[builder(build_fn(error = "OpenAIError"))]
pub struct UpdateVectorStoreRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expires_after: Option<VectorStoreExpirationAfter>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
}
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
pub struct ListVectorStoreFilesResponse {
pub object: String,
pub data: Vec<VectorStoreFileObject>,
pub first_id: Option<String>,
pub last_id: Option<String>,
pub has_more: bool,
}
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
pub struct VectorStoreFileObject {
pub id: String,
pub object: String,
pub usage_bytes: u64,
pub created_at: u64,
pub vector_store_id: String,
pub status: VectorStoreFileStatus,
pub last_error: Option<VectorStoreFileError>,
pub chunking_strategy: Option<ChunkingStrategyResponse>,
pub attributes: Option<VectorStoreFileAttributes>,
}
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum VectorStoreFileStatus {
InProgress,
Completed,
Cancelled,
Failed,
}
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
pub struct VectorStoreFileError {
pub code: VectorStoreFileErrorCode,
pub message: String,
}
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum VectorStoreFileErrorCode {
ServerError,
UnsupportedFile,
InvalidFile,
}
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
#[serde(tag = "type")]
#[serde(rename_all = "lowercase")]
pub enum ChunkingStrategyResponse {
#[serde(rename = "other")]
Other,
#[serde(rename = "static")]
Static { r#static: StaticChunkingStrategy },
}
#[derive(Debug, Serialize, Deserialize, Default, Clone, PartialEq)]
#[serde(transparent)]
pub struct VectorStoreFileAttributes(pub HashMap<String, AttributeValue>);
impl From<HashMap<String, AttributeValue>> for VectorStoreFileAttributes {
fn from(attributes: HashMap<String, AttributeValue>) -> Self {
Self(attributes)
}
}
#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
#[builder(name = "CreateVectorStoreFileRequestArgs")]
#[builder(pattern = "mutable")]
#[builder(setter(into, strip_option), default)]
#[builder(derive(Debug))]
#[builder(build_fn(error = "OpenAIError"))]
pub struct CreateVectorStoreFileRequest {
pub file_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub chunking_strategy: Option<ChunkingStrategyRequestParam>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attributes: Option<VectorStoreFileAttributes>,
}
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
pub struct DeleteVectorStoreFileResponse {
pub id: String,
pub object: String,
pub deleted: bool,
}
#[derive(Debug, Serialize, Default, Clone, Builder, PartialEq, Deserialize)]
#[builder(name = "CreateVectorStoreFileBatchRequestArgs")]
#[builder(pattern = "mutable")]
#[builder(setter(into, strip_option), default)]
#[builder(derive(Debug))]
#[builder(build_fn(error = "OpenAIError"))]
pub struct CreateVectorStoreFileBatchRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub file_ids: Option<Vec<String>>, #[serde(skip_serializing_if = "Option::is_none")]
pub files: Option<Vec<CreateVectorStoreFileRequest>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub chunking_strategy: Option<ChunkingStrategyRequestParam>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attributes: Option<VectorStoreFileAttributes>,
}
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum VectorStoreFileBatchStatus {
InProgress,
Completed,
Cancelled,
Failed,
}
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
pub struct VectorStoreFileBatchCounts {
pub in_progress: u32,
pub completed: u32,
pub failed: u32,
pub cancelled: u32,
pub total: u32,
}
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
pub struct VectorStoreFileBatchObject {
pub id: String,
pub object: String,
pub created_at: u64,
pub vector_store_id: String,
pub status: VectorStoreFileBatchStatus,
pub file_counts: VectorStoreFileBatchCounts,
}
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
pub struct VectorStoreFileContentResponse {
pub object: String,
pub data: Vec<VectorStoreFileContentObject>,
pub has_more: bool,
pub next_page: Option<String>,
}
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
pub struct VectorStoreFileContentObject {
pub kind: String,
pub text: String,
}
#[derive(Debug, Serialize, Default, Clone, Builder, PartialEq, Deserialize)]
#[builder(name = "VectorStoreSearchRequestArgs")]
#[builder(pattern = "mutable")]
#[builder(setter(into, strip_option), default)]
#[builder(derive(Debug))]
#[builder(build_fn(error = "OpenAIError"))]
pub struct VectorStoreSearchRequest {
pub query: VectorStoreSearchQuery,
#[serde(skip_serializing_if = "Option::is_none")]
pub rewrite_query: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_num_results: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub filters: Option<Filter>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ranking_options: Option<RankingOptions>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum VectorStoreSearchQuery {
Text(String),
Array(Vec<String>),
}
impl Default for VectorStoreSearchQuery {
fn default() -> Self {
Self::Text(String::new())
}
}
impl From<String> for VectorStoreSearchQuery {
fn from(query: String) -> Self {
Self::Text(query)
}
}
impl From<&str> for VectorStoreSearchQuery {
fn from(query: &str) -> Self {
Self::Text(query.to_string())
}
}
impl From<Vec<String>> for VectorStoreSearchQuery {
fn from(query: Vec<String>) -> Self {
Self::Array(query)
}
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum AttributeValue {
String(String),
Number(i64),
Boolean(bool),
}
impl From<String> for AttributeValue {
fn from(value: String) -> Self {
Self::String(value)
}
}
impl From<i64> for AttributeValue {
fn from(value: i64) -> Self {
Self::Number(value)
}
}
impl From<bool> for AttributeValue {
fn from(value: bool) -> Self {
Self::Boolean(value)
}
}
impl From<&str> for AttributeValue {
fn from(value: &str) -> Self {
Self::String(value.to_string())
}
}
#[derive(Debug, Serialize, Default, Deserialize, Clone, PartialEq)]
pub struct RankingOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub ranker: Option<Ranker>,
#[serde(skip_serializing_if = "Option::is_none")]
pub score_threshold: Option<f32>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum Ranker {
#[serde(rename = "none")]
None,
#[serde(rename = "auto")]
Auto,
#[serde(rename = "default-2024-11-15")]
Default20241115,
}
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
pub struct VectorStoreSearchResultsPage {
pub object: String,
pub search_query: Vec<String>,
pub data: Vec<VectorStoreSearchResultItem>,
pub has_more: bool,
pub next_page: Option<String>,
}
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
pub struct VectorStoreSearchResultItem {
pub file_id: String,
pub filename: String,
pub score: f32,
pub attributes: VectorStoreFileAttributes,
pub content: Vec<VectorStoreSearchResultContentObject>,
}
#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
pub struct VectorStoreSearchResultContentObject {
pub kind: String,
pub text: String,
}
#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
pub struct UpdateVectorStoreFileAttributesRequest {
pub attributes: VectorStoreFileAttributes,
}